Algunas operaciones matemáticas comunes con AS3


En este capítulo veremos como realizar algunas operaciones matemáticas que se utilizan mucho en programación.

Sólo incluiré aquí las fórmulas, el razonamiento o el esqueleto de la técnica para el cálculo; la mayoría de los códigos mostrados no son programas completos que se puedan compilar directamente.

Volver al ͍ndice

La clase Math

Math es un objeto interno de actionscript que realiza un montón de operaciones matemáticas comunes por nosotros (En realidad es una clase estática, lo que significa que no hace falta crear instancias de Math para utilizar sus métodos).

Redondeo de un número con decimales

Redondear es eliminar la parte decimal de un número. Así, redondear 12.9042764 sería quitarle todos los decimales para dejarlo bien en 12, bien en 13, según redondeemos hacia abajo o hacia arriba.
Para esto, el objeto Math pone a nuestra disposición dos funciones:

  • Math.floor()
    Para redondear hacia abajo (floor significa suelo en inglés):

    	var numero:Number = 17.978352;
    	var numeroRedondo:int = Math.floor(numero);
    	trace("Al redondear", numero, "hacia abajo, nos sale", numeroRedondo);
    	

    Al publicar veremos en la consola:
    17

  • Math.ceil()
    Para redondear hacia arriba (ceiling significa techo en inglés):

    	var numero:Number = 17.37563;
    	var numeroRedondo:int = Math.ceil(numero);
    	trace("Al redondear", numero, "hacia arriba, nos sale", numeroRedondo);
    	

    Al publicar veremos en la consola:
    17

Valor absoluto

El valor absoluto de un número es su valor positivo, es decir que si tenemos un número negativo (p.ej.: -25) su valor absoluto es su opuesto (25), y si tenemos un número positivo (p.ej.:18) su valor absoluto es él mismo (18).

Para obtener el valor absoluto de un número en as3 se utiliza Math.abs().

var valor1:int = -12;
var valor2:int = 10;
trace("El valor absoluto de -12 es", Math.abs(valor1), " y el de 10 es ", Math.abs(valor2));

Podéis ver un ejemplo de su utilización en el apartado de distancias.

Números aleatorios

Math.random() devuelve un número decimal al azar entre 0 y 1 (incluido el 0, pero no el 1). Esto quiere decir que si escribimos:

var numero:Number = Math.random();
trace("Número al azar:", numero);

Aparecerá un número diferente en la consola, cada vez que publiquemos:
Número al azar: 0.127694
o
Número al azar: 0.9378
o
Número al azar: 0.59163122
Siempre (o casi siempre) distintos, decimales y entre 0 y 1.

¿Cómo hacemos para conseguir un número aleatorio entre dos números que no sean distintos de 0 y 1?

Observa en el gráfico siguiente como conseguimos obtener un número aleatorio entre 1 y 3.99999…:
aleatorio
Fijáos en que loos números enteros que están incluidos en el intervalo de números aleatorios tienen una linea gorda roja, mientras que, por ejemplo, el 5 en el último intervalo tiene una línea muy fina. Esto es para indicar que el 5 no está incluido en dicho intervalo (el 4.999999999999… sí que lo está).

De este gráfico podemos infereir una fórmula que funcione para cualquier intervalo que queramos de números al azar:

Número aleatorio en un intervalo:

var numero:Number = (max - min) * Math.random() + min;

Siendo min el límite inferior del intervalo y max el límite superior del mismo.

La fórmula anterior vale para obtener números aleatorios con decimales o enteros dentro del intervalo que queramos. ¿Pero como hacemos si sólo queremos números enteros al?. Aquí es donde viene Math.floor() al rescate.

Número aleatorio entero en cualquier intervalo:

var numero:Number = Math.floor( (max - min + 1) * Math.random() + min );

Siendo min el límite inferior del intervalo y max el límite superior del mismo.
El + 1 en (max - min + 1) tiene que ver con que Math.random() devuelve un número entre 0 y 0.9999999999… Si queremos que el límite superior esté incluido hay que poner ese + 1.

Raiz cuadrada

Nos hará falta para calcular distancias (ver apartado sobre distancias).

var raizDeNueve:Number = Math.sqrt(9);
trace("La raiz cuadrada de 9 es", raizDeNueve);

Distancia entre dos puntos

Observad el diagrama:
distancias

Distancia en una dimensión

Dx = x2 - x1;
Dy = y2 - y1;

Con estas fórmulas tenemos que tener cuidado si queremos comparar distancias o si queremos comprobar si una determinada distancia unidimensional es menor que un valor (por ejemplo, 1 pixel). ¿Por qué? Porque si x2 está a la izquierda de x1 en la escena, Dx dará un valor negativo y, por tanto, Dx < 1 desde el principio. Como normalmente lo que nos interesa es el valor absoluto de la distancia (es decir, el valor sin el signo) casi siempre vamos a utilizar las siguientes fórmulas cuando trabajemos en una sola dimensión:

Dx = Math.abs( x2 - x1 );
Dy = Math.abs( y2 - y1 );

Distancia en dos dimensiones

Suponiendo que ya tenemos calculadas Dx y Dy

D = Math.sqrt( Dx*Dx + Dy*Dy );

Notad que en vez de utilizar una función matemática para elevar al cuadrado (Se haría con Math.pow(Dx, 2), por ejemplo), estamos multiplicando Dx y Dy por si mismos, que es más rápido.

También, si tenemos cuidado de no liarnos, podemos escribir la operación toda en una sóla línea, que es más eficiente.

D = Math.sqrt( (x2 - x1)*(x2 - x1) + (y2-y1)*(y2 - y1) );

Veamos un ejemplo. Supongamos que queremos mover una instancia llamada pelota de donde está a un punto (variable de tipo Point) destino y necesitamos calcular la distancia en cada frame para comprobar si hemos llegado:

// definimos el punto de destino:
var destino:Point = new Point(500, 325);

// definimos la distancia horizontal
var dx:Number = 0;
// definimos la distancia en vertical
var dy:Number = 0;
// definimos la distancia en dos dimensiones, que es la que realmente necesitamos
var d:Number = 0;

function enCadaFrame(evento:Event):void {
	//... Después de mover la pelota
	dx = destino.x - pelota.x;
	dy = destino.y - pelota.y;
	distancia = Math.sqrt( dx*dx + dy*dy );
	if (distancia < 1) {
		// Hemos llegado. Paramos la animación de la pelota
		//...
	}
}

Fijaos en que aquí no estamos usando Math.abs() con dx o dy.
No hace falta porque luego, en la línea 15, los estamos elevando al cuadrado. Cualquier número elevado al cuadrado da siempre positivo, por lo que sería redundante (y un desperdicio de tiempo de preceso) calcular su valor absoluto.

Volver al ͍ndice

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s