Ejemplo n.º 1
0
        public List <Polygon> ExtractPolygons()
        {
            Dictionary <long, bool> vistedHalfEdges = new Dictionary <long, bool>();

            polygons = new List <Polygon>();
            foreach (Node n in Nodes)
            {
                int nodeKey = GetNodeKey(n);
                foreach (HalfEdge he in NodeHalfEdges[nodeKey])
                {
                    long halfEdgeKey = GetHalfEdgeKey(he);
                    if (!vistedHalfEdges.ContainsKey(halfEdgeKey))
                    {
                        List <HalfEdge> edgesList       = new List <HalfEdge>();
                        HalfEdge        currentHalfEdge = he;
                        long            currentKey      = GetHalfEdgeKey(currentHalfEdge);
                        edgesList.Add(currentHalfEdge);
                        vistedHalfEdges.Add(currentKey, true);
                        bool deadEnd = false;
                        while (currentHalfEdge.End != n && !deadEnd)
                        {
                            currentHalfEdge = FindNextUnvisitedHalfEdge(currentHalfEdge, vistedHalfEdges);
                            if (currentHalfEdge == null)
                            {
                                deadEnd = true;
                                break;
                            }
                            currentKey = GetHalfEdgeKey(currentHalfEdge);
                            edgesList.Add(currentHalfEdge);
                            vistedHalfEdges.Add(currentKey, true);
                        }
                        Polygon polygon = new Polygon(edgesList, polygons.Count);
                        if (!deadEnd && polygon.IsClockWise())
                        {
                            AddPolygon(polygon);
                        }
                        else
                        {
                            foreach (HalfEdge used in edgesList)
                            {
                                long key = GetHalfEdgeKey(used);
                                vistedHalfEdges.Remove(key);
                            }
                        }
                    }
                }
            }
            CreateNeighborLists();
            return(polygons);
        }
Ejemplo n.º 2
0
 public List<Polygon> ExtractPolygons()
 {
     Dictionary<long,bool> vistedHalfEdges = new Dictionary<long,bool>();
     polygons = new List<Polygon>();
     foreach (Node n in Nodes)
     {
         int nodeKey = GetNodeKey(n);
         foreach (HalfEdge he in NodeHalfEdges[nodeKey])
         {
             long halfEdgeKey = GetHalfEdgeKey(he);
             if (!vistedHalfEdges.ContainsKey(halfEdgeKey))
             {
                 List<HalfEdge> edgesList = new List<HalfEdge>();
                 HalfEdge currentHalfEdge = he;
                 long currentKey = GetHalfEdgeKey(currentHalfEdge);
                 edgesList.Add(currentHalfEdge);
                 vistedHalfEdges.Add(currentKey, true);
                 bool deadEnd = false;
                 while (currentHalfEdge.End != n && !deadEnd)
                 {
                     currentHalfEdge = FindNextUnvisitedHalfEdge(currentHalfEdge, vistedHalfEdges);
                     if (currentHalfEdge == null)
                     {
                         deadEnd = true;
                         break;
                     }
                     currentKey = GetHalfEdgeKey(currentHalfEdge);
                     edgesList.Add(currentHalfEdge);
                     vistedHalfEdges.Add(currentKey, true);
                 }
                 Polygon polygon = new Polygon(edgesList, polygons.Count);
                 if (!deadEnd && polygon.IsClockWise())
                     AddPolygon(polygon);
                 else
                 {
                     foreach (HalfEdge used in edgesList)
                     {
                         long key = GetHalfEdgeKey(used);
                         vistedHalfEdges.Remove(key);
                     }
                 }
             }
         }
     }
     CreateNeighborLists();
     return polygons;
 }