Страница 1 из 1

Как определить величину внутренних углов многоугольника?

Добавлено: 14 май 2004, 13:48
Олег
Дан произвольный НЕВЫПУКЛЫЙ :!: многоугольник c n вершинами.
Каждая вершина имеет координаты
P1(x1.y1), P2(x2,y2)...Pn(xn,yn)
Как определить величину внутренних углов при каждой вершине :?:

Добавлено: 14 май 2004, 15:14
Ведьмак
Елки-моталки. :evil: Неужели не взять учебник по геометрии и не покумекать на досуге? Задача-то простейшая - 10 класс средней школы...

Добавлено: 14 май 2004, 19:28
Олег
Ведьмак, я с тобой полностью согласен, найти угол не проблема, если
многоугольник выпуклый, а если не выпуклый и некоторые внутринние углы превышают 180. Если знаеш как быть - посоветуй :!:
То что для некоторых проще "пареной репы" для других -неразрешаемая проблема!!! :?
Таким образом, как ТЫ ответил, можно ответить на любой вопрос - возьми книгу почитай :?

Добавлено: 17 май 2004, 09:33
Ведьмак
Что ВЫ хотите от меня, как представителя форума? Готовую программу? Когда на форумах в качестве ответа приводят URL - это никого не обижает почему-то... Чем ВАС так задела ссылка на учебник геометрии? Ведь задача именно оттуда. И для "впуклых" многоугольников - тоже. Лично я не держу в голове всех формул из всех учебников. Посему точно таким же образом должен листать учебник в поисках решения.

Добавлено: 17 май 2004, 11:43
Олег
Лично от Вас - ничего!
Первое, что я сделал, когда столкнулся с этой проблемой - проанализировал десяток учебников и справочников! Там только елементарй выпуклый многоугольник, а интерисуюющей меня информации о "впуклых", как Вы выразились, многоугольниках -как правило нет, поетому я и обратился за помощью на Форум!
Почему мой вопрос у Вас вызвал раздражение(я имею в виду ЕЛКИ-Моталки :evil: !!!), я так и не понял!
Олег К.

Добавлено: 17 май 2004, 11:52
Ведьмак
Да раздражения не было. Просто перепутал смайлик. Так что будем считать, что друг-друга просто не поняли и замирим?
А по поводу все тех-же углов - почему бы не определить его тем же макаром, что и остальные, а потом вычесть из 360? Останется только определить критерий "впуклости".

Добавлено: 17 май 2004, 15:13
Гость
Привет!
В том -то вся проблема - как его определить, этот критерий т.н. "впуклости", зная всего только три точки,что образуют
данный угол!

Добавлено: 17 май 2004, 15:24
Ведьмак
Поправка! Известны ВСЕ вершины полигона.
Соответственно, построив единичный отрезок по гипотенузе в любую из сторон мы имеем принадлежность конца данного отрезка полигону. Это только один из способов.
Также точно помню, что существуют именные алгоритмы (к сожалению не помню авторов), моделирующие именно этот аспект анализа многоугольников.

Добавлено: 18 май 2004, 10:17
Максим Дубинин
Поправьте меня, если что не так. Но что мешает посчитать все углы, по порядку по триплетам, со сдвигом на одну точку, с возвращением к первой а потом отобрать те, что нужны?

http://gis-lab.info/qa/aveazimuth.html

Ведьмак, ты не прав, если б ты знал, сколько времени я трачу на решение банальных задач, с удовольствием бы использовал готовые, но многим просто недосуг вникать в формулы...другое дело взять кусок кода и не мучаться. Так что, как решите задачу, милости просим в "Вопросы-Ответы"

Добавлено: 22 июн 2004, 06:42
S.E.
На сайте ESRI Дан Паттерсон выложил новое расширение, с помощью которого можно определять углы:
http://arcscripts.esri.com/details.asp?dbid=13556

Добавлено: 25 июн 2004, 19:24
Roman
В ArcView полигоны хранятся таким образом, что вершины идут по часовой стрелке, значит внутренние углы будут правыми, следовательно пишем программку для каждой тройки подряд следующих вершин P1(x1,y1), P2(x2,y2), P3(x3,y3) ищем "внутренний" для точки P2:

pi= Number.GetPi

'Вычислим угол наклона луча P2-P1
d= p1-p2
angle1= (d.GetY/d.GetX).atan.asDegrees
if (d.GetX<0) then
angle1= angle1+180
elseif (d.GetY<0) then
angle1= angle1+360
end

'Теперь вычислим угол наклона луча P2-P3
d= p3-p2
angle2= (d.GetY/d.GetX).atan.asDegrees
if (d.GetX<0) then
angle2= angle2+180
elseif (d.GetY<0) then
angle2= angle2+360
end

angle= angle2-angle1 'Разница и будет искомый угол

if (angle1 > angle2) then 'если перестарались, берём обратный :)
angle= 360+angle
end

Окончательно в переменной angle будет правый (внутренний) угол в градусах :wink:

Это на тот случай если надо вставить в свой скрипт, а не просто посчитать чужим... :twisted:

П.С. Пожалуйста

Re: Как определить величину внутренних углов многоугольника?

Добавлено: 30 ноя 2009, 21:32
sldsnk
Не поверите, так долго пропарился над этой проблемой, и почему-то вышеприведенный код мне не помог... Не могу не помочь другим.
"Впуклость" угла определяется по знаку определителя (что такое определитель и как его посчитать в интернете ссылок масса):
|x1 y1 1|
|x2 y2 1|
|x3 y3 1|
Если определитель больше 0, то угол меньше 180, меньше 0 - угол больше 180. Углы отсчитываются по часовой стрелке.