数字积分法插补C语言程序

合集下载

第三四象限数字积分法插补计算报告

第三四象限数字积分法插补计算报告

第三四象限直线插补计算1. 引言随着微电子技术,计算机技术的发展,数控机床的性能不断完善,其应用范围也不断增大。

而数控技术作为数控机床的关键技术,越来越得到更多高校的重视。

2.数字积分法直线插补原理设将要加工的直线XOY 平面内第一象限直线OE ,如图.一所示,直线起点在坐标原点,终点为E (Xe ,Ye )。

同样,假设坐标值均为以脉冲当量为单位的整数。

图.一若此时刀具在两坐标轴上的进给速度分量分别是Vx ,Vy ,则刀具在X 轴,Y 轴方向上位移增量分别是△X = Vx △t 式一a△ Y = Vy △t 式一b由图.一 所示的几何关系可得V/OE=Vx/Xe=Vy/Ye=K (常数) 式二将式二中的Vx ,Vy 分别代入式一 可得:△X = KXe △t 式三a△ Y = KYe △t 式三b可见刀具由原点O 走向E 的过程,可以看作式每经过一个单位时间间隔△t ,就分别以增量[KXe],[ KYe]同时在两个坐标轴累加的结果。

也可以这样认为,数字积分法插补实际上就是利用速度分量,进行数字积分来确定刀具在各坐标轴上位置的过程,即XO当取△ti=“1”(一个单位时间间隔)则X = nKXe 式五aY = nKYe 式五b设经过n 次累加后,刀具正好到达终点E(Xe,Ye),则要求式五中常量满足 下式nK=1 式六n 是累加次数必须取整数,所有K 取小数。

为了保证每次分配给坐标轴的进给脉冲不超过一个单位,则△ X=KXe<1 式七a△ Y=KYe<1 式七b上式中Xe ,Ye 的最大允许值受系统中相应寄存器容量的限制。

现假设寄存器 为N 位则容量为2N ,对应存储的最大允许数字量为(2N - 1)将其带入式七得 K<=1/(2N - 1) 式八现不妨取 K =1/2N 式九显然它满足式七,式八的约束条件,再将K 值代入式六可得累加次数为 n =2N 式十如果将n ,K,值代入式五则动点坐标为X = nKXe =Xe 式十一aY = nKYe =Ye 式十一b根据以上分析,在进行直线插补时,先开辟两个被积函数寄存器Jvx ,Jvy 分别存放终点坐标值Xe ,Ye ,还有两个余数寄存器Jrx ,Jry 。

数字积分法直线插补第二象限全部代码.doc

数字积分法直线插补第二象限全部代码.doc

