DongGu
“圆”神启动

“圆”神启动

如何在计算机上画圆

上一篇文章我们讲了如何用 DDA 和 Bresenham 算法画直线,其中提到 Bresenham 的中点决策思想可以推广到各种规则图形。画圆就是最经典的应用——中点画圆法

圆的对称性:八分画圆法

画圆有一个画直线没有的优势:圆是高度对称的。圆心在原点时,如果 在圆上,那么通过符号组合可以得到另外 7 个也在圆上的点:

alt text

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

alt text

八分画圆法:利用圆的对称性,只需生成 1/8 圆弧(通常取第二八分圆,即 逐步递增直到 的区域),其余部分通过坐标变换对称绘制。


中点画圆法

圆的隐式方程

圆心在原点、半径为 的圆的方程为:

与 Bresenham 画直线一样,我们构造判别函数

对于任意一点

  • 圆上
  • 圆外
  • 圆内

再次充当了”指南针”的角色,告诉我们当前像素在圆的内部还是外部。

中点决策

我们从 开始,沿顺时针方向画第二八分圆( 递增, 递减,)。

假设当前像素为 ,下一个 必定是 ,而 有两种候选:

  • E(East) —— 不变
  • SE(Southeast) —— 减 1

alt text

考察两个候选点之间的中点 ,判断它在圆内还是圆外:

  • 在圆)→ 圆在 外侧 → E 更接近 → 选 E
  • 在圆或圆上)→ 圆在 内侧 → SE 更接近 → 选 SE

这样判别式就出来了:

递推公式

情况 1:,选 E

下一个中点为

情况 2:,选 SE

下一个中点为

初始值

开始,第一个中点为

包含小数。但与直线算法一样,我们可以把判别式转化为纯整数运算——因为 的每次更新都是整数增量,小数部分始终是 。只需令 并改为判断 即可:

这样判别式的比较结果完全等价,而所有运算都是整数。

算法步骤

  1. 输入半径 。初始值
  2. 绘制 及其七个对称点

  3. 否则:
  4. ,重复步骤 2-4;否则结束

对称点的绘制规律:对于八分圆弧上的点 ,同时画出 共 8 个点。当 时注意去重。


与画直线的对比

Bresenham 画直线 中点画圆
判别函数
决策方向 E / NE E / SE
初始
递推
递推
对称性 无(直线不够对称) 八分对称,只算 1/8
循环条件

可以看到,中点画圆法完全是 Bresenham 思想的延续——构造判别函数、中点决策、增量递推、整数化。区别在于圆的对称性让工作量降到原来的八分之一。


延伸阅读

  • 椭圆:把圆的方程改为 ,用同样的中点决策思想即可绘制椭圆。
  • 任意圆心:以上推导假设圆心在原点。实际绘制时只需把计算出的 平移到目标圆心 即可。
  • 填充圆:有了圆的边界,配合扫描线填充算法就能画出实心圆。

这次的插图来自画师luoyu

图片地址:https://www.pixiv.net/artworks/116912166

本文作者:DongGu
本文链接:https://donggu.xyz/2026/05/11/图形学入门/“圆”神启动/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可