Aprende Geometría Computacional en UJAEN







 





















clase segmento:
class segmento { punto s,i; //s=superior; i=inferior public: segmento (): s(), i() {}; segmento (const punto& a, const punto& b); segmento (const vertice &v1, const vertice &v2); segmento (double p1a, double p2a, double p1b, double p2b); punto intersecta (const segmento &se) const; punto leer_sup () const {return s;} punto leer_inf () const {return i;} bool es_horizontal () const {return ValorAbs(s.y-i.y)<=CERO;} bool es_vertical () const {return ValorAbs(s.x-i.x)<=CERO;} bool punto_izquierda (const punto& pt) const { //pt está a la izquierda? return AreaTriangulo2 (s.x, s.y, i.x, i.y, pt.x, pt.y)>0; } ... };



clase polígono:
class poligono { protected: unsigned nvert; vertice *lis_vert; public: friend class vertice; poligono(): lis_vert (0),nvert(0) {} poligono(int n){ lis_vert = new vertice [nvert=n]; if (!lis_vert) throw 1; } poligono (const poligono &p); poligono& operator= (const poligono& p); void reserva (int tamanio){ if (lis_vert) delete lis_vert; lis_vert = new vertice [nvert=tamanio]; if (!lis_vert) throw ERROR_1; } int anadir (const punto& p, unsigned posi) { if (posi >= nvert) throw 2; vertice v (p,posi,this); lis_vert[posi] = v; return 1; } vertice& operator[] (unsigned posi) { if (posi >= nvert) throw ERROR_2; return (lis_vert[posi]); } ~poligono() { if (lis_vert) delete lis_vert;} ..... };


clase vértice:
class vertice { punto v; int pos; poligono *poli; public: friend class poligono; vertice(): poli (0) {} vertice (const punto &a, int posi, poligono *p):v(a),pos(posi),poli(p){} vertice (const vertice& vert) {v=vert.v; pos=vert.pos; poli=vert.poli;} vertice& operator= (const vertice& vert){ v=vert.v; pos=vert.pos; poli=vert.poli; return *this; } int lee_indice () {return pos;} punto lee_punto () const {return v;} vertice predecesor (); vertice siguiente (); /*...*/ }




Intersección impropia de segmentos:
FUNCION IntersectaSegmento (a,b,c,d:TipoPunto):Boolean BEGIN if (Colineal(a,b,c) OR Colineal(a,b,d) OR Colineal(c,d,a) OR Colineal(c,d,b)) then return (false) else return ((Izquierda(a,b,c) XOR Izquierda(a,b,d)) AND (Izquierda(c,d,a) XOR Izquierda(c,d,b)) END
Intersección propia de segmentos:
FUNCION IntersecImpropia (a,b,c,d:TipoPunto):Boolean begin if (Entre(a,b,c) OR Entre(a,b,d) OR Entre(c,d,a) OR Entre(c,d,b)) then return true else return ((Izquierda(a,b,c) XOR Izquierda(a,b,d)) AND (Izquierda(c,d,a) XOR Izquierda(c,d,b))) END FUNCION Entre (a,b,c:TipoPunto):Boolean BEGIN if (Not Colineal(a,b,c)) then return (false) else if a[0] <> b[0] then return (a[0]<=b[0] AND c[0]<=b[0] OR a[0]>=c[0] AND c[0]>=b[0]) else return (a[1]<=c[1] AND c[1]<=b[1] OR a[1]>=c[1] AND c[1]>=b[1]) END;





Cálculo de la menor tangente común a dos polígonos:
Funcion MenorTangente (A,B:Poligono;n,m,a,b:Integer) BEGIN a <- MasDecha (A, n) b <- MasIzda (B, m) REPETIR aa <- a bb <- b MIENTRAS NO (Tangente (A,n,a,b)) a <- (a-1+n) % n FIN_MIENTRAS MIENTRAS NO (Tangente (B,m,a,b)) b <- (b+1) % n FIN_MIENTRAS HASTA (aa=a AND bb=b) END