Рисование кривых Эрмита в OpenGL - PullRequest
9 голосов
/ 23 июня 2009

Как можно нарисовать кривые Эрмита с помощью OpenGL, есть ли встроенные функции? Я видел несколько примеров онлайн, которые показывают, как использовать оценщики для рисования кривых Безье, но не смог найти никакой информации для кривых Эрмита.

Ответы [ 3 ]

11 голосов
/ 22 октября 2009

Пусть вектор контрольных точек для вашего Безье будет [b0 b1 b2 b3], а для вашего Эрмита - [h0 h1 v0 v1] (v0 и v1 - производная / касательная в точках h0 и h1). Затем мы можем использовать матричную форму, чтобы показать преобразования:

Эрмит Безье

[b0] = 1 [ 3  0  0  0] [h0]
[b1]   - [ 3  0  1  0] [h1]
[b2]   3 [ 0  3  0 -1] [v0]
[b3]     [ 0  3  0  0] [v1]

(это точно так же, как в ответе Нааффа выше).

Безье к Эрмиту

[h0] = [ 1  0  0  0] [b0]
[h1]   [ 0  0  0  1] [b1]
[v0]   [-3  3  0  0] [b2]
[v1]   [ 0  0 -3  3] [b3]

Так что в матричной форме они, возможно, немного сложнее, чем нужно (в конце концов, код Нааффа был коротким и точным). Это полезно, потому что теперь мы можем очень легко выйти за пределы Эрмита.

В частности, мы можем ввести другую классическую кардинальную кубическую параметрическую кривую: кривую Кэтмалла-Рома. Он имеет контрольные точки [c_1 c0 c1 c2] (в отличие от кривых Безье, кривая проходит от второй до третьей контрольной точки, отсюда обычная нумерация от -1). Преобразования в Безье тогда:

Catmull-Rom к Безье

[b0] = 1 [ 0  6  0  0] [c_1]
[b1]   - [-1  6  1  0] [c0]
[b2]   6 [ 0  1  6 -1] [c1]
[b3]     [ 0  0  6  0] [c2]

Безье к Кэтмуллу-Рому

[c_1] = [ 6 -6  0  1] [b0]
[c0]    [ 1  0  0  0] [b1]
[c1]    [ 0  0  0  1] [b2]
[c2]    [ 1  0 -6  6] [b3]

Я тоже могу сделать пару Эрмит-Катмул-Ром, но они используются редко, поскольку Безье обычно является основным представлением.

6 голосов
/ 08 июля 2009

Как уже упоминал Стивен, вы можете преобразовать кубическую кривую Эрмита в кубическую кривую Безье. Это на самом деле довольно просто.

Типичная кубическая кривая Эрмита определяется двумя точками и двумя векторами:

  • P0 - начальная точка
  • V0 - производная при P0
  • P1 - конечная точка
  • V1 - производная при P1

Преобразование в кубический Безье просто:

B0 = P0
B1 = P0 + V0/3
B2 = P1 - V1/3
B3 = P1

Затем вы можете нарисовать свою кривую Безье, используя и оценщик, или любым другим способом.

1 голос
/ 23 июня 2009

Вы можете преобразовать любую кривую Эрмита в кривую Безье и затем нарисовать ее. Они просто определены с использованием двух разных баз в C3. Google был не очень полезен, и кажется, что это был бы общий вопрос, поэтому мы должны попытаться сделать ответ StackOverflow окончательным, возможно, с некоторым примером кода. Я вернусь завтра с большим.

...