// Кнопка подтверждения 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); } }
// Метод определения принадлежности точек к многоугольнику 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; }