Beispiel #1
0
        // Кнопка подтверждения
        private void OK_Click(object sender, EventArgs e)
        {
            string[] str1 = X.Text.Split(',');                  // Массив координат "X" в формате string
            string[] str2 = Y.Text.Split(',');                  // Массив координат "Y" в формате string
            int[] Xs = new int[str1.Length];                    // Создание массива для хранения координат X
            int[] Ys = new int[str1.Length];                    // Массив для Y
            points = new Point[str1.Length];                    // Определение размера массива точек

            //Заполнение массива точек с помощью массивов координат заранее преобразуя string в int
            for (int i = 0; i < str1.Length; i++)
            {
                Xs[i] = int.Parse(str1[i]);
                Ys[i] = int.Parse(str2[i]);
                points[i].X = Xs[i];
                points[i].Y = Ys[i];
            }
            Polygon polygon = new Polygon(Xs, Ys);                          // Создание экземпляра класса Polygon
            // Создание точки для проверки, используя введенные координаты
            string[] pointStr = PointBox.Text.Split(',');
            int x = int.Parse(pointStr[0]);
            int y = int.Parse(pointStr[1]);
            point = new MyPoint(x, y);
            f1.Result.Text = polygon.isCollide(polygon, point).ToString();  // Вывод результата проверки
            using (Graphics g = CreateGraphics())
            {
                g.DrawPolygon(Pens.Black, points);
            }
        }
Beispiel #2
0
        // Метод определения принадлежности точек к многоугольнику
        public bool isCollide(Polygon polygon, MyPoint p)
        {
            double bigArea;                                     // Площадь заданного многоугольника
            double[] smallAreas = new double[pointnumber];      // Площади треугольников
            double[] ps = new double[pointnumber];              // Полупериметры для треугольников
            double[] dists = new double[points.Length * 2];     // Массив расстоянии между точками

            for (int i = 0; i < points.Length - 1; i++)         // Нахождение расстоянии между двумя точками
            {
                dists[i] = MyPoint.Distance(points[i], points[i + 1]);
            }
            dists[points.Length - 1] = MyPoint.Distance(points[points.Length - 1], points[0]);

            for (int i = 0; i < points.Length; i++)             //
            {
                dists[points.Length + i] = MyPoint.Distance(points[i], p);
            }

            for (int i = 0; i < points.Length - 1; i++)         // Нахождение полупериметров треугольников
            {
                ps[i] = (dists[i] + dists[i + points.Length] + dists[i + points.Length + 1]) / 2;
            }
            ps[pointnumber - 1] = (dists[pointnumber - 1] + dists[pointnumber] + dists[pointnumber * 2 - 1]) / 2;

            //Нахождение площади основного многоугольника
            double sum1 = 0;
            double sum2 = 0;

            for (int i = 0; i < pointnumber - 1; i++)
            {
                sum1 += points[i].x * points[i + 1].y;
            }
            sum1 += points[pointnumber-1].x * points[0].y;

            for (int i = 0; i < pointnumber - 1; i++)
            {
                sum2 += points[i].y * points[i + 1].x;
            }
            sum2 += points[pointnumber - 1].y * points[0].x;
            bigArea = Math.Abs(sum1 - sum2) / 2;

            for (int i = 0; i < pointnumber - 1; i++)       // Нахождение площадей треугольников
            {
                smallAreas[i] = Math.Sqrt(ps[i] * (ps[i] - dists[i]) * (ps[i] - dists[i + points.Length]) * (ps[i] - dists[i + points.Length + 1]));
            }
            smallAreas[pointnumber - 1] = Math.Sqrt(ps[pointnumber - 1] * (ps[pointnumber - 1] - dists[pointnumber - 1]) * (ps[pointnumber - 1] - dists[pointnumber]) * (ps[pointnumber - 1] - dists[pointnumber * 2 - 1]));

            MyRound(smallAreas);
            double sumSmallAreas = 0;                       // Сумма площадей треугольников
            for (int i = 0; i < pointnumber; i++)
            {
                sumSmallAreas += smallAreas[i];
            }

            if(bigArea == sumSmallAreas)                    // Сравнение площадей
                return true;
            else
                return false;
        }