ActionScript: Duda con fragmento de código (¡Matemáticas!)

Iniciado por Alejandro CabreraH, 20 Enero 2011, 14:54 PM

0 Miembros y 1 Visitante están viendo este tema.

Alejandro CabreraH

Buscando por internet he encontrado el siguiente código, funciona a la perfección y tras toquetearlo un poco hace lo que quiero.


var fuerza_repulsiva = 50;
var distancia_minima = 5;

var coordenada_x_final = this._x;
var coordenanda_y_final = this._y;

this.onEnterFrame = function(){
   
   var distancia_x = this._x - _root._xmouse;
   var distancia_y = this._y - _root._ymouse;
   
   var distancia_existente = Math.sqrt(distancia_x * distancia_x + distancia_y * distancia_y);
   
   if(distancia_existente < distancia_minima){
       
      var incremento_x = distancia_x * (distancia_existente + fuerza_repulsiva) / distancia_existente;
      var incremento_y = distancia_y * (distancia_existente + fuerza_repulsiva) / distancia_existente;
       
      coordenada_x_final = this._x + incremento_x;
      coordenada_y_final = this._y + incremento_y;
       
   }
   
   var incremento_x = (coordenada_x_final - this._x) * .25;
   var incremento_y = (coordenada_y_final - this._y) * .25;
   
   this._x = this._x + incremento_x;
   this._y = this._y + incremento_y;
   
};


Cuando me topo con un código así voy analizando línea por línea y cambiando algunos nombres de variables hasta entender que hace en cada momento, pero una parte de este me ha podido.

Citar

Explicación y duda

   1. Primero calculamos la distancia entre el mouse y el objeto en el eje X, posteriormente hacemos lo mismo en el eje Y.

   2. A continuación calculamos la distancia real entre los dos puntos mediante el teorema de Pitágoras usando los dos datos anteriores.

   3. Abrimos el condicional. Si la distancia entre el mouse y el objeto es menor a lo establecido:

            Fijamos la cantidad de píxels que se debe alejar nuestro objeto con operaciones que no logro comprender.

            Fijamos la posición final del objeto tras el desplazamiento. No comprendo la finalidad, ya hacemos esto al final del código.

   4. Volvemos a fijar el incremento para alejar nuestro objeto. ¿Por qué? Si se ejecutara el condicional tendríamos repetida la declaración de las variables "incremento_x" e "incremento_y".

   5. Finalmente le sumamos a la posición inicial la distancia que se debe alejar el objeto para los dos ejes de coordenadas.


No logro comprender practicamente todas las líneas que se ejecutan dentro y después del "if" ¿Alguien me las puede explicar? Por si las moscas cuelgo el código tal cual lo saqué de internet (AVISO: De la manera siguiente no ejecuta lo deseado):


//---Valor que debe alejarse y valor al que permite acercarse

var alejarse:Number = 50;
var cerca:Number = 50;

var newX:Number = this.bola._x;
var newY:Number = this.bola._y;

//---Funcion de movimiento
this.bola.onEnterFrame = function():Void {
   
   var difX:Number = this._x - _root._xmouse;
   var difY:Number = this._y - _root._ymouse;
   
   var hipot:Number = Math.sqrt(difX * difX + difY * difY);
   
   if(hipot < cerca){
       
      var incX:Number = difX * (hipot + alejarse) / hipot;
      var incY:Number = difY * (hipot + alejarse) / hipot;
       
      newX = this._x + incX;
      newY = this._y + incY;
       
   }
   
   var X:Number = (newX - this._x) * .25;
   var Y:Number = (newY - this._y) * .25;
   
   this._x += X;
   this._y += Y;
   
};


Espero que me podáis ayudar, llevo toda la mañana dandole al coco con esta historia. Gracias de antemano por la ayuda, cualquier mínima pista será bien recibida.

ignorantev1.1

CitarFijamos la cantidad de píxels que se debe alejar nuestro objeto con operaciones que no logro comprender.
:huh:
(supongamos:)
difX = 10
hipot = 2
alejarse =  5

          difX x (hipot + alejarse)    10 x (2 + 5)    10 x 7     70
incX = --------------------------- =  ------------- = ------- =  --- = 35
                      hipot                            2              2          2

CitarFijamos la posición final del objeto tras el desplazamiento. No comprendo la finalidad, ya hacemos esto al final del código.

Es que en realidad no hace eso. La posicion final del objeto solo se fija al final del codigo, lo que realmente se modifica es la variable newX.

Citar4. Volvemos a fijar el incremento para alejar nuestro objeto. ¿Por qué? Si se ejecutara el condicional tendríamos repetida la declaración de las variables "incremento_x" e "incremento_y".
Buen punto!  :xD mejor declaralas al inicio del codigo.

Usa las funciones GeSHi: ;)
Código (actionscript) [Seleccionar]
 
//---Valor que debe alejarse y valor al que permite acercarse

var alejarse:Number = 50;
var cerca:Number = 50;

var newX:Number = this.bola._x;
var newY:Number = this.bola._y;

var incX:Number;
var incY:Number;

//---Funcion de movimiento
this.bola.onEnterFrame = function():Void {
   
   var difX:Number = this._x - _root._xmouse;
   var difY:Number = this._y - _root._ymouse;
   
   var hipot:Number = Math.sqrt(difX * difX + difY * difY);
   
   if(hipot < cerca){
       
      incX:Number = difX * (hipot + alejarse) / hipot;
      incY:Number = difY * (hipot + alejarse) / hipot;
       
      newX = this._x + incX;
      newY = this._y + incY;
       
   }
   
   incX = (newX - this._x) * .25;
   incY = (newY - this._y) * .25;
   
   this._x += incX;
   this._y += incY;
   
};


Modifique poquito el codigo espero y te sirva... :rolleyes: