圆上有序三点,是顺时针还是逆时针?
圆上取三个点,按 P₁ → P₂ → P₃ 的顺序连起来,这一圈是顺时针 (CW) 还是 逆时针 (CCW)?「在圆上」其实只是顺手保证了三点必不共线——真正的判定对平面上任意有序三点都成立,而且只用一个数:从 P₁ 引出的两个向量的叉积 (cross product) 的符号。这就是计算几何里到处都在用的 orientation test。下面拖动三个点,实时看叉积怎么算出来、又怎么定方向。
记两个从 P₁ 出发的向量 v = P₂ − P₁、w = P₃ − P₁,它们的二维叉积是一个标量:cross = vₓ·w_y − v_y·wₓ = (x₂−x₁)(y₃−y₁) − (y₂−y₁)(x₃−x₁)。它正好等于三角形 P₁P₂P₃ 有向面积的两倍(shoelace 鞋带公式)。符号就是答案,0 表示三点共线。至于「正号到底是顺还是逆」——取决于坐标系的 y 轴朝哪,这正是下面要澄清的常见误区。
1 · 一、为什么「叉积的符号」就是转向
两种等价的理解,挑顺手的记:
其一,它是「有向面积」。 cross 等于三角形 P₁P₂P₃ 有向面积的两倍。有向面积的正负,按约定就对应顶点的环绕方向——逆时针为正、顺时针为负(这也是多边形面积 shoelace 公式天然带符号、可用来判断整个多边形朝向的原因)。
其二,它是「左转还是右转」。 站在 P₁ 沿着 P₁→P₂ 的方向看,叉积的符号告诉你第三点 P₃ 落在这条射线的左侧还是右侧:在左侧 → 这一圈在往逆时针绕,在右侧 → 顺时针。从 v「掰」到 w 是朝逆时针转(转角 0~180°)叉积就为正,朝顺时针转就为负。
2 · 二、最常见的误区:屏幕的 y 轴是向下的 ⚠️
上面那句「正号 = 逆时针」,只在数学课本的坐标系(y 轴向上)里成立。而 Canvas、SVG、几乎所有屏幕坐标的 y 轴是向下的——整个平面相当于上下翻了一次,于是视觉上的顺逆,和叉积符号的对应关系正好反过来。
把上面的坐标系下拉在两个选项间切换:同一张图、同一组点,叉积会变号、判定规则那句话也跟着变号——两次变号一抵消,你眼睛看到的顺 / 逆始终不变。这就是关键:视觉结论是不变量,会翻的只是「符号 + 规则」这对中间量。公式一个字都不用改,要小心的只是最后下结论时问清楚自己用的是哪套 y 轴。
3 · 三、共线的边界:cross = 0
当 cross = 0,三点共线,既不顺也不逆。圆上三个互不相同的点不可能共线(所以本页拖不出 0,除非把两点拖到几乎重合);但一般的三点判定里,cross == 0 是必须单独处理的退化情形——浮点下还要配一个容差 ε,否则「差一点点共线」会被误判成某个方向。
4 · 四、它用在哪里
凸包 (convex hull):Graham scan / Andrew's monotone chain 每一步都靠 orientation test 判断「该不该右拐」来决定保留还是弹出顶点。线段相交:两段是否相交,归结为四次「点在某段哪一侧」的叉积符号比较。点在三角形 / 多边形内:看它相对每条有向边是否始终在同一侧。多边形朝向与面积:shoelace 的符号告诉你顶点是顺还是逆时针存的 (CW/CCW),GIS、SVG fill-rule、三角化都要先知道这个。游戏 / 图形:背面剔除 (back-face culling)
就是用三角形顶点的环绕方向判断它是否朝向相机。一个叉积、几句判断,支撑起以上这一系列应用。
5 · 🔗 相关链接
- Curve orientation · Wikipedia — 用三个点(或多边形顶点)的有向面积 / 叉积符号判断曲线是顺时针还是逆时针,含坐标系朝向的讨论。
- Cross product · Wikipedia — 二维「叉积」是三维叉积的 z 分量;它的符号即旋转方向、绝对值即平行四边形面积。
- Orientation of 3 ordered points · GeeksforGeeks — 本页对应的经典写法:一个 判 CW/CCW/共线,及其在凸包、线段相交里的用法。
- Graham scan · Wikipedia — 凸包算法:整趟扫描就是反复对相邻三点做 orientation test,非左转就弹栈。