在二维平面上如何判断一个点在一个多边形(三角形)内

时间:2022-07-27 05:18:37

Title: 如何判断一个点是不是位于一个多边形(三角形)内。

        方法有多种。

(1)   利用直线的斜率来判断。

         首先判断是否位于多边形边上,然后依次判断是位于顺时针内部还是逆时针内部。

         这种方法比较慢,也容易出错。

(2)    根据面积来判断。如果点A位于多边形内,那么它和多边形的每条边组成的三角形面积和应该等于多边形的面积,否则就应该在多边形外部。

         例如 点A (x0, y0).  多边形Polygon, 这里以三角形为例

          class vertex {

               double x, y;

  }

         bool PointInPolygon( vertex A, vertexpolygon[3]);

   {                

                double ax, ay, bx, by, cx, cy, vx, vy;

ax = polygon[0].x ;

ay =polygon[0].y ;

bx =polygon[1].x ;

by =polygon[1].y ;

cx =polygon[2].x ;

cy =polygon[2].y ;

vx = A.x;
vy = A.y; 

    double Area  = fabs((ax*by - ay*bx + bx*cy - by*cx + cx*ay - cy*ax)) * 0.5;  // the equation of areacalculation  

if( Area <= 0.0 ) 

return false; //

double a1 = fabs((ax*by - ay*bx + bx*vy - by*vx + vx*ay - vy*ax)) * 0.5;

double a2 =fabs((bx*cy - by*cx + cx*vy - cy*vx + vx*by - vy*bx)) * 0.5;

double a3 = fabs((ax*cy - ay*cx + cx*vy - cy*vx + vx*ay - vy*ax)) * 0.5;

if( a1+a2+a3 - Area > 1.0e-2 ) 

return false;// If a1+a2+A3 bigger than Area, A should be not in polygon

return true;

 }

// 本人测试过很多次,在允许的误差范围内,效果很好。速度也很快。

        此外,也可以利用此面积的方法来用端点求中间某点的值分布情况。

        例如求温度,如果已知端点的温度,求内部点A的温度。

          A.T = ( a1 * polygon[2].T + a2 * polygon[0].T + a3 * polygon[1].T) / Area;


        至于在多边形中如果根据端点来求多边形的面积,可以参考矩阵计算。