椭圆厚度算法

时间:2011-01-10 19:27:59

标签: algorithm graphics ellipse

有人知道绘制厚度椭圆的算法吗? 我用Google搜索,但我发现只有算法绘制1像素宽的椭圆,如下所示: http://homepage.smc.edu/kennedy_john/belipse.pdf

感谢。

3 个答案:

答案 0 :(得分:0)

你需要多准确?

你想要真正的椭圆点在'x'像素宽度边界的近似中心吗?真正的椭圆点是内边缘吗?外边缘?

我问b / c你发现的绅士算法在可能的情况下努力坚持使用整数数学,所以我将附加整数算法的算法。

  • 内边缘:改变Plot4EllipsePoints子程序以绘制x像素而不是一个,其中新的x像素更远离椭圆中心。 2像素,例如:

    程序Plot4EllipsePoints(X,Y:longint);

    begin
       PutPixel(CX+X, CY+Y);          {point in quadrant 1}
       PutPixel(CX+X+1, CY+Y+1);          {point in quadrant 1}
       PutPixel(CX-X, CY+Y);          {point in quadrant 2}
       PutPixel(CX-X-1, CY+Y+1);          {point in quadrant 2}
       PutPixel(CX-X, CY-Y);          {point in quadrant 3}
       PutPixel(CX-X-1, CY-Y-1);          {point in quadrant 3}
       PutPixel(CX+X, CY-Y)           {point in quadrant 4}
       PutPixel(CX+X+1, CY-Y-1)           {point in quadrant 4}
    end;
    

    取自:http://homepage.smc.edu/kennedy_john/belipse.pdf

  • 外边缘:与内边缘相同,但更接近椭圆中心。
  • 居中:执行内侧边缘+ 外边缘。这将只有奇数厚度,1像素,3像素,5像素。

答案 1 :(得分:0)

设E1为半径r +厚度/ 2的椭圆,E2为半径为r的椭圆 - 厚度/ 2.

调整Scanline Fill Algorithm以填充E1而不填充E2。

答案 2 :(得分:0)

带有厚度的椭圆是指两个椭圆之间的差异,一个是两个轴加长了1/2厚度,另一个是它们缩短了1/2厚度?

如果是这样,那么您可以将链接的算法调整为扫描线填充算法。您要做的一件事就是只沿短轴工作。 (沿长轴工作也有效,但涉及冗余计算)。

让我们说它比它高得多。 (如果是另一种方法,只需在绘图时翻转轴。)在这种情况下,您将为每个y位置绘制一个或两个水平线段。

  • 对于从外椭圆顶部到椭圆中心的y的每个值:
    • 如果y高于内椭圆:
      • 从外椭圆的左上象​​限点到外椭圆的右上象限点绘制一条水平线段。
    • 否则(y不在内椭圆之上):
      • 绘制两个水平线段:
        • 一个从外椭圆的左上象​​限点到内椭圆的左上象​​限点。
        • 另一个从内椭圆的右上象限点到外椭圆的右上象限点。
    • 无论哪种方式,镜像所有绘制椭圆的x轴到 渲染底部的两个象限。