Диаметр множества точек (вращающиеся калиперы) — различия между версиями
Megabyte (обсуждение | вклад) |
Megabyte (обсуждение | вклад) м |
||
Строка 40: | Строка 40: | ||
{{Определение | {{Определение | ||
|definition= | |definition= | ||
− | Точки, через которые можно провести параллельные опорные прямые, будем называть ''' | + | Точки, через которые можно провести параллельные опорные прямые, будем называть '''противолежащими''' (англ. ''antipodal''). |
}} | }} | ||
− | Благодаря предыдущей теореме нам нужно рассмотреть только | + | Благодаря предыдущей теореме нам нужно рассмотреть только противолежащие точки. Задача в том, чтобы рассмотреть их, не перебирая все пары точек. |
{|border="0" width="100%" | {|border="0" width="100%" | ||
− | |Рассмотрим рисунок справа. <tex>L</tex> и <tex>M</tex> {{---}} опорные прямые, проходящие через вершины <tex>A</tex> и <tex>D</tex> соответственно. Значит, <tex>\langle A,D \rangle</tex> {{---}} | + | |Рассмотрим рисунок справа. <tex>L</tex> и <tex>M</tex> {{---}} опорные прямые, проходящие через вершины <tex>A</tex> и <tex>D</tex> соответственно. Значит, <tex>\langle A,D \rangle</tex> {{---}} противолежащая пара точек. Если начать вращать прямые против часовой стрелки вокруг данных точек, они будут оставаться опорными прямыми, пока одна из прямых не станет накладываться на сторону многоугольника. В нашем примере, при вращении <tex>M</tex> к позиции <tex>M'</tex>, <tex>M</tex> коснётся точки <tex>E</tex> раньше, чем <tex>L</tex> коснётся <tex>B</tex>, поэтому <tex>\langle A,E \rangle</tex> становится новой парой противолежащих точек. |
− | Теперь <tex>M'</tex> будет вращаться вокруг <tex>E</tex>, а <tex>L'</tex> продолжит вращаться вокруг <tex>A</tex>, и следующей парой | + | Теперь <tex>M'</tex> будет вращаться вокруг <tex>E</tex>, а <tex>L'</tex> продолжит вращаться вокруг <tex>A</tex>, и следующей парой противолежащих точек станет <tex>\langle B,E \rangle</tex>. Продолжая таким образом, мы сгенерируем все пары противолежащих точек, так как параллельные линии пройдут под всеми возможными углами. Определение новой пары противолежащих точек требует только одного сравнения углов, которое можно выполнить с помощью предиката поворота. |
|[[Файл:calipers.png|250px|thumb|right]] | |[[Файл:calipers.png|250px|thumb|right]] | ||
|} | |} |
Версия 18:25, 8 января 2014
Эта статья находится в разработке!
Есть множество точек на плоскости. Нужно найти две самые удалённые из них.
Найдём выпуклую оболочку исходного множества и получим более простую задачу: найти две наиболее удалённые вершины в выпуклом многоугольнике. Сделать это можно за линейное время с помощью метода, который называется вращающиеся калиперы (англ. rotating calipers).
Постановка задачи
Пусть
— выпуклый многоугольник, в котором порядок обхода вершин направлен против часовой стрелки, и никакие три последовательные точки не лежат на одной прямой. Найти пару чисел , такие, что максимально.Вращающиеся калиперы
Опорные прямые
Определение: |
Прямая | называется опорной прямой (англ. line of support) для многоугольника , если его внутренность лежит по одну сторону от , при этом проходит хотя бы через одну из вершин .
|
Так как
и — какие угодно граничные точки фигуры , принадлежащие соответственно прямым и , то из перпендикулярности отрезка к прямым и следует, что ни одна из прямых , не может иметь с фигурой целый общий отрезок. Другими словами, каждая из этих прямых содержит единственную граничную точку фигуры .
|
Алгоритм
Заметим, что параллельные опорные прямые можно провести не через любую пару точек.
Определение: |
Точки, через которые можно провести параллельные опорные прямые, будем называть противолежащими (англ. antipodal). |
Благодаря предыдущей теореме нам нужно рассмотреть только противолежащие точки. Задача в том, чтобы рассмотреть их, не перебирая все пары точек.
Рассмотрим рисунок справа. Теперь будет вращаться вокруг , а продолжит вращаться вокруг , и следующей парой противолежащих точек станет . Продолжая таким образом, мы сгенерируем все пары противолежащих точек, так как параллельные линии пройдут под всеми возможными углами. Определение новой пары противолежащих точек требует только одного сравнения углов, которое можно выполнить с помощью предиката поворота. |
и — опорные прямые, проходящие через вершины и соответственно. Значит, — противолежащая пара точек. Если начать вращать прямые против часовой стрелки вокруг данных точек, они будут оставаться опорными прямыми, пока одна из прямых не станет накладываться на сторону многоугольника. В нашем примере, при вращении к позиции , коснётся точки раньше, чем коснётся , поэтому становится новой парой противолежащих точек.
Ссылки
- M.I. Shamos Computational geometry, 1978 — С. 76.
- Яглом И.М., Болтянский В.Г. Выпуклые фигуры, 1951 — С. 20, 144.
- Реализация - Github.com