我有一条三次贝塞尔曲线,由许多段组成(左图)。它有一些粗糙的曲率,我需要让它像右图一样平滑。这个问题有点像“降噪”,我该如何实现呢?
有类似的线程here https://stackoverflow.com/questions/3497694/simplifying-a-cubic-bezier-path?rq=1,但输入是一组点,并使用最小二乘法在其上拟合贝塞尔曲线,但在我的问题中,输入已经是三次贝塞尔曲线。
在上图中,我没有绘制线段和控制点,但我希望您能明白。
您想保持相同数量的段吗?您需要保持贝塞尔曲线段之间的连续性吗?您是否试图达到一定数量的线段,或者只是将事物保持在原始曲线的一定公差范围内?
现在,我假设您想要减少贝塞尔曲线段的数量,任何您需要保持段之间的 G1 连续性的数量,并且您试图在容差范围内进行平滑(只是从图像中猜测)。
对于顶级算法,您将遍历每对相邻的曲线,并尝试将它们组合起来。重复此操作,直到组合两条相邻曲线超出您的公差范围。
如何组合两条相邻的贝塞尔曲线?假设它们是曲线 P 和 Q,并且由于它们都是三次曲线,因此它们各有 4 个 CV:P0、P1、P2、P3 和 Q0、Q1、Q2、Q3。我们还将假设 P3 == Q0。另外,我们称输出曲线为R,由R0、R1、R2、R3组成。
另一个非常重要的步骤 - 您需要为要简化的较大曲线内的每个贝塞尔曲线段分配 t 值。因此,段 0 将从 0..1 开始,段 1 从 1..2 开始,段 2 从 2..3 开始,依此类推。
如果要保持 P 与其邻居的连续性,以及 Q 与其邻居的连续性,则不能移动 P0 或 Q3,并且 (P1-P0) 和 (Q2-Q3) 形成的切向量必须保持相同方向..它们只能缩放。
由于 R 中只有 4 个 CV,因此这两个比例因子是您拥有的唯一自由度。我们将它们称为 kp 和 kq。
R0=P0
R1=P0+kp*(P1-P0)
R2=Q3+kq*(Q2-Q3)
R3=Q3
如果两条曲线的结长度相等,则 kp = 2 且 kq = 2。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)