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

发布于 2024-08-28 20:04:01 字数 334 浏览 11 评论 0原文

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

我有两个问题:

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

(2) 然后,给定贝塞尔曲线上的线段(由贝塞尔曲线上的两个中间点定义(startX'、startY'、anchorX'、anchorY')),我想知道该线段的控制点使其与原始贝塞尔曲线完全重叠。

为什么?我需要这些信息来进行优化。我正在画很多水平贝塞尔曲线。当贝塞尔曲线大于屏幕时,性能会受到影响,因为渲染引擎最终会渲染超出可见范围。这个问题的答案将让我只渲染可见的内容。

I have a quadratic bezier curve described as (startX, startY) to (anchorX, anchorY) and using a control point (controlX, controlY).

I have two questions:

(1) I want to determine y points on that curve based on an x point.

(2) Then, given a line-segment on my bezier (defined by two intermediary points on my bezier curve (startX', startY', anchorX', anchorY')), I want to know the control point for that line-segment so that it overlaps the original bezier exactly.

Why? I want this information for an optimization. I am drawing lots of horizontal beziers. When the beziers are larger than the screen, performance suffers because the rendering engine ends up rendering beyond the extents of what is visible. The answers to this question will let me just render what is visible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夏雨凉 2024-09-04 20:04:02

第 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

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

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

其中 vx的 x 分量v

根据二次公式,

     -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) 的其他分量。

第 2 部分

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

Part 1

The formula for a quadratic Bezier is:

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

where bold indicates a vector. With Bx(t) given, we have:

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

where vx is the x component of v.

According to the quadratic formula,

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

Assuming a solution exists, plug that t back into the original equation to get the other components of B(t) at a given x.

Part 2

Rather than producing a second Bezier curve that coincides with part of the first (I don't feel like crunching symbols right now), you can simply limit the domain of your parametric parameter to a proper sub-interval of [0,1]. That is, use part 1 to find the values of t for two different values of x; call these t-values i and j. Draw B(t) for t ∈ [i,j]. Equivalently, draw B(t(j-i)+i) for t ∈ [0,1].

猫七 2024-09-04 20:04:02

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

The t equation is wrong, you need to use eq(1)

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

and solve it using the the quadratic formula for the roots (2).

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

Where

a = ax-2bx+cx
b = 2(bx-ax)
c = ax - x
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文