private List <int> FindRegionsContainingElement(TElement element) { var containingRegionIds = new List <int>(); foreach (var idRegionPair in regions) { int id = idRegionPair.Key; IRegion2D region = idRegionPair.Value; foreach (TNode node in element.Nodes) //TODO: If a node was internal to a previous region, there is no need to process it again { //For debuging //if (node.ID == 552) //{ // Console.WriteLine(); //} // We are interested in regions where nodes are internal to. If an element has 3 nodes internal to region A // and 1 node on the boundary between regions A,B then it belongs to A. NodePosition relativePosition = region.FindRelativePosition(node); if (relativePosition == NodePosition.Internal) { containingRegionIds.Add(id); break; } } } return(containingRegionIds); }
/// <summary> /// Initializes a new instance of this class and copies properties from specified source. /// </summary> /// <param name="source">The source to copy.</param> public Region2D(IRegion2D source) { this.isEditing = false; Outline = (IPolyLine2D)source.Outline.Clone(); Openings = new ObservableList <IPolyLine2D>(source.Openings.Select(item => (IPolyLine2D)item.Clone())); ArcDiscrAngle = source.ArcDiscrAngle; }
private void AddRegion(IRegion2D r, PolyType polyType) { var polygons = CreatePolygons(r); foreach (var poly in polygons) { this.clipper.AddPath(poly, polyType, true); } }
protected IEnumerable <List <IntPoint> > CreatePolygons(IRegion2D region) { var discretizator = this.Discretizator; containsCircArc |= region.Outline.Segments.FirstOrDefault(s => s is CircularArcSegment2D) != null; yield return(CreatePolygon(region.Outline, discretizator, true)); int openingsCount = region.Openings.Count; if (openingsCount > 0) { for (int i = 0; i < openingsCount; ++i) { containsCircArc |= region.Openings[i].Segments.FirstOrDefault(s => s is CircularArcSegment2D) != null; yield return(CreatePolygon(region.Openings[i], discretizator, false)); } } }
/// <summary> /// Converting Geometry2D.IRegion2D to Geometry3D.IRegion3D /// </summary> /// <param name="region2D">Geometry2D.IRegion2D</param> /// <returns>Geometry3D.IRegion3D</returns> public static IRegion3D ConvertTo3D(IRegion2D region2D) { if (region2D == null) { return(null); } var region3D = new Region3D { Outline = ConvertTo3D(region2D.Outline) }; foreach (var o in region2D.Openings) { region3D.AddOpening(ConvertTo3D(o)); } return(region3D); }
public static Region Convert(this IRegion2D source, Point?origin = null) { var target = new Region { Outline = source.Outline.Convert(origin), }; var openings = source.Openings; if (openings.Count > 0) { var targetOpenings = new List <Polyline>(openings.Count); target.Openings = targetOpenings; foreach (var opening in openings) { targetOpenings.Add(opening.Convert(origin)); } } return(target); }
public static IRegion2D Simplify(IRegion2D region, double maxDiscretizationAngle = 5) { PolyLine2DDiscretizator discretizator = new PolyLine2DDiscretizator { NumberOfTiles = 1, LengthOfTile = double.MaxValue, Angle = maxDiscretizationAngle }; var polyline = region.Outline; var containsCircArc = polyline.Segments.FirstOrDefault(s => s is CircularArcSegment2D) != null; var polygon = CreatePolygon(polyline, discretizator, true); var solution = Clipper.SimplifyPolygon(polygon); if (solution.Count == 1) { var newRegion = new Region2D(CreatePolyline(solution[0], containsCircArc, maxDiscretizationAngle + 1)); foreach (var opening in region.Openings) { containsCircArc = opening.Segments.FirstOrDefault(s => s is CircularArcSegment2D) != null; polygon = CreatePolygon(opening, discretizator, true); solution = Clipper.SimplifyPolygon(polygon); if (solution.Count == 1) { newRegion.Openings.Add(CreatePolyline(solution[0], containsCircArc, maxDiscretizationAngle + 1)); } else { throw new System.NotImplementedException(); } } return(newRegion); } throw new System.NotImplementedException(); }
/// <summary> /// Ofset regionu. /// </summary> /// <param name="region"></param> /// <param name="delta"></param> /// <param name="joinType"></param> /// <param name="endType">Pokud bude etClosed, tak dela ofset vcetne otvoru, kladne delta je ven, zaporne dovnitr. /// Pokud nebude etClosed, tak dela ofset outline dovnitr i ven.</param> /// <param name="mitterLimit"></param> /// <returns></returns> public IRegion2D BuildOffset(IRegion2D region, double delta, JoinType joinType, EndType endType, double mitterLimit) { var polygons = CreatePolygons(region).ToList(); var co = new ClipperOffset(mitterLimit); co.AddPaths(polygons, joinType, endType); var solution = new List <List <IntPoint> >(); co.Execute(ref solution, delta * ClipperScale); if (solution.Count > 0) { var outline = CreatePolyline(solution[0], containsCircArc, MaxDiscretizationAngle + 1); var openings = new List <IPolyLine2D>(solution.Count - 1); for (var i = 1; i < solution.Count; ++i) { openings.Add(CreatePolyline(solution[i], containsCircArc, MaxDiscretizationAngle + 1)); } var result = new Region2D(outline, openings); return(result); } return(null); }
public void Add(IRegion2D region, PolyType type) { AddRegion(region, type); }
public ClipperController(IRegion2D subject, IRegion2D clip, double maxDiscretizationAngle = 5) : base(maxDiscretizationAngle) { this.Add(subject, PolyType.ptSubject); this.Add(clip, PolyType.ptClip); }
public void Add(IRegion2D subject, IRegion2D clip) { AddRegion(subject, PolyType.ptSubject); AddRegion(clip, PolyType.ptClip); }
public static Rect2D Boundary(this IRegion2D source) { return(source.Outline.Boundary()); }