逐点比较直线插补和圆弧插补
对于只在第一象限的各种插补方式,都比较的简单。
逐点比较直线插补
由于我们将直线的起点平移到了原点,那么我们所比较的就是当前点和目标直线的斜率,当在直线下方,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();
}
逐点比较直线插补和圆弧插补相关推荐
- MATLAB实现数控加工中的逐点比较法直线插补(四个象限,动态显示)
逐点比较法就是刀具每走一步都要和给定轨迹上的坐标值做比较,从而决定下一步的进给方向.一般有直线插补和圆弧插补.简单的说就是,如果起始位置在给定轨迹的下方,下一步就向轨迹的上方走.如果起始位置在给定轨迹 ...
- 用c++模拟直线插补和圆弧插补
C++模拟直线插补(不带图形) http://download.csdn.net/detail/z893345329/7358097 运行结果: C++模拟圆弧插补(不带图形) http://down ...
- 逐点比较法直线插补MATLAB(四个象限分开)
现在还是只能分开运行,还在研究怎么合在一起 第一象限 Xs = input('请输入起点横坐标XIn X0= '); Ys = input('请输入起点纵坐标YIn Y0= '); Xe = inpu ...
- 圆弧插补程序c语言,用C语言写的简易的逐点比较法插补算法,包括直线逐点插补和圆弧插补...
源文件:https://pan.baidu.com/s/17FQKqn3UaEPQHkmTcOXKOg 提取码:atb2 #include #include #include #include //运 ...
- 机械臂控制软件,上位机软件 此机器人上位软件。 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能
机械臂控制软件,上位机软件 此机器人上位软件. 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能,子程序编程功能,逻辑判断语句功能,示教编程功能(支持手柄),变量位置编程功能, ...
- 基于带约束S型加减速曲线的空间直线插补与空间圆弧插补算法(Matlab)
写在前面 学习代码都记录在个人github上,欢迎关注~ Matlab机器人工具箱版本9.10 在前面的博文中: 基于抛物线过渡(梯形加减速)的空间直线插补算法与空间圆弧插补算法(Matlab) 基于 ...
- delta机械臂,delta机器人,运动控制器,运动控制卡 本卡采用前瞻运动轨迹规划,运动采用G代码指令编程,具有G5三维空间的圆弧插补,空间直线插补功能
delta机械臂,delta机器人,运动控制器,运动控制卡 本卡采用前瞻运动轨迹规划,运动采用G代码指令编程,具有G5三维空间的圆弧插补,空间直线插补功能,子程序编程功能,逻辑判断语句功能,示教编程功 ...
- 插补、直线插补、联动与插补
转自:http://blog.gkong.com/218hty_27393.ashx 什么是插补? 试由直线的逐点比较工作节拍说明其插补过程: 答:插补是在组成轨迹的直线段或曲线段的起点和终点之间,按 ...
- c语言直线插补原理程序,直线插补算法
直线插补算法,就是刀具或绘笔每走一步都要和给定的数据进行比对,看该点在次点的上方或者是下方,从而决定下一步该怎么走. 即机床数控系统依照一定方法确定刀具运动轨迹的过程.也可以说,已知曲线上的某些数据, ...
- matlab程序 直线插补,无聊写matlab仿真直线插补算法
本帖最后由 CK345 于 2016-6-24 17:16 编辑 X0 = input('请输入起点横坐标 X\n X0 = '); Y0 = input('请输入起点纵坐标 Y\n Y0 = '); ...
最新文章
- pat 食物链(状态压缩求哈密顿回路)
- win10突然打开matlab闪退,win10上的应用打开会闪退,直接闪退
- cannot delete activity in SAP CRM WebClient UI
- 作者:​徐优俊(1990-),男,北京大学前沿交叉学科研究院博士生。
- CTO 技术管理的“三板斧”
- 英伟达自动驾驶技术:用于自动驾驶汽车的端到端深度学习
- Android系统开发(3)---如何分析ANR Log的总结
- [FFmpeg] 官方例子 demuxing_decoding.c
- ​Linux进程管理工具
- vscode php插件_「PHP从入门到颈椎病康复」基础篇——HelloWorld
- Leetcode 392.判断子序列
- Centos6.5 邮件服务
- mysql如何更改文件所有者sa_Mssql Server2005中更改sa的用户名的多种方法
- EZEMC测试软件_AR EMC测试软件EMCWARE
- 固态硬盘替换机械硬盘
- 德国是2018世界杯夺冠最大热门? Python数据分析来揭开神秘面纱…
- 解决 用 Nginx 处理 跨域问题
- 神经网络参数量和计算量,神经网络计算公式
- c语言void结尾,C语言中void*详解及应用
- 加多芬科技深度剖析--“什么是移动支付服务商“
热门文章
- 龙果学院Java并发编程原理与实战
- 【干活推送 】人工智能(AI)教程
- 电脑蓝屏分析教程,附工具WinDbg(x86 x64)6.12.0002.633下载
- 日语整理之 自五 他五
- java怎么打hello,java hello word怎么打
- web测试抓包基本功——使用Google的F12
- 【转载】HTTPS那些事(图文版)-Network Tips
- Python机器学习之决策树(使用西瓜数据集构建决策树,并将其可视化,graphviz程序下载)
- Linux学习总结(1)——Linux命令大全完整版
- 阿铭Linux_网站维护学习笔记20190410