用C语言写的简易的逐点比较法插补算法,包括直线逐点插补和圆弧插补

源文件:https://pan.baidu.com/s/17FQKqn3UaEPQHkmTcOXKOg
提取码:atb2

#include 
#include 
#include 
#include 

//运行时坐标结构体
typedef struct
{
    float xCdt;
    float yCdt;
}CdtNow_Struct;
//直线的逐点比较法的直线插补的坐标的结构体
typedef struct
{
    float xCdt_Sat;             //起点坐标
    float yCdt_Sat;
    float xCdt_Tgt;             //终点坐标
    float yCdt_Tgt;
    float pulseEqu;      //脉冲当量
}Line_Inter_Struct;
//圆弧的逐点比较法的直线插补的坐标的结构体
typedef struct
{
    float xCdt_Sat;             //起点坐标
    float yCdt_Sat;
    float xCdt_Tgt;             //终点坐标
    float yCdt_Tgt;
    float radius;               //半径
    float pulseEqu;      //脉冲当量
}Arc_Inter_Struct;
//函数函数名:Line_point_by_point_comparison_Interpolation的测试的数据
Line_Inter_Struct lineStructTest={0,0,-6,-4,1};
Arc_Inter_Struct  arcStructTest={10,0,6,8,10,1};
void Line_point_by_point_comparison_Interpolation(Line_Inter_Struct lineInterStr);
void Arc_point_by_point_comparison_Interpolation(Arc_Inter_Struct arcInterStr);
int main()
{
//    Line_point_by_point_comparison_Interpolation(lineStructTest);
    Arc_point_by_point_comparison_Interpolation(arcStructTest);
    return 0;
}

/*
* 参考书目:《机床数控技术》 主编:梅雪松 P96
* 日期:2019/04/07
* 作者:Twsa Liu
* 函数名:Line_point_by_point_comparison_Interpolation
* 功能描述:直线的逐点比较法的插补算法
* 参数:lineInterStruct,直线插补结构体数据
* 返回值:运行时的坐标的结构体
*/
void Line_point_by_point_comparison_Interpolation(Line_Inter_Struct lineInterStr)
{
    //定义和初始化运行时坐标
    CdtNow_Struct cdtNow={lineInterStr.xCdt_Sat,lineInterStr.yCdt_Sat};
    float devt=cdtNow.xCdt*lineInterStr.yCdt_Tgt-cdtNow.yCdt*lineInterStr.xCdt_Tgt;    //直线插补的偏差函数
    float endJudge=fabs(lineInterStr.xCdt_Tgt-cdtNow.xCdt)+fabs(lineInterStr.yCdt_Tgt-cdtNow.yCdt);

    while(endJudge>0) //z终点判断
    {
        //得到的新的坐标值
        if(devt>=0){
            //沿Xe方向走一步
            if(lineInterStr.xCdt_Tgt>=0)
                cdtNow.xCdt+=lineInterStr.pulseEqu;
            else
                cdtNow.xCdt-=lineInterStr.pulseEqu;
            //yCdtnow=yCdtnow;
            devt-=fabs(lineInterStr.yCdt_Tgt);
        }
        else{
            //沿Ye方向走一步
            //xCdtnow=xCdtnow;
            if(lineInterStr.yCdt_Tgt>=0)
                cdtNow.yCdt+=lineInterStr.pulseEqu;
            else
                cdtNow.yCdt-=lineInterStr.pulseEqu;
            devt+=fabs(lineInterStr.xCdt_Tgt);
        }
        endJudge-=lineInterStr.pulseEqu;
    }
}

/*
* 参考书目:《机床数控技术》 主编:梅雪松 P94
* 日期:2019/04/07
* 作者:Twsa Liu
* 函数名:Arc_point_by_point_comparison_Interpolation
* 功能描述:圆弧的逐点比较法的插补算法
* 参数:arcInterStr,圆弧擦布的结构体结构体数据
* 返回值:运行时的坐标的结构体
*/
void  Arc_point_by_point_comparison_Interpolation(Arc_Inter_Struct arcInterStr)
{
    //定义和初始化运行时坐标
    CdtNow_Struct cdtNow={arcInterStr.xCdt_Sat,arcInterStr.yCdt_Sat};
    //终点判断计数设置
    float endJudge=fabs(arcInterStr.xCdt_Tgt-arcInterStr.xCdt_Sat)+fabs(arcInterStr.yCdt_Tgt-arcInterStr.yCdt_Sat);
    //圆弧插补的偏差函数
    float devt=cdtNow.xCdt*cdtNow.xCdt+cdtNow.yCdt*cdtNow.yCdt\
    -arcInterStr.radius*arcInterStr.radius;   //Fi=Xi^2+Yi^2-R^2
    while(endJudge>0)   //终点判断
    {
//        //顺圆插补,测试了第一个象限,其他象限还未测试
//        if(devt>=0){
//            devt+=arcInterStr.pulseEqu*arcInterStr.pulseEqu-2*cdtNow.yCdt*arcInterStr.pulseEqu;  //新的偏差计算
//            //cdtNow.xCdt=cdtNow.xCdt;
//            cdtNow.yCdt-=arcInterStr.pulseEqu;
//        }else{
//            devt+=arcInterStr.pulseEqu*arcInterStr.pulseEqu+2*cdtNow.xCdt*arcInterStr.pulseEqu;
//            cdtNow.xCdt+=arcInterStr.pulseEqu;
//            //cdtNow.yCdt=cdtNow.yCdt;
//        }
        //逆圆插补
        if(devt>=0){
            devt+=arcInterStr.pulseEqu*arcInterStr.pulseEqu-2*cdtNow.xCdt*arcInterStr.pulseEqu;  //新的偏差计算
            //沿-Xe方向走一步
            if(arcInterStr.xCdt_Tgt>=0)
                cdtNow.xCdt-=arcInterStr.pulseEqu;
            else
               cdtNow.xCdt+=arcInterStr.pulseEqu;
            //cdtNow.yCdt=cdtNow.yCdt;
        }else{
            devt+=arcInterStr.pulseEqu*arcInterStr.pulseEqu+2*cdtNow.yCdt*arcInterStr.pulseEqu;  //计算新的偏差
            //沿Ye方向走一步
            //xCdtnow=xCdtnow;
            if(arcInterStr.yCdt_Tgt>=0)
                cdtNow.yCdt+=arcInterStr.pulseEqu;
            else
                cdtNow.yCdt-=arcInterStr.pulseEqu;
            //cdtNow.xCdt=cdtNow.xCdt;
        }
        endJudge-=arcInterStr.pulseEqu;
    } //最后应该是生成文档
}

你可能感兴趣的:(插补算法C语言)