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

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

本文提供直线插补的概念基础,基本思路分析,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还是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]);	}}
}

结束语:

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch 摄取管道 — 检测到管道的死循环

在数据处理和摄取领域&#xff0c;管道在组织和自动化数据从源到目的地的流动方面发挥着至关重要的作用。 管道是数据按顺序通过的一系列处理阶段&#xff0c;每个阶段负责特定任务。 然而&#xff0c;有时&#xff0c;管道可能会遇到一个重大挑战&#xff0c;称为 “Cycle det…

vue-cli

vue-cli脚手架 案例一&#xff1a; 案例二&#xff1a; 案例三&#xff1a; ​ 一、脚手架简介 Vue脚手架是Vue官方提供的标准化开发工具&#xff08;开发平台&#xff09;&#xff0c;它提供命令行和UI界面&#xff0c;方便创建vue工程、配置第三方依赖、编译vue工程 1. …

源码分析——HashMap(JDK1.8)源码+底层数据结构分析

文章目录 HashMap 简介底层数据结构分析JDK1.8之前JDK1.8之后 HashMap源码分析构造方法put方法get方法resize方法 HashMap常用方法测试 HashMap 简介 HashMap 主要用来存放键值对&#xff0c;它基于哈希表的Map接口实现&#xff0c;是常用的Java集合之一。 JDK1.8 之前 HashM…

【C++】STL map和set用法基本介绍

map、set用法简介 前言正式开始set构造erasefindswapcountlower_bound 和 upper_boundlower_boundupper_bound equal_rangepair multiusetfinderasecount map构造insert[ ][ ]底层原理 multimap两道题目前K个高频单词两个数组的交集 前言 首先&#xff0c;使用map和set最少要了…

关于Express 5

目录 1、概述 2、Express 5的变化 2.1 弃用或删除内容的列表&#xff1a; app.param&#xff08;name&#xff0c;fn&#xff09;名称中的前导冒号&#xff08;&#xff1a;&#xff09; app.del() app.param&#xff08;fn&#xff09; 复数方法名 res.json&#xff0…

【SpringBoot学习笔记】02. yaml配置注入

yaml配置注入 yaml基础语法 说明&#xff1a;语法要求严格&#xff01; 1、空格不能省略 2、以缩进来控制层级关系&#xff0c;只要是左边对齐的一列数据都是同一个层级的。 3、属性和值的大小写都是十分敏感的。 yaml注入配置文件 1、在springboot项目中的resources目录…

微信小程序如何配置并使用less?

1&#xff0c;检查微信开发者工具&#xff08;工具版本1.03&#xff09;————这步很重要不然后面按步骤实行后会发现急死你也还是不管用&#xff0c;我之前死在过这一步&#xff0c;所以大家不要再次踩坑了 ~ ~ 。。。 2&#xff0c;在VScode中下载Less插件 3&#xff0c;…

优思学院|成功「质量工程师」的关键技能

质量工程师是一个需要耐心、细心、坚持态度、沟通能力、协调能力的工作&#xff0c;更需要持续学习强化自身的专业知识。 质量工程师负责审核、客户投诉的调查、过程的改进以达到质量之提升&#xff0c;他們也必须要预警生产线风险、质量异常&#xff0c;并且协调不同的部門一…

MySQL的常用函数大全

一、字符串函数 常用函数&#xff1a; 函数功能CONCAT(s1, s2, …, sn)字符串拼接&#xff0c;将s1, s2, …, sn拼接成一个字符串LOWER(str)将字符串全部转为小写UPPER(str)将字符串全部转为大写LPAD(str, n, pad)左填充&#xff0c;用字符串pad对str的左边进行填充&#xff0…

国产GOWIN实现低成本实现CSI MIPI转换DVP

CSI MIPI转换DVP&#xff0c;要么就是通用IC操作&#xff0c;如龙讯芯片和索尼芯片&#xff0c;但是复杂的寄存器控制器实在开发太累。对于FPGA操作&#xff0c;大部分都是用xilinx的方案&#xff0c;xilinx方案成本太高&#xff0c;IP复杂。 而用国产GOWIN已经实现了直接mipi …

剑指Offer 24. 反转链表

24. 反转链表 题目 官方地址 代码&#xff08;双指针&#xff09; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val x; }* }*/ class Solution {public ListNode reverseList(ListNode h…

开窗积累之学习更新版

1. 开窗使用1之 count range between current row and current row 将相同排序字段的值进行函数计算 selectsku_id,substr(create_date,1,7) date_month,order_id,create_date,sku_num*price,sum(sku_num*price) over (partition by sku_id order by substr(create_date,1,7)…

Gson 添加数据默认值问题记录

问题&#xff1a;在用Gson add(key&#xff08;string类型&#xff09;&#xff0c;value&#xff08;必须是JsonElement子类&#xff09;&#xff09;时发现&#xff0c;value 传了 "" 空字符串&#xff08;非null&#xff09;&#xff0c;默认解析后返回null&#…

[国产MCU]-BL602开发实例-定时器

定时器 文章目录 定时器1、BL602定时器介绍2、定时器驱动API介绍3、定时器使用实例3.1 单次计时3.2 持续计时通用定时器,用于定时,当时间到达我们所设置的定时时间会产生定时中断,可以用来完成定时任务。本文将详细介绍如何使用BL602的定时器功能。 1、BL602定时器介绍 BL6…

JavaScript 基础

什么是JavaScript JavaScript 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果 JavaScript 的作用&#xff1a; 1. 网页特效&#xff08;监听用户的一些行为让网页做出对应的反馈&#xff09; 2. 表单验证&#xff08;针对表单数据的…

如何使用 ChatGPT 为 Midjourney 或 DALL-E 等 AI 图片生成提示词

人工智能为创意产业开辟了一个充满可能性的全新世界。人工智能最令人兴奋的应用之一是生成独特且原创的艺术品。Midjourney 和 DALL-E 是人工智能生成艺术的两个突出例子&#xff0c;吸引了艺术家和艺术爱好者的注意。在本文中&#xff0c;我们将探索如何使用 ChatGPT 生成 AI …

如何配置一个永久固定的公网TCP地址来SSH远程树莓派?

文章目录 如何配置一个永久固定的公网TCP地址来SSH远程树莓派&#xff1f;前置条件命令行使用举例&#xff1a;修改cpolar配置文件 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 …

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建 bbcbbc

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务…

自己实现Linux 的 cp指令

cp指令 Linux的cp指令就是复制文件&#xff1a; cp: 拷贝(cp 拷贝的文件 要拷贝到的地址或文件)&#xff0c;cp b.c test.c 将b.c拷成test.c的一个新文件 Linux 系统初识_mjmmm的博客-CSDN博客 实现思路 打开源文件读文件内容到缓冲区创建新文件将读到的文件内容全部写入新文…

TEMU美国儿童文具亚马逊CPC测试标准

美国站儿童文具类上架跨境电商平台美国站或者出口美国需要提交CPC认证&#xff0c;才能进入美国市场&#xff0c;由CPSC 认可的实验室出具的检测报告&#xff0c;确认每件商品均已过检测&#xff0c;符合上述适用要求。但许多亚马逊卖家反映&#xff1a;在亚马逊卖的文具类产品…