PictureloPicturelo数字积分法直线插补第二象限全部代码私人潜艇 Command 1 Click() xe = CInt (Textl)你们二 CInt(Text2)行(5400、5470)-(5500, 5500) 行(5400、5530)-(5500, 5500)如果xe 二那么就等于0 Picturelo字体颜色二vbBlack PictureloDrawWidth = 2 Picturelo线(5500)-(500) Picturelo行(5500)-(5500, 5500) Picturelo线(500)-(600) Picturelo行(500)-(80, 600) PictureloCurrentX = 10 Picturelo 当前y 坐标二5300Picturelo 当前y 坐标二5200Picturelo 打印"x”Picturelo CurrentX = 100Picturelo 当前y 坐标二100Pictured 打印"Y”i=l 到xePictured 行(50+i 500, 5500)-(50+500, 5450)接下来,我对于j=lPicturelo 行(50, 5500-j 500)-(100, 5500-j 500)下一个我Picturelo字体颜色二vbr业务Picturelo DrawWidth = 2Pictured 行(50, 5500) - (50+500 Int (Textl) ,5500-500 Int (Text2))如果是xe小于等于0,则是0Picturelo DrawWidth = 2Pictured 行(5500、5500)-(5500 年,50) Pictured 行(5500 年,50)-(5530, 150) Pictured 行(5500 年,50) -(5470, 150) Pictured 线(5500、5500)-(5500) Pictured 行(5500)-(150, 5470) Pictured 行(5500)-(150, 5530) Picturelo CurrentX = 5600Picturelo 当前y 坐标二5400 Pictured 打印”(0,0)”Picturel o CurrentX = 100Picturelo 当前y 坐标二5200Picturel o打印”- x”Picturelo 打印"Y”因为i=l到-xePictured 行(5500-500, 5500)-(5500-500, 5450)接下来,我对于j=lPicturelo 行(5500, 5500-j 500)-(5500, 5500-j 500)下一个我Picturelo 字体颜色二vbBlackPicturelo DrawWidth = 2Pictured 行(5500, 5500)-(5500+500 Int(Textl), 5500-500 Int (Text2))如果是xe小于等于0,那么叶小于等于0Pictured 行(5500 年,50)-(5500, 5500)Picturelo 行(5500、5500)-(5530,5400)Picturelo 线(50, 50)-(150 年,20) Pictured 线(50,50)-(150、80)Picturelo CurrentX = 5600Picturelo 当前y 坐标二40Pictured 打印”(0,0)”Picturelo CurrentX = 100Picturelo 当前y 坐标二100Picturelo 打印”- x”Picturelo CurrentX = 5600Picturelo 当前y 坐标二5400Picturelo 打印”- y”因为i=l到-xePictured 行(5500-500, 50)-(5500-500, 100) 接下来,我j=l到一叶Pictured 行(5500, 50+j 500)-(5, 50+j 500)下一个我Picturelo 字体颜色二vbBlackPictured DrawWidth 二 2Pictured 线(550050)-(5500+500 Int(Textl), 50-500 Int(Text2)) 如果是0,那么叶小于等于0Picturelo 字体颜色二vbBlackPicturelo DrawWidth = 2Pictured 行(50, 50)-(5500 年,50)Pictured 行(5500 年,50)-(5400, 80)Picturelo 线(5500 年,50)-(5400 年,20) Pictured 线(50, 50)-(5500)Picturelo 线(5500)-(5400)Picturelo 行(5500)-(80, 5400) Picturelo 当前y 坐标二40Pictured 打印”(0,0)”Picturelo CurrentX = 5700Picturelo 当前y 坐标二100 Picturelo 打印"x”Picturelo CurrentX = 80Picturelo 当前y 坐标二5400 Picturelo 打印”- y”i=l 到xePictured 行(50+500, 50)-(50+500, 100) 接下来,我Picturel. Printj=l至U-叶Pictured 行(50 50+j 500)-(100, 50+j 500)下一个我Picturelo DrawWidth = 2Picturelo 行(50, 50)-(50+500 Int (Textl), 50-500 Int (Text2)) 如果终止子私人潜艇Command2_C 1 ick ()n 二Int (Text5)&二0易建联二0xe 二CInt(Textl)你们二CInt (Text2)jvx 二xejvy二你们jrx 二0 jry 二0如果xe=O,那么就等于0i=l 到 2 njrx=jrx+jvx如果jrx=2 njrx=jrx-2nk = 1xi=xi+1如果杰里如果jry=2 njry-2 nm = 1yi=yi+1如果Picturelo 字体颜色二vbGreen如果k=l和m=lPicturelo 线(50 + 500 *(xi - 1), 5500(500) (yi - 1)*)-(50 + 500 *(xi)500 -(易建联)* 500)如果k= 1和m=0Pictured 行(50+500 (xi-l), 5500-(yi) 500)-(50+500 (xi),5500-(yi)500)如果k=0和m=lPicturel。

第3章-插补原理

第3章-插补原理

Y积分器
计t数 器JVX为(XeJ)E,JR均X 为溢三出位Jvy(Ye) JRy 溢出
终点计 数器
JE
备注
二0进制1存01 放器00。0
011 000
000
初始状态
1
101 101
011 011
001 第一次迭代
2
101 010
1
011 110
010
X溢出
3
101 111
011 001
1
011
Y溢出
∑=8-1=7
4
F<0
+Y
F4=F3+xe=-2+6=4
∑=7-1=6
5
F>0
+X
F5=F4-ye=4-4=0
∑=6-1=5
6
F=0
+X
F6=F5-ye=0-4=-4
∑=5-1=4
7
F<0
+Y
F7=F6+xe=-4+6=2
∑=4-1=3
8
F>0
+X
F8=F7-ye=2-4=-2
∑=3-1=2
9
F<0
4
101 100
1
011 100
100
X溢出
5
101 001
1
011 111
101
X溢出
6
101 110
011 010
1
110
Y溢出
7
101 011
1
011 101
111
件加工的要求,现在的数控系统已很少采用这类算法 了。
4
*

数字积分法插补C语言程序

数字积分法插补C语言程序

