一条闭曲线,把平面分成两块
这句话听上去是废话,他花了七页去证;而今天每一个图形库判「点在不在多边形里」,用的正是他数交点的那一段。
一条自己不相交的闭曲线,把平面分成内外两块——谁都觉得显然,可「显然」在十九世纪末已经不够用了:同一批人刚刚造出处处没有切线的连续曲线(馆里魏尔斯特拉斯那一页那条),谁也不敢说一条只被要求连续的闭曲线还老实。若尔当是第一个认真去证的人。他的办法是把曲线换成多边形:在曲线上取一串无限接近的点,作内接多边形 P;P 可能有重点,就顺着走一圈、碰到重点就把那个圈整个去掉,反复去到没有重点为止,得到 P′。接着他造出内外两串多边形把曲线夹住,于是平面上的点只有三种:从某一项起落在外多边形之外的、从某一项起落在内多边形之内的、以及夹在所有这些多边形之间的——第三种「到曲线的距离小于任何指定的量」,也就在曲线上。「于是证明了:任何连续闭曲线把平面分成两个区域,一个在外,一个在内,而后者不会缩成零,因为它含着一个半径有限的圆。」这条定理最早印在 1887 年《分析教程》第一版第三卷末尾的「补编」里(第 587–594 页),1893 年第二版全书重写时被搬到了第一卷第一章。要分开写的是另外两件事。一是「他的证明对不对」:韦布伦 1905 年说它「让许多数学家不满意,它在简单多边形这个要紧的特例上直接假定了定理」,古根海默 1977 年说得更具体,指出第 98 号那十来行里缺一步;而黑尔斯 2007 年通篇替他辩护,理由是若尔当根本没有实质用到多边形版的定理,他要的只是弱得多的一件事——「存在一个良定义的奇偶函数,数一条射线穿过多边形的次数」,并说自己联系过几位批评者,「每一位都承认并不直接知道错在哪里」。两说这里都摆出来,本馆不替任何一边下结论。二是那个奇偶函数本身:它就是演示里画的东西,也是他第 99 号的原话——从负无穷沿一条直线上来,先在外面,到第一个交点进去,第二个又出来。今天每一个图形库、每一个地理信息系统里的 point-in-polygon 就是这一句。
向右发一条射线,数它穿过曲线几次;再把射线抬到正好穿过一个顶点的那一档
这条定理说出来像废话,证起来却花了他七页:一条自己不相交的闭曲线,把平面分成内外两块。 他的办法是在曲线上取一串无限接近的点、作内接多边形,再把多边形上的圈一个个去掉, 最后用内外两串多边形把曲线夹住。夹的时候他要数一件事,就是这里画的这件——从一点向右发一条射线,数它穿过多边形几次;奇数在里,偶数在外。 当前这一点穿了 2 次,所以在外面; 右栏另拿绕数算了一遍,4000 个随机点上与射线法不一致的有 0 个。面积也拿两条路对过:鞋带公式 0.343360,逐格判内 0.343460。 要紧的是最后一栏:射线正好穿过一个顶点时,那条边到底算不算穿过?取测点 (0.500, 0.500)、内接 48 边形,两个顶点恰好落在射线上, 「两端都用严格不等式」的写法会把它们整条跳过,数出 0 次、判成外面——而它明明在里面。 今天所有图形库里的 point-in-polygon 都用半开区间(一端含、一端不含)把这个坑填掉, 那正是 Hales 2007 年替若尔当辩护时说的那一步:把射线挪开一丁点。
