geometry - 如何将三次曲线的 2 个控制点转换为二次曲线的单个控制点?

标签 geometry bezier

在网上搜索后,我在各种论坛上看到很多人暗示用二次曲线近似三次曲线。但是我找不到公式。

我想要的是这个:

输入:startX、startY、control1X、control1Y、control2X、control2Y、endX、endY
输出:startX、startY、controlX、controlY、endX、endY

实际上,由于起点和终点是相同的,所以我真正需要的是......

输入:startX、startY、control1X、control1Y、control2X、control2Y、endX、endY
输出: controlX, controlY

最佳答案

如前所述,从 4 个控制点到 3 个控制点通常是一个近似值。只有一种情况是精确的 - 当三次贝塞尔曲线实际上是一个度数提升的二次贝塞尔曲线时。

您可以使用度数高程方程得出近似值。这很简单,结果通常很好。

让我们称三次方 Q0..Q3 的控制点和二次方 P0..P2 的控制点。那么对于度数提升,方程是:

Q0 = P0
Q1 = 1/3 P0 + 2/3 P1
Q2 = 2/3 P1 + 1/3 P2
Q3 = P2

在您的情况下,您有 Q0..Q3 并且您正在解决 P0..P2。有两种方法可以根据上述等式计算 P1:
P1 = 3/2 Q1 - 1/2 Q0
P1 = 3/2 Q2 - 1/2 Q3

如果这是一个度数提升的三次方,那么两个方程都会对 P1 给出相同的答案。因为它可能不是,你最好的办法是平均它们。所以,
P1 = -1/4 Q0 + 3/4 Q1 + 3/4 Q2 - 1/4 Q3

翻译成您的条款:
controlX = -0.25*startX + .75*control1X + .75*control2X -0.25*endX

Y 的计算方式类似 - 维度是独立的,因此这适用于 3d(或 n-d)。

这将是一个近似值。如果您需要更好的近似值,获得它的一种方法是使用 deCaSTLejau 算法分割初始三次方,然后对每个段进行度约。如果您需要更好的连续性,还有其他不那么快速和肮脏的近似方法。

关于geometry - 如何将三次曲线的 2 个控制点转换为二次曲线的单个控制点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2009160/

相关文章:

java - 打印出一个 ASCII 圆和轴

连接点集的算法?

r - 如何找到 R 中给定区域内 voronoi 单元的面积?

algorithm - 无限7边形的递归创建

3d - 贝塞尔三次曲线 : moving with uniform acceleration

python - De Casteljau 算法忽略一个控制点

math - 平滑希尔伯特曲线

layout - 如何使用metapost生成多边形数字?

c++ - 使用 C++ 计算通过归一化矩阵中任意 3 个点的曲线

iphone - 如何为 2D 游戏中的角色创建平滑路径