Понадеялся на заранее заказанного человека, старшекурсников, для всех эта лаба - дремучий лес и сделать они ничего не могут, а сдавать уже сегодня утром.
Задача с применением Windows.Forms
Многоугольник на плоскости задается координатами своих N вершин в порядке обхода их по контуру по часовой стрелке (контур самопересечений не имеет). Для заданной точки Z(x,y) определить, принадлежит ли она стороне многоугольника или лежит внутри или вне него.
Помогите пожалуйста, оч важная работа, я их очень много сейчас закрываю и вот вскрылась еще одна мощнейшая, а дело пахнет отчислением
C#
Величайшие умы C#, помогайте (Первый курс, Виндовс Формс)
Допустим есть две вершины многоугольника: 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, если равенство выполняется - то точка лежит на стороне многоугольника.
Для того, чтобы определить лежит она внутри или вне него - достаточно пройтись в цикле по рёбрам многоугольника и определить, пересекает ли луч каждое ребро. Если число пересечений нечётно, то объявляется, что точка лежит внутри многоугольника, если чётно — то снаружи.
Тогда можно получить прямую вида y = kx+b, проходящую через точки A и B.
Далее смотришь на точку Z(x_3, y_3), лежит ли она, во-первых, в пределах x_1<=x_3<=x_2, если да, то подставляешь ее в полученную прямую:
y_3=kx_3+b, если равенство выполняется - то точка лежит на стороне многоугольника.
Для того, чтобы определить лежит она внутри или вне него - достаточно пройтись в цикле по рёбрам многоугольника и определить, пересекает ли луч каждое ребро. Если число пересечений нечётно, то объявляется, что точка лежит внутри многоугольника, если чётно — то снаружи.
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;
}
}
}
Похожие вопросы
- Стоит ли дальше учить C#?
- Программирование на C Sharp (C#)
- Сегодня начал учить c#, решил сделать калькулятор простой и столкнулся с такой ошибкой при компиляции, хелпуйте.
- Что лучше C# или C++?
- Зачем разбивать код в C# на отдельные классы?
- Помогите пожалуйста. Написать на C#
- Python, C, C++, C#, Что выбрать-то?
- Помогите разобраться с заданием! C#
- Стоит ли изучать c# в 13 лет?
- Нужна помощь с задачей C#