Tutorial sobre Detección de colisiones

Si tienes alguna duda y crees que alguien podría resolverla, ponla aquí. || If you have any doubt about programming, post it here.

Moderador: Administradores

Avatar de Usuario
na_th_an
256 bits
256 bits
Mensajes: 11874
Registrado: 22 Abr 2005 13:25
Contactar:

Mensajepor na_th_an » 19 Sep 2006 12:05

Benway escribió:Entonces... para añadirlo al tutorial... a ver si lo he entendido...

Si tenemos unos catetos A y B (que serían las diferencias de las coordenadas: A = x2 - x1 y B = y2 - y1), ¿la distancia en píxeles entre ambos se calcularía Distancia = ArcoTangente (B / A)? ¿Y eso en C se pondría así Distancia = atan2 (B, A);?


Nononono, da el alpha (el ángulo). Creo que es más útil para el cálculo de trayectorias que para otras cosas, y necesario para poder aplicar lo de las reglas trigonométricas.

No sé si os acordaréis de los números complejos... Pues esto es: el módulo (la distancia) se calcula con pitágoras, y el argumento (el ángulo) con el arcotangente de b/a.

Código: Seleccionar todo

d = sqrt(b² + a²)
alpha = arctg (b/a)


Mi respuesta de arriba era a Alx, que preguntaba por una forma más directa de calcular el ángulo.
Última edición por na_th_an el 19 Sep 2006 12:08, editado 1 vez en total.

Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Mensajepor Benway » 19 Sep 2006 12:07

na_th_an escribió:
Benway escribió:Entonces... para añadirlo al tutorial... a ver si lo he entendido...

Si tenemos unos catetos A y B (que serían las diferencias de las coordenadas: A = x2 - x1 y B = y2 - y1), ¿la distancia en píxeles entre ambos se calcularía Distancia = ArcoTangente (B / A)? ¿Y eso en C se pondría así Distancia = atan2 (B, A);?


Nononono, da el alpha (el ángulo). Creo que es más útil para el cálculo de trayectorias que para otras cosas.


Ahhhh! MUCHAS GRACIAS, nath! Si es que ya os digo que tantos años sin tocar un libro de mates no es sano! ;) :D

Entonces, Kovenan, ya tenemos la solución ;)...

Para calcular distancias (y por lo tanto colisiones): La fórmula de la raíz cuadrada de la suma de los catetos al cuadrado

Para calcular trayectorias: La arcotangente para obtener el ángulo
Un saludo.
Imagen - Imagen - Imagen

Avatar de Usuario
Kovenan
128 bits
128 bits
Mensajes: 1630
Registrado: 14 Sep 2006 15:16

Mensajepor Kovenan » 19 Sep 2006 12:32

Si al final era pasar polar a radial segun interese :P,

Si formulas trigonometricas hay miles pero supongo que cuanto mas simple mas rapido sera el juego.

Las formulas que das cuando hablas de catetos son modulos de los vectores, tendrias que trabajar en coordenadas,para poder tener el control exacto.

En topografia se trabaja todo por coordenadas, asi que supongo que aqui se hara igual.

a ver si soy capaz de hacer un par de dibus aclaratorios.

Las trayectorias ya es un tema mucho mas complejo

Podria ser esto un tema de Retro-estudios.

Avatar de Usuario
na_th_an
256 bits
256 bits
Mensajes: 11874
Registrado: 22 Abr 2005 13:25
Contactar:

Mensajepor na_th_an » 19 Sep 2006 12:38

¡Sólo falta que nos pongamos a discutir aquí cómo calcular curvas de Bezier y splines a bajo coste computacional! :lol:

(joder, que esa asignatura la aprobé copiando... :P)

Avatar de Usuario
Alx
256 bits
256 bits
Mensajes: 5895
Registrado: 25 Dic 2005 19:42
Ubicación: Barcelona

Mensajepor Alx » 19 Sep 2006 12:48

