コード例 #1
0
        /// <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));
        }
コード例 #2
0
 //返回两个向量之间的夹角(角度制)(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);
 }