#include<stdio.h>#include<math.h>#include<stdlib.h>/********************************************************************/ /* 函数名: InsertPoint *//* 功能:控制机床各轴进给并将进给结果写入文件中 *//* 参数:double x, double y 插补点单位:毫米 *//* 说明:与机床硬件关联,每产生一个点调用一次 *//********************************************************************/ void InsertPoint(double xCur,double yCur){extern FILE *fp;char ch=10;printf("xCur=%f,yCur=%f\n",xCur,yCur);fprintf(fp,"%f,%f",xCur,yCur);fputc(ch,fp);}/********************************************************************/ /* 函数名: Judge_Quadrant *//* 功能:判断参数坐标的所在象限并返回相应象限值 *//* 参数:double x mm *//* double y mm *//********************************************************************/ unsigned short Judge_Quadrant(double x, double y){unsigned short nDir;if (x>=0){ //象限判断if (y>=0){nDir=1;return 1;}else{nDir=4;return 4;}}else{if (y>=0){nDir=2;return 2;}else{nDir=3;return 3;}}}/********************************************************************/ /* 函数名: DDA_Line */ /* 功能:数字积分法直线插补 *//* 参数:double XEnd, double YEnd 插补终点 mm *//* int step 步长 mm *//* unsigned short n 寄存器位数 *//********************************************************************/ void DDA_Line(unsigned short n, int step, double XEnd, double YEnd){long XRes,YRes; //寄存器溢出后余数long xEnd,yEnd; //插补终点值long XCur=0,YCur=0; //当前位置int IPCount=0;//累加值int nQuadrant;//象限int Q; //累加器容量int bInterpXEnable,bInterpYEnable;XRes=YRes=0;bInterpXEnable=bInterpYEnable=0;xEnd=labs(XEnd);yEnd=labs(YEnd);Q=(fabs(YEnd)+fabs(XEnd))/step;nQuadrant=Judge_Quadrant(XEnd,YEnd);//计算插补象限switch(nQuadrant){case 1:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) {InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 2:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) { InsertPoint(XCur,YCur); bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 3:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) {InsertPoint(XCur,YCur); bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 4:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1) {InsertPoint(XCur,YCur); bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;}}/********************************************************************//* 函数名: DDA_Line *//* 功能:数字积分法圆弧插补 *//* 参数:double XEnd, double YEnd 插补终点 mm *//* int step 步长 mm *//* unsigned short n 寄存器位数 *//********************************************************************/void DDA_Circle(unsigned short n, int step, double XStart, double YStart, double XEnd, double Y End, double radius, int bIsCW){double xCur=XStart,yCur=YStart;long xRes=0,yRes=0;int ndir,Q;int judge=1;int full_circle=0;int xEnable,yEnable;xEnable=yEnable=0;Q=radius;//溢出基值,也可取为pow(2,n)InsertPoint(xCur,yCur);if(XStart==XEnd&YStart==YEnd)full_circle=1;//判断是否要画整圆while(judge==1||full_circle==1)//检测终点{xRes+=fabs(xCur);yRes+=fabs(yCur);if(xRes>=Q&fabs(yCur)<=radius){xRes=xRes%Q;yEnable=1;}if(yRes>=Q&fabs(xCur)<=radius){yRes=yRes%Q;xEnable=1;}if(bIsCW==0)//逆圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 2:yCur-=step;break;case 3:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围case 4:yCur+=step;break;}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){ case 1:xCur-=step;break;case 2:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 3:xCur+=step;break;case 4:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围}}}else//顺圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:yCur-=step;break;case 2:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 3:yCur+=step;break;case 4:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){case 1:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围case 2:xCur+=step;break;case 3:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 4:xCur-=step;break;}}}judge=(fabs(xCur-XEnd)>=step||fabs(yCur-YEnd)>=step);if(xEnable||yEnable)//判断并进行进给运动{InsertPoint(xCur,yCur);xEnable=yEnable=0;full_circle=0;}}}FILE *fp;int main(){char fn[10];printf("please input filename:\n");scanf("%s",fn);if((fp=fopen(fn,"w"))==NULL) { printf("can't open file\n"); exit(0);}DDA_Circle(4,1,50,0,40,-30,50,1);//输入要插补的圆弧的参数// DDA_Line(4,1,50,-20);//输入要插补的圆弧的参数fclose(fp);return 0;}。

数字积分法(DDA)插补直线参考程序

数字积分法(DDA)插补直线参考程序

