判断点和多边形关系的另一个思路是:多边形内的点与多边形各个顶点的连线,组成的三角形的面积和等于多边形的面积。
图例说明,如下图所示:
O点在多边形之内时,其与多边形所有顶点的连线,组成6个三角形,显而易见,这6个三角形的面积之和与多边形的面积相等。这一特性对多边形边上的点也适用。
P点在多边形之外,其与多边形所有顶点的连线,组成6个三角形,显而易见,这6个三角形的面积之和与多边形的面积不相等。确切的说,是三角形面积之和大于多边形面积,至于大多少,就与本文讨论问题无关了,大家可以自行计算。
经过以上原理分析,得到了判断点与多边形关系的“面积法”。这里的关键就是求取三角形与多边形的面积了。好巧的是,求面积也要用到向量积。在我的博客 http://blog.csdn.net/ezhchai/article/details/78841336中可以看到向量积的模式以其为临边的平行四边形的面积,三角形面积只需要乘个0.5就能得到。至于多边形的面积,大家也可以自行计算一下,也用这个原理,其实本文前面我已经说了怎么计算,仔细找能找到~
当然,此方法也有局限性,也是只能适用于凸多边形。其次,由于计算面积的数值会造成一定的舍入误差,这个误差也会影响后期计算的精度。
参考代码:
int InPolygon_Area(const CZPolygon& polygon, CZPoint_t pt){
double duPloyArea = CalPolygonArea(polygon);
int itNumPt = polygon.size();
CZPoint_t pt_1, pt_2;
double duArea = 0.0;
for (int i=0; i<(itNumPt-1); i++){
pt_1 = polygon[i];
pt_2 = polygon[i + 1];
double duTriArea = ABS(CrossProduct(&pt_1, &pt, &pt_2));
if(0.0 == duTriArea)
return ONSIDE;
duArea += 0.5 * duTriArea;
}
return ABS(duPloyArea-duArea)<EPS? INSIDE: OUTSIDE;
}
至于效果,和博客http://blog.csdn.net/ezhchai/article/details/78864336一样,这里就不再重复贴了。