![]() |
|
|
![]()
|
|
| Гость_Гость |
|
|||
|
Unregistered |
Есть четырехугольник с координатами p0(x0,y0), p1(x1,y1), p2(x2,y2), p3(x3,y3) и точка с координатами n(x,y). Как узнать лежит точка внутри четырехугольника или нет.
Нашёл такой алгоритм:
Но он работает не точно. |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Если все векторные произведения векторов (вершина1-вершина2) и (вершина1-точка) имеют один знак - точка внутри.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Способ 1-й. Любая линия, представленная уравнением y=ax+b делит плоскость на "положительную" и "отрицательную". Т.е. Если мы представим уравнение в виде ax-y+b=0 и будем подставлять в уравнение точки, не лежащие на этой прямой, то для всех точек, лежащих по одну сторону от прямой величина "ошибки"(т.е. отличия от нуля) будет положительна, для другой полуплоскости эта величина будет отрицательна. Всегда можно составить уравнение 4-х прямых, образующих многоугольник так, что внутри будет отрицательная область (не подведи меня мой склероз
Способ 2-й. 4-хугольник разбивается на два треугольника. Если точка лежит внутри хотя бы одного треуголника - она лежит внутри 4-хугольника. ПРинадлежность треугольнику можно проверить эллементарно аннализирую раастояние до всех его 3-х вершин |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Еще если можешь посчитать площадь этого 4-х угольника, то сравни площади фигуры и сумму площадей 4 треугольников, полученых соединением точки с вершинами. Вот формула площади треугольника по вершинам:
Вывод из векторного произведения векторов, долго, поэтому не вывожу. -------------------- Всем добра |
|||
|
||||
| boevik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1452 Регистрация: 31.5.2004 Где: Израиль Репутация: нет Всего: 35 |
Использовать алгоритм для построяния выпуклой оболочки.
-------------------- Никогда не говори никогда |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Гость_Гость
Странно, что ваш код не работает, потому как это классический алгоритм Жордана. Может, где-то неверно реализован - там есть тонкости. А еще метод не работает для точки на границе - только строго внутри-снаружи. Здесь тест "точка в полигоне" обсуждается очень подробно, есть код на C и Фортране. Это сообщение отредактировал(а) Earnest - 5.7.2005, 19:57 -------------------- ... |
|||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 6 Всего: 74 |
Хм. Я таким кодом и пользуюсь. Только сбоев еще небыло.
Это сообщение отредактировал(а) SoWa - 6.7.2005, 07:46 -------------------- Всем добра |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
-------------------- qqq |
|||
|
||||
| Marriage |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 4.5.2004 Где: Таганрог Репутация: нет Всего: 2 |
Функция приведенная в самом начале у меня не работала не правильно.
При замене кода
на
У меня все заработало нормально. Это сообщение отредактировал(а) Marriage - 23.8.2005, 10:11 -------------------- Praemonitus, praemunitus |
||||
|
|||||
| SashaVinnica |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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-координату точки. Возвращаемые значения Если заданная точка находится в указанной области, то возвращается ненулевое значение. Если заданная точка находится вне указанной области, то возвращается нуль. |
|||
|
||||
| podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 18 Всего: 62 |
Не мог бы напомнить, есть какая-то теорема по данному поводу? |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
нет наверное... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| B0BAH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.9.2005 Репутация: нет Всего: нет |
Мне тоже задали задачку но посложней->там дан многоугольник(т.е. число точек x1,y1;x2,y2....xi,yi ; где i может быть >10)!Лежит ли x,y или не лежит!
Вот это делема!подскажите кто может |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Есть готовые алгоритмы деления произвольного многоугольника на треугольники. Так что чего тут более сложного? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| B0BAH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 14.9.2005 Репутация: нет Всего: нет |
http://algolist.manual.ru/maths/geom/belong/poly2d.php про это тему и вообще http://algolist.manual.ru --очень крут
|
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |