Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Producto vectorial
Algoritmo de Graham
Superficie polgono
Cncavos y convexos
Teorema de Pick
Interseccin de segmentos
Producto vectorial
Producto vectorial de
u
= u x , u y
v = v x , v y
ux u y
u v =u xv y u yv x =det
=
uvsen =v u
vx vy
Producto vectorial
Producto vectorial de
u
= u x , u y
v = v x , v y
ux u y
u v =u xv y u yv x =det
=
uvsen =v u
vx vy
Convex hull
Cncavo o convexo?
A , B P AB P
Convex hull
Cncavo o convexo?
Convex hull
Es convexo
Convex hull
booleanisConvex(intn,int[]x,int[]y){
intpos=0,neg=0;
for(inti=0;i<n;i++){
intprev=(i+n1)%n,next=(i+1)%n;
intpc=(x[next]x[i])*(y[prev]y[i])
(x[prev]x[i])*(y[next]y[i]);
if(pc<0){
neg++;
}elseif(pc>0){
pos++;
}
}
return(neg==0)||(pos==0);
}
Convex hull
http://acm.uva.es/problemset/v100/10078.html
Convex hull
Convex hull
Convex hull
Convex hull
Convex hull
Convex hull
Para practicar
Superficie de polgono
Si es convexo
S = v1 v2 v2 v3 v3 v4 v4 v5 2
Superficie de polgono
Y si es cncavo?
Superficie de polgono
Y si es cncavo?
Superficie de polgono
Es lo mismo!
Superficie de polgono
Teorema de Pick
S=I+B21
I=SB2+1
(Se puede probar por induccin
en la superficie)
Superficie de polgono
Algoritmo O(n)
intborder(intn,int[]x,int[]y){
intb=0;
for(inti=0;i<n;i++){
intj=(i+1)%n;
b+=gcd(x[i]x[j],y[i]y[j]);
}
returnb;
}
Superficie de polgono
Para practicar
Point in Poly
Salida: Si o no
Complejidad: O(n)
Point in Poly
Point in Poly
Point in Poly
As se deben considerar
Point in Poly
Point in Poly
Point in Poly
T:int/double
boolpnpoly(intn,T[]xs,T[]ys,Tpx,Tpy){
inti,c=0;
for(inti=0;i<n;i++){
intinf=i,sup=(i+n1)%n;
if(ys[inf]>ys[sup])swap(inf,sup);
if(ys[inf]<=py&&py<ys[sup]){
if((pxxs[inf])*(ys[sup]ys[inf])>
(pyys[inf])*(xs[sup]xs[inf])){
c++;
}
}
}
return(c%2)==1;
}
d = min(di, dd)
Se calculan techo y
piso (en rojo)
Un punto a la
misma altura parte
la bsqueda en dos
Si no hay puntos
entonces el mejor
rectngulo es todo
el borde
En total es O(n)
Para practicar
En todos los casos se chequan por nuevas intersecciones entre nuevos vecinos en la lista
y se agregan a la cola de eventos si no estn presentes
Para practicar
Unin de intervalos
Dada una lista de intervalos de la recta real [a,b]
Calcular el tamao de su unin
Se recorren los extremos de los intervalos de izquierda a
derecha calculando la cantidad de intervalos abiertos
intlength(intn,double[]a,double[]b){
vector<pair<double,int>>v;
for(inti=0;i<n;i++){
v.push_back(make_pair(a[i],1));
v.push_back(make_pair(b[i],1));
}
sort(v);
doubleresult=0.0;intopen=0;
for(inti=0;i<v.size();i++){
if(open>0)result+=v[i].firstv[i1].first;
open+=v[i].second;
}
returnresult;
}
Fin!
;-)