向量点乘判断点是否在线段上

发布时间 2023-11-04 17:13:40作者: yanghui01

几种要考虑的情况

1) 点p和线段断点a, b重叠,pa•ab=pa.x*pa.y+ab.x*ab.y=0

2) pa, pb共线,则pa×pb=0

2-1) p在线段ab上,此时pa, pb的夹角为180度,cos(180)=-1,pa•ab=-|pa|*|ab|

2-2) p在线段ab外,此时pa, pb的夹角为0度,cos(0)=1,pa•ab=|pa|*|ab|

4) pa, pb不共线,cos(钝角)<0, cos(直角)=0, cos(锐角)>0

  

 

可以看到1)和4)中的直角,点乘结果都是0,所以1)我们得单独判断,否则无法区分

 

 

//点是否在线段上
public static bool IsPointOnSegment2(Vector2 p, Vector2 a, Vector2 b)
{
    //点和线段端点重合时
    var pa = a - p;
    float paSqrLen = pa.sqrMagnitude;
    if (Mathf.Approximately(paSqrLen, 0))
        return true;

    var pb = b - p;
    float pbSqrLen = pb.sqrMagnitude;
    if (Mathf.Approximately(pbSqrLen, 0))
        return true;

    float dot = Vector2.Dot(pa, pb);
    float dotSqr = dot * dot;
    if (Mathf.Approximately(dotSqr, -(paSqrLen * pbSqrLen))) //p在线段上, pa和pb的夹角为180度, cos(180)=-1
        return true;

    //pa和pb的夹角为0度, 钝角, 90度, 锐角点情况
    return false;
}

 

参考

【数学基础】玩法常用几何计算汇总 - 知乎 (zhihu.com),是否可以用点乘来判断的思考