Graphics 连接贝塞尔曲线

Graphics 连接贝塞尔曲线,graphics,geometry,bezier,Graphics,Geometry,Bezier,我有个问题。假设我们有一条由四个控制点定义的三次贝塞尔曲线。现在,假设从一个点切割曲线,然后再次使用三次bezier曲线表示每条线段。那么,如果我们有两个这样的贝塞尔曲线B1和B2,有没有办法知道它们是否可以连接起来形成另一条贝塞尔曲线B?这是通过连接两条曲线来简化几何图形,并减少控制点的数量。关于这个问题的一些想法。 我认为存在初始贝塞尔曲线P0-P3,控制点P1和P2 让我们在参数ta和tb处进行两次细分。 我们现在有两个子曲线(黄色)P0-PA3和PB0-P3。 蓝色间隔丢失。 PA1和

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

关于这个问题的一些想法。 我认为存在初始贝塞尔曲线
P0
-
P3
,控制点
P1
P2

让我们在参数ta和tb处进行两次细分。 我们现在有两个子曲线(黄色)
P0
-
PA3
PB0
-
P3
。 蓝色间隔丢失。
PA1
PB2
已知控制点。我们必须找到未知的
P1
P2

一些方程式

初始曲线:

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)
(一些乘法符号由于格式化而丢失)

这是向量方程,它包含两个未知量的标量方程
ta
tb

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用非常非常大的立方公式来求解:()


如果我们有一些有误差的点,那就有必要为一些点(
PA3
PB0
PA2
PB1
)建立超定方程组,并通过数值求解来最小化偏差。


分割贝塞尔曲线时,由第一个截面的最后两个控制点和第二个截面的前两个控制点形成的向量是共线的,它们的长度比会导致分割时的参数值。验证公共控制点是否与参数值匹配很容易(为了避免意外共线)。

利用贝塞尔曲线始终通过第一个和最后一个控制点的事实(也就是说,您需要它通过B1和B2的端点),您应该能够计算候选曲线B(这假设您只是没有实际寻找最匹配B1+B2的曲线)。您如何“使用三次贝塞尔曲线再次表示每个线段”。如果您能做到这一点,您的问题已经得到了回答!要清楚,您不仅要问切线(一阶导数)是否与重叠点对齐,还要问曲率(二阶导数)是否对齐是相同的,对吗?是的,更清楚地说,我有一组贝塞尔曲线。由于源中的噪声,可能会发生一条长贝塞尔曲线可能会被追踪成段。因此,作为优化和平滑要求,我想查看每条曲线的邻域,并将它们连接起来,如果最终的曲线B可以近似B1+B2。希望我是c现在学习。@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,并用文字说明
近似值
比较
应该做什么。