Підказка: Узагальнений простий багатокутник є монотонним щодо осі якщо і лише тоді, коли він має рівно одну вершину, -координат якої менший, ніж у сусідів. Це спостереження одразу підказує алгоритм часу , принаймні, якщо жоден край вашого багатокутника не є вертикальним.x O ( n )xxO(n)
Спойлери Ahoy:
IsMonotone (X [0..n-1], Y [0..n-1])
local_mins ← 0
для i ← 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))
Нарешті, якщо - якийсь інший рядок форми , змініть наступним чином:a x + b y = cLax+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))