Mendeteksi dua jenis poligon yang hampir sederhana

22

Saya tertarik pada kerumitan dalam memutuskan apakah poligon non-sederhana yang diberikan hampir sederhana, dalam salah satu dari dua pengertian formal yang berbeda: lemah sederhana atau tidak menyilang sendiri . Karena istilah-istilah ini tidak dikenal secara luas, izinkan saya mulai dengan beberapa definisi.

  • Pp0,p1,p2,,pn1pipipi+1modn

  • Poligon sederhana jika semua n simpul berbeda dan ujung-ujungnya berpotongan hanya pada titik akhirnya. Secara ekivalen, poligon adalah sederhana jika itu adalah homeomorfik untuk sebuah lingkaran dan setiap sisi memiliki panjang positif. Secara umum, bagaimanapun, simpul dan tepi poligon dapat berpotongan sewenang-wenang, atau bahkan bertepatan. 1

  • Pertimbangkan dua jalur poligonal dan B yang persimpangannya merupakan subpath umum dari keduanya (mungkin satu titik). Kita mengatakan bahwa A dan B lintas jika endpoint mereka A (0), B (0), A (1), B (1) alternatif pada batas lingkungan dari umum subpath A \ topi B . Poligon adalah penyilangan diri jika memiliki dua subpath penyeberangan dan non-penyilangan diri . 2ABAB A(0),B(0),A(1),B(1)AB

  • Poligon lemah sederhana jika itu adalah batas urutan poligon sederhana, atau setara, jika ada gangguan kecil sembarang dari simpul yang membuat poligon sederhana. Setiap poligon sederhana yang lemah bersifat non-self crossing; Namun, beberapa poligon yang tidak bersilangan tidak sederhana.

Sebagai contoh, perhatikan enam poin a,b,p,q,x,y ditunjukkan di bawah ini.

masukkan deskripsi gambar di sini

  • Poligon abpqyz sederhana; lihat gambar kiri.

  • Papbpqyqzq poligon papbpqyqzqsangat sederhana; gambar tengah menunjukkan poligon sederhana terdekat. Namun, poligon ini tidak sederhana, karena dikunjungi p tiga kali.

  • poligon adalah self-crossing, karena subpath dan cross. Lihat sosok yang tepat untuk intuisi.b p q z y q p apapbpqzqyqbpqzyqpa

  • Akhirnya, poligon (yang dua kali di sekitar poligon tengah) adalah non-self-crossing, tetapi tidak sederhana sederhana. Secara intuitif, angka balik poligon ini adalah , sedangkan angka balik setiap poligon sederhana harus . (Bukti formal memerlukan beberapa analisis kasus, sebagian karena angka balik sebenarnya tidak terdefinisi dengan baik untuk poligon dengan sudut !)± 2 ± 1 0 papbpqyqzqpapbpqyqzq±2±10

Pembaruan (13 Sep): Pada gambar di bawah ini, poligon adalah non-self-crossing dan telah berbalik nomor 1 , tetapi tidak sederhana sederhana. Poligon dapat dikatakan memiliki beberapa penyeberangan sub- jalan yang tidak sederhana , tetapi tidak memiliki penyeberangan sub- jalan yang sederhana . (Saya katakan "bisa dibilang" karena tidak jelas bagaimana cara mendefinisikan ketika dua jalan yang tidak sederhana berjalan!)abcabcxyzxpqrxzyx

masukkan deskripsi gambar di sini

Jadi akhirnya, inilah pertanyaan saya yang sebenarnya:

  • Seberapa cepat kita dapat menentukan apakah poligon yang diberikan adalah non-self-crossing?

  • Seberapa cepat kita dapat menentukan apakah poligon yang diberikan sederhana sederhana?

Masalah pertama dapat diselesaikan dalam waktu sebagai berikut. Karena ada simpul, ada subpath vertex-ke-vertex ; kita dapat menguji apakah subpath tertentu sederhana dalam waktu (dengan kekerasan). Untuk setiap pasangan sub-simpul vertex-ke-vertex sederhana, kita dapat menguji apakah mereka melintasi dalam waktu . Tetapi ini bukan algoritma terbaik.O(n5)nO(n2)O(n2)O(n)

Saya tidak tahu apakah masalah kedua dapat diselesaikan dalam waktu polinomial. Saya pikir saya dapat dengan cepat menghitung angka balik yang terdefinisi dengan baik untuk sembarang poligon non-sederhana (kecuali penyatuan ujung-ujung poligon hanya jalan, dalam hal ini poligon harus sederhana sederhana); lihat jawaban saya di bawah ini. Namun, contoh poligon baru di atas menyiratkan bahwa non-self-crossing dan balik nomor 1 tidak menyiratkan lemah sederhana.

Kita bisa menentukan apakah poligon yang diberikan adalah sederhana di waktu dengan memeriksa setiap sepasang tepi untuk persimpangan, atau waktu menggunakan algoritma sweepline standar, atau bahkan di waktu menggunakan algoritma triangulasi Chazelle. (Jika input poligon tidak sederhana, algoritma triangulasi apa pun akan melempar pengecualian, infinite-loop, atau menghasilkan output yang bukan triangulasi yang valid.) Tetapi tidak satu pun dari algoritma ini yang menyelesaikan masalah yang saya tanyakan. O ( n log n ) O ( n )O(n2)O(nlogn)O(n)


1 Branko Grünbaum. Poligon: Meister benar dan Poinsot salah tetapi menang . Beiträge zur Algebra und Geometrie 53 (1): 57–71, 2012.

2 Lihat, misalnya: Erik D. Demaine dan Joseph O'Rourke. Algoritma Lipat Geometris: Tautan, Origami, Polyhedra . Cambridge University Press, 2007.

Jeffε
sumber
Saya tidak mengerti mengapa orang akan memilih-turun pertanyaan ini ?!
Kaveh
Saya mungkin benar-benar salah paham terhadap pertanyaan, dan jadi mungkin ini tidak masuk akal, tetapi bagi saya tampaknya cara Anda menghitung simpul berarti bahwa pertanyaan kedua perlu waktu eksponensial. Biarkan saya jelaskan: Dalam contoh terakhir Anda, Anda menggunakan simpul yang sama beberapa kali. Tampaknya mudah untuk membuat grafik di mana ada sejumlah siklus unik yang eksponensial.
Joe Fitzsimons
Jika input Anda adalah poligon yang diberikan seperti dalam contoh Anda, maka mungkin bagi input untuk menjadi eksponensial dalam jumlah simpul tanpa pernah mengulangi siklus. Jika grafik berisi contoh grafik Anda (2 dan 3) sebagai subgraph, maka ia memiliki siklus yang non-persimpangan dan siklus yang persimpangan. Akibatnya, Anda perlu membaca seluruh string untuk memastikan Anda tidak memiliki siklus persimpangan (yang mungkin atau mungkin belum termasuk). Ini membutuhkan waktu eksponensial dalam dalam kasus terburuk. n
Joe Fitzsimons
1
@ JoFitzsimons: Input hanyalah urutan titik (yaitu, pasangan bilangan real), yang tidak perlu berbeda. Ukuran input adalah panjang urutan ini, bukan jumlah titik unik. n
Jeffε
2
@ Kaveh: Mungkin terlalu abstrak / terspesialisasi? Terlalu banyak kata? Seharusnya aku menyebutkan poinnya Ga, Ka, Naa, Taa, Tin, Khat ?
Jeffε

Jawaban:

2

Sepertinya pertanyaan pertama memiliki algoritma (meskipun ini juga kemungkinan tidak optimal). Dengan asumsi bahwa ada persimpangan, kunci untuk menemukan tampaknya bahwa tepi-tepi yang harus ditemukan adalah yang langsung berada di kedua sisi subpath umum. Oleh karena itu, kami melihat semua pasangan tepi yang berurutan. Ada angka kuadrat dari ini. Jika kita menemukan sepasang pasang tepi dengan simpul a b c dan d e f sedemikian rupa sehingga ujung b c dan e f adalah sama, maka kita mengikuti subpath umum ke ujung dan memeriksa tepi yang meninggalkannya. Jika mereka membentuk persimpangan denganO(n3)abcdefbcef dan d e , maka kita selesai, kalau tidak kita pergi ke pasangan berikutnya. Mengikuti subpath umum paling banyak merupakan operasi linear-waktu, sehingga keseluruhan algoritma adalah O ( n 3 ) .abdeO(n3)

