Поиск:

Ответ в темуСоздание новой темы Создание опроса
> центр многоугольника 
:(
    Опции темы
_hunter
  Дата 11.12.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



Добрый день.

как найти центр многоугольника


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
podval
Дата 11.12.2004, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Центр тяжести?
PM WWW ICQ   Вверх
maxim1000
Дата 11.12.2004, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



а что такое центр многоугольника?
а то ведь можно понапридумывать кучу центров:
1. центр тяжести
2. центр вписанной окружности
3. центр минимального круга, содержащего весь многоугольник
+еще какие-нибудь, которые в голову мне не пришли...


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


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



maxim1000, не учел...
центр тяжести.


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
cardinal
Дата 11.12.2004, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



Я опять же на примере VB объясню. Вот такой вариант мне недавно попался:
Код

' Find the polygon's centroid.
Public Sub FindCentroid(ByRef X As Single, ByRef Y As Single)
Dim pt As Integer
Dim second_factor As Single
Dim polygon_area As Single

   ' Add the first point at the end of the array.
   ReDim Preserve m_Points(1 To m_NumPoints + 1)
   m_Points(m_NumPoints + 1) = m_Points(1) ' в массиве m_Points сидят точки многоугольника

   ' Find the centroid.
   X = 0
   Y = 0
   For pt = 1 To m_NumPoints ' очень хитрое вычисление =)
       second_factor = _
           m_Points(pt).X * m_Points(pt + 1).Y - _
           m_Points(pt + 1).X * m_Points(pt).Y
       X = X + (m_Points(pt).X + m_Points(pt + 1).X) * _
           second_factor
       Y = Y + (m_Points(pt).Y + m_Points(pt + 1).Y) * _
           second_factor
   Next pt

   ' Divide by 6 times the polygon's area.
   polygon_area = PolygonArea ' PolygonArea это функция которая возвращает площадь полинона
   X = X / 6 / polygon_area
   Y = Y / 6 / polygon_area

   ' If the values are negative, the polygon is
   ' oriented counterclockwise. Reverse the signs.
   If X < 0 Then
       X = -X
       Y = -Y
   End If
End Sub

Вот функция PolygonArea и одна еще для нее нужная
Код

' Return the polygon's area in "square" pixels.
' Add the areas of the trapezoids defined by the
' polygon's edges dropped to the X-axis. When the
' program considers a bottom edge of a polygon, the
' calculation gives a negative area so the space
' between the polygon and the axis is subtracted,
' leaving the polygon's area. This method gives odd
' results for non-simple polygons.
Public Function PolygonArea() As Single
   ' Return the absolute value of the signed area.
   ' The signed area is negative if the polyogn is
   ' oriented clockwise.
   PolygonArea = Abs(SignedPolygonArea())
End Function

Код

' Return the polygon's area in "square" pixels.
' Add the areas of the trapezoids defined by the
' polygon's edges dropped to the X-axis. When the
' program considers a bottom edge of a polygon, the
' calculation gives a negative area so the space
' between the polygon and the axis is subtracted,
' leaving the polygon's area. This method gives odd
' results for non-simple polygons.
'
' The value will be negative if the polyogn is
' oriented clockwise.
Private Function SignedPolygonArea() As Single
Dim pt As Integer
Dim area As Single

   ' Add the first point to the end.
   ReDim Preserve m_Points(1 To m_NumPoints + 1)
   m_Points(m_NumPoints + 1) = m_Points(1)

   ' Get the areas.
   For pt = 1 To m_NumPoints
       area = area + _
           (m_Points(pt + 1).X - m_Points(pt).X) * _
           (m_Points(pt + 1).Y + m_Points(pt).Y) / 2
   Next pt

   ' Return the result.
   SignedPolygonArea = area
End Function

Думаю суть по этим примерам ясна становится.

Но не думаю, что так делать очень хорошо. Вот то что я придумал не так давно:
http://forum.vingrad.ru/index.php?showtopi...ndpost&p=269058
Соответственно все гораздо проще можно сделать, но пока второй вариант я не проверял - времени нет...

Читай, думай... smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
neutrino
Дата 11.12.2004, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Функция плотности известна?


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
_hunter
Дата 11.12.2004, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



тело однородно


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
neutrino
Дата 11.12.2004, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

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



Значит так, что-то не то...

Многоугольник какой?

Я думал приблизить его какой-нить функцией (если он очень много-многоуголник). И по интегралу от функции плотности...


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
_hunter
Дата 11.12.2004, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



если я правильно понял ссылку cardinal' a то это просто сумма координад деленная на их количество. так?


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
cardinal
Дата 11.12.2004, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


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

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



Цитата(_hunter @ 11.12.2004, 19:14)
то это просто сумма координад деленная на их количество. так?

Да, должно быть так
Все координаты x поделив на их кол-во должно дать координату x центра тяжести, тоже самое с y...
, но как я уже сказал еще не проверял smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 11.12.2004, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ну если подумать над общей процедурой определения центра тяжести, то она выглядит так: интеграл коррдинат по плотности (x*= (1/m) * I x dF(x) )
очень часто для нахождения центра тяжести можно пользоваться свойством аддитивности
можно рассмотреть три случая (на самом деле их куча, но эти довольно характерны):
1. тяжесть сосредоточена в вершинах многоугольника
в этом случае интеграл вырождается в обычную сумму
так что просто берем среднее арифметическое всех вершин (как векторов)
если массы разных вершин отличаются, то нужно брать средневзвешенное с коэффициентами, пропорциональными массе вершины
2. тяжесть равномерно распределена по границе многоугольника (как будто из проволоки)
a. представим многоугольник в виде набора отрезков
b. для каждого отрезка находим свой центр масс
c. находим среднее взвешенное среди всех этих точек
3. тяжесть равномерно распределена по всему многоугольнику
в этом случае можно разбить его на треугольники (как для них искать центр тяжести, известно)
а потом опять же как в случае с отрезками считаем центр тяжести многоугольника через центры тяжести и массы его частей
P.S.
под средневзвешенным я подразумевал такое:
(x1*m1+...+xn*mn)/(m1+...+mn)
Добавлено @ 22:30
в общем идея одна:
разбить тело на конечное количество частей, для которых просто посчитать центр тяжести, а потом собрать...


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


Инженер
****


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

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



Я бы на скорую руку даже сказал, что разницы между этими случаями нет (если массы разных вершин в первом случае не отличаются)

1. тяжесть равномерно сосредоточена в вершинах многоугольника
=
Цитата(maxim1000 @ 11.12.2004, 21:29)
2. тяжесть равномерно распределена по границе многоугольника (как будто из проволоки)

=
Цитата(maxim1000 @ 11.12.2004, 21:29)
3. тяжесть равномерно распределена по всему многоугольнику




--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 11.12.2004, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
Я бы на скорую руку даже сказал, что разницы между этими случаями нет

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


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


Инженер
****


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

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



maxim1000, да согласен - есть такое.

Тогда мы делаем различие между тем давит определенная сила только на точки описывающие фигуру или равномерно на всю площадь.
Если сила действует только на точки описывающие фигуру, то пойдет вариант, который я описал выше, если на площадь то пойдет та функция написанная на VB или то, что я написал в той теме, на которую ссылку дал выше, а именно:
Цитата
мы их заливаем. Как? Без разницы, тут пока не в эффективности дело. Берем и заливаем рекурсивно, как до этого было описано начиная с любой внутренней точки объекта (например центр круга).
Теперь есть две формулы, по которым мы получим x и y координату точки равновесия (центр тяжести). На картинке попытался объяснить кто такие xi и yi. Это координаты каждой точки Pi, которая пренадлежит той или иной фигуре (какой без разницы). Gi эта сила, которая давит на каждую точку.



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
SoWa
Дата 26.12.2004, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Если он выпуклый и даны координаты его вершин- то центр это среднее арифм. всех Х и соотв. У


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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