“圆”神启动
如何在计算机上画圆
上一篇文章我们讲了如何用 DDA 和 Bresenham 算法画直线,其中提到 Bresenham 的中点决策思想可以推广到各种规则图形。画圆就是最经典的应用——中点画圆法。
圆的对称性:八分画圆法
画圆有一个画直线没有的优势:圆是高度对称的。圆心在原点时,如果

这意味着我们只需要计算出八分之一圆弧上的像素点,其余部分通过对称映射就能得到。大大减少了计算量。

八分画圆法:利用圆的对称性,只需生成 1/8 圆弧(通常取第二八分圆,即
从 逐步递增直到 的区域),其余部分通过坐标变换对称绘制。
中点画圆法
圆的隐式方程
圆心在原点、半径为
与 Bresenham 画直线一样,我们构造判别函数
对于任意一点
- 圆上:
- 圆外:
- 圆内:
中点决策
我们从
假设当前像素为
- E(East):
—— 不变 - SE(Southeast):
—— 减 1

考察两个候选点之间的中点
- 若
( 在圆内)→ 圆在 外侧 → E 更接近 → 选 E - 若
( 在圆外或圆上)→ 圆在 内侧 → SE 更接近 → 选 SE
这样判别式就出来了:
递推公式
情况 1: ,选 E
下一个中点为
情况 2: ,选 SE
下一个中点为
初始值
从
这样判别式的比较结果完全等价,而所有运算都是整数。
算法步骤
- 输入半径
。初始值 , , - 绘制
及其七个对称点 - 若
:
否则:, - 若
,重复步骤 2-4;否则结束
对称点的绘制规律:对于八分圆弧上的点
,同时画出 和 共 8 个点。当 或 时注意去重。
与画直线的对比
| Bresenham 画直线 | 中点画圆 | |
|---|---|---|
| 判别函数 | ||
| 决策方向 | E / NE | E / SE |
| 初始 |
||
| 对称性 | 无(直线不够对称) | 八分对称,只算 1/8 |
| 循环条件 |
可以看到,中点画圆法完全是 Bresenham 思想的延续——构造判别函数、中点决策、增量递推、整数化。区别在于圆的对称性让工作量降到原来的八分之一。
延伸阅读
- 椭圆:把圆的方程改为
,用同样的中点决策思想即可绘制椭圆。 - 任意圆心:以上推导假设圆心在原点。实际绘制时只需把计算出的
平移到目标圆心 即可。 - 填充圆:有了圆的边界,配合扫描线填充算法就能画出实心圆。
这次的插图来自画师luoyu