Hermite 三次插值可编辑样条

2024-08-22 04:28

本文主要是介绍Hermite 三次插值可编辑样条,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

问题描述

利用三次样条和Hermite插值制作一个类似于ppt里的曲线工作。

基本思路

  1. 对于给定点,初始生成时用参数化+三次函数插值的方式生成。三次样条函数插值法
  2. 生成后在各型值点处展示切线信息。
  3. 编辑时,利用两点两切线的信息,通过hermite三次插值进行分段插值。

切线计算

对曲线参数化后

P ( t ) = { y ( t ) x ( t ) P(t) = \left \{ \begin{array}{l} y(t) \\ x(t) \end{array} \right. P(t)={y(t)x(t)

切线信息就是 P(t)的1阶导
P ′ ( t ) = { y ′ ( t ) x ′ ( t ) P'(t) = \left \{ \begin{array}{l} y'(t) \\ x'(t) \end{array} \right. P(t)={y(t)x(t)

在这里插入图片描述
根据三弯矩公式求导,得到导数公式。
S i ′ ( x ) = − M i 2 h i ( x i + 1 − x ) 2 + M i + 1 2 h i ( x − x i ) 2 + ( y i + 1 h i − M i + 1 h i 6 ) + ( M i h i 6 − y i h i ) S_i'(x) = -\frac {M_i}{2h_i}(x_{i+1}-x)^2+\frac {M_{i+1}}{2h_i}(x-x_{i})^2+(\frac{y_{i+1}}{h_i}-\frac{M_{i+1}h_i}{6})+(\frac{M_ih_i}{6}-\frac{y_i}{h_i}) Si(x)=2hiMi(xi+1x)2+2hiMi+1(xxi)2+(hiyi+16Mi+1hi)+(6Mihihiyi)

Hermite 插值法

给定两点两切线信息,求出两点之间的曲线方程。

设两端点和导数如下:

P ( 0 ) = p i P ( 1 ) = p i + 1 P ′ ( 0 ) = D p i P ′ ( 1 ) = D p i + 1 \begin{array}{lc}\mathbf P\boldsymbol(\mathbf0\boldsymbol)\boldsymbol={\mathbf p}_{\mathbf i}\\\mathbf P\boldsymbol(\mathbf1\boldsymbol)\boldsymbol={\mathbf p}_{\mathbf i\boldsymbol+\mathbf1}\\\mathbf P\boldsymbol'\boldsymbol(\mathbf0\boldsymbol)\boldsymbol={\mathbf{Dp}}_{\mathbf i}\\\mathbf P\boldsymbol'\boldsymbol(\mathbf1\boldsymbol)\boldsymbol={\mathbf{Dp}}_{\mathbf i\boldsymbol+\mathbf1}\end{array} P(0)=piP(1)=pi+1P(0)=DpiP(1)=Dpi+1

可以给出待定式

P ( u ) = a u 3 + b u 2 + c u + d , u ∈ [ 0 , 1 ] \boldsymbol P(u) = \boldsymbol au^3 + \boldsymbol bu^2 +\boldsymbol cu + \boldsymbol d , u \in [0,1] P(u)=au3+bu2+cu+d,u[0,1]

我们希望求得a,b,c,d从而得到表达式

分量 P x ( u ) = a x u 3 + b x u 2 + c x u + d x 分量\boldsymbol P_x(u) = \boldsymbol a_xu^3 + \boldsymbol b_xu^2 +\boldsymbol c_xu + \boldsymbol d_x 分量Px(u)=axu3+bxu2+cxu+dx

y, z也有类似的关系。

可以写成矩阵形式

P ( u ) = [ u 3 u 2 u 1 ] [ a b c d ] ( 1 ) \boldsymbol P(u) = \begin{bmatrix} u^3 &u^2&u & 1 \end{bmatrix} \begin{bmatrix} \boldsymbol a\\ \boldsymbol b\\ \boldsymbol c\\ \boldsymbol d \end{bmatrix} (1) P(u)=[u3u2u1] abcd (1)

对P(u) 求导得到
P ′ ( u ) = [ 3 u 2 2 u 1 0 ] [ a b c d ] ( 2 ) \boldsymbol P'(u) = \begin{bmatrix} 3u^2 &2u &1 & 0 \end{bmatrix} \begin{bmatrix} \boldsymbol a\\ \boldsymbol b\\ \boldsymbol c\\ \boldsymbol d \end{bmatrix}(2) P(u)=[3u22u10] abcd (2)

把u=0, u=1 时的值和一阶导代入式(1),式(2)可以得到方程组

[ P i P i + 1 D p i D p i + 1 ] = [ 0 0 0 1 1 1 1 1 0 0 1 0 3 2 1 0 ] [ a b c d ] \begin{bmatrix} \boldsymbol P_i\\ \boldsymbol P_{i+1}\\ \boldsymbol Dp_i\\ \boldsymbol Dp_{i+1} \end{bmatrix} = \begin{bmatrix} 0&0&0&1 \\ 1&1&1&1\\ 0&0&1&0\\3&2&1&0\end{bmatrix} \begin{bmatrix} \boldsymbol a\\ \boldsymbol b\\ \boldsymbol c\\ \boldsymbol d \end{bmatrix} PiPi+1DpiDpi+1 = 0103010201111100 abcd

[ P i P i + 1 D p i D p i + 1 ] = [ 0 0 0 1 1 1 1 1 0 0 1 0 3 2 1 0 ] [ a b c d ] \begin{bmatrix} \boldsymbol P_i\\ \boldsymbol P_{i+1}\\ \boldsymbol Dp_i\\ \boldsymbol Dp_{i+1} \end{bmatrix} = \begin{bmatrix} 0&0&0&1 \\ 1&1&1&1\\ 0&0&1&0\\3&2&1&0\end{bmatrix} \begin{bmatrix} \boldsymbol a\\ \boldsymbol b\\ \boldsymbol c\\ \boldsymbol d \end{bmatrix} PiPi+1DpiDpi+1 = 0103010201111100 abcd

[ a b c d ] = [ 0 0 0 1 1 1 1 1 0 0 1 0 3 2 1 0 ] − 1 [ P i P i + 1 D p i D p i + 1 ] \begin{bmatrix} \boldsymbol a\\ \boldsymbol b\\ \boldsymbol c\\ \boldsymbol d \end{bmatrix}= \begin{bmatrix} 0&0&0&1 \\ 1&1&1&1\\ 0&0&1&0\\3&2&1&0\end{bmatrix}^{-1} \begin{bmatrix} \boldsymbol P_i\\ \boldsymbol P_{i+1}\\ \boldsymbol Dp_i\\ \boldsymbol Dp_{i+1} \end{bmatrix} abcd = 0103010201111100 1 PiPi+1DpiDpi+1

= [ 2 − 2 1 1 − 3 3 − 2 − 1 0 0 1 0 1 0 0 0 ] [ P i P i + 1 D p i D p i + 1 ] = \begin{bmatrix} 2&-2&1&1 \\ -3&3&-2&-1\\ 0&0&1&0\\1&0&0&0\end{bmatrix} \begin{bmatrix} \boldsymbol P_i\\ \boldsymbol P_{i+1}\\ \boldsymbol Dp_i\\ \boldsymbol Dp_{i+1} \end{bmatrix} = 2301230012101100 PiPi+1DpiDpi+1


M H = [ 2 − 2 1 1 − 3 3 − 2 − 1 0 0 1 0 1 0 0 0 ] \boldsymbol M_H= \begin{bmatrix} 2&-2&1&1 \\ -3&3&-2&-1\\ 0&0&1&0\\1&0&0&0\end{bmatrix} MH= 2301230012101100

P ( u ) = [ u 3 u 2 u 1 ] M H [ P i P i + 1 D p i D p i + 1 ] \boldsymbol P(u) = \begin{bmatrix} u^3 &u^2&u & 1 \end{bmatrix} \boldsymbol M_H \begin{bmatrix} \boldsymbol P_i\\ \boldsymbol P_{i+1}\\ \boldsymbol Dp_i\\ \boldsymbol Dp_{i+1} \end{bmatrix} P(u)=[u3u2u1]MH PiPi+1DpiDpi+1

这样就可以直接由两点两切线直接得到表达式。

展开得到分段表达式

P i ( u ) = P i ( 2 u 3 − 3 u 2 + 1 ) + P i + 1 ( − 2 u 3 + 3 u 2 ) + D p i ( u 3 − 2 u 2 + u ) + D p i + 1 ( u 3 − u 2 ) \boldsymbol P_i(u) = \boldsymbol P_i(2u^3-3u^2+1)+ \boldsymbol P_{i+1}(-2u^3+3u^2) + \boldsymbol Dp_i(u^3-2u^2+u) +\boldsymbol Dp_{i+1}(u^3-u^2) Pi(u)=Pi(2u33u2+1)+Pi+1(2u3+3u2)+Dpi(u32u2+u)+Dpi+1(u3u2)

实现

代码:
https://gitcode.com/chenbb1989/geometric_model/tree/master/gohw4-1

演示视频

三次样条编辑

在这里插入图片描述
在这里插入图片描述


本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。创作不易,帮忙点击公众号的链接,帮忙转发,感激不尽。

这篇关于Hermite 三次插值可编辑样条的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095231

相关文章

轨迹规划-B样条

B样条究竟是干啥的?白话就是给出一堆点,用样条的方式,给这些点连接起来,并保证丝滑的。 同时B样条分为准均匀和非均匀,以下为准均匀为例。 参考链接1:https://zhuanlan.zhihu.com/p/50626506https://zhuanlan.zhihu.com/p/50626506 参考链接2: https://zhuanlan.zhihu.com/p/536470972h

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB:存储了每一个连接中的一些重要信息。比如TCP连接表,指向发送和接收缓冲的指针,指向重传队列的指针,当前的发送和接收序列等等。 我们再来看一下TCP报文段的组成结构 TCP 三次握手 过程 假设有一台客户端,B有一台服务器。最初两端的TCP进程都是处于CLOSED关闭状态,客户端A打开链接,服务器端

jqgrid设置单元格可编辑

1 在单元格的属性列设置为editable。 2 点击编辑按钮的时候,触发某一行设置为edit的状态。 jQuery("#rowed4").jqGrid({url:'server.php?q=2',datatype: "json",colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],colModel

在幼儿园管理系统中,会议管理申请会议修改模块:多个与会人员的回显和修改(编辑)!

在幼儿园管理系统中,会议管理>申请会议>修改模块:多个与会人员的回显(复选框)和修改(编辑)!在处理与会人员的回显(复选框)和修改(编辑)出点问题。无法正确的回显(复选框)出来与会人员和修改(编辑)。 最后终于解决:修改(编辑)的思路是:先把原来的该会议记录下的所有与会人员删除,在添加,即可实现修改(编辑)功能。回显(复选框)的思路是:设置一个flag,判断一下是否要选中(复选框),即可实现

Vue3商品SKU多规格编辑组件

商品SKU多规格组件主要用于电商平台的商品详情页,帮助买家在选择商品时能够根据不同的规格(如颜色、尺码、容量等)进行筛选和购买。这种组件的设计旨在提升用户体验,简化购买流程,并确保买家能够准确地选择到自己需要的商品规格。以下是对商品SKU多规格组件的详细解析: 1. 定义与功能 SKU(Stock Keeping Unit)定义:SKU即库存量单位,是指宝贝的销售属性集合,供买家在下单

TCP三次握手详解!

TCP(Transmission Control Protocol) 传输控制协议 三次握手 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) UR

动画插值器Interpolation

插值器定义: 用于修改一个动画过程中的速率,可以定义各种各样的线性或非线性变化函数,比如匀速.加速.减速等。 说白了(也就是通俗的说):其实就是一个 时间的函数,用来 定义了动画的变化律 系统的插值器: 在Android中所有的插值器都是Interpolator 的子类,下面是几种插值器: AccelerateDecelerateInterolator  先加速后减速,

div标签变成可编辑

在html页面有很多得方用到<div>标签,开始的时候要想在一个<div>标签中显示一段文本我会先到用<textArea>标签,可是<textArea>标签会随着你的拉动,框的大小也回随着改变,有时会把原来的布局拉动的变得非常难看。 有次在看书,看到div是可以编辑的标签,只要在div标签中加上属性contentEditable=true即可,要想看到div就给div高度和宽度再给个颜色,这样就

图像插值算法参考博客

1. 最近邻插值法(nearest_neighbor) - wancy - 博客园 (cnblogs.com)https://www.cnblogs.com/wancy/p/15068519.html 2. 双线性插值法(bilinear interpolation) - wancy - 博客园 (cnblogs.com)https://www.cnblogs.com/wancy/p/15212