Petunjuk: Poligon sederhana generik adalah monoton sehubungan dengan sumbu jika dan hanya jika memiliki tepat satu simpul yang koordinatnya lebih kecil dari tetangganya. Pengamatan ini segera menyarankan algoritma waktu , setidaknya jika tidak ada ujung poligon Anda yang vertikal.x O ( n )xxO(n)
Spoiler ahoy:
IsMonotone (X [0..n-1], Y [0..n-1])
local_mins ← 0
untuk i ← 0 hingga n-1
if (X [i] <X [i + 1 mod n]) dan (X [i] <X [i-1 mod n])
local_mins ← local_mins + 1
return (local_mins = 1)
Jika Anda khawatir poligon Anda mungkin memiliki pinggiran vertikal, gunakan subrutin berikut sebagai pengganti X[i] < X[j]
untuk secara konsisten memutus ikatan:
IsLess(X, i, j):
return ((X[i] < X[j]) or (X[i] = X[j] and i < j))
Akhirnya, jika adalah beberapa baris lain dari bentuk , ubah sebagai berikut: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))