elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 [2]
11  Programación / Programación C/C++ / Re: Ayuda con las matemáticas !!! en: 22 Abril 2013, 19:51 pm
Antes de nada, perdon por la tardanza.

Realmente no se a que te refieres con bounding box alineado al objeto, porque de programacion en C no voy muy alla, solo he hecho java. De todas formas voy a suponer que el bounding box delimita hasta donde llega el objeto (por su nombre) y quieres saber si hay colision entre dos de estas cajas. A no ser que ya haya metodos que faciliten el trabajo, detectar una colision lleva un poquito de trabajo desde mi punto de vista, pero supongamos algo:

Lo normal es que no haya colisiones, asi que un metodo que no requiera mucho trabajo por parte del PC y que si da true significa que NO HAY colisiones sera el siguiente (Ojo, si este algoritmo da true significa que no hay colisiones, pero si da false no significa nada, puede que las haya o puede que no, y tendremos que estudiarlo mas a fondo, pero en principio esta bien para ponerlo de condicion en un if y ahorrarnos computo si lo normal es que no se produzcan colisiones).

El principio es el siguiente: Tenemos dos bounding boxes, una centrada en P0 y otra en P1, si sus origenes distan mas de la distancia entre el punto de la BB en P0 mas lejano del centro (P0), sumado a la distancia del punto de la BB en P1 mas lejano del centro (P1), es imposible que haya colision.

Esto es, si el modulo del vector que va desde P0 hasta P1, desde ahora P01, es menor que dicha distancia, da false. Definamos algunas cosas:

P01 = ((XP0 - XP1)X + (ZP0 - ZP1)Z); Vector P01
MP01 = ((XP01)^2 + (ZP01)^2)^(1/2) = ((XP0 - XP1)^2 + (ZP0 - ZP1)^2)^(1/2) ; Modulo del vector P01

Ahora necesitamos la distancia al centro del punto(s) mas lejano. Siendo cuadrados, dichos puntos son los vertices, llamemos a la longitud del lado de la BB0, L0, y L1 para el lado de BB1. Voy a generalizarlo para rectangulos, pues en tu ejemplo has llamado de distinta forma a los lados (tam_x y tam_z), asi que supongo que no tienen porque ser iguales, de esta forma BB0 tiene los lados L0A y L0B, y BB1 tiene L1A y L1B. (Ejemplo: si la caja de tu dibujo fuera BB0, L0A seria tam_x y L0B sera tam_z o al reves, el orden es indiferente). Definimos:

DM0 = ((L0A/2)^2 + (L0B/2)^2)^(1/2); Mayor distancia desde P0 hasta un punto contenido en BB0, esto es, a cuanta distancia esta el punto mas externo de BB0.
DM1 = ((L1A/2)^2 + (L1B/2)^2)^(1/2); Analogo a DM0, pero para BB1.

Asi, si MP01 es menor que DM0 + DM1, el algoritmo da true y deberias estudiar mas a fondo lo que esta pasando con otro algoritmo que pensare luego para hacerlo con la mayor simpleza que se me ocurra. Sin embargo, si da false, puedes descartar toda posibilidad de colision.

Espero que te sirva de algo, aunque lo he hecho bastante rapido sin pensarlo mucho, asi que puede ser que tenga errores o que haya una manera mas rapida y facil de hacerlo y la he pasado por alto. Intentare ponerte que haria yo en caso de que diera false lo antes posible.

Un saludo.
12  Programación / Programación C/C++ / Re: Ayuda con las matemáticas !!! en: 11 Abril 2013, 16:26 pm
Siento si interrumpo, solo pasaba por aqui, vi el problema y me gustaria poner mi solucion a ver si la ven bien.

Trasladas el eje a p (Al final sumaras las coordenadas del vector (OP) que une el origen que finalmente uses y el punto p).

Ahora, conoces el vector Bp (B con coordenadas con respecto a P)  y quieres B'P (B' con coordenadas tambien con respecto a P). En tu ejemplo, Bp seria ((-tam_x/2)X + (tam_z/2) Z).

Sabiendo Bp conoces Xbp y Zbp, sus coordenadas, por lo que tambien:
El modulo de Bp: Mbp = ((Xbp^2)+(Zbp^2))^(1/2);
Su angulo con respecto al eje P: Abp=arctg(Zbp/Xbp);

Tambien sabes el angulo de rotacion, que sera positivo o negativo segun el sentido de rotacion, en tu ejemplo negativo: -Ar.

Asi que las coordenadas de B'p seran ((Mbp*Cos(Abp - Ar))X + (Mbp*Sen(Abp - Ar))Z)

Y tu punto B' con respecto al eje que quieras usar (O) sera:

B' = (Xb'p + Px, Zb'p + Pz); Donde (Xb'p , Zb'p) son las coordenadas del vector B'p, ya hallado ; y (Px , Pz) son las coordenadas del punto p con respecto a O.
Páginas: 1 [2]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines