计算机图形学-圆生成算法

由于圆是经常使用的几何图形,大多数图形库中都包含绘制圆和圆弧的方法。
下面内容主要阐述它们背后的实现思想。

圆的定义

圆可以定义为距中心点 $(x_c,y_c)$ 距离为给定值 r 的点集。

笛卡尔坐标系的勾股方程法

在笛卡尔坐标系中,由勾股定理圆的方程可以表示为:

$$ (x - x_c)^2 + (y - y_c)^2 = r^2 $$

利用这个方程,可以沿 x 轴,从 $x_c - r$ 到 $ x_c + r$ 按单位步长计算 y 坐标,从而
得到:
$$ y = y_c \pm \sqrt{r^2 - (x - x_c)^2}$$

优点

易于理解和实现

缺点

  • 计算复杂
  • 生成的像素点间隔不一致

极坐标系的参数方程法

以极坐标参数方程来表示圆:
$$ x = x_c + rcos\theta;y = y_c + rsin\theta $$

以固定角度为步长,可以利用沿圆周的等距点来绘制出圆。

为了减少计算量,可以取较大的角度作为步长并用直线段来连接相邻两点来逼近圆的路径。
一般取角度步长值为 $ 1/r $ (为什么?因为 弧长/半径 = 弧度,取弧长为1即可)
可以获得较连续的边界,并且像素间隔大约为一个单位。

优点

解决了笛卡尔算法像素间隔不等问题

缺点

三角函数的计算非常耗时

中点画圆算法

该算法主要利用了圆的对称性,假设知道了圆1/8部分的点集,其它部分的点集就可以根据对称性计算出来,
并且不需要做任何运算,只需要变化x,y坐标顺序或符号。

给定圆的圆心不一定在原点处,为了简化运算,假设圆的圆心在原点处进行计算,然后只需对计算后的点作
平移就可以得出实际的点。

所以问题简化为考虑1/8圆,并且圆心在坐标原点,半径为 r 的圆。

计算方法仍然模拟光栅画线算法。基本思想是检验两待选像素间的中间位置以确定该中点是在圆内还是在圆外。

假设取第一象限上半部1/8圆,设置绘制起点坐标为$(0,r)$。
引入判别方程:
$$ f(x,y) = x^2 + y^2 - r^2 $$

  • 若 f(x,y) > 0,则 (x,y) 在圆外;
  • 若 f(x,y) = 0,则 (x,y) 在圆上;
  • 若 f(x,y) < 0,则 (x,y) 在圆内;

假设在$(x_k,y_k)$处画了一个像素,下一步就是要确定是位置$(x_k + 1,y_k)$还是$(x_k + 1,y_k-1)$
更逼近圆。计算方法是取 $y_k$ 和 $y_k-1$ 的中点 $ y_k - {\\frac 12}$计算其位置:
$$ p_k = f(x_k+1,y_k-{\frac 12}) = (x_k+1)^2 + (y_k-{\frac 12})^2 -r^2 $$

  • 若 p_k > 0,则中点在圆外,下一个点应取 $(x_k + 1,y_k-1)$
  • 若 p_k = 0,则中点在圆上,下一个点理论上都能取,这里定为$(x_k + 1,y_k-1)$
  • 若 p_k < 0,则中点在圆内,下一个点应取 $(x_k + 1,y_k)$

算法过程可归纳为以下几步:

  1. 假设圆的圆心为$(x_c,y_c)$,半径为r,确定第一个点(0,r)
  2. 0 + 1,计算判别式$p_0$的值,得到第二个点 (1,r)(1,r-1)
  3. 计算其他七个八分圆坐标
  4. 将以原点为圆心的坐标平移到以$(x_c,y_c)$为圆心的坐标
  5. 绘制坐标点
  6. 重复2、3、4、5步

优点

整数运算,效率高,生成的圆与原图逼真度高。