math - 在多个点分割三次贝塞尔曲线

标签 math curve bezier

我正在编写一种算法,将三次贝塞尔曲线分割成多条曲线(最多 4 条)。我从一开始就有了要分割的每个点的 t 值。我还有一个已经将曲线分割一次的算法:

SubdivPoints subdivideBezier(Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3, float t)
{
    Vector2 p11 = (p1 - p0) * t + p0;
    Vector2 p21 = (p2 - p1) * t + p1;
    Vector2 p31 = (p3 - p2) * t + p2;

    Vector2 p12 = (p21 - p11) * t + p11;
    Vector2 p22 = (p31 - p21) * t + p21;

    Vector2 p13 = (p22 - p12) * t + p12;

    return SubdivPoints(p11, p12, p22, p31, p13);
}

我的问题是,有没有一种简单的方法可以扩展它以进行多次拆分?我想在每次分割后我想重新计算 t 值;我想知道的一件事是简单的算术在这里是否有效。例如。假设我的 t 值为 0.2 和 0.6。我在 t = 0.2 处分割曲线,得到两条曲线。第二条曲线涵盖了原始曲线的 t 值 0.2 < t < 1。如果我通过除法重新计算第二个 t 值 0.6:(0.6 - 0.2)/(1 - 0.2) = 0.5,然后在 t = 0.75 处除以第二条曲线,这样可以吗?或者我需要以其他方式重新计算吗?

最佳答案

由于您的 subdivideBezier() 函数确实遵循 De Casteljau 算法,因此我假设它可以在参数 t 处分割三次贝塞尔曲线。所以,是的,要继续以不同的参数(例如 t2)分割,您需要做的就是找出 t2 落在哪条分割曲线上,根据该曲线计算新的 t2* 并分割。在您想要在 t=0.2 和 0.6 处分割的示例中,0.6 的新参数应为 (0.6-0.2)/(1-0.2) = 0.5。因此,您可以简单地在 t=0.5 处分割第二条曲线。

关于math - 在多个点分割三次贝塞尔曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33928808/

相关文章:

javascript - 过渡到 Canvas 上绘制的曲线?

java - 获取 future 的双周日期

python - python中的命题演算

.net - BigInteger.Parse 工作不正确

r - base R 中的曲线函数

algorithm - 一种实现非线性插值的方法?

java - 我的辛普森法则计算器正确吗(java)?

c# - 绘制不同粗细的线

android - CCbezierTo 不适用于 cocos2d、android

python - 在python中向贝塞尔图添加多条线