public static VLCoverType IsPlanarCover(List <Line> lines, VLTriangle triangle, Line line) { //根据线段相交判断 var p0 = line.GetEndPoint(0); var p1 = line.GetEndPoint(1); var intersect = lines.FirstOrDefault(c => c.VL_IsIntersect(line)); if (intersect != null) { return(VLCoverType.Intersect); } //线段包含判断 List <XYZ> points = new List <XYZ>(); points.Add(line.GetEndPoint(0)); points.Add(line.GetEndPoint(1)); foreach (var point in points) { if (triangle.PlanarContains(point)) { return(VLCoverType.Contain); } } return(VLCoverType.Disjoint); }
/// <summary> /// 三角形包含点 /// </summary> public static bool Contains(this VLTriangle triangle, XYZ point) { var vB = triangle.B - triangle.A; var vC = triangle.C - triangle.A; var vP = point - triangle.A; double dotB_B = vB.DotProduct(vB); double dotB_C = vB.DotProduct(vC); double dotB_P = vB.DotProduct(vP); double dotC_C = vC.DotProduct(vC); double dotC_P = vC.DotProduct(vP); double inverDeno = 1 / (dotB_B * dotC_C - dotB_C * dotB_C); double u = (dotC_C * dotB_P - dotB_C * dotC_P) * inverDeno; if (Math.Abs(u) < ConstraintsOfBeamAlignToFloor.XYZTolerance) { u = 0; } if (u < 0 || u > 1) { return(false); } double v = (dotB_B * dotC_P - dotB_C * dotB_P) * inverDeno; if (Math.Abs(v) < ConstraintsOfBeamAlignToFloor.XYZTolerance) { v = 0; } if (v < 0 || v > 1) { return(false); } return(u + v <= 1 + VLGeometryHelper.XYZTolerance); }
/// <summary> /// 一面两点 求线面交点 /// t = (vT·pT - vT·pL)/(vT·vL) /// p = pL + t*vL /// </summary> public static XYZ GetIntersection(VLTriangle triangle, XYZ point, XYZ direction) { var pT = triangle.A; var vT = (triangle.B - triangle.A).CrossProduct(triangle.C - triangle.A); var t = (vT.DotProduct(pT) - vT.DotProduct(point)) / vT.DotProduct(direction); var p = point + t * direction; return(p); }
public VLTriangle(VLTriangle triangle, XYZ offset) { A = triangle.A + offset; B = triangle.B + offset; C = triangle.C + offset; }