расчет параметров для определения подразделов квадратичных кривых Безье - PullRequest
5 голосов
/ 17 апреля 2010

У меня есть квадратичная кривая Безье, описанная как (startX, startY) - (anchorX, anchorY) и использующая контрольную точку (controlX, controlY).

У меня два вопроса:

(1) Я хочу определить y точек на этой кривой на основе точки x.

(2) Затем, учитывая отрезок на моем Безье (определенный двумя промежуточными точками на моей кривой Безье (startX ', startY', anchorX ', anchorY')), я хочу знать контрольную точку линейный сегмент, чтобы он точно перекрывал исходный Безье.

Почему? Я хочу эту информацию для оптимизации. Я рисую много горизонтальных Безье. Когда безье больше экрана, производительность снижается, потому что механизм рендеринга заканчивает рендеринг за пределами видимого. Ответы на этот вопрос позволят мне просто отобразить то, что видно.

Ответы [ 2 ]

13 голосов
/ 17 апреля 2010

часть 1

Формула для квадратичного Безье:

<b>B</b>(t) = <b>a</b>(1-t)<sup>2</sup>    + 2<b>b</b>t(1-t)   + <b>c</b>t<sup>2</sup>
     = <b>a</b>(1-2t+t<sup>2</sup>) + 2<b>b</b>t - 2<b>b</b>t<sup>2</sup> + <b>c</b>t<sup>2</sup>
     = (<b>a</b>-2<b>b</b>+<b>c</b>)t<sup>2</sup>+2(<b>b</b>-<b>a</b>)t + <b>a</b>

где жирным шрифтом обозначен вектор. С учетом B x (т) имеем:

x = (<b>a</b><sub>x</sub>-2<b>b</b><sub>x</sub>+<b>c</b><sub>x</sub>)t<sup>2</sup>+2(<b>b</b><sub>x</sub>-<b>a</b><sub>x</sub>)t + <b>a</b><sub>x</sub>

, где v x - это x компонент v .

Согласно квадратной формуле,

     -2(<b>b</b><sub>x</sub>-<b>a</b><sub>x</sub>) ± 2√((<b>b</b><sub>x</sub>-<b>a</b><sub>x</sub>)<sup>2</sup> - <b>a</b><sub>x</sub>(<b>a</b><sub>x</sub>-2<b>b</b><sub>x</sub>+<b>c</b><sub>x</sub>))
t = -----------------------------------------
             (2<b>a</b><sub>x</sub>(<b>a</b><sub>x</sub>-2<b>b</b><sub>x</sub>+<b>c</b><sub>x</sub>))

     <b>a</b><sub>x</sub>-<b>b</b><sub>x</sub> ± √(<b>b</b><sub>x</sub><sup>2</sup> - <b>a</b><sub>x</sub><b>c</b><sub>x</sub>)
  = ----------------------
         <b>a</b><sub>x</sub>(<b>a</b><sub>x</sub>-2<b>b</b><sub>x</sub>+<b>c</b><sub>x</sub>)

Предполагая, что решение существует, добавьте это t обратно в исходное уравнение, чтобы получить другие компоненты B (t) при данном x.

часть 2

Вместо того, чтобы создавать вторую кривую Безье, которая совпадает с частью первой (я не чувствую, что сейчас хрустят символы), вы можете просто ограничить область вашего параметрического параметра подходящим подинтервалом [0, 1]. То есть используйте часть 1, чтобы найти значения t для двух разных значений x; назовите эти t-значения I и J. Нарисуйте B (t) для t ∈ [i, j]. Эквивалентно, нарисуйте B (t (j-i) + i) для t ∈ [0,1].

1 голос
/ 03 декабря 2017

Неправильное уравнение 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
...