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;
        }

 

猜你喜欢

转载自blog.csdn.net/weixin_42479664/article/details/83443812
xyz