我想知道,是否可以创建一个具有宽度和高度输入的函数(任意语言)。
然后,该函数将计算最大椭圆,该椭圆将适合给定的尺寸,并将其存储在矩阵中,例如这两个例子;
在左边的例子中,宽度为14,高度为27,白色部分为椭圆。
在右边的例子中,宽度为38,高度为21,再次,白色部分是椭圆。
当然,如果它们是椭圆的一部分,黑色和白色部分可以看作是真/假值。
答案 0 :(得分:1)
是的,这是可能的。该过程称为椭圆光栅化。这里有几种方法可以做到:
让我们的图片具有xs,ys
分辨率,因此中心(x0,y0)
和semiaxises a,b
是:
x0=xs/2
y0=y2/2
a =x0-1
b =y0-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
次迭代时只计算一次。也最好是乘法而不是分开。
使用参数椭圆方程
x(t) = x0 + a*cos(t)
y(t) = y0 + b*sin(t)
t = <0,2.0*M_PI> // for whole ellipse
所以一个for
循环创建象限坐标,并仅使用水平线或仅垂直线为象限的3个镜子填充内外线。然而,这种方法需要一个缓冲区来存储一个象限的圆周点。
使用Bresenham椭圆算法
使用任何Circle算法并拉伸到椭圆
因此,只需使用xs,ys
渲染圈中较小分辨率的方形区域,然后再缩回xs,ys
。如果在光栅化期间不进行拉伸,则可能会创建工件。在这种情况下,最好使用较大的分辨率并向下拉伸,但这比较粗糙。