如何编写顺时针圆弧的逐点比较法插补算法程序

如题所述

这是我自己编的一个程序仿真通过,控制核心板是51单片机可以参考:

//第一象限顺弧
#include<reg51.h>
//#define xe 10 //终点横坐标
//#define ye 0 //终点纵坐标
//#define x0 10 //起点横坐标
//#define y0 0 //起点纵坐标
//#define R 10 //半径
void xzRotateStep(); // X向走一步
void yzRotateStep(); // -x向走一步
void xfRotateStep(); // y向走一步
void yfRotateStep(); // -y向走一步
void d1shun(); //第一象限顺弧
void d4shun(); //第二象限顺弧
void d3shun(); //第三象限顺弧
void d2shun(); //第四象限顺弧
int kx=0x01; int ky=0x10; //

/*延时函数*/
void display(int x)
{
int i,y;
for(i=x;i>0;i--)
for(y=100;y>0;y--);
}

void main()
{
d1shun();
d4shun();
d3shun();
d2shun();
}
void d1shun()
{
int F,xi,yi,count ;// (xi,yi)为动点坐标,F为偏差值,count为计数值。
int k=0;
int kx=
F=xi=0;
yi=10;
count=20;
do{
if(F>=0)
{
yfRotateStep(); //-y向走一步
F=F-2*yi+1;
xi=xi;
yi=yi-1;
}
else
{
xzRotateStep(); //+x向走一步
F=F+2*xi+1;
xi=xi+1;
yi=yi;
}
count--; k++;
P2=k;
}
while(count) ; //计数为0?

}

void d4shun()
{
int F,xi,yi,count ;// (xi,yi)为动点坐标,F为偏差值,count为计数值。
int k=0;
F=xi=10;
yi=0;
count=20;
do{
if(F>=0)
{
xfRotateStep(); //-x向走一步
F=F-2*xi+1;
xi=xi-1;
yi=yi;
}
else
{
yfRotateStep(); //-y向走一步

F=F+2*yi+1;
xi=xi;
yi=yi+1;
}
count--; k++;
P2=k;
}
while(count) ; //计数为0?

}

void d3shun()
{
int F,xi,yi,count ;// (xi,yi)为动点坐标,F为偏差值,count为计数值。
int k=0;
F=xi=0;
yi=-10;
count=20;
do{
if(F>=0)
{
yzRotateStep(); //+y向走一步
F=F-2*yi+1;
xi=xi;
yi=yi-1;
}
else
{
xfRotateStep(); //-x向走一步
F=F+2*xi+1;
xi=xi+1;
yi=yi;
}
count--; k++;
P2=k;
}
while(count) ; //计数为0?

}

void d2shun()
{
int F,xi,yi,count ;// (xi,yi)为动点坐标,F为偏差值,count为计数值。
int k=0;
F=xi=-10;
yi=0;
count=20;
do{
if(F>=0)
{
xzRotateStep(); //-x向走一步
F=F-2*xi+1;
xi=xi-1;
yi=yi;
}
else
{
yfRotateStep(); //-y向走一步

F=F+2*yi+1;
xi=xi;
yi=yi+1;
}
count--; k++;
P2=k;
}
while(count) ; //计数为0?

}

void xzRotateStep()
{
int i;
switch(kx)
{
case 0x01: kx=P1=0x02;display(200);for(i=0;i<20000;i++); break;
case 0x02: kx=P1=0x04;display(200);for(i=0;i<20000;i++) ;break;
case 0x04: kx=P1=0x01;display(200);for(i=0;i<20000;i++) ;break;
}
}

void xfRotateStep()
{
int i;
switch(kx)
{
case 0x01: kx=P1=0x04;display(200);for(i=0;i<20000;i++); break;
case 0x04: kx=P1=0x02;display(200);for(i=0;i<20000;i++) ;break;
case 0x02: kx=P1=0x01;display(200);for(i=0;i<20000;i++) ;break;
}
}

void yzRotateStep()
{
int j ;
switch(ky)
{
case 0x10: ky=P1=0x20;display(200);for(j=0;j<20000;j++);break;
case 0x20: ky=P1=0x40;display(200);for(j=0;j<20000;j++);break;
case 0x40: ky=P1=0x10;display(200);for(j=0;j<20000;j++);break;
}
}

void yfRotateStep()
{
int j ;
switch(ky)
{
case 0x10: ky=P1=0x40;display(200);for(j=0;j<20000;j++);break;
case 0x40: ky=P1=0x20;display(200);for(j=0;j<20000;j++);break;
case 0x20: ky=P1=0x10;display(200);for(j=0;j<20000;j++);break;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-04-24
无论哪个象限,只要算出圆弧起点坐标、终点坐标、圆弧半径、圆弧顺逆,就可以编程了。
相似回答