【电机绘图】:插补算法(一)—直线插补—逐点比较法

今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 : 插补算法

本文提供直线插补的概念基础,基本思路分析,C语言实现等,代码会直接贴出!

插补算法是指在数值计算或数据处理中,根据已有的数据点或采样点,推断出未知数据点或采样点的值的方法。

插补算法可以通过已知数据点之间的关系来填补数据间的空缺或缺失值,从而恢复完整的数据。

在图像处理、信号处理、曲线拟合等领域中,插补算法被广泛应用。

常见的插补算法有线性插值、最邻近插值、多项式插值和样条插值等。插补算法可以帮助我们填补数据缺失的部分,从而更好地分析和处理数据。

目录

概念引入--优化的拟合直线:

直线插补—逐点比较法公式:

 进给情况一:在第一象限的进给与插补

 进给情况二:在第二象限的进给与插补

逐点比较法的总结:

直线插补—逐点比较法 的C实现:

效果展示:

 代码给出:

结束语:


概念引入--优化的拟合直线:

如图:这有一条直线需要我们进行弥合绘制,它的起点是原点(0,0),终点目标是A(6,4)

 我们很容易想到:

因为它的俩个端点固定,因此在数学计算关系式上,我们对其进行补足时,只需计算其斜率:

k=(4-0)/  (6-0)  =  2/3  ;然后将这个运算关系带入电机控制移动,X走一格时,Y同时走2/3,

直到到达点A即可~~

但现实却不会这样:

如果我们的机械电机设计精度远大于这个需求长度分度要求,我们可以尝试使用这个求斜率的办法去弥合绘制该曲线,但实际与理论相悖,

在微观层面,计算机与加工电机或者加工刀具是无法做到如此精准的绘制与定位的,在加工的时候,不同的产品有各式各样的形状。计算机对其直线上每个点的定位,在微观上总是不准确的:

简单的形状,可以轻松的实现。如位置点,只需要确定xy位置,电机运动到xy点上,就能够加工成功。

但是对于比较复杂的形状,此时如果我们去考虑它所有的运行轨迹,所有的运动位置点,这样会非常复杂,计算机的工作量也会大大的增加。

因此在实际应用中,对于复杂的形状,我们无法精确地确定每个点的位置,而是通过数据密化,尽可能的去拟合它真实的形状,通过这种方式,不仅能在达到精度要求的前提下,还能够大大减小计算机的工作量,这就是“插补”。

 下图即是对插补的理解画法:

其中我们需要抽离三个概念:

1.理论直线轨迹(肉眼轨迹)                   ——粉色直线

2.实际运行轨迹(机械轨迹)                   ——棕色折线

3.实际给进点情况(X、Y机械运行步骤)——红色箭头

                                                                (向上向下是给Y,向做向右是进给X)

 我们从此图可以看出,这种对于不是45度角度斜率的直线的弥合,我们并不是每次只需,X进1,Y进1就可了,而是有某些部分是需要多进给的,就比如此图,它就在(3,2)后又在此多进给了X一次,以达到对于2/3这个斜率的更佳弥合~~

直线插补—逐点比较法公式:

以下公式是指源于旧的基础上进行运算得出新的F值:

F  =  F  -   |Ye|           (F>=0)

F  =  F  +  |Xe|           (F < 0 )

 

 进给情况一:在第一象限的进给与插补

我们直接看到之前的题目:它在第一象限,看看如何理解使用这个公式:

F>=0      表示只能在X坐标上进给

F<0        表示只能在Y坐标上进给

首先我们需要初始化一些数据,它们的值与运算关系如下:

F=0;

E=|Ax|+|Ay|     (终点判断,大小与目标点的横纵坐标有关)

在插补过程中每走一步要完成以下4个工作节拍。

①偏差判别   ——

判别当前动点偏离理论曲线的位置(即F旧)。这是有基础公式的

②进给控制   ——

确定进给坐标及进给方向。这是需要根据终点象限不同,而有所变化的,有的象限进给X表示在X轴加一,有的象限则是在X轴减一

③新偏差计算 ——

迸给后动点到达新位置,计算出新偏差值(即F新),作为下一步判别的依据。

④终点判别    ——

查询一次,终点是否到达。

   步数

(一共是E)

偏差判断

(F旧)

坐标进给

(X或Y:

注意象限)

坐标

(X,Y)

偏差计算

(F新)

终点判断 E
0(0,0)F(0,0)=010
1F(0,0)=0+X(1,0)

F(1,0)=0-4

=-4

