如何逐个像素地绘制具有任意方向的椭圆?

时间:2010-06-11 19:07:19

标签: algorithm graphics shapes ellipse

我必须逐个像素地绘制任意大小和方向的椭圆。绘制椭圆的主轴和副轴与x轴和y轴对齐似乎很容易,但是将椭圆旋转任意角度似乎比较棘手。最初我虽然可能会绘制未旋转的椭圆并将旋转矩阵应用于每个点,但似乎可能导致错误进行舍入,我需要相当高的精度。

我怀疑这种方法是否正确?我怎样才能更精确地完成这项任务?

我正在使用C ++进行编程(尽管这不是真的很重要,因为这是一个更加面向算法的问题)。

编辑:正如大卫指出的那样,我想我可能真的想知道如何进行像素插值。

3 个答案:

答案 0 :(得分:9)

使用:

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绘制了更快的圆锥曲线。

答案 1 :(得分:3)

Bresenham(以他的line drawing algorithm而闻名)也有绘制椭圆的算法。您可以尝试google bresenham ellipse

答案 2 :(得分:1)

使用Bresenham绘制轴对齐椭圆的方法,但对绘制的椭圆应用剪切。您还需要修改轴的长度。 A sheared ellipse is also an ellipse.此方法保留了Bresenham使用水平线段绘制填充椭圆的优势。为了做到这一点,你需要的是将椭圆的规格根据轴和旋转映射到不同的轴和剪切的功能。我们可以在http://scratch.mit.edu/projects/50039326/在线提供解决方案,并讨论该方法,description of the math involved位于http://scratch.mit.edu/discuss/topic/94194/

映射是由Nathan Dinsmore发现的(用户nXIII在MIT Scratch site