Utilidades de matemáticas 3D

Puede utilizar los métodos del paquete net.rim.device.api.math para mejorar la velocidad y la versatilidad de las aplicaciones del dispositivo BlackBerry que haya creado.

Puede utilizar la clase math.Fixed32 para recopilar rutinas matemáticas de punto fijo que emplean la convención 16.16 para corregir el punto decimal. Esta convención designa los 16 bits más significativos del valor de 32 bits como para el componente del punto fijo del valor, y el resto se utilizan para la mantisa. Las operaciones de suma y resta se realizan con valores enteros + y operadores - para ayudar a mantener el tamaño de esta biblioteca reducido. Los números pueden ir acompañados de signos, de forma que pueden representarse los números negativos. El mayor número positivo en el formato 16.16 es ligeramente superior a 32767,9999, y el número más cercano a infinito negativo es -32768,0. El incremento más pequeño entre números consecutivos es 1/65536.

Puede utilizar la clase math.Matrix4f para crear una matriz 4x4 de números de punto flotante que representan una transformación en 3D. La clase math.Matrix4f es directamente compatible con OpenGL porque sus elementos se almacenan en la memoria de la misma manera que se utilizan en OpenGL.

Puede utilizar la clase math.Quaternion4f para crear un número de cuaternión que podrá usar para representar la orientación de un objeto en el espacio. Los cuaterniones se utilizan normalmente en vez de los ángulos de Euler y las matrices de rotación para intentar obtener una interpolación uniforme y evitar el bloqueo de cardán. La clase math.Quaternion4f no mantiene el cuaternión normalizado, por lo que debe normalizar el cuaternión cuando sea necesario invocando normalize().

Puede utilizar la clase math.Vector3f para crear un vector de 3 elementos de números de punto flotante. Cuando utilice un vector para representar una superficie normal, normalmente debe normalizar el vector. En otras aplicaciones de vectores direccionales, quizás desee dejar la magnitud del vector intacto. Cuando utilice un vector para representar un punto, los elementos del vector representan una posición en el espacio 3D.

Ejemplo de código: uso de Fixed32()

import net.rim.device.api.math.*;
public class demoFixed32
{
    demoFixed32()
    {
        // convert an integer to fixed-point
        int n = Fixed32.toFP(7); // 7.0
        // convert a quantity in ten-thousandths to fixed-point
        int m = Fixed32.tenThouToFP(70625); // 7.0625
        // convert from fixed-point, truncate fractional component
        int trunc = Fixed32.toInt(m); // 7
        // multiply by ten thousand
        int mult = Fixed32.toIntTenThou(m); // 70625
        // add, subtract, negate, and compare
        int result = m - n; // 7.0625 - 7.0 == 0.0625
        result = -result; // -0.0625
        result -= n; // -0.0625 - 7.0 == -7.0625
        boolean b = (result == -m); // true
        boolean bb = (m < n); // false
        // do not use increment and decrement operators
        result = Fixed32.toFP(2);
        ++result; // WRONG! result will NOT be 3
        result = Fixed32.toFP(2);
        result += Fixed32.toFP(1); // Correct: result will be 3
        // Use * and / when multiplying or dividing by an integer scalar
        // Use mul to multiply 2 fixed-point numbers
        // Use div to divide 2 fixed-point numbers
        m = Fixed32.tenThouToFP(12500); // 1.25
        m *= 3; // OK: 1.25 * 3 == 3.75
        m /= 2; // OK: 3.75 / 2 == 1.875
        m = Fixed32.mul(m, Fixed32.tenThouToFP(15000)); // 1.875 * 1.5000 == 2.8125
        m = Fixed32.div(m, m); // 2.8125 / 2.8125 == 1.0
        // mul, div, sqrt, sind, cosd, tand, and atand2
        // all work with 16.16 fixed-point numbers
        m = Fixed32.tenThouToFP(172500); // 17.2500
        n = Fixed32.sqrt(m); // sqrt(17.25)
        n = Fixed32.sind(m); // sine of 17.25 degrees
        n = Fixed32.cosd(m); // cosine of 17.25 degrees
        result = Fixed32.atand2(-m, -m); // -135.0 degrees in fixed-point
    }
}
Tema siguiente: Convenciones de nombres
Tema anterior: E/S nativo

¿Le ha resultado útil esta información? Envíenos sus comentarios.