1 {** Se implementan varias cámaras en diferentes direcciones.<br>
\r
4 09/12/00: Se agrega la clase cCamaraMapa.
\r
19 {** Implementa una cámara frontal.}
\r
20 cCamaraFrontal = class( cCamara )
\r
22 {** Obtiene la proyección del objeto volador en X, Y}
\r
23 procedure mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud); override;
\r
26 constructor create( cameraman: cObjetoVolador; angulo: tAngulo = PI/4; maximo: tLongitud = 5000; distPantalla: tLongitud = 0 );
\r
29 {** Implementa una cámara lateral derecha.}
\r
30 cCamaraLatDer = class( cCamara )
\r
32 {** Obtiene la proyección del objeto volador en X, Y}
\r
33 procedure mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud); override;
\r
35 constructor create( cameraman: cObjetoVolador; angulo: tAngulo = PI/4; maximo: tLongitud = 5000; distPantalla: tLongitud = 0 );
\r
38 {** Implementa una cámara lateral izquierda.}
\r
39 cCamaraLatIzq = class( cCamara )
\r
41 {** Obtiene la proyección del objeto volador en X, Y}
\r
42 procedure mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud); override;
\r
45 constructor create( cameraman: cObjetoVolador; angulo: tAngulo = PI/4; maximo: tLongitud = 5000; distPantalla: tLongitud = 0 );
\r
48 {** Implementa una cámara trasera.}
\r
49 cCamaraTrasera = class( cCamara )
\r
51 {** Obtiene la proyección del objeto volador en X, Y}
\r
52 procedure mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud); override;
\r
55 constructor create( cameraman: cObjetoVolador; angulo: tAngulo = PI/4; maximo: tLongitud = 5000; distPantalla: tLongitud = 0 );
\r
58 {** Implementa una cámara para ver hacia arriba.}
\r
59 cCamaraArriba = class( cCamara )
\r
61 {** Obtiene la proyección del objeto volador en X, Y}
\r
62 procedure mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud); override;
\r
65 constructor create( cameraman: cObjetoVolador; angulo: tAngulo = PI/4; maximo: tLongitud = 5000; distPantalla: tLongitud = 0 );
\r
68 {** Implementa una cámara para ver hacia abajo.}
\r
69 cCamaraAbajo = class( cCamara )
\r
71 {** Obtiene la proyección del objeto volador en X, Y}
\r
72 procedure mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud); override;
\r
75 constructor create( cameraman: cObjetoVolador; angulo: tAngulo = PI/4; maximo: tLongitud = 5000; distPantalla: tLongitud = 0 );
\r
78 {** Implementa una cámara para ver hacia abajo pero alejado del cameraman.
\r
79 Es como si observara al cameraman desde arriba.}
\r
80 cCamaraMapa = class( cCamara )
\r
82 {** Obtiene la proyección del objeto volador en X, Y}
\r
83 procedure mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud); override;
\r
86 constructor create( cameraman: cObjetoVolador; angulo: tAngulo = PI/4; maximo: tLongitud = 5000; distPantalla: tLongitud = 0 );
\r
97 @param cameraman Objeto Volador en el que estará montada la cámara (obligatorio)
\r
98 @param angulo Angulo de apertura (visión) de la cámara (default = pi/4)
\r
99 @param maximo Distancia máxima en la que se considera visible a un objeto (default = 5000)
\r
100 @param distPantalla Distancia hasta la pantalla de proyección (default = 0). Si tiene el valor por default
\r
101 o cualquier valor menor o igual a cero, se usa el tamaño del objeto volador}
\r
102 constructor cCamaraFrontal.create(cameraman: cObjetoVolador; angulo: tAngulo; maximo: tLongitud; distPantalla: tLongitud);
\r
104 inherited create(cameraman, angulo, maximo, distPantalla );
\r
105 mSetFiltro( cFiltroFrontal.create( Cameraman, angulo, maximo, mGetRadioMinimo ) );
\r
108 {** Obtiene la proyección del objeto volador en X, Y
\r
109 @param ov Objeto volador a proyectar.
\r
110 @param x Valor de la proyección en X.
\r
111 @param x Valor de la proyección en Y.
\r
112 @param tam Tamaño porcentual del objeto (cuanto mas lejos esta, mas pequeño es).
\r
114 procedure cCamaraFrontal.mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud);
\r
126 // Lo primero que hay que hacer es hallar OI, para eso utilizaremos la siguiente formula:
\r
128 // En nuetro caso seria:
\r
129 // OI = O . aDistPantalla
\r
130 // aCameraman.mGetI . 0
\r
131 // Donde O = ov.mGetPosicion - aCameraman.mGetPosicion
\r
132 try // Probamos que el cameraman no este destruido
\r
133 posCam := mGetCameraman.mGetPosicion;
\r
134 except // Si esta destruido cae en una excepcion
\r
135 on e: EAccessViolation do raise ECameramanDestruido.create; // Creamos una nueva excepcion especial
\r
137 i := mGetCameraman.mGetI;
\r
138 O := ov.mGetPosicion.mRestar( posCam );
\r
139 OI := cVector.create( O ).mMultiplicar( mGetDistPantalla / i.mMultiplicarEsc( O ) );
\r
140 // Ahora hallamos el vector v que pertenece a la pantalla, que nos dara las nuevas coordenadas respecto de ella.
\r
142 // En nuestro caso:
\r
143 // v = OI - ( aCameraman.mGetCoordenadas.mGetI . aDistPantalla )
\r
144 v := cVector.create( OI ).mRestar( i.mMultiplicar( mGetDistPantalla ) );
\r
145 // Ahora hallamos su proyeccion en el versor -j (que sera nuestro X de la pantalla)
\r
146 // Es -j porque tomaremos positivo hacia la derecha.
\r
147 vX := mGetCameraman.mGetJ.mMultiplicar( -1 );
\r
148 x := v.mMultiplicarEsc( vX );
\r
149 // Ahora hallamos su proyeccion en el versor k (que sera nuestro Y de la pantalla)
\r
150 vY := mGetCameraman.mGetK;
\r
151 y := v.mMultiplicarEsc( vY );
\r
152 // Ahora hallamos el tamaño proporcional (un numero entre 0 y 1, donde 0 es
\r
153 // lo mas lejano y 1 lo mas cercano). Se calcula de la siguiente forma:
\r
154 // tam = 1 - |O| - aRadioMinimo
\r
155 // aRadioMaximo - aRadioMinimo
\r
156 // Donde O es el vector posicion respecto de la camara, y el " 1 - xxx ", es porque cuanto mas
\r
157 // lejos, menor tiene que ser el tamaño
\r
158 tmp := O.mGetModulo - mGetRadioMinimo;
\r
159 distMax := mGetRadioMaximo - mGetRadioMinimo;
\r
160 tam := 1 - (tmp / distMax);
\r
173 @param cameraman Objeto Volador en el que estará montada la cámara (obligatorio)
\r
174 @param angulo Angulo de apertura (visión) de la cámara (default = pi/4)
\r
175 @param maximo Distancia máxima en la que se considera visible a un objeto (default = 5000)
\r
176 @param distPantalla Distancia hasta la pantalla de proyección (default = 0). Si tiene el valor por default
\r
177 o cualquier valor menor o igual a cero, se usa el tamaño del objeto volador}
\r
178 constructor cCamaraLatIzq.create(cameraman: cObjetoVolador; angulo: tAngulo; maximo: tLongitud; distPantalla: tLongitud);
\r
180 inherited create(cameraman, angulo, maximo, distPantalla );
\r
181 mSetFiltro( cFiltroLatIzq.create( Cameraman, angulo, maximo, mGetRadioMinimo ) );
\r
184 {** Obtiene la proyección del objeto volador en X, Y
\r
185 @param ov Objeto volador a proyectar.
\r
186 @param x Valor de la proyección en X.
\r
187 @param x Valor de la proyección en Y.
\r
188 @param tam Tamaño porcentual del objeto (cuanto mas lejos esta, mas pequeño es).
\r
190 procedure cCamaraLatIzq.mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud);
\r
202 // Lo primero que hay que hacer es hallar OI, para eso utilizaremos la siguiente formula:
\r
204 // En nuetro caso seria:
\r
205 // OI = O . aDistPantalla
\r
206 // aCameraman.mGetI . 0
\r
207 // Donde O = ov.mGetPosicion - mGetCameraman.mGetPosicion
\r
208 try // Probamos que el cameraman no este destruido
\r
209 posCam := mGetCameraman.mGetPosicion;
\r
210 except // Si esta destruido cae en una excepcion
\r
211 on e: EAccessViolation do raise ECameramanDestruido.create; // Creamos una nueva excepcion especial
\r
213 i := mGetCameraman.mGetJ;
\r
214 O := ov.mGetPosicion.mRestar( posCam );
\r
215 OI := cVector.create( O ).mMultiplicar( mGetDistPantalla / i.mMultiplicarEsc( O ) );
\r
216 // Ahora hallamos el vector v que pertenece a la pantalla, que nos dara las nuevas coordenadas respecto de ella.
\r
218 // En nuestro caso:
\r
219 // v = OI - ( aCameraman.mGetCoordenadas.mGetI . aDistPantalla )
\r
220 v := cVector.create( OI ).mRestar( i.mMultiplicar( mGetDistPantalla ) );
\r
221 // Ahora hallamos su proyeccion en el versor -j (que sera nuestro X de la pantalla)
\r
222 // Es -j porque tomaremos positivo hacia la derecha.
\r
223 vX := mGetCameraman.mGetI;
\r
224 x := v.mMultiplicarEsc( vX );
\r
225 // Ahora hallamos su proyeccion en el versor k (que sera nuestro Y de la pantalla)
\r
226 vY := mGetCameraman.mGetK;
\r
227 y := v.mMultiplicarEsc( vY );
\r
228 // Ahora hallamos el tamaño proporcional (un numero entre 0 y 1, donde 0 es
\r
229 // lo mas lejano y 1 lo mas cercano). Se calcula de la siguiente forma:
\r
230 // tam = 1 - |O| - aRadioMinimo
\r
231 // aRadioMaximo - aRadioMinimo
\r
232 // Donde O es el vector posicion respecto de la camara, y el " 1 - xxx ", es porque cuanto mas
\r
233 // lejos, menor tiene que ser el tamaño
\r
234 tmp := O.mGetModulo - mGetRadioMinimo;
\r
235 distMax := mGetRadioMaximo - mGetRadioMinimo;
\r
236 tam := 1 - (tmp / distMax);
\r
249 @param cameraman Objeto Volador en el que estará montada la cámara (obligatorio)
\r
250 @param angulo Angulo de apertura (visión) de la cámara (default = pi/4)
\r
251 @param maximo Distancia máxima en la que se considera visible a un objeto (default = 5000)
\r
252 @param distPantalla Distancia hasta la pantalla de proyección (default = 0). Si tiene el valor por default
\r
253 o cualquier valor menor o igual a cero, se usa el tamaño del objeto volador}
\r
254 constructor cCamaraLatDer.create(cameraman: cObjetoVolador; angulo: tAngulo; maximo: tLongitud; distPantalla: tLongitud);
\r
256 inherited create(cameraman, angulo, maximo, distPantalla );
\r
257 mSetFiltro( cFiltroLatDer.create( Cameraman, angulo, maximo, mGetRadioMinimo ) );
\r
260 {** Obtiene la proyección del objeto volador en X, Y
\r
261 @param ov Objeto volador a proyectar.
\r
262 @param x Valor de la proyección en X.
\r
263 @param x Valor de la proyección en Y.
\r
264 @param tam Tamaño porcentual del objeto (cuanto mas lejos esta, mas pequeño es).
\r
266 procedure cCamaraLatDer.mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud);
\r
278 // Lo primero que hay que hacer es hallar OI, para eso utilizaremos la siguiente formula:
\r
280 // En nuetro caso seria:
\r
281 // OI = O . aDistPantalla
\r
282 // aCameraman.mGetI . 0
\r
283 // Donde O = ov.mGetPosicion - mGetCameraman.mGetPosicion
\r
284 try // Probamos que el cameraman no este destruido
\r
285 posCam := mGetCameraman.mGetPosicion;
\r
286 except // Si esta destruido cae en una excepcion
\r
287 on e: EAccessViolation do raise ECameramanDestruido.create; // Creamos una nueva excepcion especial
\r
289 i := mGetCameraman.mGetJ.mMultiplicar(-1);
\r
290 O := ov.mGetPosicion.mRestar( posCam );
\r
291 OI := cVector.create( O ).mMultiplicar( mGetDistPantalla / i.mMultiplicarEsc( O ) );
\r
292 // Ahora hallamos el vector v que pertenece a la pantalla, que nos dara las nuevas coordenadas respecto de ella.
\r
294 // En nuestro caso:
\r
295 // v = OI - ( aCameraman.mGetCoordenadas.mGetI . aDistPantalla )
\r
296 v := cVector.create( OI ).mRestar( i.mMultiplicar( mGetDistPantalla ) );
\r
297 // Ahora hallamos su proyeccion en el versor -j (que sera nuestro X de la pantalla)
\r
298 // Es -j porque tomaremos positivo hacia la derecha.
\r
299 vX := mGetCameraman.mGetI.mMultiplicar(-1);
\r
300 x := v.mMultiplicarEsc( vX );
\r
301 // Ahora hallamos su proyeccion en el versor k (que sera nuestro Y de la pantalla)
\r
302 vY := mGetCameraman.mGetK;
\r
303 y := v.mMultiplicarEsc( vY );
\r
304 // Ahora hallamos el tamaño proporcional (un numero entre 0 y 1, donde 0 es
\r
305 // lo mas lejano y 1 lo mas cercano). Se calcula de la siguiente forma:
\r
306 // tam = 1 - |O| - aRadioMinimo
\r
307 // aRadioMaximo - aRadioMinimo
\r
308 // Donde O es el vector posicion respecto de la camara, y el " 1 - xxx ", es porque cuanto mas
\r
309 // lejos, menor tiene que ser el tamaño
\r
310 tmp := O.mGetModulo - mGetRadioMinimo;
\r
311 distMax := mGetRadioMaximo - mGetRadioMinimo;
\r
312 tam := 1 - (tmp / distMax);
\r
325 @param cameraman Objeto Volador en el que estará montada la cámara (obligatorio)
\r
326 @param angulo Angulo de apertura (visión) de la cámara (default = pi/4)
\r
327 @param maximo Distancia máxima en la que se considera visible a un objeto (default = 5000)
\r
328 @param distPantalla Distancia hasta la pantalla de proyección (default = 0). Si tiene el valor por default
\r
329 o cualquier valor menor o igual a cero, se usa el tamaño del objeto volador}
\r
330 constructor cCamaraTrasera.create(cameraman: cObjetoVolador; angulo: tAngulo; maximo: tLongitud; distPantalla: tLongitud);
\r
332 inherited create(cameraman, angulo, maximo, distPantalla );
\r
333 mSetFiltro( cFiltroTrasero.create( Cameraman, angulo, maximo, mGetRadioMinimo ) );
\r
336 {** Obtiene la proyección del objeto volador en X, Y
\r
337 @param ov Objeto volador a proyectar.
\r
338 @param x Valor de la proyección en X.
\r
339 @param x Valor de la proyección en Y.
\r
340 @param tam Tamaño porcentual del objeto (cuanto mas lejos esta, mas pequeño es).
\r
342 procedure cCamaraTrasera.mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud);
\r
354 // Lo primero que hay que hacer es hallar OI, para eso utilizaremos la siguiente formula:
\r
356 // En nuetro caso seria:
\r
357 // OI = O . aDistPantalla
\r
358 // aCameraman.mGetI . 0
\r
359 // Donde O = ov.mGetPosicion - mGetCameraman.mGetPosicion
\r
360 try // Probamos que el cameraman no este destruido
\r
361 posCam := mGetCameraman.mGetPosicion;
\r
362 except // Si esta destruido cae en una excepcion
\r
363 on e: EAccessViolation do raise ECameramanDestruido.create; // Creamos una nueva excepcion especial
\r
365 i := mGetCameraman.mGetI.mMultiplicar(-1);
\r
366 O := ov.mGetPosicion.mRestar( posCam );
\r
367 OI := cVector.create( O ).mMultiplicar( mGetDistPantalla / i.mMultiplicarEsc( O ) );
\r
368 // Ahora hallamos el vector v que pertenece a la pantalla, que nos dara las nuevas coordenadas respecto de ella.
\r
370 // En nuestro caso:
\r
371 // v = OI - ( aCameraman.mGetCoordenadas.mGetI . aDistPantalla )
\r
372 v := cVector.create( OI ).mRestar( i.mMultiplicar( mGetDistPantalla ) );
\r
373 // Ahora hallamos su proyeccion en el versor -j (que sera nuestro X de la pantalla)
\r
374 // Es -j porque tomaremos positivo hacia la derecha.
\r
375 vX := mGetCameraman.mGetJ;
\r
376 x := v.mMultiplicarEsc( vX );
\r
377 // Ahora hallamos su proyeccion en el versor k (que sera nuestro Y de la pantalla)
\r
378 vY := mGetCameraman.mGetK;
\r
379 y := v.mMultiplicarEsc( vY );
\r
380 // Ahora hallamos el tamaño proporcional (un numero entre 0 y 1, donde 0 es
\r
381 // lo mas lejano y 1 lo mas cercano). Se calcula de la siguiente forma:
\r
382 // tam = 1 - |O| - aRadioMinimo
\r
383 // aRadioMaximo - aRadioMinimo
\r
384 // Donde O es el vector posicion respecto de la camara, y el " 1 - xxx ", es porque cuanto mas
\r
385 // lejos, menor tiene que ser el tamaño
\r
386 tmp := O.mGetModulo - mGetRadioMinimo;
\r
387 distMax := mGetRadioMaximo - mGetRadioMinimo;
\r
388 tam := 1 - (tmp / distMax);
\r
401 @param cameraman Objeto Volador en el que estará montada la cámara (obligatorio)
\r
402 @param angulo Angulo de apertura (visión) de la cámara (default = pi/4)
\r
403 @param maximo Distancia máxima en la que se considera visible a un objeto (default = 5000)
\r
404 @param distPantalla Distancia hasta la pantalla de proyección (default = 0). Si tiene el valor por default
\r
405 o cualquier valor menor o igual a cero, se usa el tamaño del objeto volador}
\r
406 constructor cCamaraArriba.create(cameraman: cObjetoVolador; angulo: tAngulo; maximo: tLongitud; distPantalla: tLongitud);
\r
408 inherited create(cameraman, angulo, maximo, distPantalla );
\r
409 mSetFiltro( cFiltroArriba.create( Cameraman, angulo, maximo, mGetRadioMinimo ) );
\r
412 {** Obtiene la proyección del objeto volador en X, Y
\r
413 @param ov Objeto volador a proyectar.
\r
414 @param x Valor de la proyección en X.
\r
415 @param x Valor de la proyección en Y.
\r
416 @param tam Tamaño porcentual del objeto (cuanto mas lejos esta, mas pequeño es).
\r
418 procedure cCamaraArriba.mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud);
\r
430 // Lo primero que hay que hacer es hallar OI, para eso utilizaremos la siguiente formula:
\r
432 // En nuetro caso seria:
\r
433 // OI = O . aDistPantalla
\r
434 // aCameraman.mGetI . 0
\r
435 // Donde O = ov.mGetPosicion - mGetCameraman.mGetPosicion
\r
436 try // Probamos que el cameraman no este destruido
\r
437 posCam := mGetCameraman.mGetPosicion;
\r
438 except // Si esta destruido cae en una excepcion
\r
439 on e: EAccessViolation do raise ECameramanDestruido.create; // Creamos una nueva excepcion especial
\r
441 i := mGetCameraman.mGetk;
\r
442 O := ov.mGetPosicion.mRestar( posCam );
\r
443 OI := cVector.create( O ).mMultiplicar( mGetDistPantalla / i.mMultiplicarEsc( O ) );
\r
444 // Ahora hallamos el vector v que pertenece a la pantalla, que nos dara las nuevas coordenadas respecto de ella.
\r
446 // En nuestro caso:
\r
447 // v = OI - ( aCameraman.mGetCoordenadas.mGetI . aDistPantalla )
\r
448 v := cVector.create( OI ).mRestar( i.mMultiplicar( mGetDistPantalla ) );
\r
449 // Ahora hallamos su proyeccion en el versor -j (que sera nuestro X de la pantalla)
\r
450 // Es -j porque tomaremos positivo hacia la derecha.
\r
451 vX := mGetCameraman.mGetJ;
\r
452 x := v.mMultiplicarEsc( vX );
\r
453 // Ahora hallamos su proyeccion en el versor k (que sera nuestro Y de la pantalla)
\r
454 vY := mGetCameraman.mGetI.mMultiplicar(-1);
\r
455 y := v.mMultiplicarEsc( vY );
\r
456 // Ahora hallamos el tamaño proporcional (un numero entre 0 y 1, donde 0 es
\r
457 // lo mas lejano y 1 lo mas cercano). Se calcula de la siguiente forma:
\r
458 // tam = 1 - |O| - aRadioMinimo
\r
459 // aRadioMaximo - aRadioMinimo
\r
460 // Donde O es el vector posicion respecto de la camara, y el " 1 - xxx ", es porque cuanto mas
\r
461 // lejos, menor tiene que ser el tamaño
\r
462 tmp := O.mGetModulo - mGetRadioMinimo;
\r
463 distMax := mGetRadioMaximo - mGetRadioMinimo;
\r
464 tam := 1 - (tmp / distMax);
\r
474 { cCamaraLatAbajo }
\r
477 @param cameraman Objeto Volador en el que estará montada la cámara (obligatorio)
\r
478 @param angulo Angulo de apertura (visión) de la cámara (default = pi/4)
\r
479 @param maximo Distancia máxima en la que se considera visible a un objeto (default = 5000)
\r
480 @param distPantalla Distancia hasta la pantalla de proyección (default = 0). Si tiene el valor por default
\r
481 o cualquier valor menor o igual a cero, se usa el tamaño del objeto volador}
\r
482 constructor cCamaraAbajo.create(cameraman: cObjetoVolador; angulo: tAngulo; maximo: tLongitud; distPantalla: tLongitud);
\r
484 inherited create(cameraman, angulo, maximo, distPantalla );
\r
485 mSetFiltro( cFiltroAbajo.create( Cameraman, angulo, maximo, mGetRadioMinimo ) );
\r
488 {** Obtiene la proyección del objeto volador en X, Y
\r
489 @param ov Objeto volador a proyectar.
\r
490 @param x Valor de la proyección en X.
\r
491 @param x Valor de la proyección en Y.
\r
492 @param tam Tamaño porcentual del objeto (cuanto mas lejos esta, mas pequeño es).
\r
494 procedure cCamaraAbajo.mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud);
\r
506 // Lo primero que hay que hacer es hallar OI, para eso utilizaremos la siguiente formula:
\r
508 // En nuetro caso seria:
\r
509 // OI = O . aDistPantalla
\r
510 // aCameraman.mGetI . 0
\r
511 // Donde O = ov.mGetPosicion - mGetCameraman.mGetPosicion
\r
512 try // Probamos que el cameraman no este destruido
\r
513 posCam := mGetCameraman.mGetPosicion;
\r
514 except // Si esta destruido cae en una excepcion
\r
515 on e: EAccessViolation do raise ECameramanDestruido.create; // Creamos una nueva excepcion especial
\r
517 i := mGetCameraman.mGetk.mMultiplicar(-1);
\r
518 O := ov.mGetPosicion.mRestar( posCam );
\r
519 OI := cVector.create( O ).mMultiplicar( mGetDistPantalla / i.mMultiplicarEsc( O ) );
\r
520 // Ahora hallamos el vector v que pertenece a la pantalla, que nos dara las nuevas coordenadas respecto de ella.
\r
522 // En nuestro caso:
\r
523 // v = OI - ( aCameraman.mGetCoordenadas.mGetI . aDistPantalla )
\r
524 v := cVector.create( OI ).mRestar( i.mMultiplicar( mGetDistPantalla ) );
\r
525 // Ahora hallamos su proyeccion en el versor -j (que sera nuestro X de la pantalla)
\r
526 // Es -j porque tomaremos positivo hacia la derecha.
\r
527 vX := mGetCameraman.mGetj.mMultiplicar(-1);
\r
528 x := v.mMultiplicarEsc( vX );
\r
529 // Ahora hallamos su proyeccion en el versor k (que sera nuestro Y de la pantalla)
\r
530 vY := mGetCameraman.mGetI;
\r
531 y := v.mMultiplicarEsc( vY );
\r
532 // Ahora hallamos el tamaño proporcional (un numero entre 0 y 1, donde 0 es
\r
533 // lo mas lejano y 1 lo mas cercano). Se calcula de la siguiente forma:
\r
534 // tam = 1 - |O| - aRadioMinimo
\r
535 // aRadioMaximo - aRadioMinimo
\r
536 // Donde O es el vector posicion respecto de la camara, y el " 1 - xxx ", es porque cuanto mas
\r
537 // lejos, menor tiene que ser el tamaño
\r
538 tmp := O.mGetModulo - mGetRadioMinimo;
\r
539 distMax := mGetRadioMaximo - mGetRadioMinimo;
\r
540 tam := 1 - (tmp / distMax);
\r
553 @param cameraman Objeto Volador en el que estará montada la cámara (obligatorio)
\r
554 @param angulo Angulo de apertura (visión) de la cámara (default = pi/4)
\r
555 @param maximo Distancia máxima en la que se considera visible a un objeto (default = 5000)
\r
556 @param distPantalla Distancia hasta la pantalla de proyección (default = 0). Si tiene el valor por default
\r
557 o cualquier valor menor o igual a cero, se usa el tamaño del objeto volador}
\r
558 constructor cCamaraMapa.create(cameraman: cObjetoVolador; angulo: tAngulo; maximo: tLongitud; distPantalla: tLongitud);
\r
560 inherited create(cameraman, angulo, 5000{max}, 1000{min} );
\r
561 mSetFiltro( cFiltroMapa.create( Cameraman, angulo, 5000{max}, mGetRadioMinimo ) );
\r
564 {** Obtiene la proyección del objeto volador en X, Y
\r
565 @param ov Objeto volador a proyectar.
\r
566 @param x Valor de la proyección en X.
\r
567 @param x Valor de la proyección en Y.
\r
568 @param tam Tamaño porcentual del objeto (cuanto mas lejos esta, mas pequeño es).
\r
570 procedure cCamaraMapa.mProyectar(ov: cObjetoVolador; var x, y, tam: tLongitud);
\r
583 // Lo primero que hay que hacer es hallar OI, para eso utilizaremos la siguiente formula:
\r
585 // En nuetro caso seria:
\r
586 // OI = O . aDistPantalla
\r
587 // aCameraman.mGetI . 0
\r
588 // Donde O = ov.mGetPosicion - mGetCameraman.mGetPosicion
\r
589 try // Probamos que el cameraman no este destruido
\r
590 desplazamiento := mGetCameraman.mGetk.mSetModulo( 3000 ); // Esta 3000 metros alejado del cameraman
\r
591 except // Si esta destruido cae en una excepcion
\r
592 on e: EAccessViolation do raise ECameramanDestruido.create; // Creamos una nueva excepcion especial
\r
594 posCam := mGetCameraman.mGetPosicion.mSumar( desplazamiento );
\r
595 desplazamiento.free;
\r
596 i := mGetCameraman.mGetk.mMultiplicar(-1);
\r
597 O := ov.mGetPosicion.mRestar( posCam );
\r
598 OI := cVector.create( O ).mMultiplicar( mGetDistPantalla / i.mMultiplicarEsc( O ) );
\r
599 // Ahora hallamos el vector v que pertenece a la pantalla, que nos dara las nuevas coordenadas respecto de ella.
\r
601 // En nuestro caso:
\r
602 // v = OI - ( aCameraman.mGetCoordenadas.mGetI . aDistPantalla )
\r
603 v := cVector.create( OI ).mRestar( i.mMultiplicar( mGetDistPantalla ) );
\r
604 // Ahora hallamos su proyeccion en el versor -j (que sera nuestro X de la pantalla)
\r
605 // Es -j porque tomaremos positivo hacia la derecha.
\r
606 vX := mGetCameraman.mGetj.mMultiplicar(-1);
\r
607 x := v.mMultiplicarEsc( vX );
\r
608 // Ahora hallamos su proyeccion en el versor k (que sera nuestro Y de la pantalla)
\r
609 vY := mGetCameraman.mGetI;
\r
610 y := v.mMultiplicarEsc( vY );
\r
611 // Ahora hallamos el tamaño proporcional (un numero entre 0 y 1, donde 0 es
\r
612 // lo mas lejano y 1 lo mas cercano). Se calcula de la siguiente forma:
\r
613 // tam = 1 - |O| - aRadioMinimo
\r
614 // aRadioMaximo - aRadioMinimo
\r
615 // Donde O es el vector posicion respecto de la camara, y el " 1 - xxx ", es porque cuanto mas
\r
616 // lejos, menor tiene que ser el tamaño
\r
617 tmp := O.mGetModulo - mGetRadioMinimo;
\r
618 distMax := mGetRadioMaximo - mGetRadioMinimo;
\r
619 tam := 1 - (tmp / distMax);
\r