Autor |
Mensaje |
dr4
Nivel 1
Registrado: 18 Dic 2014
Mensajes: 2
|
|
muy buenas! he leído que ayudáis con temas matemáticos y yo tengo algo que me esta deteniendo para desarrollar un juego y me gustaría saber si podrías ayudarme , veréis, el juego tiene rebotes en un eje de coordenadas, necesito conseguir una formula que me diga cuando una pelota está tocando un cuadrado en diagonal por cualquiera de sus lados, la idea es que rebote en diagonal en cuanto lo toque (http://s2.subirimagenes.com/otros/previo/thump_9208278rebote-rectangulo.jpg),pero eso ya puedo programarlo yo,lo que necesito es una formula para saber cuando la pelota esta tocando y cuando no, os paso la formula que utilizo por ejemplo para que la pelota rebote contra un rectángulo para que os hagais una idea de lo que necesito
circleDistanceX = Math.abs(circle.centrox - posicionxrectangulo - anchorectangulo/2);
circleDistanceY = Math.abs(circle.centroy - posicionydelrectangulo - alto del rectangulo/2);
if (circleDistanceX > (anchodelrectangulo/2+ circle.radio)) { return false; } (si esto pasa el circulo no esta tocando el rectangulo)
if (circleDistanceY > (altodelrectangulo/2 + circle.radio)) { return false; } (si esto pasa el circulo no esta tocando el rectangulo)
if (circleDistanceX <= (ancho del rectangulo/2)) { return true; } (es menor o igual,el circulo esta tocando el rectangulo)
if (circleDistanceY <= (altodelrectangulo/2)) { return true; } (es menor o igual,el circulo esta tocando el rectangulo)
|
|
|
|
|
|
|
|
|
Huey 7
Nivel 6
Registrado: 03 Mar 2010
Mensajes: 267
Carrera: Electrónica
|
|
Si entendí bien lo que querés, y suponiendo que hice bien las cuentas, definí:
Código:
|
circleDistanceX = circle.centrox - posicionxrectangulo - anchorectangulo/2
circleDistanceY = circle.centroy - posicionydelrectangulo - altodelrectangulo/2
|
Es decir, sin el Math.abs(). BTW, supongo que la "posición del rectángulo" (posicionxrectangulo y posicionydelrectangulo) es la de uno de sus cuatro vértices, ¿no?
Para que la pelota esté en condiciones de tocar uno de los cuatro bordes se tienen que cumplir simultáneamente estas 2 condiciones:
Código:
|
Math.abs(circleDistanceX * Math.cos(inclinacion) + circleDistanceY * Math.sin(inclinacion)) >= anchodelrectangulo/2 + circle.radio
Math.abs(circleDistanceY * Math.cos(inclinacion) - circleDistanceX * Math.sin(inclinacion)) <= altodelrectangulo/2
|
O simultáneamente estas 2 condiciones:
Código:
|
Math.abs(circleDistanceY * Math.cos(inclinacion) - circleDistanceX * Math.sin(inclinacion)) >= altodelrectangulo/2 + circle.radio
Math.abs(circleDistanceX * Math.cos(inclinacion) + circleDistanceY * Math.sin(inclinacion)) <= anchodelrectangulo/2
|
Donde inclinacion sería el ángulo de rotación del rectángulo, en las unidades que acepten las implementaciones del seno y coseno en el lenguaje / biblioteca que estés usando (radianes salvo que sea alguna implementación exótica). Si la desigualdad que tiene circle.radio es una igualdad para los valores de circle.centrox y circle.centroy, la pelota está tocando, si es una desigualdad estricta, no. Si no se cumple ninguno de los dos conjuntos de desigualdades, la pelota está lejos del rectángulo y no se lo puede cruzar en su camino en el corto plazo.
Cuando inclinacion vale 0 estás en el caso "horizontal", en el que las expresiones se reducen a lo que escribiste. Sólo que vos consideraste una sola de las desigualdades, y te estás olvidando de otra, que contempla que el rectángulo tiene dimensiones finitas. Si no la considerás, probablemente tu pelota termine rebotando contra una pared invisible a varios pixels de distancia del rectángulo
|
|
|
|
_________________
|
|
|
|
|
|
|
Ver tema siguiente
Ver tema anterior
Podés publicar nuevos temas en este foro No podés responder a temas en este foro No podés editar tus mensajes en este foro No podés borrar tus mensajes en este foro No podés votar en encuestas en este foro No Podéspostear archivos en este foro No Podés bajar archivos de este foro
|
Todas las horas son ART, ARST (GMT - 3, GMT - 2 Horas)
Protected by CBACK CrackerTracker365 Attacks blocked.
|
|
[ Tiempo: 0.2779s ][ Pedidos: 20 (0.2152s) ] |