1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
| bairt |
Сообщение
#1
|
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Репутация: 0 |
В трехмерном пространстве задано N шаров. Найти шар минимального радиуса, охватывающий все заданные
|
![]() ![]() |
| Lapp |
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Выполняю обещанное - публикую анонсированное мной в одном из предыдущих постов решение задачи. То есть не решение, а только алгоритм в самом общем виде. Более того, в нем присутствуют нерешенные математические выражения. Программый код к этой задаче я стал бы писать только под дулом банкомата, и желательно как можно более крупного калибра
Сначала извинюсь перед Бравым Генералом: я сомневался в легкой масштабируемости этой задачи с двумерного случая на трехмерный, но потом убедился, что суть действительно не меняется, хотя математика усложняется. Рассмотрим двумерный случай: ищем окружность минимального радиуса, охватывающую заданный конечный набор кругов. Проведем небольшое исследование, по традиции начинаемое словами: предположим, что задача решена, и минимальная охватывающая окружность построена... В этом месте небольшое лирическое отступление. Два утверждения: 1. На плоскости в общем случае можно провести одну и только одну окружность, касающуюся трех данных (окружность Апполония, ОА) так, чтобы все три данные оказались внутри нее (в дальнейшем, кроме оговоренного, под "касанием" я буду понимать именно такое касание). Иногда такую окружность провести невозможно (вот пример: О о О ), но такие случаи нас волновать не будут, так как они охватываются пунктом 2. 2. Если даны две окружности, то можно провести много окружностей, касающихся их, но только одна при этом будет охватывать их обе с минимальным радиусом ее центр лежит на отрезке, соединяющем центры. ... Охватывающий круг, будучи уже построен, должен либо а) касаться трех (или больше) кругов из данного набора; либо б) касаться только двух, имея при этом минимальный возможный радиус. Первое довольно очевидно, а во втором убедиться можно, представив себе круг неминимального радиуса, касающийся лишь двух кругов - очевидно, его можно уменьшить. Итак, алгоритм решения состоит в следующем. 1. Провести полный перебор всех троек кругов. На каждую тройку натягивать касающуся их окружность , после чего перебором по всем оставшимся кругам смотреть, попадают ли они внутрь нее. Из всех таких окружностей ищем окружность с минимальным радиусом. (Для оптимизации вычислений эти две проверки лучше переставить местами: сначала проверять радиус на минимальность - но это лирика). 2. Найти два максимально отстоящие (дальними точками) круга, натянуть на них минимальную окружность и проверить, охватываются ли все остальные круги этой окружностью. Если да, то сравнить с радиусом, полученном в п.1 и выбрать минимальный. По сути, тут два решения: одно - klem4'овское, только с добавленной проверкой на включение, второе - Бравого Генерала, с тем же самым дополнением. Все! Казалось бы... Но действительно ли все? Теоретически - да. А практически.. Выполнить п.2 сложности не представляет - klem4 уже сделал это. А вот п.1.. Хотя ОА принципиально и находима - этого достаточно для математика, для программера этого мало. Надо указать конкретный способ ее найти. Именно это и тормозило меня с самого начала: хотя описанные выше два пункта алгоритма нащупать было несложно, практический способ постороения ОА мне не давался. В указанной ссылке (см. мои предыдущие посты) способ построения геометрический, реализовать его в коде довольно сложно с моей точки зрения. Поэтому я продолжал думать.. Довольно долго все равно все мои усилия были вокруг простой геометрии типа циркулем и линейкой, хотя я понимал, что без инверсии тут не обойтись. В конце концов я на нее решился. Все оказалось не так уж и страшно Преобразование инверсии, как известно, переводит окружность в окружность, при этом сохраняя касание. Да, конечно - прямо то, что нужно! Только зачем? Зачем переводить окружности в другие? чем другие лучше? А вот чем. Когда я написал уравнения, оказалось, что возможно провести одну инверсию, которая переведет три заданных окружности в три окружности одного заданного диаметра! Внизу, если останется время, приведу подтвеждающие выкладки. Итак, общее правило такое: 1. По трем выбранным кругам (центры и радиусы) находим параметры (центр и радиус) того самого преобразования инверсии, которое переводит эти три окружности в три одинаковые. 2. Произвести инверсию. 3. Построить окружность, касающуюся трех полученных образов. Для этого просто строим окружность, проходящую через их центры, а потом увеличиваем ее радиус на величину радиуса образов. 4. Проводим обратную инверсию (то есть вторично применяем ее). Полученный образ построенной в п.3 окружности - это искомая кружность, касающаяся трех данных. Просто? Не совсем. Но и это еще не все. Необходимо одно уточнение.. Дело в том, что, переводя окружность в окружность, инверсия не переводит центр в центр. Поэтому реально нужно инвертировать две точки окружности, лежащие на луче, проходящем из центра инверсии через центр инвертируемой окружности, а потом взять середину отрезка между ними - это будет центр инвертированной окружности. Вот теперь, кажется, все.. Ах, да! не все.. Осталось добавить, что, как показывают выкладки, инверсия применяется в трехмерном случае (теперь уже к четырем сферам) вполне аналогично, хотя вычисления усложняются. Далее, в 3D придется рассматривать не два случая, а три: 1. Касание четырех шаров. 2. Минимальное касание трех шаров. 3. Минимальное касание двух шаров. Строгости ради, сюда (а также выше) надо добавить еще и случай, когда одна из данных сфер уже охватывает все остальные, но он настолько тривиален, что лень было упоминать. Хотя в программном продукте он должен быть учтен, разумеется. Теперь совесм все!! Ну, как вам решеньеце? Мне почему-то кажется, что с набором из сотни шаров современный Р4 за пару часов справится. Мужики (дамы так и не присоединились к обсуждению), не судите строго - я выложу вычисления on request - ладно? И так уже больше получаса пишу.. Всем спасибо за внимание! Жду критики (или опровержений P.S. Перечитал - и обнаружил в своих рассуждениях ошибку, которая может иметь принципиальное значение. Или, по крайней мере, еще усложнит алгоритм.. Кто еще заметил? -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
bairt трехмерное пространство 23.04.2006 16:07
Altair Есть задача решенная - найти окружность, в которую… 23.04.2006 16:25
volvo <...> 23.04.2006 16:26
lapp volvo, давай рассмотрим частный стучай.
Две сфер… 23.04.2006 16:45
volvo Ну, во-первых, не Sqrt(3), а 2*Sqrt(3)
Если уже в… 23.04.2006 16:55
lapp
Ну, во-первых, не Sqrt(3), а 2*Sqrt(3)
Если уже … 23.04.2006 16:59
klem4 А есть данные для теста ? А то вот накатал кое что… 23.04.2006 22:25
klem4 В общем вот что пока есть.На соклько я вижу отлича… 23.04.2006 23:36
volvo klem4, ты, если я не ошибаюсь, решаешь несколько д… 23.04.2006 23:41
klem4 Вот такой вариант ... но опятьже нужен тестовые да… 24.04.2006 0:02
Бравый генерал :) klem4, как видно из твоего кода, ты находил две… 24.04.2006 3:20
lapp
Наша же задача сводится к задаче "найти окру… 24.04.2006 18:41
volvo <...> 24.04.2006 3:25
GoodWind
почему-то скрыты...
Я тоже не понял почему. Если… 24.04.2006 18:58
klem4 Я скрыл решение просто по тому что оно не верное, … 25.04.2006 19:41
bairt а ты можешь выложить результат? 25.04.2006 22:16
klem4
Извини, не понял тебя ... 25.04.2006 23:36
bairt я про данные она правильно работает? и ты можешь п… 26.04.2006 1:37
klem4 Я же писал, у меня нету нормальных тестовых данных… 26.04.2006 11:02
lapp
Я скрыл решение просто по тому что оно не верное,… 26.04.2006 11:16
klem4 lapp, а пост # 15 ты учел ? 26.04.2006 11:25
bairt lapp, а пост # 15 ты учел ?
тогда можете проверить… 26.04.2006 12:09
lapp
lapp, а пост # 15 ты учел ?
Да, klem4, учел. Во… 26.04.2006 17:06
Бравый генерал
:) klem4, ты так сказал, как будто после того пос… 26.04.2006 19:38
klem4 Да, теперь я понял, что был не прав, извиняюсь.
И… 26.04.2006 23:40
lapp
Да, теперь я понял, что был не прав, извиняюсь.
И… 27.04.2006 17:02
lapp Похоже, я изрядно напугал народ своим ответом... … 1.05.2006 19:18![]() ![]() |
|
Текстовая версия | 5.11.2025 15:37 |