数字积分法(DDA)插补直线参考程序Sub 插补X()标志X = 0If 余数X >= Q Then余数X = 余数X Mod Qx动点= x动点+ 1: 标志X = 1 End IfEnd SubSub 插补Y()标志Y = 0If 余数Y >= Q Then余数Y = 余数Y Mod Qy动点= y动点+ 1: 标志Y = 1End IfEnd SubSub 插补Z()标志Z = 0If 余数Z >= Q Then余数Z = 余数Z Mod Qz动点= z动点+ 1: 标志Z = 1 End IfEnd SubSub 插补公共()余数X = 余数X + x终点余数Y = 余数Y + y终点余数Z = 余数Z + z终点插补X插补Y插补Z插补记录= 插补记录+ 1End SubSub 插补()Dim c As Integer插补记录= 0: 余数X = 0: 余数Y = 0: 余数Z = 0: 划轮廓线PSet (z原点, x原点), vbRedSelect Case 象限标志Case 1: '第一象限插补Do Until 插补记录= Q插补公共Line -Step(z步长×标志Z, x步长×标志X), vbRedLoopCase 2: '第二象限插补c = x终点: x终点= z终点: z终点= -cc = x步长: x步长= z步长: z步长= -cDo Until 插补记录= Q插补公共Line -Step(x步长×标志X, z步长×标志Z), vbRed LoopCase 3: '第三象限插补x终点= -x终点: z终点= -z终点x步长= -x步长: z步长= -z步长Do Until 插补记录= Q插补公共Line -Step(z步长×标志Z, x步长×标志X), vbRed LoopCase 4: '第四象限插补c = x终点: x终点= -z终点: z终点= cc = x步长: x步长= -z步长: z步长= cDo Until 插补记录= Q插补公共Line -Step(x步长×标志X, z步长×标志Z), vbRed LoopEnd SelectEnd Sub。

数字积分法

数字积分法


插补计算过程如下:
累加 次数 (Δt) X积分器 Y积分器 终点 JVx JRx 溢出 JVy JRy 溢出 计数器 JE ΔX ΔY
备注 初始状态 第一次累加
0 1
010 000 010 010
2 3 4 5 6 7 8
010 100 010 110 010 000 1 010 010 010 100 110 100 1 010 110 110 010 1
2
3 4 5
000 000 001 001 001 001 010 010 010 100 011
101 101 010
101 101 111 101 101 100 101 101 001
1 100
1 1
100 ΔX,ΔY无溢出 011 ΔY溢出修正Yi 010
ΔY溢出修正Yi
插补计算过程如下:
Vy X
Y= ∑ (K Ye)Δt
i=1
O
Vx
由此可以得到直线插补的数字积分插补器:
J Vx(K Xe)(被积函数寄存器)
+ Δt J Rx(累加器) J Ry(累加器) + X轴溢出脉冲 ΔX ΔY
Y轴溢出脉冲
J Vy(K Ye)(被积函数寄存器)
设经过m次累加,X、Y坐标分别达到终点,则有: m X= i=1 ∑ (K Xe)Δt =KmXe =Xe Y= ∑ (K Ye)Δt = KmYe = Ye i=1 Y
(一)数字积分的基本原理 如图:从时刻t=0到t,函数Y=f(t)曲线所包围的面积可表 示为:S=∫ 0 f(t)dt Y t 若将0~t的时间划分成时间 Y=f(t) 间隔为Δt的有限区间,当Δt 足够小时,可得公式: Yo n-1 0 S=∫ tf(t)dt = ∑ Yi Δt

数控插补 补充

数控插补 补充

