Как нарисовать эллипс с произвольной ориентацией пиксель за пикселем? - PullRequest
9 голосов
/ 11 июня 2010

Я должен нарисовать эллипс произвольного размера и ориентации пиксель за пикселем. Кажется довольно простым нарисовать эллипс, у которого главная и второстепенные оси совпадают с осями x и y, но вращение эллипса на произвольный угол кажется более хитрым. Изначально я думал, что это может помочь нарисовать необращенный эллипс и применить матрицу вращения к каждой точке, но кажется, что это может привести к ошибкам при округлении, и мне нужна довольно высокая точность.

Правильно ли мое подозрение относительно этого метода? Как я могу выполнить эту задачу более точно?

Я программирую на C ++ (хотя это не должно иметь большого значения, так как это более ориентированный на алгоритм вопрос).

Редактировать: как указывал Дэвид, я думаю, мне действительно интересно, как сделать пиксельную интерполяцию.

Ответы [ 3 ]

9 голосов
/ 11 июня 2010

Использование:

x = X cos(a) - Y sin(a)
y = Y cos(a) + X sin(a)

Где a - угол поворота против часовой стрелки, (x, y) - новые координаты, (X, Y) - старые.

Вы должны использовать поплавки для сохранения точности. Просто пройдите каждую точку, примените трансформацию и вуаля.

Редактировать: после некоторого поиска вот код от Microsoft: http://research.microsoft.com/en-us/um/people/awf/graphics/bres-ellipse.html, который рисует растровые конические сечения.

3 голосов
/ 11 июня 2010

У Брезенхэма (известного своим алгоритмом рисования линий ) также есть алгоритм для рисования эллипса.Вы можете попробовать Google Брезенхэм эллипс .

1 голос
/ 02 марта 2015

Используйте метод Брезенхэма для рисования выровненных по оси эллипсов, но примените сдвиг к нарисованному эллипсу. Вам также нужно будет изменить длину осей. Срезанный эллипс также является эллипсом. Этот метод сохраняет преимущество Брезенхэма при рисовании заполненных эллипсов с использованием горизонтальных отрезков. Для этого вам нужна функция, которая отображает спецификацию эллипса с точки зрения осей и поворота на другой набор осей и сдвиг. Решение доступно онлайн на http://scratch.mit.edu/projects/50039326/ с обсуждением метода и описанием математики на http://scratch.mit.edu/discuss/topic/94194/

Картография была обнаружена Натаном Динсмором (пользователь nXIII на сайте MIT Scratch )

...