我有一个问题。假设我们有由四个控制点定义的单个立方贝塞尔曲线。现在假设从某一点切割曲线,并且每个线段再次使用立方贝塞尔曲线表示。因此,现在如果我们给定两个这样的贝塞尔曲线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***(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)
PA3
、PB0
、PA2
、PB1
),并通过数值方法求解以最小化误差是有意义的。
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的例子,并用语言解释Approx
和Compare
应该做什么。 - user786653