首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >氯化钠晶体

氯化钠晶体
EN

Stack Overflow用户
提问于 2020-07-06 02:48:08
回答 1查看 411关注 0票数 1

我试着做这个练习:

氯化钠晶体中的钠和氯原子排列在立方晶格上,但钠和氯之间的原子相互交替,使得每个钠被六氯包围,每个氯被六钠包围。用两种不同的颜色来表示这两种类型的原子,创建氯化钠晶格的可视化。

我的代码是:

代码语言:javascript
复制
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))

但我知道这个数字:

从这个角度,您可以看到它是不正确的,因为有相同颜色的列。我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 03:31:48

首先,所提供的代码不会为具有预期取向的氯化钠生成一个排列良好的晶格。

考虑每个输出的前几个数字。

代码语言:javascript
复制
>>> 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个近邻,因此所尝试的球并不是一个紧密堆积的立方格,而是全部展开的。实际上,你做错的是在格点上应用一个偏移量,而你真的不应该这样做,引入球体之间的空隙,使之在视觉上看起来是不对的。

为了正确地做到这一点,慢慢地,一步一步地走,迭代该层的每个单元格,并一步一步地渲染球体。让我们先从二维棋盘模式开始。

请考虑以下几点:

代码语言:javascript
复制
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层

代码语言:javascript
复制
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参数和颜色一起修改,您可能希望将这些元素指定为可以通过关键词参数扩展传入的两个字典。

代码语言:javascript
复制
size = 5
elements = [
    {'radius': 0.6, 'color': vec(0, 1, 0)},
    {'radius': 0.4, 'color': vec(0.6, 0.1, 1)},
]

for z in range(-size, size):
    for y in range(-size, size):
        for x in range(-size, size):
            sphere(pos=vector(x, y, z), **elements[(x + y + z) % 2])                                                                             

这将模仿维基百科上可能发现的氯化钠晶体结构图 (视图旋转以更清楚地显示结果)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62748545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档