逐点比较法插补C语言程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;//象限