曲线平滑算法:三次Hermite曲线生成

news2024/11/18 1:10:35

目录

 1.三次Hermite曲线的参数方程

2. 三次Hermite曲线的绘制


         Hermite曲线是通过给定曲线的两个端点的位置矢量P_{0}P_{1}以及两个端点处的切线矢量R_{0}R_{1}来描述曲线的,如图1所示。这里先对Hermite曲线进行数学公式推导,然后讲述如何绘制Hermite曲线。(这里是算法代码)

图1 Hermite曲线

 1.三次Hermite曲线的参数方程

        三维空间中的自由曲线用三次参数方程表示可以用以下的形式:

\left\{\begin{matrix} x(t)=a_{x}t^{3}+b_{x}t^{2}+c_{x}t+d_{x}\\ y(t)=a_{y}t^{3}+b_{y}t^{2}+c_{y}t+d_{y} \\ z(t)=a_{z}t^{3}+b_{z}t^{2}+c_{z}t+d_{z} \end{matrix}\right.

或者:

Q(t)=at^{3}+bt^{2}+ct+d

其中,参数t的取值范围是t\in [0,1],这是归一化坐标,表示从端点1到端点2的的相对距离。

将以上参数方程改写为矩阵形式为:

Q(t)=\begin{bmatrix} t^{3} &t^{2} & t& 1 \end{bmatrix} \begin{bmatrix} a\\ b\\ c\\ d \end{bmatrix}

若令

T=\begin{bmatrix} t^{3} & t^{2} &t & 1 \end{bmatrix}

C=\begin{bmatrix} a &b &c & d \end{bmatrix}^{T}

Q(t)=T\cdot C

对参数t的一阶导数得:

Q^{'}(t)=\begin{bmatrix} 3t^{2} &2t &1 &0 \end{bmatrix}\cdot C

        假定已知曲线的两个端点的位置矢量P_{0}P_{1}以及两个端点处的切线矢量R_{0}R_{1},如图1所示。注意位置矢量和切线矢量都有x,y等分量。这四个量实际上对应于将t=0好t=1代入Q(t)Q^{'}(t)得到的结果,即:

P_{0}=Q(0)=\begin{bmatrix} 0 & 0& 0 & 0 \end{bmatrix}\cdot C

P_{1}=Q(1)=\begin{bmatrix} 1 & 1 &1 &1 \end{bmatrix}\cdot C

R_{0}=Q^{'}(0)=\begin{bmatrix} 0 & 0& 1 & 0 \end{bmatrix}\cdot C

R_{1}=Q^{'}(1)=\begin{bmatrix} 3 & 2 & 1 & 0 \end{bmatrix}\cdot C

用矩阵方程表示为:

\begin{bmatrix} P_{0}\\ P_{1}\\ R_{0}\\ R_{1} \end{bmatrix}=\begin{bmatrix} 0 & 0& 0& 1\\ 1& 1 &1 & 1\\ 0 & 0& 1 &0 \\ 3& 2& 1 & 0 \end{bmatrix}\cdot C

C=\begin{bmatrix} 0 & 0&0 &1 \\ 1& 1& 1 &1 \\ 0& 0& 1& 0\\ 3& 2 & 1 & 0 \end{bmatrix}^{-1}\begin{bmatrix} P_{0}\\ P_{1}\\ R_{0}\\ R_{1} \end{bmatrix}=\begin{bmatrix} 2 & -2& 1&1 \\ -3& 3 & -2 & -1\\ 0& 0 & 1& 0\\ 1& 0& 0 & 0 \end{bmatrix}\begin{bmatrix} P_{0}\\ P_{1}\\ R_{0}\\ R_{1} \end{bmatrix}

M_{h}=\begin{bmatrix} 2 & -2 & 1 &1 \\ -3& 3 & -2 &-1 \\ 0& 0& 1& 0\\ 1& 0& 0& 0 \end{bmatrix}

G_{h}=\begin{bmatrix} P_{0} & P_{1} & R_{0} & R_{1} \end{bmatrix}^{T}

M_{h}即为Hermite矩阵,为常数,G_{h}为Hermite几何矢量。

C=M_{h}\cdot G_{h}

于是曲线又可以表示为:

Q=T\cdot M_{h}\cdot G_{h}

因为上面的QG_{h}都是三维空间的矢量,有x,y,z三个分量:

G_{hx}=\begin{bmatrix} P_0x & P_{1x} &R_{0x} &R_{1x} \end{bmatrix}^{T}

G_{hy}=\begin{bmatrix} P_0y & P_{1y} &R_{0y} &R_{1y} \end{bmatrix}^{T}

G_{hz}=\begin{bmatrix} P_0z & P_{1z} &R_{0z} &R_{1z} \end{bmatrix}^{T}

于是将曲线Q展开成分量形式如下:

x=T\cdot M_{h}\cdot G_{hx}

y=T\cdot M_{h}\cdot G_{hy}

z=T\cdot M_{h}\cdot G_{hz}

        显然,只要给定G_{h},就可以在0\leq t\leq 1的范围内求出Q(t),形成曲线上点的轨迹。T\cdot M_{h}称之为Hermite基函数。对基函数进行进一步展开,得到四个分量:

F_{0}(t)=2t^{3}-3t^{2}+1

F_{1}(t)=-2t^{3}+3t^{2}

F_{2}(t)=t^{3}-2t^{2}+t

F_{3}(t)=t^{3}-t^{2}

于是曲线上的轨迹点,又可以通过以下公式表示:

x(t)=P_{0x}\cdot F_{0}(t)+P_{1x}\cdot F_{1}(t)+R_{0x}\cdot F_{2}(t)+R_{1x}\cdot F_{3}(t)

y(t)=P_{0y}\cdot F_{0}(t)+P_{1y}\cdot F_{1}(t)+R_{0y}\cdot F_{2}(t)+R_{1y}\cdot F_{3}(t)

z(t)=P_{0z}\cdot F_{0}(t)+P_{1z}\cdot F_{1}(t)+R_{0z}\cdot F_{2}(t)+R_{1z}\cdot F_{3}(t)

2. 三次Hermite曲线的绘制

       这里是代码下载链接:Hermite曲线绘制代码

        三次Hermite曲线的绘制,需要四个参数进行控制,分别是两个端点坐标和两个端点处的切线矢量,比如给定两个点的三维坐标P0(1,4,0)、P1(2,6,0),以及两个端点的切线矢量R0(1,-1,0)、R1(1,-1,0),其绘制的Hermite曲线如下:

图2 两点三次Hermite曲线

         对于多点Hermite平滑,则是从头到尾,逐步取相邻的两个点,分别求出两点之间的Hermite曲线轨迹,比如,6个散点的Hermite曲线绘制的图像如下:

图3 6点三次Hermite曲线

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ansys】什么软件模块是DS,它和workbench、mechanical的区别在哪里?

一、DesignSpace和workbench 早期的Workbench称之为DesignSpace,更偏向于建模。 现在DS是license的一种,而分析的模块在11中称之为Simulation(Design Simulation),在12中改名为Mechanical。 所以,你可以…

SpringBoot整合RabbitMQ(六种工作模式介绍)

介绍 RabbitMQ是一种消息中间件,用于处理来自客户端的异步消息。服务端将要发送的消息放入到队列池中。接收端可以根据RabbitMQ配置的转发机制接收服务端发来的消息。 RabbitMQ依据指定的转发规则进行消息的转发、缓冲和持久化操作,主要用在多服务器间或…

Unity开发数字化看板-通用的设备运动同步

通用的设备运动同步 通过获取实时采集运动位置,发送到unity程序中,通过比例运算,转换成模型的运动位置,实现虚实同步。 在工业设备中,复杂的运动进行分析、分解,最本质的的运动就是平移和转动&#xff0c…

美团到店暑期实习Java一面

目录1.rabbitmq如何避免消息丢失 (三个阶段)2.如何保证消息的顺序性3.如何保证消息不被重复消费4.缓存与数据库的不一致性5.redis的过期策略和内存淘汰策略6.简单说下LRU的实现7.用原生redis实现分布式锁,锁误删的情况8.锁续期如何去考量9.缓…

MySQL-----库的操作

文章目录前言一、创建数据库二、创建数据库实例三、字符集和校验规则1.查看系统默认字符集以及校验规则.2.查看数据库支持的字符集3.查看数据库支持的字符集校验规则4.校验规则对数据库的影响四、操纵数据库1.查看数据库2.显示创建语句4.修改数据库5.删除数据库6.备份和恢复6.1…

Diffusion模型系列文章

DDPM 论文 扩散模型包括两个过程:前向过程(forward process)和反向过程(reverse process),其中前向过程又称为扩散过程(diffusion process),如下图所示,从x…

【音视频第8天】mediasoup拥塞控制【未完待续】

WebRTC的拥塞控制方式主要有以下几个:Transport-cc、BBR-congestion、remb(BBR已被google从webrtc移除了)。mediasoup支持Transport-cc和remb。 一、前言 实时通信的延时指标 视频服务质量指标 音视频服务质量与带宽之间的矛盾、实时性与服…

【微信小程序】初识微信小程序组件

作者简介:一名C站萌新,前来进行小程序的前进之路博主主页:大熊李子🐻 一、组件的创建与引用 1.1 创建组件 在项目的根目录中,鼠标右键,创建 components -> test 文件夹在新建的 components -> test…

NLP / LLMs中的Temperature 是什么?

ChatGPT, GPT-3, GPT-3.5, GPT-4, LLaMA, Bard等大型语言模型的一个重要的超参数 大型语言模型能够根据给定的上下文或提示生成新文本,由于神经网络等深度学习技术的进步,这些模型越来越受欢迎。可用于控制生成语言模型行为的关键参数之一是Temperature …

[译]自下而上认识Elasticsearch

注意:原文发表时间是13年,所以实现有可能与新版不一致. 原文地址:https://www.elastic.co/cn/blog/found-elasticsearch-from-the-bottom-up Introduction 在本系列文章中,我们从一个新的视角来看ElasticSearch.我们将从下往上,从抽象的底层实现到用户可见层,我们在向上移动的…

【JaveEE】网络编程之TCP套接字、UDP套接字

目录 1.网络编程的基本概念 1.1为什么需要网络编程 1.2服务端与用户端 1.3网络编程五元组 1.4套接字的概念 2.UDP套接字编程 2.1UDP套接字的特点 2.2UDP套接字API 2.2.1DatagramSocket类 2.2.2DatagramPacket类 2.2.3基于UDP的回显程序 2.2.4基于UDP的单词查询 …

免疫力低会怎么样 什么情况会导致免疫降低

都说免疫力是很重要的,它会我们健康的第一道防线,但是当免疫力降低的时候,会出现哪些情况?为什么免疫力会降低? 免疫力是人体的防御系统,就像是维持人体正常运转的军队。免疫力的高低,一定程度上…

再探pytorch的Dataset和DataLoader

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052本文从分类、检测、分割三大任务的角度来剖析pytorch得dataset和dataloader源码,可以让初学者深刻理解每个参数的由来和使用,并轻松自定义dataset。思考&#x…

SQL LIMIT

SQL LIMIT SQL LIMIT子句简介 要检索查询返回的行的一部分,请使用LIMIT和OFFSET子句。 以下说明了这些子句的语法: SELECT column_list FROMtable1 ORDER BY column_list LIMIT row_count OFFSET offset;在这个语法中, row_count确定将返…

Html5版贪吃蛇游戏制作(经典玩法)

回味经典小游戏,用Html5做了个贪吃蛇的小游戏,完成了核心经典玩法的功能。 游戏可以通过电脑的键盘“方向键”控制,也可以点击屏幕中的按钮进行控制。(支持移动端哈) 点击这里试玩 蛇的移动是在18 x 18的格子中进行移…

sqoop数据导入

创建数据库 mysql全表数据导入hdfs mysql查询数据导入hdfs mysql指定列导入hdfs 使用查询条件关键字将mysql数据导入hdfs mysql数据导入hive 创建数据库 hive中创建user表 create table users( id bigint, name string ) row format delimited fields terminated by &…

数据结构 - 归并排序 | C

思路分析 什么是归并&#xff1f; 示例&#xff1a;&#xff08;归并后的结果copy到原数组&#xff09; 逻辑&#xff1a; if (a[begin1] < a[begin2]) {tmp[i] a[begin1];} else {tmp[i] a[begin2];} 归并排序 分解到“有序”再归并 递归 int middle (left righ…

哈希——unordered系列关联式容器

目录 unordered系列关联式容器 概念 unordered_map 无序去重 operator[] unordered_set 无序去重 OJ练习题 重复n次的元素 两个数组的交集 两个数的交集二 底层结构 概念 哈希冲突 闭散列 结点的定义 扩容 字符串取模 插入 查找 删除 闭散列完整代码 开…

安卓远程控制软件哪个好用

如果您曾希望将个人电脑放在口袋里&#xff0c;那么您可能只需要安卓远程访问软件。 没有远程访问应用程序&#xff1a;使用和控制计算机的唯一方法是坐在计算机前并手动输入命令。 使用远程访问应用程序&#xff1a;您可以在世界任何地方通过 Internet 连接从您的安卓平板电…

【30天python从零到一】---第七天:列表和元组

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; Python专栏 &#x1f319;请不要相信胜利就像山坡上的蒲公英一样…