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

2023-10-26

目录

 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曲线

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

曲线平滑算法:三次Hermite曲线生成 的相关文章

  • Echarts遇到Vue3时遇到的问题

    将vue2的Echarts代码迁移到了vue3项目上 引发的问题 问题描述 1 点击图例legend时刻度轴偏移 图像不展示 以及报错 初始chart正常 图 点击图例后的chart和报错 图 2 调用resize 不生效且报错 初始正常
  • mysql之mysql约束19

    概述 本篇是我们DDL语言的最后一篇 从库和表的管理到本篇共3篇 1 mysql约束 常见约束 1 含义 一种限制 用于限制表中的数据 为了保证表中的数据的准确和可靠性 2 分类 六大约束 1 NOT NULL 非空 用于保证该字段的值不能
  • TypeScript -- ts的编译、类型注解、数组类型、联合类型、类型别名、函数类型、对象类型、接口类型、字面量类型、类型推断、类型断言、泛型、any类型

    TypeScript ts的编译 类型注解 数组类型 联合类型 类型别名 函数类型 对象类型 接口类型 字面量类型 类型推断 类型断言 泛型 any类型 TypeScript相较于JavaScript来说 是在js的基础上进行了制约 对原先
  • vmware克隆Centos6.4虚拟机网卡无法启动问题

    问题现象 通过vmware8的完全克隆功能快速创建一台版本为CentOS 6 4的linux虚拟机 创建后症状 启动之后使用ifconfig 发现无ip地址 只有回环地址为127 0 0 1MAC地址以及主机名都和源主机相同 源主机采用手动
  • 算法训练营第三十六天(8.26)

    目录 Leecode 198 打家劫舍 Leecode 213 打家劫舍 II Leecode 337 打家劫舍III Leecode 198 打家劫舍 题目地址 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 题目类型 打家劫舍
  • Android Studio快捷键的设置

    设置好主题和字体之后 http blog csdn net yzzdmzdfq article details 51291322 很多小伙伴们开始迫不及待的编程了 很快就会发现 好像快捷键用起来不太舒服 于是想要设置一下快捷键 那么问题来了
  • JS原型、原型链到底是什么?

    前言 在js的学习中 原型毫无疑问是一个难点 但也是一个不可忽视的重点 在前端面试中也是一个高频考题 在接下来的深入学习中 你会发现原型 原型链等知识点其实并不难 1 一切皆为对象 JavaScript是一个面向 原型 对象的语言 对象是属
  • Linux网络基础 — 网络层

    目录 IP协议 IP协议报头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 补充 网络层 在复杂的环境中确定一个合适的路径 IP协议 ip具有将数据从 主机A 跨网络送到 主机B 的能力 主机 配有IP
  • 如何在CMD下增加IP地址

    1 修改IP地址 注意事项 如果是设置有多IP的情况下 将清除其它IP 只保留此次命令中设置的IP地址 netsh interface ip set address name 本地连接 source static addr 192 168

随机推荐

  • 最大区间交

    先将所有区间按照左端点排序 然后遍历所有区间进行以下操作 第i个区间 a b ans max ans min maxr b a 1 maxr max maxr b
  • 从零开始实现C++ TinyWebServer(九)---- 项目知识点总结

    文章目录 前言 项目介绍 为什么要做这样一个项目 项目背景 项目描述 项目功能 项目流程 项目重难点 项目效果 解决方案 个人收获 线程池 线程的同步机制有哪些 线程池中的工作线程是一直等待的吗 如果同时1000个客户端进行访问请求 线程数
  • com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼...

    Spring boot使用MyBatis mysql配置运行时报错com mysql cj exceptions InvalidConnectionAttributeException The server time zone value
  • Odoo的XMLRPC调用

    Odoo的XMLRPC调用 使用场景 需要运行脚本调用odoo的模型方法 对数据库进行修改 企业内部有多个系统服务 系统间互相调用模型方法 基本调用过程 服务端定义好模型和方法 服务端odoo orm方法能被调用 加了 api model装
  • pytorch 详解NLLloss 与crossEntry

    NLLloss 与CrossEntry
  • 【Java进阶】多线程&高并发(一)<线程概述>

    一 线程相关概念 1 进程 进程 process 是计算机中的程序关于某数据集合上的一次运行活动 是操作系统进行资源分配与调度的基本单位 进程可以简单理解为正在操作系统中运行的一个程序 2 线程 线程 thread 是进程的一个执行单元 一
  • qt自定义带参数的构造函数(构造函数传参)

    源文件 h中 class Test public QMainWindow Q OBJECT public explicit Test QString path QWidget parent 0 构造函数有默认值的要放右边 新添加的参数需要放
  • 《软件工程》第七章 实现 作业

    1 什么是模块测试和集成测试 它们各有什么特点 1 模块测试 指把每个模块作为一个单独的实体来测试 目的是发现模块内部可能存在的差错 保证每个模块作为一个单元能正确运行 所以又称单元测试 对多个模块的测试可以并发进行 在这个测试步骤中所发现
  • vscode安装go插件以及语言开发包

    vscode安装go插件及语言安装包过程 没有go环境和vscode的可以先安装go和vscode 接下来步骤主要通过vscode插件的方式安装go的插件以及语言开发包 vscode安装go插件 启动vscode选择插件 gt 搜go选择G
  • [分布式]:分布式系统的CAP理论

    2000年7月 加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想 2年后 麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP 之后 CAP理论正式成为分布式计算领域的公认定
  • Latex(texlive)安装配置教程(详细)

    1 下载安装及打开方式 在浏览器里输入 texlive mirror 一般会找到清华大学的镜像网站 我这里是选择texlive2021 20210325 iso文件下载的 iso文件其实就像一个硬盘 下载好以后在你下载的目录双击打开这个is
  • 关于linux下android studio更新下载SDK和加速访问Github的方法

    文章参照以下的两篇文章 这里做一下总结 Linux中加速访问github zonyZhang 博客园 解决连不上dl google com的问题 简书 1 登录 dl google com A记录 cname检测结果 Dns查询 dns查询
  • 数据挖掘是如何解决问题的

    数据挖掘是如何解决问题的 本节通过几个数据挖掘实际案例来诠释如何通过数据挖掘解决商业中遇到的问题 2 1 1节中关于 啤酒和尿不湿 的故事是数据挖掘中最经典的案例 而Target公司通过 怀孕预测指数 来预测女顾客是否怀孕的案例也是近来为数
  • 一个完整的测试流程包括哪些?测试人员需要做什么?

    目录 前言 1 需求交接 2 编写测试用例 3 冒烟测试 4 SIT测试 5 数据升级测试 视情况而定 6 系统培训 视情况而定 7 UAT测试 8 上线 结语 前言 在实际工作中 其实很少有公司把一个完整的测试流程一步一步走下来 大多会执
  • win10,win11 下部署Vicuna-7B,Vicuna-13B模型,gpu cpu运行

    运行Vicuna 7B需要RAM gt 30GB或者14GB的显存 运行Vicuna 13B需要RAM gt 60GB或者28GB的显存 如果没有上面的硬件配置请绕行了 我笔记本有64G内存 两个都跑跑看 使用python3 9 当时转换1
  • 基于Tensorflow+SDD+Python人脸口罩识别系统(深度学习)含全部工程源码及模型+视频演示+图片数据集

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 Python 环境 Anaconda 环境搭建 模块实现 1 数据预处理 2 模型构建及算法实现 3 模型生成 系统测试 1 训练准确率 2 运行结果 工程源代码下载 其它资料下载
  • String类型

    String类对象的创建 字符串声明 String stringName 字符串创建 stringName new String 字符串常量 或stringName 字符串常量 String类构造方法 1 public String 无参构
  • JIRA数据迁移到不同服务器及升级(7.1.4升级到7.3.4)

    JIRA SoftWare 官网有关备份 恢复JIRASoftware系统数据文档 071版本 https confluence atlassian com adminjiraserver071 backing up data 802592
  • STP原理

    STP生成树是针对于二层网络优化技术 主要的作用是为了冗余和防止环路的产生 STP的作用 逻辑上断开链路 防止网络风暴的产生 当线路故障的时候 阻塞接口被激活 恢复通信 BID 网桥ID BID 优先级 MAC地址 交换机默认优先级为327
  • 曲线平滑算法:三次Hermite曲线生成

    目录 1 三次Hermite曲线的参数方程 2 三次Hermite曲线的绘制 Hermite曲线是通过给定曲线的两个端点的位置矢量 以及两个端点处的切线矢量 来描述曲线的 如图1所示 这里先对Hermite曲线进行数学公式推导 然后讲述如何