对于只在第一象限的各种插补方式,都比较的简单。

逐点比较直线插补

由于我们将直线的起点平移到了原点,那么我们所比较的就是当前点和目标直线的斜率,当在直线下方,y++;
当在直线上方,x++;
当在直线上,规定x++;

设(xm,ym)为当前点,(xe,ye)为终点
则Fm=ymxe-xmye可表示点在直线的位置。
Fm=0,点在直线上;
Fm>0,点在直线上方;
Fm<0,点在直线下方;
于是当Fm≥0时,x++;
Fm<0时,y++;

如果每次都计算Fm=ymxe-xmye运算时间比较长,我们可以通过xm=xm+1,ym=ym+1来简化运算;
于是Fm≥0时,Fm-=ye;
Fm<0,Fm+=xe;
由此因为起始点为0,所以Fm=0,然后根据上述规则进行步进。c++代码如下

void go()
{int xe, ye;int xs, ys;queue<int>a;//表示往哪里走queue<int>Fm;//标记Fmcout << "请输入初始点" << endl;cin >> xs >> ys;cout << "请输入终止点" << endl;cin >> xe >> ye;cout << "输入结束,下面开始进行计算" << endl;int fm = 0;Fm.push(fm);int NXY = xe - xs + ye - ys;for (int i = 0; i < NXY; i++){if (fm >= 0){fm -= ye;a.push(1);Fm.push(fm);}else{fm += xe;a.push(3);Fm.push(fm);}}for (int i = 0; i <= NXY; i++){cout << Fm.front() << endl;Fm.pop();}int mx = 100;int my = 300;int length = 30;int flag = 0;initgraph(640, 480);setlinecolor(BLUE);line(mx, my, mx + length * xe, my - length * ye);setlinecolor(WHITE);line(mx - 90, my, mx + 240, my);line(mx, my + 90, mx, my - 240);setlinecolor(RED);for (int i = 0; i < NXY; i++){flag = a.front();a.pop();jiantou(mx, my, flag, length, i);}//closegraph();_getch();
}

逐点比较圆弧插补
同样的,对于直线而言,比较斜率;那么对于圆弧来说比较的是到圆心的距离。
这里我们都是需要将圆心平移到坐标原点。
这里我们讨论逆圆弧。

假设初始点为xm,ym;终止点为xe,ye。
那么半径R^2 = xe^2 + ye^2
定义Fm=xm^2 + ym^2 - R^2

如果Fm≥0,那么xm–;
Fm<0,ym++;

将上述带到Fm表达式可得:
Fm≥0,Fm+=1-2xm;
Fm<0,Fm+=1+2ym;
c++程序如下:

void go2()
{int xe, ye;int xs, ys;int xm, ym;queue<int>a;//表示往哪里走queue<int>Fm;//标记Fmcout << "请输入初始点" << endl;cin >> xs >> ys;cout << "请输入终止点" << endl;cin >> xe >> ye;cout << "输入结束,下面开始进行计算" << endl;xm = xs;ym = ys;int fm = 0;Fm.push(fm);int NXY = abs(xe - xs) + abs(ye - ys);for (int i = 0; i < NXY; i++){if (fm >= 0){fm += 1 - 2 * xm;a.push(2);Fm.push(fm);xm--;}else{fm += 1 + 2 * ym;a.push(3);Fm.push(fm);ym++;}}for (int i = 0; i <= NXY; i++){cout << Fm.front() << endl;Fm.pop();}int mx = 300;int my = 300;int length = 30;int flag = 0;initgraph(640, 480);setlinecolor(BLUE);circle(mx, my, length * sqrt(xe * xe + ye * ye));setlinecolor(WHITE);line(mx - length * sqrt(xe * xe + ye * ye), my, mx + length * sqrt(xe * xe + ye * ye), my);line(mx , my+length * sqrt(xe * xe + ye * ye), mx , my-length * sqrt(xe * xe + ye * ye));setlinecolor(RED);mx += xs * length;my -= ys * length;for (int i = 0; i < NXY; i++){flag = a.front();a.pop();jiantou(mx, my, flag, length, i);}_getch();closegraph();
}

这里给出画图的走步程序

void jiantou(int& x1, int& y1, int flag, int length, int i)
{TCHAR A[5];swprintf_s(A, _T("%d"), i+1);int x2, y2;if (flag == 1)//+x{x2 = x1 + length;y2 = y1;line(x1, y1, x2, y2);line(x2 - 7, y2 - 7, x2, y2);line(x2 - 7, y2 + 7, x2, y2);outtextxy((x1 + x2) / 2, y1 - 6,A);x1 = x2;y1 = y2;}else if (flag == 2)//-x{x2 = x1 - length;y2 = y1;line(x1, y1, x2, y2);line(x2 + 7, y2 - 7, x2, y2);line(x2 + 7, y2 + 7, x2, y2);outtextxy((x1 + x2) / 2, y1 - 6, A);x1 = x2;y1 = y2;}else if (flag == 3)//+y{x2 = x1;y2 = y1 - length;line(x1, y1, x2, y2);line(x2 - 7, y2 + 7, x2, y2);line(x2 + 7, y2 + 7, x2, y2);outtextxy(x2 + 6, (y1 + y2) / 2, A);x1 = x2;y1 = y2;}else if (flag == 4)//-y{x2 = x1;y2 = y1 + length;line(x1, y1, x2, y2);line(x2 - 7, y2 - 7, x2, y2);line(x2 + 7, y2 - 7, x2, y2);x1 = x2;y1 = y2;}
}

