Uploaded by Niel

Desain-Analisa-Algoritma-Pertemuan-13.en.id

advertisement
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)
Download