项目背景
在计算几何(Computational Geometry)领域中,**凸包(Convex Hull)**是一个极其基础、同时又非常核心的问题。
简单来说,给定平面上的一组点,凸包就是:
能够包住所有点的、最小的凸多边形
直观理解:
- 想象在桌面上撒一把钉子
- 用一根橡皮筋把所有钉子圈起来
- 橡皮筋形成的形状,就是这些点的凸包
凸包在工程与科研中有大量实际应用,例如:
- 计算机图形学(碰撞检测、可视区域)
- GIS / 地图系统(区域边界计算)
- 图像处理(目标轮廓提取)
- 机器人路径规划
- 模式识别与机器学习
- 游戏引擎中的物理系统
在众多凸包算法中,**Graham Scan(葛立恒扫描法)**是:
- 最经典
- 最适合教学
- 数学与工程结合度极高
的一种算法。
它由 Ronald Graham 在 1972 年提出,是第一个时间复杂度达到 O(n log n) 的凸包算法,至今仍是计算几何入门必学内容。
项目需求
本项目的目标是:
使用 Go 语言完整实现 Graham Scan(葛立恒扫描法)算法,计算二维平面点集的凸包。
具体需求如下:
- 功能需求
- 输入:二维平面上的一组点
(x, y) - 输出:按逆时针顺序排列的凸包顶点集合
- 支持任意数量的点(≥ 3)
- 输入:二维平面上的一组点
- 算法要求
- 严格遵循 Graham Scan 算法流程
- 使用叉积判断转向(左转 / 右转)
- 正确处理共线点情况
- 工程要求
- 使用 Go 标准库
- 结构清晰、注释完整
- 算法步骤清晰可追踪
- 教学要求
- 明确解释几何意义
- 每一步都有直觉说明
- 便于板书推导与代码对照
核心技术原理
1. 二维点的表示
在 Go 中,二维点通常用结构体表示:
type Point struct {
X int
Y int
}
使用整数而非浮点数的好处是:
- 避免精度误差
- 叉积计算更安全
- 教学更直观
2. 向量叉积(Cross Product)
Graham Scan 的核心判断依据是向量叉积的符号。
给定三个点 O, A, B,定义向量:
OA = A - O
OB = B - O
叉积(二维)结果:

