Beispiel #1
0
        private myPolygon GetIntersectionWith(myPolygon polygon)
        {
            //создадим результирующий многоугольник
            myPolygon result = new myPolygon();

            for (int i = 0; i < vertexes.Count - 1; i++)
            {
                //добавим в него текущую вершину
                result.vertexes.Add(vertexes[i]);
                //создадим ребро, из текущей и следующей вершины
                mySection i_section = new mySection(vertexes[i], vertexes[i + 1]);

                //а так же список добавляемых вершин
                List<myVertex> vertexes_to_add = new List<myVertex>();

                //будем искать пересечения
                for (int j = 0; j < polygon.vertexes.Count - 1; j++)
                {
                    //текущее ребро во втором многоугольнике
                    mySection j_section = new mySection(polygon.vertexes[j], polygon.vertexes[j + 1]);

                    //если есть пересечение - добавим в список
                    myVertex intersection = i_section.Intersect(j_section);
                    if (intersection != null && result.ContainVertex(intersection,0) == -1 && !vertexes_to_add.Contains(intersection))
                        vertexes_to_add.Add(intersection);
                }

                //теперь нужно отсортировать список по удалению от начала отрезка
                //параллельно добавляя их в многоугольник-результат
                for (int j = 0; j < vertexes_to_add.Count; j++)
                {
                    double min_distance = result.vertexes[result.vertexes.Count - 1].DistanceTo(vertexes_to_add[j]);
                    for (int k = j + 1; k < vertexes_to_add.Count; k++)
                    {
                        double distance = result.vertexes[result.vertexes.Count - 1].DistanceTo(vertexes_to_add[k]);
                        if (distance < min_distance)
                        {
                            myVertex temp = vertexes_to_add[j];
                            vertexes_to_add[j] = vertexes_to_add[k];
                            vertexes_to_add[k] = temp;
                            min_distance = distance;
                        }
                    }
                    result.vertexes.Add(vertexes_to_add[j]);
                }
            }

            //не забудем добавить самую первую точку
            result.vertexes.Add(result.vertexes[0]);

            return result;
        }