Опорные прямые = касательные к выпуклым многоульникам

У меня есть два выпуклых многоугольника, заданных своими вершинами в каком-то порядке обхода (например, по часовой стрелке с произвольной вершины, std::vector<Point>). Как найти за линейное время верхнюю и нижнюю касательные к этим многоульникам? То есть такие две точки, что первая принадлежит первому многоульнику, вторая - второму, и при этом прямая больше не пересекает многоульники. Верхняя означает, что все точки многоульников кроме этих двух лежат ниже этой прямой, нижняя - выше.

Считаем, что для заданных многоульников такие касательные всегда существуют.

Пунктиром обозначены нужные касательные.

введите сюда описание изображения


Ответы (1 шт):

Автор решения: MBo

Для решения подобных задач за линейное время предназначен алгоритм Rotating Calipers

Именно эта задача, похоже, называется "установление моста между выпуклыми многоугольниками" или объединение выпуклых полигонов, также см. "common tangents" введите сюда описание изображения

Хорошая страница о них убита, сохранилась в wayback архиве

→ Ссылка