геометрия
От: m.a.g. Мальта http://dottedmag.net/
Дата: 01.05.03 06:45
Оценка: 9 (1)
Hi.

Есть набор окружностей на плоскости. Нужно построить фигуру, обладающую тремя свойствами:

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

По-моему, задача вполне достойна этого форума. Кстати, хотелось бы узнать полиномиальный алгоритм решения
Re: геометрия
От: Andy77 Ниоткуда  
Дата: 02.05.03 00:50
Оценка:
Здравствуйте, m.a.g., Вы писали:

MAG>

    MAG>
  1. она должна быть связной
    MAG>
  2. она должна содержать все окружности
    MAG>
  3. среди фигур, удовлетворяющих первым двум свойствам, она должна иметь наименьший периметр
    MAG>

MAG>По-моему, задача вполне достойна этого форума. Кстати, хотелось бы узнать полиномиальный алгоритм решения


Построение выпуклой оболочки?
Re[2]: геометрия
От: m.a.g. Мальта http://dottedmag.net/
Дата: 02.05.03 06:56
Оценка:
Здравствуйте, Andy77, Вы писали:

A>Построение выпуклой оболочки?


А как ее строить? В смысле, с набором точек все понятно, но что делать с набором окружностей?
Re[3]: геометрия
От: WeCom Беларусь  
Дата: 02.05.03 11:30
Оценка: +1
Здравствуйте, m.a.g., Вы писали:

A>Построение выпуклой оболочки?


MAG>А как ее строить? В смысле, с набором точек все понятно, но что делать с набором окружностей?


Для частного случая когда все радиусы равны должен подойти такой вариант. Строим выпуклую оболочку для точек-центров окружностей. Затем соседние окружности (их центры — соседние точки оболочки) соединяем касательными. Тогда решением задачи будет: дуга окружности, касательная, дуга другой окружности и т.д. Осталось обобщить до разных радиусов.
Re[4]: геометрия
От: m.a.g. Мальта http://dottedmag.net/
Дата: 03.05.03 02:12
Оценка:
Здравствуйте, WeCom, Вы писали:

WC>Для частного случая когда все радиусы равны должен подойти такой вариант. Строим выпуклую оболочку для точек-центров окружностей. Затем соседние окружности (их центры — соседние точки оболочки) соединяем касательными. Тогда решением задачи будет: дуга окружности, касательная, дуга другой окружности и т.д. Осталось обобщить до разных радиусов.


Дыкть вся проблема-то как раз в разных радиусах Кстати, тогда строить выпуклую оболочку центров окружностей не пойдет.
Re: геометрия
От: LCR Россия lj://_lcr_
Дата: 03.05.03 05:02
Оценка: 63 (4) +1
Здравствуйте, m.a.g.,

Интересная задача... Вот решение (алгоритм).

Сначала огорчу тех, кто считает, что выпуклая оболочка центров может дать решение:

Здесь выпуклая оболочка центров даёт четыре маленьких окружности, и большая окружность "вылезет" за пределы оболочки, построенной по этим маленьким окружностям.

Без ограничения общности считаем, что никакая окружность не содержится ни в какой другой целиком (иначе мы можем просто удалить такие окружности и это не повлияет на решение). Алгоритм построения будет небольшой модификацией алгоритма построения ВО (выпуклой оболочки) по точкам. Сперва решим маленькую задачу: даны две окружности, найти точки соприкосновения общих касательных и окружностей, то есть найти точки y11, y12, y21 и y22 на рисунке. Эти точки можно найти, если найти угол $\alpha$, а его можно найти из того, что $\cos\alpha = \frac{r2-r1}{d(x1,x2)}$, где $d(x1,x2)$ — расстояние между точками (обычное, евклидово).


Теперь собственно построение: найдём окружность, которая гарантированно находится с краю, например, для которой первая координата минус радиус есть минимум. Пусть это будет окружность C1. Пусть L будет вертикальной касательной к окружности C1. (По смыслу L — это внешняя касательная к некоторым окружностям).

Перебираем все окружности, кроме С1, и для каждой окружности C вычисляем угол $\beta_2$, и точки y12 и y22; выбираем ту окружность, для которой угол $\beta_2$ минимален.

Чтобы не нарваться на угол $\beta_1$ вместо $\beta_2$ для прямой L нужно хранить направление обхода.

Если таких окружностей несколько, то среди таких окружностей выбираем ту, для которой расстояние $d(y12,y22)$ минимально. (Такое правило выбора гарантирует нам, что мы не вернёмся назад и не свернём вовнутрь). Получили окружность C2. Теперь прямую L положим как прямую, соединяющую точки y12 и y22. Если эти точки совпадают, то L не меняется.

Следующая итерация. Перебираем все окружности, кроме C2, для каждой вычисляем угол, точки и т.д. Получили окружность C3.

И так далее, пока снова не наткнёмся на С1.

Требуемая выпуклая оболочка — это дуги окружностей Ci, соединённые отрезками [y1i,y2i].

Усё.

Поправлены URL картинок — К
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: геометрия
От: LCR Россия lj://_lcr_
Дата: 03.05.03 05:18
Оценка: 24 (2)
Здравствуйте, m.a.g.

Второе решение чуть красивее, поскольку не изобилует частными случаями, но зато более трудоёмко с вычислительной точки зрения (хотя тоже полином).

По-прежнему считаем, что никакая окружность не содержится ни в какой другой целиком.

Перебираем все пары окружностей, и для каждой пары вычисляем точки y11, y12, y21, y22. Полученные точки помещаем во множество Y. Итого $|Y|=2(n-1)n$, где $n$ -- количество окружностей.

