Prelegere1Concepte generale ale graficii pe calculator
Gc baleiere _infasuratoare_convexa (2)
1. Geometrie Computationala
Baleiere si Infasuratoare Convexa
Centru de pregatire pentru performanta „Hai la Olimpiada” Suceava
disciplina informatica
autor: Airinei Andrei Cristian
Baleiere (engl. Sweeping Line ~ maturare cu o linie), e o tehnica de
scanare a planului.
Ea consta in „maturarea” planului cu ajutorul unei drepte ( ea e doar
conceptual mutata), in general prin adaugarea acestora intr-o structura de
date la detectarea lor si eliminarea cand linia imaginara paraseste cadrul
obiectului.
Baleiere Orizontala / Verticala consta in deplasarea dreptei:
O sa dau 3 exemple, destul de cunoscute dar care suprind metoda
Problema 1: Se dau N puncte in plan , gasiti perechea care este cea mai
apropiata (din punct de vedere al distantei pe o coordonata min dintre abs(xi-
xj) , abs(yi, - yj)):
Cum facem in O(n2
) ? Putem mai bine?
2. Exista vreo pereche dintre cele 3 puncte din imagine pentru care nu are sens sa
calculam distanta, deoarece sigur nu ne duce la solutie?
Problema 2:
Se dau N segmente in plan date prin x y1 y2 pentru cele verticale, si prin y x1
x2 pentru cele verticale, se garanteaza ca nu exista doua segmente care se
suprapun, Aflati numarul de intersectii intre segmente.
Cum facem O(n2
)? Cum calculam daca doua segmente se intersecteaza?
Folosind aceiasi idee de baleiere verticala(sau orizontala) in ce structura de
date putem retine segmentele astfel incat sa putem raspunde si la cerinta
problemei?
Daca coordonatele sunt foarte mari ce facem?
Bonus: idee de o normalizare suficient de rapida si scurta, punem tot ce vrem
sa normalizam intr-un vector, il sortam si scoatem duplicatele dupa cautam
binar (din fericire STL stie sa faca asta in vreo 3 randuri):
1. sort(all.begin(), all.end());
2. all.erase(unique(all.begin(), all.end(),same),all.end());
3. //norma(x) valoarea normalizata a lui x
4. int norma(point val)
5. {
6. auto it = lower_bound(all.begin(), all.end(),val);
7. return distance(all.begin(),it) + 1;
8. // +1 pentru normalizare indexata de la 1
9. }
Problema 3: (destul de greu)
Se dau N dreptunghiuri in plan avand laturile paralele cu axele, aflati aria
reuniunii lor?
Cum rezolvam problema fara baleiere? Ce complexitate avem?
Baleiere Radiala: in loc sa deplasam dreapta intr-o directie fixa, o rotim
Cum arata conditia de sortare pentru asa ceva? Cum evitam problemele?
3. (aria unui poligon)
Problema:
https://codeforces.com/group/XKti6Uyw1n/contest/348306/problem/F
Infasuratoare Convexa: (convex hull)
Dandu-se un set de N puncte in plan, sa se determine poligonul convex de arie
minima care are in interiorul lui sau pe margini toate punctele date. Poligonul
astfel obtinut se numeste infasuratoarea convexa a celor N puncte.
Scanare Graham:
La pasul i, cand examinam al i−lea punct, este posibil ca adaugarea acestuia sa formeze o
concavitate cu punctul din varful stivei. Prin urmare vom scoate din varful stivei puncte
pana cand punctul nou adaugat nu va mai forma nicio concavitate. In final punctele
ramasein stiva formeaza un poligon convex.
Complexitatea algoritmului este O(n · logn) datorita sortarii. Procesarea punctelor in sine
are complexitate O(n), deoarece fiecare punct este adaugat ın stiva exact o data siextras din
stiva cel mult o data.
https://en.wikipedia.org/wiki/File:GrahamScanDemo.gif animatie
Baleiere :
https://codingcompetitions.withgoogle.com/kickstart/round/00000000004362d6/0000000
0008b3a1c usoara
https://www.pbinfo.ro/probleme/930/intersectiesegmente medie
https://www.pbinfo.ro/probleme/3772/jocculasere intersectii segmente ++
https://codeforces.com/contest/1569/problem/D grea
https://codeforces.com/group/XKti6Uyw1n/contest/348306/problem/F ( cred ca trebuie sa
intrati intai aici https://codeforces.com/group/XKti6Uyw1n/contests ca sa dati submit)
Convex Hull:
https://www.infoarena.ro/problema/infasuratoare -- problema clasica
https://infoarena.ro/problema/mosia -- ceva mai greu
4. Articol foarte bun:
https://www.topcoder.com/thrive/articles/Line%20Sweep%20Algorithms
O alta tehnica utila: https://codeforces.com/blog/entry/63823
Tot in spiritul geometriei, fara a se lega neaparat de vreo tehnica prezentata anterior:
Nu neaparat ceva de olimpiada dar un exercitiu de geometrie
https://catcoder.codingcontest.org/training/501/play --> beat and AI at pong, daca aveti
nevoie de ajutor sa rulati simulatorul puteti sa imi dati mesaj