Comunidad de diseño web y desarrollo en internet online

Fallo de calculo

Citar            
MensajeEscrito el 05 Jun 2009 08:59 am
Buenas aquí os dejo esta aplicación que estoy intentando hacer pero no me funciona del todo bien. Consta de dos puntos y una circunferencia de radio 60. Uno de los puntos (punto rojo) se utiliza para definir una recta desde él hasta el centro de la circunferencia y el otro (punto azul) se debe colocar en el punto de corte.
Tanto el punto rojo como la circunferencia se pueden arrastrar.
Para hacerlo, sabiendo las coordenadas del punto rojo y del centro de la circunferencia, he calculado la ecuación de la recta que los une y la ecuación de la circunferencia y al igualarlas me ha dado dos soluciones donde elijo una de ellas en función de la posición del punto rojo y de la circunferencia. Las coordenadas de la y las paso primero a negativas para hacer los cálculos y luego a positiva por la estructura que siguen las coordenadas en Flash.
El punto azul tiene este código:

Código :

onEnterFrame = function(){
//Da la pendiente de la recta y su posición, es decir m y a según la ecuación mx+a, en función de dos puntos
   recta=calcularRecta(_root.circ._x,_root.circ._y,_root.punto_P._x,_root.punto_P._y);
      x0=_root.circ._x;
      y0=-_root.circ._y;
      m=recta[0];
      a=recta[1];
      r=60;
//Calcula los dos puntos de corte
      corte1=-(m*a-x0-y0*m+Math.sqrt(-2*m*a*x0+2*x0*y0*m-y0*y0-a*a+r*r+2*y0*a-m*m*x0*x0+m*m*r*r))/(1+m*m);
      corte2=-(m*a-x0-y0*m-Math.sqrt(-2*m*a*x0+2*x0*y0*m-y0*y0-a*a+r*r+2*y0*a-m*m*x0*x0+m*m*r*r))/(1+m*m);
//Elige una solución
   if(_root.punto_P._x>_root.circ._x)
      sol=corte2;
   else
      sol=corte1;
   this._y=-(m*sol+a);
   this._x=sol;
   }
   
function calcularRecta(x0:Number,y0:Number,xactual:Number,yactual:Number):Array{
   var r:Array = new Array;
   r[0] = Math.tan((y0-yactual)/(xactual-x0));
   r[1] = -(r[0] * x0 + y0);
   return r;
   }


El caso es que funciona bien cuando la recta tiene poco ángulo pero cuando supera un ángulo más o menos de 45º ya el punto no se coloca donde debe.

Aquí está la aplicación para quien la quiera probar: http://www.gamegum.com/game/6383/punto-de-corte/

Necesito solucionar esto porque lo utilizo para un juego que estoy creando y que podeis probar ya, aunque tiene este fallo, aquí:
http://rapidshare.com/files/241032231/Battles_of_Civilizations.rar.html

Por javico

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Jun 2009 09:32 am
Una idea que no sé si te servirá: Al ser una circunferencia, la distancia entre el centro de ésta y el punto azul siempre va a ser igual al radio. Por lo tanto, si ya has hallado la ecuación de la recta que une el centro con el punto rojo, sólo tendrías que colocar el punto azul a una distancia igual al radio del centro de la circunferencia.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 05 Jun 2009 10:17 am
La idea es buena, pero ¿como lo hago para colocarlo a esa distancia? ¿hay alguna función que lo haga? Le daré vueltas a eso a ver si encuentro algo

Por javico

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Jun 2009 11:34 am
Problema resuelto :lol: Vaya una tontería. Resulta que para calcular la pendiente no hay que hacer la tangente y yo la estaba haciendo por eso no salía. Al quitar la tangente en el cálculo de la pendiente todo resuelto:

Código ActionScript :

function calcularRecta(x0:Number,y0:Number,xactual:Number,yactual:Number):Array{
   var r:Array = new Array;
   r[0] =(y0-yactual)/(xactual-x0);
   r[1] = -(r[0] * x0 + y0);
   return r;
   }

Por javico

5 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Jun 2009 08:05 am

javico escribió:

La idea es buena, pero ¿como lo hago para colocarlo a esa distancia? ¿hay alguna función que lo haga? Le daré vueltas a eso a ver si encuentro algo

Pues la idea es utilizar únicamente la pendiente de la recta, y calcular la posición del punto como algo parecido a esto:
var pendiente:Number = (y0 - yactual) / (xactual - x0);
punto._x = circulo._x + r * Math.cos(pendiente);
punto._y = circulo._y + r * Math.sin(pendiente);
pero bueno, si ya te funciona quizá sea mejor que no te compliques:

PD: Por cierto, he bajado el archivo de rapidshare, y aunque no he podido probarlo (no está el .fla), por lo que he visto el juego tiene muy buena pinta :).

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 06 Jun 2009 11:27 am
Bueno, me voy a retractar de lo que he puesto en el mensaje anterior antes de que lo lea algún matemático :). La forma de hacerlo sería:

Código ActionScript :

onEnterFrame = function ()
{
   var pendiente:Number = (_root.circ._y - _root.punto_P._y) / (_root.circ._x - _root.punto_P._x);
   var angulo:Number = Math.atan(pendiente);
   r = 60;
   var aux:Number = (_root.circ._x < _root.punto_P._x) ? 1 : -1;
   this._x = _root.circ._x + aux * r * Math.cos(angulo);
   this._y = _root.circ._y + aux * r * Math.sin(angulo);
};

Y no te hace falta usar la función de cálculo de la recta, ni hallar los puntos de corte.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 14 Jun 2009 12:52 am
Gracias por la respuesta pero ya conseguí solucionarlo. Respecto al juego ya he avanzado bastante y en el archivo no meti el fla, la verdad es que no me gusta compartirlo pero esta vez haré una excepción. Si lo quieres aquí está una nueva versión y el fla. Hay algunas partes del código un poco chapuceras porque eran mis comienzos con AS :lol: La parte de campaña está en desarrollo y sólo podrás atacar tú. La idea es que la IA también ataque.

http://www.mediafire.com/?sharekey=1b3dc6bf2de38419aaca48175a79d1c3e04e75f6e8ebb871

Por javico

5 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.