Analisis ini mungkin tidak ketat karena jumlah kali jalan bawah-panjang umum linear yang akan diikuti tidak linier dalam jumlah pasangan berpasangan. Seharusnya hanya ada jumlah yang konstan. Demikian pula, jika panjang subpath umum terpanjang adalah konstan, maka kita baik-baik saja dalam hal jumlah waktu mengikuti subpath umum. Saya berharap bahwa kasus terburuk muncul ketika ada satu subpath dengan panjang yang umum untukO(O(n)setapak. Lalu adaO(n)interaksi dan di setiap interaksiO(O(n)O(n)tepian diikuti. Jadi meski begitu, jumlah tepi yang diikuti adalaho(n2), dan terikat disediakan oleh jumlah pasangan. Jadi saya akan menebak bahwa batas sebenarnya untuk algoritma ini adalahO(n2).O(n)o(n2)O(n2)

Chris Gray
sumber
1
"Mengikuti jalan setapak bersama paling banyak adalah operasi linear-waktu ..." Apakah ini benar? Ingatlah bahwa subpath tidak identik. Satu mungkin melipat bolak-balik di sepanjang gambar yang lain. Bahkan, bahkan tidak jelas (bagi saya) ketika Anda tahu Anda sudah selesai.
Pat Morin
Poin bagus. Apakah mungkin, sebagai langkah preprocessing, untuk meletakkan poligon dalam semacam bentuk standar? Kami akan menghilangkan jalan yang langsung terlipat pada diri mereka sendiri, serta simpul yang collinear dengan tetangga terdekat mereka. Maka kalimat yang Anda kutip akan lebih baik didefinisikan - subpath umum terdiri dari tepi yang memiliki simpul yang sama, dan Anda tahu bahwa Anda selesai karena Anda menekan simpul yang berbeda. Membuktikan bahwa jawabannya tetap sama dalam poligon dalam bentuk standar seharusnya tidak terlalu sulit.
Chris Gray
@ ChrisGray: Mungkin, tapi tidak semudah yang Anda sarankan. Jika gambar adalah pohon, maka secara rekursif menghilangkan semua switchback akhirnya mengurangi P ke satu titik. PP
Jeffε
Ya, Anda benar, gagasan itu tidak akan berhasil. Angka paling kanan yang Anda berikan di atas akan dikurangi menjadi satu titik.
Chris Gray
Saya berencana untuk membiarkan hadiah berakhir; setengah poin akan secara otomatis diberikan kepada jawaban ini.
Jeffε
2

Atas saran Pat Morin, inilah ide saya untuk menghitung angka balik. Maaf jika ini agak ceroboh; Saya masih berjuang dengan notasi setan. Selain itu, komentar Pat terhadap jawaban Chris mengungkapkan bahwa saya telah mengabaikan beberapa kasus penting yang merosot. Tapi saya akan memposting ini di sini kalau-kalau orang lain merasa berguna.

Untuk setiap indeks , misalkan θ ( p i ) = θ ( p i - 1 , p i , p i + 1 ) menunjukkan sudut eksternal yang ditandatangani pada titik p i ; ini adalah sudut berlawanan arah jarum jam p i - 1 p i dan p i p i + 1 , dinormalisasi ke kisaran - π θ iiθ(pi)=θ(pi1,pi,pi+1)pipi1pipipi+1 . (Semua indeks aritmatika secara implisit mod n .) The Jumlah balik dari P didefinisikan sebagai T u r n ( P ) = 1πθiπnP Mari saya sebut titikpiamemacujikainternal yangsudut dipisama dengan0. Sudut eksternalθipada taji tidak didefinisikan dengan baik; itu bisaπatau-π. Lebih umum, jumlah belokanPdidefinisikan dengan baik jika dan hanya jikaPtidak memiliki taji (dan tidak ada simpul berulangpi=

Turn(P)=12πi=0n1θ(pi).
pipi0θiππPP ). Tidak sulit untuk membuktikan bahwa T u r n ( P ) adalah bilangan bulat jika didefinisikan dengan baik; khususnya, T u r n ( P ) = ± 1 jika P adalah poligon sederhana.pi=pi+1Turn(P)Turn(P)=±1P

Sekarang anggaplah mengandung berjalan dari bentuk p r s r q , di mana p q dan jalan r s adalah kebalikan dari jalan s r . Maka s adalah taji; panggilan r yang akar dari s . Dalam hal ini, izinkan saya mendefinisikan sudut eksternal pada s sebagai berikut: ˜ θ ( s ) = π s g nPprsrqpqrssrsrss (Tetapi bagaimana jika θ ( p , r , q ) = 0 ? Sebagaimana Pat amati, ini benar-benar dapat terjadi. Mungkin ada semacam cara rekursif untuk mendefinisikan ˜ θ ( s )

θ~(s)=πsgnθ(p,r,q)={πif θ(p,r,q)>0πif θ(p,r,q)<0
θ(p,r,q)=0θ~(s) bahkan dalam hal ini, tetapi saya tidak tahu apa itu.)

PnP~Ps~P~PP~Ps~rsθ(s~)θ~(s)

PrsrrsPrs

θ~(pi)=θ(pi)piTurn~(P)=iθ~(pi)/2π=Turn(P~), which must be ±1 if P is weakly simple.

I'm no longer confident that Turn~(P) can be computed in linear time. The main difficulty is that the walk rs can itself contain spurs. The naive algorithm that finds the root of each spur by brute force actually takes Θ(n2) time in the worst case; consider an n-gon that has a subwalk of length Ω(n) that simply alternates between two points.

Jeffε
sumber