Pagini recente » Comoditate | Sandbox | Atasamentele paginii gt_5_sr | Diferente pentru utilizator/alex_tz307 intre reviziile 13 si 14 | Diferente pentru voronoi intre reviziile 30 si 29
Diferente pentru
voronoi intre reviziile
#30 si
#29
Nu exista diferente intre titluri.
Diferente intre continut:
<p>Sa pornim de la urmatoarea problema: Avem o colectie de N drepte in plan, oricare doua neconfundate, astfel incat nici una din ele nu trece prin origine. Sa se indice care din drepte sunt vizibile din origine.</p>
<p>Un algoritm decent functioneaza in O(N^2^), astfel: ia fiecare dreapta d ~i~ , si o intersecteaaza cu fiecare din celelalte drepte d ~j~ . In acest fel, di se imparte in doua semidrepte, din care numai una este vizibila din origine, cealalta fiind obturata de catre dj. In felul acesta tot intersectam semidrepte peste semidrepte, si vedem daca in final ramanem cu vreun segment vizibil din origine. Desigur, pe parcurs apare tot tacamul de cazuri particulare: drepte verticale, drepte orizontale, erori de calcul, radicali, distante etc. Sper ca v-am scarbit destul ca sa vreti sa aflati si o implementare mai eleganta.</p>
<p>Un algoritm decent functioneaza in O(N^2^), astfel: ia fiecare dreapta di, si o intersecteaaza cu fiecare din celelalte drepte dj. In acest fel, di se imparte in doua semidrepte, din care numai una este vizibila din origine, cealalta fiind obturata de catre dj. In felul acesta tot intersectam semidrepte peste semidrepte, si vedem daca in final ramanem cu vreun segment vizibil din origine. Desigur, pe parcurs apare tot tacamul de cazuri particulare: drepte verticale, drepte orizontale, erori de calcul, radicali, distante etc. Sper ca v-am scarbit destul ca sa vreti sa aflati si o implementare mai eleganta.</p>
<p>Vom prezenta un algoritm foarte dragut si foarte cunoscut (in final) care rezolva problema in O(N log N). Facem intai urmatoarea conventie. De vreme ce dreptele nu trec prin origine, ele au ecuatii de forma ax+by+c=0, cu c<>0. Atunci le vom aduce pe toate la forma ax+by+1=0 (evident, impartind prin c).</p>
Dorim sa separam acum dreptele vizibile din origine de celelalte drepte. Sa vedem daca nu putem lucra cumva cu punctele duale. Intuitiv, ce inseamna o dreapta INvizibila din origine? Inseamna o dreapta "departata" de origine (in sensul ca alte drepte vor fi mai aproape decat ea si o vor obtura). In limbaj dual, asta inseamna ca punctul dual va fi mai aproape de origine, in sensul ca vor fi alte puncte mai departe decat el.
Asta cred ca deja va sugereaza ideea de rezolvare. Daca v-ati gandit la infasuratoare convexa, ati pus punctul pe y. Algoritmul este urmatorul:
* Se da multimea de drepte (a ~i~ *x+b ~i~ *y+c ~i~ =0)
* Aducem toate dreptele la forma a ~i~ *x+b ~i~ *y+1=0, impartind prin c ~i~
* Aflam infasuratoarea convexa a multimii de puncte (a ~i~ ,b ~i~ )
* Se da multimea de drepte (ai*x+bi*y+ci=0)
* Aducem toate dreptele la forma ai*x+bi*y+1=0, impartind prin ci
* Aflam infasuratoarea convexa a multimii de puncte (ai,bi)
* Punctele de pe aceasta infasuratoare convexa corespund dreptelor vizibile din origine.
De ce asa? Pentru ca punctele de pe infasuratoarea convexa sunt cele mai departate de origine, deci dreptele lor duale sunt cele mai apropiate de origine. Va las placerea de a analiza cazurile particulare, de exemplu cele in care multimea de drepte nu defineste un poligon inchis in jurul originii, ci unul deschis (hint: originea nu apartine infasuratorii convexe a punctelor duale).
Nu exista diferente intre securitate.
Topicul de forum nu a fost schimbat.