判断两个向量是否平行(包含方向相反)
/// <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;
}