C语言模拟直线插补与圆弧插补程序设计

合集下载

项目六直线与圆弧插补指令的应用

项目六直线与圆弧插补指令的应用

项目六直线与圆弧插补指令的应用项目六直线与圆弧插补指令的应用任务描述:1. 巩固编程步骤2. 掌握绝对坐标编程和相对坐标编程的方法。

3. 掌握定位指令、直线插补指令、圆弧插补指令的使用方法和规则任务分析:本任务进入到数控程序的编制实例讲解,通过一个指明轨迹加工过程,示范一个简单编程范例,达到使学生初步掌握简单轨迹编程的方法。

一般的加工轨迹都是由直线和圆弧组成,而直线与圆弧插补指令则是描绘这样一个加工轨迹的基本指令。

一、绝对坐标编程与相对坐标编程1.1绝对和相对编程模式如图6-1所示图6-1绝对和相对坐标1.绝对坐标(G90):就是以零件上一个公共点(工件坐标原点)作为参考——称为绝对输入的原点。

例如,G90 G01 X+100 Y-50 F300;说明选择G90 绝对模式,数学符号“+”、“—”表示直角坐标系的象限,而不是运动方向;X+100 Y-50表示刀具在程序原点中的刀具位置,而不是刀具运动本身。

2.相对坐标(G91):就是以前一个目标为起点到后一点之间的距离。

例如,G91 G01 X+100 Y-50 F300;数字符号“+”、“—”制定刀具运动方向,而不表示直角坐标系的象限;X+50 Y-50表示刀具在制定方向上的运动距离。

提示:1.绝对模式下,所有的尺寸都是从程序原点开始测量。

2.相对模式下,所有程序尺寸都是制定方向上的间隔距离。

1.2快速定位指令(G00)【指令格式】坐标值:表示移动的终点坐标G00 X___ Y____ Z____;坐标值:表示移动的终点坐标提示:1.该指令只能用于定位,不能用于切削。

2.快速定位的速度由数控机床参数决定。

同时,该指令也不受“F 指令”指明的进给速度影响。

3.定位时各坐标轴为独立控制而不是联动控制。

这样可能导致各坐标轴不能同时到达目标点。

例如:执行G00 X50 Y50;由于X轴与Y 轴同时按照机床参数给定的速度运动,产生X轴先到达位置,Y轴后到达的情况。

数据采样法插补C语言程序

数据采样法插补C语言程序
{
double fDeltaL,fL;
double K;
int bXIsBigger;
double GEnd,NEnd;
double GStepVal;//NStepVal;
double AxisGVal,AxisNVal;
double fStVel;
double fDistToEnd;
fStVel=FVal/300000; //插补速度,单位为mm/st
DSM_Line(30,50,1000,10);//输入要插补直线的参数
fclose(fp);
return 0;
}
AxisGVal=AxisNVal=0;
fDeltaL=FVal*Ts/(60*1000); //一个插补周期内的合成增量,单位为毫米
fL=sqrt(XEnd*XEnd+YEnd*YEnd);
K=fDeltaL/fL;
//确定引导坐标和非引导坐标
if (fabs(XEnd>=fabs(YEnd)))
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;
}

直线及圆弧插补程序--逐点比较法