Kovenan escribió:Yo no se que algoritmos se usan o formulas para los juegos,pero no entiendo para que se pueden usar las formulas trigonometricas de un triangulo rectangulo, teniendo las coordenadas, algún ejemplo??

Me ha gustado esto de las colisiones

SALUDOS.


Kovenan, en este programa que hice hace un tiempo podrás ver lo que te dice Ben para movimientos circulares o elípticos.

La única diferencia entre uno circular y elíptico es que en el circular el cálculo de los dos catetos se hace con un mismo radio y el elíptico se aplica Seno y Coseno pero con dos radios, uno mayor y otro menor.
Entoces por ejemplo Coseno con radio mayor para vector X y Seno con radio menor para vector Y y obtienes la elípse.

En el programa pordrás ver que si los dos vectores los pones a 100 por ejemplo deja de ser elíptico y se pone circular.

El programa es este http://fileanchor.com/63171-d te recomiendo que utilices la tecla SPACE pues resolverá todas tus dudas al completo XD!

----

Gracias Nath :wink:
Es lo mismo que le decía a Ben, calcular la tangente y luego hacer la inversa es lo mismo que el arcotangente.
La arcotangente es la función inversa de la tangente.
Muchas gracias porque tenía que buscar la fórmula en una tabla y me daba un palazo tremendo :roll:

----

No veas si estamos matemáticos ¿no?...ufff.....
1:1 Amarás al Spectrum por encima de todas las cosas

Avatar de Usuario
Kovenan
128 bits
128 bits
Mensajes: 1630
Registrado: 14 Sep 2006 15:16

Mensajepor Kovenan » 19 Sep 2006 12:49

jejejeej es verdad, yo lo unico que "defiendo" es que si en el tuto todo esta con coordenadas x,y que se calculen las distancias por coordenadas.
Que sea cual sea el tipo de movimiento o trayectoria en 2D en cada instante cada objeto ocupa una X y una Y y que la forma mas facil para calcular la distancia entre esos dos punto es por coordenadas.

Alx un puntazo lo del SPACE :P
SALUDOS.

Avatar de Usuario
rochete
16 bits
16 bits
Mensajes: 229
Registrado: 24 Jun 2006 01:02
Ubicación: VALENCIA

Re: Tutorial sobre Detección de colisiones

Mensajepor rochete » 09 Nov 2006 20:45

Benway escribió:A petición de Alx, me he estado currando un mini tutorial sobre la detección de colisiones. Es bastante básico, no esperéis maravillas, pero creo que puede ser útil para quien esté empezando a programar.

Lo podéis bajar de...

http://www.telefonica.net/web2/panik/docs/Colisiones.doc

Ya me diréis qué os parece...

Aportaciones y CORRECCIONES serán muy bienvenidas


Podría ser en formato PDF ? :D

Ya lo he leido.. Muy interesante. De esos que me guardaré :wink:
Última edición por rochete el 09 Nov 2006 20:57, editado 1 vez en total.
VoIP para operadores
http://www.tucall.com

Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Re: Tutorial sobre Detección de colisiones

Mensajepor Benway » 09 Nov 2006 20:49

tecnoxarxa escribió:
Benway escribió:A petición de Alx, me he estado currando un mini tutorial sobre la detección de colisiones. Es bastante básico, no esperéis maravillas, pero creo que puede ser útil para quien esté empezando a programar.

Lo podéis bajar de...

http://www.telefonica.net/web2/panik/docs/Colisiones.doc

Ya me diréis qué os parece...

Aportaciones y CORRECCIONES serán muy bienvenidas


Podría ser en formato PDF ? :D


Jajajajajajaja...

Enga, me has convencido... para que luego digas! :P

http://www.telefonica.net/web2/panik/docs/Colisiones.odt

¿Así te vale? :P
Un saludo.
Imagen - Imagen - Imagen

