C#

Величайшие умы C#, помогайте (Первый курс, Виндовс Формс)

Понадеялся на заранее заказанного человека, старшекурсников, для всех эта лаба - дремучий лес и сделать они ничего не могут, а сдавать уже сегодня утром.
Задача с применением Windows.Forms

Многоугольник на плоскости задается координатами своих N вершин в порядке обхода их по контуру по часовой стрелке (контур самопересечений не имеет). Для заданной точки Z(x,y) определить, принадлежит ли она стороне многоугольника или лежит внутри или вне него.

Помогите пожалуйста, оч важная работа, я их очень много сейчас закрываю и вот вскрылась еще одна мощнейшая, а дело пахнет отчислением
Допустим есть две вершины многоугольника: A(x_1, y_1) и B(x_2, y_2)
Тогда можно получить прямую вида y = kx+b, проходящую через точки A и B.
Далее смотришь на точку Z(x_3, y_3), лежит ли она, во-первых, в пределах x_1<=x_3<=x_2, если да, то подставляешь ее в полученную прямую:
y_3=kx_3+b, если равенство выполняется - то точка лежит на стороне многоугольника.

Для того, чтобы определить лежит она внутри или вне него - достаточно пройтись в цикле по рёбрам многоугольника и определить, пересекает ли луч каждое ребро. Если число пересечений нечётно, то объявляется, что точка лежит внутри многоугольника, если чётно — то снаружи.
Igor Komarov
Igor Komarov
4 101
Лучший ответ
 using System; 
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace PolygonCheck
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
// Define the coordinates of the polygon's vertices
List polygon = new List()
{
Tuple.Create(1.0, 1.0),
Tuple.Create(3.0, 1.0),
Tuple.Create(4.0, 4.0),
Tuple.Create(2.0, 3.0),
Tuple.Create(1.0, 4.0)
};

// Get the coordinates of the point to check
double x = double.Parse(textBox1.Text);
double y = double.Parse(textBox2.Text);

// Define the point to check
Tuple point = Tuple.Create(x, y);

// Check if the point lies inside, outside or on the side of the polygon
if (IsPointInsidePolygon(polygon, point))
label1.Text = "The point lies inside the polygon.";
else if (IsPointOnPolygon(polygon, point))
label1.Text = "The point lies on the side of the polygon.";
else
label1.Text = "The point lies outside the polygon.";
}

// Function to check if a point lies inside a polygon
private bool IsPointInsidePolygon(List polygon, Tuple point)
{
int i, j;
bool c = false;
int nvert = polygon.Count;

for (i = 0, j = nvert - 1; i < nvert; j = i++)
{
if (((polygon[i].Item2 > point.Item2) != (polygon[j].Item2 > point.Item2)) &&
(point.Item1 < (polygon[j].Item1 - polygon[i].Item1) * (point.Item2 - polygon[i].Item2) / (polygon[j].Item2 - polygon[i].Item2) + polygon[i].Item1))
{
c = !c;
}
}

return c;
}

// Function to check if a point lies on the side of a polygon
private bool IsPointOnPolygon(List polygon, Tuple point)
{
int i, j;
int nvert = polygon.Count;

for (i = 0, j = nvert - 1; i < nvert; j = i++)
{
if (point.Item1 == polygon[i].Item1 && point.Item2 == polygon[i].Item2)
return true;

if (point.Item1 == polygon[j].Item1 && point.Item2 == polygon[j].Item2)
return true;

if (((polygon[i].Item2 > point.Item2) == (polygon[j].Item2 > point.Item2)) &&
(point.Item1 < (polygon[j].Item1 - polygon[i].Item1) * (point.Item2 - polygon[i].Item2) / (polygon[j].Item2 - polygon[i].Item2) + polygon[i].Item1))
return true;
}
return false;
}
}
}