Направление обхода многоугольника
От: Zakhar Россия  
Дата: 24.05.02 07:28
Оценка:
Привет всем!
Скажите, пожалуйста, как определить направление обхода многоугольника?
Я делаю при помощи скалярных произведений смежных ребер, но пока что-то оно неверно определяется..
Подскажите, если не сложно!
Бороться, искать, найти и перепрятать!
Re: Направление обхода многоугольника
От: Lexey Россия  
Дата: 24.05.02 08:16
Оценка:
Здравствуйте Zakhar, Вы писали:

Z>Скажите, пожалуйста, как определить направление обхода многоугольника?

Z>Я делаю при помощи скалярных произведений смежных ребер, но пока что-то оно неверно определяется..

Ничего не понял. Направление обхода определяешь ты сам. Или тебе интересно выснить получилось оно по- или против часовой стрелки?
Re: Направление обхода многоугольника
От: ppp  
Дата: 24.05.02 08:24
Оценка:
Здравствуйте Zakhar, Вы писали:

Z>Привет всем!

Z>Скажите, пожалуйста, как определить направление обхода многоугольника?
Z>Я делаю при помощи скалярных произведений смежных ребер, но пока что-то оно неверно определяется..
Z>Подскажите, если не сложно!

Для этого имхо надо использовать векторное, а не скалярное произведение. Смысл в том, что векторное произведение двух смежных ребер даст тебе вектор. Далее относительно нормали к своему прямоугольнику ты можешь говорить о направлении обхода.
Если ты такой умный, почему ты такой бедный?
Re[2]: Направление обхода многоугольника
От: Аноним  
Дата: 24.05.02 08:28
Оценка:
Здравствуйте Lexey, Вы писали:

L>Ничего не понял. Направление обхода определяешь ты сам. Или тебе интересно выснить получилось оно по- или против часовой стрелки?


Именно так. Мне задан многоугольник — необходимо выяснить — как он задан. Это нужно для алгоритма Вейлера-Азертона отсечения многоугольников.

С уважением,
Захар.
Re[2]: Направление обхода многоугольника
От: Аноним  
Дата: 24.05.02 08:30
Оценка:
Здравствуйте ppp, Вы писали:

ppp>Для этого имхо надо использовать векторное, а не скалярное произведение. Смысл в том, что векторное произведение двух смежных ребер даст тебе вектор. Далее относительно нормали к своему прямоугольнику ты можешь говорить о направлении обхода.


Пардон! Ошибочка. Я использую именно векторное :-)
А как определять направление нормали? И что будет в случае невыпуклого многоугольника?
Re[3]: Направление обхода многоугольника
От: ppp  
Дата: 24.05.02 08:45
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте ppp, Вы писали:


ppp>>Для этого имхо надо использовать векторное, а не скалярное произведение. Смысл в том, что векторное произведение двух смежных ребер даст тебе вектор. Далее относительно нормали к своему прямоугольнику ты можешь говорить о направлении обхода.


А>Пардон! Ошибочка. Я использую именно векторное

А>А как определять направление нормали? И что будет в случае невыпуклого многоугольника?

Выпуклый-невыпуклый многоугольник — нам без разницы
Изначально ты задаешь направление нормали. Т.е. представляешь себе этот многоугольник в пространстве и говоришь — с этой стороны мы видим многоугольник, а вот с этой не должны видеть.
Нормаль ты вычисляешь как векторное произведение любых двух ребер, далее (исходя из своего представления многоугольника в пространстве) ты поворачиваешь ее в сторону от тела (опять же если она у тебя оказалась направленной внутрь тела).

Далее направление обхода вычисляется очевидно, я тебе уже писал:
1) Берешь любые два ребра, идущие подряд.
2) Вычисляешь их векторное произведение.
3) Смотришь, направлен-ли полученный вектор в одну сторону с нормалью или в другую сторону. Зная эти данные, можешь сказать, обходишь-ли ты многоугольник по часовой стрелке или против.

ВАЖНО: Все точки ребер в массиве у тебя должны быть заданы именно подряд. В принципе некоторые представления фигур в пространстве требуют задания точек в массиве, как если бы ты смотрел со стороны нормали на многоугольник и перечислял их против часовой стрелки. (это уже условности). Если ты таким образом задаешь все многоугольники в пространстве, то потом можно очень легко отсекать невидимые грани и избавляться от глюков
Если ты такой умный, почему ты такой бедный?
Re: Направление обхода многоугольника
От: Рек Россия  
Дата: 24.05.02 09:15
Оценка:
Здравствуйте Zakhar, Вы писали:

Z>Привет всем!

Z>Скажите, пожалуйста, как определить направление обхода многоугольника?
Z>Я делаю при помощи скалярных произведений смежных ребер, но пока что-то оно неверно определяется..
Z>Подскажите, если не сложно!


см. тут.
главное тут.
Re[4]: Направление обхода многоугольника
От: Zakhar Россия  
Дата: 24.05.02 09:15
Оценка:
Здравствуйте ppp

