首页 文章

计算用于定义二次贝塞尔曲线子部分的参数

提问于
浏览
5

我有一个描述为(startX,startY)到(anchorX,anchorY)并使用控制点(controlX,controlY)的二次贝塞尔曲线 .

我有两个问题:

(1)我想根据x点确定该曲线上的y点 .

(2)然后,在我的贝塞尔曲线上给出一个线段(由我的贝塞尔曲线上的两个中间点定义(startX',startY',anchorX',anchorY')),我想知道该线段的控制点这样它就会与原始贝塞尔完全重叠 .

为什么?我想要这些信息进行优化 . 我画了许多水平贝塞尔 . 当beziers大于屏幕时,性能会受到影响,因为渲染引擎最终渲染超出了可见范围 . 这个问题的答案将让我只渲染可见的东西 .

2 回答

  • 1

    第1部分

    二次贝塞尔曲线的公式为:

    B(t) = a(1-t)2    + 2bt(1-t)   + ct2
         = a(1-2t+t2) + 2bt - 2bt2 + ct2
         = (a-2b+c)t2+2(b-a)t + a
    

    其中粗体表示矢量 . 给出 B x(t),我们有:

    x = (ax-2bx+cx)t2+2(bx-ax)t + ax
    

    其中 v x是 v 的x分量 .

    根据二次方程式,

    -2(bx-ax) ± 2√((bx-ax)2 - ax(ax-2bx+cx))
    t = -----------------------------------------
                 (2ax(ax-2bx+cx))
    
         ax-bx ± √(bx2 - axcx)
      = ----------------------
             ax(ax-2bx+cx)
    

    假设存在一个解,请将其插回到原始方程中,以便在给定的x处得到 B (t)的其他分量 .

    第2部分

    您可以简单地将参数参数的域限制为[0,1]的正确子区间,而不是生成与第一个部分重合的第二条Bezier曲线(我现在感觉不像是处理符号) . 也就是说,使用第1部分为两个不同的x值找到t的值;将这些t值称为i和j . 为t∈[i,j]绘制 B (t) . 等价地,为t∈[0,1]绘制 B (t(j-i)i) .

  • 13

    t方程是错误的,你需要使用eq(1)

    (1) x = (ax-2bx+cx)t2+2(bx-ax)t + ax
    

    并使用根的二次方程式求解它(2) .

    -b ± √(b^2 - 4ac)
      (2)  x = -----------------
                  2a
    

    哪里

    a = ax-2bx+cx
    b = 2(bx-ax)
    c = ax - x
    

相关问题