1 {** Se implementan varios filtro en diferentes direcciones.<br>
\r
4 09/12/00: Se agrega la clase cFiltroMapa.
\r
19 {** Implementa un filtro que "ve" hacia adelante.}
\r
20 cFiltroFrontal = class( cFiltro )
\r
22 {** Verifica que un objeto volador pueda ser visto por la cámara}
\r
23 function mVisible( ov: cObjetoVolador ): boolean; override;
\r
26 {** Implementa un filtro que "ve" hacia la izquierda.}
\r
27 cFiltroLatIzq = class( cFiltro )
\r
29 {** Verifica que un objeto volador pueda ser visto por la cámara}
\r
30 function mVisible( ov: cObjetoVolador ): boolean; override;
\r
33 {** Implementa un filtro que "ve" hacia la derecha.}
\r
34 cFiltroLatDer = class( cFiltro )
\r
36 {** Verifica que un objeto volador pueda ser visto por la cámara}
\r
37 function mVisible( ov: cObjetoVolador ): boolean; override;
\r
40 {** Implementa un filtro que "ve" hacia atrás.}
\r
41 cFiltroTrasero = class( cFiltro )
\r
43 {** Verifica que un objeto volador pueda ser visto por la cámara}
\r
44 function mVisible( ov: cObjetoVolador ): boolean; override;
\r
47 {** Implementa un filtro que "ve" hacia arriba.}
\r
48 cFiltroArriba = class( cFiltro )
\r
50 {** Verifica que un objeto volador pueda ser visto por la cámara}
\r
51 function mVisible( ov: cObjetoVolador ): boolean; override;
\r
54 {** Implementa un filtro que "ve" hacia abajo.}
\r
55 cFiltroAbajo = class( cFiltro )
\r
57 {** Verifica que un objeto volador pueda ser visto por la cámara}
\r
58 function mVisible( ov: cObjetoVolador ): boolean; override;
\r
61 {** Implementa un filtro que "ve" hacia abajo pero desde arriba a una cierta distancia
\r
62 del observador. Es como si observara al observador mismo.}
\r
63 cFiltroMapa = class( cFiltro )
\r
65 {** Verifica que un objeto volador pueda ser visto por la cámara}
\r
66 function mVisible( ov: cObjetoVolador ): boolean; override;
\r
69 {** Implementa un filtro que "ve" hacia adelante y que además sólo puede
\r
70 ver objetos del tipo cNave y cMeteorito.}
\r
71 cFiltroLock = class( cFiltroFrontal )
\r
73 {** Verifica que un objeto volador pueda ser visto por la cámara}
\r
74 function mVisible( ov: cObjetoVolador ): boolean; override;
\r
85 {** Verifica que un objeto volador pueda ser visto por la cámara
\r
86 @param ov Objeto volador que se quiere verificar si es visto por la cámara.
\r
87 @return <i>True</i> si lo ve, <i>False</i> si no.}
\r
88 function cFiltroFrontal.mVisible(ov: cObjetoVolador): boolean;
\r
90 posRel, // vector posicion del objeto volador relativo a la camara
\r
91 posCam, // Posision del cameraman
\r
92 dirCam: cVector; // vector con la direccion en la que apunta la camara
\r
93 dist: tLongitud; // Distancia entre la camara y el objeto
\r
94 cosAlfa: tAngulo; // Coseno del angulo que forman la dir de la camara y la pos del objeto
\r
97 try // Probamos que el cameraman no este destruido
\r
98 dist := mGetObservador.mGetDistancia( ov );
\r
99 except // Si esta destruido cae en una excepcion
\r
100 on e: EAccessViolation do
\r
101 raise EObservadorDestruido.create; // Creamos una nueva excepcion especial
\r
103 if ( dist > mGetRadioMinimo ) and
\r
104 ( dist < mGetRadioMaximo ) then begin // Esta dentro de la distancia minima y maxima
\r
105 // posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam
\r
106 posRel := ov.mGetPosicion;
\r
107 posCam := mGetObservador.mGetPosicion;
\r
108 posRel.mRestar( posCam );
\r
109 dirCam := mGetObservador.mGetI;
\r
110 // Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| )
\r
111 cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo);
\r
112 // Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI
\r
113 if cosAlfa > mGetCosApertura then // Esta dentro del angulo de vision
\r
123 {** Verifica que un objeto volador pueda ser visto por la cámara
\r
124 @param ov Objeto volador que se quiere verificar si es visto por la cámara.
\r
125 @return <i>True</i> si lo ve, <i>False</i> si no.}
\r
126 function cFiltroLatIzq.mVisible(ov: cObjetoVolador): boolean;
\r
128 posRel, // vector posicion del objeto volador relativo a la camara
\r
129 posCam, // Posision del cameraman
\r
130 dirCam: cVector; // vector con la direccion en la que apunta la camara
\r
131 dist: tLongitud; // Distancia entre la camara y el objeto
\r
132 cosAlfa: tAngulo; // Coseno del angulo que forman la dir de la camara y la pos del objeto
\r
135 try // Probamos que el cameraman no este destruido
\r
136 dist := mGetObservador.mGetDistancia( ov );
\r
137 except // Si esta destruido cae en una excepcion
\r
138 on e: EAccessViolation do
\r
139 raise EObservadorDestruido.create; // Creamos una nueva excepcion especial
\r
141 if ( dist > mGetRadioMinimo ) and
\r
142 ( dist < mGetRadioMaximo ) then begin // Esta dentro de la distancia minima y maxima
\r
143 // posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam
\r
144 posRel := ov.mGetPosicion;
\r
145 posCam := mGetObservador.mGetPosicion;
\r
146 posRel.mRestar( posCam );
\r
147 dirCam := mGetObservador.mGetJ;
\r
148 // Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| )
\r
149 cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo);
\r
150 // Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI
\r
151 if cosAlfa > mGetCosApertura then // Esta dentro del angulo de vision
\r
161 function cFiltroLatDer.mVisible(ov: cObjetoVolador): boolean;
\r
163 posRel, // vector posicion del objeto volador relativo a la camara
\r
164 posCam, // Posision del cameraman
\r
165 dirCam: cVector; // vector con la direccion en la que apunta la camara
\r
166 dist: tLongitud; // Distancia entre la camara y el objeto
\r
167 cosAlfa: tAngulo; // Coseno del angulo que forman la dir de la camara y la pos del objeto
\r
170 try // Probamos que el cameraman no este destruido
\r
171 dist := mGetObservador.mGetDistancia( ov );
\r
172 except // Si esta destruido cae en una excepcion
\r
173 on e: EAccessViolation do
\r
174 raise EObservadorDestruido.create; // Creamos una nueva excepcion especial
\r
176 if ( dist > mGetRadioMinimo ) and
\r
177 ( dist < mGetRadioMaximo ) then begin // Esta dentro de la distancia minima y maxima
\r
178 // posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam
\r
179 posRel := ov.mGetPosicion;
\r
180 posCam := mGetObservador.mGetPosicion;
\r
181 posRel.mRestar( posCam );
\r
182 dirCam := mGetObservador.mGetJ.mMultiplicar(-1);
\r
183 // Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| )
\r
184 cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo);
\r
185 // Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI
\r
186 if cosAlfa > mGetCosApertura then // Esta dentro del angulo de vision
\r
196 function cFiltroTrasero.mVisible(ov: cObjetoVolador): boolean;
\r
198 posRel, // vector posicion del objeto volador relativo a la camara
\r
199 posCam, // Posision del cameraman
\r
200 dirCam: cVector; // vector con la direccion en la que apunta la camara
\r
201 dist: tLongitud; // Distancia entre la camara y el objeto
\r
202 cosAlfa: tAngulo; // Coseno del angulo que forman la dir de la camara y la pos del objeto
\r
205 try // Probamos que el cameraman no este destruido
\r
206 dist := mGetObservador.mGetDistancia( ov );
\r
207 except // Si esta destruido cae en una excepcion
\r
208 on e: EAccessViolation do
\r
209 raise EObservadorDestruido.create; // Creamos una nueva excepcion especial
\r
211 if ( dist > mGetRadioMinimo ) and
\r
212 ( dist < mGetRadioMaximo ) then begin // Esta dentro de la distancia minima y maxima
\r
213 // posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam
\r
214 posRel := ov.mGetPosicion;
\r
215 posCam := mGetObservador.mGetPosicion;
\r
216 posRel.mRestar( posCam );
\r
217 dirCam := mGetObservador.mGetI.mMultiplicar(-1);
\r
218 // Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| )
\r
219 cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo);
\r
220 // Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI
\r
221 if cosAlfa > mGetCosApertura then // Esta dentro del angulo de vision
\r
231 function cFiltroArriba.mVisible(ov: cObjetoVolador): boolean;
\r
233 posRel, // vector posicion del objeto volador relativo a la camara
\r
234 posCam, // Posision del cameraman
\r
235 dirCam: cVector; // vector con la direccion en la que apunta la camara
\r
236 dist: tLongitud; // Distancia entre la camara y el objeto
\r
237 cosAlfa: tAngulo; // Coseno del angulo que forman la dir de la camara y la pos del objeto
\r
240 try // Probamos que el cameraman no este destruido
\r
241 dist := mGetObservador.mGetDistancia( ov );
\r
242 except // Si esta destruido cae en una excepcion
\r
243 on e: EAccessViolation do
\r
244 raise EObservadorDestruido.create; // Creamos una nueva excepcion especial
\r
246 if ( dist > mGetRadioMinimo ) and
\r
247 ( dist < mGetRadioMaximo ) then begin // Esta dentro de la distancia minima y maxima
\r
248 // posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam
\r
249 posRel := ov.mGetPosicion;
\r
250 posCam := mGetObservador.mGetPosicion;
\r
251 posRel.mRestar( posCam );
\r
252 dirCam := mGetObservador.mGetK;
\r
253 // Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| )
\r
254 cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo);
\r
255 // Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI
\r
256 if cosAlfa > mGetCosApertura then // Esta dentro del angulo de vision
\r
266 function cFiltroAbajo.mVisible(ov: cObjetoVolador): boolean;
\r
268 posRel, // vector posicion del objeto volador relativo a la camara
\r
269 posCam, // Posision del cameraman
\r
270 dirCam: cVector; // vector con la direccion en la que apunta la camara
\r
271 dist: tLongitud; // Distancia entre la camara y el objeto
\r
272 cosAlfa: tAngulo; // Coseno del angulo que forman la dir de la camara y la pos del objeto
\r
275 try // Probamos que el cameraman no este destruido
\r
276 dist := mGetObservador.mGetDistancia( ov );
\r
277 except // Si esta destruido cae en una excepcion
\r
278 on e: EAccessViolation do
\r
279 raise EObservadorDestruido.create; // Creamos una nueva excepcion especial
\r
281 if ( dist > mGetRadioMinimo ) and
\r
282 ( dist < mGetRadioMaximo ) then begin // Esta dentro de la distancia minima y maxima
\r
283 // posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam
\r
284 posRel := ov.mGetPosicion;
\r
285 posCam := mGetObservador.mGetPosicion;
\r
286 posRel.mRestar( posCam );
\r
287 dirCam := mGetObservador.mGetK.mMultiplicar(-1);
\r
288 // Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| )
\r
289 cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo);
\r
290 // Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI
\r
291 if cosAlfa > mGetCosApertura then // Esta dentro del angulo de vision
\r
301 function cFiltroMapa.mVisible(ov: cObjetoVolador): boolean;
\r
303 desplazamiento, // desplazamiento del filtro respecto del observador
\r
304 posTmp, // Vector posicion temporal
\r
305 posRel, // vector posicion del objeto volador relativo a la camara
\r
306 posCam, // Posision del cameraman
\r
307 dirCam: cVector; // vector con la direccion en la que apunta la camara
\r
308 dist: tLongitud; // Distancia entre la camara y el objeto
\r
309 cosAlfa: tAngulo; // Coseno del angulo que forman la dir de la camara y la pos del objeto
\r
312 try // Probamos que el cameraman no este destruido
\r
313 desplazamiento := mGetObservador.mGetk.mSetModulo( 3000 ); // Esta 3000 metros alejado del observador
\r
314 except // Si esta destruido cae en una excepcion
\r
315 on e: EAccessViolation do
\r
316 raise EObservadorDestruido.create; // Creamos una nueva excepcion especial
\r
318 posCam := mGetObservador.mGetPosicion.mSumar( desplazamiento );
\r
319 desplazamiento.free;
\r
320 posTmp := ov.mGetPosicion;
\r
321 dist := posCam.mGetDistancia( posTmp );
\r
323 if ( dist > mGetRadioMinimo ) and
\r
324 ( dist < mGetRadioMaximo ) then begin // Esta dentro de la distancia minima y maxima
\r
325 // posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam
\r
326 posRel := ov.mGetPosicion;
\r
327 posRel.mRestar( posCam );
\r
328 dirCam := mGetObservador.mGetK.mMultiplicar(-1);
\r
329 // Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| )
\r
330 cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo);
\r
331 // Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI
\r
332 if cosAlfa > mGetCosApertura then // Esta dentro del angulo de vision
\r
342 {** Verifica que un objeto volador pueda ser visto por la cámara}
\r
343 function cFiltroLock.mVisible(ov: cObjetoVolador): boolean;
\r
346 if (ov is cNave) or (ov is cMeteorito) then
\r
347 result := inherited mVisible( ov );
\r