Math 三次贝塞尔曲线段

Math 三次贝塞尔曲线段,math,graphics,coordinates,bezier,Math,Graphics,Coordinates,Bezier,如果我有描述贝塞尔曲线P1、P2、P3、P4的4个点(其中P1和P4是曲线的端点,P2和P3是曲线的控制点),我如何找到只描述贝塞尔曲线一段的点 我发现这正是我想要的,但答案似乎是错误的。如果在表示整个贝塞尔曲线的方程式中设置t0=0和t1=1,则结果点无效。它们不等于原始点 这个解决方案似乎与德卡斯特尔贾的算法有关,但我不明白它是如何工作的 是的,这是一条路要走 参数化 如果您的曲线没有从t=0到t=1正确参数化,那么您似乎使用了错误的方程式来描述曲线。为您提供了正确的公式: B(t)=(1)

如果我有描述贝塞尔曲线P1、P2、P3、P4的4个点(其中P1和P4是曲线的端点,P2和P3是曲线的控制点),我如何找到只描述贝塞尔曲线一段的点

我发现这正是我想要的,但答案似乎是错误的。如果在表示整个贝塞尔曲线的方程式中设置t0=0和t1=1,则结果点无效。它们不等于原始点

这个解决方案似乎与德卡斯特尔贾的算法有关,但我不明白它是如何工作的

是的,这是一条路要走

参数化 如果您的曲线没有从t=0到t=1正确参数化,那么您似乎使用了错误的方程式来描述曲线。为您提供了正确的公式:

B(t)=(1)−t) 3 P1+3(1−t) 2t P2+3(1−t) t2 P3+t3 P4

[我将维基百科中以零为基础的索引形式调整为以你的问题为基础的索引形式。]

如果设置t=0,则得到P1,即起点。如果设置t=1,则得到P4,即端点。在这两者之间,曲线的形状由这些点以及两个控制点P2和P3决定

德卡斯特卢算法 设t为要剪切曲线的参数。假设您只想保留初始部分。从P1到P2、从P1到P3、从P3到P4绘制三条线。这些线中的每一条都是以其长度的分数t进行分割的,即分割点之前的线的长度与整个长度的关系为t:1。现在有三个新点P12到P34。再次执行相同操作以获得两点P123和P234,并再次获得单点P1234。最后一点是B(t),即截断曲线的端点。起始点与前面一样为P1。新的控制点是P12和P123,就像我们刚才构建它们的方式一样

删除曲线的初始部分的工作方式相同。因此,您可以通过两个步骤修剪曲线的两端。您将获得一组新的控制点,这些控制点精确地(达到您使用的数字精度)描述原始曲线的一段,而不涉及近似值或类似值

你可以把上面所有的几何描述转换成代数公式,在一个完美的世界里,你应该根据你引用的问题得出结果

唉,这似乎不是一个完美的世界。在撰写本文时,这些公式仅使用二次多项式,因此无法描述三次曲线上的端点。正确的公式应如下所示:

  • P'1= u0u0u0p1+ (t0u0u0)+ u0t0u0+ u0u0t0)P2+ (t0t0u0+ u0t0t0+ t0u0t0)P3+ T0T0 T0 P4
  • P'2= u0u0u1 P1+ (t0u0u1+ u0t0u1+ u0u0t1)P2+ (t0t0u1+ u0t0t1+ t0u0t1)P3+ T0T1 P4
  • 第3页= u0u1u1 P1+ (t0u1u1)+ u0t1u1+ u0u1t1)P2+ (t0t1u1+ u0t1t1+ t0u1t1)P3+ t0t1t1 P4
  • 第4页= u1u1u1 P1+ (t1u1u1)+ u1t1u1+ u1u1t1)P2+ (T1U1+ U1T1+ t1u1t1)P3+ T1P4
其中u0=1− t0和u1=1− t1


请注意,在括号中的表达式中,至少有一些项相等,可以组合。我没有这样做,因为我相信这里所述的公式会使模式更清晰。您只需在x和y方向独立执行这些计算,即可计算新的控制点。

感谢您的精彩解释。但是如果我使用你提到的方程,我使用t0=0和t1=1,我应该有完整的贝塞尔曲线,所以4个计算点应该等于原来的4个点,但它们不是。你会得到这样的结果:xa=x1(好),xb=bx2(坏),xc=bx1(坏),xd=x2(好)。我使用HTML5画布方法通过传递4个点绘制贝塞尔曲线,但曲线不正确。方程式中有错误吗?@Absolom,我所联系的答案似乎确实有错误。正确的公式现在应该包括在内。它的工作非常完美!非常感谢您花时间写下所有公式。它也可能帮助其他人。谢谢@MvG,感谢您指出我的旧答案中有一个错误(被提问者引用)。我现在已经修复了错误。