Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нахождение подобных вершин 
:(
    Опции темы
radistor
Дата 16.7.2012, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.7.2012

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



Сломал всю голову, но никак не придумаю алгоритм к следующей задачке.

Есть две фигуры заданные координатами вершин
user posted image
Визуально, сразу можно сказать какой вершине первой фигуры соответсвует вершина второй фигуры.
А как алгоритмически это осуществить?

Дополнительные данные по фигурам
- Фигура относительно другой может быть повернута не более 90 градусов
- Отрезки соединяющие вершины не обязательно равны. В процентном соотношение различие 0-15%

Для примера дам координаты двух вышеизображенных фигур. 
Код

Fig. 1
1522,868
591,1182
1234,178
819,912
534,1021
591,392

Fig. 2
2955,1239
1977,663
2278,798
3318,628
1919,819
2615,195







PM MAIL   Вверх
Skevalt
Дата 17.7.2012, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 30.11.2006

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



Можно таким методом:
1. Находим центр масс каждой фигуры
2. Осуществляем параллельный перенос одной из фигур так, что бы их центры масс совпали
3. Аппроксимируем множество вершин каждой из фигур прямой с помощью метода наименьших квадратов (упрощение метода главных компонент)
4. Находим угол между двумя получившимися прямыми и поворачиваем одну из фигур относительно центра масс на получившийся угол
 Вот примерное соответствие и получается.
PM MAIL   Вверх
Earnest
Дата 17.7.2012, 06:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 183



Если фигуры почти подобны, то можно их сначала одинаково ориентировать (например, вдоль самой длинной стороны), выровнять масштабы (т.е. пересчитать длину всех ребер относительно периметра), а затем просто наложить, совместив центры масс. И куда они денутся... Если возможна неопределенность с отражением, ну тогда 2 варианта посмотреть и взять лучший.

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

Другой подход - строим двудольный граф, соединяя вершины фигур ребрами с весами. Затем выбираем паросочетание с наименьшим общим весом (или наибольшим, это как веса задавать).

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



--------------------
...
PM   Вверх
radistor
Дата 17.7.2012, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 16.7.2012

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



Skevalt3. Аппроксимируем множество вершин каждой из фигур прямой с помощью метода наименьших квадратов (упрощение метода главных компонент)
Можно подробнее про апроксимацию? Т.е какие вершины брать для апроксимации?

Earnest, фигуры почти подобны. Различия не очень значительны, но они есть. 
можно их сначала одинаково ориентировать (например, вдоль самой длинной стороны) - а если даны два абсолютно одинаковых квадрата, просто один повернут относительно другого (допустим на 10 градусов)?

Т.е пока что я понял из ответов
1. Совмещаем фигуры путем параллельного переноса и поворота. Как поворачивать, до конца не понял
2. Находить веса вершин или прямых их соединяющих и искать соответсвие. Тут довольно неординарная задача
PM MAIL   Вверх
Skevalt
Дата 17.7.2012, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 30.11.2006

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



Взять все множество вершин и провести через них прямую по методу наименьших квадратов. Разность углов наклона прямых использовать для определения угла поворота фигуры.

Earnest, правильно говорит, перебор здесь будет хорошо работать.
PM MAIL   Вверх
Earnest
Дата 18.7.2012, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 183



Цитата(radistor @  17.7.2012,  10:51 Найти цитируемый пост)
 Как поворачивать, до конца не понял

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


--------------------
...
PM   Вверх
_Y_
Дата 18.7.2012, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



И опять делаю рекламу все той же книге. Прямо-таки в двух темах подряд. Если фигуры подобны - их нетрудно распознать. Там в книге есть такой раздел №4.3 кажется.

ЗЫ: Надо, что-ли, с авторов процент брать какой за рекламу smile 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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