海宁网站建设公司推荐,wordpress自定义类型的分类名称,wordpress 主题大学,网页翻译软件今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 #xff1a; 插补算法
本文提供直线插补的概念基础#xff0c;基本思路分析#xff0c;C语言实现等#xff0c;代码会直接贴出#xff01;
插补算法是指在数值计算或数据处理中#xff0c;根据已有的数据…今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 插补算法
本文提供直线插补的概念基础基本思路分析C语言实现等代码会直接贴出
插补算法是指在数值计算或数据处理中根据已有的数据点或采样点推断出未知数据点或采样点的值的方法。
插补算法可以通过已知数据点之间的关系来填补数据间的空缺或缺失值从而恢复完整的数据。
在图像处理、信号处理、曲线拟合等领域中插补算法被广泛应用。
常见的插补算法有线性插值、最邻近插值、多项式插值和样条插值等。插补算法可以帮助我们填补数据缺失的部分从而更好地分析和处理数据。
目录
概念引入--优化的拟合直线:
直线插补—逐点比较法公式 进给情况一在第一象限的进给与插补 进给情况二在第二象限的进给与插补
逐点比较法的总结
直线插补—逐点比较法 的C实现
效果展示 代码给出
结束语 概念引入--优化的拟合直线: 如图这有一条直线需要我们进行弥合绘制它的起点是原点0,0终点目标是A6,4 我们很容易想到
因为它的俩个端点固定因此在数学计算关系式上我们对其进行补足时只需计算其斜率
k4-0/ (6-0) 2/3 ;然后将这个运算关系带入电机控制移动X走一格时Y同时走2/3
直到到达点A即可~~
但现实却不会这样
如果我们的机械电机设计精度远大于这个需求长度分度要求我们可以尝试使用这个求斜率的办法去弥合绘制该曲线但实际与理论相悖
在微观层面计算机与加工电机或者加工刀具是无法做到如此精准的绘制与定位的在加工的时候不同的产品有各式各样的形状。计算机对其直线上每个点的定位在微观上总是不准确的
简单的形状可以轻松的实现。如位置点只需要确定xy位置电机运动到xy点上就能够加工成功。
但是对于比较复杂的形状此时如果我们去考虑它所有的运行轨迹所有的运动位置点这样会非常复杂计算机的工作量也会大大的增加。
因此在实际应用中对于复杂的形状我们无法精确地确定每个点的位置而是通过数据密化尽可能的去拟合它真实的形状通过这种方式不仅能在达到精度要求的前提下还能够大大减小计算机的工作量这就是“插补”。 下图即是对插补的理解画法 其中我们需要抽离三个概念 1.理论直线轨迹肉眼轨迹 ——粉色直线 2.实际运行轨迹机械轨迹 ——棕色折线 3.实际给进点情况X、Y机械运行步骤——红色箭头 向上向下是给Y向做向右是进给X 我们从此图可以看出这种对于不是45度角度斜率的直线的弥合我们并不是每次只需X进1Y进1就可了而是有某些部分是需要多进给的就比如此图它就在3,2后又在此多进给了X一次以达到对于2/3这个斜率的更佳弥合~~ 直线插补—逐点比较法公式 以下公式是指源于旧的基础上进行运算得出新的F值 F F - |Ye| (F0) F F |Xe| (F 0 ) 进给情况一在第一象限的进给与插补 我们直接看到之前的题目它在第一象限看看如何理解使用这个公式 F0 表示只能在X坐标上进给 F0 表示只能在Y坐标上进给 首先我们需要初始化一些数据它们的值与运算关系如下 F0 E|Ax||Ay| (终点判断,大小与目标点的横纵坐标有关) 在插补过程中每走一步要完成以下4个工作节拍。 ①偏差判别 —— 判别当前动点偏离理论曲线的位置即F旧。这是有基础公式的 ②进给控制 —— 确定进给坐标及进给方向。这是需要根据终点象限不同而有所变化的有的象限进给X表示在X轴加一有的象限则是在X轴减一 ③新偏差计算 —— 迸给后动点到达新位置计算出新偏差值即F新作为下一步判别的依据。 ④终点判别 —— 查询一次终点是否到达。 步数 一共是E 偏差判断 F旧 坐标进给 X或Y 注意象限 坐标 X,Y 偏差计算 (F新) 终点判断 E00,0F0,00101F0,00X1,0 F1,00-4 -4 92F(1,0)-4Y1,1F(1,1)-46283F(1,1)0X(2,1)F(2,1)2-4-274F(2,1)0Y(2,2)F(2,2)-26465F(2,2)0X(3,2)F(3,2)4-4056F(3,2)0X(4,2)F(4,2)0-4-447F(4,2)0Y(4,3)F(4,3)-46238F(4,3)0X(5,3)F(5,3)2-4-229F(5,3)0Y(5,4)F(5,4)-264110F(5,4)0X(6,4)F(6,4)4-400
这样在编写绘图程序的时候只需这样一次一次安排好下次插补直线的终点坐标便可以自己设计绘制各种各样的复杂形状 进给情况二在第二象限的进给与插补 这次我们的情况有所改变不仅目标变为了第二象限的点-4,3起点也变为0.1而插补计算肯定是要从原点0,0开始的此时该如何安排电机的运作呢 其实我们这里就要分为俩个步骤 1.移动到新起点 2.计算新终点的坐标 此处我们肯定希望起点还是原点0,0的因此在电机运动的程序设计上可以使其先移动到0,1后开始插补绘制为保持斜率不变新的A点坐标也要随之改变为-4,2。
第二象限乃至其余象限直线插补的公式不会改变但是进给X、Y时的加减是会改变的
比如此处的插补终点坐标经过我们修改后是-4,2由此终点坐标判断可得出
在X轴的进给变为负的在Y轴方向的进给仍是正的 原理就是判断终点坐标的正负即可 下面我们继续绘制图表来帮助理解过程 步数 一共是E 偏差判断 F旧 坐标进给 X或Y 注意象限 坐标 X,Y 偏差计算 (F新) 终点判断 E00,0F0,0061F0,00-X-1,0F-1,00-2-252F-1,00Y-1,1F-1,1-24243F-1,10-X-2,1F-2,12-2034F-2,10-X-3,1F-3,10-2-225F-3,10Y-3,2F-3,2-24216F-3,20-X-4,2F-4,22-200
最终弥合效果如下图 逐点比较法的总结
这是我从网上盗的图可以看看归纳帮助理解 直线插补—逐点比较法 的C实现 这里展示我编写的C代码它使用逐点比较法实现了各个象限的直线插补只需输入目标点的坐标就会自动识别在哪个象限并且会打印输出每一步的过程坐标 效果展示 代码给出 #include stdio.h
#include math.h//需要终点坐标差补
void Straight_Line_Interpolation(int x,int y);int main(void)
{Straight_Line_Interpolation(6,4);
}//直线差补算法
//需要终点坐标差补
void Straight_Line_Interpolation(int x,int y)
{//当前点坐标int draw[2]{0,0};//E:终点判断 //F:偏差计算 //i:当前插补步数最终要等于E int E,F,i;Eabs(x)abs(y);F0;//循环次数就是E决定的for(i0;iE;i){//先判断偏差F决定进给X还是Yif(F0) {//再根据判断终点X,Y在哪个象限决定进给情况if(x0) {draw[0]1;}else if(x0) {draw[0]-1;} //计算本次产生的新的偏差F FF-abs(y);printf((%d,%d)\r\n, draw[0], draw[1]);}//先判断偏差F决定进给X还是Yelse if(F0) {//再根据判断终点X,Y在哪个象限决定进给情况if(y0) {draw[1]1;} else if(y0) { draw[1]-1; }//计算本次产生的新的偏差F FFabs(x);printf((%d,%d)\r\n, draw[0], draw[1]); }}
} 结束语
最后希望这篇文章对大家有用喜欢可以三连支持一下~~~~~~