XYZ點操作常用方法
阿新 • • 發佈:2018-11-11
判斷兩個向量是否平行(包含方向相反)
/// <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;
}