Bagaimana saya menguji apakah poligon monoton sehubungan dengan garis?

10

Sudah diketahui umum bahwa poligon monoton memainkan peran penting dalam triangulasi poligon .

Definisi: Suatu poligon dalam bidang disebut monoton sehubungan dengan garis lurus , jika setiap garis ortogonal ke memotong paling banyak dua kaliPLLP

Diberi garis dan poligon , apakah ada algoritma yang efisien untuk menentukan apakah poligon adalah monoton sehubungan dengan ?LPPL

com
sumber

Jawaban:

10

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))
JeffE
sumber
1

Berikut adalah penjelasan yang lebih informal, tingkat tinggi, dan mudah-mudahan, intuitif dari suatu algoritma untuk memeriksa apakah poligon "horizontal monoton", yaitu sehubungan dengan sumbu.x

  1. Temukan simpul paling kiri dan paling kanan (yaitu simpul dari poligon dengan masing-masing min dan max -coordinate), dalam waktu (yaitu hanya iterate sekali daftar simpul).O ( n )xO(n)

  2. Dua simpul ini membagi batas poligon menjadi dua kurva: rantai atas dan rantai bawah.

  3. Berjalanlah dari kiri ke kanan di sepanjang setiap rantai, memverifikasi bahwa -coordinate tidak bertambah. Ini membutuhkan waktu.O ( n )xO(n)

nbro
sumber