Рисование Эрмитовых кривых в OpenGL

Вы можете использовать эту библиотеку для индикатора выполнения закругленных углов


Gradle

compile 'com.akexorcist:RoundCornerProgressBar:2.0.3'

https://github.com/akexorcist/Android-RoundCornerProgressBar

9
задан hippietrail 26 September 2019 в 09:03
поделиться

3 ответа

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

1
ответ дан 4 December 2019 в 11:43
поделиться

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

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

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

Преобразование в кубическую кривую Безье выполняется просто:

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

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

6
ответ дан 4 December 2019 в 11:43
поделиться

Пусть вектор контрольных точек для вашего Безье будет [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). Тогда преобразования в Безье таковы:

11
ответ дан 4 December 2019 в 11:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: