
叉乘具有方向性,对于三角形abc和点p,使用向量$\vec{ab}$ x$\vec{ap}$ ,如果p点在$\vec{ab}$左侧,则结果大于0,如果p点在$\vec{ab}$右侧,则结果小于0
可以将三角形abc按顺序(上图为逆时针)连接起来,形成三个向量$\vec{ab}$、$\vec{bc}$、$\vec{ca}$,判断与$\vec{ap}$、$\vec{bp}$、$\vec{cp}$叉乘结果,如果都小于0,那么判定点在三角形内部,如果有等于0的结果,说明两向量共线,点在三角形边上
//点结构体
struct SPOINT{
int x;
int y;
};
//叉乘函数
int multiplication_cross(int x1,int y1,int x2,int y2){
return x1*y2-x2*y1;
}
//叉乘法判断点在三角形内部
//参数p1 p2 p3 三角形的顶点 参数p4 要判断的点
//返回值 1 在三角形内部 0 在三角形边上 -1在三角形外部
int is_inside(SPOINT p1,SPOINT p2,SPOINT p3,SPOINT p4){
SPOINT p12;
SPOINT p23;
SPOINT p31;
SPOINT p14;
SPOINT p24;
SPOINT p34;
p12.x=p2.x-p1.x;
p12.y=p2.y-p1.y;
p23.x=p3.x-p2.x;
p23.y=p3.y-p2.y;
p31.x=p1.x-p3.x;
p31.y=p1.y-p3.y;
p14.x=p4.x-p1.x;
p14.y=p4.y-p1.y;
p24.x=p4.x-p2.x;
p24.y=p4.y-p2.y;
p34.x=p4.x-p3.x;
p34.y=p4.y-p3.y;
if(multiplication_cross(p12.x,p12.y,p14.x,p14.y)>0&&multiplication_cross(p23.x,p23.y,p24.x,p24.y)>0&&multiplication_cross(p31.x,p31.y,p34.x,p34.y)>0){
return 1;
}
if(multiplication_cross(p12.x,p12.y,p14.x,p14.y)*multiplication_cross(p23.x,p23.y,p24.x,p24.y)*multiplication_cross(p31.x,p31.y,p34.x,p34.y) == 0){
return 0;
}
return -1;
}