加入贝塞尔曲线

14

我有一个问题。假设我们有由四个控制点定义的单个立方贝塞尔曲线。现在假设从某一点切割曲线,并且每个线段再次使用立方贝塞尔曲线表示。因此,现在如果我们给定两个这样的贝塞尔曲线B1和B2,是否有方法可以知道它们是否可以连接成另一个贝塞尔曲线B?这是通过连接两条曲线来简化几何形状并减少控制点数量。


利用贝塞尔曲线始终通过第一个和最后一个控制点的事实(也就是说,您需要让它穿过B1和B2的端点),您应该能够计算出候选曲线B(这假定您实际上只是在寻找最佳匹配B1 + B2的曲线)。 - user786653
如果您能够理解“每个线段再次使用三次贝塞尔曲线表示”,那么您的问题已经得到了回答! - Dr. belisarius
清楚地说,您不仅要求在重叠点处切线(一阶导数)对齐,而且还要求曲率(二阶导数)相同,是吗? - Phrogz
是的,更明确地说,我有一组贝塞尔曲线。由于源中的噪音,可能会出现将长的贝塞尔曲线跟踪成分段的情况。因此,作为优化和平滑要求,我希望在每条曲线的邻域内查找并加入它们,以便最终曲线B可以近似于B1 + B2。现在希望我的表述更清晰明了。 - Aarkan
@Aarkan:也许如果您能编辑您的帖子,加入一个小的伪代码函数来展示您如何表示数据,并提供一个例子,那么给出具体建议将会更容易。例如bool match(const ControlPoint B1[4], const ControlPoint B2[4], ControlPoint B[4]) { Approx(B1,B2,B); return (Compare(B1,B2,B) },其中包括B1、B2和B的值,以及一个您希望返回true的例子,并用语言解释ApproxCompare应该做什么。 - user786653
2个回答

5
关于这个问题的一些想法。 我建议采用初始Bezier曲线P0-P3,并使用控制点P1P2

让我们在参数ta和tb处进行两个细分。 现在我们有两个子曲线(黄色) - P0-PA3PB0-P3。 蓝色区间丢失了。 PA1PB2 - 已知的控制点。 我们必须找到未知的P1P2

一些等式

初始曲线:

C = P0*(1-t)^3+3*P1(1-t)^2*t+3*P2*(1-t)*t^2+P3*t^3

终端节点:

PA3 = P0*(1-ta)^3+3*P1*(1-ta)^2*ta+3*P2*(1-ta)*ta^2+P3*ta^3

PB0 = P0*(1-tb)^3+3*P1*(1-tb)^2*tb+3*P2*(1-tb)*tb^2+P3*tb^3

小曲线的控制点
PA1 = P0*(1-ta)+P1*ta => P1*ta = PA1 – P0*(1-ta)

PB2 = P2*(1-tb)+P3*tb => P2(1-tb) = PB2 – P3*tb

现在将未知点代入PA3方程式中:
**PA3***(1-tb) = **P0***(1-ta)^3*(1-tb)+3*(1-ta)^2*(1-tb)*(**PA1** – **P0***(1-ta))+3*(1-ta)*ta^2*( **PB2** – **P3***tb)+**P3***ta^3*(1-tb)

这是一个向量方程,它包含了两个未知数tatb的两个标量方程。

PA3X*(1-tb) = P0X*(1-ta)^3*(1-tb)+3*(1-ta)^2*(1-tb)*(PA1X – P0X*(1-ta))+3*(1-ta)*ta^2*( PB2X – P3X*tb)+P3X*ta^3*(1-tb)

PA3Y*(1-tb) = P0Y*(1-ta)^3*(1-tb)+3*(1-ta)^2*(1-tb)*(PA1Y – P0Y*(1-ta))+3*(1-ta)*ta^2*( PB2Y – P3Y*tb)+P3Y*ta^3*(1-tb)

这个系统可以通过数值和解析两种方法来解决(事实上,Maple用非常庞大的三次公式来解决)。
如果我们有带有一些误差的点,那么建立超定方程组来处理这些点(PA3PB0PA2PB1),并通过数值方法求解以最小化误差是有意义的。

1
你会在这里找到一个非常简单的解决方案:https://math.stackexchange.com/a/879213/65203
当你分割贝塞尔曲线时,第一部分的最后两个控制点和第二部分的前两个控制点形成的向量共线,它们长度的比率导致了拆分处的参数值。验证公共控制点是否与该参数值匹配是一个容易的问题(为了避免意外共线的情况)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接