Консультация № 184873
20.12.2011, 15:27
69.03 руб.
0 4 2
Здравствуйте! Прошу помощи в следующем вопросе: В системе координат X, Y заданы координаты вершин выпуклого многоугольника: массив координат X; массив координат Y; число вершин многоугольника и координаты произвольной точки Q, Z. Определить, принадлежит ли точка Q, Z многоугольнику. C#

Обсуждение

Неизвестный
20.12.2011, 23:01
общий
это ответ
Здравствуйте, Иванов Евгений Александрович!

Один из возможных способов решения этой задачи представлен ниже.
Код:
sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static double[] X = new double[] {0, 2, 2, 0};
static double[] Y = new double[] {0, 0, 2, 2};
static int count;

static double Qx, Qy, Zx, Zy;

static double Snative = 0;
static double Spieces = 0;

static double e = 0.0001;

static double Area3(double X1, double Y1, double X2, double Y2, double X3, double Y3) {
double area = 0;
double a, b, c, p;
c = Math.Sqrt(Math.Pow(Y1 - Y2, 2) + Math.Pow(X1 - X2, 2));
b = Math.Sqrt(Math.Pow(Y2 - Y3, 2) + Math.Pow(X2 - X3, 2));
a = Math.Sqrt(Math.Pow(Y1 - Y3, 2) + Math.Pow(X1 - X3, 2));
p = (a + b + c) / 2;
area = Math.Sqrt(p * (p - a) * (p - b) * (p - c));
return area;
}

static double ReadCoor(string str) {
double result;
Console.Write(str);
result = double.Parse(Console.ReadLine());
return result;
}

static void Sarea(double Ax, double Ay, string pname) {
Spieces = Area3(Ax, Ay, X[0], Y[0], X[count - 1], Y[count - 1]);
for (int i = 0; i < count - 1; i++) {
Spieces += Area3(Ax, Ay, X[i], Y[i], X[i + 1], Y[i + 1]);
}

Console.WriteLine("Point {0} is {1}side", pname, ((Math.Abs(Snative - Spieces) < e) ? "in" : "out"));
}


static void Main(string[] args)
{
Console.WriteLine ("Enter coordinates of Q-point.");
Qx = ReadCoor("X = ");
Qy = ReadCoor("Y = ");

Console.WriteLine("Enter coordinates of Z-point.");
Zx = ReadCoor("X = ");
Zy = ReadCoor("Y = ");

count = X.Length;

for (int i = 1; i < count-1; i++) {
Snative += Area3(X[0], Y[0], X[i], Y[i], X[i + 1], Y[i + 1]);
}

Sarea(Qx, Qy, "Q");
Sarea(Zx, Zy, "Z");

Console.WriteLine("Done. Press any key...");
Console.ReadKey(true);
}
}
}
Неизвестный
21.12.2011, 09:14
общий
21.12.2011, 11:37
там же получается должны 2 точки должны быть определены Q и Z принадлежат ли они многоугольнику или нет, а вы мне одну точку только сделали. и Пояснения к ней пожалуйста
Неизвестный
21.12.2011, 12:22
общий
21.12.2011, 12:26
Цитата: 378115
там же получается должны 2 точки должны быть определены Q и Z принадлежат ли они многоугольнику или нет, а вы мне одну точку только сделали.
Из условия задания неочевидно, что речь идет о двух точках. По крайней мере слова "точка" во множественном числе я не увидел. Поправленный вариант для двух точек смотрите в ответе.
Цитата: 378115
и Пояснения к ней пожалуйста
Идея решения заключается в том, что для точки не являющейся вершиной выпуклого многоугольника, мы можем построить систему треугольников, где одной из вершин будет наша точка, а две другие - соседние вершины многоугольника. Сумма площадей всех построенных треугольников будет совпадать с площадью выпуклого многоугольника в случае когда точка принадлежит многоугольнику. В противном случае она будет больше.
Массивы координат выпуклого многоугольника заданы в программе в виде констант. Количество вершин берется из длины массива координат.
Функция Area3 считает площадь треугольника по формуле Герона.
Функция ReadCoor обобщает действия по вводу координат точек.
Sarea подсчитывает сумму площадей треугольников построенных с использованием точки заданной пользователем в качестве вершины и делает заключение о принадлежности к многоугольнику. В случае, когда точка располагается на границе или совпадает с вершиной, считается , что точка принадлежит многоугольника (т.е. расположена внутри).
В качестве шаблонного значения берется площадь вычисленная по этому же принципу, где точкой служит одна из вершин выпуклого многоугольника.
давно
Профессионал
848
1596
22.12.2011, 11:59
общий
это ответ
Здравствуйте, Иванов Евгений Александрович!
Мое решение выполнено в WindowsForms и показывает как решается данная задача возможностями самого языка, использованием класса System.Drawing.Drawing2D.GraphicsPath
Прикрепленные файлы:
Форма ответа