У меня есть невыпуклый многоугольник, заданый координатами вершин. Например: (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;
}
Примечание:
Может кому-то надо будет
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.