lunes, 28 de mayo de 2012

Proyecto Final Simulación

Descripción del proyecto
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.

¿Por qué simular la gravedad?
 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. 

Fórmulas para la atracción de cuerpos
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.







Código
#!/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()
view raw gistfile1.py hosted with ❤ by GitHub







Presentación 


Video

viernes, 25 de noviembre de 2011

Construyendo herramientas

Para la fase 3 de laboratorio de Programación de Sistemas adaptativos, nos hemos topado con un problema de herramientas, nos fué difícil encontrar alguna que hiciera en Ubuntu la funcionalidad que hace Objectmarker(el cual no pudimos correr en Ubuntu), es poreso que nos dimos un pequeño tiempo para programar algo que lo hiciera.
Para quienes no saben la funcionalidad de la herramienta es tener alguna imágen en donde sale el objeto a identificar, de ahí encerrar en un cuadro y/u obtener las coordenadas de la parte superior izquierda de dicho rectángulo, y el largo y ancho del mismo.

Lenguajes utilizados:

Python: Para hacer el script que renombre todas las imágenes en formato *.jpg, esto se puede modificar si desean aceptar más formatos de imágenes.

JavaScript: Utilizado para hacer en el navegador la interfaz con Canvas de Html5 y obtener las coordenadas.

Script en python para renombrar:



El html:



Parte del JavaScript:





Es importante decir que el javascript empieza leyendo imágenes que van del 0.jpg a cualquier número(como lo hace el script). Si quiere por ejemplo que empieze del 300.jpg tendrá que modificar la variable "cont" global que se declara al inicio en javascript, Y para tener las imágenes nombradas del 300 en adelante o del 0 o cualquier numero en el script de Python se debe modificar la variable "empieza".
Los scripts, el html y el css DEBEN de estar en la misma carpeta.



Aquí muestro como se ve en el navegador:





Descargas:

renombrar.py
estilo.css

imagenes.js
imagenes.html