Created
May 24, 2013 05:49
-
-
Save alejandroave/5641514 to your computer and use it in GitHub Desktop.
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
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