参数曲线拟合

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

在这里插入图片描述

问题描述

在平面内给定n个点 {Pi=(xi, yi)}, i = [1, n]。

进行参数化并拟合.

函数拟合与曲线拟合的区别

函数是一个x对应一个y, 曲线是一个x可以对应多个y.

而普通拟合算法只能是针对函数的.

所以,需要对曲线进行降维参数化,然后再利用之前的数据拟合算法来求解.

本征维度

曲线的本征维度为1维,展出来所在的空间叫做嵌入维度。
可以理解为把线拉直,就变成一维直线了,我们可以从直线上的任意1个点通过参数映射求出本来曲线的位置。
那么曲线就可以使用1个变量来参数化。

曲面的本征维度为2。
可以理解为把曲面展成平面,平面上的任意点都可以通过参数映射求出本来曲面上的点。
那么曲线就可以使用2个变量来参数化。

问题转化

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

一条曲线,不管在几维空间空中,其本质维度为1.

那么对于二维曲线来说,我们可以使用一组基配合两组不同系数来分别表示x, y。

p ( t ) = { x = ∑ i = 0 m a i B i ( t ) y = ∑ i = 0 m b i B i ( t ) p(t)=\left \{ \begin{array}{lc} x=\displaystyle \sum_{i=0}^ma_iB_i(t)\\ y=\displaystyle \sum_{i=0}^mb_iB_i(t)\end{array} \right. p(t)= xi=0maiBi(t)yi=0mbiBi(t)

p(t) 就是我们要拟合的参数化曲线,t为参数, 定义域为[0,1]。

最小二乘构造

假设给定的点 Pi 已经有对应的参数为ti。

那么能量方程可以写成

E = ∑ i = 1 n ∣ ∣ p ( t i ) − P i ∣ ∣ 2 = ∑ i = 1 n ∥ ( ∑ i = 0 m a i B i ( t i ) ∑ i = 0 m b i B i ( t i ) ) − ( x i y i ) ∥ 2 E=\displaystyle \sum_{i=1}^n||p(t_i)-P_i||^2 = \displaystyle \sum_{i=1}^n\left\|\left(\begin{array}{lc} \displaystyle \sum_{i=0}^ma_iB_i(t_i)\\ \displaystyle \sum_{i=0}^mb_iB_i(t_i)\end{array}\right) -\left(\begin{array}{l} x_i\\y_i \end{array} \right)\right\|^2 Ei=1n∣∣p(ti)Pi2=i=1n i=0maiBi(ti)i=0mbiBi(ti) (xiyi) 2

E = ∑ i = 1 n ∥ ( ∑ i = 0 m a i B i ( t i ) ) − x i ∥ 2 + ∑ i = 1 n ∥ ( ∑ i = 0 m b i B i ( t i ) ) − y i ∥ 2 E= \displaystyle \sum_{i=1}^n\left\|\left( \displaystyle \sum_{i=0}^ma_iB_i(t_i)\right) - x_i\right\|^2+\displaystyle \sum_{i=1}^n\left\|\left( \displaystyle \sum_{i=0}^mb_iB_i(t_i)\right) - y_i\right\|^2 Ei=1n (i=0maiBi(ti))xi 2+i=1n (i=0mbiBi(ti))yi 2

上式前后两部分是两个独立的最小二乘问题,可以拆开后分别优化 得到a, b系数。

现在我们如何确定ti呢。本质上就是把曲线拉成直线,然后把每个点对应到直线上的某个位置。这个过程叫做参数化。

参数化的方式有很多,以下举几个常用的。

均匀参数化

第一个点和最后一个点分别对应0和1。

剩下的就把直线段分成n-1段。

第i个点的位置就是ti = (i-1)/(n-1)

弦长参数化

总弦长为

t o t = ∑ i = 2 n ∣ P i − P i − 1 ∣ tot = \displaystyle \sum_{i=2}^n|P_{i}-P_{i-1}| tot=i=2nPiPi1

第一个点和最后一个点分别对应0和1。

t i = ∑ k = 2 i ∣ P i − P i − 1 ∣ t o t t_i = \frac{\displaystyle \sum_{k=2}^i|P_{i}-P_{i-1}|}{tot} ti=totk=2iPiPi1

向心参数化

t o t = ∑ i = 2 n ∣ P i − P i − 1 ∣ tot = \displaystyle \sum_{i=2}^n\sqrt{|P_{i}-P_{i-1}|} tot=i=2nPiPi1

第一个点和最后一个点分别对应0和1。

t i = ∑ k = 2 i ∣ P i − P i − 1 ∣ t o t t_i = \frac{\displaystyle \sum_{k=2}^i\sqrt{|P_{i}-P_{i-1}|}}{tot} ti=totk=2iPiPi1

Foley 参数化

在这里插入图片描述

运行结果

代码链接:
https://gitcode.com/chenbb1989/geometric_model/tree/master/gohw2

采用参数化+多项式插值

在这里插入图片描述

在这里插入图片描述


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

  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值