Спасибо большое! Но к сожалению, я не все понял:
ppp>Изначально ты задаешь направление нормали. Т.е. представляешь себе этот многоугольник в пространстве и говоришь — с этой стороны мы видим многоугольник, а вот с этой не должны видеть.
ppp>Нормаль ты вычисляешь как векторное произведение любых двух ребер,
А разве не надо просмотреть все ребра и проверить знаки всех векторных произведений? Как по двум ребрам можно заключить обо всем многоугольнике?
ppp>далее (исходя из своего представления многоугольника в пространстве) ты поворачиваешь ее в сторону от тела (опять же если она у тебя оказалась направленной внутрь тела).
Что значит _задать_ направление нормали? И что означает "поворачиваю"?

Прошу прощения за тугодумство :-)
Бороться, искать, найти и перепрятать!
Re[2]: Направление обхода многоугольника
От: Zakhar Россия  
Дата: 24.05.02 09:18
Оценка:
Здравствуйте Рек, Вы писали:

Рек>см. тут.

Рек>[url=http://rsdn.ru/forum/message.asp?mid=42412&only]главное тут.

Спасибо!
Бороться, искать, найти и перепрятать!
Re[5]: Направление обхода многоугольника
От: ppp  
Дата: 24.05.02 09:45
Оценка:
Здравствуйте Zakhar, Вы писали:

Z>Здравствуйте ppp


Z>Спасибо большое! Но к сожалению, я не все понял:

ppp>>Изначально ты задаешь направление нормали. Т.е. представляешь себе этот многоугольник в пространстве и говоришь — с этой стороны мы видим многоугольник, а вот с этой не должны видеть.
ppp>>Нормаль ты вычисляешь как векторное произведение любых двух ребер,
Z>А разве не надо просмотреть все ребра и проверить знаки всех векторных произведений? Как по двум ребрам можно заключить обо всем многоугольнике?
ppp>>далее (исходя из своего представления многоугольника в пространстве) ты поворачиваешь ее в сторону от тела (опять же если она у тебя оказалась направленной внутрь тела).
Z>Что значит _задать_ направление нормали? И что означает "поворачиваю"?

Z>Прошу прощения за тугодумство


                            A
                           /                          /                            /      \ F
                       B/    D   /
                        \   /\  /
                          \/  \/
                          C    E

Вот у тебя есть невыпуклый многоугольник ABCDEF. Допустим, что нормаль этого многоугольника смотрит тебе прямо в глаз Т.е. со своей стороны ты должен видеть этот многоугольник, а если смотреть с другой стороны монитора, то не должен. Направление нормали вычисляем как векторное произведение AB * BC В этом случае нормаль будет смотреть как раз тебе в левый глаз.
Выбираешь любую точку многоугольника (например A) и заносишь точки в свой массив по направлению против часовой стрелки. получается ты последовательно заносишь точки ABCDEF.
Далее чтобы понять, в какую сторону ты обходишь многоугольник, ты вычисляешь векторное произведение двух последовательных ребер. Например, ты начал обход с точки E, следующие точки у тебя EDCBAF.
Вычисляешь векторное произведение DE*DC (это вариант через среднюю точку, есть еще варианты через начальную точку обхода типа ED*DC, в принципе все одинаковы). Если полученный вектор направлен в сторону нормали, то направление обхода против часовой стрелки. Если в противоположную от нормали сторону, то обход по часовой стрелке.
Если ты такой умный, почему ты такой бедный?
Re[6]: Направление обхода многоугольника
От: ppp  
Дата: 24.05.02 09:51
Оценка:
Здравствуйте ppp, Вы писали:

ppp>Здравствуйте Zakhar, Вы писали:


Z>>Здравствуйте ppp


Z>>Спасибо большое! Но к сожалению, я не все понял:

ppp>>>Изначально ты задаешь направление нормали. Т.е. представляешь себе этот многоугольник в пространстве и говоришь — с этой стороны мы видим многоугольник, а вот с этой не должны видеть.
ppp>>>Нормаль ты вычисляешь как векторное произведение любых двух ребер,
Z>>А разве не надо просмотреть все ребра и проверить знаки всех векторных произведений? Как по двум ребрам можно заключить обо всем многоугольнике?
ppp>>>далее (исходя из своего представления многоугольника в пространстве) ты поворачиваешь ее в сторону от тела (опять же если она у тебя оказалась направленной внутрь тела).
Z>>Что значит _задать_ направление нормали? И что означает "поворачиваю"?

Z>>Прошу прощения за тугодумство

ppp>

ppp>                            A
ppp>                           /                          /                            /      \ F
ppp>                       B/    D   /
ppp>                        \   /\  /
ppp>                          \/  \/
ppp>                          C    E
ppp>


А на предосмотре многоугольник был в нормальном состоянии Непорядочек

                          A
                        /                        /      \F
                   B/    D   /
                    \   /\  /
                      \/  \/
                      C    E
Если ты такой умный, почему ты такой бедный?
Re[7]: Направление обхода многоугольника
От: ppp  
Дата: 24.05.02 09:53
Оценка:
Здравствуйте ppp, Вы писали:

Черти что. Не выходит каменный цветок.
Если ты такой умный, почему ты такой бедный?
Re[6]: Направление обхода многоугольника
От: Zakhar Россия  
Дата: 24.05.02 09:53
Оценка:
Здравствуйте ppp, Вы писали:

ppp>Здравствуйте Zakhar, Вы писали:


ppp>

ppp>                            A
ppp>                           /                          /                            /      \ F
ppp>                       B/    D   /
ppp>                        \   /\  /
ppp>                          \/  \/
ppp>                          C    E
ppp>


Спасибо! :)
Бороться, искать, найти и перепрятать!
Re[6]: Направление обхода многоугольника
От: fAX Израиль  
Дата: 29.12.02 10:25
Оценка:
Здравствуйте, ppp, Вы писали:

