C# Функция принадлежности точки многоугольнику

программирование C# Геометрия

У меня есть невыпуклый многоугольник, заданый координатами вершин. Например: (0,0) (1,1) (2,0) (2,2) (0,2)

Нужно определить находиться ли любая точка (x,y) в этой фигуре, или за её пределами.

Например точка (1,0) не будет в фигуре, точка (0,1) также не в фигре(хоть она на ребре фигуры), точка (1,1.5) в фигуре.

Нужна конкретная функция.

Пожалуйста не пишите: почитай там-то, сделай так-то.

Примечание:
class Point
{
public double x;
public double y;
...

Примечание:
Спасибо за замечания, я искал код на шарпах 4 часа и ничего не нашел, наконец сам нашел решение проблемы

public static int SearchRightPoint(List<Point> p)
{
Point right = p[0];
int num = 0;
for (int i = 1; i < p.Count; i++)
if (p[i].x > right.x)
{
right = p[i];
num = i;
}
return num;
}

public static int checkIntersection(Point a1, Point a2, Point b1, Point b2)
{
double eps = 0.000001;
double d = (a1.x - a2.x) * (b2.y - b1.y) - (a1.y - a2.y) * (b2.x - b1.x);
double da = (a1.x - b1.x) * (b2.y - b1.y) - (a1.y - b1.y) * (b2.x - b1.x);
double db = (a1.x - a2.x) * (a1.y - b1.y) - (a1.y - a2.y) * (a1.x - b1.x);

if (Math.Abs(d) < eps)
return 0;
else
{
double ta = da / d;
double tb = db / d;
if ((Math.Abs(ta) < eps) && ((0 <= tb) && (tb <= 1)))
return 2;
else
if ((0 <= ta) && (0 <= tb) && (tb <= 1))
return 1;
else return -1;
}
}


public static bool IsInside(Point a, List<Point> plg)
{
Point ax = new Point(a.x + plg[Point.SearchRightPoint(plg)].x, a.y);
int k = 0;
int i1;
int i2;
int r;
for (int i = 0; i < plg.Count; i++)
{
i1 = i;
i2 = i + 1;
if (i == plg.Count - 1) i2 = 0;

r = checkIntersection(a, ax, plg[i1], plg[i2]);
if (r == 2)
{
return false;
}
if (r == 1)
k = 1 - k;
}
if (k == 0)
return false;
else
return true;
}

Примечание:
Может кому-то надо будет
Ответы:
Вот это да! Школьники уже совсем обнаглели, требуют чистый код выложить. Самим погуглить УЖЕ имеющееся решение лениво.
Встречный вопрос: Зачем Вам такое образование?
мне нужно много денег! пожалуйста не пишите заработай или укради.
почему?
спасибо что выложил код, сам вдоволь наискался...  выручил)


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.