9
2F(1,0)=-4+Y(1,1)F(1,1)=-4+6=28
3F(1,1)>0+X(2,1)F(2,1)=2-4=-27
4F(2,1)<0+Y(2,2)F(2,2)=-2+6=46
5F(2,2)>0+X(3,2)F(3,2)=4-4=05
6F(3,2)=0+X(4,2)F(4,2)=0-4=-44
7F(4,2)<0+Y(4,3)F(4,3)=-4+6=23
8F(4,3)>0+X(5,3)F(5,3)=2-4=-22
9F(5,3)<0+Y(5,4)F(5,4)=-2+6=41
10F(5,4)>0+X(6,4)F(6,4)=4-4=00

这样,在编写绘图程序的时候,只需这样一次一次安排好下次插补直线的终点坐标,便可以自己设计,绘制各种各样的复杂形状:

 

 

 进给情况二:在第二象限的进给与插补

 这次,我们的情况有所改变,不仅目标变为了第二象限的点(-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新)

终点判断 E
0(0,0)F(0,0)=06
1F(0,0)=0-X(-1,0)F(-1,0)=0-2=-25
2F(-1,0)<0+Y(-1,1)F(-1,1)=-2+4=24
3F(-1,1)>0-X(-2,1)F(-2,1)=2-2=03
4F(-2,1)=0-X(-3,1)F(-3,1)=0-2=-22
5F(-3,1)<0+Y(-3,2)F(-3,2)=-2+4=21
6F(-3,2)>0-X(-4,2)F(-4,2)=2-2=00

最终弥合效果如下图:

 

逐点比较法的总结:

这是我从网上盗的图,可以看看归纳,帮助理解 :

 

直线插补—逐点比较法 的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;
	E=abs(x)+abs(y);
	F=0;
	
//循环次数就是E决定的
	for(i=0;i<E;i++)
	{

       //先判断偏差F,决定进给X还是Y
      if(F>=0) 
	  {
        //再根据判断终点X,Y在哪个象限,决定进给情况
	  	if(x>0)        {draw[0]+=1;}
		else if(x<0)   {draw[0]-=1;}		 

        //计算本次产生的新的偏差F 
	     F=F-abs(y);
	     printf("(%d,%d)\r\n", draw[0], draw[1]);
	  }

       //先判断偏差F,决定进给X还是Y
	  else if(F<0) 
	  {
        //再根据判断终点X,Y在哪个象限,决定进给情况
	  	if(y>0)       {draw[1]+=1;} 
		else if(y<0)  { draw[1]-=1; }

        //计算本次产生的新的偏差F 
	   	F=F+abs(x);
	    printf("(%d,%d)\r\n", draw[0], draw[1]);	
   	
	   }
	}
}

结束语:

最后希望这篇文章对大家有用,喜欢可以三连支持一下~~~~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/71373.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++——vector介绍及其简要模拟实现

