加入贝塞尔曲线

时间:2011-11-08 17:15:30

标签: graphics geometry bezier

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

2 个答案:

答案 0 :(得分:5)

关于这个问题的一些想法。 我建议初始贝塞尔曲线P0 - P3包含控制点P1P2

enter image description here

让我们在参数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)

(由于SO格式化,一些乘法符号已丢失)

这是矢量方程,它包含两个未知数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 :(得分:1)

你会在这里找到一个非常简单的解决方案:https://math.stackexchange.com/a/879213/65203

当分割Bezier时,由第一部分的最后两个控制点和第二部分的前两个控制点形成的矢量是共线的,并且它们的长度比率导致分割时参数的值。验证公共控制点是否与参数值匹配是一件容易的事(为避免意外共线的情况)。