Apa Komputasi Geometri? • Studi Struktur Data dan Algoritma untuk Masalah Geometrik Problems in Application Domains 1 formulate Specific Geometrical Problems 2 design Algorithms to Solve Geometric Problems 3 modify methods for original problems (implementation) • 1970's: Need for Computational Geometry Diakui; Kemajuan yang dibuat pada 1 dan 2 • Hari ini: “menguasai” 1 dan 2, tidak begitu sukses dengan 3 Sumber Dari: www2.ee.ntu.edu.tw/~yen/courses/al-01/A15Computational%20Geometry.ppt Domain aplikasi • Grafis Komputer dan Virtual Reality – 2-D & 3-D: persimpangan, tersembunyi penghapusan permukaan, ray tracing – Virtual Reality: deteksi tabrakan (simpang) • robotika – perencanaan gerak, orderings perakitan, deteksi tabrakan, jalan temuan terpendek • Sistem Informasi global (GIS) – Data Set besar desain struktur data – hamparan Cari poin dalam beberapa lapisan – Interpolasi Cari poin tambahan berdasarkan nilai-nilai poin yang diketahui – Voronoi Diagram poin Domain aplikasi terus • Computer Aided Design dan Manufaktur (CAD / CAM) – Desain 3-D objek dan memanipulasi mereka • manipulasi yang mungkin: merge (union), terpisah, bergerak – “Desain untuk Majelis” • CAD / CAM menyediakan tes pada objek untuk kemudahan perakitan, pemeliharaan, dll • Biologi komputasi – Menentukan bagaimana protein menggabungkan bersamasama berdasarkan lipatan dalam struktur • pemodelan permukaan, jalan temuan, persimpangan Contoh: 2-D Convex Hulls • definisi – Sebuah subset P dari pesawat adalah cembung IFF untuk setiap p, q P segmen garis pq benar-benar terkandung di P. – Itu convex hull dari satu set P, dilambangkan CH (P), Adalah yang terkecil set cembung mengandung P. • Persimpangan dari semua set cembung mengandung P. • Analogi: Jika poin kuku di papan, karet gelang (cembung hull) membungkus semua paku di papan. • Definisi alternatif: CH (P) adalah poligon cembung unik yang simpul adalah titik P yang berisi semua poin di P Geometri Contoh Non-Euclidean Geometri komputasi Geometri • masalah inklusi: – menemukan titik di subdivisi planar, – pelaporan mana titik antara himpunan yang terkandung dalam domain tertentu, dll. • masalah persimpangan: – menemukan persimpangan segmen garis, poligon, lingkaran, persegi panjang, polyhedra, setengah spasi, dll • masalah Proximity: – menentukan pasangan terdekat antara satu set poin yang diberikan, – menghitung jarak terkecil dari satu set poin yang lain. • masalah konstruksi: – mengidentifikasi convex hull poligon, – memperoleh kotak terkecil yang mencakup satu set poin, dll Metode Geometris SD • Mudah untuk memvisualisasikan, sulit untuk menerapkan (tapi kadang-kadang hal itu akan menyebabkan jauh lebih efisien algoritma dari metode lain). • Grafik adalah planar jika dapat ditarik dalam pesawat sehingga tidak ada dua ujungnya berpotongan. • Sebuah subdivisi planar adalah gambar grafik planar di segmen garis lurus. • Sebuah poligon sederhana jika tidak ada dua sisi itu berpotongan. • Dua poligon Q dan R dikatakan berpotongan jika tepi Q menyeberangi tepi R. • Dasar geometris struktur data: jenis titik = record x, y: integer akhir; baris = record p1, p2: titik akhir; Properti baris Segmen • • • Dua poin yang berbeda: p1= (X1, y1), P2= (X2, y2) Tentukan titik p baru3 = ap1+ (1-a) p2, Di mana 0 Sebuah 1 – p3 adalah setiap titik pada garis antara p1 dan p2 – p3 adalah kombinasi cembung dari p1 dan p2 segmen garis p1p2 adalah himpunan kombinasi cembung p1 dan p2. – p1 dan p2 adalah titik akhir dari segmen p1p2 y p2 p3 p1 x Palang Produk • • • • • • Dapat memecahkan banyak masalah geometris menggunakan produk silang. Dua poin: p1= (X1, y1), P2= (X2, y2) produk silang dari dua titik didefinisikan oleh p1 xp2 = Determinan dari matriks x1 x2 y1 y2 = x1y2 - x2y1 = Daerah ditandatangani genjang empat poin: (0,0), p1, p2, p1+ p2 Apa yang terjadi jika p1 xp2 = 0? Jika p1 xp2 positif maka p1 adalah searah jarum jam dari p2 Jika p1 xp2 adalah negatif maka p1 adalah berlawanan dari p2 y p2(x2, y2) p1+ p2 p1(x1, y1) x Searah jarum jam atau Berlawanan • • Definisi masalah – Menentukan apakah segmen p diarahkan0p1 adalah searah jarum jam dari segmen p diarahkan0p2 wrt p0 Larutan 1. peta p0 ke (0,0), p1 untuk p1', P2 untuk p2' – p1'= P1 - p0, p2'= P2 - p0 2. Jika p1'xp2'> 0 maka segmen p0p1 adalah searah jarum jam dari p0p2 3. lain berlawanan p2 p1 p1 p0 (a) p0p2 adalah berlawanan dari p0p1: (P2p0) X (p1p0) <0 p2 p0 (b) p0p2 adalah searah jarum jam dari p0p1: (p2p0) X (p1p0)> 0 Belok Kiri atau Belok Kanan • • Definisi masalah – Menentukan apakah dua berurutan segmen garis p0p1 dan p1p2 belok kiri atau kanan di umum titik p1. Larutan – Tentukan p0p2 adalah searah jarum jam atau berlawanan dari p0p1 wrt p0 – Jika berlawanan kemudian belok kiri di p0 – lain belok kanan di p0 p2 p1 p1 p0 (a) Belok kiri di p1 (p2p0) X (p1p0) <0 p2 p0 (b) Belok kanan di p1 (p2p0) X (p1p0)> 0 Persimpangan 2 Segmen Jalur Dua Segmen Intersect (2) • lima kasus p2 p3 p4 p3 p4 p1 p2 p1 (a) p1p2, p3p4 memotong (b) p1p2, p3p4 tidak berpotongan p3 p4 p2 p2 p4 p1 (c) p1p2, p3p4 memotong p4 p p2 3 p3 p1 (d) p1p2, p3p4 memotong p1 (e) p1p2, p3p4 tidak berpotongan Dua Segmen Intersect (3) • 1. 2. Pertimbangkan dua produk silang: (p3 - p1) X (p2 - p1) (p4 - p1) X (p2 - p1) p2 p3 p4 p4 p1 (a) p1p2, p3p4 memotong: (p3 - p1) X (p2 - p1) <0 (p4 - p1) X (p2 - p1)> 0 p3 p2 p1 (b) p1p2, p3p4 tidak berpotongan: (p3 - p1) X (p2 - p1) <0 (p4 - p1) X (p2 - p1) <0 Dua Segmen Intersect (4) p3 p4 p2 p2 p4 p1 (c) p1p2, p3p4 memotong (p3 - p1) X (p2 - p1) <0 (p4 - p1) X (p2 - p1) = 0 p3 p1 (d) p1p2, p3p4 memotong (p3 - p1) X (p2 - p1) = 0 (p4 - p1) X (p2 - p1) = 0 Dua Segmen Intersect (5) • Kasus (e) – Apa saja produk silang? • (p3 - p1) X (p2 - p1) = 0 • (p4 - p1) X (p2 - p1) = 0 – Produk silang adalah nol, tetapi mereka tidak berpotongan – hasil yang sama dengan Case (d) p4 p p2 3 p1 (e) p1p2, p3p4 tidak berpotongan bounding box • • • • Definisi – Mengingat objek geometris, kotak berlari didefinisikan oleh persegi panjang terkecil yang berisi objek Mengingat dua segmen garis p1p2 dan p3p4 The berlari kotak ruas garis p1p2 – Persegi panjang dengan sudut kiri bawah = (x1', Y1') = (Min (x1, x2), Min (y1, y2)) Dan – titik kanan atas = (x2', Y2') = (Max (x1, x2), Max (y1, y2)) The berlari kotak ruas garis p3p4 aku s – Persegi panjang dengan sudut kiri bawah = (x3', Y3') = (Min (x3, x4), Min (y3, y4)) Dan 4 , x ), Max (y , y )) – titik kanan atas = (x4', Y4') = (Maxp(x 3 4 3 4 p p2 3 p1 bounding box • • • Bagaimana kondisi untuk dua berlari kotak berpotongan? – (x3' x2') Dan (x1' x4') Dan (y3' y2') Dan (y1' y4') Jika dua kotak melompat-lompat tidak berpotongan, maka dua segmen garis tidak berpotongan. Tapi itu tidak selalu benar bahwa – jika dua kotak bounding berpotongan, maka dua segmen garis berpotongan – misalnya, angka p4 p2 p3 p1 Dua Segmen Intersect (6) • Ringkasan kasus – (A) p1p2, p3p4 memotong • • – (B) p1p2, p3p4 tidak berpotongan • • – (p3 - p1) X (p2 - p1) <0 (p4 - p1) X (p2 - p1) <0 (C) p1p2, p3p4 memotong • • – (p3 - p1) X (p2 - p1) <0 (p4 - p1) X (p2 - p1)> 0 (p3 - p1) X (p2 - p1) <0 (p4 - p1) X (p2 - p1) = 0 (D) p1p2, p3p4 memotong • • (p3 - p1) X (p2 - p1) = 0 (p4 - p1) X (p2 - p1) = 0 – (E) p1p2, p3p4 tidak berpotongan • (p3 - p1) X (p2 - p1) = 0 • (p4 - p1) X (p2 - p1) = 0 Dua Segmen Intersect - Algoritma • Two_line_segments_intersect (p1p2, p3p4) 1. (x1', Y1') = (Min (x1, x2), Min (y1, y2)) 2. (x2', Y2') = (Max (x1, x2), Max (y1, y2)) 3. (x3', Y3') = (Min (x3, x4), Min (y3, y4)) 4. (x4', Y4') = (Max (x3, x4), Max (y3, y4)) 5. jika tidak ((x3' x2') Dan (x1' x4') Dan (y3' y2') Dan (y1' y4')) kemudian 6. kembali palsu // kasus (e) dan lebih 7. lain 8. jika (p3p1) X (p2p1) Atau (p4p1) X (p2p1) Adalah nol maka 9. kembali benar // kasus (c) dan (d) 10. lain jika (p3p1) X (p2p1) Dan (p4p1) X (p2p1) Memiliki tanda yang berbeda maka 11. kembali benar // kasus (a) 12. lain 13. kembali palsu // kasus (b) Baris Segmen temu Masalah • Masalah: Mengingat n segmen garis, adalah setiap pasangan dari mereka serangga? • Jelas, melakukan pengujian persimpangan berpasangan membutuhkan O (n2) Waktu. Dengan teknik menyapu, kita bisa menyelesaikannya dalam O (n log n) waktu (tanpa mencetak semua persimpangan). • Dalam kasus terburuk, ada (n2) Persimpangan. • menyederhanakan asumsi – Tidak ada segmen input vertikal. – Tidak ada tiga segmen masukan berpotongan pada satu titik. Definisi masalah Definisi masalah: Memasukkan : S = {s1, s2. ..., sn} dari n segmen dalam pesawat. Output: set saya dari titik persimpangan antara segmen di S. (Dengan segmen yang berisi masing-masing pt persimpangan) Berapa banyak persimpangan mungkin? n Dalam kasus terburuk, (n 2 ) 2 Brute Algoritma Angkatan Intersect Algoritma: Brute Force Intersect (S) Menguji semua pasangan (ssaya, sj)SXS, saya tidak sama j. Jika ssaya memotong sj, Laporan ssaya memotong sj. Kompleksitas ( n 2 ) -Mungkin ada lebih sedikit persimpangan. -Bisa kita menghabiskan lebih sedikit waktu (tergantung pada | I |)? Output sensitif: -Waktu berjalan tergantung pada: n: #of segmen masukan k: ukuran output Tujuan Apa yang akan menjadi waktu terbaik? O (n + k)? Sebenarnya batas bawah (nmencatatn+k) dikenal. Tujuan: Algoritma keluaran-sensitif yang menghindari pasang pengujian segmen untuk simpang jika mereka “berjauhan”. Ide Ide: segmen proyek ke y-axis. 1. Jika ssaya & sj berpotongan, maka begitu juga y-interval mereka (misalnya s1 & s2 ). 2. Jika y-interval ssaya & sj mengenakan't berpotongan, maka juga tidak ssaya & sj (Misalnya s1 & s3 ) 3. Jika y-interval ssaya & sj jangan berpotongan, maka mungkin ssaya & sj berpotongan (misalnya s3 & s4 ) y S1 S2 S4 S3 x kita mungkin masih menguji ekstra, tapi lebih baik dari sebelumnya. Pesawat Sapu Algoritma Pesawat Sapu Algoritma: L adalah garis sapuan horisontal awalnya di atas semua segmen. Menyapu L ke bawah segmen, dan melacak semua segmen berpotongan itu. Status T garis menyapu adalah himpunan segmen saat ini berpotongan L . Acara adalah titik di mana perubahan status. Pada setiap event point Perbarui status garis menyapu: menambah / menghapus segmen dari T Melakukan tes persimpangan Segmen memesan • Dua saling berpotongan segmen s1 dan S2 sebanding pada x jika garis menyapu vertikal dengan x-koordinat x memotong mereka berdua. • s1 di atas s2 pada x, s ditulis1 >x s2, Jika s1 dan S2 sebanding pada x dan persimpangan s1 dengan garis menyapu di x lebih tinggi dari persimpangan s2 dengan garis menyapu sama. Contoh Pindah Line Sapu • algoritma menyapu biasanya mengelola dua set data: 1. Status menyapu-line memberikan hubungan antara objek-objek berpotongan dengan garis menyapu. 2. Jadwal event-titik adalah urutan x-koordinat, memerintahkan dari kiri ke kanan, yang mendefinisikan posisi tersendat-sendat (event poin) dari garis menyapu. Perubahan status menyapu-line hanya terjadi pada titik-titik acara. • Jadwal event-titik dapat ditentukan secara dinamis sebagai algoritma berlangsung atau ditentukan statis, hanya didasarkan pada sifat sederhana dari input data. Pindah Line Sapu • Mengurutkan titik akhir segmen dengan meningkatkan x-mengkoordinasikan dan melanjutkan dari kiri ke kanan. • Menyisipkan segmen ke status menyapu-line ketika endpoint kiri ditemui, dan menghapusnya dari status menyapu-line ketika endpoint haknya ditemui. • Setiap kali dua segmen pertama menjadi berturut-turut dalam total order, kami memeriksa apakah mereka berpotongan. Pindah Line Sapu • Status menyapu-line adalah agar T. Total yang kami membutuhkan operasi berikut: – INSERT (T, s): segmen insert s ke T. – DELETE (T, s): menghapus segmen s dari T. – ATAS (T, s): segera mengembalikan segmen di atas segmen s di T. – BAWAH (T, s): segera mengembalikan segmen bawah segmen s di T. • Jika ada n segmen di masukan, kita dapat melakukan setiap operasi di atas dalam O (log n) waktu menggunakan pohon merah-hitam. • Menggantikan perbandingan kunci dengan perbandingan lintas-produk yang menentukan urutan relatif dari dua segmen. Segmen-persimpangan Pseudocode Jalur Ditutup sederhana • Soal: Menemukan tur melalui Aset dari n poin yang diberikan. • Pengamatan: Dibatasi TSP. • algoritma: 1. Pilih "jangkar" titik. 2. Menghitung sudut yang dibuat oleh menggambar garis dari masing-masing poin di set untuk jangkar dan kemudian keluar di horisontal positif arah. 3. Memilah poin sesuai dengan sudut dihitung pada langkah 2. 4. Hubungkan titik yang berdekatan. 1. Kompleksitas: O (n log n). Ilustrasi Komputasi Angle • angle = berjemur-1(Dy / dx). • Masuk akal untuk menggunakan fungsi yang jauh lebih mudah untuk menghitung tetapi memiliki properti pemesanan sama dengan arctangent. Fungsi theta (p1, p2: point): real; var dx, dy, kapak, ay: integer; t: real; mulai dx: = p2.x - p1.x; kapak: = abs (dx); dy: = p2.y - p1.y; ay: = abs (dy); jika ax + ay = 0 maka t: = 0 lagi t: = dy / (ax + ay); jika dx <0 maka t: = 2 - t lain jika dy <0 maka t: = 4 + t; theta: = t * 90,0; / * Kembali tidak a. antara 0 dan 360 Apakah Point dalam • • • Definisi masalah – Mengingat poligon P sederhana dan q titik, menentukan apakah intinya adalah dalam atau di luar poligon. poligon dapat poligon non-cembung Ide – Menarik garis dari titik ke titik di luar poligon, menghitung jumlah persimpangan dengan tepi poligon. – Intinya adalah di dalam poligon IFF jumlah persimpangan ganjil Apakah Point Inside (2) • Point_in_polygon (P, q) // P: poligon dengan simpul p1, p2, .., pn, Tepi e1, e2, .., en // q: titik 1. memilih titik s sewenang-wenang di luar poligon 2. count = 0 3. untuk semua tepi esaya poligon lakukan 4. jika esaya memotong qs segmen garis kemudian 5. count ++ 6. jika jumlah ganjil kemudian kembali benar 7. lain kembali palsu • Kompleksitas – O (n) ketika n = ukuran poligon Apakah Point Inside (3) • Asumsikan kasus khusus tidak terjadi – Kasus (a) dan (b) • Pengamatan – Apakah memang penting untuk menemukan garis yang optimal (yaitu, garis qs segmen) yang meminimalkan jumlah persimpangan? – Tidak Menemukan jumlah persimpangan lebih penting • Ide: Dapat menggunakan garis vertikal yang melewati titik q q s (a) tidak harus menghitung q s (b) harus menghitung Apakah Point Inside (4) • Point_in_polygon_2 (P, q) // P: poligon dengan simpul p1, p2, .., pn, Tepi e1, e2, .., en // q: titik (x0, y0) 1. count = 0 2. untuk semua tepi esaya poligon lakukan 3. jika esaya memotong garis x = x0 kemudian 4. ysaya = Y-koordinat persimpangan 5. jika ysaya <y0 kemudian menghitung ++ // ini bisa ysaya > y0 6. jika jumlah ganjil kemudian kembali benar 7. lain kembali palsu • Kompleksitas – O (n) ketika n = ukuran poligon Menemukan Convex Hull • Sebuah convex hull dari n poin diberikan didefinisikan sebagai poligon cembung terkecil yang mengandung mereka semua • Komputasi Convex hull ditutup terkait dengan Ide Metode 1: Paket Wrapping 1. Menemukan titik anchor (katakanlah, satu dengan yang terkecil nilai y). 2. Ambil ray horisontal dalam arah yang positif, dan menyapu ke atas sampai memukul titik lain, titik ini harus di lambung. 3. Anchor pada titik yang baru ditemukan dan terus menyapu sampai memukul titik lain. 4. Ulangi langkah 3 sampai "paket" sepenuhnya "dibungkus" • kompleksitas waktu: Jika ada m simpul pada lambung, maka teknik paket pembungkus membutuhkan sekitar langkah mn: (n-1) + (n-2) + ... + (nm) = mn - m (m + 1) / 2. Metode 2: The Graham Pindai 1. Buatlah sebuah lintasan tertutup sederhana dari n poin yang diberikan. 2. Pilih jalur yang ekstrim, mulai scan pada semua poin. Jika sudut ABC ditemukan menjadi refleks, Menghilangkan titik B dari convex hull. • kompleksitas waktu: O (n lg n). Setelah semacam itu, scan Graham adalah proses linear-waktu. Metode 3: Interior Penghapusan • Metode eliminasi interior linear, rata-rata. Metode 4: A D & C pendekatan D & P Pendekatan Lanjutan • MERGE membutuhkan O (n) waktu. • t (n) = 2t (n / 2) + cn = O (n log n). Teknik Pengurangan: Kebenaran Kebenaran Maksimal Polygonal Jarak • Hanya harus mempertimbangkan jarak antara simpul. • Langsung algoritma: O (n2) • traversal searah jarum jam: O (n)