1

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

谢谢。

4

3 回答 3

0

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

调整扫描线填充算法以填充 E1 而不填充 E2。

于 2011-01-10T20:29:15.820 回答
0

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

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

假设它的宽度大于高度。(如果是相反的方式,您只需在绘制时翻转轴。)在这种情况下,您将为每个 y 位置绘制一个或两个水平线段。

  • 对于从外椭圆顶部到椭圆中心的每个 y 值:
    • 如果 y 高于内椭圆:
      • 从外椭圆左上象限点到外椭圆右上象限点画一条水平线段。
    • 否则(y 不高于内椭圆):
      • 画两条水平线段:
        • 一个从外椭圆的左上象​​限点到内椭圆的左上象​​限点。
        • 另一个从内椭圆的右上象限点到外椭圆的右上象限点。
    • 无论哪种方式,在椭圆的 x 轴上镜像所有绘图以渲染底部的两个象限。
于 2011-01-10T21:16:57.077 回答
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 pix,3 pix,5 pix。
于 2011-01-10T20:06:01.860 回答