使用向量叉乘判断点是否在三角形内

⌚Time: 2022-10-06 02:00:34

👨‍💻Author: Jack Ge

叉乘具有方向性,对于三角形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;

}