Задать вопрос
1eqinfinity
@1eqinfinity
sound design, music, DSP

Какую кривую эффективнее построить на множестве [0; 1] — Безье, нецелочисленную степенную или гиперболу?

Добрый день!

Ищу наиболее эффективный алгоритм приближенного вычисления параметризируемой кривой на множестве [0; 1], отмеченной на рисунке оранжевым цветом:
124f611d8d37439ba633a4c53181ce23.png
Важна возможность менять кривизну, получая очень большую и очень маленькую производную на концах, или просто иметь линейное приращение.
На ум приходят
- возведение в степень с показателем, меняющимся примерно в границах [0,1 ; 10]
- кривая Безье
- масштабированная и смещенная гипербола
Возможно, существуют и альтернативные варианты, но я их не нашел.
Какой из алгоритмов вычисления этих кривых эффективнее?
Кривая вычисляется раз в секунду, в каждой кривой примерно 50 000 точек.
  • Вопрос задан
  • 2774 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
@Koss1024
Здесь как родная ложится Рациональная кривая Безье второго порядка

Базис
b0(t) = (1-t)^2
b1(t) = 2*(1-t)
b2(t) = t^2

Точки
P0 = (0, 0)
P1 = (1, 0) (или 0,1)
P2 = (1, 1)

Тогда обычная кривая имеет вид: B(t) = sum_by_i(b(i) *P(i))

Рациональная B(t) = sum_by_i(b(i) * P(i) * w(i) ) / sum_by_i(b(i, w(i))

Где w(i) это веса вершин установив значение w(1) > 1 вы получите свой результат

На пальцах кривая стремится приблизиться к вершине с весом > 1 и наоборот
Ответ написан
Комментировать
begemot_sun
@begemot_sun
Программист в душе.
x(t) = t * log(a*t)
y(t) = t * log(b*t)

t изменяется [0;1].

В зависимости от a и b получаете нужный вид кривой. В частном случае a=b.
Ответ написан
Субъективно гипербола выглядит наиболее эффективно, тем более что позиция изменения второй координаты вычисляется аналитически, что позволяет прорисовывать "хвостики" весьма быстро.
Насколько серьезно Вы готовы озадачиться ускорением ?
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Если надо, чтобы кривую можно было провести через любую точку квадрата, то гипербола, пожалуй, лучше. Уравнение выглядит привлекательно: (a^2-1)*x*y+(x-a^2*y)=0, найти значение a для любой точки, через которую проходит кривая, несложно. Немного сложнее её нарисовать, чтобы точки были расположены с нужной густотой.
Я думал над чем-нибудь вроде y^a+(1-x)^a=1, но оно вряд ли подойдёт, хоть и симметрично: семейства кривых при a<1 и a>1 получаются не симметричными друг другу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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