Note de curs, clasele 9-12, 7 noiembrie 2013
From Algopedia
Jump to navigationJump to search
Am făcut geometrie computațională cu toate clasele împreună.
Recapitulare
- ecuația dreptei: ax + by + c = 0
- forma cu pantă: y = mx + y0
- dreapta care trece prin două puncte (x1, y1) și (x2, y2)
- date fiind două drepte, ax + by + c = 0 și dx + ey + f = 0,
- dreptele paralele au aceeași pantă: ae = bd
- dreptele perpendiculare au produsul pantelor egal cu -1, adică ad + be = 0
- demonstrație: calculează tg(α + 90°)) = - 1 / tg(α)
- distanța de la punctul (m, n) la dreaptă: d = (am + bn + c) / sqrt(a2 + b2)
- schiță de demonstrație: dacă(x0, y0) este piciorul perpendicularei din punct pe dreaptă, atunci (n-y0)a = (m - x0)b
- normalizarea dreptei prin împărțirea la sqrt(a2 + b2)
- separarea planului: semnul punctului la înlocuirea în ecuația dreptei ne indică de care parte a dreptei este.
Dualitate
- definită pentru dreptele care nu trec prin origine
- definită pentru toate punctele în afara originii
- fiecărei drepte d: ax + by + 1 = 0 îi asociem punctul P*(a,b)
- fiecărui punct P(a,b) ≠ O îi asociem dreapta d*: ax + by + 1 = 0
- se observă că P este dincolo de origine față de dreaptă, iar OP* ⊥ d
- așadar, putem construi ochiometric punctul dual, ducând perpendiculara pe dreaptă prin origine și prelungind-o dincolo de ea.
- intuitiv, dreptele depărtate de origine se dualizează în puncte apropiate și invers
- concret, distanța de la dreaptă la origine este 1 / sqrt(a2 + b2), iar PO* = sqrt(a2 + b2)
- spațiu primal, spațiu dual
Proprietăți ale dualității
- punctele distincte se dualizează în drepte distincte și invers
- dreptele care trec prin origine nu se pot dualiza, căci ecuațiile nu pot fi împărțite prin c
- intuitiv, deoarece dreptele care trec prin origine sunt la distanță 0 de origine, ele s-ar dualiza în puncte aflate la infinit
- două drepte d1 și d2 care se intersectează într-un punct P se dualizează în două puncte P1* și P2* care determină o dreaptă d*, unde d* este exact duala lui P
- demonstrație: fie d1: ax + by + 1 = 0 și d2: dx + ey + 1 = 0. Fie (p,q) punctul lor de intersecție, deci ap + bq = dp + eq = -1. În planul dual, dreapta care trece prin punctele (a,b) și (d,e) are ecuația (x-a)/(d-a) = (y - b)/(e - b), adică (x-a)(e-b) = (y-b)(d-a). Amplificăm ambele părți cu pq, apoi reducem observând că (a-d)p = (e - b)q. Rezultă că ecuația lui d* este px + qy + 1 = 0, exact duala lui p.
- similar, două puncte care determină o dreaptă se dualizează în două drepte care se taie exact în punctul dual al dreptei
- generalizare: n puncte coliniare se generalizează într-un fascicul de drepte care se intersectează în punctul dual al dreptei (și invers)
- demonstrație: scriem ecuația dreptelor duale și verificăm trivial că punctul dual este pe toate aceste drepte
- două drepte paralele se dualizează în două puncte coliniare cu originea (vizual)
- n drepte paralele se dualizează în n puncte coliniare
- la fel ca și un fascicul de drepte, doar că punctul de intersecție este la infinit
- două drepte perpendiculare se dualizează în două puncte care, împreună cu originea, formează un triunghi dreptunghic
- un segment se dualizează în două unghiuri opuse la vârf
- demonstrație: pentru a dualiza segmentul, dualizăm toate punctele de pe segment, obținând două fascicule de semidrepte opuse la vârf.
- conservarea orientării: P și O sunt de aceeași parte a lui d dacă și numai dacă Dual(d) și O sunt de aceeași parte a lui Dual(P)
- demonstrație: considerăm câte o dreaptă paralelă cu d și vedem cum se dualizează toate punctele de pe ea.
Aplicații
- dându-se n drepte și un punct P(x,y), ce drepte sunt vizibile din P?
- O(n2) naiv
- Prin dualizare nu obținem ceva mult mai simplu. Ar trebui să găsim punctele cele mai „apropiate” de o dreaptă (definiție de altfel cam ambiguă)
- soluție: translatăm sistemul cu (-x, -y) astfel încât P să devină originea
- cum translatăm o dreaptă d: ax + by + c = 0 spre stânga cu (xt, yt)?
- panta rămâne neschimbată; noua intercepție pe y va fi -(a/b)xt - c/b - yt
- de aici rezultă noua ecuație d': ax + by + (axt + byt + c) = 0
- după dualizare, rezolvăm înfășurătoarea convexă
- demonstrație de corectitudine: cu conservarea orientării
diagrame Voronoi
- definiție, exemplu
- algoritm naiv: pentru fiecare punct, calculăm celula Voronoi pornind cu întregul dreptunghi, apoi retezând porțiuni de-a lungul mediatoarelor: O(n3), complicat
- mai bine: pentru fiecare punct, considerăm mediatoarele și laturile dreptunghiului; apoi rezolvăm problema vizibilității
- complexitate O(n2 log n) dacă facem înfășurătoarea convexă prin Graham scan
- până aici, știm doar dreptele care formează poligonul; dar, fiindcă le primim ordonate trigonometric, putem calcula și vârfurile poligonului: Pi = di ∩ di - 1.
- dacă folosim în loc algoritmul gift wrapping (Jarvis march), obținem O(n2)
- demonstrație: suma punctelor de pe toate înfășurătoarele convexe va fi 2 * numărul de muchii din diagrama Voronoi, care este maxim 3n - 6
- demonstrație: formula lui Euler este v + f - e = 2. Pentru o diagramă Voronoi cu un vârf adăugat la infinit, f = n + 1. Fiecare vârf are grad cel puțin 3, iar suma gradelor vârfurilor este 2e. Așadar, 2e >= 3(v + 1) ⇒ 2e >= 3(2 + e - n) = 6 + 3e - 3n ⇒ e <= 3n - 6
- divide et impera O(n log n), greu
- Fortune O(n log n) cu sweep “line”, greu