欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。
问题描述
在平面内给定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)=⎩ ⎨ ⎧x=i=0∑maiBi(t)y=i=0∑mbiBi(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 E=i=1∑n∣∣p(ti)−Pi∣∣2=i=1∑n i=0∑maiBi(ti)i=0∑mbiBi(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 E=i=1∑n (i=0∑maiBi(ti))−xi 2+i=1∑n (i=0∑mbiBi(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=2∑n∣Pi−Pi−1∣
第一个点和最后一个点分别对应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=2∑i∣Pi−Pi−1∣
向心参数化
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=2∑n∣Pi−Pi−1∣
第一个点和最后一个点分别对应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=2∑i∣Pi−Pi−1∣
Foley 参数化
运行结果
代码链接:
https://gitcode.com/chenbb1989/geometric_model/tree/master/gohw2
采用参数化+多项式插值
本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。创作不易,帮忙点击公众号的链接,帮忙转发,感激不尽。