ppp>

ppp>                        A /      \ F
ppp>                         /        /      
ppp>                       B/    D   /
ppp>                        \   /\  /
ppp>                          \/  \/
ppp>                          C    E
ppp>

ppp>Вот у тебя есть невыпуклый многоугольник ABCDEF. Допустим, что нормаль этого многоугольника смотрит тебе прямо в глаз Т.е. со своей стороны ты должен видеть этот многоугольник, а если смотреть с другой стороны монитора, то не должен. Направление нормали вычисляем как векторное произведение AB * BC В этом случае нормаль будет смотреть как раз тебе в левый глаз.
ppp>Выбираешь любую точку многоугольника (например A) и заносишь точки в свой массив по направлению против часовой стрелки. получается ты последовательно заносишь точки ABCDEF.
ppp>Далее чтобы понять, в какую сторону ты обходишь многоугольник, ты вычисляешь векторное произведение двух последовательных ребер. Например, ты начал обход с точки E, следующие точки у тебя EDCBAF.
ppp>Вычисляешь векторное произведение DE*DC (это вариант через среднюю точку, есть еще варианты через начальную точку обхода типа ED*DC, в принципе все одинаковы). Если полученный вектор направлен в сторону нормали, то направление обхода против часовой стрелки. Если в противоположную от нормали сторону, то обход по часовой стрелке.

Вот, изначально тоже думал всех перехитрить, проверял векторное произведение векторов, определяемых тремя последними точками. Не перехитрил, иногда выходит 0 — и начинаются проблемы. После думал считать индексы самой левой, самой правой, верхней и нижней точек, а по ним определить направление обхода — тоже плохо:

___
     \  \
      \__\

получается 2 "экстремума" — и ничего не поделаешь, определить невозможно.

Во время написания пришла ещё одна идея для выпуклых многоугольников (А меня многоугольники именно выпуклые):
Запоминать — шли вниз влево, влево...
Или — вправо, вправо вверх.
Первого изменения направления — достаточно.
Думаю, как быстро определить это. Может, массив?
Что скажете?

С уважением,
fAX.
...Complex problems have simple, easy-to-understand wrong answers...
(Grossman's Misquote of H.L.Mencken)
Re[4]: Направление обхода многоугольника
От: Pushkin Россия www.linkbit.com
Дата: 30.12.02 08:07
Оценка: 4 (1)
Здравствуйте, ppp, Вы писали:


ppp>Далее направление обхода вычисляется очевидно, я тебе уже писал:

ppp>1) Берешь любые два ребра, идущие подряд.
ppp>2) Вычисляешь их векторное произведение.

НЕВЕРНО! Не надо брать два ребра, идущие подряд.
Надо брать ТОЧКИ, идущие подряд, а не РАЗНОСТИ точек.

Иными словами надо взять сумму по всем вершинам величин x[i]*y[i+1]-x[i+1]*y[i]
Знак получившейся суммы даёт направление обхода.
А модуль — удвоенную площадь.

В оригинале смотри здесь

PS
Самое подлое, что если брать произведение рёбер, а не точек, то для очень многих (но не для всех!) полигонов тоже работает.
Re: Направление обхода многоугольника
От: Андрей Тарасевич Беларусь  
Дата: 30.12.02 09:07
Оценка:
Здравствуйте, Zakhar, Вы писали:

Z>Скажите, пожалуйста, как определить направление обхода многоугольника?

Z>Я делаю при помощи скалярных произведений смежных ребер, но пока что-то оно неверно определяется..

Во-первых, не скалярное произведение тебе нужно, а векторное (cross-product).

Во-вторых, перемножать надо не произвольную пару смежных ребер, а пару смежных ребер, выходящих из самой нижней из самых левых вершин многоугольника (или из самой левой из самых верхних, иди еще какую комбинацию можно взять — неважно).

Знак векторного произведения даст тебе направление обхода.
Best regards,
Андрей Тарасевич