提高插补精度的措施 对于DDA圆弧插补,径向误差可能大于一个脉 冲当量,因数字积分器溢出脉冲的频率与被积 函数寄存器中的数值成正比,在坐标轴附近进 行累加时,一个积分器的被积函数值接近零, 而另一个积分器的被积函数接近于最大值,累 加时后者连续溢出,前者几乎没有,两个积分 器的溢出脉冲频率相差很大,致使插补轨迹偏 离给定圆弧距离较大,使圆弧误差增大。 减少误差的方法有:减小脉冲当量,误差减少, 但寄存器容量增大,累加次数增加。而且要获 得同样的进给速度,需要提高插补速度。
(3-32)
由此可以推出(xi,yi)与x、y 的关系式
1 1 X X i l cos Y 2 2 1 1 X Yi Y Yi l sin 2 2 Xi
(3-33)
式(3-33)反映了圆弧上任意相邻两插补点坐标之间 的关系,只要求得 X 和 Y ,就可以计算出新的插补点 B( X i 1 , Yi 1 ) X X X
累加 次数 (Δ t)
X 积分器
Y 积分器
JVX
JRX
ΔX
JEX JVY
JRY
ΔY
JEY
0 1 2 3 4
5 5 5 5 5 4
4 5+4=8+1 5+1=6 5+6=8+3 5+3=8+0
5 1 4 4 1 1 3 2
0
4 0 0+4=4 1 1 1+4=5 1 1+5=6 2 2 2+6=8+0 3
(3)
还可采用余数寄存器预置数法,即在DDA插补之前, 累加器又称余数寄存器JRX,JRY的初值不置零,而是预 置2n/2,若用二进制表示,其最高有效位置“1”,其它 各位置零,若再累加100…000,余数寄存器就可以产 生第一个溢出脉冲,使积分器提前溢出。这种处理方 式称为“半加载”,在被积函数值较小,不能很快产 生溢出脉冲的情况下,可使脉冲提前溢出,改变了溢 出脉冲的时间分布,达到减少插补误差的目的。 例3-5 加工第一象限顺圆AB,如图3-27,起点A(0, 5),终点B(0,5)选用寄存器位数n=3,经过 “半 加载”处理后,试用DDA法进行插补计算。 其插补运算过程见表3-5。

5.数字积分法直线插补

5.数字积分法直线插补
行累加,超出寄存器容量2n有溢出。将溢出脉冲用来控制机
床进给,其效果是一样的。在被寄函数寄存器里可只存Xe, 而省略k。
例如,Xe=100101在一个6位寄存器中存放,若k=1/26, kXe=0.100101也存放在6位寄存器中,数字是一样的,若进
行一次累加,都有溢出,余数数字也相同,只是小数点位置
终点坐标值,每经过一个时间间隔t,将被积函数值向各自的累加器中
累加,当累加结果超出寄存器容量时,就溢出一个脉冲,若寄存器位 数为n,经过2n次累加后,每个坐标轴的溢出脉冲总数就等于该坐标的 被积函数值,从而控制刀具到达终点。
机电工程学院
=k
刀具在X,Y方向移动的微小增量分别为:
X = Vxt = kXet Y = Vyt = kYet
机电工程学院
动点从原点出发走向终点的过程,可以看作是各坐标轴每经过
一个单位时间间隔t,分别以增量kXe及kYe同时累加的结果。
m
m
X = X i = kX eti
i =1
i=1
m
m
Y = Yi = kYeti
有缘学习更多+谓ygd3076或关注桃报:奉献教育(店铺)
如果存放Xe,Ye寄存器的位数是n,对应最大允许数字量
为 2n 1(各位均为1),所以Xe,Ye最大寄存数值为 2n 1
则: k (2n 1,不妨取
k
=
1 2n
代入得:
2
n 2n
1
1
累加次数为: m = 1 = 2n
5. 数字积分法直线插补
如右图所示第一象
限直线OE,起点为坐标 Y
原点O,终点坐标为E (Xe,Ye),直线OE的
长度L为:
Vy V E(Xe,Ye) Vx
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//该函数在VC++6.0下编译测试通过,可实现直线、圆弧、完整圆的数字积分法插补;并可将插补函数计算出的数//据点写入xxx.txt文件中//若有任何疑问,欢迎邮件联系,***********************#include//版权所有,侵权必究。

转载时请注明来自大连理工机械工程学院Deanjiang#include<math.h>#include<stdlib.h>#include<stdio.h>/********************************************************************//* 函数名: InsertPoint *//* 功能:控制机床各轴进给并将进给结果写入文件中*//* 参数:double x, double y 插补点单位:毫米*//* 说明:与机床硬件关联,每产生一个点调用一次*//********************************************************************/void InsertPoint(double xCur,double yCur){extern FILE *fp;char ch=10;printf("xCur=%f,yCur=%f\n",xCur,yCur);fprintf(fp,"%f,%f",xCur,yCur);fputc(ch,fp);}/********************************************************************//* 函数名: Judge_Quadrant *//* 功能:判断参数坐标的所在象限并返回相应象限值*//* 参数:double x mm*//*double y mm*//********************************************************************/unsigned short Judge_Quadrant(double x, double y){unsigned short nDir;if (x>=0){ //象限判断if (y>=0){nDir=1;return 1;}else{nDir=4;return 4;}}else{if (y>=0){nDir=2;return 2;}else{nDir=3;return 3;}}}/********************************************************************/ /* 函数名: DDA_Line */ /* 功能:数字积分法直线插补*/ /* 参数:double XEnd, double YEnd插补终点mm*//*int step步长mm*//* unsigned short n寄存器位数*//********************************************************************/ void DDA_Line(unsigned short n, int step, double XEnd, double YEnd){long XRes,YRes; //寄存器溢出后余数long xEnd,yEnd; //插补终点值long XCur=0,YCur=0; //当前位置int IPCount=0;//累加值int nQuadrant;//象限int Q; //累加器容量int bInterpXEnable,bInterpYEnable;XRes=YRes=0;bInterpXEnable=bInterpYEnable=0;xEnd=labs(XEnd);yEnd=labs(YEnd);Q=(fabs(YEnd)+fabs(XEnd))/step;nQuadrant=Judge_Quadrant(XEnd,YEnd);//计算插补象限switch(nQuadrant){case 1:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1){InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 2:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur+=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1){InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 3:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur-=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1){InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;case 4:while (IPCount<Q){XRes+=xEnd/step;YRes+=yEnd/step;if (XRes>=Q){XRes=XRes%Q;XCur+=step;bInterpXEnable=1;}if (YRes>=Q){YRes=YRes%Q;YCur-=step;bInterpYEnable=1;}if (bInterpXEnable==1||bInterpYEnable==1){InsertPoint(XCur,YCur);bInterpXEnable=bInterpYEnable=0;}IPCount++;}break;}}/********************************************************************//* 函数名: DDA_Line *//* 功能:数字积分法直线插补*//* 参数:double XEnd, double YEnd插补终点mm*//*int step步长mm*//* unsigned short n寄存器位数*//********************************************************************/void DDA_Circle(unsigned short n, int step, double XStart, double YStart, double XEnd, double YEnd, double radius, int bIsCW) {double xCur=XStart,yCur=YStart;long xRes=0,yRes=0;int ndir,Q;int judge=1;int full_circle=0;int xEnable,yEnable;xEnable=yEnable=0;Q=radius;//溢出基值,也可取为pow(2,n)InsertPoint(xCur,yCur);if(XStart==XEnd&YStart==YEnd)full_circle=1;//判断是否要画整圆while(judge==1||full_circle==1)//检测终点{xRes+=fabs(xCur);yRes+=fabs(yCur);if(xRes>=Q&fabs(yCur)<=radius){xRes=xRes%Q;yEnable=1;}if(yRes>=Q&fabs(xCur)<=radius){yRes=yRes%Q;xEnable=1;}if(bIsCW==0)//逆圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 2:yCur-=step;break;case 3:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围case 4:yCur+=step;break;}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){case 1:xCur-=step;break;case 2:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 3:xCur+=step;break;case 4:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围}}}else//顺圆插补{ndir=Judge_Quadrant(xCur,yCur);if(yEnable==1)//xRes溢出,y轴进给{switch(ndir){case 1:yCur-=step;break;case 2:if(fabs(yCur)<radius) yCur+=step;break;//防止y轴超出半径范围case 3:yCur+=step;break;case 4:if(fabs(yCur)<radius) yCur-=step;break;//防止y轴超出半径范围}}if(xEnable==1)//yRes溢出,x轴进给{switch(ndir){case 1:if(fabs(xCur)<radius) xCur+=step;break;//防止x轴超出半径范围case 2:xCur+=step;break;case 3:if(fabs(xCur)<radius) xCur-=step;break;//防止x轴超出半径范围case 4:xCur-=step;break;}}}judge=(fabs(xCur-XEnd)>=step||fabs(yCur-YEnd)>=step);if(xEnable||yEnable)//判断并进行进给运动{InsertPoint(xCur,yCur);xEnable=yEnable=0;full_circle=0;}}}FILE *fp;int main(){char fn[10];printf("please input filename:\n");scanf("%s",fn);if((fp=fopen(fn,"w"))==NULL){printf("can't open file\n");exit(0);}DDA_Circle(4,1,50,0,40,-30,50,1);//输入要插补的圆弧的参数//DDA_Line(4,1,50,-20);//输入要插补的圆弧的参数fclose(fp);return 0;}。

相关文档
最新文档