![]() |
|
![]() ![]() ![]() |
|
radistor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 16.7.2012 Репутация: нет Всего: нет |
Сломал всю голову, но никак не придумаю алгоритм к следующей задачке.
Есть две фигуры заданные координатами вершин ![]() Визуально, сразу можно сказать какой вершине первой фигуры соответсвует вершина второй фигуры. А как алгоритмически это осуществить? Дополнительные данные по фигурам - Фигура относительно другой может быть повернута не более 90 градусов - Отрезки соединяющие вершины не обязательно равны. В процентном соотношение различие 0-15% Для примера дам координаты двух вышеизображенных фигур.
|
|||
|
||||
Skevalt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 30.11.2006 Репутация: нет Всего: 3 |
Можно таким методом:
1. Находим центр масс каждой фигуры 2. Осуществляем параллельный перенос одной из фигур так, что бы их центры масс совпали 3. Аппроксимируем множество вершин каждой из фигур прямой с помощью метода наименьших квадратов (упрощение метода главных компонент) 4. Находим угол между двумя получившимися прямыми и поворачиваем одну из фигур относительно центра масс на получившийся угол Вот примерное соответствие и получается. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
Если фигуры почти подобны, то можно их сначала одинаково ориентировать (например, вдоль самой длинной стороны), выровнять масштабы (т.е. пересчитать длину всех ребер относительно периметра), а затем просто наложить, совместив центры масс. И куда они денутся... Если возможна неопределенность с отражением, ну тогда 2 варианта посмотреть и взять лучший.
А в более общем случае нужно перебирать решения, строить их оценку и выбирать лучшую. Что касается перебора, то в твоей задаче можно тупо делать полный перебор, трудоемкость линейная от числа вершин. Т.е. ориентируем фигуры одинаково (например, по часовой стрелке), и начинаем перебор: сопоставляем вершины, начиная с первой (т.е. 0-0, 1-1 и т.д.), строим оценку, смещаемся на одну вершину (0-1, 1-2...), опять строим оценку, пока не пройдем цикл, выбираем лучшую оценку. Другой подход - строим двудольный граф, соединяя вершины фигур ребрами с весами. Затем выбираем паросочетание с наименьшим общим весом (или наибольшим, это как веса задавать). Оценка решения или веса ребер - отдельный вопрос. Оценка должна отражать "похожесть" соединяемых вершин. Например, трудоемкость превращения одной в другую (перемещение, изменение длины смежных ребер, их поворот до совпадения угла) -------------------- ... |
|||
|
||||
radistor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 16.7.2012 Репутация: нет Всего: нет |
Skevalt, 3. Аппроксимируем множество вершин каждой из фигур прямой с помощью метода наименьших квадратов (упрощение метода главных компонент)
Можно подробнее про апроксимацию? Т.е какие вершины брать для апроксимации? Earnest, фигуры почти подобны. Различия не очень значительны, но они есть. можно их сначала одинаково ориентировать (например, вдоль самой длинной стороны) - а если даны два абсолютно одинаковых квадрата, просто один повернут относительно другого (допустим на 10 градусов)? Т.е пока что я понял из ответов 1. Совмещаем фигуры путем параллельного переноса и поворота. Как поворачивать, до конца не понял 2. Находить веса вершин или прямых их соединяющих и искать соответсвие. Тут довольно неординарная задача |
|||
|
||||
Skevalt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 30.11.2006 Репутация: нет Всего: 3 |
Взять все множество вершин и провести через них прямую по методу наименьших квадратов. Разность углов наклона прямых использовать для определения угла поворота фигуры.
Earnest, правильно говорит, перебор здесь будет хорошо работать. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 7 Всего: 183 |
1) можно определить главные оси инерции по моментам - это общий случай 2) по простому, как я предлагала: находим самую длинную сторону, поворачиваем так, чтобы она была горизонтальна -------------------- ... |
|||
|
||||
_Y_ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1651 Регистрация: 27.11.2006 Репутация: 8 Всего: 34 |
И опять делаю рекламу все той же книге. Прямо-таки в двух темах подряд. Если фигуры подобны - их нетрудно распознать. Там в книге есть такой раздел №4.3 кажется.
ЗЫ: Надо, что-ли, с авторов процент брать какой за рекламу ![]() -------------------- Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |