geometría computacional - unsamwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha)...

106
Geometría Computacional

Upload: others

Post on 27-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Geometría Computacional

Page 2: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Geometría: ¿por qué?

●●●●●

Page 3: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Geometría

●●●●

Page 4: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

EntidadesGeométricas

Page 5: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Vector(& punto)

ga eg a r r ve r

Page 6: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Vector

u

v w

Page 7: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Punto

uw

Q(4;3)

P(-3;1) v

Page 8: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Longitud de un vector

u |u| = √ 4² + 3² = 5

¡us en es núme te !

Page 9: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Suma y resta de vectores

u v

w = u+v0

Page 10: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Multiplicación de un vector por un número

u-2u 0v

Page 11: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Producto escalar

⇒ ∡

v

uu*v = 5*3 + (-1)*2 = 13

Page 12: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Perpendicularidad de vectores

⇔ ⊥

v

uu*v = 0

Page 13: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Rotación 90º antihoraria

uu*v = 0

v

Page 14: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Proyección de un vector sobre otro

u

w = proy(v,u)

v

w

¡Las y i n ar re t e co n es ra !

Page 15: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Contraproyección de un vector sobre otro

u

w = contra(v,u)

v

w

¡Las t ro c o r a z ul en p e t te !

Page 16: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Producto vectorial (o cruzado)

⇒ ∡

v

u u^v = 4*2 - (-1)*3 = 11

Page 17: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Paralelismo de vectores

vu^v = 0

u

Page 18: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Giro entre vectores

u

u^v > 0

v

u

v

u^v < 0

Page 19: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Área signada de un paralelogramo

u

v

14 -13

uv

Page 20: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

●●●●

●●

Ángulo signado entre vectores

Page 21: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Ángulo signado entre vectores

u

v

-0.86∡uv = atan2(a^b, a*b)

Page 22: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Implementación

struct punto{ ll x, y;};

punto operator+(punto a, punto b){ return {a.x + b.x, a.y + b.y};}punto operator*(ll k, punto a){ return {k*a.x, k*a.y};};

Suma

Multiplicación por un número

¡Usa l lo p e t o r w!typedef long long ll;

Page 23: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Implementación

ll operator*(punto a, punto b){ return a.x*b.x + a.y*b.y;}ll operator^(punto a, punto b){ return a.x*b.y - a.y*b.x;}ll norma2(punto a){ return a*a;}

Producto escalar

Producto vectorial

Longitud al cuadrado(así siempre es un entero)

Page 24: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Implementación

double angulo(punto a, punto b){ return atan2(a^b, a*b);}double norma(punto a){ return hypot(a.x, a.y);}

Ángulo en radianes

Longitud

Page 25: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Recta(& Segmento)

Page 26: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Recta

pd

R

Page 27: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Recta

p

R

q

Page 28: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Segmento

p

S

q

Page 29: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Entidades más complejas

Page 30: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Polígono

typedef vector<punto> poligono;

Page 31: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Convexidad

no-convexo convexo

Page 32: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Simplicidad

simple complejo

Page 33: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Círculo

struct circulo{punto o; int r;

};

Page 34: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmos

Page 35: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Área & perímetrode un polígono

Page 36: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Área

Page 37: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Área

Page 38: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Área

Page 39: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Área

Page 40: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Área

Page 41: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Área

Page 42: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Área

