muijs-cuerpos
Version:
Librería para simular y graficar interacciones entre cuerpos rígidos
893 lines (854 loc) • 42 kB
TypeScript
declare class Vector {
x: number;
y: number;
origen: Punto;
id: number;
private constructor();
get magnitud(): number;
get angulo(): number;
static cero(): Vector;
static arriba(magnitud?: number): Vector;
static abajo(magnitud?: number): Vector;
static izquierda(magnitud?: number): Vector;
static derecha(magnitud?: number): Vector;
/**Retorna un Vector aleatorio con magnitud definida.
* Si no se determina una magnitud, retorna un vector normalizado.
*/
static aleatorio(magnitud?: number): Vector;
/**Retorna un vector nuevo a partir de las componentes x e y ingresadas.*/
static crear(x: number, y: number): Vector;
/**Retorna un vector nuevo que va desde un punto origen a un punto extremo.*/
static segunPuntos(origen: Punto, extremo: Punto): Vector;
/**Retorna una copia de un conjunto de vectores.*/
static clonarConjunto(vectores: Vector[]): Vector[];
/**Retorna el vector normal de un segmento formado por dos vectores.
* El ángulo de la normal va en sentido antihorario según la dirección del primer al segundo vector.
* (Según la inverción de ejes de las coordenadas de JS, donde los ángulos crecen en sentido horario).
*/
static normal(vectorUno: Vector, vectorDos: Vector): Vector;
/**Retorna una copia del vector.*/
clonar(): Vector;
/**Retorna la suma de dos vectores como un vector nuevo.*/
sumar(vectorSumar: Vector): Vector;
/**Retorna la resta de dos vectores como un vector nuevo.*/
restar(vectorRestar: Vector): Vector;
/**Retorna un vector nuevo resultante de multiplicar las componentes de un vector por un escalar.*/
escalar(escalar: number): Vector;
/**Retorna una copia del vector ingresado con magnitud 1.*/
normalizar(): Vector;
/**Retorna un vector resultante de invertir la dirección del vector ingresado.*/
invertir(): Vector;
/**Retorna el producto punto, o escalar, entre dos vectores.*/
punto(vectorProducto: Vector): number;
/**Retorna el módulo del producto cruz, o vectorial, entre dos vectores de 2 dimensiones.*/
cruz(vectorProducto: Vector): number;
/**Retorna el valor de la proyección de un vector sobre un eje representado por otro vector.*/
proyeccion(vectorEje: Vector): number;
/**Retorna el valor del ángulo entre dos vectores.*/
anguloVectores(vectorAngulo: Vector): number;
/**Retorna un vector nuevo a partir de un vector rotado.*/
rotar(angulo: number): Vector;
}
declare class Celda {
posicion: Vector;
tamano: number;
color: string;
estado: number;
distanciaVecindad: number;
posicionVecinos: Vector[];
constructor(posicionX: number, posicionY: number, tamano: number, estado?: number, color?: string);
get columna(): number;
get fila(): number;
/**Retorna un vector con el área de las casillar que comprenden la vecindad de Moore de la celda, según su distancia de vecindad.
* Ejemplo: el vector (-1, 1) representa a todas las cuadrículas en las posiciones entre (x-1, y-1) y (x+1, y+1) con respecto a la celda.
*/
get vecindad(): Vector;
/**Pinta el interior de la celda. Usa como argumento una instancia de la clase Lapiz o Dibujante.*/
rellenar(lapiz: Lapiz): void;
}
/**MÓDULO DE DIBUJO
* Instancia una herramienta lapiz.
* Métodos para definir colores hsla y rgba, dibujar objetos tipo Forma y escribir.
*/
declare class Lapiz {
colorCelda: string;
/**Interfaz de dibujo sobre el canvas. 2D*/
context: CanvasRenderingContext2D;
/**Opciones del método en que se graficará.
* 'colorTrazo', 'colorRelleno', 'trazada', 'rellenada', 'grosorTrazo' y 'opacidad'.
*/
estiloForma: OpcionesGraficasForma;
/**Opciones de 'color', 'tamano', 'fuente', 'opacidad' y 'alineacion'.*/
estiloTexto: OpcionesGraficasTexto;
/**Opciones del método en que se graficará.
* 'color' y 'grosorTrazo'.
*/
estiloVector: OpcionesGraficasVector;
constructor(context: CanvasRenderingContext2D);
/**
* Retorna un string con el color en formato HSL.
* (hue) recibe grados entre 0 y 360,
* (saturation) y (lightness) reciben porcentajes.
*/
static colorHSL(hue: number, saturation: number, lightness: number): string;
/**
* Retorna un string con el color en formato HSLA.
* (hue) recibe grados entre 0 y 360,
* (saturation) y (lightness) reciben porcentajes, y (alpha)
* valores entre 0 y 1.
*/
static colorHSLA(hue: number, saturation: number, lightness: number, alpha: number): string;
/**
* Retorna un string con el color en formato RGB.
* (red), (green) y (blue) reciben valores entre 0 y 255.
*/
static colorRGB(red: number, green: number, blue: number): string;
/**
* Retorna un string con el color en formato RGBA.
* (red), (green) y (blue) reciben valores entre 0 y 255,
* y (alpha) valores entre 0 y 1.
*/
static colorRGBA(red: number, green: number, blue: number, alpha: number): string;
protected recorrerPath(forma: Forma): void;
/**Traza en el canvas la forma ingresada como argumento.*/
trazar(forma: Forma): void;
/**Rellena en el canvas la forma ingresada como argumento.*/
rellenar(forma: Forma): void;
/**Rellena y/o traza una forma, según su estilo gráfico.*/
dibujar(forma: Forma): void;
/**Rellena en el canvas la celda ingresada como argumento.*/
rellenarCelda(celda: Celda): void;
/** Traza en el canvas el vector ingresado como argumento.
* Usa como color el atributo .estiloVector.color.
*/
trazarVector(vector: Vector): void;
/**Rellena un texto en el canvas en la posicion ingresada.
* Usa como opciones gráficas el atributo .estiloTexto
*/
escribir(texto: string, posicionX: number, posicionY: number): void;
/**Método interno.
* Crea un recorrido para una forma con id "circunferencia", usando el método .arc de la interfaz context.
*/
protected pathCircunferencia(forma: Forma): void;
/**Método interno.
* Crea un recorrido para una forma con id "poligono". Registra líneas entre cada vértice del polígono.
*/
protected pathPoligono(forma: Forma): void;
/**Método interno.
* Crea un recorrido para una forma con id "linea". Registra una línea entre los dos vértices.
*/
protected pathLinea(forma: Forma): void;
}
declare enum TipoFormas {
circunferencia = "circunferencia",
poligono = "poligono",
linea = "linea",
vector = "vector"
}
/**
=============================================
* MÓDULO DE TRANSFORMACIONES *
=============================================
Trabaja sobre conjuntos de vectores.
Almacena las transformaciones como atributos.
Siempre retorna copias nuevas de los conjuntos de vectores ingresados.
*/
/**Aplica transformaciones de escala, rotación y desplazamiento sobre arreglos de vectores.
* Siempre retorna copias nuevas de los arreglos.
* Almacena en sus atributos los valores de las transformaciones que aplica.
*/
declare class Transformacion {
escala: number;
rotacion: number;
posicion: Vector;
constructor(x?: number, y?: number, rotacion?: number, escala?: number);
/**Retorna el arreglo de vectores resultante de aplicar las transformaciones de escala, rotación y desplazamiento
* sobre un arreglo de vectores de entrada.
* Permite aumentar puntualmente la rotación en un ángulo específico sin modificar la propiedad de rotación de la transformación.*/
transformarConjuntoVectores(vectores: Vector[]): Vector[];
/**Escala cada uno de los vectores del arreglo ingresado y los retorna en un arreglo nuevo.*/
aplicarEscalaVectores(vectores: Vector[]): Vector[];
/**Desplaza cada uno de los vectores del arreglo ingresado y los retorna en un arreglo nuevo.*/
aplicarDesplazamientoVectores(vectores: Vector[]): Vector[];
/**Rota cada uno de los vectores del arreglo ingresado según el ángulo de rotación almacenado y los retorna en un arreglo nuevo.
*/
aplicarRotacionVectores(vectores: Vector[]): Vector[];
/**Rota cada uno de los vectores de un arreglo según el ángulo ingresado y los retorna en un arreglo nuevo.
*/
static rotarVectores(vectores: Vector[], angulo: number): Vector[];
/**Retorna una copia de la transformación.*/
clonarTransformación(): Transformacion;
}
/**MÓDULO FORMA
* Instancias de formas geométricas.
* Permite cambiar su posición, rotar, escalar, crear formas básicas y personalizadas, y dibujarlas.
*/
declare class Forma {
protected _vertices: Vector[];
protected _verticesTransformados: Vector[];
protected _transformacion: Transformacion;
protected verticesTransformadosAnteriores: Vector[];
protected transformacionAnterior: Transformacion;
protected transformar: boolean;
id?: number;
radio: number;
lados: number;
tipo: TipoFormas;
colorTrazo: string | undefined;
colorRelleno: string | undefined;
/**Determina si la forma debe ser trazada al dibujar.*/
trazada: boolean;
/**Determina si la forma debe ser rellenada al dibujar.*/
rellenada: boolean;
grosorTrazo: number | undefined;
opacidad: number | undefined;
protected constructor();
/**Retorna el valor del radio con la transformación de escala aplicada.*/
get radioTransformado(): number;
/**Retorna una copia de la transformación de la forma.*/
get transformacion(): Transformacion;
/**Retorna una copia del vector de la posición después de aplicar las transformaciones.*/
get posicion(): Vector;
/**Retorna una copia del vector de la posición antes de aplicar las transformaciones.*/
get posicionAnterior(): Vector;
/**Retorna el ángulo de rotación actual de la forma.*/
get rotacion(): number;
/**Retorna el valor de la escala de la forma.*/
get escala(): number;
/**Retorna una copia del arreglo de vértices sin transformaciones.*/
get vertices(): Vector[];
/**Retorna una copia del arreglo de vértices después de aplicar las transformaciones de escala, rotación y desplazamiento.*/
get verticesTransformados(): Vector[];
/**Retorna el conjunto de vectores normales de cada arista del polígono.
* El orden de las aristas es en sentido horario.
*/
get normales(): Vector[];
/**Retorna la distancia entre el centro del polígono y el punto más cercano de sus aristas.*/
get apotema(): number;
/**Reemplaza la transformación de la forma.*/
set transformacion(transformacion: Transformacion);
/**Reemplaza el vector posición de la forma.*/
set posicion(nuevaPosicion: Vector);
/**Modifica el valor de la rotación de la figura con respecto a su forma sin transformaciones.*/
set rotacion(rotacion: number);
/**Reemplaza el valor de la escala de la forma.*/
set escala(nuevaEscala: number);
/**Reemplaza el conjunto de vértices base de la forma.*/
set vertices(vertices: Vector[]);
/**Permite modificar las opciones gráficas con la interfaz OpcionesGraficasForma*/
set estiloGrafico(opciones: OpcionesGraficasForma);
moverVertice(indice: number, punto: Punto): void;
/**Inicia los vértices de la forma creada.*/
private crearVertices;
/**Retorna una forma de tipo polígono. El radio es el valor de la distancia entre el centro y cualquiera de sus vértices.*/
static poligono(x: number, y: number, lados: number, radio: number, opciones?: OpcionesForma & OpcionesGraficasForma): Forma;
/**Retorna una forma de tipo circunferencia. */
static circunferencia(x: number, y: number, radio: number, opciones?: OpcionesForma & OpcionesGraficasForma): Forma;
/**Retorna una forma de tipo rectángulo. El radio es el valor de la distancia entre el centro y cualquiera de sus vértices.*/
static rectangulo(x: number, y: number, base: number, altura: number, opciones?: OpcionesForma & OpcionesGraficasForma): Forma;
/**Crea una recta centrada en la posición ingresada.*/
static recta(puntoUno: Punto, puntoDos: Punto, opciones?: OpcionesForma & OpcionesGraficasForma): Forma;
/**
* Crea un conjunto de rectas a partir de un grupo de vértices.
* Calcula el centro de los vértices y centra el trazo en la posición ingresada.
*/
static trazo(vertices: Vector[], opciones?: OpcionesForma & OpcionesGraficasForma): Forma;
/**
* Crea un polígono a partir de un grupo de vértices.
* Calcula el centro de los vértices ingresados y lo asigna a su posición.
*/
static poligonoSegunVertices(vertices: Vector[], opciones?: OpcionesForma & OpcionesGraficasForma): Forma;
/**Crea una transformación nueva para formas nuevas, con la posición ingresada.*/
protected iniciarTransformacion(x: number, y: number): void;
/**Actualiza el conjunto de vectores transformados.*/
protected transformarVertices(): void;
/**Retorna una copia de la forma como una forma nueva.*/
clonar(): Forma;
/**Suma el ángulo ingresado al ángulo de rotación de la forma.*/
rotar(angulo: number): void;
/**Suma el vector ingresado al vector de posición de la forma.*/
desplazar(vector: Vector): void;
/**Rota la forma alrededor del punto (0, 0)*/
rotarSegunOrigen(angulo: number): void;
/**Rota la forma alrededor del punto ingresado.*/
rotarSegunPunto(punto: Punto, angulo: number): void;
/**Traza el contorno de la forma. Usa una instancia de la clase Lapiz o Dibujante.*/
trazar(lapiz: Lapiz): void;
/**Rellena el interior de la forma. Usa una instancia de la clase Lapiz o Dibujante.*/
rellenar(lapiz: Lapiz): void;
/**Rellena el interior de la forma. Usa una instancia de la clase Lapiz o Dibujante.*/
dibujar(lapiz: Lapiz): void;
}
interface Punto {
x: number;
y: number;
id?: number;
contenido?: Forma;
}
interface OpcionesForma {
escala?: number;
rotacion?: number;
}
interface OpcionesCuerpo extends OpcionesForma {
/**Determina si el cuerpo rotará ajustándose al ángulo del vector velocidad.*/
rotarSegunVelocidad?: boolean;
/**Determina si el cuerpo permanecerá o no estático al colisionar con otro cuerpo.*/
fijo?: boolean;
/**El valor de la masa del cuerpo.*/
masa?: number;
/**El valor de la densidad del cuerpo.*/
densidad?: number;
/**Si el cuerpo se verá afectado por eventos de teclado o mouse.*/
controlable?: boolean;
}
interface OpcionesGraficasForma {
/**Color de trazado de la forma.*/
colorTrazo?: string;
/**Color de relleno de la forma.*/
colorRelleno?: string;
/**Determina si la forma debe ser trazada.*/
trazada?: boolean;
/**Determina si la forma debe ser rellenada.*/
rellenada?: boolean;
/**Determina el ancho de la línea trazada.*/
grosorTrazo?: number;
/**Determina la opacidad con que es graficada la forma. */
opacidad?: number;
}
interface OpcionesGraficasVector {
/**Color del trazo del vecto.*/
color: string;
/**Ancho del trazo del vector en pixeles. */
grosorTrazo: number;
}
interface OpcionesGraficasTexto {
tamano?: number;
/**Opciones: 'center', 'end', 'left', 'right', 'start' */
alineacion?: CanvasTextAlign;
fuente?: string;
/**Valor de opacidad, entre 0 y 1.*/
opacidad?: number;
color?: string;
}
interface OpcionesControlesCuerpo {
arriba: boolean;
abajo: boolean;
izquierda: boolean;
derecha: boolean;
rotarIzquierda: boolean;
rotarDerecha: boolean;
rapidez: number;
anguloRotacion: number;
}
/**MÓDULO DE GEOMETRÍA EN ESPAÑOL
* Útilitario para mui.js
* Incluye métodos de conversión de grados y distancia entre puntos.
*/
declare class Geometria {
/**Retorna el doble del valor de PI.*/
static get DOS_PI(): number;
/**Retorna la mitad del valor de PI.*/
static get PI_MEDIO(): number;
/**Transforma grados sexagesimales a radianes.*/
static gradoARadian(grado: number): number;
/**Transfoma radianes a grados sexagesimales.*/
static radianAGrado(rad: number): number;
/**Retorna la longitud de la hipotenusa según la longitud de los dos catetos ingresados.*/
static hipotenusa(cateto1: number, cateto2: number): number;
/**Retorna la longitud de un cateto según la longitud de la hipotenusa y del otro cateto.*/
static cateto(hipotenusa: number, cateto: number): number;
/**Retorna el valor de la distancia entre dos puntos de un plano cartesiano.*/
static distanciaEntrePuntos(puntoUno: Punto, puntoDos: Punto): number;
/**Retorna el punto medio entre dos puntos de un plano cartesiano.*/
static puntoMedio(puntoUno: Punto, puntoDos: Punto): Punto;
/**Compara las coordenadas de dos puntos.
* Retorna true si son iguales y false si no lo son.
*/
static compararPuntos(puntoUno: Punto, puntoDos: Punto): boolean;
}
/**Clase que permite capturar lo que se proyecte en un canvas. */
declare class Grabador {
constructor();
/**Graba la animación de un canvas en formato .avi y asocia la grabación a un link de descarga en el documento HTML.
* Permite definir la duración de la grabación, en milisegundos, el número de FPS y la id del <anchor> HTML que iniciará la descarga.
* Si no se define un elemento <anchor>, el método creará uno.
*/
static grabarCanvas(canvas: HTMLCanvasElement, milisegundos: number, fps: number, anchor?: string): void;
}
/**
* MÓDULO MATEMÁTICO EN ESPAÑOL
* Reducido. Contiene solo funciones útiles de números aleatorios.
*/
declare class Matematica {
/**Retorna un número aleatorio entre dos números.*/
static aleatorio(min: number, max: number): number;
/**Retorna un número aleatorio entero entre dos números, ambos incluídos.*/
static aleatorioEntero(min: number, max: number): number;
static compararNumeros(numeroUno: number, numeroDos: number, epsilon?: number): boolean;
}
/**
=============================================
* MÓDULO DE COLISIONES *
=============================================
Trabaja usando objetos de tipo Forma.
Usa el Teorema de ejes de separación (SAT) para detectar colisiones.
*/
/**MÓDULO DE COLISIONES
* Trabaja usando objetos de tipo Forma.
* Usa el Teorema de ejes de separación (SAT) para detectar colisiones.
*/
declare class Colision {
static get iteraciones(): number;
/**Detecta colisiones usando el teorema SAT entre formas de tipo circunferencia y/o polígono.
* Retorna true si detecta una colisión.
* Retorna false si no detecta colisión.
*/
static detectar(formaUno: Forma, formaDos: Forma): boolean;
/**Detecta la intersección entre dos circunferencias.
* Retorna true si hay intersección.
* Retorna false si no hay intersección.
* Compara la distancia entre ambos centros con la suma de sus radios.
*/
static circunferencias(circunferenciaUno: Forma, circunferenciaDos: Forma): boolean;
/**Detecta la colisión entre dos polígonos.
* Retorna true si hay colisión.
* Retorna false si no hay colisión.
* Usa el teorema SAT. Proyecta los vértices sobre las normales de las caras de ambos polígonos y busca ejes de separación.
*/
static poligonos(poligonoUno: Forma, poligonoDos: Forma): boolean;
/**Detecta la colisión entre una circunferencia y un polígono.
* Retorna true si hay colisión.
* Retorna false si no hay colisión.
* Usa el teorema SAT. Proyecta los vértices del polígono y dos puntos de la circunferencia sobre las normales de las caras del polígono y busca ejes de separación.
*/
static circunferenciaPoligono(circunferencia: Forma, poligono: Forma): boolean;
/**Retorna el valor menor entre las proyecciones de un conjunto de vértices sobre un eje representado por un vector normal.*/
private static proyeccionMenor;
/**Retorna el valor mayor entre las proyecciones de un conjunto de vértices sobre un eje representado por un vector normal.*/
private static proyeccionMayor;
/**Retorna un arreglo de dos vectores correspondiente a las normales de las caras de contacto entre dos formas.
* El primero vector del arreglo corresponde a la normal de la primera forma.
* El segundo vector del arreglo corresponde a la normal de la segunda forma.
*/
static normalesContacto(formaUno: Forma, formaDos: Forma): Vector[];
/**Detecta la colisión entre una circunferencia y su entorno que la contiene.
* Retorna el valor de solapamiento.
* Retorna null si no hay colisión.
* Usa el teorema SAT. Proyecta los vértices del entorno y dos puntos de la circunferencia sobre las normales de las caras del polígono
* y verifica si hay proyecciones de la circunferencia mayores a la de los vértices del entorno.
*/
static circunferenciaEntorno(circunferencia: Forma, entorno: Forma): number | null;
/**Retorna la normal del borde del entorno contra el que ha colisionado una forma.*/
static normalContactoConEntorno(forma: Forma, entorno: Forma): Vector;
}
/**
=============================================
* MÓDULO DE CUERPOS *
=============================================
Trabaja usando objetos de tipo Forma.
Crea cuerpos geométricos con masa y densidad.
Contiene métodos para mover según velocidad y aceleración.
*/
/**MÓDULO DE CUERPOS
* Trabaja usando objetos de tipo Forma.
*/
declare class Cuerpo extends Forma {
protected _velocidad: Vector;
protected _aceleracion: Vector;
/**Determina si el cuerpo rotará o no según la dirección y sentido de su velocidad.*/
rotarSegunVelocidad: boolean;
/**Propiedad útil para determinar si un cuerpo será controlado por el usuario.*/
controlable: boolean;
/**Determina si un cuerpo se moverá o no producto de la interacción con otros cuerpos.*/
fijo: boolean;
masa: number;
densidad: number;
/**Propiedades para activar y desactivar acciones relacionadas con el control del movimiento de cuerpos por parte del usuario.*/
controles: OpcionesControlesCuerpo;
private constructor();
/**Retorna una copia del vector velocidad.*/
get velocidad(): Vector;
/**Retorna una copia del vector aceleración.*/
get aceleracion(): Vector;
get verticesTransformados(): Vector[];
/**Modifica el vector velocidad.*/
set velocidad(velocidad: Vector);
/**Modifica el vector aceleración.*/
set aceleracion(aceleracion: Vector);
/**Retorna un cuerpo geométrico regular.
* El radio corresponde a la distancia entre el centro y cualquiera de sus vértices.*/
static poligono(x: number, y: number, lados: number, radio: number, opciones?: OpcionesCuerpo): Cuerpo;
/**Retorna un cuerpo geométrico regular.
* El radio corresponde a la distancia entre el centro y cualquiera de sus vértices.*/
static poligonoSegunVertices(vertices: Vector[], opciones?: OpcionesCuerpo): Cuerpo;
/**Retorna un cuerpo rectangular.*/
static rectangulo(x: number, y: number, base: number, altura: number, opciones?: OpcionesCuerpo): Cuerpo;
/**Retorna un cuerpo con forma de circunferencia.*/
static circunferencia(x: number, y: number, radio: number, opciones?: OpcionesCuerpo): Cuerpo;
/**Método auxiliar. Crea un cuerpo base a partir de una forma.*/
private static cuerpoSegunForma;
/**Retorna una copia del cuerpo como un cuerpo nuevo.*/
clonar(): Cuerpo;
/**Suma la aceleración a la velocidad y la velocidad a la posición.*/
mover(): void;
/**Traza el vector velocidad del cuerpo a partir de su centro.*/
trazarVelocidad(lapiz: Lapiz): void;
/**Aplica las transformaciones definidas para cada evento (de teclado, mouse u otro) sobre el cuerpo.*/
usarControles(): void;
}
declare class Contenedor {
cuerpo: Cuerpo;
cuerposContenidos: Cuerpo[];
constructor(cuerpo: Cuerpo);
/**Retorna el conjunto de vectores normales de cada arista del contenedor. */
get normales(): Vector[];
/**Retorna un objeto Contenedor a partir de un cuerpo.*/
static crearContenedor(cuerpo: Cuerpo): Contenedor;
/**Agrega cuerpos al conjunto de cuerpos que estarán dentro del contenedor.*/
agregarCuerposContenidos(...cuerpos: Cuerpo[]): void;
rebotarCircunferenciasConBorde(): void;
/**Suma la aceleración a la velocidad y la velocidad a la posición.*/
mover(): void;
}
declare class Entorno extends Contenedor {
private canvas;
private alto;
private ancho;
constructor(canvas: HTMLCanvasElement, cuerpo: Cuerpo);
get normales(): Vector[];
/**Crea un entorno con un cuerpo del tamaño del canvas.
* Un entorno funciona como un cuerpo contenedor.
*/
static crearEntornoCanvas(canvas: HTMLCanvasElement): Entorno;
/**Mueve un vector que ha excedido las coordenadas de alguno de los bordes al borde opuesto.
* Convierte al entorno en un entorno infinito.
*/
envolverBorde(vector: Vector): Vector;
colisionConBorde(...cuerpos: Cuerpo[]): Cuerpo[];
}
declare class Interaccion {
static get iteraciones(): number;
/**Retorna una copia del conjunto de cuerpos con la resolución de rebote para cuerpos que han colisionado. */
static reboteEntreCuerpos(cuerpos: Cuerpo[]): Cuerpo[];
/**Retorna una copia del conjunto de cuerpos con la resolución de contacto sólido para cuerpos que han colisionado. */
static contactoSimple(cuerpos: Cuerpo[]): Cuerpo[];
private static resolverSolapamiento;
/**Retorna una copia del conjunto de circunferencias con la resolución de rebote para cuerpos que han colisionado con los bordes de un entorno. */
static reboteCircunferenciasConEntorno(circunferencias: Cuerpo[], entorno: Cuerpo): Cuerpo[];
private static resolverSolapamientoEntorno;
}
declare class Restriccion {
/**Limita la magnitud de la velocidad de un cuerpo.
* Retorna una copia del vector velocidad si se ha modificado su magnitud.
*/
static limitarVelocidad(cuerpo: Cuerpo, limite: number): Vector;
/**Retorna un vector de aceleracion escalado de tal manera que al sumarlo a la velocidad del cuerpo, la magnitud
* de la velocidad no supere el límite ingresado.*/
static limitarAceleracionSegunVelocidad(cuerpo: Cuerpo, limiteVelocidad: number): Vector;
}
/**
* Inicio Quadtree
*/
declare class QuadTree {
x: number;
y: number;
ancho: number;
alto: number;
capacidad: number;
capacidadEspecifica: number;
puntos: Punto[];
private idPunto;
private subDividido;
private subDivisiones;
private niveles;
longitudMinima: number;
private longitudMenor;
contorno: Forma;
constructor(x: number, y: number, ancho: number, alto: number, capacidad?: number, niveles?: number);
/**Agrega un punto a un QuadTree. Si al agregar el punto se sobrepasa la capacidad del QuadTree, se subdivide en cuatro QuadTrees nuevos. */
insertarPunto(punto: Punto, contenido?: Forma): boolean;
private crearSubdivisiones;
private insertarEnSubdivisiones;
private validarInsercion;
trazar(lapiz: Lapiz, opciones?: OpcionesGraficasForma): void;
private formaCuadrante;
private verificarPuntoRepetido;
puntosEnRango(limiteIzquierda: number, limiteDerecha: number, limiteSuperior: number, limiteInferior: number, arregloPuntos?: Punto[]): Punto[];
contactoSimpleCuerpos(): void;
reboteEslasticoCuerpos(): void;
}
declare class Cinematica {
/**Retorna un vector velocidad de un cuerpo que colisiona con una superficie.*/
static reboteSimple(cuerpo: Cuerpo, normal: Vector): Vector;
/**Retorna en un arreglo las velocidades finales después de un choque elástico entre dos cuerpos.*/
static reboteElastico(cuerpoUno: Cuerpo, cuerpoDos: Cuerpo): Vector[];
private static velocidadUnoFinal;
private static velocidadDosFinal;
}
declare class Fuerza {
/**Retorna un vector correspondiente a la aceleración de un cuerpo atraído hacia un cuerpo atractor.
* TODAVÍA NO HE INCORPORADO LA MASA NI LA DISTANCIA.
*/
static atraer(cuerpo: Cuerpo, atractor: Cuerpo, magnitudAtraccion: number): Vector;
/**Retorna un vector correspondiente a la aceleración de un cuerpo atraído hacia un vector atractor.
* TODAVÍA NO HE INCORPORADO LA MASA NI LA DISTANCIA.
*/
static atraerAVector(cuerpo: Cuerpo, atractor: Vector, magnitudAtraccion: number): Vector;
/**Retorna un vector correspondiente a la aceleración de un cuerpo repelido por un cuerpo repulsor.
* TODAVÍA NO HE INCORPORADO LA MASA NI LA DISTANCIA.
*/
static repeler(cuerpo: Cuerpo, repulsor: Cuerpo, magnitudRepulsion: number): Vector;
/**Retorna un vector correspondiente a la aceleración de un cuerpo repelido por un vector repulsor.
* TODAVÍA NO HE INCORPORADO LA MASA NI LA DISTANCIA.
*/
static repelerDeVector(cuerpo: Cuerpo, repulsor: Vector, magnitudRepulsion: number): Vector;
}
/**MÓDULO DE DIBUJANTE
* Extiende las funciones de Lapiz.
* Permite trabajar con conjuntos de formas y sobre el canvas.
* Se instancia usando el canvas.
*/
declare class Dibujante extends Lapiz {
canvas: HTMLCanvasElement;
private _anchoCanvas;
private _altoCanvas;
private _colorFondo?;
private constructor();
/**Retorna la medida horizontal del canvas.*/
get anchoCanvas(): number;
/**Retorna la media vertical del canvas. */
get altoCanvas(): number;
/**Retorna un punto ubicado en el centro del canvas.*/
get centroCanvas(): Punto;
/**Retorna el color del canvas.*/
get colorCanvas(): string | undefined;
/**Modifica la medida horizontal del canvas.*/
set anchoCanvas(ancho: number);
/**Modifica la medida vertical del canvas. */
set altoCanvas(alto: number);
/**Modifica el color del canvas.*/
set colorCanvas(color: string);
/**Retorna una instancia de Dibujante usando como parámetro el id de un canvas presente en el documento HTML. */
static crearConIdCanvas(idCanvas: string): Dibujante;
/**Retorna una instancia de Dibujante usando como parámetro el canvas presente en el documento HTML. */
static crearConCanvas(canvas: HTMLCanvasElement): Dibujante;
/**Traza un conjunto de formas.*/
trazarFormas(formas: Forma[]): void;
/**Rellena un conjunto de formas.*/
rellenarFormas(formas: Forma[]): void;
/**Rellena y/o traza, según el caso, un conjunto de formas.*/
dibujarFormas(formas: Forma[]): void;
/**Borra el contenido del canvas.
* Si se especifica opacidad, pinta el canvas completo usando como color el atributo colorCanvas y con la opacidad especificada.
* Si no hay colorCanvas especificado, se pintará de blanco.
*/
limpiarCanvas(opacidad?: number): void;
/**Traza las normales de una forma geométrica.*/
trazarNormales(forma: Forma): void;
}
declare class Cuadricula {
filas: number;
columnas: number;
/**La dimensión del lado de una celda cuadrada.*/
tamanoCelda: number;
private _bordesInfinitos;
celdas: Celda[][];
/**El número de estados posibles que puede adoptar cada celda.*/
estados: number;
private _colorCeldas;
constructor(columnas: number, filas: number, tamanoCelda: number, estados: number);
/**Retorna el ancho de la cuadrícula (la multiplicación del número de columnas por el tamaño de cada celda).*/
get anchoCuadricula(): number;
/**Retorna el alto de la cuadrícula (la multiplicación del número de filas por el tamaño de cada celda).*/
get altoCuadricula(): number;
set bordesInfinitos(borderInfinitos: boolean);
/**Ajusta el color con que se pintarán las celdas.*/
set colorCeldas(color: string);
private crearCeldas;
/**Retorna un arreglo con las posiciones de los vecinos de la celda ingresada.
* Permite definir si las celdas de los bordes incluirán o a las celdas de los bordes opuestos de la cuadrícula entre sus vecinos.
*/
private determinarVecinosPorCelda;
/**Retorna un arreglo de tuplas con el número de vecinos de la celda que están en cada estado posible.
* [[estado, número de vecinos en ese estado], [estado, número de vecinos en ese estado]...]
*/
estadosVecinosPorCelda(celda: Celda): [number, number][];
/**Pinta todas las celdas de la cuadrícula. Asigna la opacidad de acuerdo al estado de cada celda.*/
rellenarCeldas(lapiz: Lapiz): void;
/**Retorna la celda ubicada en la posicion (columna, fila) respecto a la cuadrícula.*/
celdaSegunCoordenada(columna: number, fila: number): Celda;
/**Retorna la celda ubicada en la posición del mouse sobre el canvas.*/
celdaEnPosicionMouse(mouseX: number, mouseY: number): Celda;
/**Asigna un estado aleatorio a cada celda de la cuadrícula.*/
estadosAleatorios(): void;
/**Asigna un estado aleatorio a cada celda de la cuadrícula.*/
estadosCero(): void;
/**Asigna el estado máximo a cada celda de la cuadrícula.*/
estadosMaximos(): void;
}
/**Contador de tiempo, en milisegundos.
* Su propiedad 'activo' se vuelve false cuando ha transcurrido el tiempo ingresado.
*/
declare class Temporizador {
private tiempoInicial;
duracion: number;
activo: boolean;
constructor(duracionMilisegundos: number);
/**Retorna el tiempo, en milisegundos, transcurrido desde la creación del temporizador.*/
get tiempoTranscurrido(): number;
}
declare class Tiempo {
private _tiempoInicial;
private tiempoActual?;
private tiempoPrevio?;
private temporizadores;
constructor();
/**Retorna el número de temporizadores activos.*/
get numeroTemporizadores(): number;
/**Retorna el momento en milisegundos de la instanciación de este objeto.*/
get tiempoInicial(): number;
/**Retorna el tiempo en milisegundos transcurrido desde la última vez que se consultó .delta.
* Si no se lo ha consultado antes, retorna el tiempo transcurrido desde la instanciación del objeto Tiempo.
*/
get delta(): number;
/**Ejecuta una función un número determinado de veces por segundo.*/
iterarPorSegundo(funcion: () => void, numeroIteraciones: number): void;
/**Crea un termporizador nuevo con la duración ingresada y lo agrega a la lista de temporizadores de la composición.*/
crearTemporizador(tiempoMilisegundos: number): Temporizador;
/**Elimina del registro de temporizadores aquellos que estén inactivos.*/
actualizarTemporizadores(): void;
}
declare class Composicion {
/**Herramienta Dibujante.*/
dibujante: Dibujante;
/**Conjunto de cuerpos sobre los que trabaja la composición.*/
cuerpos: Cuerpo[];
/**Conjunto de formas sobre las que trabaja la composición.*/
formas: Forma[];
cuadricula: Cuadricula;
tiempo: Tiempo;
contenedores: Contenedor[];
private _entorno;
fps: number;
usarfpsNativos: boolean;
tick: number;
/**Si es "true" la animación se ejecuta, si es "false" se pausa.*/
animar: boolean;
/**El id del proceso que está ejecutando la animación.*/
private _idFuncionAnimationFrame?;
nivelesQuadTree: number;
trazarQuadTree: boolean;
private constructor();
/**Retorna el canvas sobre el que se creó la Composición.*/
get canvas(): HTMLCanvasElement;
/**Retorna la medida horizontal del canvas.*/
get anchoCanvas(): number;
/**Retorna la media vertical del canvas. */
get altoCanvas(): number;
/**Retorna un punto ubicado en el centro del canvas.*/
get centroCanvas(): Punto;
/**Retorna el color del canvas.*/
get colorCanvas(): string | undefined;
/**Modifica la medida horizontal del canvas.*/
set anchoCanvas(ancho: number);
/**Modifica la medida vertical del canvas. */
set altoCanvas(alto: number);
/**Modifica el color del canvas.*/
set colorCanvas(color: string);
set entorno(entorno: Entorno);
get entorno(): Entorno;
/**Retorna un objeto de tipo Composicion a partir del id de un canvas.*/
static crearConIdDelCanvas(idCanvas: string): Composicion;
/**Retorna un objeto de tipo Composicion a partir de un canvas.*/
static crearConCanvas(canvas: HTMLCanvasElement): Composicion;
/**Define el ancho y el alto del canvas, en pixeles. */
tamanoCanvas(ancho: number, alto: number): void;
/**Agrega cuerpos al conjunto de cuerpos manipulados por la composición. */
agregarCuerpos(...cuerpos: Cuerpo[]): void;
/**Actualiza la posición del conjunto de cuerpos sumando la velocidad instantánea a la posición.*/
moverCuerpos(): void;
/**Calcula la colisión entre los cuerpos de la composición y resuelve sus choques como choques elásticos.*/
reboteElasticoCuerpos(): void;
/**Calcula la colisión entre los cuerpos de la composición y evita que los cuerpos se solapen.*/
contactoSimpleCuerpos(): void;
/**Método gráfico. Pinta el interior de los cuerpos de la composición en el canvas.*/
rellenarCuerpos(): void;
/**Método gráfico. Traza los cuerpos de la composición en el canvas.*/
trazarCuerpos(): void;
/**Método gráfico. Pinta y/o rellena los cuerpos de la composición, según lo definido para cada cuerpo.*/
dibujarCuerpos(): void;
/**Método gráfico. Pinta y/o rellena las formas de la composición, según lo definido para cada forma.*/
dibujarFormas(): void;
/**Crea un loop para ejecutar dos funciones, una asociada a la duración de cada tick y otra a los fps.
* El atributo .tick permite cambiar su duración en milisegundos.
* La propiedad .fps permite ajustar su número.
*/
animacion(funcionCalcular: () => void, funciondibujar: () => void): void;
bordesEntornoInfinitos(entorno: Entorno): void;
limitarVelocidad(magnitudVelMaxima: number): void;
/**Detiene definitivamente la animación en en curso.*/
cancelarAnimacion(): void;
}
declare class ManejadorEventos {
/**Agrega un eventListener para eventos de teclado. Recibe una función callback y opcionalmente un parámetro si la función lo requiere.*/
static eventoTeclado<Type>(tipoEvento: EventoTeclado, tecla: CodigoTecla, manejarEvento: (param: Type) => void, parametro?: Type): void;
/**Agrega un eventListener para eventos de teclado tipo keyup. Recibe una función callback y opcionalmente un parámetro si la función lo requiere.*/
static eventoKeyup<Type>(tecla: CodigoTecla, manejarEvento: (param: Type) => void, parametro?: Type): void;
/**Agrega un eventListener para eventos de teclado tipo keydown. Recibe una función callback y opcionalmente un parámetro si la función lo requiere.*/
static eventoKeydown<Type>(tecla: CodigoTecla, manejarEvento: (param: Type) => void, parametro?: Type): void;
/**Agrega un eventListener para eventos de teclado tipo keypress. Recibe una función callback y opcionalmente un parámetro si la función lo requiere.*/
static eventoKeypress<Type>(tecla: CodigoTecla, manejarEvento: (param: Type) => void, parametro?: Type): void;
/**Agrega un eventListener para eventos de mouse y para trabajar con las propiedades del evento.
* Recibe una función callback y opcionalmente un parámetro si la función lo requiere.*/
static eventoMouseEnCanvas<K>(tipoEvento: EventoMouse, canvas: HTMLCanvasElement, manejarEvento: (eventoMouse: MouseEvent, param: K) => void, parametro?: K): void;
/**Agrega un eventListener para detectar cambios en el mouse, mas no trabaja con el evento.
* Recibe una función callback y opcionalmente un parámetro si la función lo requiere.*/
static mouseEnCanvas<K>(tipoEvento: EventoMouse, canvas: HTMLCanvasElement, manejarEvento: (param: K) => void, parametro?: K): void;
/**Previene que se activen acciones por defecto al presionar la tecla definida. */
static anularAccionPorDefecto(tecla: CodigoTecla): void;
}
/**Constante que almacena los códigos de eventos de teclado.*/
declare const CODIGOSTECLA: {
readonly espacio: " ";
readonly enter: "Enter";
readonly arriba: "ArrowUp";
readonly abajo: "ArrowDown";
readonly izquierda: "ArrowLeft";
readonly derecha: "ArrowRight";
readonly a: "a";
readonly b: "b";
readonly c: "c";
readonly d: "d";
readonly e: "e";
readonly f: "f";
readonly g: "g";
readonly h: "h";
readonly i: "i";
readonly j: "j";
readonly k: "k";
readonly l: "l";
readonly m: "m";
readonly n: "n";
readonly ñ: "ñ";
readonly o: "o";
readonly p: "p";
readonly q: "q";
readonly r: "r";
readonly s: "s";
readonly t: "t";
readonly u: "u";
readonly v: "v";
readonly w: "w";
readonly x: "x";
readonly y: "y";
readonly z: "z";
readonly mas: "+";
readonly menos: "-";
};
/**Tipo para los códigos de eventos de teclado.*/
type CodigoTecla = keyof typeof CODIGOSTECLA;
/**Tipo para los tipos de evento de teclado.*/
type EventoTeclado = keyof Pick<WindowEventMap, 'keydown' | 'keypress' | 'keyup'>;
/**Tipo para los tipos de evento de mouse.*/
type EventoMouse = keyof Pick<WindowEventMap, 'mousedown' | 'mouseenter' | 'mousemove' | 'mouseleave' | 'mouseup' | 'mouseout' | 'mouseover' | 'click'>;
export { Celda, Cinematica, Colision, Composicion, Contenedor, Cuadricula, Cuerpo, Dibujante, Entorno, Forma, Fuerza, Geometria, Grabador, Interaccion, Lapiz, ManejadorEventos, Matematica, type OpcionesControlesCuerpo, type OpcionesCuerpo, type OpcionesForma, type OpcionesGraficasForma, type OpcionesGraficasTexto, type OpcionesGraficasVector, type Punto, QuadTree, Restriccion, Temporizador, Tiempo, TipoFormas, Vector };