Re: определить принадлежность точки к плоской фигуре
От: McSeem2 США http://www.antigrain.com
Дата: 16.05.07 15:26
Оценка: 15 (2) +1
Здравствуйте, kkv79, Вы писали:

K>есть многоугольник

K>координаты его точек x1,y1.....xn,yn ..... x1,y1.
K>есть точка с координатами x,y
K>как определить лежит ли эта точка внутри или снаружи этого многоугольника?

Не читай википедий и алголистов — там в чаще всего ламеры публикуют свои лабораторные работы. Eric Haines, Point in Polygon Strategies — исчерпывающее раскрытие темы. http://www1.acm.org/pubs/tog/editors/erich/ptinpoly/
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
определить принадлежность точки к плоской фигуре
От: kkv79  
Дата: 11.05.07 09:18
Оценка:
есть многоугольник
координаты его точек x1,y1.....xn,yn ..... x1,y1.
есть точка с координатами x,y
как определить лежит ли эта точка внутри или снаружи этого многоугольника?
Re: определить принадлежность точки к плоской фигуре
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 11.05.07 09:43
Оценка:
Здравствуйте, kkv79, Вы писали:

K>есть многоугольник

K>координаты его точек x1,y1.....xn,yn ..... x1,y1.
K>есть точка с координатами x,y
K>как определить лежит ли эта точка внутри или снаружи этого многоугольника?

http://ru.wikipedia.org/wiki/Алгоритм_точки_в_многоугольнике
"Что не завершено, не сделано вовсе" Гаусс
Re: определить принадлежность точки к плоской фигуре
От: Lloyd Россия  
Дата: 11.05.07 09:47
Оценка:
Здравствуйте, kkv79, Вы писали:

K>есть многоугольник

K>координаты его точек x1,y1.....xn,yn ..... x1,y1.
K>есть точка с координатами x,y
K>как определить лежит ли эта точка внутри или снаружи этого многоугольника?

Первое что в голову пришло: посчитайте сумму углов Pi-O-Pi+1, i = 1 .. n, Pi = (xi, yi), O — ваша точка. Если получился 0, то снаружи.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: очень простой алгоритм:
От: gok Россия  
Дата: 11.05.07 18:02
Оценка:
здесь
gok
Re: определить принадлежность точки к плоской фигуре
От: MegaVoltik  
Дата: 14.05.07 11:19
Оценка:
K>есть многоугольник
K>координаты его точек x1,y1.....xn,yn ..... x1,y1.
K>есть точка с координатами x,y
K>как определить лежит ли эта точка внутри или снаружи этого многоугольника?

Есть стандартная виндяшная функция PtInRegion делает именно то что тебе нужно. По точкам создай регион и проверь входит ли точка в него.
Чем больше нас, тем меньше их...
Re: определить принадлежность точки к плоской фигуре
От: Мурлакотам Россия  
Дата: 14.05.07 18:20
Оценка:
Здравствуйте, kkv79, Вы писали:

K>есть многоугольник

K>координаты его точек x1,y1.....xn,yn ..... x1,y1.
K>есть точка с координатами x,y
K>как определить лежит ли эта точка внутри или снаружи этого многоугольника?


/*
  Проверка принадлежности точки полигону по теореме Жордана -
  путем определения количества пересечений луча, выпущеного из нее, 
  с отрезками полигона. Луч выпускается вверх.

  Параметры:

  точки многоугольника; 
  число тоточек в нём; 
  точка, принаджежность которой многоугольнику нужно проверить;

  Возвращает:

  Перечисляемый тип - Inside, Outside, OnBorder.
*/
Belonging PointInPolygon(TPoint* Points,int Count, double x, double y){
    
    int next, Counter = 0; 
    double x1, y1, x2, y2, dx, dy, p;
    
    for (int i = 0; i < Count; i++){

        next = (i+1) % Count;

        x1 = Points[next].x; 
        y1 = Points[next].y;
        x2 = Points[i].x; 
        y2 = Points[i].y;

        if ((y1 < y) && (y2 < y)) 
            continue;

        if (x1 == x)
            if (y1 == y) return OnBorder;//Точка совпала с одним из узлов
            else 
            if (x2 == x)
                if ((y1 <= y) || (y2 <= y)) return OnBorder;//Точка на вертикальной границе 
                else 
                    continue;

                if (((x2 <=x ) && (x1<=x)) || ((x2 > x) && (x1 > x))) 
                    continue;

                if ((y1 > y) && (y2 > y)) 
                    Counter++;

                else{
                    dx = x2 - x1; 
                    dy = y2 - y1;
                    p = y1 + (x-x1) / dx * dy;

                    if (p > y) 
                        Counter++;

                    else if (p == y) 
                        return OnBorder;
                }
    }

    if (Counter % 2 == 0) 
        return Outside;
    else 
        return Inside;
}
Re[2]: определить принадлежность точки к плоской фигуре
От: McSeem2 США http://www.antigrain.com
Дата: 16.05.07 15:28
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>http://ru.wikipedia.org/wiki/Алгоритм_точки_в_многоугольнике


Ужас-ужас! Если мозгов в голове нет, то давайте на треугольники порубаем, ага.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: определить принадлежность точки к плоской фигуре
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 17.05.07 07:04
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Не читай википедий и алголистов — там в чаще всего ламеры публикуют свои лабораторные работы. Eric Haines, Point in Polygon Strategies — исчерпывающее раскрытие темы. http://www1.acm.org/pubs/tog/editors/erich/ptinpoly/


Препарата Ф., Шеймос М. — Вычислительная геометрия: введение Глава 2. Геометрический поиск, параграф 2.2. Локализация точки — исчерпывающее раскрытие темы (просто печатным изданиям я склонен верить больше). Там предствален алгоритм, работающий за O(N) и использующий ту же идею что и в указанной мной ссылке в википедии в разделе Очень быстрый алгоритм, а именно число точек пересечения луча и сторон многоугольника
"Что не завершено, не сделано вовсе" Гаусс
Re[3]: определить принадлежность точки к плоской фигуре
От: McSeem2 США http://www.antigrain.com
Дата: 17.05.07 16:12
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>Препарата Ф., Шеймос М. — Вычислительная геометрия: введение Глава 2. Геометрический поиск, параграф 2.2. Локализация точки — исчерпывающее раскрытие темы (просто печатным изданиям я склонен верить больше). Там предствален алгоритм, работающий за O(N) и использующий ту же идею что и в указанной мной ссылке в википедии в разделе Очень быстрый алгоритм, а именно число точек пересечения луча и сторон многоугольника


Ну а зачем тогда ссылаться на какую-то лажу с разбиением на треугольники? Ведь именно этот алгоритм подробно описан и он вводит новичков в заблуждение — что яко-бы "это и есть нормальный метод". А поиск пересечений с лучем только лишь упомянут и упомянут как "очень быстрый". В действительности же он не очень быстрый, а нормальный. А с треугольниками и заведомым временем работы O(N^2) как раз является полной лажей. Поэтому я призываю думать, прежде чем давать на работы студентов-первокурсников как на яко-бы алгоритмы.

Что же касается "верить" или "не верить", то Эрик Хайнес как источник в общем и целом будет поглавней ископаемых Препараты и Шеймоса. Такие слова как SIGGRAPH, ACM ни о чем не говорят?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: определить принадлежность точки к плоской фигуре
От: gok Россия  
Дата: 30.07.07 19:33
Оценка:
Здравствуйте, Мурлакотам!
Проверил экстремальные случаи "точки на границах". По-моему надо поменять местами проверки:
if (p > y) 
   Counter++;
else if (p == y) 
   return OnBorder;


if (approx_equal(p, y, eps)) 
   return OnBorder;
else if (p > y) 
   Counter++;
...
#define approx_equal(a,b,c) (fabs(a-b)<=c)


В "стандартных" случаях работает без ошибок.
gok
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.