Как оптимально построить параметрическую непрерывную кривую?

Допустим, у нас есть параметрическая кривая, например круг:

  x = r * cos(t)
  y = r * sin(t)

Мы хотим построить кривую на экране таким образом, чтобы:

  • каждый пиксель закрашивается только один раз (оптимальная часть)
  • для каждого (x, y), лежащего на кривой (непрерывной части), есть окрашенный пиксель.

Если мы просто нанесем (x, y) для каждого t в [t1, t2], эти условия не будут выполнены.

Я ищу общее решение для любой параметрической кривой.


person Hristo Hristov    schedule 16.11.2010    source источник
comment
Как построить график (x, y) = (1,5, 1,5)? Вы рисуете пиксели (1, 1), (1, 2), (2, 1), (2, 2)?   -  person Christoffer Hammarström    schedule 16.11.2010
comment
Округлено до ближайшего целого числа, поэтому просто (2, 2)   -  person Hristo Hristov    schedule 16.11.2010


Ответы (2)


Общего решения, которое на 100% удовлетворяет вашим критериям, не существует.

Поэтому нам приходится идти на компромисс.

Обычно это решается, начиная с размера шага (обычно это параметр вашей процедуры), этот размер шага может быть разделен на части, вызванные эвристикой, например:

  • разделить, когда расстояние, пройденное сегментом, больше, чем заданное расстояние (например, один пиксель)

  • подразделять, когда направление кривой меняется слишком сильно

Или их комбинация.

Обычно также дается некоторый предел для подразделения, чтобы избежать вечности.

Многие системы, которые предлагают параметрическое построение графиков, начинают с некоторых изменяемых настроек по умолчанию для эвристических параметров и размера шага. Пользователь может адаптировать их, если кривая недостаточно «хорошая» или если она занимает слишком много времени.

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

person Peer Stritzinger    schedule 16.11.2010

Ознакомьтесь с сплайнами Безье.

person Jonas Elfström    schedule 16.11.2010
comment
Сплайны Безье можно использовать для построения наборов точек, но если у вас есть параметрическая функция, почти всегда лучше добавить больше шагов, чем сглаживать промежутки. - person Peer Stritzinger; 16.11.2010