Avatar de Usuario
Konamito
256 bits
256 bits
Mensajes: 6394
Registrado: 01 Jun 2005 17:26
Ubicación: Tenerife
Contactar:

Mensajepor Konamito » 09 Nov 2006 20:50

Coño tecnoxarxa, eso lo puedes hacer tú mismo con el PDF Creator, enviando a imprimir y eliges luego como "impresora" el programa y ya te sale un PDF como un sol.

Claro que si no tienes el WORD instalado en tu PC... no sé cómo se hará con el Open Office. A ver si puedo colgarte aquí esta noche o mañana una versión PDF para tí :D
Konamito.com, tu web MSX en español

http://www.konamito.com

Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Mensajepor Benway » 09 Nov 2006 20:50

En el OpenOffice es más fácil, Konamito... te crea el PDF directamente ;)
Un saludo.
Imagen - Imagen - Imagen

Avatar de Usuario
Konamito
256 bits
256 bits
Mensajes: 6394
Registrado: 01 Jun 2005 17:26
Ubicación: Tenerife
Contactar:

Mensajepor Konamito » 09 Nov 2006 20:52

Benway escribió:En el OpenOffice es más fácil, Konamito... te crea el PDF directamente ;)


Pues no lo sabía :oops: Pero sí que sé que nuestro amigo tecnoxarxa es un poco vaguete y no "baguette" :lol: :lol: :lol:

Si no es por tí, Ben...
Konamito.com, tu web MSX en español

http://www.konamito.com

Avatar de Usuario
rochete
16 bits
16 bits
Mensajes: 229
Registrado: 24 Jun 2006 01:02
Ubicación: VALENCIA

Mensajepor rochete » 09 Nov 2006 20:58

Konamito escribió:Coño tecnoxarxa, eso lo puedes hacer tú mismo con el PDF Creator, enviando a imprimir y eliges luego como "impresora" el programa y ya te sale un PDF como un sol.

Claro que si no tienes el WORD instalado en tu PC... no sé cómo se hará con el Open Office. A ver si puedo colgarte aquí esta noche o mañana una versión PDF para tí :D


Pues era un poco de coña.. ya me conoceís.. Lo he abierto con el openoffice a la perfección.. sin problemas. Creo se ve genial.

saludos !!!
VoIP para operadores
http://www.tucall.com

Avatar de Usuario
rochete
16 bits
16 bits
Mensajes: 229
Registrado: 24 Jun 2006 01:02
Ubicación: VALENCIA

Mensajepor rochete » 09 Nov 2006 21:00

Benway escribió:En el OpenOffice es más fácil, Konamito... te crea el PDF directamente ;)


Si solo tienes que pulsar el boton pdf y te crea el pdf de cualquier documento. Sin tener que piratear un tal ado... pdf crreator o similar ?

Detodas formas ya me he guardado el odt

Muchas gracias por el odt !!!!!!!!!!!!!!! La comunidad del bien te lo agradecerá !! jajajaja

un abrazo !!!!!!!!!
VoIP para operadores
http://www.tucall.com

Avatar de Usuario
santoto
8 bits
8 bits
Mensajes: 13
Registrado: 23 Jun 2007 15:26

Mensajepor santoto » 24 Jun 2007 01:02

Hola, este es mi primer mensaje en esta comunidad, escribo para agradecer por el tutorial, la verdad es lo mejor q encontre luego de 3 dias de google con relacion al tema de colisiones, y por eso queria pedir solicitar la ayuda de otros programadores, recien estoy dando mis primeros pasos en esto de la programacion de videojuegos y vengo un poco mas avanzado en el tema de c++ (aunque no tanto :oops: ) por eso queria pedirles si alguno fuera tan de aclararme las dudas que surgieron.

La primera es acerca de la creacion de la mascara, tema que no esta en el tuto pero encontre en otro foro un codigo escrito por Benway, aca lo dejo:

Código: Seleccionar todo

for (n = 0; n < AnchoSprite; n++)
    for (m = 0; m < AltoSprite; m++)
        if (getpixel (Sprite, n, m) != COLOR_TRANSP)
            Mascara [m] += 1 << (AnchoSprite - n);



Bueno viendo este codigo supongo q la variable COLOR_TRANSP es una variable q contiene el color que previamente elegimos como transparente. Y en la siguiente linea vienen los problemas, tal vez es muy obvio pero soy muy nuevo en esto.

- de que tipo es el vector Mascara?
- porq solo se tienen en cuenta las filas para crear la mascara?
- podrian darme algun ejmplo sencillo de como utilizarla

Avatar de Usuario
na_th_an
256 bits
256 bits
Mensajes: 11874
Registrado: 22 Abr 2005 13:25
Contactar:

Mensajepor na_th_an » 24 Jun 2007 01:24

Según veo está creando una imagen binaria recorriendo un sprite, o algo así.

Avatar de Usuario
santoto
8 bits
8 bits
Mensajes: 13
Registrado: 23 Jun 2007 15:26

Mensajepor santoto » 24 Jun 2007 03:33

na_th_an escribió:Según veo está creando una imagen binaria recorriendo un sprite, o algo así.


si, se lo q hace pero no entiendo como. Agradeceria si alguien podria pasarme el codigo de la funcion del tutorial de colisiones junto con algun codigo para generar la mascara implementados en un ejemplo sencillo para asi poder entender como funciona.

Avatar de Usuario
AugustoRuiz
128 bits
128 bits
Mensajes: 1726
Registrado: 24 May 2006 08:35
Ubicación: Madrid
Contactar:

Mensajepor AugustoRuiz » 24 Jun 2007 11:16

santoto escribió:si, se lo q hace pero no entiendo como.


Código: Seleccionar todo

for (n = 0; n < AnchoSprite; n++)
    for (m = 0; m < AltoSprite; m++)
        if (getpixel (Sprite, n, m) != COLOR_TRANSP)
            Mascara [m] += 1 << (AnchoSprite - n);


A ver... Según lo entiendo yo:

Hace un bucle recorriendo las columnas, y dentro otro bucle recorriendo las filas. Si te fijas, n indica la columna actual, y m indica la fila. Por lo tanto, para cada pixel, si el pixel actual no es transparente, está metiendo en el array Mascara, en lo posición de la fila actual un valor que es igual a 2 elevado a (AnchoSprite - la columna actual).

Por lo tanto, este código es válido siempre y cuando el ancho del sprite sea menor o igual a 64 (si máscara es de tipo array de long) o menor o igual a 32 (si máscara es de tipo array de int) o menor o igual a 8 (si máscara es de tipo array de unsigned byte).

Es decir, según el tipo de array que sea Mascara, estarás limitando el ancho máximo del sprite.

Esto viene por el hecho de que desplazar una posición a la izquierda es igual a multiplicar por dos el número que desplazas. Y en C el operador de desplazamiento a la izquierda es <<

Un ejemplo: Si el sprite tiene un ancho de 8 pixels, y tienes una fila del sprite con los siguientes colores (T = Transparente, O = otro color):

Código: Seleccionar todo

TTOOOTTO


El código generará el siguiente valor:

[code]00111001[code]

Ya que para cada color que no sea transparente, coloca un 1 en la posición en la que está en la fila actual.

1 << 5 = 00100000
1 << 4 = 00010000
1 << 3 = 00001000
1 << 0 = 00000001

La suma total es 00111001.

Saludos!

Avatar de Usuario
santoto
8 bits
8 bits
Mensajes: 13
Registrado: 23 Jun 2007 15:26

Mensajepor santoto » 24 Jun 2007 13:35

a ver si entendi, el array guarda un numero en decimal y dependiendo del tipo sabemos la cantidad de bits, y luego con los operadores << >> y AND(&) lo tratamos como si fuea un numero binario.
Por ejemplo, con el codigo q me diste

