Как нарисовать эллипс с произвольной ориентацией пиксель за пикселем?

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

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

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

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

3 ответов


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

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

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

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

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


Bresenham (известный за его алгоритм рисования линий) также имеет алгоритм рисования эллипса. Вы можете попробовать google эллипс bresenham.


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

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