| 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
 
 
 
 
 
 
 
 
 
 
 
 
 
