判断平面上一点是否在三角形内 Inside a triangle or not

时间:2021-10-03 10:25:14

平面内有一个三角形,三个顶点ABC的坐标已经给出。现在给出一个坐标点K,要求判断这个点是在三角形内部还是外部。注意在三角形的三边上也算是在内部。

方法:

1、面积法

点K和三角形三顶点中的任意两点组合成三个不同的三角形,KAB、KBC、KAC,判断这三个三角形的面积之和是否等原三角的面积。如果相等的话,说明是在内部。

2、射线法

从K作水平向左射线,如果K在三角形内部,那么这条射线与三角形的交点个数必为奇数;如果P在外部,则交点个数必为偶数。

3、矢量法

由A点逆时针沿着三角形的边走一圈回到A,这一过程中若点K始终在前进方向的左侧,那么K在内部;否则是在外部。


方法一的实现:

根据三角形三点坐标求面积的公式:abs((x1*(y2-y3) + x2*(y3-y1)+ x3*(y1-y2))/2.0)

float area(int x1, int y1, int x2, int y2, int x3, int y3){   return abs((x1*(y2-y3) + x2*(y3-y1)+ x3*(y1-y2))/2.0);} /* 根据三角形的三点坐标和点K的坐标判断    A(x1, y1), B(x2, y2) and C(x3, y3) */bool isInside(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y){      /* Calculate area of triangle ABC */   float A = area (x1, y1, x2, y2, x3, y3);    /* Calculate area of triangle PBC */     float A1 = area (x, y, x2, y2, x3, y3);    /* Calculate area of triangle PAC */     float A2 = area (x1, y1, x, y, x3, y3);    /* Calculate area of triangle PAB */      float A3 = area (x1, y1, x2, y2, x, y);      return (A == A1 + A2 + A3);}