计算和存储像素化椭圆

时间:2018-04-02 21:43:34

标签: matrix graphics ellipse

我想知道,是否可以创建一个具有宽度和高度输入的函数(任意语言)。

然后,该函数将计算最大椭圆,该椭圆将适合给定的尺寸,并将其存储在矩阵中,例如这两个例子;

enter image description here enter image description here

在左边的例子中,宽度为14,高度为27,白色部分为椭圆。

在右边的例子中,宽度为38,高度为21,再次,白色部分是椭圆。

当然,如果它们是椭圆的一部分,黑色和白色部分可以看作是真/假值。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。该过程称为椭圆光栅化。这里有几种方法可以做到:

让我们的图片具有xs,ys分辨率,因此中心(x0,y0)和semiaxises a,b是:

x0=xs/2
y0=y2/2
a =x0-1
b =y0-1 
  1. 使用椭圆方程式

    所以2个嵌套的for循环+ if条件决定你是在椭圆内部还是外部。

    for (y=0;y<ys;y++)
     for (x=0;x<xs;x++)
      if (((x-x0)*(x-x0)/(a*a))+((y-y0)*(y-y0)/(b*b))<=1.0) pixel[y][x]=color_inside;
       else pixel[y][x]=color_outside;
    

    通过预先计算方程的各个部分,你可以通过预先计算方程的各个部分来优化这一点,因为在每次x次迭代时,有些只是计算一次,而在每次y次迭代时只计算一次。也最好是乘法而不是分开。

  2. 使用参数椭圆方程

    x(t) = x0 + a*cos(t)
    y(t) = y0 + b*sin(t)
    t = <0,2.0*M_PI>  // for whole ellipse
    

    所以一个for循环创建象限坐标,并仅使用水平线或仅垂直线为象限的3个镜子填充内外线。然而,这种方法需要一个缓冲区来存储一个象限的圆周点。

  3. 使用Bresenham椭圆算法

  4. 使用任何Circle算法并拉伸到椭圆

    因此,只需使用xs,ys渲染圈中较小分辨率的方形区域,然后再缩回xs,ys。如果在光栅化期间不进行拉伸,则可能会创建工件。在这种情况下,最好使用较大的分辨率并向下拉伸,但这比较粗糙。