Я должен потянуть эллипс произвольного размера и ориентации попиксельно. Кажется довольно легким потянуть эллипс, главные и незначительные оси которого выравниваются с осями X и Y, но вращение эллипса произвольным углом кажется более хитрым. Первоначально я, хотя это могло бы работать, чтобы потянуть неповернутый эллипс и применить матрицу вращения к каждой точке, но кажется, как будто это могло вызвать ошибки, делаю к округлению, и мне нужна довольно высокая точность.
Корректно мое подозрение об этом методе? Как я мог выполнить эту задачу более точно?
Я программирую в C++ (хотя это не должно действительно иметь значения, так как это - более ориентированный на алгоритм вопрос).
Править: как David указал, я предполагаю, что могу действительно задаваться вопросом, как сделать пиксельную интерполяцию.
Использование:
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 , который рисует растровые конические сечения.
Брезенхэм (известный своим алгоритмом рисования линий ) также имеет алгоритм рисования эллипса. Вы можете попробовать погуглить эллипс Брезенхэма .