![]() |
|
![]() ![]() ![]() |
|
Empirik |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 28.10.2005 Где: Россия, Пермь Репутация: нет Всего: 1 |
Добрый день. Есть геометрический 2D объект заданный двумя массивами - точек и ребер. Нужно найти все возможные оси его симетрии.
В общем случае это вытянутый полигон, но возможны и варианты. Подскажите кто-нибудь решал подобную задачу? И если решил то, как ? --------------------
Постоянно удивляюсь человеческой фантазии напридумывают гаджетов |
|||
|
||||
Lipetsk |
|
|||
![]() в форме ;) ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 28.1.2009 Где: Липецк Репутация: 2 Всего: 5 |
идея такая
берем пару точек, предполагаем, они симметричны относительно некой оси, такая ось одна, берем её и проверяем является ли она осью симметрии для остальных |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Слишком много вариантов (пар точек), особенно если вершин дофига. Рёбры-то есть! а коли так, то ось симметрии проходит через вершину и середину ребра, если кол-во вершин нечётно, и через две вершины либо две середины рёбер, если нечётно. К тому же "слева и справа" от точек пересечения оси симметрии и фигуры будет одинаковое количество вершин.
Ещё вариант - построить массив углов в любом направлении обхода. Если фигура симметрична, то ищем в удвоенном массиве (alfa(i)=alfa(i+N)) палиндром с длиной, равной количеству углов фигуры N. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 7 Всего: 386 |
Можно вычислить "центр симметрии" фигуры - среднее арифметическое всех координат. Если оси симметрии есть - они проходят через центр симметрии.
Дальше перебираем все центры и углы по одному. Строим прямую из центра в эту точку. Называем `ось`. От выбранной точки идем в одну сторону и другую, перебирая вершины. Каждая пара обязана проектироваться на ось в одной и той-же точке и находится на одном расстоянии от оси. Если такое условие выполняется для всех вершин - `ось` является осью симметрии. По сравнению с вариантом Akina - несколько более однозначно-линейный вариант ;) -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Далее взять координату противоположной по счёту вершины либо центра стороны и проверить, лежит ли она на этой "оси". Если ось не является осью симметрии - для большинства кандидатов в оси эта третья точка окажется в стороне... и можно не считать проекции. А если лежит - то это ещё ничего не значит, и можно развлекаться далее по описанному алгоритму. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |