Как я могу проверить, является ли многоугольник выпуклым или нет, только зная точки многоугольника с их координатами в c ++?
Выпуклость многоугольника C ++?
Ответы (3)
Для каждой стороны многоугольника вычислите линейное уравнение (Ax+By+C=0
) и проверьте (поместите x
и y
в уравнение и получите его знак), что все точки находятся с одной стороны от него.
РЕДАКТИРОВАТЬ: если вы путешествуете по выпуклому многоугольнику, вы всегда будете вращаться в одном направлении (влево или вправо) в каждой точке. Используя кросс-произведение, вы можете просто определить, на какую сторону (отрицательную или положительную) вы будете вращать следующий поворот. Если все перекрестные произведения трех последовательных точек будут иметь знак равенства, то ваш многоугольник выпуклый.
Найдите выпуклую оболочку, используя любой из распространенных алгоритмов. Многоугольник выпуклый тогда и только тогда, когда все его вершины принадлежат его выпуклой оболочке.
Это O (n log n), но не основывается на предположении, что точки указаны в правильном порядке по краям многоугольника. Если предположение верно, то ответ от hate-engine будет оптимальным (т.е. линейное время).
Алгоритм упаковки подарков - это алгоритм вычисления выпуклой оболочки заданного набора точек.
Псевдокод из wiki:
jarvis(S)
pointOnHull = leftmost point in S
i = 0
repeat
P[i] = pointOnHull
endpoint = S[0] // initial endpoint for a candidate edge on the hull
for j from 1 to |S|-1
if (endpoint == pointOnHull) or
(S[j] is on left of line from P[i] to endpoint)
endpoint = S[j] // found greater left turn, update endpoint
i = i+1
pointOnHull = endpoint
until endpoint == P[0] // wrapped around to first hull point
Если ваши точки совпадают с точками, обнаруженными вышеописанным алгоритмом, то многоугольник выпуклый.