昨天晚上室友跑去微软面试,然后面试官问他做ACM的时候主要做哪个方向,他说做计算几何的,然后别人就问了一个问题:点在三角形内部怎么判别?
这些谓词判断(predicates) 自己虽然以前都用过,但不知道原理是怎么来的,今天起了个早床来搞搞原理。
在网上找了半天发现大神在1996年就做了类似的工作[1](哎,顿时觉得自己弱爆了):
但是这两个式子又该做如何解释呢?
点和直线的关系:
要弄懂第一个,先看一下三角形的带符号面积(signed area)怎么求?
叉乘法我就不赘述了,很有效的几何方法。下面介绍另一种方法[2]:
如图:先求出A、B和C的这三个三角形面积,再用矩形的面积减去这三个三角形的面积,这样就能得到我们要求的面积。
具体的推导过程,参见[2].
最后我们就能得到上面的第一个式子的形式。
根据面积公式:
点在直线左边的话,那么始终都是大于0的。
点在直线上,等于0。
点在直线右边,小于0。
点在圆内
每一个点都可以在一个抛物面上找到一个对应。
当把平面上圆的公式中x^2 + y^2换为z,就能得到一个空间平面方程。(感慨一下这里的替换,太牛逼了!!!直接把问题转化为了平面,这样抽象的想法真是膜拜。)
也就是由下面三个点确定的平面方程:
如果点在圆内,那么圆的方程就小于0,平面方程也就小于0,点就在平面下方(below)。
如果点在圆上,那么圆的方程就等于0,平面方程也就等于0,点就在平面上(on the plane)。
如果点在圆外,那么圆的方程就大于0,平面方程也就大于0,点就在平面下方(above)。
所以判定就转化为点和平面关系的问题,这个问题也就是点与直线关系的推广。
可以很直接的得到上面的的第二个公式。
参考文献:
[1] http://www.cs.cmu.edu/~quake/robust.html
[2] https://people.richland.edu/james/lecture/m116/matrices/area.html
[3] http://graphics.stanford.edu/courses/cs368-06-spring/handouts/Delaunay_1.pdf