ll doble_area(poligono &p){ ll a = 0; forn(i, p.size()){ a += p[i]^p[(i+1)%p.size()]; return a > 0 ? a : -a;}

Page 43: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Perímetro

Page 44: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Perímetro

double perimetro(poligono &p){ double l = 0; forn(i, p.size()){ l += norma(p[i] - p[(i+1)%p.size()]); return l;}

Page 45: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Distancias

Page 46: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Distancia punto a recta

pu

q

contr(pq,u)

Page 47: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Distancia punto a segmento

p

q

r

Page 48: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Distancia entre segmentos o rectas

p

qr

s

Page 49: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Intersección de rectas

Page 50: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Intersección

p

u vq

i

Page 51: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Intersección

λ ϕi = p + λu = q + ϕv

λ(p + λu)^v = (q + ϕv)^v

p^v + (λu)^v = q^v + (ϕv)^v λ(u^v) = (q-p)^v

λ = (q-p)^v / (u^v) ϕ

ϕ = (q-p)^u / (u^v)

ϕv es le v, en cϕv ^ v = 0

en / en

no p a l a íqu u ^ v ≠ 0

Page 52: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Intersección de segmentos

λ ϕ

p

rs

q

i

Page 53: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión

Page 54: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión ángulo convexo

p

ab

c

Page 55: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión triángulo

p

ab

c

Page 56: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión polígono estrictamente convexo

p

Page 57: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión polígono estrictamente convexo

p

Page 58: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión polígono estrictamente convexo

p

Page 59: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión polígono estrictamente convexo

p

Page 60: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión polígono estrictamente convexo

p

Page 61: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión polígono no convexo

p

Page 62: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión polígono no convexo

p

Page 63: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Animación

p

Page 64: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Animación

p

Page 65: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Animación

p

Page 66: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Animación

p

Page 67: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Animación

p

Page 68: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Animación

p

Page 69: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Animación

p

Page 70: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Animación

p

Page 71: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Inclusión polígono no convexo

bool pertenece(poligono &P, punto p){ double a = 0; forn(i, P.size()){ a += angulo(P[i], p, P[(i+1)%P.size()]); return abs(abs(l) - 2*acos(-1)) < 0.0001 ;}

¡el un ép i n ac !

π

Page 72: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Sweep Line

Page 73: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Sweep Line

Page 74: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

CHULL(cápsula convexa)

Page 75: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

CHULL

Page 76: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

CHULL

Page 77: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

Page 78: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

or

Page 79: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 80: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 81: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 82: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 83: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 84: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 85: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 86: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 87: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 88: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 89: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 90: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 91: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham

p0

p1

p2

p3

p4p5p6

p7

p8

Page 92: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Algoritmo de Graham poligono GS(vector<point> p){

intercambiar p[0] con un punto extremoordenar p[1..N-1] polarmente (por ángulo)poligono chull = vacioforn(i, N)

int m = chull.size()while(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha)

chull.pop_back() // borro el penultimo consideradom--

chull.push_back(p[i]) // agrego el ultimo return chull

}

Complejidad O(N) + sort = O(N log N)

Page 93: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

PPMA(par de puntos más alejado)

Page 94: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Par de puntos más alejado

Page 95: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Par de puntos más alejado

Page 96: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Cuidado

Sea P[0..n-1] un polígono convexo

// hallar q (=P[j]) inicial (aquél correspondiente a p = P[0])j = 0for(i = 1 .. n-1)

if( norma(P[i]-P[0]) > norma(P[j]-P[0]) )j = i

// para cada p (=P[i]) hacerfor(i = 0 .. n-1)

while(j' = j+1 mod n; norma(P[j']-P[i]) ≥ norma(P[j]-P[i]); j'++ mod n)j = j'

considerar par i-j

Page 97: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Cuidado

fuente imagen: ToMmyDong, codeforces.com

el t A u c on ra co n i t a q, a p de n ar ás a do

p u C.

p

Page 98: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Solución

fuente imagen: ToMmyDong, codeforces.com

e

p

Page 99: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Par de puntos más alejadopar<punto, punto> PPMA(vector<point> nube){

chull = GS(nube) // calculamos la chullrespuesta = (chull[0], chull[1])n = chull.size(), j = 0for(i = 0 .. n-1)

while( chull[j+1] no se acerca a la recta chull[i]chull[i+1] )j++; // recordemos j++, j+1, y i+1 siempre en mod n

if( distancia(chull[i], chull[j]) > distancia(respuesta) )respuesta = (chull[i], chull[j])

if( distancia(chull[i+1], chull[j]) > distancia(respuesta) )respuesta = (chull[i+1], chull[j])

return respuesta}

Complejidad O(N) + chull = O(N log N)

Page 100: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

PPMC(par de puntos más cercano)

Page 101: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

PPMC

Page 102: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

PPMC

Page 103: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

●●

PPMC

dd

Page 104: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

PPMCpar<punto, punto> ppmc(vector<point> p){ respuesta = (p[0], p[1])

double d = distancia(respuesta) set<point> S = vacío (ordenado por coordenada y)

ordeno p[0..N-1] por xint a = 0for(int b = 0..N-1)

while( p[b].x - p[a].x > d )S.erase(p[a++])

for( q = S.lower_bound(p[b].y - d); q.y - p[b].y < d; sig(q))if( d > largo(q, p[b]) )

d = largo(q, p[b])respuesta = (q, p[b])

S.insert(p[b])return respuesta

}

Page 105: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Problemas

Page 106: Geometría Computacional - UNSAMwhile(m >= 2 and chull[m-2],chull[m-1],p[i] es giro a la derecha) chull.pop_back() // borro el penultimo considerado m--chull.push_back(p[i]) // agrego

Problemas●●

●●