1
Off-topic / Re: Dudas sobre contar contactos (o colisiones, cosa de juegos).
« en: 15 Mayo, 2024, 01:48 pm »
Hombre, pues por contar puedes contar lo que quieras...
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
class Escalera
{
constructor (posicion, altura)
{
this.posicion = posicion;
this.altura = altura;
this.veces_contactada = {
por_arriba: 0,
por_abajo: 0,
por_izquierda: 0,
por_derecha: 0
}
}
sumarNuevoContacto (direccion)
{
this.veces_contactada[direccion] += 1;
}
actualizarNumeroDeContactosConPersonaje (personaje)
{
if (personaje.posicion.x == this.posicion.x &&
personaje.posicion.y == this.posicion.y)
{
this.sumarNuevoContacto ('por_abajo');
if (personaje.velocidad.x > 0) this.sumarNuevoContacto ('por_izquierda');
else this.sumarNuevoContacto ('por_derecha')
}
if (personaje.posicion.x == this.posicion.x &&
personaje.posicion.y == this.posicion.y + this.altura)
{
this.sumarNuevoContacto ('por_arriba');
if (personaje.velocidad.x > 0) this.sumarNuevoContacto ('por_izquierda');
else this.sumarNuevoContacto ('por_derecha')
}
}
}
class Personaje
{
constructor (posicion, velocidad)
{
this.posicion = posicion;
this.velocidad = velocidad;
}
}
let tu_personaje = new Personaje ({x: 3, y: 0}, {x: -5, y: 0});
let escalera1 = new Escalera ({x: 3, y: 0}, 5);
escalera1.actualizarNumeroDeContactosConPersonaje (tu_personaje);
// Ahora el atributo veces_contadas de escalera1 pasa a ser
// { por_arriba: 0, por_abajo: 1, por_izquierda: 0, por_derecha: 1 }
let escalera1 = new Escalera ({x: 3, y: 0}, 5);
let escalera2 = new Escalera ({x: 20, y: 3}, 8);
let escalera3 = new Escalera ({x: 10, y: 5}, 6);
let escaleras = [escalera1, escalera2, escalera3];
for (let i = 0; i < escaleras.length; i++)
{
escaleras[i].actualizarNumeroDeContactosConPersonaje (tu_personaje);
}
Vamos a la definición aceptada de número primo...
Definimos "número primo" como aquel número natural que sólo es divisible por 1 y por él mismo.
(1) La definición de número primo, reconoce como factor de un número primo a un número que no es primo
(2) y si todo número es un producto de números primos, no puede tener un factor que sea un número no primo.
Lo del núcleo de alta densidad no lo entiendo....
Si la gravedad depende de las masas, el núcleo "tiraría" de la corteza hasta hacer una esfera maciza....
Eso le pregunté con el experimento Cavendish....
Recuerda que todo lo referido a insertar imágenes deben ser subidas al foro. Dado que da la casualidad que la url no está disponible, no puedo ayudarte a subir la imagen. Si se trata de un video, se puede subir a YouTube y pegar el enlace.
lo que vemos en tu simulación son los primeros momentos del inicio del planeta, y además vemos lo que pasa en el exterior, pero no lo que pasa en el interior.
video de la simulación.
Como podéis ver en el interior la materia de las capas más interiores (color verde) se desplazan hacia la superficie y la materia de las capas superiores (color azul) se desplazan hacia el centro. Llegando a crearse una esfera hueca de un radio menor al inicial. La materia está siendo comprimida.
me gustaría que se pueda cambiar el valor con la rueda del mouse. Quizás de manera /10 para cada valor porque tienen mínimos y máximos diferentes (así, para pasar de 0% a 100% haya que hacer como máximo 10 scroll up con la rueda); o bien hacerlo más básico e ir modificando de a 1 unidad, ya que no hay decimales. O quizás haya algo más elegante.
Observa lo siguiente si pones 2 partículas en el universo con velocidades iniciales aleatorias, mientras no escapen, es decir que su velocidad relativa sea menor que $$v<\sqrt{\dfrac{2G(M+m)}{R}}$$ lo mas probable es que se orbiten indefinidamente, no que choquen, pero veo muy propenso al sistema a que provoque colisiones
no logro ver que se produzcan orbitas estables, que es lo mas común que debe ocurrir, así que se me ocurre que puede estar el error en el truncamiento de los números calculados, con que precisión los trabajas?
como aporte a la mejora simplemente en el choque podrías elegir que la masa final es la suma de las masas individuales, y el volumen aditivo
El radio final entre las partículas i y j creando una nueva k sería $$m_k=m_i+m_j$$ y $$r_k=\sqrt[3]{r_i^3+r_j^3}$$
Con la suficiente cantidad de tiempo quedará una sola partícula, pero que sin importar el número inicial de estas nunca se forma una estructura hueca, así funciona la naturaleza
Primero que nada gracias , estoy muy contento con que la idea haya colado y te haya motivado a programarlo.
Además ...Wow, quien pudiera jugar con cosas así, he hecho cosas más pobres visualmente, pero cuando lo pusiste a rotar en el espacio e hiciste zoom, quedé alucinado.
hay como una concentración de partículas al centro que puede ser a causa de la perspectiva o a la propia distribución aleatoria que por tener mas espesor la esfera en el centro habrá mas partículas sobre esa línea de visión, por las dudas revisa si esta bien la aleatoriedad.
no se si será la escala pero veo grandes en tamaño a las partículas respecto del diámetro de la esfera contenedora, agrandar \( R \) o bajar \( r_i \) sería un consejo, pero quizá se pierda definición cuando todo se aglomere en el centro a lo largo del tiempo
La idea de fondo de la simulación funciona bien cuando el número de partículas $$n$$ es muy elevado para un $$R$$ grande, pero se ralentiza el cálculo entre posición y posición, además se tarda mas en aglutinar todo, si aumentas n quizá te convenga primero calcular todas la posiciones para cada tiempo, guardarlas en una base de datos y luego solo ejecuta la parte visual, donde se ven las trayectorias usando los datos y no calculándolos en el mismo tiempo de ejecución...
Se podría comenzar la simulación dándole una velocidad, dirección y sentido inicial a cada partícula
por cierto habría que poder visualizar un corte de la esfera en un determinado momento, para ver si es hueca o no... quizá sea mucho pedir
por más evidencia que presentes el fanatismo será superior
Propuse que todas las partículas tengan la misma densidad, pero no es necesario, la idea era que todas eran esferas de la misma densidad por lo tanto su radio quedaba definido solo con la masa, pero la simulación funciona si asignas un radio y una masa independientes , hay pocas rocas mucho menos densas que el agua densidad 1 (ej leca) ni nada más denso que 22 el osmio con esos en mente puedes saber que tratas con particulas más o menos reales.
De ese modo tienes cierto límite para el radio en función de la masa.
Es más fácil calcular la distancia de un impacto si son esferas.
Una simulación clarificadora
Podría presentarlo programado pero no trabajo gratis para nadie que no lo apreciará jajapara programarDefinimos
el espacio de trabajo variable $$R$$ digamos 1000 unidades
el número de partículas $$n$$ unas 100 para que no sean pocas ni muchas
el tiempo entre evaluación y evaluación el sistema, muy corto evoluciona lento, muy largo es impreciso supongamos $$t=1$$
definimos el valor $$G$$ que puede ser el de la constante de gravitación, pero como todo es proporcional a este número los resultados no difieren si se lo escoge unitario $$G=1$$ valores mas chicos hacen mas lenta la evolución
la densidad volumétrica de las masas $$\rho$$ , es anecdótica sirve para definir un radio de cada partícula
definimos una matriz o arreglo con $$n$$ filas y 11 columnas(masa $$mi$$ ,$$ri$$ radio propio,$$x,y,z,vx,vy,vz,fx,fy,fz$$ )
con un bucle hasta $$n$$, asignamos aleatoriamente
asignamos aleatoriamente $$mi$$, masa de la partícula
con esto definimos su radio $$ri =\sqrt[3]{\dfrac{mi}{rho \frac43 \pi}}$$
asignamos aleatoriamente $$0<r<R$$ distancia respecto del centro
asignamos aleatoriamente $$0<\theta<2\pi$$ ángulo respecto del centro
asignamos aleatoriamente $$0<\varphi<\pi$$ ángulo azimutal respecto del centro
con $$r , \theta$$ y $$\varphi$$ traducimos coordenadas esféricas a cartesianas asegurando que todas las partículas estén dentro de una esfera de radio $$R$$
$$xi = r\sen\,\theta\,\cos\varphi$$
$$yi = r\sen\,\theta\sen\,\varphi$$
$$zi = r \,\cos\theta$$
suponemos que la velocidad inicial de las partículas es nula
$$vxi=0$$
$$vyi=0$$
$$vzi=0$$
hacemos el inicio de un contador de tiempo $$T$$ iniciando en cero
Iniciamos un bucle hasta que el tiempo $$T$$ sea el deseado $$T>1000000$$ por ejemplo
luego para cada partícula de 1 a $$n$$ llamada con subíndice $$i$$ hacemos un bucle
se ponen a cero cada componente del vector fuerza que siente cada partícula $$i$$
$$fxi=0$$
$$fyi=0$$
$$fzi=0$$
y otro bucle de 1 a $$n$$ con subíndice $$j$$
si $$i=j$$ no hacemos nada
calculamos la distancia entre partículas
$$dij=\sqrt{(xi-xj)^2+(yi-yj)^2+(zi-zj)^2}$$
si $$dij<ri+rj$$ las partículas están en contacto, su ponemos un choque inelástico donde
$$xi=xj=\dfrac{mi\cdot xi+mj\cdot xj}{mi+mj}$$
$$yi=yj=\dfrac{mi\cdot yi+mj\cdot yj}{mi+mj}$$
$$zi=zj=\dfrac{mi\cdot zi+mj\cdot zj}{mi+mj}$$
$$vxi=vxj=\dfrac{mi\cdot vxi+mj\cdot vxj}{mi+mj}$$
$$vyi=vyj=\dfrac{mi\cdot vyi+mj\cdot vyj}{mi+mj}$$
$$vzi=vzj=\dfrac{mi\cdot vzi+mj\cdot vzj}{mi+mj}$$
esto tratará las dos partículas como si fueran una sola y ya no calculara mas su interacción sin alterar el número de partículas del programa
y evitará divisiones por cero
si la $$dij$$ es mayor entonces
calculamos cada contribución de fuerza de cada partícula de 1 a $$n$$ como
$$fxi=fxi+G\cdot mi\cdot mj (xj-xi)/dij^3$$
$$fyi=fyi+G\cdot mi\cdot mj (yj-yi)/dij^3$$
$$fzi=fzi+G\cdot mi\cdot mj (zj-zi)/dij^3$$
al final del ciclo j tendremos la fuerza que siente la partícula i
asignamos esos valores a la matriz de datos
reiteramos para todas la partículas i terminando el ciclo i
luego trabajamos sobre la cinematica
en un nuevo ciclo i
calculamos la aceleracion como
$$axi=fxi/mi$$
$$ayi=fyi/mi$$
$$azi=fzi/mi$$
la nueva velocidad en ese instante
$$vxi=vxi+axi\cdot t$$
$$vyi=vyi+ayi\cdot t$$
$$vzi=vzi+azi\cdot t$$
y la nueva posición en ese instante
$$xi=xi+vxi\cdot t+\dfrac12 axi \cdot t^2$$
$$yi=yi+vyi\cdot t+\dfrac12 ayi \cdot t^2$$
$$zi=zi+zxi\cdot t+\dfrac12 azi \cdot t^2$$
cerrar el ciclo
luego un proceso para representar en pantalla , cada partícula con su radio, y transformar la posición 3d calculada en 2d de pantalla
hacemos que sume tiempo el contador
$$T=T+t$$
y cerramos el ciclo del contador $$T$$ así todo se vuelve a recalcular cada un tiempo $$t$$
Que surge de esto ....
- En pantalla debe observarse la disminución de la cantidad de partículas cada vez que chocan.
- Que cada vez que se acercan mas al centro mas velocidad adquieren,
- Que siempre habrá una dirección en el espacio donde se formar un plano o disco de acreción,
- Con la suficiente cantidad de tiempo quedará una sola partícula, pero que sin importar el número inicial de estas nunca se forma una estructura hueca, así funciona la naturaleza, así DCM modela su formación de tierra hueca , y si en modelos no funciona en la naturalez tampoco.
- En realidad no hace falta modelizar los choques inelásticos, pero si no se hace, se verá que de alguna manera el sistema tiene que liberarse de energía cinetica debido a la conservación de la energía y se lo podrá observar expulsando algunas masas fuera del sistema, si tienen mas velocidad que la de escape , nunca regresan, sino pueden permanecer en órbitas largas como los asteroides, o la nube de oort ... pero bueno hay que meter muchas partículas de variada masa para ver efectos notables, y un pc muy rápido...
[cerrar]
con esto definimos su radio $$ri =\sqrt[3]{\dfrac{mi}{\rho \frac43 \pi}}$$
DaniM, menos ningunear a las personas y más argumentos matemáticos o físicos o lógicos.
Por lo que vemos es un cambio total del paradigma actual sobre los astros del universo.
Quizá con una animación se entendería mejor, porque no entiendo bien ¿por qué si un trozo de materia atrae otros quedaría hueco con trozos dentro? Pero en 3d está difícil.
The idea is this:
You can take an object, any object, and fit a line to it. For example, imagine you have some object with a curve. You can fit part of a sine, cosine, or polynomial function to that curve and, for at least part of that fitted function, that curve will be traced.
Now cut off the part of the fitted function that doesn't fit the rest of that curve (since trig functions are periodic and polynomials change direction).
The next step is to repeat this fitting processes where you left off on the last line. After repeating this process you will end up with a ton of different spliced together lines that "perfectly" fit any possible shape you want.
No sé cómo lo ha hecho él, pero Wolfram Mathematica te permite hacerlo con cualquier tipo de contorno si no recuerdo mal, utilizando series de Fourier con un determinado número de sumandos. A más sumandos, más precisión. En el siguiente enlace lo explican en más detalle:
https://mathematica.stackexchange.com/questions/171755/how-can-i-draw-a-homer-with-epicycloids
Entonces, lo que haría yo, diseñaría una curva en algún programa como inkscape o similar, y luego le aplicaría lo comentado en el enlace anterior. Además hoy en día con lenguajes de programación como Julia seguro se puede implementar lo mismo que con Wolfram Mathematica de manera mucho más eficiente, en principio utilizando wavelets en vez de senos y cosenos, ya que son más indicados en general para trabajo digital.
the idea is to transform each point as a complex number (z) and take the Discrete Fourier Transform (cn) up to a prescribed order m