2010-05-26 190 views
2

我一直在寻找遍及Web的方法来绘制矩形坐标中的椭圆,即左上角(x,y)和大小(宽度和高度)。我能找到的唯一的地方是基于Midpoint/Bresenham算法,我不能使用它,因为使用整数像素时,我会失去精度,因为这些算法使用中心点和径向。从矩形中绘制椭圆

椭圆必须限于矩形的坐标,所以如果我给它一个矩形,其宽度和高度是4(或任何偶数),我应该得到一个完全适合4x4矩形的椭圆,而不是一个将是5x5(就像那些算法给我的)。

有谁知道有什么办法可以做到这一点?

谢谢!

+0

只是要清楚,给出一个边框,您希望通过框围成的椭圆最大? – 2010-05-26 16:20:25

+0

这就是我想要的。 – 2010-05-26 16:42:45

回答

4

你不能得到宽度和高度(除以2)和矩形的中心,然后将它插入任何椭圆绘制例程作为其主要,次要轴和中心?我想我在这里一直没有看到问题。

+0

不,我不能这样做,因为对于均匀的宽度和高度,所得到的椭圆的宽度和高度将从原始的像素增加一个像素,因为它将像素绘制在中心+轴和中心轴上。我需要它完全在界限内,我的“像素”是32x32,所以这是非常明显的。 – 2010-05-26 16:44:36

+0

所以这个问题是亚像素的准确性和反映关于象限导致一些边缘覆盖。鉴于此,你应该能够存储一个非整数宽度高度(或至少一个固定点值与1位分数)来处理这个问题。 然后问题是发现或编写一个椭圆发生器,使用非整数宽度和高度。这不应该太难找到,但我没有看起来可能不是这样吗? – 2010-05-26 17:12:33

0

我发现这个问题的解决方案是绘制具有奇数尺寸的最接近的较小椭圆,但沿着偶数长度维度将像素拉开,重复中间像素。

这可以很容易通过绘制每一个像素时使用不同的中间点的象限来完成:

DrawPixel(midX_high + x, midY_high + y); 
DrawPixel(midX_low - x, midY_high + y); 
DrawPixel(midX_high + x, midY_low - y); 
DrawPixel(midX_low - x, midY_low - y); 

高值是ceil'ed中点,和低的值是地板中点。

的图像来说明,椭圆形宽度为15和16:

ellipses