2012-07-07 35 views
1

Donc je veux dessiner un treillis cubique simple en Python en utilisant le paquet visuel. J'ai une manière simple de faire un treillis avec de petites sphères qui ont toutes la même couleur, mais je veux que les couleurs alternent: pour faire un treillis de NaCl, j'ai besoin d'une sphère d'une couleur entourée de 6 sphères d'autres Couleur.Tracer un treillis cubique en Python

donc je l'ai fait:

from __future__ import division 
from visual import sphere,color 

L = 5 
R = 0.3 

even = [] 
odd = [] 

for i in range(-L,L+1): 
    if i%2==0: 
     even.append(i) 
    else: 
     odd.append(i) 

for i in even: 
    for j in even: 
     for k in even: 
      sphere(pos=[i,j+1,k+1],radius=R,color=color.green) 

for i in odd: 
    for j in odd: 
     for k in odd: 
      sphere(pos=[i,j,k],radius=R,color=color.yellow) 

Et je reçois des sphères d'une couleur à côté de speres de couleur différente, mais ils sont en lignes:

lattice

Mais je en ai besoin de alternate: \ Le placement correct est seulement dans la direction i. Comment est-ce que je corrige les autres pour faire un simple treillis cubique? J'ai essayé de jouer avec les positions des sphères (i, j, k + -numéro), mais de cette façon j'ai obtenu le réseau bcc (une sphère verte au milieu, d'autres autour).

Je suis coincé ...

Répondre

3

Qu'est-ce que vous auriez besoin est ceci:

from visual import sphere,color 

count = 3 
R=0.3 

for x in range(-count,count+1): 
    for y in range(-count,count+1): 
     for z in range(-count,count+1): 
      if ((x+y+z+3*count)%2) == 0: 
       sphere(pos=[x,y,z],radius=R,color=color.green) 
      else: 
       sphere(pos=[x,y,z],radius=R,color=color.yellow) 

Le point est, vous devez changer de couleur selon que la somme des (intégrale, dans ce cas) les coordonnées sont divisibles par 2 ou pas.

+0

Cela fonctionne :) J'ai essayé de faire quelque chose avec si la boucle d'autre, mais je ne pouvais pas obtenir le droit de positionnement. Merci :) –

1

Une version légèrement généralisée:

from visual import sphere,color 
from itertools import product 

L = 2 
R = 0.25 

xvals = range(-L, L+1) 
yvals = range(-L, L+1) 
zvals = range(-L, L+1) 

colorfn = lambda *args: [color.yellow, color.green][sum(args)%2] 

for pos in product(xvals, yvals, zvals): 
    sphere(pos=pos, radius=R, color=colorfn(*pos)) 

résultats dans

enter image description here

+0

Fonctionne aussi, je devrais regarder dans ce code, le ci-dessus semble plus simple à comprendre, mais merci aussi pour aider :) –