2011-01-10 150 views

回答

0

通过一个厚度椭圆你是指两个椭圆之间的差异,其中两个轴已经延长了1/2厚度,另一个是它们缩短了1/2的厚度?

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

比方说它比它更宽。 (如果在绘图时反其道而行,则只需翻转轴。)在这种情况下,您将为每个y位置绘制一个或两个水平线段。

  • 用于Y的从外椭圆的顶部,以椭圆的中心的每个值:
    • 如果y为上述内椭圆:
      • 从左上象限绘制一个水平线段将外椭圆指向外椭圆上的右上象限点。
    • 品(y为不高于内椭圆):
      • 画两个水平线段:
        • 一个从所述外椭圆的左上象​​限指向内的左上象限点椭圆。
        • 另一个从内部椭圆的右上象限点到外部椭圆的右上象限点。
    • 无论哪种方式,镜所有绘制在椭圆的x轴到 使底部的两个象限。
0

你需要多准确?

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

我问b/c绅士的算法你发现尽可能坚持整数数学,所以我会追加到他的算法与整数工作以及。

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

    procedure Plot4EllipsePoints(X,Y:longint); http://homepage.smc.edu/kennedy_john/belipse.pdf

  • 外侧边缘:

    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; 
    

    取自相同内侧边缘,但更接近椭圆中心。

  • 居中:执行内边缘+ 外边缘。这将只有奇怪的厚度,1像素,3像素,5像素。
0

设E1是半径r +厚度/ 2的椭圆形和E2半径r的椭圆 - 厚度/ 2。

适应Scanline Fill Algorithm填补E1无填充E2。