直线及圆弧插补程序--逐点比较法
else
{if(XOY==1||XOY==2)
{
ZF=3;
strcpy(e,c);
}
else
{ZF=4;strcpy(e,d);}
FM=FM+fabs(NX);
printf(" %d %s FM=%d NXY=%d\n\n",BS-NXY,e, FM,NXY);}}}
图一:插补计算过程
第一象限直线OA,起点为(0,0),终点坐标为A(6,4)
图二:插补计算过程
第二象限直线OA,起点为(0,0),终点坐标为A(-3,2)
图三:插补计算过程
第三象限直线OA,起点为(0,0),终点坐标为A(-2,-3)
图四:插补计算过程
第四象限直线OA,起点为(0,0),终点坐标为A(3,-2)
二.四象限逐点比较法圆弧插补
加工逆圆弧(或顺圆弧)A⌒B,圆弧的圆心在坐标原点,已知起点坐标为(X0,Y0)终点坐标(NX,NY)。
XM=X0;
YM=Y0;
for(NXY= fabs(NX-X0) + fabs(NY-Y0)-1;NXY>=0;NXY--)
{
if(RNS==1||RNS==3||RNS==6||RNS==8)
{
if(FM>=0)
{
if(RNS==1||RNS==8)
{ZF=1;
strcpy(e,a);
}
else
{ZF=2;
此程序是根据《微型计算机控制技术》(第二版)清华大学出版社
第三章数字控制技术——3.2插补原理中的3.2.1逐点比较法的直线插补,3.2.2逐点比较法圆弧插补编写的。其中的变量定义,原理依据均来源于此,如有疑问,请参考书中的讲解。尤其是例子,以下两个程序的第一个运行图均与例题中的一致。

欧姆龙NJ直线插补及圆弧插补

欧姆龙NJ直线插补及圆弧插补

NJ网络实验4实验目的:a.实现空间一组4个工位的合成直线运动。

工位1(0,0),工位2(2000,2000),工位3(2000, 0),工位4(0,0)b.使用圆弧插补功能,实现下图运动轨迹。

(图中数值仅供参考,可自行修改)C.学习齿轮比(变速)MC_gearin,MC_gearout指令。

速度比要求3比1实验器材:NJ、G5伺服及伺服电机两套;E3ZM-V81两个、网线若干(AT部门NJ样机箱)。

参考资料:NJ教材、NJ操作手册、运动控制指令手册指导人员:实验内容:1.样机搭建、网络组建、轴设置在前报告中已经说明,此处省略。

其中轴设置中原点返回设置选择如下图两轴原点返回均为此设置2.建立轴组:轴设置完毕后,在“配置和设置”中右键点击轴组设置,在下拉菜单中左键点击添加轴组设置,如下图添加后,左键双击MC_Group000;在轴组基本设置中“轴组使用”选择“使用轴组”如下图:构成选择“2轴”分别将“轴A0”分配MC_Axis000(0);“轴A1”分配MC_Axis001(1)如下图点击左侧“轴组操作设置”在下图中设置最大插补速度及加速度等,轴设置完毕3.编写程序A、准备程序程序本次程序依然需要MC_POWER及MC_HOME指令由于与上次程序相同这里不多介绍,程序如下图:原点返回指令“MC_GroupEnable”轴组使能指令,以下为手册截图由于直线插补指令属于轴组指令,如想进行直线插补首先要进行轴组使能指令,否则无法使用对应指令。

将上一步设置好的MC_Group000使能,程序如下指令“MC_GroupDisable”使能解除指令与MC_GroupEnable对应指令,被轴组使能后被使能轴只能使用轴组指令,而不能使用轴指令,例如MC_Move等指令,所以程序中需要编写MC_GroupEnable程序程序如下B、实验程序实验a、实现空间一组4个工位的合成直线运动。

工位1(0,0),工位2(2000,2000),工位3(2000, 0),工位4(0,0)需要用到“MC_MoveLinear”进行直线插补,程序编写如下其中P1、P2、P3、P4分别赋值1、(0,0),2、(2000,2000),3、(2000, 0),4、(0,0),v:=500如下图实验a、完成。

插补程序源代码

插补程序源代码

插补程序源代码目录1逐点比较法插补c语言程序源代码 (02)2 逐点比较法圆弧插补VB源程序 (07)3 逐点比较法直线插补VB源程序 (11)4 时间分割法直线插补参考VB程序 (13)5 时间分割法圆弧插补VB源程序 (14)1 逐点比较法插补c语言程序源代码#include "conio.h"#include "graphics.h"#include "process.h"#define Ni_circle 0#define Shun_circle 1void init_graph();void draw_Base_circle();void draw_cabu_circle();void close_graph();void acrroods();static float x0,y0;void line_cabu(), draw_line(),draw_line_cabu();void line_cabu() /*此函数控制直线插步两次*/{int i;init_graph();sleep(1);for(i=0;i<2;i++){line(0,120,300,120); outtextxy(310,120,"Z");line(100,10,100,300); outtextxy(110,300,"X");outtextxy(90,130,"O");draw_line();if(i==0)draw_line_cabu(6);else draw_line_cabu(2);gotoxy(50,5);getch();cleardevice();setcolor(WHITE);}}void draw_line()/*画直线*/{line(100,120,600,450);textcolor(YELLOW);directvideo=0;gotoxy(45,5); cprintf("Line from:X0 Y0 Z0 ");gotoxy(45,6); cprintf("Line to :X500 Y0 Z330");gotoxy(45,7); cprintf("Units :Pixel");gotoxy(45,8); cprintf("Line now:");}void draw_line_cabu(int step)/*关键的直线插补函数*/{int Xe=600,Ye=450;float Fm,Xm=100,Ym=120;setcolor(RED);moveto(Xm,Ym);while(Xm<=Xe&&Ym<=Ye){Fm=(Ym-120)*(Xe-100)-(Xm-100)*(Ye-120);if(Fm>=0)Xm=Xm+step;elseYm=Ym+step;lineto(Xm,Ym);gotoxy(55,8); printf("X%3.0f Y0 Z%3.0f",Xm-100,Ym-120);delay(1100);}}/* 圆插补部分的函数区*/void init_graph() /*图形系统初始化*/{int gdrive=DETECT,gmode;initgraph(&gdrive,&gmode,"");cleardevice();}void acrroods() /*屏幕中心坐标*/{x0=getmaxx()/2;y0=getmaxy()/2;}void draw_Base_circle() /*画圆及写参数*/{line(x0-200,y0,x0+200,y0); outtextxy(x0+220,y0,"Z");line(x0,y0-180,x0,y0+180); outtextxy(x0+10,y0+180,"X");outtextxy(x0-10,y0+10,"O");circle(x0,y0,150);textcolor(YELLOW);directvideo=0;gotoxy(46,2);cprintf("Circle start:X0 Y0 Z150");gotoxy(46,3);cprintf("Circle end :X0 Y0 Z150");gotoxy(46,4);cprintf("Units :Pixel");gotoxy(46,5);cprintf("Circle now:");}void close_graph() /*关图形系统*/{closegraph();}void draw_cabu_circle(int sstep,int Directory)/*关键的圆插补函数*/{int flag=0;float Fm,Xm,Ym;Xm=x0+150; Ym=y0;moveto(Xm,Ym);setcolor(RED);while(1) /*分象限,顺圆和逆圆讨论*/{Fm=(Xm-x0)*(Xm-x0)+(Ym-y0)*(Ym-y0)-150*150;/*圆判断公式*/ if(Fm>=0){if(!Directory){ /*逆圆判断*/if(Xm>=x0&&Ym<=y0){if(flag) break; /*if语句判断象限,以下一样*/else Xm=Xm-sstep;}if(Xm<=x0&&Ym<=y0){flag=1; Ym=Ym+sstep;}if(Xm<=x0&&Ym>=y0)Xm=Xm+sstep;if(Xm>=x0&&Ym>=y0)Ym=Ym-sstep;}else { /*it is Directory's else*/if(Xm>x0&&Ym<y0)Ym=Ym+sstep;if(Xm<=x0&&Ym<=y0)Xm=Xm+sstep;if(Xm<x0&&Ym>y0) {flag=1; Ym=Ym-sstep;}if(Xm>=x0&&Ym>=y0) {if(flag) break;Xm=Xm-sstep;}}}else{ /*it is Fm's else*/if(!Directory) {if(Xm>x0&&Ym<y0){if(flag) break;else Ym=Ym-sstep;}if(Xm<=x0&&Ym<=y0){flag=1; Xm=Xm-sstep;}if(Xm<=x0&&Ym>=y0)Ym=Ym+sstep;if(Xm>=x0&&Ym>=y0)Xm=Xm+sstep;}else{if(Xm>x0&&Ym<y0)Xm=Xm+sstep;if(Xm<=x0&&Ym<=y0)Ym=Ym-sstep;if(Xm<=x0&&Ym>=y0){flag=1; Xm=Xm-sstep;}if(Xm>=x0&&Ym>=y0) {if(flag) break;else Ym=Ym+sstep;}}}lineto(Xm,Ym);gotoxy(58,5); printf("X%3.0f Y0 Z%3.0f ",Ym-y0,Xm-x0);delay(800);}}void circle_demo(int Directory) /*控制圆插补两次*/{int i=0,sstep;init_graph();sleep(2);acrroods(&x0,&y0);for(i=0;i<2;i++){draw_Base_circle(150);if(i==0){sstep=6;draw_cabu_circle(sstep,Directory);}else{sstep=1;draw_cabu_circle(sstep,Directory);}getch();cleardevice();setcolor(WHITE);}}/* 圆插补部分的函数区结束*/main()/*主函数负责写封面和函数调用*/{int choice=0;init_graph();while(choice!=4){setfillstyle(1,RED);bar(200,30,400,80);setcolor(GREEN);settextstyle(3,0,10);outtextxy(220,50,"DEMO PROGRAM BY P.Y.F");setcolor(WHITE);settextstyle(0,0,1);outtextxy(200,120,"1. Line demo.");outtextxy(200,140,"2. Shun_Circle demo.");outtextxy(200,160,"3. Ni_Circle demo.");outtextxy(200,180,"4. Quit the program.");outtextxy(160,200,"Please enter your choice:"); gotoxy(46,13);scanf("%d",&choice);switch(choice){case 1: line_cabu();break;case 2: circle_demo(Ni_circle);break;case 3: circle_demo(Shun_circle);break;case 4: break;default: printf("\nChoice wrong,try again!");}}close_graph();}2 逐点比较法圆弧插补VB源程序Sub 偏差计算()偏差= Sqr((x动点- x圆心) 2 + (z动点- z圆心) 2) - R End SubSub 插补()x动点= x起点: z动点= z起点:动点象限判别xx: Select Case 象限标志Case 1: 单步连续判断If 顺逆标志= "顺" Then '第一象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenx动点= x动点- 1:Line -Step(0, -x步长), vbRedElsez动点= z动点+ 1:Line -Step(z步长, 0), vbRedEnd If偏差计算动点象限判别If 象限标志<> 1 ThenGoTo xxEnd If单步连续判断LoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenz动点= z动点- 1:Line -Step(-z步长, 0), vbRedElsex动点= x动点+ 1:Line -Step(0, x步长), vbRedEnd IfDoEvents偏差计算动点象限判别If 象限标志<> 1 ThenGoTo xxEnd IfLoopEnd IfCase 2: 单步连续判断If 顺逆标志= "顺" Then '第二象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenz动点= z动点- 1:Line -Step(-z步长, 0), vbRedElsex动点= x动点- 1:Line -Step(0, -x步长), vbRedEnd If偏差计算动点象限判别If 象限标志<> 2 ThenGoTo xxEnd IfLoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenx动点= x动点+ 1:Line -Step(0, x步长), vbRedElsez动点= z动点+ 1:Line -Step(z步长, 0), vbRedEnd If偏差计算动点象限判别If 象限标志<> 2 ThenGoTo xxEnd IfLoopEnd IfCase 3: 单步连续判断If 顺逆标志= "顺" Then '第三象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenx动点= x动点+ 1:Line -Step(0, x步长), vbRedElsez动点= z动点- 1:Line -Step(-z步长, 0), vbRedEnd IfDoEvents偏差计算动点象限判别If 象限标志<> 3 ThenGoTo xxEnd IfLoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenz动点= z动点+ 1:Line -Step(z步长, 0), vbRedElsex动点= x动点- 1:Line -Step(0, -x步长), vbRedEnd If偏差计算动点象限判别If 象限标志<> 3 ThenGoTo xxEnd IfLoopEnd IfCase 4: 单步连续判断If 顺逆标志= "顺" Then '第三象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenz动点= z动点+ 1:Line -Step(z步长, 0), vbRedElsex动点= x动点+ 1:Line -Step(0, x步长), vbRedEnd If偏差计算动点象限判别If 象限标志<> 4 ThenGoTo xxEnd IfLoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenx动点= x动点- 1:Line -Step(0, -x步长), vbRedElsez动点= z动点- 1:Line -Step(-z步长, 0), vbRedEnd If偏差计算动点象限判别If 象限标志<> 4 ThenGoTo xxEnd IfLoopEnd IfEnd SelectEnd Sub3 逐点比较法直线插补VB源程序Sub 偏差计算()偏差 = Abs(x终点) × z动点 - x动点× Abs(z终点) End SubSub 插补()Dim c As IntegerSelect Case 象限标志Case 1: '第一象限插补Do Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1:Line -Step(0, x步长), vbRedElsez动点 = z动点 + 1:Line -Step(z步长, 0), vbRedEnd If偏差计算LoopCase 2: '第二象限插补c = x终点: x终点= z终点: z终点= -cc = x步长: x步长 = z步长: z步长 = -cDo Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1:Line -Step(x步长, 0), vbRedElsez动点 = z动点 + 1:Line -Step(0, z步长), vbRedEnd If偏差计算LoopCase 3: '第三象限插补x步长 = -x步长: z步长 = -z步长Do Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1:Line -Step(0, x步长), vbRedElsez动点 = z动点 + 1:Line -Step(z步长, 0), vbRedEnd If偏差计算LoopCase 4: '第四象限插补c = x终点: x终点= -z终点: z终点 = cc = x步长: x步长 = -z步长: z步长 = cDo Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1: Line -Step(x步长, 0), vbRedElsez动点 = z动点 + 1: Line -Step(0, z步长), vbRedEnd If偏差计算LoopEnd SelectEnd Sub4 时间分割法直线插补参考VB程序Sub 插补()Dim l, K, a, B, f1, tx动点对起点= 0: z动点对起点= 0f1 = f × 10: t = Ts / 60000l = Sqr((x终点对起点^ 2 + z终点对起点^ 2))K = f1 × t / la = Sqr((x动点对起点- x终点对起点) ^ 2 + (z动点对起点- z终点对起点) ^ 2)x步长= K × x终点对起点: z步长= K × z终点对起点:B = Sqr(z步长^ 2 + x步长^ 2)Do Until a <= B / 2x动点对起点= x动点对起点+ x步长: z动点对起点= z动点对起点+ z步长a = Sqr((x动点对起点- x终点对起点) ^ 2 + (z动点对起点- z终点对起点) ^ 2)Line -Step(z步长×系数, x步长×系数), vbRedx动点对原点= x动点对起点+ x起点对原点: y动点对原点= y动点对起点+y起点对原点: z动点对原点= z动点对起点+ z起点对原点LoopEnd Sub5 时间分割法圆弧插补VB源程序圆弧(切线法):Sub 插补()Dim 区间符号As IntegerDim x, y, z As DoubleDim KDim 径向误差, R动As Double顺逆符号判别读数据If R < 0.001 ThenElseTs = Ts / 60000步长= f × Ts:K = 步长/ Rx动点对圆心= -x圆心对起点/ 系数: z动点对圆心= -z圆心对起点/ 系数End Ifx = ((x动点对圆心- x终点对圆心) ^ 2 + (z动点对圆心- z终点对圆心) ^ 2) ^ 0.5y = 3 ×步长×系数Do Until x <= ydeltaZ = -顺逆符号× K × x动点对圆心deltaX = 顺逆符号× K × z动点对圆心Line -Step(deltaZ, deltaX), vbRedx动点对圆心= x动点对圆心+ deltaX: z动点对圆心= z动点对圆心+ deltaZ: x动点对原点= x动点对圆心+ x圆心对原点: y动点对原点= y动点对圆心+y圆心对原点: z动点对原点= z动点对圆心+ z圆心对原点:x = ((x动点对圆心- x终点对圆心) ^ 2 + (z动点对圆心- z终点对圆心) ^ 2) ^ 0.5:y = 3 ×步长×系数R动= Sqr(x动点对圆心^ 2 + z动点对圆心^ 2)LoopEnd Sub。

直线插补C语言程序

直线插补C语言程序

直线插补C语言程序#include "conio.h"#include "graphics.h"#include "process.h"#define Ni_circle 0#define Shun_circle 1void init_graph();void draw_Base_circle();void draw_cabu_circle();void close_graph();void acrroods();static float x0,y0;void line_cabu(), draw_line(),draw_line_cabu(); void line_cabu() /*此函数控制直线插步两次*/ { int i;init_graph();sleep(1);for(i=0;i<2;i++) {line(0,120,300,120); outtextxy(310,120,"Z"); line(100,10,100,300); outtextxy(110,300,"X"); outtextxy(90,130,"O");draw_line();if(i==0)draw_line_cabu(6);else draw_line_cabu(2);gotoxy(50,5);getch();cleardevice();setcolor(WHITE);}}void draw_line()/*画直线*/{line(100,120,600,450);textcolor(YELLOW);directvideo=0;gotoxy(45,5); cprintf("Line from:X0 Y0 Z0 ");gotoxy(45,6); cprintf("Line to :X500 Y0 Z330");gotoxy(45,7); cprintf("Units :Pixel");gotoxy(45,8); cprintf("Line now:");}void draw_line_cabu(int step)/*关键的直线插补函数*/ {int Xe=600,Ye=450;float Fm,Xm=100,Ym=120;setcolor(RED);moveto(Xm,Ym);while(Xm<=Xe&&Ym<=Ye){Fm=(Ym-120)*(Xe-100)-(Xm-100)*(Ye-120);if(Fm>=0)Xm=Xm+step;elseYm=Ym+step;lineto(Xm,Ym);gotoxy(55,8); printf("X%3.0f Y0 Z%3.0f",Xm-100,Ym-120); delay(1100);}}/* 圆插补部分的函数区*/void init_graph() /*图形系统初始化*/{int gdrive=DETECT,gmode;initgraph(&gdrive,&gmode,"");cleardevice();}void acrroods() /*屏幕中心坐标*/{x0=getmaxx()/2;y0=getmaxy()/2;} void draw_Base_circle() /*画圆及写参数*/{line(x0-200,y0,x0+200,y0); outtextxy(x0+220,y0,"Z");line(x0,y0-180,x0,y0+180); outtextxy(x0+10,y0+180,"X"); outtextxy(x0-10,y0+10,"O");circle(x0,y0,150);textcolor(YELLOW);directvideo=0;gotoxy(46,2);cprintf("Circle start:X0 Y0 Z150");gotoxy(46,3);cprintf("Circle end :X0 Y0 Z150");gotoxy(46,4);cprintf("Units :Pixel");gotoxy(46,5);cprintf("Circle now:");}void close_graph() /*关图形系统*/{closegraph();}void draw_cabu_circle(int sstep,int Directory)/*关键的圆插补函数*/{int flag=0;float Fm,Xm,Ym;Xm=x0+150; Ym=y0;moveto(Xm,Ym);setcolor(RED);while(1) /*分象限,顺圆和逆圆讨论*/{Fm=(Xm-x0)*(Xm-x0)+(Ym-y0)*(Ym-y0)-150*150;/*圆判断公式*/if(Fm>=0){if(!Directory){ /*逆圆判断*/if(Xm>=x0&&Ym<=y0){if(flag) break; /*if语句判断象限,以下一样*/else Xm=Xm-sstep;}if(Xm<=x0&&Ym<=y0){flag=1; Ym=Ym+sstep;}if(Xm<=x0&&Ym>=y0)Xm=Xm+sstep;if(Xm>=x0&&Ym>=y0)Ym=Ym-sstep;}else { /*it is Directory's else*/if(Xm>x0&&Ym<y0)Ym=Ym+sstep;Xm=Xm+sstep;if(Xm<x0&&ym>y0) { flag=1; Ym=Ym-sstep;} if(Xm>=x0&&Ym>=y0) { if(flag) break;Xm=Xm-sstep;}}}else{ /*it is Fm's else*/if(!Directory) {if(Xm>x0&&Ym<y0) {if(flag) break;else Ym=Ym-sstep;}if(Xm<=x0&&Ym<=y0) {flag=1; Xm=Xm-sstep; }if(Xm<=x0&&Ym>=y0) Ym=Ym+sstep;if(Xm>=x0&&Ym>=y0) Xm=Xm+sstep;}else{if(Xm>x0&&Ym<y0) Xm=Xm+sstep;if(Xm<=x0&&Ym<=y0) Ym=Ym-sstep;flag=1; Xm=Xm-sstep;}if(Xm>=x0&&Ym>=y0) {if(flag) break;else Ym=Ym+sstep;}}}lineto(Xm,Ym);gotoxy(58,5); printf("X%3.0f Y0 Z%3.0f ",Ym-y0,Xm-x0); delay(800);}}void circle_demo(int Directory) /*控制圆插补两次*/ {int i=0,sstep;init_graph();sleep(2);acrroods(&x0,&y0);for(i=0;i<2;i++){draw_Base_circle(150);if(i==0){sstep=6;draw_cabu_circle(sstep,Directory);}else{sstep=1;draw_cabu_circle(sstep,Directory);}getch();cleardevice();setcolor(WHITE);}}/* 圆插补部分的</y0)</y0)</x0&&ym></y0)函数区结束*/main()/*主函数负责写封面和函数调用*/{int choice=0;init_graph();while(choice!=4){setfillstyle(1,RED);bar(200,30,400,80);setcolor(GREEN);settextstyle(3,0,10);outtextxy(220,50,"DEMO PROGRAM BY P.Y.F");setcolor(WHITE);settextstyle(0,0,1);outtextxy(200,120,"1. Line demo.");outtextxy(200,140,"2. Shun_Circle demo.");outtextxy(200,160,"3. Ni_Circle demo.");outtextxy(200,180,"4. Quit the program.");outtextxy(160,200,"Please enter your choice:"); gotoxy(46,13); scanf("%d",&choice);switch(choice){case 1: line_cabu();break;case 2: circle_demo(Ni_circle);break;case 3: circle_demo(Shun_circle);break; case 4: break;default: printf("\nChoice wrong,try again!"); }}close_graph();}。

圆弧插补直线插补程序

圆弧插补直线插补程序
Zf = 1;
else
Zf = 2;
end
Fm = Fm - 2 * XM + 1;
XM=XM-StepLength;
% XM = XM - 1;
else
if RNS == 2 || RNS ==5
Zf = 3;
else
Zf = 4;
end
Fm = Fm + 2 * YM + 1;
YM=YM+StepLength;
% YM = YM + 1;
end
end
% switch Zf
% case 1
% XM=XM+StepLength;
% case 2
% XM=XM-StepLength;
% case 3
% YM=YM+StepLength;
% case 4
% YM=YM-StepLength;
% end
x = [X0 XM];
else
Zf = 2;
end
Fm = Fm -Ye;
else
if Xoy == 1 || Xoy == 2
Zf = 3;
else
Zf = 4;
end
Fm = Fm + Xe;
end
switch Zf
case 1
XM=XM+Nxy;
case 2
XM=XM-Nxy;
case 3
YM=YM+Nxy;
case 4
(RNSS~=1)*(((Y0==0)*((X0>0)*3+(X0<0)*4))+((X0==0)*((Y0>0)*2+(Y0<0)*1)));

DDA直线插补和圆弧插补VB程序

DDA直线插补和圆弧插补VB程序
y = y + p * Di
ElseIf f * Di = 0 Then
If Di = 1 Then
f = f + 2 * y * Di + p
y = y + p
Else
f = f - 2 * x * Di + p
End If
f = f + Abs(xe - x0)
End If
obj.Line -(x, y), vbRed '画折线
n = n - 1
DoEvents
For i = 1 To 2000000 * p
'延时
Next i
Exit Sub
End If
pic.Cls '清屏
axis pic '画坐标轴
p = Val(Combo1.Text) '读取脉冲当量
cmdShow.Enabled = False
If Option1.Value Then '演示直线插补
Text1(2) <> "" And Text1(3) <> "" Then
x1 = Val(Text1(0)): y1 = Val(Text1(1))
x2 = Val(Text1(2)): y2 = Val(Text1(3))
Else
MsgBox "输入坐标不完整!"
Private Sub Text1_Change(Index As Integer)
If Abs(Val(Text1(Index).Text)) > 9 Then

直线插补流程图

直线插补流程图

直线插补与圆弧插补程序设计一.直线插补1.直线插补程序流程图直线插补程序设计:#include"stdio.h"#include"math.h"void CHABU1 (int F,int n,int Y,int X) /*第一象限调用函数*/{int nx=0,ny=0;for(;n>0; n--){printf("运算前:F=%d ",F);i f(F>=0){printf("需走步数:n=%d\n",n);printf("------向+xe方向走一步 ");F=F-Y;printf("F=%d",F);printf("+X\n");nx++; /*X方向走的总步数*/}e lse{printf("需走步数:n=%d\n",n);printf("------向+ye方向走一步 ");F=F+X;printf("F=%d",F);printf("+Y\n");ny++; /*y方向走的总步数*/}}printf("nx=%d,ny=%d\n",nx,ny);void CHABU2(int F,int n,int Y,int X) /*第二象限调用函数*/{int nx=0,ny=0;for(;n>0; n--){printf("运算前:F=%d ",F);if(F>=0){printf("需走步数:n=%d\n",n);printf("------向-xe方向走一步 ");F=F-Y;printf("F=%d ",F);printf("-X\n");nx++; /*X方向走的总步数*/}else{printf("需走步数:n=%d\n",n);printf("------向+ye方向走一步 ");F=F+X;printf("F=%d ",F);printf("+Y\n");ny++; /*y方向走的总步数*/}}printf("nx=%d,ny=%d\n",nx,ny);}void CHABU3(int F,int n,int Y,int X) /*第三象限调用函数*/{int nx=0,ny=0;for(;n>0; n--){printf("运算前:F=%d ",F);if(F>=0){printf("需走步数:n=%d\n",n);printf("------向-xe方向走一步 ");F=F-Y;printf("F=%d ",F);printf("-X\n");nx++; /*X方向走的总步数*/}else{printf("需走步数:n=%d\n",n);printf("------向-ye方向走一步 ");F=F+X;printf("F=%d ",F);printf("-Y\n");ny++; /*y方向走的总步数*/}}printf("nx=%d,ny=%d\n",nx,ny);}void CHABU4(int F,int n,int Y,int X) /*第四象限调用函数*/{int nx=0,ny=0;for(;n>0; n--){printf("运算前:F=%d ",F);if(F>=0){printf("需走步数:n=%d\n",n);printf("------向+xe方向走一步 ");F=F-Y;printf("F=%d ",F);printf("+X\n");nx++; /*X方向走的总步数*/}else{printf("需走步数:n=%d\n",n);printf("------向-ye方向走一步 ");F=F+X;printf("F=%d ",F);printf("-Y\n");ny++; /*y方向走的总步数*/}}printf("nx=%d,ny=%d\n",nx,ny);}main(){int F=0,X=0,Y=0,n,xe,ye,x0,y0,ny,nx;void CHABU1 (int,int,int,int);/*函数声明*/void CHABU2(int,int,int,int);void CHABU3(int,int,int,int);void CHABU4(int,int,int,int);/*函数声明*/printf("输入相关数据\n");printf("x0=");scanf("%d",&x0);printf("xe=");scanf("%d",&xe);printf("y0=");scanf("%d",&y0);printf("ye=");scanf("%d",&ye);X=abs(xe-x0); /*取绝对值*/Y=abs(ye-y0); /*取绝对值*//*printf("X=%d\n",X);验证绝对值函数*/n=X+Y;printf("n=%d\n",n); /*总步数*/printf("运动结果如下:\n");if(x0>=0&&y0>=0&&xe>=0&&ye>=0) { printf("第一象限\n");CHABU1(F,n,Y,X);}else if(x0<=0&&y0>=0&&xe<=0&&ye>=0) { printf("第二象限\n");CHABU2(F,n,Y,X);}else if(x0<=0&&y0<=0&&xe<=0&&ye<=0) { printf("第三象限\n");CHABU3(F,n,Y,X);}else if(x0>=0&&y0<=0&&xe>=0&&ye<=0) { printf("第四象限\n");CHABU4(F,n,Y,X);}else printf("跨象限运动");}。

数控车床直线插补G01圆弧插补G02G03技术材料

数控车床直线插补G01圆弧插补G02G03技术材料

技术课件
上一页 下一页
16 返回
* 1.用圆心半径R指定圆心位置,其指令格式为:
G02/G03 X(U) Z(W) R F; 2.用圆心坐标(I,K)指定圆心位置,其指令格式为:
G02/G03 X(U) Z(W) I K F;
参数含义:
R——圆弧半径。
I、K——圆心相对于圆弧起点的增量坐标,I为
半径增量(即X方向增量),K为Z方向增量。
技术课件
上一页 下一页
23 返回
参考程序
O....; G00 X80 Z80 ; M03 S1000 T0100;
G00 X20 Z3 ; G01 Z0 F80; X24 Z-2 ; Z-12; G03 X40 W-8 R8; G01 Z-70;
G00 X80 Z80 ; M05 T0202; S500 M03;
技术课件
上一页 下一页
1 返回
1 2 3
技术课件
上一页 下一页
2 返回
指令格式:G01 X(U) Z(W) F;
参数含义:
X、Z—— 绝对编程时的目标点坐标,单位为mm。
U、W——相对编程时的目标点坐标,单位为mm。
F——切削进给速度,单位为mm/min或mm/r。
上一页
下一页
技术课件
3 返回
G01用于刀具直线插补运动。它是通过程序段中的信息,使机床各坐标 轴上产生与其移动距离成比例的速度。其运动轨迹如下:G01指令的运动轨 迹按切削进给速度运行,以一定的的切削进给速度,刀具意使用。
2.本例题采用绝对坐标编程。
技术课件
A
上一页 下一页
8 返回
技术课件
上一页 下一页
9 返回

直线插补与圆弧插补程序设计

直线插补与圆弧插补程序设计

直线插补与圆弧插补程序设计一.直线插补1.直线插补程序流程图直线插补程序流程图2.直线插补程序设计#include <stdio.h>#include <graphics.h>#include <stdlib.h>void cb_line(int x1, int y1, int x2, int y2) {int dx, dy, n, k, i, f;int x, y;dx = abs(x2-x1);dy = abs(y2-y1);n = dx + dy;if (x2 >= x1) {k = y2 >= y1 ? 1: 4;x = x1;y = y1;} else {k = y2 >= y1 ? 2: 3;x = x2;y = y2;}putpixel(x, y, 1);for (i = 0, f = 0; i < n; i++)if (f >= 0)switch (k) {case 1:putpixel(x++, y, 1);f -= dy;break;case 2:putpixel(x, y++, 1);f -= dx;break;case 3:putpixel(x--, y, 1);f -= dy;break;case 4:putpixel(x, y--, 1);f -= dx;break;}elseswitch (k) {case 1:putpixel(x, y++, 1);f += dx;break;case 2:putpixel(x--, y, 1);f += dy;break;case 3:putpixel(x, y--, 1);f += dx;break;case 4:putpixel(x++, y, 1);f += dy;break;}}int main(){cb_line(0,0,15,20); /* <--- you forgot ; here */return 0;}二.圆弧插补2.1.四象限圆弧插补程序流程图2.1四象限圆弧插补程序设计#include <stdio.h>#include <math.h>int ArcXY(double dfx0,double dfy0,double dfrx, double dfry,int angle); int symbol(double number);main(){ArcXY(0,0,-3,5,360);getch();}int ArcXY(double dfx0,double dfy0,double dfrx, double dfry,int angle) {FILE *f1;double i,j,dx,dy,dfr,x,y,ang,step,f = 0.01;int flag,tempx,tempy,statex,statey,direction = 1;dfr = sqrt((dfrx - dfx0) * (dfrx - dfx0) + (dfry - dfy0) * (dfry - dfy0));if(dfx0 == 0){dfx0 = 1;dfrx = dfrx + 1;statex =1;}if(dfy0 == 0){dfy0 = 1;dfry = dfry + 1;statey =1;}dfrx = 2 * dfx0 - dfrx;i = dfx0 - dfrx;j = dfy0 - dfry;x = dfx0 ;y = dfy0 ;step = ang = 180 * 2 * asin(f/(2*dfr))/3.1415926;if(((dfx0 > 0) && (dfy0 > 0)) || ((dfx0 < 0) && (dfy0 < 0))){flag = direction;}if(((dfx0 < 0) && (dfy0 > 0)) || ((dfx0 > 0) && (dfy0 < 0))) {flag = -direction;}f1=fopen("c:\\c.txt","w+");if(statex ==1){x = x - 1;}if(statey ==1){y = y - 1;}fprintf(f1,"%f,",x);fprintf(f1,"%f\n",y);while(ang < angle){dx = f * (j + flag*(f * i)/(2 * dfr))/dfr;dy = f * (i - flag*(f * j)/(2 * dfr))/dfr;tempx = symbol(x);tempy = symbol(y);x = x + dx;y = y + dy;fprintf(f1,"%f,",x);fprintf(f1,"%f\n",y);if( (tempx !=symbol(x)) || (tempy != symbol(y)) ){flag = -flag;}i = i - dx;j = j + dy;ang = ang + step;}return 0;}int symbol(double number) {if(number > 0){return 1;}else{return -1;}}。

数控车床 直线插补G01 圆弧插补G02,G03

数控车床 直线插补G01 圆弧插补G02,G03
G00 X80 Z80 ; M05 T0202; S500 M03;
精车A--J点的轮廓
快速返回刀具起点 主轴停止,换2号切断刀,刀宽为3 mm 主轴正转,转速500r/min
G00 X45 Z-33; G01 X40 F50; G02 X20 W-10 R10; G01 Z-60; X40;
精车K—I的轮廓
上一页
下一页
返回
参考程序 G00 X80 Z80; T0100 M05; M30;
注释 快速返回刀具起点 主轴停止,换回基准刀 程序结束
1. 由于T0100偏刀加工F-H的轮廓时刀具与工件有干涉,所以采用T0202切 槽刀来加工。 2.本程序G02/G03的程序段采用混合坐标编程。 3.刀具精加工时应根据刀具的性能采用不同的转速。 4. 本例切槽刀对刀时以左刀位点为基准,在定位加工时,应考虑刀宽与定 位点的位置。
程序名 快速定位至安全换刀点(刀具起点) 使用1号基准刀,主轴正转,转速600r/min 靠近工件
快速返回刀具起点 主轴停止 程序结束
上一页
下一页
返回
下一页 上一页
返回
如图所示,工件已粗加工完毕,各位置留有余量 0.2mm,要求重新编写精加工程序,不切断。
参考程序
注释
O....; G00 X100 Z100; M03 S800 T0101; G00 X20 Z2; G01 Z0 F60; X26 Z-3 ; Z-48; X60 Z-58 ; X80 W-73 ; G00 X100 Z100; M05 T0100; M30;
程序名 快速定位至安全换刀点(刀具起点) 使用1号基准刀,主轴正转,转速800r/min 靠近工件 快速定位到A点 加工到B点(顺圆弧加工) 加工到C点 加工到D点(逆圆弧加工) 加工到E点(顺圆弧加工) 加工到F点 快速返回刀具起点 主轴停止 程序结束

直线圆弧插补指令编程及加工

直线圆弧插补指令编程及加工

G40——取消刀尖圆弧半径补偿指令
指令格式:G40 G01
X(U)_Z(W)_;
G00
其中:X、Z _刀具移动到终点的绝对坐标值;
U、W _刀具移动到终点的绝对坐标值;
运动轨迹说明
A2 A3 A5 A4
A1 A5 A
G41 A3 A4
A2
A1 G41
G40
A
无刀尖圆弧半径补偿
刀尖圆弧半径左补偿
注意
1、刀具补偿功能
刀具补偿功能是用来补偿刀具实际安装位 置与理论编程位置之差的一种功能。它是数 控车床的一种主要功能,分为刀具偏移补偿 (即刀具位置补偿和刀具磨损补偿)和刀尖 圆弧半径补偿两种。
2、刀具偏移补偿
(1)刀具偏移补偿的概念 在编程时,设定刀架上各刀在工作位置时,其刀尖位置是 一致的。在实际加工时,由于刀具的几何形状及安装位置的 不同,刀尖位置相对于工件原点的距离也是不同的。另外, 因为每把刀具在加工过程中都有不同程度的磨损,而磨损后 刀具的刀尖位置与编程位置存在差值。因此需要将各刀具的 位置进行比较或设定,称为刀具位置或磨损补偿。 (2)刀具偏移补偿的原理 通过对刀或刀具预调,使每把刀的刀位点尽量重合于某一 理想基准点,同时测定各号刀的刀位偏差值,存入相应的刀 具偏置寄存器中以备加工时随时调用。
(5)刀尖圆弧半径补偿的指令
刀尖圆弧半径补偿是通过G41、G42、G40代码及T 代码指定的刀尖圆弧半径补偿号,加入或取消半径补偿。 G41——刀尖圆弧半径左补偿:从Y轴的正方向向XZ平面 看,顺着刀具运动方向,刀具在工件左侧。 G42——刀尖圆弧半径右补偿:从Y轴的正方向向XZ平面 看,顺着刀具运动方向,刀具在工件右侧。 G40——取消刀尖圆弧半径补偿:取消后,假想刀尖轨迹 与编程轨迹重合。

数控技术c语言直线、圆弧插补程序

数控技术c语言直线、圆弧插补程序

以下是直线差补c语言程序,后面还有圆弧差补,数控老师布置的作业,没办法,自己编的,运行时没问题,保证质量,#include<stdio.h>#include<math.h>main(){int x, y,x2,y2,dx, dy, n, k, i, f,a;printf ("请输入起始点:\n");scanf("%d%d",&x,&y);printf("请输入终止点:\n");scanf("%d%d",&x2,&y2);dx=abs(x2-x);dy=abs(y2-y);n=dx+dy;printf("步数n=%d\n",n);{if(x2>0) if(y2>0) k=1;else k=4;else if(y2>0) k=2;else k=3;} printf("相限k=%d\n",k);for (i=0,f=0;i<n;i++)if (f>= 0){switch (k) {case 1:x++;printf("%d %d\n",x ,y);f-=dy;continue;case 2:y++;printf("%d %d\n",x,y);f-=dx;continue;case 3:x--;printf("%d %d\n",x,y);f-=dy;continue;case 4:y--;printf("%d %d\n",x,y);f-=dx;continue;}}else{ switch (k) {case 1:y++;printf("%d %d\n",x ,y);f+=dx;continue;case 2:x--;printf("%d %d\n",x,y);f+=dy;continue;case 3:y--;printf("%d %d\n",x,y);f+=dx;continue;case 4:x++;printf("%d %d\n",x,y);f+=dy;continue;} }}下面为圆弧差补c语言程序#include"stdio.h"#include"math.h"#include"ctype.h"main(){ int X0,Y0,Xe,Ye,a,I,J,Ie,Je,f;printf("请输入圆弧上的两个点:");scanf("%d %d %d %d",&X0,&Y0,&Xe,&Ye);printf("(X0,Y0)=(%d,%d),(Xe,Ye)=(%d,%d)",X0,Y 0,Xe,Ye);printf("请选择圆弧加工方向,逆时针加工请输入1,顺时针加工请输入2\n");scanf("%d",&a);I=X0,J=Y0,Ie=Xe,Je=Ye,f=0;switch(a){ case 1:{loop: while((Ie!=I)||(Je!=J)){ if(I>=0&&J>0){if(f>=0){f=f-2*I+1;I=I-1;printf("f=%dI=%dJ=%d \n",f,I,J);}else{f=f+2*J+1;J=J+1;printf("f=%dI=%dJ=%d\n ",f,I,J);}goto loop;}if(I<0&&J>=0){if(f>=0){f=f-2*J+1;J=J-1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f-2*I+1;I=I-1;printf("f=%dI=%dJ=%d\n", f,I,J);}goto loop;}if(I<=0&&J<0){if(f>=0){f=f+2*I+1;I=I+1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f-2*J+1;J=J-1;printf("f=%dI=%dJ=%d\n" ,f,I,J);}goto loop;}if(I>0&&J<=0){if(f>=0){f=f+2*J+1;J=J+1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f+2*I+1;I=I+1;printf("f=%dI=%dJ=%d\n" ,f,I,J);}goto loop;}} }case 2:{loop1: while((Ie!=I)||(Je!=J)){ if(I>=0&&J>0){if(f>=0){f=f-2*J+1;J=J-1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f+2*I+1;I=I+1;printf("f=%dI=%dJ=%d\n" ,f,I,J);}goto loop1;}if(I<0&&J>=0){if(f>=0){f=f+2*I+1;I=I+1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f+2*J+1;J=J+1;printf("f=%dI=%dJ=%d\n ",f,I,J);}goto loop1;}if(I<=0&&J<0){if(f>=0){f=f+2*J+1;J=J+1;printf("f=%dI=%dJ=% d\n",f,I,J);}else{f=f-2*I+1;I=I-1;printf("f=%dI=%dJ=%d\n", f,I,J);}goto loop1;}if(I>0&&J<=0){if(f>=0){f=f-2*I+1;I=I-1;printf("f=%dI=%dJ=%d \n",f,I,J);}else{f=f-2*J+1;J=J-1;printf("f=%dI=%dJ=%d\n" ,f,I,J);}goto loop1;}} }}system("pause"); }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数控技术课程设计说明书设计题目直线插补与圆弧插补程序设计机械设计以及自动化专业机械工程学院机械102班设计者青岛理工大学2013年6月20日目录1.设计题目 (1)2.目录 (2)3.直线插补流程图 (3)4.直线插补程序 (4)5.程序结果 (8)6.圆弧插补流程图 (9)7.圆弧插补程序 (10)8.程序结果 (21)一.直线插补1.直线插补程序流程图2.直线插补程序设计#include "stdio.h"int i,X,Y,X0,Y0,Xe,Ye,F,N;int a[30][2];void main(){int m;int menu();void yi();void er();void san();void si();void te();void shuchu();m=menu();a[0][0]=X0;a[0][1]=Y0;switch(m){case 1:yi();shuchu();break; case 2:er();shuchu();break; case 3:san();shuchu();break; case 4:si();shuchu();break; case 5:te();shuchu();break; default:printf("无法插补\n"); }}int menu(){int t;printf("输入起点坐标\n"); scanf("%d,%d",&X0,&Y0); printf("输入终点坐标\n"); scanf("%d,%d",&Xe,&Ye);if (Xe>=X0&&Ye>=Y0)t=1;else if (Xe<=X0&&Ye>=Y0)t=2;else if (Xe<=X0&&Ye<=Y0)t=3;else if (Xe>=X0&&Ye<=Y0)t=4;else if (Xe==X0&&((Ye>Y0&&Y0>=0)||(Ye<Y0&&Y<=0))) t=5;elset=6;return(t);}void yi(){F=0;N=Xe-X0+Ye-Y0;X=X0;Y=Y0;for(i=1;i<=N;i++){ if(F>=0){X++;a[i][0]=X;a[i][1]=Y;F-=Ye-Y0;}else{Y++;a[i][0]=X;a[i][1]=Y;F+=Xe-X0;}}}void er(){F=0;N=X0-Xe+Ye-Y0;X=X0;Y=Y0;for(i=1;i<=N;i++){if(F>=0){ X--;a[i][0]=X;a[i][1]=Y;F-=Ye-Y0;}else{Y++;a[i][0]=X;a[i][1]=Y;F+=X0-Xe;}}}void san(){F=0;N=X0-Xe+Y0-Ye; X=X0;Y=Y0;for(i=1;i<=N;i++){if(F>=0){X--;a[i][0]=X;a[i][1]=Y;F-=Y0-Ye;}else{Y--;a[i][0]=X;a[i][1]=Y;F+=X0-Xe;}}}void si(){F=0;N=Xe-X0+Y0-Ye; X=X0;Y=Y0;for(i=1;i<=N;i++){if(F>=0){X++;a[i][0]=X;a[i][1]=Y;F-=Y0-Ye;}else{ Y--;a[i][0]=X;a[i][1]=Y;F+=Xe-X0;}}}void te(){N=Ye-Y0;for(i=1;i<=N;i++){if(Ye>0){Y++;a[i][0]=X;a[i][1]=Y;}else if(Ye<0){Y--;a[i][0]=X;a[i][1]=Y;}}}void shuchu(){for(i=0;i<=N;i++){printf("%d ",i);printf("%d,%d\n",a[i][0],a[i][1]);}}3.程序结果例如起点(0,0)终点(6,4)步数坐标11,021,132,142,253,264,274,385,396,3106,4二.圆弧插补1.圆弧插补程序流程图2.圆弧插补程序#include "stdio.h"#include "math.h"int X0,Y0,X1,Y1,X2,Y2,X3,Y3,X4,Y4; int i=1,r,f,s;void main(){int m;int menu();void yishun();void yini();void ershun();void erni();void sanshun();void sanni();void sishun();void sini();void shuchu();m=menu();switch(m){case 1:yishun();break;case 2:yini();break;case 3:ershun();break;case 4:yini();break;case 5:sanshun();break;case 6:yini();break;case 7:sishun();break;case 8:yini();break; default:printf("无法插补\n"); }}int menu(){int t;printf("输入原点坐标\n"); scanf("%d,%d",&X0,&Y0); printf("输入起点坐标\n"); scanf("%d,%d",&X3,&Y3); printf("输入终点坐标\n"); scanf("%d,%d",&X4,&Y4); printf("1:顺时针圆弧\n"); printf("2:逆时针圆弧\n"); scanf("%d",&s);X1=X3-X0;Y1=Y3-Y0;X2=X4-X0;Y2=Y4-Y0;r=X1*X1+Y1*Y1;if (X1>=0&&Y1>0&&s==1)t=1;else if (X1>0&&Y1>=0&&s==2) t=2;else if (X1<0&&Y1>=0&&s==1) t=3;else if (X1<=0&&Y1<0&&s==2) t=4;else if (X1<=0&&Y1<0&&s==1) t=5;else if (X1<0&&Y1<=0&&s==2) t=6;else if (X1>0&&Y1<=0&&s==1) t=7;else if (X1>=0&&Y1<0&&s==2) t=8;elset=9;return(t);}void yishun(){do{f=X1*X1+Y1*Y1-r;if(f>=0){Y1--;f-=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{X1++;f+=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(Y1!=0&&(X1!=X2||Y1!=Y2));if(Y1==0){void sishun();sishun();}}void yini(){do{f=X1*X1+Y1*Y1-r;if(f>=0){X1--;f-=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{Y1++;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(X1!=0&&(X1!=X2||Y1!=Y2)); if(X1==0){void erni();erni();}}void ershun(){do{f=X1*X1+Y1*Y1-r;if(f>=0){X1++;f+=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{Y1++;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(X1!=0&&(X1!=X2||Y1!=Y2)); if(X1==0){void yishun();yishun();}}void erni(){do{f=X1*X1+Y1*Y1-r;if(f>=0){Y1--;f-=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{X1--;f-=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0){void sanni();sanni();}}void sanshun(){do{f=X1*X1+Y1*Y1-r;if(f>=0){Y1++;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{X1--;f-=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0){void ershun();ershun();}}void sanni(){do{f=X1*X1+Y1*Y1-r;if(f>=0){X1++;f+=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{Y1--;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(X1!=0&&(X1!=X2||Y1!=Y2)); if(X1==0){void sini();sini();}}void sishun(){do{f=X1*X1+Y1*Y1-r;if(f>=0){X1--;f-=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{Y1--;f-=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(X1!=0&&(X1!=X2||Y1!=Y2)); if(X1==0){void sanshun();sanshun();}}void sini(){do{f=X1*X1+Y1*Y1-r;if(f>=0){Y1++;f+=2*Y1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}else{X1++;f+=2*X1+1;i++;printf("%d ",i);printf("%d,%d\n",X1,Y1);}}while(Y1!=0&&(X1!=X2||Y1!=Y2)); if(Y1==0){void yini();yini();}}3.程序结果例如圆心(0,0)起点(4,3)终点(4,3)步数坐标04,313,323,432,442,551,560,570,48-1,49-2,410-3,411-3,312-4,313-4,214-5,215-5,116-5,017-4,018-4,-119-4,-220-4,-3 21-3,3 22-3,-4 23-2,-4 24-2,-5 25-1,-5 260,-5 270,-4 281,-4 292,-4 303,-4 313,-3 324,-3 334,-2 345,-2 355,-1 365,0 374,0 384,1 394,2 404,3。

相关文档
最新文档