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

5
我有一个二次贝塞尔曲线,由起点 (startX, startY) 到锚点 (anchorX, anchorY),并使用控制点 (controlX, controlY) 描述。
我有两个问题:
(1) 我想根据 x 点确定曲线上的 y 点。
(2) 然后,给定我的贝塞尔曲线上的线段(由两个中间点定义:startX'、startY'、anchorX'、anchorY'),我想知道该线段的控制点,以便它与原始贝塞尔曲线完全重合。
为什么?我需要这些信息进行优化。我正在绘制许多水平贝塞尔曲线。当贝塞尔曲线大于屏幕时,性能会受到影响,因为渲染引擎最终会渲染超出可见范围。这个问题的答案将让我只渲染可见部分。

好奇一下,这个项目是什么? - outis
第二部分需要澄清。你所说的小贝塞尔曲线是什么意思?有哪些参数?如果你指的是控制点,那么曲线不是已经有了吗? - outis
感谢您的反馈,outis。我重写了(2)并添加了解释。 - jedierikb
2个回答

12

第一部分

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

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

其中加粗表示向量。给定 Bx(t),我们有:

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

其中 vx 是向量 v 的 x 分量。

根据二次公式,

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

假设存在解,将 t 带回原方程以获得给定 x 的 B(t) 的其他分量。

第二部分

与其生成一个与第一条贝塞尔曲线的一部分重合的第二条曲线(我现在不想计算符号),您可以将参数化参数的定义域限制为[0,1]的适当子区间。也就是说,使用第一部分找到两个不同x值的t值;将这些t值称为i和j。绘制B(t)以使t ∈ [i,j]。等价地,对于t ∈ [0,1],绘制B(t(j-i)+ i)。


谢谢你的帮助。在解决二次方程时,我相信你的解法中有一些小错误?不管怎样,我已经解决了!非常感谢。 - jedierikb
@jedierikb,回复:可能是错误。你具体指的是什么? - outis
Alex Arm的回答纠正的错误是将一些不适当的替换应用到二次方程中(也许一开始就有一个不正确的二次方程?为什么要有±2√...?),例如,您提供的除数显然不是应该是的“2a”。 - theonlygusti
@theonlygusti:2是从系数的t项(通过二次方程中的项)的2因子分布出来的,而4是从二次公式中的ac系数分布出来的:√((2(bₓ-aₓ))² - 4 aₓ(aₓ-2bₓ+cₓ)) = ±2√((bₓ-aₓ)² - aₓ(aₓ-2bₓ+cₓ))。你关于分母中错误的aₓ项是正确的;不确定它是如何引入的。 - outis

2

这个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

我刚刚看到了这个(注意:拥有足够的声望后,您可以发表评论;用户将会收到对他们帖子的评论通知)。 - outis
这是我做的。重新检查我的计算,我没有发现错误。那么我的错误在哪里? - outis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接