Подсказка: Общий простой многоугольник монотонен относительно к оси х тогда и только тогда , когда она имеет ровно одну вершину которого координата меньше , чем ее соседи. Это наблюдение сразу предлагает алгоритм -времени, по крайней мере, если ни один край вашего многоугольника не является вертикальным.xxO(n)
Спойлеры ахой:
IsMonotone (X [0..n-1], Y [0..n-1])
local_mins ← 0
для меня ← 0 до N-1
если (X [i] <X [i + 1 mod n]) и (X [i] <X [i-1 mod n])
local_mins ← local_mins + 1
возврат (local_mins = 1)
Если вы беспокоитесь о том, что у вашего многоугольника могут быть вертикальные ребра, вместо сравнения используйте следующую подпрограмму X[i] < X[j]
:
IsLess(X, i, j):
return ((X[i] < X[j]) or (X[i] = X[j] and i < j))
Наконец, если - это другая строка вида , измените ее следующим образом:Lax+by=cIsLess
IsLess(X, Y, i, j):
Di ← a·X[i] + b·Y[i]
Dj ← a·X[j] + b·Y[j]
return ((Dj < Dj) or (Di = Dj and i < j))