【电机绘图】:插补算法(一)—直线插补—逐点比较法
今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 : 插补算法
本文提供直线插补的概念基础,基本思路分析,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)=0 | 10 | ||
1 | F(0,0)=0 | +X | (1,0) | F(1,0)=0-4 =-4 | 9 |
2 | F(1,0)=-4 | +Y | (1,1) | F(1,1)=-4+6=2 | 8 |
3 | F(1,1)>0 | +X | (2,1) | F(2,1)=2-4=-2 | 7 |
4 | F(2,1)<0 | +Y | (2,2) | F(2,2)=-2+6=4 | 6 |
5 | F(2,2)>0 | +X | (3,2) | F(3,2)=4-4=0 | 5 |
6 | F(3,2)=0 | +X | (4,2) | F(4,2)=0-4=-4 | 4 |
7 | F(4,2)<0 | +Y | (4,3) | F(4,3)=-4+6=2 | 3 |
8 | F(4,3)>0 | +X | (5,3) | F(5,3)=2-4=-2 | 2 |
9 | F(5,3)<0 | +Y | (5,4) | F(5,4)=-2+6=4 | 1 |
10 | F(5,4)>0 | +X | (6,4) | F(6,4)=4-4=0 | 0 |
这样,在编写绘图程序的时候,只需这样一次一次安排好下次插补直线的终点坐标,便可以自己设计,绘制各种各样的复杂形状:
进给情况二:在第二象限的进给与插补
这次,我们的情况有所改变,不仅目标变为了第二象限的点(-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)=0 | 6 | ||
1 | F(0,0)=0 | -X | (-1,0) | F(-1,0)=0-2=-2 | 5 |
2 | F(-1,0)<0 | +Y | (-1,1) | F(-1,1)=-2+4=2 | 4 |
3 | F(-1,1)>0 | -X | (-2,1) | F(-2,1)=2-2=0 | 3 |
4 | F(-2,1)=0 | -X | (-3,1) | F(-3,1)=0-2=-2 | 2 |
5 | F(-3,1)<0 | +Y | (-3,2) | F(-3,2)=-2+4=2 | 1 |
6 | F(-3,2)>0 | -X | (-4,2) | F(-4,2)=2-2=0 | 0 |
最终弥合效果如下图:
逐点比较法的总结:
这是我从网上盗的图,可以看看归纳,帮助理解 :
直线插补—逐点比较法 的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还是Yif(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还是Yelse 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]); }}
}
结束语:
最后希望这篇文章对大家有用,喜欢可以三连支持一下~~~~~~
相关文章:

【电机绘图】:插补算法(一)—直线插补—逐点比较法
今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 : 插补算法 本文提供直线插补的概念基础,基本思路分析,C语言实现等,代码会直接贴出! 插补算法是指在数值计算或数据处理中,根据已有的数据…...

16-2_Qt 5.9 C++开发指南_使用样式表Qss自定义界面
进行本篇介绍学习前,请先参考链接01_1_Qt工程实践_Qt样式表Qss,后再结合本篇进行融合学习如何使用样式表定义界面。 文章目录 1. Qt样式表2. Qt样式表句法2.1 一般句法格式2.2 选择器 (selector)2.3 子控件(sub-controls)2.4 伪状…...

