Skip to content

Instantly share code, notes, and snippets.

@alejandroave
Created May 24, 2013 05:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alejandroave/5641514 to your computer and use it in GitHub Desktop.
Save alejandroave/5641514 to your computer and use it in GitHub Desktop.
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import random
class Baliada():##nodos principales
def __init__(self, posx,posy,posz,ran):
self.posx = posx ## pos x
self.posy = posy ## pos y
self.posz = posz ## pos z
self.ran = ran ## rango
self.cond = 0 ##saber si fue avisado
self.ttl = 0 ##ttl actual del nodo
##funcion para sacar si se encuentra dentro del rango
def calcud(x1,x2,y1,y2,z1,z2,lim):
d = (abs(x1-x2)**2 + abs(y1-y2)**2 + abs(z1-z2)**2)**0.5
if d < lim:
return 1
else:
return 0
plt.ion() ## para que tenga animacion
fig = plt.figure() #inicialisamos
ax = fig.add_subplot(111, projection='3d') ##formato 3D
c,m = 'r','o' ##color y tipo de la figura
cordenadas = [] ##cordenadas de los nodos
ttli = 5 ## ttl inicial
ax.set_xlabel('X') ##nombre de los ejes
ax.set_ylabel('Y')
ax.set_zlabel('Z')
for i in range(20): ##creamos los puntos principales
x = random.randint(0,50)
y = random.randint(0,50)
z = random.randint(0,50)
cordenadas.append(Baliada(x,y,z,15))
ax.scatter(x, y, z, c=c, marker=m) ##dibujamos
plt.draw()
x = 25 ##cordenadas del nodo de referencia
y = 25
z = 25
d = "b"
vuelta = 0
while True:
plt.hold() ##limpiamos
xx = random.randint(0,1) ##movemos nodo de referencia
yy = random.randint(0,1)
zz = random.randint(0,1)
if xx == 0:
x = x - 5
else:
x = x + 5
if yy == 0:
y = y - 5
else:
y = y + 5
if zz == 0:
z = z - 5
else:
z = z + 5
ax.scatter(x, y, z, "g", marker=m) ##dibujamos
ax.text(x, y, z ,'Nodo R', fontsize=10) ##texto del nodo de referencia
for i in range(len(cordenadas)): ##verificamos si puede ver al nodo de referencia
cal = calcud(cordenadas[i].posx,x,cordenadas[i].posy,y,cordenadas[i].posz,z,cordenadas[i].ran)
if cal == 1 and cordenadas[i].ttl == 0: # en caso que si y no alla sido marcado como avisado
ax.plot([cordenadas[i].posx,x],[cordenadas[i].posy,y],[cordenadas[i].posz,z])
cordenadas[i].ttl = ttli
cordenadas[i].cond = 1
else:## en caso que no
if cordenadas[i].cond == 1: ##se verifica si fue marcado
for j in range(len(cordenadas)):##si es asi verifica si puede enviar mensajes a sus vecinos
if i != j:
cal = calcud(cordenadas[i].posx,cordenadas[j].posx,cordenadas[i].posy,cordenadas[j].posy,cordenadas[i].posz,cordenadas[j].posz,cordenadas[i].ran)
if cal == 1 and cordenadas[j].cond == 0:
cordenadas[j].cond = 1
cordenadas[j].ttl = cordenadas[i].ttl - 1
ax.plot([cordenadas[i].posx,cordenadas[j].posx],[cordenadas[i].posy,cordenadas[j].posy],[cordenadas[i].posz,cordenadas[j].posz])
ax.text(cordenadas[j].posx, cordenadas[j].posy, cordenadas[j].posz ,'ttl: '+str(cordenadas[j].ttl)+'', fontsize=10)
if cordenadas[i].cond == 1:##si fue marcado para un color
ax.scatter(cordenadas[i].posx, cordenadas[i].posy, cordenadas[i].posz, "g", marker=m)
else:##si aun no es marcado para otro color
ax.scatter(cordenadas[i].posx, cordenadas[i].posy, cordenadas[i].posz, c=c, marker=m)
ax.text(cordenadas[i].posx, cordenadas[i].posy, cordenadas[i].posz ,'ttl: '+str(cordenadas[i].ttl)+'', fontsize=10)
plt.draw()##dibujamos
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment