数字积分法插补C语言程序
- 格式:docx
- 大小:16.55 KB
- 文档页数:7
第三四象限直线插补计算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 。
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。
#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)插补直线参考程序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。
数字积分法第二象限直线插补程序设计数字积分法是利用数字积分的方法,计算刀具沿各坐标轴的位移,使得刀具沿着所加工的轮廓曲线运动利用数字积分原理构成的插补装置称为数字积分器,又称数字微分分析器(Digital Differential Analyzer),简称DDA。
数字积分器插补的最大优点在于容易实现多坐标轴的联动插补、能够描述空间直线及平面各种函数曲线等。
因此,数字积分法插补在轮廓数控系统中得到广泛的应用。
具体设计内容如以下:……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………目录一、课程设计目的 (1)二、课程设计题目描述和要求 (1)三、课程设计报告内容 (1)数字积分法直线插补的基本原理 (2)从几何角度来看积分运算 (2)数字积分法在轮廓插补中的具体应用(数字积分法直线插补)3 插补终点判别的具体实现 (4)插补器的组成 (5)数字积分法稳速控制 (5)提高插补精度的措施 (6)减少误差的方法 (6)数字积分法直线插补框图 (7)数字积分法直线(第二象限)插补程序流程图 (7)四结论 (8)五结束语 (8)参考书目 (10)附录数字积分法直线插补程序清单(第二象限) (11)一、课程设计目的1)了解连续轨迹控制数控系统的组成原理。
编程实现数值积分的几种--方法c语言数值计算2010-11-05 09:52:43 阅读385 评论1 字号:大中小订阅复化梯形公式在区间不大时, 用梯形公式、辛卜生公式计算定积分是简单实用的, 但当区间较大时, 用梯形公式、辛卜生公式计算定积分达不到精确度要求 . 为了提高计算的精确度,我们将[a,b] 区间n等分,在每个小区间上应用梯形公式、辛卜生公式计算定积分,然后将其结果相加,这样就得到了复化梯形公式和复化辛卜生公式。
1. 复化梯形公式将积分区间等分, 设, 则节点为对每个小区间上应用梯形公式, 然后将其结果相加,则得(3.14)称(3.14) 式为复化梯形公式 .当在[a,b] 上有连续的二阶导数时,则复化梯形公式(3.14) 的余项推导如下:因为所以在区间[a,b] 上公式(3.14) 的误差为又因为在区间[a,b] 上连续,由连续函数的性质知,在区间[a,b] 上存在一点,于是( 3.15 )复化梯形公式,复化抛物线公式和Romberg求积法的算法程序:以下程序均定义误差限为1*10^-5;1)复化梯形公式:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)int main(){int i,n;double h,t0,t,g;n=1; //赋初值h=(double)(b-a)/2;t=h*(f(a)+f(b));do{t0=t;g=0;for (i=1;i<=n;i++)g+=f((a+(2*i-1)*h));t=(t0/2)+(h*g); //复化梯形公式n*=2;h/=2;}while (fabs(t-t0)>e); //自定义误差限e printf("%.8lf",t); //输出积分的近似值return 0;}2)复化抛物线公式:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)int main(){int i,n;double f1,f2,f3,h,s0,s;f1=f(a)+f(b); //赋初值f2=f(((double)(b+a)/2));f3=0;s=((double)(b-a)/6)*(f1+4*f2);n=2;h=(double)(b-a)/4;do //复化抛物线算法{f2+=f3;s0=s;f3=0;for (i=1;i<=n;i++)f3+=f((a+(2*i-1)*h));s=(h/3)*(f1+2*f2+4*f3);n*=2;h/=2;}while (fabs(s-s0)>e); //自定义误差限printf("%.8lf",s);return 0;}3)Romberg求积法:#include <stdio.h>#include <math.h>#define e 1e-5#define a 0 //积分下限a#define b 1 //积分上限b#define f(x) (4/(1+(x*x))) //被积函数f(x)double t[100][100];int main(){int n,k,i,m;double h,g,p;h=(double)(b-a)/2;t[0][0]=h*(f(a)+f(b));k=1;n=1;do //Romberg算法{g=0;for (i=1;i<=n;i++)g+=f((a+((2*i-1)*h)));t[k][0]=(t[k-1][0]/2)+(h*g);for (m=1;m<=k;m++){p=pow(4,(double)(m));t[k-m][m]=(p*t[k-m+1][m-1]-t[k-m][m-1])/(p-1);}m-=1;h/=2;n*=2;k+=1;}while (fabs(t[0][m]-t[0][m-1])>e); //自定义误差限eprintf("%.8lf",t[0][m]);return 0;}给定精度,定义误差限为1*10^-5,分别求出步长的先验估计值:用复化梯形公式计算,要求h<0. 007746。
//该函数在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;}。