逐点比较法插补C语言程序

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

//该函数在VC++6.0下编译测试通过,可实现直线、圆弧、完整圆的逐点比较法插补;并可将插补函数计算出的数//据点写入xxx.txt文件中

//若有任何疑问,欢迎邮件联系,***********************

//版权所有,侵权必究。转载时请注明来自大连理工机械工程学院Deanjiang

#include

#include

#include

/********************************************************************/

/* 函数名: 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)

return 2;

}

else

{

nDir=3;

return 3;

}

}

}

/********************************************************************/ /* 函数名: PBP_Line */ /* 功能:逐点比较法直线插补*/ /* 参数:double step步长mm*/ /*double XEnd, double YEnd插补终点mm*/

/********************************************************************/ void PBP_Line(double step, double XEnd, double YEnd)

{

double lDevVal;//偏差值

double xCurVal=0,yCurVal=0; //当前点的实际位置

long StepMount; //插补总步数

long StepCount=0;//插补次数计数器

unsigned short nDir;//当前点所在象限

nDir=Judge_Quadrant(XEnd,YEnd); //象限判断

XEnd=labs(XEnd);

YEnd=labs(YEnd);

StepMount=(long) (XEnd+YEnd)/step;

lDevVal=yCurVal*XEnd-xCurVal*YEnd;

while (StepCount

{//终点判别

/////////////////////////////////////////////////////////////

if (lDevVal>=0)

{ //偏差〉=0

switch(nDir) {

case 1:

xCurVal+=step;

InsertPoint(xCurVal,yCurVal);

break;

case 2:

xCurVal-=step;

InsertPoint(xCurVal,yCurVal);

break;

case 3:

xCurVal-=step;

case 4:

xCurVal+=step;

InsertPoint(xCurVal,yCurVal);

break;

}

lDevVal-=YEnd;

}

else{ //偏差<0

switch(nDir) {

case 1:

yCurVal+=step;

InsertPoint(xCurVal,yCurVal);

break;

case 2:

yCurVal+=step;

InsertPoint(xCurVal,yCurVal);

break;

case 3:

yCurVal-=step;

InsertPoint(xCurVal,yCurVal);

break;

case 4:

yCurVal-=step;

InsertPoint(xCurVal,yCurVal);

break;

}

lDevVal+=XEnd;

}

StepCount++;

}

}

/********************************************************************/

/* 函数名: PBP_Circle */

/* 功能:逐点比较法圆弧插补*/

/* 参数:double step步长mm*/

/*double XStart,double YStart插补起点mm*/

/*double XEnd,double YEnd插补终点mm*/

/*double radius圆弧半径mm*/

/* bool bIsCW圆弧插补方向0或1*/

/********************************************************************/

void PBP_Circle(double step, double XStart, double YStart, double XEnd,double YEnd, double radius, int bIsCW) {

double lDevVal,goallDevVal;//当前误差和与终点的差值

double xCurVal=XStart,yCurVal=YStart;//当前坐标

unsigned short nDir;//象限

相关文档
最新文档