IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> трехмерное пространство, найти радиус
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской

Репутация: -  0  +


В трехмерном пространстве задано N шаров. Найти шар минимального радиуса, охватывающий все заданные
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Выполняю обещанное - публикую анонсированное мной в одном из предыдущих постов решение задачи. То есть не решение, а только алгоритм в самом общем виде. Более того, в нем присутствуют нерешенные математические выражения. Программый код к этой задаче я стал бы писать только под дулом банкомата, и желательно как можно более крупного калибра smile.gif.

Сначала извинюсь перед Бравым Генералом: я сомневался в легкой масштабируемости этой задачи с двумерного случая на трехмерный, но потом убедился, что суть действительно не меняется, хотя математика усложняется.

Рассмотрим двумерный случай: ищем окружность минимального радиуса, охватывающую заданный конечный набор кругов. Проведем небольшое исследование, по традиции начинаемое словами: предположим, что задача решена, и минимальная охватывающая окружность построена...

В этом месте небольшое лирическое отступление. Два утверждения:

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

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

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

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

2. Найти два максимально отстоящие (дальними точками) круга, натянуть на них минимальную окружность и проверить, охватываются ли все остальные круги этой окружностью. Если да, то сравнить с радиусом, полученном в п.1 и выбрать минимальный.

По сути, тут два решения: одно - klem4'овское, только с добавленной проверкой на включение, второе - Бравого Генерала, с тем же самым дополнением.

Все! Казалось бы...

Но действительно ли все? Теоретически - да. А практически..
Выполнить п.2 сложности не представляет - klem4 уже сделал это. А вот п.1.. Хотя ОА принципиально и находима - этого достаточно для математика, для программера этого мало. Надо указать конкретный способ ее найти. Именно это и тормозило меня с самого начала: хотя описанные выше два пункта алгоритма нащупать было несложно, практический способ постороения ОА мне не давался. В указанной ссылке (см. мои предыдущие посты) способ построения геометрический, реализовать его в коде довольно сложно с моей точки зрения. Поэтому я продолжал думать.. Довольно долго все равно все мои усилия были вокруг простой геометрии типа циркулем и линейкой, хотя я понимал, что без инверсии тут не обойтись. В конце концов я на нее решился.

Все оказалось не так уж и страшно smile.gif
Преобразование инверсии, как известно, переводит окружность в окружность, при этом сохраняя касание. Да, конечно - прямо то, что нужно! Только зачем? Зачем переводить окружности в другие? чем другие лучше?

А вот чем. Когда я написал уравнения, оказалось, что возможно провести одну инверсию, которая переведет три заданных окружности в три окружности одного заданного диаметра! Внизу, если останется время, приведу подтвеждающие выкладки.

Итак, общее правило такое:

1. По трем выбранным кругам (центры и радиусы) находим параметры (центр и радиус) того самого преобразования инверсии, которое переводит эти три окружности в три одинаковые.

2. Произвести инверсию.

3. Построить окружность, касающуюся трех полученных образов. Для этого просто строим окружность, проходящую через их центры, а потом увеличиваем ее радиус на величину радиуса образов.

4. Проводим обратную инверсию (то есть вторично применяем ее). Полученный образ построенной в п.3 окружности - это искомая кружность, касающаяся трех данных.

Просто? Не совсем. Но и это еще не все. Необходимо одно уточнение..
Дело в том, что, переводя окружность в окружность, инверсия не переводит центр в центр. Поэтому реально нужно инвертировать две точки окружности, лежащие на луче, проходящем из центра инверсии через центр инвертируемой окружности, а потом взять середину отрезка между ними - это будет центр инвертированной окружности.

Вот теперь, кажется, все.. smile.gif
Ах, да! не все.. Осталось добавить, что, как показывают выкладки, инверсия применяется в трехмерном случае (теперь уже к четырем сферам) вполне аналогично, хотя вычисления усложняются. Далее, в 3D придется рассматривать не два случая, а три:
1. Касание четырех шаров.
2. Минимальное касание трех шаров.
3. Минимальное касание двух шаров.
Строгости ради, сюда (а также выше) надо добавить еще и случай, когда одна из данных сфер уже охватывает все остальные, но он настолько тривиален, что лень было упоминать. Хотя в программном продукте он должен быть учтен, разумеется.

Теперь совесм все!! smile.gif
Ну, как вам решеньеце? Мне почему-то кажется, что с набором из сотни шаров современный Р4 за пару часов справится. smile.gif Но о тысяче не стоит и говорить.. Хотя, простор для оптимизации тут немеряный..

Мужики (дамы так и не присоединились к обсуждению), не судите строго - я выложу вычисления on request - ладно? И так уже больше получаса пишу..

Всем спасибо за внимание! Жду критики (или опровержений smile.gif )


P.S.
Перечитал - и обнаружил в своих рассуждениях ошибку, которая может иметь принципиальное значение. Или, по крайней мере, еще усложнит алгоритм..
Кто еще заметил?
smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
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   Выполняю обещанное - публикую анонсированное мной …   28.04.2006 9:43
lapp   Похоже, я изрядно напугал народ своим ответом... …   1.05.2006 19:18


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 9.05.2024 16:16
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name