Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Точка в четырехугольнике, Точка в четырехугольнике 
:(
    Опции темы
Гость_Гость
Дата 5.7.2005, 16:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть четырехугольник с координатами p0(x0,y0), p1(x1,y1), p2(x2,y2), p3(x3,y3) и точка с координатами n(x,y). Как узнать лежит точка внутри четырехугольника или нет.

Нашёл такой алгоритм:

Код


type
  TReal1DArray        = array of Double;

function IsPointInPolygon(x : Double;
     y : Double;
     N : Integer;
     const XPO : TReal1DArray;
     const YPO : TReal1DArray):Boolean;
var
    I : Integer;
    XPI : TReal1DArray;
    YPI : TReal1DArray;
begin
    SetLength(XPI, N+1);
    SetLength(YPI, N+1);
    I:=1;
    while I<=N do
    begin
        XPI[I] := XPO[I];
        YPI[I] := YPO[I];
        Inc(I);
    end;
    XPI[0] := XPI[N];
    YPI[0] := YPI[N];
    i := 0;
    Result := False;
    repeat
        if  not ((y>YPI[i]) xor (y<=YPI[i+1])) then
        begin
            if x-XPI[i]<(y-YPI[i])*(XPI[i+1]-XPI[i])/(YPI[i+1]-YPI[i]) then
            begin
                Result :=  not Result;
            end;
        end;
        i := i+1;
    until  not (i<=n-1);
end;




Но он работает не точно.
  Вверх
Akina
Дата 5.7.2005, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Если все векторные произведения векторов (вершина1-вершина2) и (вершина1-точка) имеют один знак - точка внутри.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
DENNN
Дата 5.7.2005, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Способ 1-й. Любая линия, представленная уравнением y=ax+b делит плоскость на "положительную" и "отрицательную". Т.е. Если мы представим уравнение в виде ax-y+b=0 и будем подставлять в уравнение точки, не лежащие на этой прямой, то для всех точек, лежащих по одну сторону от прямой величина "ошибки"(т.е. отличия от нуля) будет положительна, для другой полуплоскости эта величина будет отрицательна. Всегда можно составить уравнение 4-х прямых, образующих многоугольник так, что внутри будет отрицательная область (не подведи меня мой склероз smile). Дальше думаю сам разберешься...
Способ 2-й. 4-хугольник разбивается на два треугольника. Если точка лежит внутри хотя бы одного треуголника - она лежит внутри 4-хугольника. ПРинадлежность треугольнику можно проверить эллементарно аннализирую раастояние до всех его 3-х вершин
PM ICQ   Вверх
SoWa
Дата 5.7.2005, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Еще если можешь посчитать площадь этого 4-х угольника, то сравни площади фигуры и сумму площадей 4 треугольников, полученых соединением точки с вершинами. Вот формула площади треугольника по вершинам:
Код

S= 1/2 * abs( (x2-x1)*(y3-y1) - (y2-y1)*(x3-x1) )

Вывод из векторного произведения векторов, долго, поэтому не вывожу.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
boevik
Дата 5.7.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: нет
Всего: 35



Использовать алгоритм для построяния выпуклой оболочки.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Earnest
Дата 5.7.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Гость_Гость
Странно, что ваш код не работает, потому как это классический алгоритм Жордана. Может, где-то неверно реализован - там есть тонкости. А еще метод не работает для точки на границе - только строго внутри-снаружи.
Здесь тест "точка в полигоне" обсуждается очень подробно, есть код на C и Фортране.

Это сообщение отредактировал(а) Earnest - 5.7.2005, 19:57


--------------------
...
PM   Вверх
SoWa
Дата 6.7.2005, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Хм. Я таким кодом и пользуюсь. Только сбоев еще небыло.

Это сообщение отредактировал(а) SoWa - 6.7.2005, 07:46


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
maxim1000
Дата 6.7.2005, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110





--------------------
qqq
PM WWW   Вверх
Marriage
Дата 23.8.2005, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 4.5.2004
Где: Таганрог

Репутация: нет
Всего: 2



Функция приведенная в самом начале у меня не работала не правильно.
При замене кода
Код

XPI[I] := XPO[I];
YPI[I] := YPO[I];


на

Код

XPI[I] := XPO[I-1];
YPI[I] := YPO[I-1];


У меня все заработало нормально.

Это сообщение отредактировал(а) Marriage - 23.8.2005, 10:11


--------------------
Praemonitus, praemunitus
PM MAIL ICQ   Вверх
SashaVinnica
Дата 4.9.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 16.3.2005

Репутация: нет
Всего: нет



Предлагаю использовать API функии



Функция CreatePolygonRgn создает многоугольную область.

HRGN CreatePolygonRgn(

CONST POINT *lppt, // указатель на массив точек
int cPoints, // число точек в массиве
int fnPolyFillMode // режим заполнения многоугольника
);


Параметры

lppt – указатель на массив структур типа POINT, которые определяют вершины многоугольника. Многоугольник полагается замкнутым. Каждая вершина может быть задана лишь один раз.

cPoints – определяет количество точек в массиве.

fnPolyFillMode – тебе он не нужен

Возвращаемые значения

В случае успеха возвращается дескриптор области.
В случае неудачи возвращается NULL.




Структура POINT определяет x- и y- координаты точки.

typedef struct tagPOINT {
LONG x;
LONG y;
} POINT;


Члены

x – определяет x-координату точки.
y – определяет y-координату точки.



Функция PtInRegion определяет, находится ли заданная точка внутри указанной области.

BOOL PtInRegion(

HRGN hrgn, // дескриптор области
int X, // x-координата точки
int Y // y-координата точки
);


Параметры

hrgn – идентифицирует область.

X – указывает x-координату точки.

Y – указывает y-координату точки.

Возвращаемые значения

Если заданная точка находится в указанной области, то возвращается ненулевое значение.

Если заданная точка находится вне указанной области, то возвращается нуль.




PM MAIL ICQ   Вверх
podval
Дата 5.9.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 18
Всего: 62



Цитата(Akina @ 5.7.2005, 18:17)
Если все векторные произведения векторов (вершина1-вершина2) и (вершина1-точка) имеют один знак - точка внутри.

Не мог бы напомнить, есть какая-то теорема по данному поводу?
PM WWW ICQ   Вверх
Akina
Дата 5.9.2005, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(podval @ 5.9.2005, 12:01)
есть какая-то теорема по данному поводу?

нет наверное...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
B0BAH
Дата 15.9.2005, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.9.2005

Репутация: нет
Всего: нет



Мне тоже задали задачку но посложней->там дан многоугольник(т.е. число точек x1,y1;x2,y2....xi,yi ; где i может быть >10)!Лежит ли x,y или не лежит! smile

Вот это делема!подскажите кто может
PM MAIL   Вверх
Akina
Дата 15.9.2005, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(B0BAH @ 15.9.2005, 17:40)
Мне тоже задали задачку но посложней

Есть готовые алгоритмы деления произвольного многоугольника на треугольники. Так что чего тут более сложного?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
B0BAH
Дата 16.9.2005, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.9.2005

Репутация: нет
Всего: нет



http://algolist.manual.ru/maths/geom/belong/poly2d.php про это тему и вообще http://algolist.manual.ru --очень крут
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.