views:

249

answers:

1

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.

+4  A: 

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 = ----------------------------------------
             (2ax(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].

outis
+1 you did an admirable job without latex
ldog
Thank you for your help. In solving the quadratic, I believe there are a couple minor mistakes in your solution? Any event, got it to work! Appreciated.
jedierikb
@jedierikb, RE: mistakes: quite possibly. What in particular are you referring to?
outis
(outis... still working on this. i will get back to you. thx.)
jedierikb