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);
        }
Exemplo n.º 2
0
        /// <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;
        }
Exemplo n.º 3
0
        private void AddRegion(IRegion2D r, PolyType polyType)
        {
            var polygons = CreatePolygons(r);

            foreach (var poly in polygons)
            {
                this.clipper.AddPath(poly, polyType, true);
            }
        }
Exemplo n.º 4
0
        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));
                }
            }
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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();
        }
Exemplo n.º 8
0
        /// <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);
        }
Exemplo n.º 9
0
 public void Add(IRegion2D region, PolyType type)
 {
     AddRegion(region, type);
 }
Exemplo n.º 10
0
 public ClipperController(IRegion2D subject, IRegion2D clip, double maxDiscretizationAngle = 5)
     : base(maxDiscretizationAngle)
 {
     this.Add(subject, PolyType.ptSubject);
     this.Add(clip, PolyType.ptClip);
 }
Exemplo n.º 11
0
 public void Add(IRegion2D subject, IRegion2D clip)
 {
     AddRegion(subject, PolyType.ptSubject);
     AddRegion(clip, PolyType.ptClip);
 }
Exemplo n.º 12
0
 public static Rect2D  Boundary(this IRegion2D source)
 {
     return(source.Outline.Boundary());
 }