1. 程式人生 > >XYZ點操作常用方法

XYZ點操作常用方法

判斷兩個向量是否平行(包含方向相反) 

/// <summary>
        /// 判斷兩個向量是否平行,包含方向相反
        /// 通過Normalize()將兩個向量單位正交化,這樣就可以通過比較這兩個單位向量的大小
        /// 或者說比較這兩個點是否重合來比較。
        /// </summary>
        /// <param name="vt1"></param>
        /// <param name="vt2"></param>
        /// <param name="dDist"></param>
        /// <returns></returns>
        public static bool IsParallel(XYZ vt1, XYZ vt2, double dDist = 0.001)
        {
            return vt1.Normalize().DistanceTo(vt2.Normalize()) < dDist || vt1.Normalize().DistanceTo(-vt2.Normalize()) < dDist;
        }

判斷兩個向量是否同向 

/// <summary>
        /// 判斷兩個向量是否同向
        /// </summary>
        /// <param name="vt1"></param>
        /// <param name="vt2"></param>
        /// <param name="dDist"></param>
        /// <returns></returns>
        public static bool IsSameDirection(XYZ vt1, XYZ vt2, double dDist = 0.001)
        {
            return vt1.Normalize().DistanceTo(vt2.Normalize()) < dDist;
        }

判斷兩個向量是否垂直 

向量的點乘:a * b

公式:a * b = |a| * |b| * cosθ 
點乘又叫向量的內積、數量積,是一個向量和它在另一個向量上的投影的長度的乘積;是標量。 
點乘反映著兩個向量的“相似度”,兩個向量越“相似”,它們的點乘越大。

/// <summary>
        /// 判斷兩個向量是否垂直,通過判斷兩個向量的點乘(若等於0說明垂直)
        /// </summary>
        /// <param name="vt1"></param>
        /// <param name="vt2"></param>
        /// <param name="dDist"></param>
        /// <returns></returns>
        public static bool IsPerpendicular(XYZ vt1, XYZ vt2, double dDist = 0.001)
        {
            return Math.Abs(vt1.Normalize().DotProduct(vt2.Normalize())) < dDist;
        }

查詢某集合是否包含某點,如果不包含就新增該點

用到List<T>.FindIndex 方法

該方法如果找到匹配值就返回從0開始的索引值,否則返回-1.注意裡面的引數為predicate<T> match

public static void AddXYZ(List<XYZ> lstXYZ, XYZ pt, double dDist = 0.001)
        {
            if (lstXYZ.FindIndex((XYZ obj) => obj.DistanceTo(pt) < dDist) != -1)
            {
                return;
            }
            lstXYZ.Add(pt);
        }

 查詢某集合是否包含某點,找到就刪除該點

public static void DelXYZ(List<XYZ> lstXYZ, XYZ pt, double dDist = 0.001)
        {
            int num = lstXYZ.FindIndex((XYZ obj) => obj.DistanceTo(pt) < dDist);
            if (num != -1)
            {
                lstXYZ.RemoveAt(num);
            }
        }

比較兩點是否是重合(利用它們的距離來判斷)

public static bool Equal(XYZ pt1, XYZ pt2, double dDist = 0.001)
        {
            return pt1.DistanceTo(pt2) < dDist;
        }

判斷某鍵值對是否含有由某兩點構成的鍵值對

public static bool ContainXYZ(Dictionary<XYZ, XYZ> dict, XYZ pt1, XYZ pt2, double dDist = 0.001)
        {
            foreach (KeyValuePair<XYZ, XYZ> current in dict)
            {
                if ((current.Key.DistanceTo(pt1) < dDist && current.Value.DistanceTo(pt2) < dDist) || (current.Key.DistanceTo(pt2) < dDist && current.Value.DistanceTo(pt1) < dDist))
                {
                    return true;
                }
            }
            return false;
        }