Выбор шага для рисования кривой Безье

Кривая Безье является параметрической кривой, а это означает, что существует параметр t, по которому можно вычислить многочлены, чтобы узнать положения точек, лежащих на кривой.

Полиномы для некоторых распространенных случаев можно найти по адресу en.wikipedia.org/wiki/B% C3%A9zier_curve#Specific_cases

Чтобы нарисовать кривую Безье на экране, можно вычислить полиномы от 0 до 1 при постоянном увеличении t на крошечные маленькие шаги. Однако это было бы очень расточительно, так как в общем случае параметр «пространство» не соответствует экранному «пространству», т.е. на один пиксель может приходиться несколько шажков.

Мой вопрос: как найти наименьший шаг, который увеличивает декартово расстояние от предыдущей точки хотя бы на 1 пиксель?

Другими словами: я хотел бы нарисовать кривую Безье на экране. Как выбрать (равномерный) шаг, на который должно расти t, чтобы я никогда не рисовал на один пиксель больше одного раза? Я не против "дырок", когда t растет слишком быстро, просто не хочется перерисовывать уже нарисованные пиксели.

Изменить

Под «как найти» я подразумеваю O(1). Да, я мог бы использовать алгоритм де Кастельжау, но я надеялся, что есть способ "угадать "оптимальный t шаг быстро.


person Ecir Hana    schedule 09.07.2015    source источник
comment
Я не думаю, что единый шаг - это то, что вам нужно. Пока ваша кривая охватывает множество пикселей, я бы нашел производную по отношению к t в каждой точке, а затем увеличил t на величину, дающую производную по крайней мере для одного пикселя (либо по x, либо по y). Если кривая быстро изгибается относительно размера пикселя, это не сработает.   -  person jozxyqk    schedule 10.07.2015
comment
Рассмотрите возможность поддержки area51.stackexchange.com/proposals/74985/computer-graphics.   -  person lhf    schedule 10.07.2015
comment
@lhf Я только что сделал, спасибо за предложение. И спасибо за Луа тоже!   -  person Ecir Hana    schedule 12.07.2015


Ответы (1)


Комментарий выше (jozxyqk) дает вам подсказку. Я бы попробовал рекурсивное двоичное деление сплайнового рисунка.

Допустим, вы начинаете с грубого разрешения пространства параметров (delta_t = 0,1), что дает вам 11 точек на сплайновой кривой s , s(t=0), с(t=0,1), ..., с(t=0,9), с(t=1). Вычислить расстояние между s(t_i) и s(t_i+1). Если это > 1, то сделайте двоичное подразделение между этими двумя точками. И так далее...

Но, честно говоря, я думаю, что быстрее вычислить все точки с более высоким разрешением без каких-либо рекурсивных циклов или подразделений. Особенно, если вы используете многопоточное программирование.

person Christian    schedule 10.07.2015
comment
Спасибо! Но мне нужно найти наименьший шаг в O (1). Я сделал вопрос более явным. - person Ecir Hana; 10.07.2015