]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - doc/src-html/vista/Filtros.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / doc / src-html / vista / Filtros.pas
1 <HTML><HEAD>\r
2 <TITLE>File: filtros.pas </TITLE>\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">\r
4 </HEAD>\r
5 <BODY BGCOLOR="#FFFFFF">\r
6 <A NAME=filtros.pas><CENTER><H3>filtros.pas</H3></A><I> from <A HREF=/proyecto/doc/src-html/AlgoWars.html> Project: AlgoWars.dpr</A></I></CENTER>\r
7 <HR>\r
8 <PRE>\r
9 <I><FONT COLOR="Navy">{** Se implementan varios filtro en diferentes direcciones.<br> \r
10     <i>Cambios:</i> \r
11     <PRE> \r
12     09/12/00: Se agrega la clase cFiltroMapa. \r
13     </PRE>}</FONT></I> \r
14 <B>unit</B> Filtros; \r
15  \r
16 <B>interface</B> \r
17  \r
18 <B>uses</B> \r
19   Tipos, \r
20   Vectores, \r
21   ObjetoVolador, \r
22   Sysutils, \r
23   Filtro; \r
24  \r
25 <B>type</B> \r
26  \r
27   <I><FONT COLOR="Navy">{** Implementa un filtro que "ve" hacia adelante.}</FONT></I> \r
28   cFiltroFrontal = <B>class</B>( cFiltro ) \r
29     <B>protected</B> \r
30       <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara}</FONT></I> \r
31       <B>function</B> <A HREF="#cFiltroFrontal.mVisible">mVisible</A>( ov: cObjetoVolador ): boolean; <B>override</B>; \r
32   <B>end</B>; \r
33  \r
34   <I><FONT COLOR="Navy">{** Implementa un filtro que "ve" hacia la izquierda.}</FONT></I> \r
35   cFiltroLatIzq = <B>class</B>( cFiltro ) \r
36     <B>protected</B> \r
37       <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara}</FONT></I> \r
38       <B>function</B> <A HREF="#cFiltroLatIzq.mVisible">mVisible</A>( ov: cObjetoVolador ): boolean; <B>override</B>; \r
39   <B>end</B>; \r
40  \r
41   <I><FONT COLOR="Navy">{** Implementa un filtro que "ve" hacia la derecha.}</FONT></I> \r
42   cFiltroLatDer = <B>class</B>( cFiltro ) \r
43     <B>protected</B> \r
44       <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara}</FONT></I> \r
45       <B>function</B> <A HREF="#cFiltroLatDer.mVisible">mVisible</A>( ov: cObjetoVolador ): boolean; <B>override</B>; \r
46   <B>end</B>; \r
47  \r
48   <I><FONT COLOR="Navy">{** Implementa un filtro que "ve" hacia atrás.}</FONT></I> \r
49   cFiltroTrasero = <B>class</B>( cFiltro ) \r
50     <B>protected</B> \r
51       <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara}</FONT></I> \r
52       <B>function</B> <A HREF="#cFiltroTrasero.mVisible">mVisible</A>( ov: cObjetoVolador ): boolean; <B>override</B>; \r
53   <B>end</B>; \r
54  \r
55   <I><FONT COLOR="Navy">{** Implementa un filtro que "ve" hacia arriba.}</FONT></I> \r
56   cFiltroArriba = <B>class</B>( cFiltro ) \r
57     <B>protected</B> \r
58       <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara}</FONT></I> \r
59       <B>function</B> <A HREF="#cFiltroArriba.mVisible">mVisible</A>( ov: cObjetoVolador ): boolean; <B>override</B>; \r
60   <B>end</B>; \r
61  \r
62   <I><FONT COLOR="Navy">{** Implementa un filtro que "ve" hacia abajo.}</FONT></I> \r
63   cFiltroAbajo = <B>class</B>( cFiltro ) \r
64     <B>protected</B> \r
65       <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara}</FONT></I> \r
66       <B>function</B> <A HREF="#cFiltroAbajo.mVisible">mVisible</A>( ov: cObjetoVolador ): boolean; <B>override</B>; \r
67   <B>end</B>; \r
68  \r
69   <I><FONT COLOR="Navy">{** Implementa un filtro que "ve" hacia abajo pero desde arriba a una cierta distancia \r
70       del observador. Es como si observara al observador mismo.}</FONT></I> \r
71   cFiltroMapa = <B>class</B>( cFiltro ) \r
72     <B>protected</B> \r
73       <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara}</FONT></I> \r
74       <B>function</B> <A HREF="#cFiltroMapa.mVisible">mVisible</A>( ov: cObjetoVolador ): boolean; <B>override</B>; \r
75   <B>end</B>; \r
76  \r
77   <I><FONT COLOR="Navy">{** Implementa un filtro que "ve" hacia adelante y que además sólo puede \r
78       ver objetos del tipo cNave y cMeteorito.}</FONT></I> \r
79   cFiltroLock = <B>class</B>( cFiltroFrontal ) \r
80     <B>protected</B> \r
81       <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara}</FONT></I> \r
82       <B>function</B> <A HREF="#cFiltroLock.mVisible">mVisible</A>( ov: cObjetoVolador ): boolean; <B>override</B>; \r
83   <B>end</B>; \r
84  \r
85 <B>implementation</B> \r
86  \r
87 <B>uses</B> \r
88   Nave, \r
89   Meteorito; \r
90  \r
91 <I><FONT COLOR="Navy">{ cFiltroFrontal }</FONT></I> \r
92  \r
93 <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara \r
94     @param  ov Objeto volador que se quiere verificar si es visto por la cámara. \r
95     @return    <i>True</i> si lo ve, <i>False</i> si no.}</FONT></I> \r
96 <B>function</B> <A NAME=cFiltroFrontal.mVisible>cFiltroFrontal.mVisible</A>(ov: cObjetoVolador): boolean; \r
97 <B>var</B> \r
98   posRel,             <I><FONT COLOR="Navy">// vector posicion del objeto volador relativo a la camara </FONT></I>\r
99   posCam,             <I><FONT COLOR="Navy">// Posision del cameraman </FONT></I>\r
100   dirCam:  cVector;   <I><FONT COLOR="Navy">// vector con la direccion en la que apunta la camara </FONT></I>\r
101   dist:    tLongitud; <I><FONT COLOR="Navy">// Distancia entre la camara y el objeto </FONT></I>\r
102   cosAlfa: tAngulo;   <I><FONT COLOR="Navy">// Coseno del angulo que forman la dir de la camara y la pos del objeto </FONT></I>\r
103 <B>begin</B> \r
104   result := false; \r
105   <B>try</B> <I><FONT COLOR="Navy">// Probamos que el cameraman no este destruido </FONT></I>\r
106     dist := mGetObservador.mGetDistancia( ov ); \r
107   <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cae en una excepcion </FONT></I>\r
108     on e: EAccessViolation <B>do</B> \r
109       <B>raise</B> EObservadorDestruido.create; <I><FONT COLOR="Navy">// Creamos una nueva excepcion especial </FONT></I>\r
110   <B>end</B>; \r
111   <B>if</B> ( dist > mGetRadioMinimo ) <B>and</B> \r
112      ( dist < mGetRadioMaximo ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Esta dentro de la distancia minima y maxima </FONT></I>\r
113     <I><FONT COLOR="Navy">// posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam </FONT></I>\r
114     posRel := ov.mGetPosicion; \r
115     posCam := mGetObservador.mGetPosicion; \r
116     posRel.mRestar( posCam ); \r
117     dirCam := mGetObservador.mGetI; \r
118     <I><FONT COLOR="Navy">// Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| ) </FONT></I>\r
119     cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo); \r
120     <I><FONT COLOR="Navy">// Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI </FONT></I>\r
121     <B>if</B> cosAlfa > mGetCosApertura <B>then</B> <I><FONT COLOR="Navy">// Esta dentro del angulo de vision </FONT></I>\r
122       result := true; \r
123     posRel.free; \r
124     posCam.free; \r
125     dirCam.free; \r
126   <B>end</B>; \r
127 <B>end</B>; \r
128  \r
129 <I><FONT COLOR="Navy">{ cFiltroLatIzq }</FONT></I> \r
130  \r
131 <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara \r
132     @param  ov Objeto volador que se quiere verificar si es visto por la cámara. \r
133     @return    <i>True</i> si lo ve, <i>False</i> si no.}</FONT></I> \r
134 <B>function</B> <A NAME=cFiltroLatIzq.mVisible>cFiltroLatIzq.mVisible</A>(ov: cObjetoVolador): boolean; \r
135 <B>var</B> \r
136   posRel,             <I><FONT COLOR="Navy">// vector posicion del objeto volador relativo a la camara </FONT></I>\r
137   posCam,             <I><FONT COLOR="Navy">// Posision del cameraman </FONT></I>\r
138   dirCam:  cVector;   <I><FONT COLOR="Navy">// vector con la direccion en la que apunta la camara </FONT></I>\r
139   dist:    tLongitud; <I><FONT COLOR="Navy">// Distancia entre la camara y el objeto </FONT></I>\r
140   cosAlfa: tAngulo;   <I><FONT COLOR="Navy">// Coseno del angulo que forman la dir de la camara y la pos del objeto </FONT></I>\r
141 <B>begin</B> \r
142   result := false; \r
143   <B>try</B> <I><FONT COLOR="Navy">// Probamos que el cameraman no este destruido </FONT></I>\r
144     dist := mGetObservador.mGetDistancia( ov ); \r
145   <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cae en una excepcion </FONT></I>\r
146     on e: EAccessViolation <B>do</B> \r
147       <B>raise</B> EObservadorDestruido.create; <I><FONT COLOR="Navy">// Creamos una nueva excepcion especial </FONT></I>\r
148   <B>end</B>; \r
149   <B>if</B> ( dist > mGetRadioMinimo ) <B>and</B> \r
150      ( dist < mGetRadioMaximo ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Esta dentro de la distancia minima y maxima </FONT></I>\r
151     <I><FONT COLOR="Navy">// posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam </FONT></I>\r
152     posRel := ov.mGetPosicion; \r
153     posCam := mGetObservador.mGetPosicion; \r
154     posRel.mRestar( posCam ); \r
155     dirCam := mGetObservador.mGetJ; \r
156     <I><FONT COLOR="Navy">// Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| ) </FONT></I>\r
157     cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo); \r
158     <I><FONT COLOR="Navy">// Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI </FONT></I>\r
159     <B>if</B> cosAlfa > mGetCosApertura <B>then</B> <I><FONT COLOR="Navy">// Esta dentro del angulo de vision </FONT></I>\r
160       result := true; \r
161     posRel.free; \r
162     posCam.free; \r
163     dirCam.free; \r
164   <B>end</B>; \r
165 <B>end</B>; \r
166  \r
167 <I><FONT COLOR="Navy">{ cFiltroLatDer }</FONT></I> \r
168  \r
169 <B>function</B> <A NAME=cFiltroLatDer.mVisible>cFiltroLatDer.mVisible</A>(ov: cObjetoVolador): boolean; \r
170 <B>var</B> \r
171   posRel,             <I><FONT COLOR="Navy">// vector posicion del objeto volador relativo a la camara </FONT></I>\r
172   posCam,             <I><FONT COLOR="Navy">// Posision del cameraman </FONT></I>\r
173   dirCam:  cVector;   <I><FONT COLOR="Navy">// vector con la direccion en la que apunta la camara </FONT></I>\r
174   dist:    tLongitud; <I><FONT COLOR="Navy">// Distancia entre la camara y el objeto </FONT></I>\r
175   cosAlfa: tAngulo;   <I><FONT COLOR="Navy">// Coseno del angulo que forman la dir de la camara y la pos del objeto </FONT></I>\r
176 <B>begin</B> \r
177   result := false; \r
178   <B>try</B> <I><FONT COLOR="Navy">// Probamos que el cameraman no este destruido </FONT></I>\r
179     dist := mGetObservador.mGetDistancia( ov ); \r
180   <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cae en una excepcion </FONT></I>\r
181     on e: EAccessViolation <B>do</B> \r
182       <B>raise</B> EObservadorDestruido.create; <I><FONT COLOR="Navy">// Creamos una nueva excepcion especial </FONT></I>\r
183   <B>end</B>; \r
184   <B>if</B> ( dist > mGetRadioMinimo ) <B>and</B> \r
185      ( dist < mGetRadioMaximo ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Esta dentro de la distancia minima y maxima </FONT></I>\r
186     <I><FONT COLOR="Navy">// posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam </FONT></I>\r
187     posRel := ov.mGetPosicion; \r
188     posCam := mGetObservador.mGetPosicion; \r
189     posRel.mRestar( posCam ); \r
190     dirCam := mGetObservador.mGetJ.mMultiplicar(-1); \r
191     <I><FONT COLOR="Navy">// Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| ) </FONT></I>\r
192     cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo); \r
193     <I><FONT COLOR="Navy">// Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI </FONT></I>\r
194     <B>if</B> cosAlfa > mGetCosApertura <B>then</B> <I><FONT COLOR="Navy">// Esta dentro del angulo de vision </FONT></I>\r
195       result := true; \r
196     posRel.free; \r
197     posCam.free; \r
198     dirCam.free; \r
199   <B>end</B>; \r
200 <B>end</B>; \r
201  \r
202 <I><FONT COLOR="Navy">{ cFiltroTrasero }</FONT></I> \r
203  \r
204 <B>function</B> <A NAME=cFiltroTrasero.mVisible>cFiltroTrasero.mVisible</A>(ov: cObjetoVolador): boolean; \r
205 <B>var</B> \r
206   posRel,             <I><FONT COLOR="Navy">// vector posicion del objeto volador relativo a la camara </FONT></I>\r
207   posCam,             <I><FONT COLOR="Navy">// Posision del cameraman </FONT></I>\r
208   dirCam:  cVector;   <I><FONT COLOR="Navy">// vector con la direccion en la que apunta la camara </FONT></I>\r
209   dist:    tLongitud; <I><FONT COLOR="Navy">// Distancia entre la camara y el objeto </FONT></I>\r
210   cosAlfa: tAngulo;   <I><FONT COLOR="Navy">// Coseno del angulo que forman la dir de la camara y la pos del objeto </FONT></I>\r
211 <B>begin</B> \r
212   result := false; \r
213   <B>try</B> <I><FONT COLOR="Navy">// Probamos que el cameraman no este destruido </FONT></I>\r
214     dist := mGetObservador.mGetDistancia( ov ); \r
215   <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cae en una excepcion </FONT></I>\r
216     on e: EAccessViolation <B>do</B> \r
217       <B>raise</B> EObservadorDestruido.create; <I><FONT COLOR="Navy">// Creamos una nueva excepcion especial </FONT></I>\r
218   <B>end</B>; \r
219   <B>if</B> ( dist > mGetRadioMinimo ) <B>and</B> \r
220      ( dist < mGetRadioMaximo ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Esta dentro de la distancia minima y maxima </FONT></I>\r
221     <I><FONT COLOR="Navy">// posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam </FONT></I>\r
222     posRel := ov.mGetPosicion; \r
223     posCam := mGetObservador.mGetPosicion; \r
224     posRel.mRestar( posCam ); \r
225     dirCam := mGetObservador.mGetI.mMultiplicar(-1); \r
226     <I><FONT COLOR="Navy">// Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| ) </FONT></I>\r
227     cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo); \r
228     <I><FONT COLOR="Navy">// Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI </FONT></I>\r
229     <B>if</B> cosAlfa > mGetCosApertura <B>then</B> <I><FONT COLOR="Navy">// Esta dentro del angulo de vision </FONT></I>\r
230       result := true; \r
231     posRel.free; \r
232     posCam.free; \r
233     dirCam.free; \r
234   <B>end</B>; \r
235 <B>end</B>; \r
236  \r
237 <I><FONT COLOR="Navy">{ cFiltroArriba }</FONT></I> \r
238  \r
239 <B>function</B> <A NAME=cFiltroArriba.mVisible>cFiltroArriba.mVisible</A>(ov: cObjetoVolador): boolean; \r
240 <B>var</B> \r
241   posRel,             <I><FONT COLOR="Navy">// vector posicion del objeto volador relativo a la camara </FONT></I>\r
242   posCam,             <I><FONT COLOR="Navy">// Posision del cameraman </FONT></I>\r
243   dirCam:  cVector;   <I><FONT COLOR="Navy">// vector con la direccion en la que apunta la camara </FONT></I>\r
244   dist:    tLongitud; <I><FONT COLOR="Navy">// Distancia entre la camara y el objeto </FONT></I>\r
245   cosAlfa: tAngulo;   <I><FONT COLOR="Navy">// Coseno del angulo que forman la dir de la camara y la pos del objeto </FONT></I>\r
246 <B>begin</B> \r
247   result := false; \r
248   <B>try</B> <I><FONT COLOR="Navy">// Probamos que el cameraman no este destruido </FONT></I>\r
249     dist := mGetObservador.mGetDistancia( ov ); \r
250   <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cae en una excepcion </FONT></I>\r
251     on e: EAccessViolation <B>do</B> \r
252       <B>raise</B> EObservadorDestruido.create; <I><FONT COLOR="Navy">// Creamos una nueva excepcion especial </FONT></I>\r
253   <B>end</B>; \r
254   <B>if</B> ( dist > mGetRadioMinimo ) <B>and</B> \r
255      ( dist < mGetRadioMaximo ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Esta dentro de la distancia minima y maxima </FONT></I>\r
256     <I><FONT COLOR="Navy">// posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam </FONT></I>\r
257     posRel := ov.mGetPosicion; \r
258     posCam := mGetObservador.mGetPosicion; \r
259     posRel.mRestar( posCam ); \r
260     dirCam := mGetObservador.mGetK; \r
261     <I><FONT COLOR="Navy">// Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| ) </FONT></I>\r
262     cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo); \r
263     <I><FONT COLOR="Navy">// Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI </FONT></I>\r
264     <B>if</B> cosAlfa > mGetCosApertura <B>then</B> <I><FONT COLOR="Navy">// Esta dentro del angulo de vision </FONT></I>\r
265       result := true; \r
266     posRel.free; \r
267     posCam.free; \r
268     dirCam.free; \r
269   <B>end</B>; \r
270 <B>end</B>; \r
271  \r
272 <I><FONT COLOR="Navy">{ cFiltroAbajo }</FONT></I> \r
273  \r
274 <B>function</B> <A NAME=cFiltroAbajo.mVisible>cFiltroAbajo.mVisible</A>(ov: cObjetoVolador): boolean; \r
275 <B>var</B> \r
276   posRel,             <I><FONT COLOR="Navy">// vector posicion del objeto volador relativo a la camara </FONT></I>\r
277   posCam,             <I><FONT COLOR="Navy">// Posision del cameraman </FONT></I>\r
278   dirCam:  cVector;   <I><FONT COLOR="Navy">// vector con la direccion en la que apunta la camara </FONT></I>\r
279   dist:    tLongitud; <I><FONT COLOR="Navy">// Distancia entre la camara y el objeto </FONT></I>\r
280   cosAlfa: tAngulo;   <I><FONT COLOR="Navy">// Coseno del angulo que forman la dir de la camara y la pos del objeto </FONT></I>\r
281 <B>begin</B> \r
282   result := false; \r
283   <B>try</B> <I><FONT COLOR="Navy">// Probamos que el cameraman no este destruido </FONT></I>\r
284     dist := mGetObservador.mGetDistancia( ov ); \r
285   <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cae en una excepcion </FONT></I>\r
286     on e: EAccessViolation <B>do</B> \r
287       <B>raise</B> EObservadorDestruido.create; <I><FONT COLOR="Navy">// Creamos una nueva excepcion especial </FONT></I>\r
288   <B>end</B>; \r
289   <B>if</B> ( dist > mGetRadioMinimo ) <B>and</B> \r
290      ( dist < mGetRadioMaximo ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Esta dentro de la distancia minima y maxima </FONT></I>\r
291     <I><FONT COLOR="Navy">// posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam </FONT></I>\r
292     posRel := ov.mGetPosicion; \r
293     posCam := mGetObservador.mGetPosicion; \r
294     posRel.mRestar( posCam ); \r
295     dirCam := mGetObservador.mGetK.mMultiplicar(-1); \r
296     <I><FONT COLOR="Navy">// Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| ) </FONT></I>\r
297     cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo); \r
298     <I><FONT COLOR="Navy">// Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI </FONT></I>\r
299     <B>if</B> cosAlfa > mGetCosApertura <B>then</B> <I><FONT COLOR="Navy">// Esta dentro del angulo de vision </FONT></I>\r
300       result := true; \r
301     posRel.free; \r
302     posCam.free; \r
303     dirCam.free; \r
304   <B>end</B>; \r
305 <B>end</B>; \r
306  \r
307 <I><FONT COLOR="Navy">{ cFiltroMapa }</FONT></I> \r
308  \r
309 <B>function</B> <A NAME=cFiltroMapa.mVisible>cFiltroMapa.mVisible</A>(ov: cObjetoVolador): boolean; \r
310 <B>var</B> \r
311   desplazamiento,     <I><FONT COLOR="Navy">// desplazamiento del filtro respecto del observador </FONT></I>\r
312   posTmp,             <I><FONT COLOR="Navy">// Vector posicion temporal </FONT></I>\r
313   posRel,             <I><FONT COLOR="Navy">// vector posicion del objeto volador relativo a la camara </FONT></I>\r
314   posCam,             <I><FONT COLOR="Navy">// Posision del cameraman </FONT></I>\r
315   dirCam:  cVector;   <I><FONT COLOR="Navy">// vector con la direccion en la que apunta la camara </FONT></I>\r
316   dist:    tLongitud; <I><FONT COLOR="Navy">// Distancia entre la camara y el objeto </FONT></I>\r
317   cosAlfa: tAngulo;   <I><FONT COLOR="Navy">// Coseno del angulo que forman la dir de la camara y la pos del objeto </FONT></I>\r
318 <B>begin</B> \r
319   result := false; \r
320   <B>try</B> <I><FONT COLOR="Navy">// Probamos que el cameraman no este destruido </FONT></I>\r
321     desplazamiento := mGetObservador.mGetk.mSetModulo( 3000 ); <I><FONT COLOR="Navy">// Esta 3000 metros alejado del observador </FONT></I>\r
322   <B>except</B> <I><FONT COLOR="Navy">// Si esta destruido cae en una excepcion </FONT></I>\r
323     on e: EAccessViolation <B>do</B> \r
324       <B>raise</B> EObservadorDestruido.create; <I><FONT COLOR="Navy">// Creamos una nueva excepcion especial </FONT></I>\r
325   <B>end</B>; \r
326   posCam := mGetObservador.mGetPosicion.mSumar( desplazamiento ); \r
327   desplazamiento.free; \r
328   posTmp := ov.mGetPosicion; \r
329   dist := posCam.mGetDistancia( posTmp ); \r
330   posTmp.free; \r
331   <B>if</B> ( dist > mGetRadioMinimo ) <B>and</B> \r
332      ( dist < mGetRadioMaximo ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Esta dentro de la distancia minima y maxima </FONT></I>\r
333     <I><FONT COLOR="Navy">// posRel es el vector posicion del objeto volador relativo a la camara: posRel = posOV - posCam </FONT></I>\r
334     posRel := ov.mGetPosicion; \r
335     posRel.mRestar( posCam ); \r
336     dirCam := mGetObservador.mGetK.mMultiplicar(-1); \r
337     <I><FONT COLOR="Navy">// Calcula el angulo entre las 2 posiciones ( A . B / |A| . |B| ) </FONT></I>\r
338     cosAlfa := posRel.mMultiplicarEsc( dirCam ) / ( posRel.mGetModulo * dirCam.mGetModulo); \r
339     <I><FONT COLOR="Navy">// Ahora se comparan los cosenos, ya que es una funcion decreciente entre 0 y PI </FONT></I>\r
340     <B>if</B> cosAlfa > mGetCosApertura <B>then</B> <I><FONT COLOR="Navy">// Esta dentro del angulo de vision </FONT></I>\r
341       result := true; \r
342     posRel.free; \r
343     dirCam.free; \r
344   <B>end</B>; \r
345   posCam.free; \r
346 <B>end</B>; \r
347  \r
348 <I><FONT COLOR="Navy">{ cFiltroLock }</FONT></I> \r
349  \r
350 <I><FONT COLOR="Navy">{** Verifica que un objeto volador pueda ser visto por la cámara}</FONT></I> \r
351 <B>function</B> <A NAME=cFiltroLock.mVisible>cFiltroLock.mVisible</A>(ov: cObjetoVolador): boolean; \r
352 <B>begin</B> \r
353   result := false; \r
354   <B>if</B> (ov <B>is</B> cNave) <B>or</B> (ov <B>is</B> cMeteorito) <B>then</B> \r
355     result := <B>inherited</B> mVisible( ov ); \r
356 <B>end</B>; \r
357  \r
358 <B>end</B>. \r
359 </PRE>\r
360 </BODY>\r
361 </HTML>\r