相交 - 点是否在三角形内 - 同侧法

同侧法

点p在三角形三条边的同侧时,点p在三角形内。可以通过叉乘结果是否都为正或负来判断是否同侧

1) 三角形顶点逆时针时

1-a) ab与ap, bc与bp, ca与cp的夹角均为右手逆时针锐角,sin(锐角)>0,即:叉乘结果>0,此时p在三角形内。

1-b) bc与bp的夹角为0度,sin(0)=0,即:叉乘结果=0,此时p在三角形内。

1-c) bc与bp的夹角为右手顺时针锐角,sin(-锐角)<0,即叉乘结果<0,而ab与ap, ca与cp的夹角均为右手逆时针180度内(叉乘结果>0),符号不一致所以p在三角形外。

2) 三角形顶点为顺时针时

2-a) ab与ap, bc与bp, ca与cp的夹角均为右手顺时针锐角,sin(-锐角)<0,即:叉乘结果<0,此时p在三角形内。

 2-b),2-c)与上面类似

 

//点是否在三角形内
public static bool IsPointInTriangle(Vector2 p, Vector2 a, Vector2 b, Vector2 c)
{
    //确定顶点是顺时针还是逆时针
    var ab = b - a;
    var ac = c - a;
    float cross = V2Cross(ref ab, ref ac);

    var ap = p - a;
    if (V2Cross(ref ab, ref ap) * cross < 0)
        return false;

    var bc = c - b;
    var bp = p - b;
    if (V2Cross(ref bc, ref bp) * cross < 0)
        return false;

    var ca = a - c;
    var cp = p - c;
    if (V2Cross(ref ca, ref cp) * cross < 0)
        return false;

    return true;
}

public static float V2Cross(ref Vector2 a, ref Vector2 b)
{
    float result = a.x * b.y - a.y * b.x;
    return result;
}

 

内角和法

如果∠pab+∠pba+∠pbc+∠pcb+∠pca+∠pac等于180度,则p在三角形内;否则不在三角形内。

效率较低,这边没有实现。

 

投影法判断(待写)

 

参考

【数学基础】玩法常用几何计算汇总 - 知乎 (zhihu.com)

如何判断点在三角形内 (baidu.com)

如何判断点在三角形内?? - kasuosuo - 博客园 (cnblogs.com)

c++如何判断一个点是否在直角三角形内? - 知乎 (zhihu.com)

posted @ 2023-11-04 01:04  yanghui01  阅读(31)  评论(0编辑  收藏  举报