chatgpt openai API报错openai.error.APIConnectionError
openai.error.APIConnectionError: Error communicating with OpenAI: 报错信息无用方案问题查看urllib3版本方法 可行方案法1法2:自己找包安装 报错信息 raise error.APIConnectionError( openai.error.APIConnectionError: Error communicating with OpenAI: HTT…...

【果树农药喷洒机器人】Part1:研究现状分析以及技术路线介绍
本专栏介绍:付费专栏,持续更新机器人实战项目,欢迎各位订阅关注。 关注我,带你了解更多关于机器人、嵌入式、人工智能等方面的优质文章! 文章目录 一、项目背景二、国内外研究现状2.1 国内研究现状2.2 国外研究现状 三…...

QT-QTablewidget 设置选中某一行
要在 QTableWidget 中设置选中的行,可以使用 setCurrentItem() 函数来设置当前的 QTableWidgetItem。你可以通过调用 QTableWidget 的 item() 函数获得指定行和列的 QTableWidgetItem,然后通过将其传递给 setCurrentItem() 函数来设置选中的行。 下面是…...

[shell] 删除指定文件状态变更之前的文件及文件夹示例
参考文件 Linux查找某个指定时间要求的文件 脚本示例 #!/bin/bash# 删除指定时间之前文件,单位:分钟 ago75# 监控路径,必须使用使用绝对路径,防止意外删除重要文件 monitoring_path"/home/dev/test/test" # 使用find命令查找75分…...

代码中 isEmpty 和 isBlank 的区别
isEmpty系列 StringUtils.isEmpty() 是否为空. 可以看到 " " 空格是会绕过这种空判断,因为是一个空格,并不是严格的空值,会导致 isEmpty(" ")false tringUtils.isEmpty(null) true StringUtils.isEmpty("") true StringUtils.isEmpty(" …...

为什么要选择文件传输软件?有哪些最佳高速文件传输软件?
是否经历过这样的场景,正在努力地完成工作任务,但是由于制作的数据无法及时传送给合作伙伴,工作流程被打断了?这听起来很令人沮丧,对吧?可是,这种情况在现实中并不罕见。 因此,需要…...

aardio + customPlus 显示图片演示
看效果: 上代码: import win.ui; /*DSG{{*/ var winform win.form(text"aardio customPlus 显示图片演示 by 光庆";right927;bottom607) winform.add( button{cls"button";text"下一页";left664;top536;right794;bott…...

收集到大量的名片怎么转为excel?
来百度APP畅享高清图片 参加完展会或集体会议,是不是收了一大堆名片,保管起来超级麻烦,还容易丢三落四?别急,我们有办法!把名片转成电子版保存到电脑上就完美啦!但要是名片数量有点多࿰…...

JAVASE---方法的使用
方法概念及使用 什么是方法(method) 方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义(不要背, 重在体会): 1. 是能够模块化的组织代码(当代码规模比较复杂的时候)。 2. 做到代码被重复使用, 一份代码可以在多个位置使用。 3. 让代码更好理解更简单…...

CryptoJS.lib.WordArray.create、CryptoJS.enc.Base64介绍
1、CryptoJS.lib.WordArray.create:它是 CryptoJS 库中的一个方法,用于创建 WordArray 对象。WordArray 对象是 CryptoJS 库中用于处理二进制数据的基本数据类型。它通常用于表示加密算法的输入和输出。 2、CryptoJS.enc.Base64:它是 CryptoJ…...

linux 配置java环境变量
单个用户 vim ~/.bashrc 或者 vim ~/.bash_profile全局用户 vim /etc/profileexport JAVA_HOME/path/to/java export PATH$JAVA_HOME/bin:$PATH立即生效使用 source 命令 source ~/.bashrc source /etc/profilejava -version...

Mybatis异常Invalid bound statement (not found)原因之Mapper文件配置不匹配
模拟登录操作 $.post("/admin/login", {aname, pwd }, rt > {if (rt.code 200) {location.href "manager/index.html";return;}alert(rt.msg)});网页提示服务器代码错误 POST http://localhost:8888/admin/login 500后端显示无法找到Mapper中对应的…...

SAP中采购文档出现定价转换因子字段溢出是何原因?
近期处理了一笔用户反馈的主题问题。这个问题有意思的地方在于,多重错误的叠加,导致了问题在开始就暴露出来,可以将隐患消除在萌芽状态。 在公司的应用中,会由采购创建价格合同,物流参照价格合同创建计划协议。但采购…...

Linux6.33 Kubernetes kubectl详解
文章目录 计算机系统5G云计算第三章 LINUX Kubernetes kubectl详解一、陈述式资源管理方法1.基本信息查看2.项目的生命周期:创建-->发布-->更新-->回滚-->删除 二、声明式管理方法 计算机系统 5G云计算 第三章 LINUX Kubernetes kubectl详解 一、陈述…...

小程序uni-select溢出文字处理方式
<uni-data-select v-model="customFormData.limitedBy" :localdata="cancelWays" @change="change"></uni-data-select>溢出效果如下图...

【MacOS】mac OS 安装HP 打印机驱动 hp laserjet m1213nf mfp
先确认一下机器复印是否正常.确认一下打印机的硬件. 如果复印没问题 1. 下载v5.1集合包Hewlett-Packard 打印机驱动程序 v5.1.1 (OS X) (中国) 2. 苹果商城中,下载Pacifist,运行Pacifist,用Pacifist程序打开v5.1并安装 3. 电脑--系统偏好设置--打印…...

【搜索】DFS剪枝与优化
算法提高课笔记 目录 小猫爬山题意思路代码 数独题意思路代码 木棒题意思路代码 生日蛋糕题意思路代码 剪枝是什么意思呢? 我们知道,不管是内部搜索还是外部搜索,都可以形成一棵搜索树,如果将搜索树全部遍历一遍,效率…...

dfs之卒的遍历
题面 题目描述 在一张nm 的棋盘上(如 6 行 7 列)的最左上角(1,1) 的位置有一个卒。该卒只能向下或者向右走,且卒采取的策略是先向下,下边走到头就向右,请问从(1,1) 点走到 (n,m) 点可以怎样走,输出这些走法…...

Springboot整合activiti5,达梦数据库,mybatis中间件
Springboot整合activiti5,达梦数据库,mybatis中间件 问题现象解决方案 问题现象 由于工作流引擎不支持达梦数据库以及国产中间件,所以我们引入的时候会报错,这个时候就需要去改造代码和配置文件。各种文档和资料查找一天…...

使用Python + Flask搭建web服务
示例脚本 from flask import Flask# 获取一个实例对象 app Flask(__name__)# 1、注册 app.route(/reg, methods[get]) def reg():return {code: 200,msg: reg ok!}# 2、登录 app.route(/login, methods[get]) def login():return login ok!if __name__ __main__:…...

Winform 打开文件夹、文件、拖拽上传
参考原文:https://blog.csdn.net/u012543266/article/details/21834073 1、打开文件 private void button1_Click(object sender, EventArgs e){OpenFileDialog dialog new OpenFileDialog();dialog.Multiselect true;//该值确定是否可以选择多个文件dialog.Titl…...
热评国内AI四小龙:此一时彼一时,彼此彼此
引言:阿里“清仓”全部持股 商汤科技表示“没啥事” 【科技明说 | 热点关注】 作为国内AI领域的知名科技上市公司,商汤科技SenseTime的一举一动都牵动着业内人士的心。 然而,商汤科技的财报表现没有出奇制胜,却让不…...

[国产MCU]-BL602开发实例-GPIO控制
GPIO与控制 文章目录 GPIO与控制1、GPIO介绍2、GPIO管理相关API介绍3、硬件准备4、软件准备5、代码实现3.1 GPIO输出3.2 GPIO输入3.3 GPIO中断BL602的GLB(Global Register)是芯片通用全局设定模块,主要包含了时钟管理、复位管理、总线管理、内存管理以及GPIO管理等功能。 本文…...

Firefox 配置 Burp_proxy 和 证书
安装代理拓展 安装拓展: chrome : switchomega firefox : foxyproxy 创建代理 : 127.0.0.1:8080 安装burp证书 先开启burp,然后切换到 burp 的代理访问 https://burp/ 下载证书打开firefox设置 - 搜索”证书“ -…...

基于Java+SpringBoot+Vue前后端分离仓库管理系统详细设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

PyTorch Lightning教程七:可视化
本节指导如何利用Lightning进行可视化和监控模型 为何需要跟踪参数 在模型开发中,我们跟踪感兴趣的值,例如validation_loss,以可视化模型的学习过程。模型开发就像驾驶一辆没有窗户的汽车,图表和日志提供了窗口,让我们…...

后端开发2.mongdb的集成
使用docker安装 安装 拉取镜像 docker pull mongo:4.4.14-focal 创建容器 docker run -itd --name mongo -p 8036:27017 mongo:4.4.14-focal --auth 配置管理员 进入容器 docker exec -it mongo bash 进入终端 mongo 进入admin数据库 use admin 创建管理员账户 db.c…...

Unity面板究极优化
首先对于大项目来说UI首选一定的UGUI,目前没有啥可选的余地。多一点都是对性能的负担,UGUI底层基于多线程技术,可以有效分担压力,对于一些不是那么重的面板几乎无感。 无论其他面板只是在此基础上修改的,但每多一层&am…...