geometria.h

00001 
00002 /*****************************************************************************/
00003 /*                                                                           */
00004 /*  Fichero:     geometria.h                                                 */
00005 /*  Autor:       Javier C. Osuna Sanz                                        */
00006 /*  Creado:      17/10/2002                                                  */
00007 /*  Modificado:  11/07/2003                                                  */
00008 /*                                                                           */
00009 /*****************************************************************************/
00010 
00011 #ifndef geometria_h
00012 #define geometria_h
00013 
00014 #include <math.h>
00015 #include "nd.h"
00016 
00017 /* ------------------------------------------------------------------------- */
00018 /* Declaración de constantes y macros.                                       */
00019 /* ------------------------------------------------------------------------- */
00020 
00021 // Declaración de la constante PI.
00022 
00023 #ifdef PI
00024 #undef PI
00025 #endif
00026 
00027 #define PI 3.1415926535F
00028 #ifndef M_PI
00029 #define M_PI PI
00030 #endif
00031 
00032 // Declaración de operaciones básicas.
00033 
00034 #define CUADRADO(x) (float)((x)*(x))
00035 #define RAIZ(x) (float)sqrt(x)
00036 
00037 #define ARCOTANGENTE(x,y) (float)atan2(y,x)
00038 #define ARCOCOSENO(x,r) (float)acos((x)/(r))
00039 #define ARCOSENO(y,r) (float)asin((y)/(r))
00040 
00041 #define MINIMO(a,b) ( (a)<=(b) ? (a) : (b) )
00042 #define MAXIMO(a,b) ( (a)>=(b) ? (a) : (b) )
00043 
00044 /* ------------------------------------------------------------------------- */
00045 /* Cotas.                                                                    */
00046 /* ------------------------------------------------------------------------- */
00047 
00048 extern void AplicarCotas(float *n,float i,float s);
00049 
00050 /* ------------------------------------------------------------------------- */
00051 /* Declaración de tipos y macros relacionadas.                               */
00052 /* ------------------------------------------------------------------------- */
00053 
00054 // Coordenadas cartesianas. Espacio real (y pantalla).
00055 
00056 #define DISTANCIA_CUADRADO2(p,q) (((p).x-(q).x)*((p).x-(q).x)+((p).y-(q).y)*((p).y-(q).y))
00057 
00058 // Coordenadas polares. Espacio real.
00059 
00060 typedef struct {
00061   float r; // Radio.
00062   float a; // Ángulo.
00063 } TCoordenadasPolares;
00064 
00065 /* ------------------------------------------------------------------------- */
00066 /* Construcción de coordenadas.                                              */
00067 /* ------------------------------------------------------------------------- */
00068 
00069 extern void ConstruirCoordenadasCP(TCoordenadas *p,TCoordenadasPolares q);
00070 extern void ConstruirCoordenadasCxy(TCoordenadas *p,float x,float y);
00071 extern void ConstruirCoordenadasCra(TCoordenadas *p,float r,float a);
00072 
00073 extern void ConstruirCoordenadasPC(TCoordenadasPolares *p,TCoordenadas q);
00074 extern void ConstruirCoordenadasPxy(TCoordenadasPolares *p,float x,float y);
00075 extern void ConstruirCoordenadasPra(TCoordenadasPolares *p,float r,float a);
00076 
00077 // Paso de cartesianas a polares, pero con el módulo al cuadrado.
00078 extern void ConstruirCoordenadasPcC(TCoordenadasPolares *p,TCoordenadas q);
00079 
00080 /* ------------------------------------------------------------------------- */
00081 /* Suma y resta de coordenadas.                                              */
00082 /* ------------------------------------------------------------------------- */
00083 
00084 extern void SumarCoordenadasCxy(TCoordenadas *p,float x,float y);
00085 extern void SumarCoordenadasCxyC(TCoordenadas p,float x,float y,TCoordenadas *q);
00086 extern void SumarCoordenadasCra(TCoordenadas *p,float r,float a);
00087 extern void SumarCoordenadasCraC(TCoordenadas p,float r,float a,TCoordenadas *q);
00088 
00089 /* ------------------------------------------------------------------------- */
00090 /* Transformaciones entre sistemas de coordenadas.                           */
00091 /* ------------------------------------------------------------------------- */
00092 
00093 // Transformaciones directas.
00094 
00095 extern void TransformacionDirecta(TSR *SR,TCoordenadas *p);
00096 
00097 #define TRANSFORMACION01(SR1,p) TransformacionDirecta(SR1,p);
00098 #define TRANSFORMACION12(SR2,p) TransformacionDirecta(SR2,p);
00099 #define TRANSFORMACION23(SR3,p) TransformacionDirecta(SR3,p);
00100 
00101 #define TRANSFORMACION02(SR1,SR2,p) \
00102     { \
00103       TRANSFORMACION01(SR1,p) \
00104       TRANSFORMACION12(SR2,p) \
00105     }
00106 
00107 // Transformaciones inversas.
00108 
00109 extern void TransformacionInversa(TSR *SR,TCoordenadas *p);
00110 
00111 #define TRANSFORMACION32(SR3,p) TransformacionInversa(SR3,p);
00112 #define TRANSFORMACION21(SR2,p) TransformacionInversa(SR2,p);
00113 #define TRANSFORMACION10(SR1,p) TransformacionInversa(SR1,p);
00114 
00115 #define TRANSFORMACION20(SR2,SR1,p) \
00116     { \
00117       TRANSFORMACION21(SR2,p) \
00118       TRANSFORMACION10(SR1,p) \
00119     }
00120 
00121 // Transformaciones mixtas.
00122 
00123 #define TRANSFORMACION101(SR1a,SR1b,p) \
00124     { \
00125       TRANSFORMACION10(SR1a,p) \
00126       TRANSFORMACION01(SR1b,p) \
00127     }
00128 
00129 /* ------------------------------------------------------------------------- */
00130 /* Ángulos e intervalos de ángulos.                                          */
00131 /* ------------------------------------------------------------------------- */
00132 
00133 extern float AnguloNormalizado(float angulo);
00134 
00135 extern int AnguloPerteneceIntervaloOrientadoCerrado(float angulo,float limite1,float limite2);
00136   // Esta función devuelve 1 si el ángulo está entre los límites; 0 en caso contrario.
00137   // Todos los parámetros deben pertenecer al intervalo (-PI,PI].
00138 
00139 extern float BisectrizAnguloOrientado(float limite1,float limite2);
00140   // Devuelve la bisectriz del ángulo de "limite1" a "limite2" en sentido contrario a las agujas del reloj.
00141 
00142 extern float BisectrizAnguloNoOrientado(float limite1,float limite2);
00143   // Devuelve la bisectriz del menor ángulo formado por "limite1" y "limite2", ya sea en el sentido de las agujas del reloj o en el opuesto.
00144 
00145 extern float AmplitudAnguloOrientado(float limite1,float limite2);
00146   // Devuelve la amplitud del ángulo de "limite1" a "limite2" en sentido contrario a las agujas del reloj.
00147 
00148 extern float AmplitudAnguloNoOrientado(float limite1,float limite2);
00149   // Devuelve la amplitud del menor ángulo formado por "limite1" y "limite2", ya sea en el sentido de las agujas del reloj o en el opuesto.
00150 
00151 /* ------------------------------------------------------------------------- */
00152 /* Cortes entre dos segmentos, uno de los cuales tiene como uno de sus       */
00153 /* extremos el origen.                                                       */
00154 /* ------------------------------------------------------------------------- */
00155 
00156 void MinimaDistanciaCuadradoCorte(TCoordenadasPolares pp1,TCoordenadasPolares pp2,float angulo,float *distancia);
00157   // Mediante su aplicación reiterada obtenemos el más próximo de entre los puntos de corte de un
00158   // grupo de segmentos con una dirección determinada.
00159   // "p1" y "p2" son los extremos de un segmento.
00160   // "angulo" es la dirección de corte (desde el origen).
00161   // "distancia" es la menor distancia obtenida hasta el momento.
00162 
00163 #endif //geometria_h

Last updated 12 September 2005 21:38:45