一点 D 是否在三角形 ABC 内,相对于AB边来说,D点在三角形内一定要和C点在 AB 边同侧,对于A,B 点也用相同的方法去判断D点是否于其在相应边的同侧,这种方法还可以用来判断多点是不是可以构成一个凸多边形。
下边以 AB 为边例,验证 C,D两点是否在AB边同侧, AB 的在二维坐标中的线性方程可以表示为
ay = bx +C1,
过 C,D两点分别作平行于AB的平行线,其方程分别表示为
ay = bx + C2,ay = bx + C3,
当 a != 0 时,b/a 为三线斜率,C1/a,C2/a,C3/a分别的三线跟y轴的交点
当 a == 0 时 ,-C1/b,-C2/b,-C3/b分别的三线跟x轴的交点
上面两种情况都可以归纳一种情况,要使C,D在AB边同侧,C1要么同时大于等于C2,C3, C1要么同时小于等于C2,C3,当然可以进一步比较C2,C3大小关系统,来确定 D 点是否在C点内侧。
最后就是用简单的代数知识,求出 a,b,C1,C2,C3,具体请见下面代码
#include <stdio.h>
#include <stdlib.h>
struct point{
double x;
double y;
};
int point_in_same_side(struct point *pa, struct point *pb, struct point *pc, struct point *pd){
// check pc and pd in line AB same side
// line AB function , y = kx + c , k = b/a
// ay = bx + C , C = a*c
// C = ay - bx
double a = pa->x - pb->x;
double b = pa->y - pb->y;
double c1 = a * pa->y - b * pa->x;
double c2 = a * pc->y - b * pc->x;
double c3 = a * pd->y - b * pd->x;
if(c1 <= c2 && c1 <= c3){
return 1;
}
if(c1 >= c2 && c1 >= c3){
return 1;
}
return 0;
}
int point_in_triangle(struct point *p){
int r = point_in_same_side(&p[0], &p[1], &p[2], &p[3] )
&& point_in_same_side(&p[0], &p[2], &p[1], &p[3])
&& point_in_same_side(&p[2], &p[1], &p[0], &p[3]);
return r;
}
int main(int argc, char **argv){
struct point p[] = {
{0, 0},
{0, 100},
{100, 0},
{100, 0},
};
printf("%d \n", point_in_triangle(p));
return 0;
}