Simulación del movimiento que produce la gravedad en partículas que varian en tamaño y masa.
Nuestro programa recibe parametros como la constante de gravitación y cantidad y rango de tamaño de particulas en pantalla, para poder observar los diferentes comportamientos de este fenomeno.
Instituciones gubernamentales como la NASA necesitan programas de simulación que les ayuden a seguir el trayecto o ruta de objetos en el espacio, y su comportamiento en relación con los cuerpos de gran masa como el Sol y los planetas.
Es de gran ayuda también para ver la influencia de cometas y la luna con nuestros satélites artificiales, para impedir que estos últimos salgan de orbita o se estrellen.
Ley de la Gravitación Universal de Newton
Esta ley establece que los efectos de la gravedad son siempre atractivos, y la fuerza resultante se calcula respecto al centro de la gravedad de ambos objetos.
La fuerza es mayor si los objetos estan próximos y mientras se van alejando pierden esa intensidad.
La G es la constante de gravitación universal, con un valor de 6.674x10^-11.
En nuestro programa este es un parametro que recibimos como entrada debido a que usamos esa constante G sería imposible ver mover las particulas.
Valores ficticios para la constante G debido a que si represetaramos una partícula del tamaño de una hormiga y otra del tamaño de la torre Eiffel aparte de ser practicamente imposible, no se podría ver el efecto de atracción, es por eso que la G debe tomar valores que podamos ver en la simulación.
Lenguajes y Herramientas
El lenguaje usado fué Python con la librería Pygame.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
#--------------------------------------------------------- | |
#Recibimos como primer parametro la cantidad de particulas | |
#como segundo la proporcion de tamanos | |
#y como tercero la G constante gravitacional | |
#---------------------------------------------------------- | |
#Autores | |
#Juan Carlos Espinosa Ceniceros | |
#Ramon Gonzalez Barrera | |
#Roberto Carlos Martinez Moreno | |
#Sandra Cecilia Urbina Coronado | |
#---------------------------------------------------------- | |
import pygame | |
from pygame.locals import * | |
import random, math, sys | |
# ================================================== | |
# -------- CONSTANTES --------- | |
PARTICULAS_DEFAULT = 50 | |
PROPORCION_DEFAULT = 20 | |
GCONSTANTE_DEFAULT = .01 | |
gconstante = 0 | |
PARTICULAS = list() | |
# --------- PANTALLA ---------- | |
PANTALLA = { | |
'ANCHO': 800, | |
'ALTO': 600, | |
'RESOLUCION': (800, 600), | |
'FPS': 30 | |
} | |
# --------- COLORES ---------- | |
COLORES = { | |
'NEGRO': (0,0,0), | |
'BLANCO': (255,255,255) | |
} | |
# --------- PYGAME ---------- | |
pygame.init() | |
fpsClock = pygame.time.Clock() | |
VENTANA = pygame.display.set_mode(PANTALLA['RESOLUCION']) | |
pygame.display.set_caption('Particulas') | |
# ================================================== | |
class Particula: | |
def __init__(self, ID, radio, color): | |
self.id = ID | |
self.x = random.randint(10,PANTALLA['ANCHO']) | |
self.y = random.randint(10,PANTALLA['ALTO']) | |
self.velocidadX = 0.0 | |
self.velocidadY = 0.0 | |
self.radio = radio | |
self.masa = self.radio*2 | |
self.color = color | |
def mueve(self): | |
global PARTICULAS | |
global gconstante | |
for p2 in PARTICULAS: | |
if(self.id != p2.id): | |
distanciaX = self.x - p2.x | |
distanciaY = self.y - p2.y | |
distanciaT = math.sqrt((distanciaX**2) + (distanciaY**2)) | |
if distanciaT < 10: | |
distanciaT = 10 | |
#fuerza = (G*M*M)/(R**2) | |
fuerza = gconstante*(self.masa * p2.masa) / (distanciaT**2) | |
#F = M*A -> aceleracion = F/M | |
aceleracion = fuerza / self.masa | |
XComponent = distanciaX / distanciaT | |
YComponent = distanciaY / distanciaT | |
self.velocidadX -= aceleracion * XComponent | |
self.velocidadY -= aceleracion * YComponent | |
self.x += self.velocidadX | |
self.y += self.velocidadY | |
self.dibuja() | |
else: | |
pass | |
def choca(self): | |
pass | |
def dibuja(self): | |
global VENTANA, COLORES | |
pygame.draw.circle(VENTANA, self.color, (int(self.x), int(PANTALLA['ALTO'] - self.y)), int(round(self.radio))) | |
def getInput(): | |
presiona = pygame.key.get_pressed() | |
for event in pygame.event.get(): | |
if event.type == QUIT or presiona[K_ESCAPE]: | |
pygame.quit() | |
sys.exit() | |
def main(): | |
global gconstante | |
if(len(sys.argv) > 1): | |
try: | |
cantidadParticulas = int(sys.argv[1]) | |
except: | |
cantidadParticulas = PARTICULAS_DEFAULT | |
try: | |
proporcion = int(sys.argv[2]) | |
except: | |
proporcion = PROPORCION_DEFAULT | |
try: | |
gconstante = int(sys.argv[3]) | |
except: | |
gconstante = GCONSTANTE_DEFAULT | |
else: | |
cantidadParticulas = PARTICULAS_DEFAULT | |
proporcion = PROPORCION_DEFAULT | |
gconstante = GCONSTANTE_DEFAULT | |
print 'Se dibujaran [%d] particulas' % cantidadParticulas | |
for a in range(cantidadParticulas): | |
color = (random.randint(0,255), random.randint(0,255), random.randint(0,255)) | |
radio = random.randint(5,proporcion) | |
particula = Particula(a, radio,color) | |
PARTICULAS.append(particula) | |
print 'Se creo la particula %d' % particula.id | |
while True: | |
VENTANA.fill(COLORES['NEGRO']) | |
for p in PARTICULAS: | |
getInput() | |
p.mueve() | |
pygame.display.flip() | |
if __name__ == '__main__': | |
main() |
Video