Ejemplo n.º 1
0
        public static Polygon SumPolygons(List <Polygon> polygons)
        {
            int         nodecounts     = 0;
            List <Node> NodeIntersects = new List <Node>();
            Polygon     newPolygon     = new Polygon();
            List <Node> formingnodes   = new List <Node>();

            //Нахождение узлов не являющихся подмножеством другого полигона
            for (int i = 0; i < polygons[1].NodeCount; i++)
            {
                Node node = new Node(0, 0);
                node = polygons[1]._nodes[i];
                if (Analysis.IsNodeInPolygon(polygons[0], node) == true)
                {
                    newPolygon.AddNode(node);
                    formingnodes.Add(node);
                }
            }

            for (int i = 0; i < polygons[0].NodeCount; i++)
            {
                Node node = new Node(0, 0);
                node = polygons[0]._nodes[i];
                if (Analysis.IsNodeInPolygon(polygons[1], node) == true)
                {
                    newPolygon.AddNode(node);
                    formingnodes.Add(node);
                }
            }
            //Найти пересечения узлы полигонов

            /* polygons[0].AddNode(polygons[0].GetNode(0));
             * polygons[1].AddNode(polygons[1].GetNode(0));
             * for (int i =0;i<polygons[0].NodeCount-1;i++)
             * {
             *
             *   Node node = new Node(0, 0);
             *   Node begin = polygons[0]._nodes[i];
             *   Node end = polygons[0]._nodes[i + 1];
             *   for (int j=0;j<polygons[1].NodeCount-1;j++)
             *   {
             *       Node p1 = polygons[1].GetNode(j);
             *       Node p2 = polygons[1].GetNode(j + 1);
             *       node = Analysis.PointofIntercestcs(begin, end, p1, p2);
             *       if (node.X != 0 && node.Y != 0)
             *       {
             *           nodecounts++;
             *           node = Analysis.PointofIntercestcs(begin, end, p1, p2);
             *       }
             *
             *
             *
             *   }
             *
             * }
             */
            polygons[0].AddNode(polygons[0].GetNode(0));
            polygons[1].AddNode(polygons[1].GetNode(0));
            List <Node> nodesintersects = new List <Node>();
            //Формируем полигоны с новыми вершинами, которые включают также пересечения
            Polygon newpolygon1 = new Polygon();

            for (int i = 0; i < polygons[0].NodeCount - 1; i++)
            {
                // Node node = new Node(0, 0);
                Node node  = null;
                Node begin = polygons[0]._nodes[i];
                Node end   = polygons[0]._nodes[i + 1];
                newpolygon1.AddNode(begin);

                for (int j = 0; j < polygons[1].NodeCount - 1; j++)
                {
                    Node p1 = polygons[1].GetNode(j);
                    Node p2 = polygons[1].GetNode(j + 1);
                    node = Analysis.PointofIntercestcs(begin, end, p1, p2);


                    if (node != null)
                    {
                        nodecounts++;

                        nodesintersects.Add(node);
                        NodeIntersects.Add(node);
                        node = Analysis.PointofIntercestcs(begin, end, p1, p2);
                    }
                }

                newpolygon1 = SortNumbers12(nodesintersects, begin, newpolygon1);
                nodesintersects.Clear();
            }

            Polygon newpolygon2 = new Polygon();

            nodesintersects.Clear();
            for (int i = 0; i < polygons[1].NodeCount - 1; i++)
            {
                Node node = null;
                // Node node = new Node(0, 0);
                Node begin = polygons[1]._nodes[i];
                Node end   = polygons[1]._nodes[i + 1];
                newpolygon2.AddNode(begin);
                for (int j = 0; j < polygons[0].NodeCount - 1; j++)
                {
                    Node p1 = polygons[0].GetNode(j);
                    Node p2 = polygons[0].GetNode(j + 1);
                    node = Analysis.PointofIntercestcs(begin, end, p1, p2);
                    if (node != null)
                    {
                        nodecounts++;
                        nodesintersects.Add(node);
                        NodeIntersects.Add(node);
                        node = Analysis.PointofIntercestcs(begin, end, p1, p2);
                    }
                }

                newpolygon2 = SortNumbers12(nodesintersects, begin, newpolygon2);
                nodesintersects.Clear();
            }

            if (NodeIntersects.Count > 0)
            {
                bool x = false;
                //Узнаем, есть ли такие вершины, что является часть другого полигона
                Polygon newpolygon1s = new Polygon();
                Polygon newpolygon2s = new Polygon();
                Polygon newpolygon3s = new Polygon();

                for (int i = 0; i < newpolygon1.NodeCount; i++)
                {
                    for (int j = 0; j < formingnodes.Count; j++)
                    {
                        if (newpolygon1.GetNode(i) == formingnodes[j])
                        {
                            x = true;
                            // newpolygon1s.AddNode(newpolygon1.GetNode(i));
                        }
                    }
                    if (x == false)
                    {
                        newpolygon1s.AddNode(newpolygon1.GetNode(i));
                    }
                    x = false;
                }

                bool t = false;
                for (int i = 0; i < newpolygon2.NodeCount; i++)
                {
                    for (int j = 0; j < formingnodes.Count; j++)
                    {
                        if (newpolygon2.GetNode(i) == formingnodes[j])
                        {
                            t = true;
                            //  newpolygon2s.AddNode(newpolygon2.GetNode(i));
                        }
                    }
                    if (t == false)
                    {
                        newpolygon2s.AddNode(newpolygon2.GetNode(i));
                    }
                    t = false;
                }



                //Идем по вершинам составляя новый полигон

                for (int i = 0; i < newpolygon1s.NodeCount; i++)
                {
                    int k = 0;
                    //  int j = 0;

                    newpolygon3s.AddNode(newpolygon1s.GetNode(i));
                    if (newpolygon1s.GetNode(i).IsInPolygon == true)
                    {
                        for (int j = 0; j < newpolygon2s.NodeCount; j++)
                        {
                            if ((newpolygon2s.GetNode(j).X == newpolygon1s.GetNode(i).X) && (newpolygon2s.GetNode(j).Y == newpolygon1s.GetNode(i).Y))
                            {
                                k = j + 1;
                            }
                        }

                        while (newpolygon2s.GetNode(k).IsInPolygon != true)
                        {
                            int tm = 7;
                            newpolygon3s.AddNode(newpolygon2s.GetNode(k));
                            k++;
                            if (k >= newpolygon2s.NodeCount)
                            {
                                k = 0;
                            }
                        }
                    }
                }


                int s = 4;



                return(newpolygon3s);
            }
            else
            {
                return(null);
            }
        }