geometria.h
1 
2 /*****************************************************************************/
3 /* */
4 /* Fichero: geometria.h */
5 /* Autor: Javier C. Osuna Sanz */
6 /* Creado: 17/10/2002 */
7 /* Modificado: 11/07/2003 */
8 /* */
9 /*****************************************************************************/
10 /*
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24  *
25  */
26 #ifndef geometria_h
27 #define geometria_h
28 
29 #include <math.h>
30 #include "nd.h"
31 
32 /* ------------------------------------------------------------------------- */
33 /* Declaraci�n de constantes y macros. */
34 /* ------------------------------------------------------------------------- */
35 
36 // Declaraci�n de la constante PI.
37 
38 #ifdef PI
39 #undef PI
40 #endif
41 
42 #define PI 3.1415926535F
43 #ifndef M_PI
44 #define M_PI PI
45 #endif
46 
47 // Declaraci�n de operaciones b�sicas.
48 
49 #define CUADRADO(x) (float)((x)*(x))
50 #define RAIZ(x) (float)sqrt(x)
51 
52 #define ARCOTANGENTE(x,y) (float)atan2(y,x)
53 #define ARCOCOSENO(x,r) (float)acos((x)/(r))
54 #define ARCOSENO(y,r) (float)asin((y)/(r))
55 
56 #define MINIMO(a,b) ( (a)<=(b) ? (a) : (b) )
57 #define MAXIMO(a,b) ( (a)>=(b) ? (a) : (b) )
58 
59 /* ------------------------------------------------------------------------- */
60 /* Cotas. */
61 /* ------------------------------------------------------------------------- */
62 
63 extern void AplicarCotas(float *n,float i,float s);
64 
65 /* ------------------------------------------------------------------------- */
66 /* Declaraci�n de tipos y macros relacionadas. */
67 /* ------------------------------------------------------------------------- */
68 
69 // Coordenadas cartesianas. Espacio real (y pantalla).
70 
71 #define DISTANCIA_CUADRADO2(p,q) (((p).x-(q).x)*((p).x-(q).x)+((p).y-(q).y)*((p).y-(q).y))
72 
73 // Coordenadas polares. Espacio real.
74 
75 typedef struct {
76  float r; // Radio.
77  float a; // �ngulo.
79 
80 /* ------------------------------------------------------------------------- */
81 /* Construcci�n de coordenadas. */
82 /* ------------------------------------------------------------------------- */
83 
84 extern void ConstruirCoordenadasCP(TCoordenadas *p,TCoordenadasPolares q);
85 extern void ConstruirCoordenadasCxy(TCoordenadas *p,float x,float y);
86 extern void ConstruirCoordenadasCra(TCoordenadas *p,float r,float a);
87 
88 extern void ConstruirCoordenadasPC(TCoordenadasPolares *p,TCoordenadas q);
89 extern void ConstruirCoordenadasPxy(TCoordenadasPolares *p,float x,float y);
90 extern void ConstruirCoordenadasPra(TCoordenadasPolares *p,float r,float a);
91 
92 // Paso de cartesianas a polares, pero con el m�dulo al cuadrado.
93 extern void ConstruirCoordenadasPcC(TCoordenadasPolares *p,TCoordenadas q);
94 
95 /* ------------------------------------------------------------------------- */
96 /* Suma y resta de coordenadas. */
97 /* ------------------------------------------------------------------------- */
98 
99 extern void SumarCoordenadasCxy(TCoordenadas *p,float x,float y);
100 extern void SumarCoordenadasCxyC(TCoordenadas p,float x,float y,TCoordenadas *q);
101 extern void SumarCoordenadasCra(TCoordenadas *p,float r,float a);
102 extern void SumarCoordenadasCraC(TCoordenadas p,float r,float a,TCoordenadas *q);
103 
104 /* ------------------------------------------------------------------------- */
105 /* Transformaciones entre sistemas de coordenadas. */
106 /* ------------------------------------------------------------------------- */
107 
108 // Transformaciones directas.
109 
110 extern void TransformacionDirecta(TSR *SR,TCoordenadas *p);
111 
112 #define TRANSFORMACION01(SR1,p) TransformacionDirecta(SR1,p);
113 #define TRANSFORMACION12(SR2,p) TransformacionDirecta(SR2,p);
114 #define TRANSFORMACION23(SR3,p) TransformacionDirecta(SR3,p);
115 
116 #define TRANSFORMACION02(SR1,SR2,p) \
117  { \
118  TRANSFORMACION01(SR1,p) \
119  TRANSFORMACION12(SR2,p) \
120  }
121 
122 // Transformaciones inversas.
123 
124 extern void TransformacionInversa(TSR *SR,TCoordenadas *p);
125 
126 #define TRANSFORMACION32(SR3,p) TransformacionInversa(SR3,p);
127 #define TRANSFORMACION21(SR2,p) TransformacionInversa(SR2,p);
128 #define TRANSFORMACION10(SR1,p) TransformacionInversa(SR1,p);
129 
130 #define TRANSFORMACION20(SR2,SR1,p) \
131  { \
132  TRANSFORMACION21(SR2,p) \
133  TRANSFORMACION10(SR1,p) \
134  }
135 
136 // Transformaciones mixtas.
137 
138 #define TRANSFORMACION101(SR1a,SR1b,p) \
139  { \
140  TRANSFORMACION10(SR1a,p) \
141  TRANSFORMACION01(SR1b,p) \
142  }
143 
144 /* ------------------------------------------------------------------------- */
145 /* �ngulos e intervalos de �ngulos. */
146 /* ------------------------------------------------------------------------- */
147 
148 extern float AnguloNormalizado(float angulo);
149 
150 extern int AnguloPerteneceIntervaloOrientadoCerrado(float angulo,float limite1,float limite2);
151  // Esta funci�n devuelve 1 si el �ngulo est� entre los l�mites; 0 en caso contrario.
152  // Todos los par�metros deben pertenecer al intervalo (-PI,PI].
153 
154 extern float BisectrizAnguloOrientado(float limite1,float limite2);
155  // Devuelve la bisectriz del �ngulo de "limite1" a "limite2" en sentido contrario a las agujas del reloj.
156 
157 extern float BisectrizAnguloNoOrientado(float limite1,float limite2);
158  // 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.
159 
160 extern float AmplitudAnguloOrientado(float limite1,float limite2);
161  // Devuelve la amplitud del �ngulo de "limite1" a "limite2" en sentido contrario a las agujas del reloj.
162 
163 extern float AmplitudAnguloNoOrientado(float limite1,float limite2);
164  // 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.
165 
166 /* ------------------------------------------------------------------------- */
167 /* Cortes entre dos segmentos, uno de los cuales tiene como uno de sus */
168 /* extremos el origen. */
169 /* ------------------------------------------------------------------------- */
170 
171 void MinimaDistanciaCuadradoCorte(TCoordenadasPolares pp1,TCoordenadasPolares pp2,float angulo,float *distancia);
172  // Mediante su aplicaci�n reiterada obtenemos el m�s pr�ximo de entre los puntos de corte de un
173  // grupo de segmentos con una direcci�n determinada.
174  // "p1" y "p2" son los extremos de un segmento.
175  // "angulo" es la direcci�n de corte (desde el origen).
176  // "distancia" es la menor distancia obtenida hasta el momento.
177 
178 #endif //geometria_h
Definition: geometria.h:75
Definition: nd.h:55
Definition: nd.h:62

Last updated 12 September 2005 21:38:45