/// <summary> /// True if (a) both polygons lie in the same plane (vertical distance up to Msystem.Tolerance), and /// (b) they overlap (the overlapping horizontal distance exceeds Msystem.Tolerance) /// </summary> public bool OverlapsWith(Polygon3D another) { if (!(Normal.IsParallelTo(another.Normal) && Plane.AbsoluteDistanceTo(another[0]) < MSystem.Tolerance)) { return(false); } // If one polygon contains inside a vertex of another, then they overlap // Border tolerance is allowed for case that they just touch (do not overlap) if (another.Any(t => ContainsPoint(t, MSystem.Tolerance)) || this.Any(t => another.ContainsPoint(t, MSystem.Tolerance))) { return(true); } // Now check the case when no vertex of one polygon lies inside another var intersections = new HashSet <Point3D>(); foreach (var edge1 in Edges) { foreach (var edge2 in another.Edges) { var intersection = edge1.ClosestPointsBetween(edge2, true); if (intersection.Item1.DistanceTo(intersection.Item2) < MSystem.Tolerance) { intersections.Add(intersection.Item1); } } } if (!intersections.Any()) { return(false); } // Again exclude the case when they just touch and do not overlap var c = Point3D.Centroid(intersections); return(ContainsPoint(c, MSystem.Tolerance) || another.ContainsPoint(c, MSystem.Tolerance)); }
public double AbsoluteDistanceToPoint3D() { return(Plane1.AbsoluteDistanceTo(Point3D)); }