几种要考虑的情况
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),是否可以用点乘来判断的思考
标签:判断,线段,float,pb,pa,ab,Vector2,向量 From: https://www.cnblogs.com/sailJs/p/17809543.html