mate

Funciones matemáticas de uso general: valores absolutos, redondeo, trigonometría y el tipo Vec2/Rect para trabajar con posiciones y áreas.

importar
usar std/mate

Constantes

mate.pi decimal = 3.141592653589793

Tipos

mate.Rect

Un rectángulo alineado a los ejes, definido por su posición (pos) y tamaño (tamano).

pos Vec2tamano Vec2

Rect.interseca(otro mate.Rect) bool

verdadero si este rectángulo se superpone con `otro`, aunque sea parcialmente.

Rect.contiene(punto mate.Vec2) bool

verdadero si `punto` cae dentro de este rectángulo.

Rect.centro() mate.Vec2

El punto central de este rectángulo.

Rect.interseccion(otro mate.Rect) mate.Rect

El rectángulo donde se superponen ambos; tiene tamaño cero si no se tocan.

Rect.desplazado(delta mate.Vec2) mate.Rect

Una copia de este rectángulo movida `delta`.

Rect.colision_circulo(centro mate.Vec2, radio decimal) bool

verdadero si un círculo con ese centro y radio toca este rectángulo.

mate.Vec2

Un vector/punto 2D: dos números decimales, x e y.

x decimaly decimal

Vec2.longitud() decimal

La magnitud (largo) del vector, es decir su distancia al origen (0, 0).

Vec2.normalizado() mate.Vec2

El mismo vector pero con longitud 1 (misma dirección, sin importar la magnitud original).

Vec2.distancia_a(otro mate.Vec2) decimal

La distancia entre este vector y `otro`, tratados como puntos.

Vec2.producto_punto(otro mate.Vec2) decimal

El producto punto (dot product) con `otro`: útil para saber qué tan alineados están dos vectores.

Vec2.rotado(angulo decimal) mate.Vec2

El mismo vector rotado `angulo` radianes alrededor del origen.

Vec2.colision_circulo(radio decimal, otro mate.Vec2, radio_otro decimal) bool

verdadero si un círculo de este radio centrado aquí se superpone con un círculo de `radio_otro` centrado en `otro`.

Vec2.angulo() decimal

Ángulo en radianes del vector respecto al eje x (0 apunta a la derecha; la y crece hacia abajo).

Vec2.interpolar(otro mate.Vec2, t decimal) mate.Vec2

El punto que está a la fracción `t` (0 a 1) del camino entre este vector y `otro`.

Vec2.reflejar(normal mate.Vec2) mate.Vec2

Este vector rebotado contra una superficie cuya normal (de longitud 1) es `normal`; útil para que una pelota rebote.

Vec2.perpendicular() mate.Vec2

Un vector de la misma longitud girado 90 grados en el sentido de las agujas del reloj en pantalla.

Funciones

mate.absoluto(valor decimal) decimal

Valor absoluto: siempre positivo o cero. Ejemplo: absoluto(-5) → 5

mate.minimo(a decimal, b decimal) decimal

El menor de dos valores. Ejemplo: minimo(3, 7) → 3

mate.maximo(a decimal, b decimal) decimal

El mayor de dos valores. Ejemplo: maximo(3, 7) → 7

mate.limitar(valor decimal, minimo decimal, maximo decimal) decimal

Recorta `valor` para que quede dentro de [minimo, maximo]. Ejemplo: limitar(150, 0, 100) → 100

mate.interpolar(a decimal, b decimal, t decimal) decimal

Interpola linealmente entre a y b según t (0 = a, 1 = b, 0.5 = el punto medio). Ejemplo: interpolar(0, 10, 0.5) → 5

mate.piso(valor decimal) entero

Redondea hacia abajo al entero más cercano. Ejemplo: piso(2.9) → 2

mate.techo(valor decimal) entero

Redondea hacia arriba al entero más cercano. Ejemplo: techo(2.1) → 3

mate.redondear(valor decimal) entero

Redondea al entero más cercano (0.5 redondea hacia arriba). Ejemplo: redondear(2.5) → 3

mate.raiz(valor decimal) decimal

Raíz cuadrada. Ejemplo: raiz(9) → 3

mate.seno(angulo decimal) decimal

Seno del ángulo dado en radianes.

mate.coseno(angulo decimal) decimal

Coseno del ángulo dado en radianes.

mate.atan2(y decimal, x decimal) decimal

Ángulo en radianes del vector (x, y) respecto al eje x, considerando el signo de ambos componentes (útil para apuntar hacia un punto).

mate.tangente(angulo decimal) decimal

Tangente del ángulo en radianes.

mate.potencia(base decimal, exponente decimal) decimal

`base` elevada a `exponente`; por ejemplo potencia(2, 10) es 1024.

mate.signo(valor decimal) decimal

-1 si el valor es negativo, 1 si es positivo y 0 si es cero; con enteros devuelve un entero.

mate.distancia(x1 decimal, y1 decimal, x2 decimal, y2 decimal) decimal

Distancia entre los puntos (x1, y1) y (x2, y2).

mate.angulo(x1 decimal, y1 decimal, x2 decimal, y2 decimal) decimal

Ángulo en radianes de la dirección que va del punto (x1, y1) al punto (x2, y2); útil para apuntar.

mate.radianes(grados decimal) decimal

Convierte grados a radianes.

mate.grados(radianes decimal) decimal

Convierte radianes a grados.

mate.bit_y(a entero, b entero) entero

Y bit a bit: quedan los bits encendidos en los dos números. Sirve para leer una máscara. Ejemplo: bit_y(0b1100, 0b1010) → 0b1000

mate.bit_o(a entero, b entero) entero

O bit a bit: quedan los bits encendidos en cualquiera de los dos. Sirve para encender una bandera. Ejemplo: bit_o(0b1100, 0b1010) → 0b1110

mate.bit_xor(a entero, b entero) entero

O exclusivo bit a bit: quedan los bits que difieren. Ejemplo: bit_xor(0b1100, 0b1010) → 0b0110

mate.bit_no(valor entero) entero

Invierte todos los bits del número. Con `bit_y` apaga una bandera: bit_y(banderas, bit_no(0b0100)).

mate.desplazar_izquierda(valor entero, bits entero) entero

Mueve los bits hacia la izquierda; cada posición multiplica por 2. `bits` no puede ser negativo y con 64 o más el resultado es 0. Ejemplo: desplazar_izquierda(1, 4) → 16

mate.desplazar_derecha(valor entero, bits entero) entero

Mueve los bits hacia la derecha conservando el signo; cada posición divide entre 2 redondeando hacia abajo. `bits` no puede ser negativo. Ejemplo: desplazar_derecha(0xFF00, 8) → 0xFF