【问题标题】:Calculating and storing pixelated ellipse计算和存储像素化椭圆
【发布时间】:2018-04-02 21:43:33
【问题描述】:

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

然后,此函数将计算适合其给定维度的最大椭圆,并将其存储在矩阵中,例如这两个示例;

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

在右侧示例中,宽度为 38,高度为 21,其中白色部分是椭圆。

当然,如果黑白部分是否是椭圆的一部分,则可以将其视为真/假值。

【问题讨论】:

  • 你在找this之类的椭圆绘制算法吗?

标签: matrix graphics ellipse


【解决方案1】:

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

让我们的图像具有xs,ys 分辨率,因此中心(x0,y0) 和半轴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. 使用任何圆形算法并拉伸为椭圆

    因此,只需使用来自xs,ys 的较小分辨率的正方形区域渲染圆,然后拉伸回xs,ys。如果您在光栅化期间不拉伸,则可能会创建工件。在这种情况下,最好使用更大的分辨率并向下拉伸,但这会更慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 2014-12-11
    • 2020-12-26
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多