示例#1
0
        public bool ContainInArea(myVertex vertex)
        {
            if (ContainVertex(vertex,0) != -1)
                return true;

            double x_max = vertexes[0].X;
            for (int i = 1; i < vertexes.Count - 1; i++)
                if (vertexes[i].X > x_max)
                    x_max = vertexes[i].X;

            x_max += 10;
            mySection luch = new mySection(vertex, new myVertex(x_max,vertex.Y));
            int k = 0;
            for (int i = 0; i < vertexes.Count - 1; i++ )
            {
                mySection section = new mySection(vertexes[i], vertexes[i + 1]);
                myVertex intersection = luch.Intersect(section);
                if (intersection != null)
                {
                    k++;
                    if (this.ContainVertex(intersection,0) != -1)
                        i++;
                }
            }

            if (k>0 && k % 2 == 1)
                return true;
            else
                return false;
        }
示例#2
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;
        }