Simulacion en 3D
Autor : René Curín
Competencia : Creatividad e innovación
Asignatura: Programacion para la integracion de sistemas
Palabras claves: Python, VisualPython, Codigo.
Palabras claves: Python, VisualPython, Codigo.
Descripción de la actividad
Crear una interfaz en donde se muevan robots de forma aleatoria por un mapa. Estos robots peuden moverse encualquier angulo de 360°, con 3 velocidades diferentes, ademas cada robots debe contar con un nivel de bateria que se ira descargando a medida que se mueva, y cuando alcanze un tope minimo de bateria este debe volver a la base.
Enunciado de la actividad:
Programe una interfaz donde se mueven los robos de manera aleatoria por el mapa. Los robot comienzan moviéndose en cualquier ángulo (0°-359°) con tres velocidades distintas (1,2,3). Cuando los robots chocan con los bordes del mapa deben rebotar teniendo en cuenta su ángulo de impacto. Cada robot dispone de una Batería, la cual se descarga 0.1% toda vez que el robot se mueve. Los robot inician sus movimientos con la Bateria al 100% de carga. Cuando la carga es igual o menor al 5%, el robot debe retornar a su Base para cargar sus baterías. Luego el proceso se repite.
Objetivos principales
- Aprender a utilizar librerias de manejos de objetos 3D
Objetivos principales
- Aprender a utilizar librerias de manejos de objetos 3D
- Crear una interfaz distinguible
. Crear una forma de movimiento para cada robot
Herramientas utilizadas:
- Python 2.7
- Libreria Visual Python (Vpython).
Desarrollo de la actividad:
Estrategia de Trabajo:
La estrategia de trabajo empleado comenzo por analizar como debia ser la interfaz del programa para que se movieran los robots, luego buscamos la forma de poder mover los robots dentro del mapa sin que estos se salgan de su borde, creamos la manera de generar una bateria que se descargara con los movimientos y por ultimo comenzamos a programar todo lo que teniamos analizado
Modelo de Solución:
La solucion del problema comenzo por analizar todas las posibles situaciones, luego programar nuestra interfaz, seguido, dibujamos e insertamos los robots en nuestra interfaz, para los robots creamos una clase que contendria tanto los movimientos, como los limites que debe alcanzar el robot para devolverse y los niveles de bateria disminuyeran.
Codigo Fuente
from visual import *
import math
scene.width = 800
scene.height = 600
f = frame(pos=vector(0,0,0))
base = box(frame = f,pos = vector(0,0,0), size = (30, 0.5, 40), material=materials.wood)
orilla_1 = box(frame = f,pos = vector(15,0.4,0), size = (0.5, 1.5, 40), material=materials.wood)
orilla_2 = box(frame = f,pos = vector(-15,0.4,0), size = (0.5, 1.5, 40), material=materials.wood)
orilla_3 = box(frame = f,pos = vector(0,0.4,20), size = (30.5, 1.5, 0.5), material=materials.wood)
orilla_4 = box(frame = f,pos = vector(0,0.4,-20), size = (30.5, 1.5, 0.5), material=materials.wood)
base_p1 = box(frame = f,pos = vector(12,0.3,17), size = (3, 0.1, 3), material=materials.rough)
base_p2 = box(frame = f,pos = vector(-12,0.3,-17), size = (3, 0.1, 3), material=materials.rough)
base_p3 = box(frame = f,pos = vector(-12,0.3,17), size = (3, 0.1, 3), material=materials.rough)
base_p4 = box(frame = f,pos = vector(12,0.3,-17), size = (3, 0.1, 3), material=materials.rough)
p1 = cylinder(pos = vector(12, 0,-17), axis = (0, 1, 0), radius = (0.8), color = color.red)
p2 = cylinder(pos = vector(-12, 0,-17), axis = (0, 1, 0), radius = (0.8), color = color.blue)
p3 = cylinder(pos = vector(12, 0,17), axis = (0, 1, 0), radius = (0.8), color = color.yellow)
p4 = cylinder(pos = vector(-12, 0,17), axis = (0, 1, 0), radius = (0.8), color = color.green)
class robot():
def __init__(self,robot, base):
self.robot = robot
self.base = base
self.angulo = random.randint(0,359)
self.x = math.sin(self.angulo)
self.z = math.cos(self.angulo)
self.velocidad = random.randint(1, 4)
self.por_x = 1
self.por_z = 1
self.bateria = 10
def mov(self):
if self.bateria > 5:
self.robot.x += (self.x * self.velocidad) * self.por_x
self.robot.z += (self.z * self.velocidad) * self.por_z
if self.robot.x > 15 and self.por_x == 1: #>15 1 -1
self.por_x = -1
elif self.robot.x > 15 and self.por_x == -1: #> 15 -1 1
self.por_x = 1
if self.robot.x < -15 and self.por_x == 1: #<-15 1 -1
self.por_x = -1
elif self.robot.x < -15 and self.por_x == -1: #<-15 -1 1
self.por_x = 1
if self.robot.z > 20 and self.por_z == -1:
self.por_z = 1
elif self.robot.z > 20 and self.por_z == 1:
self.por_z = -1
if self.robot.z < -20 and self.por_z == 1:
self.por_z = -1
elif self.robot.z < -20 and self.por_z == -1:
self.por_z = 1
self.bateria -= 0.1
#print self.bateria
else:
self.llegar_base()
def llegar_base(self):
if self.base.x != self.robot.x:
if self.robot.x < self.base.x:
self.robot.x += 1
else:
self.robot.x -= 1
if self.base.z != self.robot.z:
if self.robot.z < self.base.z:
self.robot.z += 1
else:
self.robot.z -= 1
#print self.robot.x, self.robot.z
if int(self.base.x) == int(self.robot.x):
self.robot.x = self.base.x
if int(self.base.z) == int(self.robot.z):
self.robot.z = self.base.z
if int(self.robot.x) == int(self.base.x) and int(self.robot.z) == int(self.base.z):
self.load_batery()
def load_batery(self):
ba = 0
for i in range(10000):
if i % 100 == 0:
ba += 1
#print i
self.bateria = ba
cont = 0
r1 = robot(p1, base_p1)
r2 = robot(p2, base_p2)
r3 = robot(p3, base_p3)
r4 = robot(p4, base_p4)
while 1:
rate(100)
r1.mov()
r2.mov()
r3.mov()
r4.mov()
import math
scene.width = 800
scene.height = 600
f = frame(pos=vector(0,0,0))
base = box(frame = f,pos = vector(0,0,0), size = (30, 0.5, 40), material=materials.wood)
orilla_1 = box(frame = f,pos = vector(15,0.4,0), size = (0.5, 1.5, 40), material=materials.wood)
orilla_2 = box(frame = f,pos = vector(-15,0.4,0), size = (0.5, 1.5, 40), material=materials.wood)
orilla_3 = box(frame = f,pos = vector(0,0.4,20), size = (30.5, 1.5, 0.5), material=materials.wood)
orilla_4 = box(frame = f,pos = vector(0,0.4,-20), size = (30.5, 1.5, 0.5), material=materials.wood)
base_p1 = box(frame = f,pos = vector(12,0.3,17), size = (3, 0.1, 3), material=materials.rough)
base_p2 = box(frame = f,pos = vector(-12,0.3,-17), size = (3, 0.1, 3), material=materials.rough)
base_p3 = box(frame = f,pos = vector(-12,0.3,17), size = (3, 0.1, 3), material=materials.rough)
base_p4 = box(frame = f,pos = vector(12,0.3,-17), size = (3, 0.1, 3), material=materials.rough)
p1 = cylinder(pos = vector(12, 0,-17), axis = (0, 1, 0), radius = (0.8), color = color.red)
p2 = cylinder(pos = vector(-12, 0,-17), axis = (0, 1, 0), radius = (0.8), color = color.blue)
p3 = cylinder(pos = vector(12, 0,17), axis = (0, 1, 0), radius = (0.8), color = color.yellow)
p4 = cylinder(pos = vector(-12, 0,17), axis = (0, 1, 0), radius = (0.8), color = color.green)
class robot():
def __init__(self,robot, base):
self.robot = robot
self.base = base
self.angulo = random.randint(0,359)
self.x = math.sin(self.angulo)
self.z = math.cos(self.angulo)
self.velocidad = random.randint(1, 4)
self.por_x = 1
self.por_z = 1
self.bateria = 10
def mov(self):
if self.bateria > 5:
self.robot.x += (self.x * self.velocidad) * self.por_x
self.robot.z += (self.z * self.velocidad) * self.por_z
if self.robot.x > 15 and self.por_x == 1: #>15 1 -1
self.por_x = -1
elif self.robot.x > 15 and self.por_x == -1: #> 15 -1 1
self.por_x = 1
if self.robot.x < -15 and self.por_x == 1: #<-15 1 -1
self.por_x = -1
elif self.robot.x < -15 and self.por_x == -1: #<-15 -1 1
self.por_x = 1
if self.robot.z > 20 and self.por_z == -1:
self.por_z = 1
elif self.robot.z > 20 and self.por_z == 1:
self.por_z = -1
if self.robot.z < -20 and self.por_z == 1:
self.por_z = -1
elif self.robot.z < -20 and self.por_z == -1:
self.por_z = 1
self.bateria -= 0.1
#print self.bateria
else:
self.llegar_base()
def llegar_base(self):
if self.base.x != self.robot.x:
if self.robot.x < self.base.x:
self.robot.x += 1
else:
self.robot.x -= 1
if self.base.z != self.robot.z:
if self.robot.z < self.base.z:
self.robot.z += 1
else:
self.robot.z -= 1
#print self.robot.x, self.robot.z
if int(self.base.x) == int(self.robot.x):
self.robot.x = self.base.x
if int(self.base.z) == int(self.robot.z):
self.robot.z = self.base.z
if int(self.robot.x) == int(self.base.x) and int(self.robot.z) == int(self.base.z):
self.load_batery()
def load_batery(self):
ba = 0
for i in range(10000):
if i % 100 == 0:
ba += 1
#print i
self.bateria = ba
cont = 0
r1 = robot(p1, base_p1)
r2 = robot(p2, base_p2)
r3 = robot(p3, base_p3)
r4 = robot(p4, base_p4)
while 1:
rate(100)
r1.mov()
r2.mov()
r3.mov()
r4.mov()
Imagen de dmostracion:
De que me sirvió esta actividad:
La actividad sirvio como un puente para lo que es la creacion y modelado de objetos 3D asi como tambien programarlos y darles movimientos creados por uno mismo, ademas de la utilizacion de factores como las matematicas ya que para poder calcular los grados de movimiento y el angulo de rebote con los border tuve que utilzar algunas ecuaciones matematicas para poder resolver el problema sin mayoeres complicaciones.
No hay comentarios:
Publicar un comentario