Теперь находим выпуклую оболочку множества $Y$. Получим вектор точек $V$.

Что представляет собой вектор $V$? Это будет последовательность пар точек, где каждая пара принадлежит какой-то окружности: $V = { y1i,y2i, y1j,y2j, y1k,y2k ... }$, где $y1i, y2i \in C_i$; $y1j, y2j \in C_j$; $y1k, y2k \in C_k$...

Всё, выпуклая оболочка практически построена: точки из одной пары соединяем соответствующей дугой окружности, точки из разных пар соединяем отрезком.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[4]: геометрия
От: mihoshi Россия  
Дата: 03.05.03 10:44
Оценка:
Здравствуйте, WeCom, Вы писали:

WC>Здравствуйте, m.a.g., Вы писали:


A>Построение выпуклой оболочки?


MAG>А как ее строить? В смысле, с набором точек все понятно, но что делать с набором окружностей?


WC>Для частного случая когда все радиусы равны должен подойти такой вариант. Строим выпуклую оболочку для точек-центров окружностей. Затем соседние окружности (их центры — соседние точки оболочки) соединяем касательными. Тогда решением задачи будет: дуга окружности, касательная, дуга другой окружности и т.д. Осталось обобщить до разных радиусов.


А для разных радиусов вполне подходит алгоритм оборачивания подарка, только в более зам##нной форме.
Re[2]: геометрия
От: LCR Россия lj://_lcr_
Дата: 04.05.03 04:04
Оценка:
Вот блин, картинки в сообщении от 03.05.03 09:02,
естественно, не отображаются, поскольку они на моём винте

Картинки должны быть такими:

и


Прошу прощения за неудобства.

Усё.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[2]: геометрия
От: m.a.g. Мальта http://dottedmag.net/
Дата: 04.05.03 05:56
Оценка:
Здравствуйте, LCR, Вы писали:

LCR>Алгоритм построения будет небольшой модификацией алгоритма построения ВО (выпуклой оболочки) по точкам.


Re[2]: геометрия
От: m.a.g. Мальта http://dottedmag.net/
Дата: 04.05.03 05:59
Оценка:
Здравствуйте, LCR, Вы писали:

LCR>Второе решение чуть красивее, поскольку не изобилует частными случаями, но зато более трудоёмко с вычислительной точки зрения (хотя тоже полином).


Тоже верно. Но я не упомянул — задача была предназначена для ACM-олимпиад по информатике с ограничением на 600k памяти. Просто не удалось бы хранить все точки для 1000 окружностей
Re[3]: геометрия
От: LCR Россия lj://_lcr_
Дата: 04.05.03 07:44
Оценка:
Здравствуйте, m.a.g., Вы писали:

МAG>Но я не упомянул — задача была предназначена для ACM-олимпиад по информатике с ограничением на 600k памяти. Просто не удалось бы хранить все точки для 1000 окружностей


Кхе, кхе... Это... давайте возьмём 51201 окружность, и они не поместятся в эти 600k — усё, мы в глубокой луже

Ну это я так. Хорошая задача.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[2]: геометрия
От: Дмитро  
Дата: 05.05.03 01:47
Оценка: 18 (3)
Здравствуйте, LCR, Вы писали:

LCR>Теперь собственно построение: найдём окружность, которая гарантированно находится с краю, например, для которой первая координата минус радиус есть минимум. Пусть это будет окружность C1. Пусть L будет вертикальной касательной к окружности C1. (По смыслу L — это внешняя касательная к некоторым окружностям).


LCR>Перебираем все окружности, кроме С1, и для каждой окружности C вычисляем угол $\beta_2$, и точки y12 и y22; выбираем ту окружность, для которой угол $\beta_2$ минимален.


LCR>Следующая итерация. Перебираем все окружности, кроме C2, для каждой вычисляем угол, точки и т.д. Получили окружность C3.


LCR>И так далее, пока снова не наткнёмся на С1.


Поскольку одна и та же окружность может учавствовать в обходе несколько раз, то этот критерий не подходит для завершения алгоритма. Полагаю, что итерации следует повторять до тех пор, пока вектор (y12, y22) не сделает полный оборот (2pi).



--
Дмитрий
--
Дмитрий
Re[3]: геометрия
От: m.a.g. Мальта http://dottedmag.net/
Дата: 05.05.03 02:38
Оценка: 6 (1) +1
Здравствуйте, Дмитро, Вы писали:

LCR>И так далее, пока снова не наткнёмся на С1.


Д>Поскольку одна и та же окружность может учавствовать в обходе несколько раз, то этот критерий не подходит для завершения алгоритма. Полагаю, что итерации следует повторять до тех пор, пока вектор (y12, y22) не сделает полный оборот (2pi).


Точнее говоря, пока не выполнятся оба этих условия. Контрпример ко второму условию: последняя, первая и вторая окружности лежат на одной прямой и имеют одинаковые радиусы. Работа остановится за шаг до конца.
Re[4]: геометрия
От: LCR Россия lj://_lcr_
Дата: 05.05.03 03:26
Оценка:
Здравствуйте, m.a.g., Вы писали:

Д>Поскольку одна и та же окружность может учавствовать в обходе несколько раз, то этот критерий не подходит для завершения алгоритма. Полагаю, что итерации следует повторять до тех пор, пока вектор (y12, y22) не сделает полный оборот (2pi).


MAG>Точнее говоря, пока не выполнятся оба этих условия. Контрпример ко второму условию: последняя, первая и вторая окружности лежат на одной прямой и имеют одинаковые радиусы. Работа остановится за шаг до конца.


Точно! Я почему-то это учёл при построении контрпримера, но забыл при построении алгоритма
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.