结果如下:
直线插补起点(0,0),终点(5,3)
逆圆弧插补起点(5,0),终点(0,5)

全部程序如下

#include<conio.h>
#include<graphics.h>                    //头文件为graphics.h
#include <queue>
#include <iostream>
#include <string>
using namespace std;
void go();
void go2();
int main()
{//go();go2();
}
void jiantou(int& x1, int& y1, int flag, int length, int i)
{TCHAR A[5];swprintf_s(A, _T("%d"), i+1);int x2, y2;if (flag == 1)//+x{x2 = x1 + length;y2 = y1;line(x1, y1, x2, y2);line(x2 - 7, y2 - 7, x2, y2);line(x2 - 7, y2 + 7, x2, y2);outtextxy((x1 + x2) / 2, y1 - 6,A);x1 = x2;y1 = y2;}else if (flag == 2)//-x{x2 = x1 - length;y2 = y1;line(x1, y1, x2, y2);line(x2 + 7, y2 - 7, x2, y2);line(x2 + 7, y2 + 7, x2, y2);outtextxy((x1 + x2) / 2, y1 - 6, A);x1 = x2;y1 = y2;}else if (flag == 3)//+y{x2 = x1;y2 = y1 - length;line(x1, y1, x2, y2);line(x2 - 7, y2 + 7, x2, y2);line(x2 + 7, y2 + 7, x2, y2);outtextxy(x2 + 6, (y1 + y2) / 2, A);x1 = x2;y1 = y2;}else if (flag == 4)//-y{x2 = x1;y2 = y1 + length;line(x1, y1, x2, y2);line(x2 - 7, y2 - 7, x2, y2);line(x2 + 7, y2 - 7, x2, y2);x1 = x2;y1 = y2;}
}
void go()
{int xe, ye;int xs, ys;queue<int>a;//表示往哪里走queue<int>Fm;//标记Fmcout << "请输入初始点" << endl;cin >> xs >> ys;cout << "请输入终止点" << endl;cin >> xe >> ye;cout << "输入结束,下面开始进行计算" << endl;int fm = 0;Fm.push(fm);int NXY = xe - xs + ye - ys;for (int i = 0; i < NXY; i++){if (fm >= 0){fm -= ye;a.push(1);Fm.push(fm);}else{fm += xe;a.push(3);Fm.push(fm);}}for (int i = 0; i <= NXY; i++){cout << Fm.front() << endl;Fm.pop();}int mx = 100;int my = 300;int length = 30;int flag = 0;initgraph(640, 480);setlinecolor(BLUE);line(mx, my, mx + length * xe, my - length * ye);setlinecolor(WHITE);line(mx - 90, my, mx + 240, my);line(mx, my + 90, mx, my - 240);setlinecolor(RED);for (int i = 0; i < NXY; i++){flag = a.front();a.pop();jiantou(mx, my, flag, length, i);}//closegraph();_getch();
}void go2()
{int xe, ye;int xs, ys;int xm, ym;queue<int>a;//表示往哪里走queue<int>Fm;//标记Fmcout << "请输入初始点" << endl;cin >> xs >> ys;cout << "请输入终止点" << endl;cin >> xe >> ye;cout << "输入结束,下面开始进行计算" << endl;xm = xs;ym = ys;int fm = 0;Fm.push(fm);int NXY = abs(xe - xs) + abs(ye - ys);for (int i = 0; i < NXY; i++){if (fm >= 0){fm += 1 - 2 * xm;a.push(2);Fm.push(fm);xm--;}else{fm += 1 + 2 * ym;a.push(3);Fm.push(fm);ym++;}}for (int i = 0; i <= NXY; i++){cout << Fm.front() << endl;Fm.pop();}int mx = 300;int my = 300;int length = 30;int flag = 0;initgraph(640, 480);setlinecolor(BLUE);circle(mx, my, length * sqrt(xe * xe + ye * ye));setlinecolor(WHITE);line(mx - length * sqrt(xe * xe + ye * ye), my, mx + length * sqrt(xe * xe + ye * ye), my);line(mx , my+length * sqrt(xe * xe + ye * ye), mx , my-length * sqrt(xe * xe + ye * ye));setlinecolor(RED);mx += xs * length;my -= ys * length;for (int i = 0; i < NXY; i++){flag = a.front();a.pop();jiantou(mx, my, flag, length, i);}_getch();closegraph();
}

逐点比较直线插补和圆弧插补相关推荐

  1. MATLAB实现数控加工中的逐点比较法直线插补(四个象限,动态显示)

    逐点比较法就是刀具每走一步都要和给定轨迹上的坐标值做比较,从而决定下一步的进给方向.一般有直线插补和圆弧插补.简单的说就是,如果起始位置在给定轨迹的下方,下一步就向轨迹的上方走.如果起始位置在给定轨迹 ...

  2. 用c++模拟直线插补和圆弧插补

    C++模拟直线插补(不带图形) http://download.csdn.net/detail/z893345329/7358097 运行结果: C++模拟圆弧插补(不带图形) http://down ...

  3. 逐点比较法直线插补MATLAB(四个象限分开)

    现在还是只能分开运行,还在研究怎么合在一起 第一象限 Xs = input('请输入起点横坐标XIn X0= '); Ys = input('请输入起点纵坐标YIn Y0= '); Xe = inpu ...

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

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

  5. 机械臂控制软件,上位机软件 此机器人上位软件。 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能

    机械臂控制软件,上位机软件 此机器人上位软件. 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能,子程序编程功能,逻辑判断语句功能,示教编程功能(支持手柄),变量位置编程功能, ...

  6. 基于带约束S型加减速曲线的空间直线插补与空间圆弧插补算法(Matlab)

    写在前面 学习代码都记录在个人github上,欢迎关注~ Matlab机器人工具箱版本9.10 在前面的博文中: 基于抛物线过渡(梯形加减速)的空间直线插补算法与空间圆弧插补算法(Matlab) 基于 ...

  7. delta机械臂,delta机器人,运动控制器,运动控制卡 本卡采用前瞻运动轨迹规划,运动采用G代码指令编程,具有G5三维空间的圆弧插补,空间直线插补功能

    delta机械臂,delta机器人,运动控制器,运动控制卡 本卡采用前瞻运动轨迹规划,运动采用G代码指令编程,具有G5三维空间的圆弧插补,空间直线插补功能,子程序编程功能,逻辑判断语句功能,示教编程功 ...

  8. 插补、直线插补、联动与插补

    转自:http://blog.gkong.com/218hty_27393.ashx 什么是插补? 试由直线的逐点比较工作节拍说明其插补过程: 答:插补是在组成轨迹的直线段或曲线段的起点和终点之间,按 ...

  9. c语言直线插补原理程序,直线插补算法

    直线插补算法,就是刀具或绘笔每走一步都要和给定的数据进行比对,看该点在次点的上方或者是下方,从而决定下一步该怎么走. 即机床数控系统依照一定方法确定刀具运动轨迹的过程.也可以说,已知曲线上的某些数据, ...

  10. matlab程序 直线插补,无聊写matlab仿真直线插补算法

    本帖最后由 CK345 于 2016-6-24 17:16 编辑 X0 = input('请输入起点横坐标 X\n X0 = '); Y0 = input('请输入起点纵坐标 Y\n Y0 = '); ...

最新文章

  1. pat 食物链(状态压缩求哈密顿回路)
  2. win10突然打开matlab闪退,win10上的应用打开会闪退,直接闪退
  3. cannot delete activity in SAP CRM WebClient UI
  4. 作者:​徐优俊(1990-),男,北京大学前沿交叉学科研究院博士生。
  5. CTO 技术管理的“三板斧”
  6. 英伟达自动驾驶技术:用于自动驾驶汽车的端到端深度学习
  7. Android系统开发(3)---如何分析ANR Log的总结
  8. [FFmpeg] 官方例子 demuxing_decoding.c
  9. ​Linux进程管理工具
  10. vscode php插件_「PHP从入门到颈椎病康复」基础篇——HelloWorld
  11. Leetcode 392.判断子序列
  12. Centos6.5 邮件服务
  13. mysql如何更改文件所有者sa_Mssql Server2005中更改sa的用户名的多种方法
  14. EZEMC测试软件_AR EMC测试软件EMCWARE
  15. 固态硬盘替换机械硬盘
  16. 德国是2018世界杯夺冠最大热门? Python数据分析来揭开神秘面纱…
  17. 解决 用 Nginx 处理 跨域问题
  18. 神经网络参数量和计算量,神经网络计算公式
  19. c语言void结尾,C语言中void*详解及应用
  20. 加多芬科技深度剖析--“什么是移动支付服务商“

热门文章

  1. 龙果学院Java并发编程原理与实战
  2. 【干活推送 】人工智能(AI)教程
  3. 电脑蓝屏分析教程,附工具WinDbg(x86 x64)6.12.0002.633下载
  4. 日语整理之 自五 他五
  5. java怎么打hello,java hello word怎么打
  6. web测试抓包基本功——使用Google的F12
  7. 【转载】HTTPS那些事(图文版)-Network Tips
  8. Python机器学习之决策树(使用西瓜数据集构建决策树,并将其可视化,graphviz程序下载)
  9. Linux学习总结(1)——Linux命令大全完整版
  10. 阿铭Linux_网站维护学习笔记20190410