Código: Seleccionar todo

TTOOOTTO

-primero inicializo el vector con 0

-en la primer columna no pasa nada,

-en la segunda columna tampoco,

-ahora en la tercer columna se le asigna:

Código: Seleccionar todo

(1 << (ancho_del_sprite - columna actual));
//en este caso seria: 1 << (8-2) = 1 << 6


-Se lo trabaja como binario y queda

Código: Seleccionar todo

1 << 6 = 1000000 //binario
1 << 6 = 64 //decimal

en el vector queda almacenado 64.

- Continuamos con la iteracion, en la cuarta pasada tambien hay un pixel con color entonces:

Código: Seleccionar todo

vector[fila]+=1 << (ancho_del_sprite - columna actual);
//Se calcula 1 << (8-3) = 1 << 5 = 00100000 = 32
//Se le suma al anterior 01000000 + 00100000 = 01100000 = 32+64 = 96

ahora el vector tiene almacenado un valor de 96 en decimal y 01100000 en binario

- Y asi susecivamente.

Bueno al parecer lo entendi, pero ahora suponiendo un caso sencillo como este, yo utilizo un vector del tipo long (32 bits)y tengo una imagen con un ancho de 40 pixeles como lo guarda, osea haciendolo mas sencillo si tengo un vector de 8 bits (int) y una imagen de 12 pixeles de ancho como lo guardo?
Si el numero maximo que puede almacenar es 11111111 y la imagen es

Código: Seleccionar todo

 TOOOOTTOOOOT
quedaria 011110011110 pero no entra como lo guardo a eso?

Avatar de Usuario
AugustoRuiz
128 bits
128 bits
Mensajes: 1726
Registrado: 24 May 2006 08:35
Ubicación: Madrid
Contactar:

Mensajepor AugustoRuiz » 24 Jun 2007 14:41

santoto escribió:a ver si entendi, el array guarda un numero en decimal y dependiendo del tipo sabemos la cantidad de bits, y luego con los operadores << >> y AND(&) lo tratamos como si fuea un numero binario.


No hay diferencia entre un número en decimal y otro en binario (para el ordenador, quiero decir). Son dos representaciones de lo mismo, pero al final el ordenador trabaja siempre en binario. Por lo demás, veo que lo has pillao ;)

santoto escribió:Bueno al parecer lo entendi, pero ahora suponiendo un caso sencillo como este, yo utilizo un vector del tipo long (32 bits)y tengo una imagen con un ancho de 40 pixeles como lo guarda, osea haciendolo mas sencillo si tengo un vector de 8 bits (int) y una imagen de 12 pixeles de ancho como lo guardo?


Tienes varias opciones:

Una podría ser coger un array de long (64 bits). O para minimizar espacio, puedes hacer que el array máscara use varias posiciones por fila en vez de limitar el ancho máximo. Por ejemplo, para un vector de 8 bits y una imagen de 12 píxeles, podrías tener un array de tipo unsigned char donde cada fila ocupa 2 posiciones. (con lo cual podrías tener un sprite de hasta 16 píxeles de ancho). Y para el caso del ancho de 40 píxeles, un array de tipo unsigned char donde cada fila ocupe 5 posiciones del array (8*5 = 40).

Avatar de Usuario
santoto
8 bits
8 bits
Mensajes: 13
Registrado: 23 Jun 2007 15:26

Mensajepor santoto » 24 Jun 2007 16:28

Gracias por la ayuda, creo que ahora puedo implementar el metodo de pixel perfect en mi clase, pero ahora una duda mas esta con respecto a la funcion de colision (la del tutorial), aca la dejo por si no lo tenes a mano

Código: Seleccionar todo

typedef unsigned long word;
typedef struct {
        int LongX;
        int LongY;
        int Fotog;
        int Words;
        word** MaskData;} mask;

