机床数控技术课程设计说明书.doc
机床数控技术课程设计说明书姓 名:XXX 学 号:050310605 指导老师:XXXXXXXXXXXXXXXXXXX大学机电学院 2007.1 目录一、 课程设计介绍-1-1.1 任务说明.-1-1.2 要求.-1-二、 程序操作及算法流程图. -2-2.1 程序操作流程.-2-2.2 逐点比较法插补直线流程.-3-2.3 DDA法插补直线流程.-4-2.4 逐点比较法插补圆弧流程.-5-三、 用户使用说明.-6-四、课程设计过程中的想法和遇到的困难.-12-五、本设计的优缺点.-13-六、主要算法及源程序.-13-6.1 基本画两点间直线的函数.-13-6.2 绘制坐标.-13-6.3 DDA法插补直线.-15-6.4逐点比较法插补直线.-17-6.5逐点比较法插补圆弧.-22-6.5.1插补圆弧主程序.-22-6.5.2插补第一象限圆弧.-28-6.5.3插补第二象限圆弧.-30-6.5.4插补第三象限圆弧.-31-6.5.5插补第四象限圆弧.-32-七、主要参考文献.-34-一、课程设计介绍1.1、任务说明:(1)直线插补:DL3, DDA法第三象限直线插补。(2)圆弧插补:PC41,逐点比较法四一象限逆圆弧插补。1.2、要求:(1)具有数据输入界面,如:起点,终点,圆心,半径及插补步长。(2)具有插补过程的动态显示功能,如:但单步插补,连续插补。本课程设计的题目要求是法插补第三象限直线,逐点比较法插补四一象限逆圆弧,根据题目的要求,我做到:全平面用逐点比较法插补直线和全平面用DDA法插补直线,全平面插补逆圆弧,其中圆弧是优弧还是劣弧,通过输入半径的正负性来决定,根据需要可以改变插补步长,可以动态显示插补过程等。 二、程序操作及算法流程图2.1 程序操作流程启动程序输入菜单直线参数圆弧参数输入起始点、终止点及插补步长DDA法插补逐点比较法插补显示插补直线直线参数对话框圆弧参数对话框输入起始点、终止点、半径及插补步长显示插补圆弧图2.1 程序操作流程图2.2 逐点比较法插补直线流程右上方起始E=Xe+YeE>0直线走向YN左上方斜率<-1F0+Y走一步-X走一步YNF0YYNNF (EY-SY)/(EX-SX) -(Y-SY)/(X-SX)F0+X走一步斜率>1YF0YNNY+Y走一步F (Y-SY)/(X-SX) -(EY-SY)/(EX-SX)左下方斜率>1F0-Y走一步-X走一步YNF0YYNNF (EY-SY)/(EX-SX) -(Y-SY)/(X-SX)右下方斜率<-1F0-Y走一步+X走一步YNF0YYNNF (Y-SY)/(X-SX) -(EY-SY)/(EX-SX)EE-1结束N图2.2 逐点比较法插补直线流程图2.3 DDA法插补直线流程起始初始化,求出累加次数M,Jrx,Jry清零,JvxXe,JvyYe,直线走向右下方左下方左上方右上方JrxJrx+Jvx;JryJry+JvyJrxJrx+Jvx;JryJry+JvyJrxJrx+Jvx;JryJry+JvyJrxJrx+Jvx;JryJry+JvyYYYJrx有益出吗?YJrx有益出吗?Jrx有益出吗?Jrx有益出吗?Jrx有益出吗?+X走一步+X走一步-X走一步-X走一步NNNNYYJry有益出吗?YJry有益出吗?Jry有益出吗?YJry有益出吗?+Y走一步-Y走一步-Y走一步+Y走一步NNNNMM-1MM-1MM-1MM-1NM=0吗?ma吗?Y结束图2.3 DDA法插补直线流程图2.4 逐点比较法插补圆弧流程Y+1Y+Y一步NF(X-CX)²+(Y-CY)²-R²E-1EF0F0,EN第一N起始初始化,读入对话框中的参数,根据参数确定圆心和优劣弧圆弧所在象限Y-X一步X-1XE=0吗?Y结束F0,ENF0NY-Y一步Y-1YE-1EE=0吗?NY-X一步X-1XF(X-CX)²+(Y-CY)²-R²第二F0,ENF0NY+X一步X+1XE-1EE=0吗?NY-Y一步Y-1YF(X-CX)²+(Y-CY)²-R²第三F0,ENF0NY+X一步X+1XE-1EE=0吗?NY+Y一步Y+1YF(X-CX)²+(Y-CY)²-R²第四图2.4 逐点比较法插补圆弧流程图三、用户使用说明3.1 程序开始运行时显示介面3.2 在“Input”菜单项下选择“Input the Paramaters of the Line”项后跳出插补直线参数对话框,在对应项中输入如下参数及点选如下选项后点“确定”按钮3.3点“确定”后出现如下的原直线(红色)和插补直线(绿色)3.4 如在3.2中把“插补方法”项点选成“逐点比较法”,点“确定”按钮后出现如下的原直线(红色)和插补直线(绿色)3.5在“Input”菜单项下选择“Input the Paramaters of the Arc”项后跳出插补圆弧参数对话框,在对应项中输入如下参数及点选如下选项后点“确定”按钮3.6点“确定”后出现如下的原圆弧(红色)和插补圆弧(绿色)3.7如在3.5中把圆弧半径改为“-250”,则出现如下的原圆弧(红色)和插补圆弧(绿色)四、课程设计过程中的想法和遇到的困难由于是第一次编制这种要求有输入输出界面的程序,一开始的时候根本无法下手,以前都是在Turbo C 的环境下进行程序编制的,而Turbo C 的环境下做界面真的很难,所以首要任务是把VC的基本界面编制学会。. 在做DDA直线插补时,我的任务是第三象限,但我想直线插补对于象限的变化不大,所以就做了整个平面的直线插补,后来也确实如此,只要分直线的四种不同走向来考虑就可以很容易的实现整个平面的直线插补。. 逐点比较法圆弧插补,我在做这个插补程序之前首先是考虑它的参数问题,因为确定一个圆弧的参数很多,可以是:圆心,起点和终点;半径,起点和终点;圆心,半径,起始角和终止角。但我觉得、两种参数的情况不够好,因为我们接触到的插补给定、两种情况参数的比较少,一般都是第种情况比较多,所以我就决定用的参数来确定圆弧,并且半径的正负代表了圆弧是劣弧还是优弧。但这种情况比较复杂,一开始时我的判别条件是动点与与终点的距离小于一定的值后认为插补结束,后来发现当插补步长改变后,有时候可能距离改变太大,造成死循环或者插补没完成就停止插补的情况出现。后来终点判别条件改为了插补次数,在每个象限都算一次,以是否大于零作为判别的条件,后来终于克服了这个问题。. 后来我又做了一个逐点比较法插补直线的程序,由于有了DDA法的分直线走向的思想,所以很容易就编制逐点比较法全平面插补直线的程序。但由于考虑到插补误差尽可能减小的问题,我又做了改动,在插补每个象限的直线时我都进行了减小插补误差的调整,所以编制出来的程序的插补误差有所改善。五、本设计的优缺点1.缺点:(1)逐点比较法圆弧插补只能对逆圆弧进行插补,不能插补顺圆弧. (2)插补的的直线或圆弧的范围有限,不能进行很大尺寸的插补,同时尺寸过小也不好查看. 2.优点:(1)有输入输出界面,界面友好,可操作性强。(2)直线逐点比较法和DDA法插补都有,且为全平面插补,功能较强。(3)逐点比较法插补的直线由于我做了改进,所以插补的误差有所改进。(4)圆弧插补的输入参数为起点、终点和半径,且有劣弧与优弧之分,符合实际插补程序的要求,为大众化插补所需参数。六、主要算法及源程序6.1 基本画两点间直线的函数/*基本画直线的函数*/void CShukongView:Line(CDC* pDC,double x1,double y1,double x2,double y2,int siw,COLORREF col)CPen siPen;CPen* poldpen;siPen.CreatePen(PS_SOLID,siw,col);poldpen=pDC->SelectObject(&siPen);pDC->MoveTo(int(HI*x1),int(HI*y1);pDC->LineTo(int(HI*x2),int(HI*y2);pDC->SelectObject(poldpen);siPen.DeleteObject();6.2 绘制坐标/*绘制坐标*/void CShukongView:ZuoBiao(CDC* pDC)int x1,y1,x2,y2;int j;char buf20;CString sc;x1=0;y1=0;x2=-330;y2=0;wsprintf(buf,"%d",x1);pDC->TextOut(-28,-10,buf,strlen(buf);Line(pDC,-350,0,350,0,5,RGB(0,0,0);for(j=0;j<=16;j+)Line(pDC,340,-4+j*0.5,355,0,2,RGB(0,0,0);pDC->TextOut(int(HI*340),-20,"X");for(j=0;j<10;j+)x1+=30; Line(pDC,x1,0,x1,5,2,RGB(0,0,0);wsprintf(buf,"%d",x1);pDC->TextOut(int(HI*(x1-6),-int(HI*5),buf,strlen(buf);for(j=-10;j<0;j+)x2+=30;Line(pDC,x2,0,x2,5,2,RGB(0,0,0);wsprintf(buf,"%d",x2);pDC->TextOut(int(HI*(x2-8),-int(HI*5),buf,strlen(buf);Line(pDC,0,-350,0,350,5,RGB(0,0,0);for(j=0;j<=16;j+)Line(pDC,-4+j*0.5,340,0,355,2,RGB(0,0,0);pDC->TextOut(25,int(HI*350),"Y");for(j=0;j<10;j+)y1+=30;Line(pDC,0,y1,5,y1,2,RGB(0,0,0);wsprintf(buf,"%d",y1);pDC->TextOut(-int(HI*24),int(HI*(y1+6),buf,strlen(buf);for(j=-10;j<0;j+)y2-=30;Line(pDC,0,y2,5,y2,2,RGB(0,0,0);wsprintf(buf,"%d",y2);pDC->TextOut(-int(HI*27),int(HI*(y2+6),buf,strlen(buf);6.3 DDA法插补直线/*DDA法插补直线*/void CShukongView:DDA_Line(CDC* pDC)double xe,ye;int n,i;int jrx=0,jry=0,jvx,jvy;double sx,sy,ex,ey;if(lst=0)MessageBox("步长不能为零,请从新输入步长!");elseLine(pDC,lsx,lsy,lex,ley,4,RGB(255,0,0);xe=fabs(lex-lsx)/lst;ye=fabs(ley-lsy)/lst;for(n=2;(n<=xe)|(n<=ye);)n=n*2;jvx=int(xe);jvy=int(ye);sx=lsx;sy=lsy;ex=lex;ey=ley;if(lsx<=lex)&&(ley>=lsy)for(i=0;i<=n;i+)jrx=jrx+jvx;jry=jry+jvy;ex=(jrx/n)*lst+sx;ey=(jry/n)*lst+sy;Line(pDC,sx,sy,ex,ey,4,RGB(0,128,0);sx=ex;sy=ey;jrx=jrx%n;jry=jry%n;else if(lsx<=lex)&&(ley<lsy)for(i=0;i<=n;i+)jrx=jrx+jvx;jry=jry+jvy;ex=sx+(jrx/n)*lst;ey=sy-(jry/n)*lst;Line(pDC,sx,sy,ex,ey,4,RGB(0,128,0);sx=ex;sy=ey;jrx=jrx%n;jry=jry%n;else if(lsx>lex)&&(ley>=lsy)for(i=0;i<=n;i+)jrx=jrx+jvx;jry=jry+jvy;ex=sx-(jrx/n)*lst;ey=sy+(jry/n)*lst;Line(pDC,sx,sy,ex,ey,4,RGB(0,128,0);sx=ex;sy=ey;jrx=jrx%n;jry=jry%n;else if(lsx>lex)&&(ley<lsy)for(i=0;i<=n;i+)jrx=jrx+jvx;jry=jry+jvy;ex=sx-(jrx/n)*lst;ey=sy-(jry/n)*lst;Line(pDC,sx,sy,ex,ey,4,RGB(0,128,0);sx=ex;sy=ey;jrx=jrx%n;jry=jry%n;Line(pDC,sx,sy,lex,ley,4,RGB(0,128,0);6.4 逐点比较法插补直线/*逐点比较法插补直线*/void CShukongView:COM_Line(CDC* pDC)double xe,ye;double sx,sy,ex,ey,fl; int E;if(lst=0)MessageBox("步长不能为零,请从新输入步长!");elseLine(pDC,lsx,lsy,lex,ley,4,RGB(255,0,0);xe=fabs(lex-lsx)/lst;ye=fabs(ley-lsy)/lst;E=int(xe)+int(ye);sx=lsx;sy=lsy;ex=sx;ey=sy;fl=0;while(E>0) /*右上方*/if(lsx<=lex)&&(lsy<ley)if(ley-lsy)>(lex-lsx)if(fl<=0)ex=ex;ey=ey+lst;elseex=ex+lst;ey=ey;elseif(fl<0)ex=ex;ey=ey+lst;elseex=ex+lst;ey=ey;if(ex=lsx)if(lex=lsx)fl=0;elsefl=1;elsefl=(ey-lsy)/(ex-lsx)-(ley-lsy)/(lex-lsx); /*左上方*/if(lsx>lex)&&(lsy<=ley)if(ley-lsy)/(lex-lsx)<-1)if(fl<=0)ex=ex;ey=ey+lst;elseex=ex-lst;ey=ey;elseif(fl<0)ex=ex;ey=ey+lst;elseex=ex-lst;ey=ey;if(ex=lsx)fl=1;elsefl=(ley-lsy)/(lex-lsx)-(ey-lsy)/(ex-lsx); /*左下方*/if(lsx>=lex)&&(lsy>ley)if(ley-lsy)<(lex-lsx)if(fl<0)ex=ex-lst;ey=ey;elseex=ex;ey=ey-lst;elseif(fl<=0)ex=ex-lst;ey=ey;elseex=ex;ey=ey-lst;if(ex=lsx)if(lsx=lex)fl=0;elsefl=-1;elsefl=(ley-lsy)/(lex-lsx)-(ey-lsy)/(ex-lsx); /*右下方*/if(lsx<lex)&&(lsy>=ley)if(ley-lsy)/(lex-lsx)<-1)if(fl<0)ex=ex+lst;ey=ey;elseex=ex;ey=ey-lst;elseif(fl<=0)ex=ex+lst;ey=ey;elseex=ex;ey=ey-lst;if(ex=lsx)fl=-1;elsefl=(ey-lsy)/(ex-lsx)-(ley-lsy)/(lex-lsx);Line(pDC,sx,sy,ex,ey,4,RGB(0,128,0);sx=ex;sy=ey;E=E-1;Line(pDC,sx,sy,lex,ley,4,RGB(0,128,0);6.5 逐点比较法插补圆弧6.5.1 插补圆弧主程序/*圆弧插补主程序*/void CShukongView:COM_Arc(CDC* pDC)double midx,midy,fab,q,k0;int i;q=sqrt(aex-asx)*(aex-asx)+(aey-asy)*(aey-asy);if(q>fabs(arad*2)MessageBox("输入圆弧参数有误,请从新输入!");elsemidx=(asx+aex)/2;midy=(asy+aey)/2;cx=midx;cy=midy;if(asx!=aex&&aey!=asy)k0=(aey-asy)/(aex-asx);k=-1/k0;if(ast=0)MessageBox("步长不能为零,请从新输入步长!");elsefab=fabs(cx-asx)*(cx-asx)+(cy-asy)*(cy-asy)-(arad*arad);while(fab>=0.05)if(asx=aex&&asy=aey)cx=cx+arad;cy=cy;else if(asx=aex)if(asy<aey)if(arad>0)cx=cx-sqrt(arad*arad-(aey-asy)*(aey-asy)/4.0);cy=cy;elsecx=cx+sqrt(arad*arad-(aey-asy)*(aey-asy)/4.0);cy=cy;elseif(arad>0)cx=cx+sqrt(arad*arad-(aey-asy)*(aey-asy)/4.0);cy=cy;elsecx=cx-sqrt(arad*arad-(aey-asy)*(aey-asy)/4.0);cy=cy;else if(aey=asy)if(asx<aex)if(arad>0)cx=cx;cy=cy+sqrt(arad*arad-(aex-asx)*(aex-asx)/4.0);elsecx=cx;cy=cy-sqrt(arad*arad-(aex-asx)*(aex-asx)/4.0);elseif(arad>0)cx=cx;cy=cy-sqrt(arad*arad-(asx-aex)*(asx-aex)/4.0);elsecx=cx;cy=cy+sqrt(arad*arad-(asx-aex)*(asx-aex)/4.0);else if(aey>asy)if(k=1)&&(arad*arad*2=(aex-asx)*(aex-asx)+(aey-asy)*(aey-asy)if(arad>0)cx=aex;cy=asy;elsecx=asx;cy=aey;else if(k=-1)&&(arad*arad*2=(aex-asx)*(aex-asx)+(aey-asy)*(aey-asy)if(arad>0)cx=asx;cy=aey;elsecx=aex;cy=asy;elseif(arad>0)cx=cx-0.0001;cy=k*(cx-midx)+midy;elsecx=cx+0.0001;cy=k*(cx-midx)+midy;else if(aey<asy)if(k=1)&&(arad*arad*2=(aex-asx)*(aex-asx)+(aey-asy)*(aey-asy)if(arad>0)cx=aex;cy=asy;elsecx=asx;cy=aey;else if(k=-1)&&(arad*arad*2=(aex-asx)*(aex-asx)+(aey-asy)*(aey-asy)if(arad>0)cx=asx;cy=aey;elsecx=aex;cy=asy;elseif(arad>0)cx=cx+0.0001;cy=k*(cx-midx)+midy;elsecx=cx-0.0001;cy=k*(cx-midx)+midy;fab=fabs(cx-asx)*(cx-asx)+(cy-asy)*(cy-asy)-(arad*arad);if(asx=aex&&asy=aey&&arad>0)k0=0;elsex=asx;y=asy;x3=asx; y3=asy;color1=255;color2=0;color3=0;l=1/HI;i=1;while(i>=0)if(asx>cx&&asy>=cy)COM_Arc0_1(pDC);if(w=1)COM_Arc0_2(pDC);if(w=1)COM_Arc0_3(pDC);if(w=1)COM_Arc0_4(pDC);if(w=1)COM_Arc0_1(pDC);else if(asx<=cx&&asy>cy)COM_Arc0_2(pDC);if(w=1)COM_Arc0_3(pDC);if(w=1)COM_Arc0_4(pDC);if(w=1)COM_Arc0_1(pDC);if(w=1)COM_Arc0_2(pDC);else if(asx<cx&&asy<=cy)COM_Arc0_3(pDC);if(w=1)COM_Arc0_4(pDC);if(w=1)COM_Arc0_1(pDC);if(w=1)COM_Arc0_2(pDC);if(w=1)COM_Arc0_3(pDC);else if(asx>=cx&&asy<cy)COM_Arc0_4(pDC);if(w=