Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2007-01-31 13:57:06.
Revizia anterioară   Revizia următoare  

Minimal enclosing circle

(Categoria Geometrie analitica, Autor Bogdan Tataroiu)

In cadrul acestui articol vom analiza problema determinarii unui cerc de raza minima ce contine in interior sau pe circumferinta toate punctele dintr-un set dat. Aceasta problema mai poate fi gasita si sub denumirea de Smallest Enclosing Circle sau Mininum Spanning Circle.

Algoritm naiv

Este clar ca cercul de raza minima ce include toate punctele din setul dat trebuie sa aiba pe circumferinta cel putin 2 puncte, altfel am putea micsora raza cercului pana cand am atinge si al doilea punct. Daca pe cerc exista 2 puncte consecutive ce formeaza un arc de cerc mai mare de π, atunci cercul poate fi micsorat, ducand centrul cercului inspre segmentul format de cele 2 puncte. Astfel, singurul caz in care cercul de raza minima contine doar 2 puncte pe circumferinta este atunci cand diametrul cercului este egal cu segmentul ce uneste cele 2 puncte, in celelalte cazuri cercul este determinat de 3 (sau posibil mai multe puncte) din set.

De aici este destul de usor de formulat un algoritm:

  • Se considera cercurile determinate de fiecare pereche de puncte din set, cu diametrul egal cu segmentul ce uneste cele 2 puncte, alaturi de cele determinate de oricare 3 puncte din set.
  • Se verifica care dintre acestea contin in interior toate punctele din set si se alege cel de raza minima.

Algoritmul descris are complexitate O(N3) pentru generarea cercurilor si inca O(N) pentru fiecare cerc pentru verificare, in total avand O(N4).

Algoritm O(N2)

Algoritmul acesta se bazeaza pe aceeasi observatii ca mai sus. Se porneste de la un cerc mare care sigur cuprinde toate punctele si se micsoreaza la fiecare pas raza cercului cat mai mult posibil.

  1. Se construieste un cerc de raza suficient de mare incat sa cuprinda toate punctele in mod sigur (raza infinit) si un centru ales aleator.
  2. Se gaseste punctul cel mai departat de centrul cercului, notat cu A, si se micsoreaza raza cercului pana cand acesta atinge punctul.
    Practic raza cercului devine egala cu distanta dintre punctul A si centrul ales.
  3. In cazul in care cercul trece deja prin 2 sau mai multe puncte trecem la pasul numarul 4. In caz contrar, se apropie centrul cercului de punctul A, determinat la punctul 2, pana cand cercul intersecteaza un nou punct. Acest lucru se poate implementa printr-o parcurgere a punctelor din set. Pentru fiecare punct B din set se calculeaza raza cercului astfel incat centrul cercului sa ramana pe aceeasi axa fata de puncutl A si B sa se afle pe cerc ( se formeaza un triunghi isoscel, care are ca baza segmentul AB si celelalte muchii egale cu raza. Se poate calcula raza cercului folosind teorema cosinusului. )
  4. In acest moment avem un cerc determinat de cel putin 2 puncte. Dupa cum am zis mai sus, un cerc de raza minima nu trebuie sa contina 2 puncte consecutive ce formeaza un arc de cerc mai mare de π. Daca cercul nostru nu contine un astfel de arc de cerc, atunci am determinat cercul de raza minima pentru setul de puncte. In caz contrar, notam cu D si E aceste 2 puncte. Pentru a micsora lungimea arcului dintre cele doua puncte, translatam centrul cercului pe directia perpendiculara cu segmentul DE, inspre acest segment pana cand:
    1. centrul cercului ajunge pe segmentul DE. In acest moment DE a devenit diametru in cerc si am determinat cercul de raza minima
    2. cercul intalneste un alt punct F. Daca mai exista 2 puncte consecutive pe cerc care se formeaza un arc de cerc cu lungime mai mare de π, atunci trebuie sa repetam pasul 4. In caz contrar, am ajuns la solutie.

Algoritmul este destul de usor de vizualizat, dar destul de dificil de implementat ( trebuie cateva cunostinte de geometrie ). Fiecare pas din algoritm are complexitate O(N), dar pasul 4 poate fi repetat de maxim N - 2 ori, ceea ce duce in final la o complexitate O(N2).

Algoritm O(N)

Algoritmul acesta construieste cercul in mod incremental, adaugand pe rand puncte in cercul de raza minima.

Pentru inceput, se permuta punctele din set intr-un mod aleator si se formeaza un cerc care are ca diametru segmentul format de primele 2 puncte din permutare. Notam cu C(i) cercul de raza minima ce include primele i puncte. Pentru fiecare punct P(i + 1), putem determina in timp constant daca punctul se afla in interiorului cercului C(i). In cazul in care P(i + 1) este inclus in C(i), atunci C(i + 1) va fi egal cu C(i). In caz contrar, trebuie sa schimbam cercul C(i) pentru a cuprinde si acest punct. Cercul ce cuprinde toate punctele va fi evident C(N), unde N este numarul de puncte din set. Singura problema este cum determinam acel cerc modificat.

La o prima vedere se pare ca trebuie doar sa calculam cel mai mic cerc ce include P(i + 1) alaturi de cele 3 puncte ce determinau C(i) fara sa mai luam in considerare celelalte puncte din set, insa nu este greu de gasit un caz pentru care raman puncte in exterior, asa cum se vede in poza alaturata.

Vom demonstra in continuare ca daca punctul P(i + 1) se afla in exteriorul cercului C(i), atunci el trebuie sa fie pe circumferinta cercului C(i + 1). Dandu-se doua cercuri de raza R1 si R2, avand R1 != R2, atunci ...

...TODO restul...
...
...
...

Exercitii: SPOJ ALIENS