bool Sprite::ColisionPP (Sprite *Otro) {

    int n,m, Tamano;
    int x1, x2, y1, y2;
    int dx1, dx2, w1, w2, iw2, iw1, dy1, dy2;
    mask *Mask1, *Mask2;
    word Comp1, Comp2;
    Mask1 = VerMascara();
    Mask2 = Otro->VerMascara();
    Tamano = sizeof (word) * 8;
    w2 = 0; w1 = 0;
    x1 = VerX();
    x2 = Otro->VerX();
    y1 = VerY();
    y2 = Otro->VerY();
   
      if (x1>x2) {
           dx1 = 0;
           dx2 = (x1 - x2);
           while (dx2>=Tamano) {
                 dx2-=Tamano;
                 w2++;}
           }
        else {
           dx1 = (x2 - x1);
           dx2 = 0;
           while (dx1>=Tamano) {
                 dx1-=Tamano;
                 w1++;}
           }

       if (y1>y2) {
           dy1 = 0;         
           dy2 = y1 - y2;}
         else {
           dy1 = y2 - y1;
           dy2 = 0;}
       
       while ((dy1<Mask1>LongY) && (dy2<Mask2>LongY)) { // Bucle vertical

          iw1 = w1; iw2 = w2;     
          while   ((iw1<Mask1>Words) && (iw2<Mask2>Words)) { // Bucle horizontal
           
             Comp1 = Mask1->MaskData [dy1][iw1] >> dx1; // El comp del 1 es el 1 desplazado a la derecha
             Comp2 = Mask2->MaskData [dy2][iw2] >> dx2; // Id con el 2
         
             if ((dx1!=0) && (iw1<Mask1>Words-1)) // Si existe...
                Comp1 += Mask1->MaskData [dy1][iw1+1] << (Tamano-dx1); // Añadir la parte de la izqda

             if ((dx2!=0) && (iw2<Mask2>Words-1))
                Comp2 += Mask2->MaskData [dy2][iw2+1] <<Tamano>MaskData [dy1][iw1] >> dx1; // El comp del 1 es el 1 desplazado a la derecha
             Comp2 = Mask2->MaskData [dy2][iw2] >> dx2; // Id con el 2
         
             if ((dx1!=0) && (iw1<Mask1>Words-1)) // Si existe...
                Comp1 += Mask1->MaskData [dy1][iw1+1] << (Tamano-dx1); // Añadir la parte de la izqda

             if ((dx2!=0) && (iw2<Mask2>Words-1))
                Comp2 += Mask2->MaskData [dy2][iw2+1] << (Tamano-dx2);


me parece que los operadores <<y>> estan al reves, te lo explico con un ejemplo de como lo planteo yo:

supongamos que tengo q comparar:

Código: Seleccionar todo

c1=          01111110   
c2=00100010|01110110|10011011


si "|" separa una cadena de 8 bits y quiero comparar la segunda cadena de c2 con c1, puede observarse que hay una diferencia de un bit, si solo se puede dezplazar c2 las operaciones a realizar serian:

Código: Seleccionar todo

b1 = c2.cadena2 <<1>> (8-1) // = 00000001
nc = b1 +b2; // =1110111


ahora seria posible la comparacion entre las cadenas, pero si utilizo la funcion de colision, la parte en la que se realizan estos calculos usa los operadores <<y>> de forma inversa a mi ejemplo y quedaria:

Código: Seleccionar todo

b1 = c2.cadena2 >> 1 // = 00111011
b2 = c2.cadena3 << (8-1) // = 00110110
nc = b1 +b2; // = 01110001


y si no me equivoco es erroneo. Esta es la forma segun yo lo veo, talvez estoy haciendo mal las cosas y agradeceria si me podrias aclarar cual de las dos formas es la correcta.

Avatar de Usuario
Benway
Site Admin
Site Admin
Mensajes: 9241
Registrado: 24 Dic 2005 10:18
Ubicación: Madrid
Contactar:

Mensajepor Benway » 28 Jun 2007 23:19

Te cuento...

Es que lo que hace mi método es ir comparando cada "word" de la máscara con el que corresponda de la otra máscara mientras exista.

Primero lo hice que sólo podía valorar colisiones de sprites de máximo 32 píxels de ancho. Así solo hay que comparar uno de esos "words" (cadenas en tu ejemplo).

Si uno de los objetos está desplazado cuatro píxeles hacia la derecha del otro (teniendo 32 píxeles ambos, es decir, una única "cadena" para la comparación), habrá que desplazar su máscara cuatro bits a la derecha para hacer el AND... o la máscara del otro objeto 4 bits a la izquierda, que daría el mismo resultado... sin ser lo mismo.

¿me entiendes ahora mejor?

Lo que pasa es que ese método ya está "apañado" para funcionar con cualquier ancho de sprite, y con cualquier diferencia entre los anchos de los dos.

Intenta pensarlo como te digo, con objetos de igual ancho que quepa en una sóla cadena. Si tienes dos de 8 píxeles:

01101100 y 0000011

Y el primero está situado dos píxeles a la derecha del segundo:

Código: Seleccionar todo

     01101100
00000011


... te sale una colisión como un piano... ¿cómo sacar eso matemáticamente?

Código: Seleccionar todo

(01101100 >> 2) AND 00000011


que te da como resultado 00000011 ... o lo que es lo mismo, 3, o, lo que es importante, NO ES IGUAL a 0.

Tambien podrías calcularlo así:

Código: Seleccionar todo

01101100 AND (00000011 << 2)


que da como resultado 12, pero sigue siendo distinto de 0... es decir, hay colisión.
Un saludo.
Imagen - Imagen - Imagen

Avatar de Usuario
Z80user
16 bits
16 bits
Mensajes: 94
Registrado: 15 Ene 2006 21:49
Ubicación: Ciudad Real
Contactar:

Re:

Mensajepor Z80user » 15 Ago 2010 23:16

La raiz cuadrada de dos numeros al cudrado, para programarla, es relativamente lenta para un Z80 ejecutarla, asi que he creado una funcion que sustituyo sqrt(X^2+Y^2) por ((X+Y)*3+[X-Y])/4

La funcion de pitagoras es como un cuadrado, al que se le ha dado un bocado esferico, La funcion mia, tiene 2 restas identicas a la funcion de pitagoras, creando 2 planos, en lugar de 2 planos curvos.

Ventajas en comparacion con la de pitagoras
-.Solo utiliza registros de 8 bits, y no necesita de operaciones de 16 bits.
-.Es bastante mas rapida. solo usa un valor absoluto de una resta y sumas.
-.Tiene algun error de precision, cuando no esta en alguna de las 8 direcciones normales, tiene algo de menos precision.
-.Usando registro de 8 bits, tiene el valor maximo en 84 pixels aproximadamente, la de pitagoras apartir de 16 ya no sirve.

Si se usase una tabla, para valores pequeños, ocuparia mucha memoria.
el mayor error es de 12 con algo para valores entre el 0 y el 83, que es con los que he probado la rutina con el Open Office (tarda mucho en crear el dibujo en 3D)
Tipo de grafico: Columna, con la opcion de 3D activada y seleccionar el 4º, las graficas son parecidas, salvo que la de pitadoras, es ondulada, y la mia son 2 planos.

mentalthink
8 bits
8 bits
Mensajes: 8
Registrado: 09 Jul 2011 18:59

Re: Tutorial sobre Detección de colisiones

Mensajepor mentalthink » 31 Jul 2011 12:58

Un tutorial, buenisimo, de hecho voy a implementar lo que comentas del Boundig BOX, pero de forma circular en mi juego, ya que no sabía como se hacía.

Gracias por tomarte el tiemo en compartir tú trabajo , porque está realmente muy bien elaborado y explicado.

Un saludo
Iván J


Volver a “Programación | Programming”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado