Python 氯化钠晶体
我试着做这个练习: 氯化钠晶体的钠和氯原子排列在立方体上 但原子在钠和氯之间交替,所以每一个钠 被六个氯包围,每个氯被六个钠包围。 使用两种不同的颜色创建氯化钠晶格的可视化 表示两种类型的原子 我的代码是:Python 氯化钠晶体,python,numpy,physics,vpython,Python,Numpy,Physics,Vpython,我试着做这个练习: 氯化钠晶体的钠和氯原子排列在立方体上 但原子在钠和氯之间交替,所以每一个钠 被六个氯包围,每个氯被六个钠包围。 使用两种不同的颜色创建氯化钠晶格的可视化 表示两种类型的原子 我的代码是: from vpython import * from numpy import * L = 5 R = 0.5 for i in range(-L,L,2): for j in range(-L,L,2): for k in range(-L,L,2):
from vpython import *
from numpy import *
L = 5
R = 0.5
for i in range(-L,L,2):
for j in range(-L,L,2):
for k in range(-L,L,2):
sphere(pos=vector(i,j,k),radius = R, color = vec(0,1,1))
for l in range(-L+1,L+1,2):
for m in range(-L+1,L+1,2):
for n in range(-L+1,L+1,2):
sphere(pos=vector(l,m,n),radius = R, color = vec(1,1,0))
但我得到这个数字:
从这个角度看,这是不正确的,因为有相同颜色的列。我做错了什么?首先,提供的代码没有生成具有预期方向的氯化钠排列良好的晶格 考虑每个输出的前几个数字
>>> for i in range(-L,L,2):
... for j in range(-L,L,2):
... for k in range(-L,L,2):size = 5
... print(i, j, k)
...
-5 -5 -5
-5 -5 -3
-5 -5 -1
...
>>> for l in range(-L+1,L+1,2):
... for m in range(-L+1,L+1,2):
... for n in range(-L+1,L+1,2):
... print(l, m, n)
...
-4 -4 -4
-4 -4 -2
-4 -4 0
...
如果前一个球体将后一个球体偏移一个单位,则每个球体将有10个相邻球体,而不是6个相邻球体。这就解释了为什么球体被渲染得相距很远,而且每个球体似乎都有10个邻居,因此所尝试的并不是紧密堆积的立方晶格,而是全部展开。实际上,您所做的错误是在您确实不应该的情况下对晶格应用偏移,在球体之间引入间隙,使其在视觉上看起来不清晰
为了正确地执行此操作,请缓慢地执行此操作,每次执行一步,迭代该层的每个单元,并一次性渲染球体。让我们先从二维棋盘模式开始
请考虑以下内容:
from vpython import *
from numpy import *
size = 5
radius = 0.5
# predefine the colours
elements = [
vec(0, 1, 1),
vec(1, 1, 0),
]
z = 0 # pin z to just a single layer
for y in range(-size, size):
for x in range(-size, size):
sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y) % 2])
通过简单地加上x和y来计算颜色,然后取结果的模2来确定使用哪种颜色,因为奇数和偶数之和将产生奇数,否则它们是偶数,渲染出来的这个数学特性将有我们的第一层。这里是StackOverflow
事实证明,此属性也适用于Z层
for z in range(-size, size):
for y in range(-size, size):
for x in range(-size, size):
sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y + z) % 2])
这将产生你所期望的结果。现在,如果要同时修改radius参数和颜色,可能需要将元素指定为两个字典,可以通过以下方式传入:
这将模拟旋转的视图,以便更清楚地显示结果
首先,所提供的代码没有生成具有预期取向的氯化钠的良好排列晶格 考虑每个输出的前几个数字
>>> for i in range(-L,L,2):
... for j in range(-L,L,2):
... for k in range(-L,L,2):size = 5
... print(i, j, k)
...
-5 -5 -5
-5 -5 -3
-5 -5 -1
...
>>> for l in range(-L+1,L+1,2):
... for m in range(-L+1,L+1,2):
... for n in range(-L+1,L+1,2):
... print(l, m, n)
...
-4 -4 -4
-4 -4 -2
-4 -4 0
...
如果前一个球体将后一个球体偏移一个单位,则每个球体将有10个相邻球体,而不是6个相邻球体。这就解释了为什么球体被渲染得相距很远,而且每个球体似乎都有10个邻居,因此所尝试的并不是紧密堆积的立方晶格,而是全部展开。实际上,您所做的错误是在您确实不应该的情况下对晶格应用偏移,在球体之间引入间隙,使其在视觉上看起来不清晰
为了正确地执行此操作,请缓慢地执行此操作,每次执行一步,迭代该层的每个单元,并一次性渲染球体。让我们先从二维棋盘模式开始
请考虑以下内容:
from vpython import *
from numpy import *
size = 5
radius = 0.5
# predefine the colours
elements = [
vec(0, 1, 1),
vec(1, 1, 0),
]
z = 0 # pin z to just a single layer
for y in range(-size, size):
for x in range(-size, size):
sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y) % 2])
通过简单地加上x和y来计算颜色,然后取结果的模2来确定使用哪种颜色,因为奇数和偶数之和将产生奇数,否则它们是偶数,渲染出来的这个数学特性将有我们的第一层。这里是StackOverflow
事实证明,此属性也适用于Z层
for z in range(-size, size):
for y in range(-size, size):
for x in range(-size, size):
sphere(pos=vector(x, y, z), radius=radius, color=elements[(x + y + z) % 2])
这将产生你所期望的结果。现在,如果要同时修改radius参数和颜色,可能需要将元素指定为两个字典,可以通过以下方式传入:
这将模拟旋转的视图,以便更清楚地显示结果