Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить направленность контура, За часовой, против часовой 
:(
    Опции темы
S.A.G.
Дата 14.4.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Задано множество точек на плоскости, образующее произвольный замкнутый контур (выпуклый, не выпуклый). Если все ребра заменить векторами ориентированными таким образом что начало каждого вектора являеться концом предыдущего то получим направленный контур. Причем возможно всего два варианта - за часовой и против часовой стрелки. В первом случае все точки расположенные слева от каждого вектора лежат вне контура, во втором - все правые точки. Контур задаеться последовательно - от первой точки (она же являеться и последней) до предпоследней, следовательно направление каждого отдельного вектора известно. Как определить направление контура?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Artemios
Дата 15.4.2007, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(S.A.G. @  14.4.2007,  22:23 Найти цитируемый пост)
В первом случае все точки расположенные слева от каждого вектора лежат вне контура, во втором - все правые точки.

Контур выпуклый. Берем произвольно три последовательные точки (главное, чтобы не на одной прямой), смотрим, в право или влево уклоняется третья от вектора, заданного от первой ко второй.
Подробно, пусть это три точки
A1=(x1,y1) , 
A2=(x2,y2) , 
A3=(x3,y3) , 
Тогда прямая, проходящая ч/з A1 и A2: (x-x1)(y2-y1)=(x2-x1)(y-y1).
Пусть x1<x2, тогда если точка A3 справа от вектора A1A2, то она ниже прямой 
и следовательно (x3-x1)(y2-y1)>(x2-x1)(y3-y1) , следовательно направление всего контура по часовой, 
если x1<x2 и (x3-x1)(y2-y1)<(x2-x1)(y3-y1) , то против часовой,
x1>x2 и (x3-x1)(y2-y1)<(x2-x1)(y3-y1) по часовой,
x1>x2 и (x3-x1)(y2-y1)>(x2-x1)(y3-y1) против часовой.
Т.к. контур выпуклый, то достаточно рассмотреть только три точки.

P.S. И отдельный случай, если x1=x2.
Тогда если y1<y2 и x3>x1 -- по часовой,
y1<y2 и x3<x1 -- против часовой,
y1>y2 и x3>x1 -- против часовой,
y1>y2 и x3<x1 -- по часовой.


Это сообщение отредактировал(а) Artemios - 15.4.2007, 00:39


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
maxim1000
Дата 15.4.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



для невыпуклого можно посмотреть, на на какой угол изменяется направление вектора при переходе от n к (n+1)-му и сложить эти углы
получится +360 или -360 та и определить
ещё можно покрутить в сторону формулы Грина - с помощью неё можно определить "ориентированную площадь", знак которой и даёт ответ...


--------------------
qqq
PM WWW   Вверх
S.A.G.
Дата 15.4.2007, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Цитата(maxim1000 @ 15.4.2007,  00:52)
для невыпуклого можно посмотреть, на на какой угол изменяется направление вектора при переходе от n к (n+1)-му и сложить эти углы
получится +360 или -360 та и определить
ещё можно покрутить в сторону формулы Грина - с помощью неё можно определить "ориентированную площадь", знак которой и даёт ответ...

Не совсем понял твою мысль.

Насчет формулы Грина - разве она не только для выпуклых многоугольников?


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Artemios
Дата 15.4.2007, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



P.P.S.
Для произвольного контура, не обязательно выпуклого, можно поступить и таким образом.
Пусть даны последовательные точки A(i)=(x(i),y(i)), где 1<=i<=n.
Определим числа s(i) = ( x(i+1) - x(i) ) * ( y(i) + y(i+1) ) / 2  при i<n,
s(n) = ( x(1) - x(n) ) * ( y(n) + y(1) ) / 2 .
Считаем сумму всех s(i) : S = sum s(i) , 1<=i<=n .
Если S>0 , то направление по часовой стрелке,
если S<0 , то против.

Добавлено @ 01:42
это и есть "ориентированная площадь"

Добавлено @ 01:45
Кстати, это:
Цитата(S.A.G. @  14.4.2007,  22:23 Найти цитируемый пост)
Причем возможно всего два варианта - за часовой и против часовой стрелки. В первом случае все точки расположенные слева от каждого вектора лежат вне контура, во втором - все правые точки.

говорит о том, что контур именно выпуклый по определению.

Это сообщение отредактировал(а) Artemios - 15.4.2007, 01:48


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
maxim1000
Дата 15.4.2007, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(S.A.G. @  15.4.2007,  01:01 Найти цитируемый пост)
Не совсем понял твою мысль

первую или вторую?
если вторую, то Artemios как раз её и описал



--------------------
qqq
PM WWW   Вверх
S.A.G.
Дата 15.4.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Цитата(Artemios)
говорит о том, что контур именно выпуклый по определению.

Нет, это не так. Нарисуй любой контур по точкам и проставь стрелки.
Цитата(maxim1000)
первую или вторую?

Поначалу - первую. Уже разобрался. Углы считать будет сложнее чем по формуле ориентированной площади.

Это сообщение отредактировал(а) S.A.G. - 15.4.2007, 12:35


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
maxim1000
Дата 15.4.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(S.A.G. @  15.4.2007,  12:27 Найти цитируемый пост)
Углы считать будет сложнее чем по формуле ориентированной площади.

да, второй способ лучше, арксинусов не надо будет считать, да и площадь на всякий случай имеется
первый я так, "до кучи" smile


--------------------
qqq
PM WWW   Вверх
S.A.G.
Дата 15.4.2007, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Artemios, получаеться что любой контур имеет направление? Мой контур имеет направление которое зависит от направления движения мыши при вводе точек - от начальной точки к конечной.  Будет ли совпадать это направление с определенным по формуле Грина?

Это сообщение отредактировал(а) S.A.G. - 15.4.2007, 14:01


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
S.A.G.
Дата 15.4.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Помоему разобрался - результат в формуле Грина зависит от направления обхода контура. Если я выберу направление совпадающее с направлением при вводе точек то получу нужный результат.

Кстати а если S = 0 или такой вариант невозможен?

Это сообщение отредактировал(а) S.A.G. - 15.4.2007, 14:56


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Artemios
Дата 15.4.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(S.A.G. @  15.4.2007,  13:27 Найти цитируемый пост)
Нет, это не так.

Многоугольник называется выпуклым, если для любого ребра весь многоугольник лежит только по одну сторону от ребра (в одной полуплоскости). Независимо от того, направленные ребра или просто отрезки.

Цитата(S.A.G. @  15.4.2007,  15:20 Найти цитируемый пост)
Кстати а если S = 0 или такой вариант невозможен?

Если без самопересечений, то невозможен.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
S.A.G.
Дата 15.4.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Цитата(Artemios @ 15.4.2007,  01:41)
Кстати, это:
Цитата(S.A.G. @  14.4.2007,  22:23 Найти цитируемый пост)
Причем возможно всего два варианта - за часовой и против часовой стрелки. В первом случае все точки расположенные слева от каждого вектора лежат вне контура, во втором - все правые точки.

говорит о том, что контур именно выпуклый по определению.

Не говорит. Такое можно сказать как о выпуклых так и о не выпуклых многоугольниках. smile


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Artemios
Дата 15.4.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



???
Пусть направление по часовой (аналогично и для "против часовой"). Все точки, расположенные слева от каждого вектора лежат вне контура.
Следовательно, весь контур (за исключением данного вектора) лежит справа от этого вектора.
Определение выпуклости многоугольника (еще школьное, кажись):
Цитата(Artemios @  15.4.2007,  17:10 Найти цитируемый пост)
Многоугольник называется выпуклым, если для любого ребра весь многоугольник лежит только по одну сторону от ребра (в одной полуплоскости).

поэтому
Цитата(S.A.G. @  15.4.2007,  17:26 Найти цитируемый пост)
Такое можно сказать как о выпуклых так и о не выпуклых многоугольниках.

все-же нельзя сказать.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
S.A.G.
Дата 15.4.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

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



Цитата(Artemios)
Следовательно, весь контур (за исключением данного вектора) лежит справа от этого вектора.

Ну нарисуй контур невыпуклый и убедись что это не всегда так.


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
Artemios
Дата 15.4.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(S.A.G. @  15.4.2007,  21:41 Найти цитируемый пост)
Цитата(Artemios)
Следовательно, весь контур (за исключением данного вектора) лежит справа от этого вектора.

Ну нарисуй контур невыпуклый и убедись что это не всегда так. 

Именно smile При невыпуклом -- действительно не всегда так smile Точнее, если многоугольник не выпуклый, то как минимум для двух ребер (а следовательно и векторов) не выполнено условие:
Цитата(S.A.G. @  14.4.2007,  22:23 Найти цитируемый пост)
В первом случае все точки расположенные слева от каждого вектора лежат вне контура, во втором - все правые точки.




--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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