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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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
63extern 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
75typedef struct {
76 float r; // Radio.
77 float a; // �ngulo.
79
80/* ------------------------------------------------------------------------- */
81/* Construcci�n de coordenadas. */
82/* ------------------------------------------------------------------------- */
83
84extern void ConstruirCoordenadasCP(TCoordenadas *p,TCoordenadasPolares q);
85extern void ConstruirCoordenadasCxy(TCoordenadas *p,float x,float y);
86extern void ConstruirCoordenadasCra(TCoordenadas *p,float r,float a);
87
88extern void ConstruirCoordenadasPC(TCoordenadasPolares *p,TCoordenadas q);
89extern void ConstruirCoordenadasPxy(TCoordenadasPolares *p,float x,float y);
90extern void ConstruirCoordenadasPra(TCoordenadasPolares *p,float r,float a);
91
92// Paso de cartesianas a polares, pero con el m�dulo al cuadrado.
93extern void ConstruirCoordenadasPcC(TCoordenadasPolares *p,TCoordenadas q);
94
95/* ------------------------------------------------------------------------- */
96/* Suma y resta de coordenadas. */
97/* ------------------------------------------------------------------------- */
98
99extern void SumarCoordenadasCxy(TCoordenadas *p,float x,float y);
100extern void SumarCoordenadasCxyC(TCoordenadas p,float x,float y,TCoordenadas *q);
101extern void SumarCoordenadasCra(TCoordenadas *p,float r,float a);
102extern void SumarCoordenadasCraC(TCoordenadas p,float r,float a,TCoordenadas *q);
103
104/* ------------------------------------------------------------------------- */
105/* Transformaciones entre sistemas de coordenadas. */
106/* ------------------------------------------------------------------------- */
107
108// Transformaciones directas.
109
110extern 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
124extern 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
148extern float AnguloNormalizado(float angulo);
149
150extern 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
154extern 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
157extern 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
160extern 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
163extern 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
171void 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