10

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

我对这种方法的怀疑正确吗?我怎样才能更准确地完成这项任务?

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

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

4

3 回答 3

9

采用:

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,它绘制了光栅圆锥截面。

于 2010-06-11T19:12:23.777 回答
3

Bresenham(以他的画线算法而闻名)也有一个绘制椭圆的算法。您可以尝试谷歌bresenham ellipse

于 2010-06-11T19:35:48.467 回答
2

使用 Bresenham 方法绘制轴对齐的椭圆,但对绘制的椭圆应用剪切。您还需要修改轴的长度。剪切椭圆也是椭圆。此方法保留了 Bresenham 使用水平线段绘制填充椭圆的优势。为了做到这一点,您需要一个函数,它将椭圆的轴和旋转规范映射到一组不同的轴和剪切。可在http://scratch.mit.edu/projects/50039326/在线获得解决方案,并在http://scratch.mit.edu/discuss/topic/94194/讨论该方法和所涉及的数学描述

该映射是由 Nathan Dinsmore(麻省理工学院 Scratch 网站的用户 nXIII )发现的

于 2015-03-01T22:09:31.770 回答