2011-01-10 66 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。