vector的介绍 此主题介绍转载自(https://cplusplus.com/reference/vector/vector/) 1.vector是一个表示可变大小数组的序列容器 2.vector同数组一样&#xff0c;采用连续存储空间来存储元素&#xff0c;这样可以用下标来对vector中的元素进行访问&#xff0c;但是vector的大…

AAAI论文阅读

文章目录 Open-Vocabulary Multi-Label Classifcation via Multi-Modal Knowledge Transfer——知识蒸馏的范畴Med-EASi: Finely Annotated Dataset and Models for Controllable Simplifcation of Medical Texts——医学领域数据集构建“Nothing Abnormal”: Disambiguating M…

ELK 将数据流转换回常规索引

ELK 将数据流转换回常规索引 现象&#xff1a;创建索引模板是打开了数据流&#xff0c;导致不能创建常规索引&#xff0c;并且手动修改、删除索引模板失败 "reason" : "composable template [logs_template] with index patterns [new-pattern*], priority [2…

【果树农药喷洒机器人】Part7:静态PWM变量喷药实验

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

YOLOv5可视化界面

Pyside6可视化界面 安装Pyside6 激活之前的虚拟环境yolov5 在该环境的终端输入以下命令 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyside6输入where python找到当前使用的Python的路径 找到该路径下的designer.exe文件&#xff08;/Lib/site-packages/PySi…

Electron 应用实现截图并编辑功能

Electron 应用实现截图并编辑功能 Electron 应用如何实现截屏功能&#xff0c;有两种思路&#xff0c;作为一个框架是否可以通过框架实现截屏&#xff0c;另一种就是 javaScript 结合 html 中画布功能实现截屏。 在初步思考之后&#xff0c;本文优先探索使用 Electron 实现截屏…

docker小白第二天

centos上安装docker docker官网&#xff0c;docker官网&#xff0c;找到下图中的doc文档。 进入如下页面 选中manuals&#xff0c;安装docker引擎。 最终centos下的docker安装文档链接&#xff1a;安装文档链接. 具体安装步骤&#xff1a; 1、打开Centos&#xff0c;输入命…

如何实现Vue路由的二级菜单

目录 Vue路由&#xff08;一、二级路由&#xff09; 一级路由配置 二级路由配置 Vue中展示二级路由的默认模块/二级路由默认显示 Vue路由&#xff0c;二级路由及跳转 如何用vue实现二级菜单栏 ◼️ 相关参考资料 当朋友们看到这个文章时想必是想要了解vue路由二级菜单相…

react学习笔记——4. 虚拟dom中处理动态数据

如下需求 方式1&#xff1a; 直接在ul中使用{data}&#xff0c;是可以遍历数据的&#xff0c;然后如果将data改成下面形式&#xff0c;也是可以实现的。但是如果data是一个对象&#xff0c;则不能便利。 const data [<li>Angular</li>, <li>React</li&g…

【分布式】Viewstamped Replication Revisited

篇前感悟&#xff1a; 阅读分布式系统文章的意义其实并不在于你个人真正地去开发这样一个基于这种协议的系统&#xff0c;因为真正去开发一个高可用的分布式系统实在是太难了&#xff08;对我来说…&#xff09;更多的还是汲取其中的思想&#xff0c;包括设计思路&#xff0c;优…

2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯

2023河南萌新联赛第&#xff08;五&#xff09;场&#xff1a;郑州轻工业大学-F 布鲁特佛斯 https://ac.nowcoder.com/acm/contest/62977/F 文章目录 2023河南萌新联赛第&#xff08;五&#xff09;场&#xff1a;郑州轻工业大学-F 布鲁特佛斯题意解题思路代码 题意 给定一个…

「C/C++」C/C++可变参数函数

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C」C/C程序设计「Win」Windows程序设计「DSA」数据结构与算法「File」数据文件格式 目录 当你需要…

exec族函数

本节学习exec族函数&#xff0c;并大量参考了以下链接&#xff1a; linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)_云英的博客-CSDN博客 exec族函数函数的作用 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程…

【数据中台商业化】数据中台微前端实践

一&#xff0c;需求背景 1 业务背景 在以往的业务场景中&#xff0c;用户进入五花八门的菜单体系中&#xff0c;往往会产生迷茫情绪&#xff0c;难以理解平台名称及具体作用&#xff0c;导致数据开发与管理学习成本较高&#xff0c;降低工作效率。为此我们整合从数据接入&…

Node.js |(四)HTTP协议 | 尚硅谷2023版Node.js零基础视频教程

学习视频&#xff1a;尚硅谷2023版Node.js零基础视频教程&#xff0c;nodejs新手到高手 文章目录 &#x1f4da;HTTP概念&#x1f4da;窥探HTTP报文&#x1f4da;请求报文的组成&#x1f407;HTTP请求行&#x1f407;HTTP请求头&#x1f407;HTTP的请求体 &#x1f4da;响应报文…

《连锁零售超市经营数据分析实战》学习笔记

这篇文章整理自 接地气的陈老师 x 和鲸社区 | 连锁零售超市经营数据分析实战 活动业务讲解会【接地气的陈老师】的讲解 更多数据分析动手实践活动欢迎访问>>和鲸社区活动 活动背景 现在你是某零售企业的商业数据分析师&#xff0c;你为管理层提供日常经营数据。到一年年…

亚信科技AntDB数据库与库瀚存储方案完成兼容性互认证,联合方案带来约20%性能提升

近日&#xff0c;亚信科技AntDB数据库与苏州库瀚信息科技有限公司自主研发的RISC-V数据库存储解决方案进行了产品兼容测试。经过双方团队的严格测试&#xff0c;亚信科技AntDB数据库与库瀚数据库存储解决方案完全兼容、运行稳定。除高可用性测试外&#xff0c;双方进一步开展TP…

Linux学习之sed多行模式

N将下一行加入到模式空间 D删除模式空间中的第一个字符到第一个换行符 P打印模式空间中的第一个字符到第一个换行符 doubleSpace.txt里边的内容如下&#xff1a; goo d man使用下边的命令可以实现把上边对应的内容放到doubleSpace.txt。 echo goo >> doubleSpace.txt e…

【TypeScript】this指向,this内置组件

this类型 TypeScript可推导的this类型函数中this默认类型对象中的函数中的this明确this指向 怎么指定this类型 this相关的内置工具类型转换ThisParameterType<>ThisParameterType<>ThisType TypeScript可推导的this类型 函数中this默认类型 对象中的函数中的this…

【elasticSearch系】3.完整搭建详尽版elk

话不多说,我们先看下经典的elk 是由哪些组件搭建组合起来的 elasticSearch和kibana搭建 可以查看之前我搭建elasticsearch和kibana 的这篇文章 logstash搭建 为了和之前我搭建elasticsearch和kibana版本保持一致,这里我们还是选择7.17.3 下载地址 点击下载,这里为了方…