我需要逐像素绘制任意大小和方向的椭圆。 绘制主轴和副轴与x和y轴对齐的椭圆似乎很容易,但是将椭圆旋转一个任意角度似乎更加棘手。 最初我认为可以绘制未旋转的椭圆并将旋转矩阵应用于每个点,但似乎由于四舍五入可能会引起误差,并且我需要相当高的精度。
我的这种方法的怀疑是正确的吗? 我如何更准确地完成此任务?
我正在使用C ++编程(尽管这不应该真正重要,因为这是一个更注重算法的问题)。
编辑:正如David指出的那样,我想知道如何进行像素插值。
使用:
x = X cos(a) - Y sin(a)
y = Y cos(a) + X sin(a)
其中a
是逆时针旋转的角度,(x, y)
是新坐标,(X, Y)
是旧坐标。
为了保持精度,应该使用浮点数。只需遍历每个点,应用变换即可。
编辑:在搜索后,这是微软的一些代码:http://research.microsoft.com/en-us/um/people/awf/graphics/bres-ellipse.html,可以绘制光栅化的圆锥曲线。
使用Bresenham方法绘制轴对齐椭圆,但是对绘制的椭圆进行剪切。您还需要修改轴的长度。剪切椭圆也是椭圆。 这种方法保留了Bresenham优势,可以使用水平线段绘制填充椭圆。为此,您需要一个将椭圆的轴和旋转规范映射到不同轴和剪切的函数。此处提供了在线解决方案,其中包括有关该方法的讨论和涉及的数学描述。http://scratch.mit.edu/discuss/topic/94194/
这个映射关系是由Nathan Dinsmore(MIT Scratch网站上的用户nXIII)发现的。