/// <summary> /// ///计算pos到直线(lineSt, lineEnd)的最短距离 /// </summary> /// <param name="pos"></param> /// <param name="lineSt"></param> /// <param name="lineEnd"></param> /// <param name="lineIsSegment">是否为线段</param> /// <returns></returns> public static double LinePointDistance(Vector2_DW lineSt, Vector2_DW lineEnd, Vector2_DW pos, bool lineIsSegment) { double disRet = 0; if (lineIsSegment == false) { disRet = Vector2_DW.Cross(lineSt, lineEnd, pos) / Vector2_DW.Distance(lineSt, lineEnd); } else { Vector2_DW ab = lineEnd - lineSt; Vector2_DW bc = pos - lineEnd; Vector2_DW ac = pos - lineSt; if (Vector2_DW.Dot(ab, bc) > 0)//pos在lineEnd外侧 { disRet = Vector2_DW.Distance(pos, lineEnd); } else if (Vector2_DW.Dot(ab, ac) > 0)//pos在lineEnd外侧 { disRet = Vector2_DW.Distance(pos, lineSt); } else//pos在lineSt与lineEnd之间 { disRet = Vector2_DW.Cross(lineSt, lineEnd, pos) / Vector2_DW.Distance(lineSt, lineEnd); } } return(Math.Abs(disRet)); }
//返回两个向量之间的夹角(角度制)(0-180) static public double Angle(Vector2_DW from, Vector2_DW to) { return(Math.Acos(ToolsMath_DW.Clamp(Vector2_DW.Dot(from.Normalize(), to.Normalize()), -1f, 1f)) * 57.29578f); }