Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从整数创建球体最近邻列表_Python_Geometry - Fatal编程技术网

Python 从整数创建球体最近邻列表

Python 从整数创建球体最近邻列表,python,geometry,Python,Geometry,我试图在python中构造一个最近邻列表,它将节点的最近邻存储在有限的3d六边形最近邻填充(HCP)晶格中。我已经用二维正方形晶格定义了这样的结构。我不需要坐标,但这只是一种快速的方法,可以从整数列表中为HCP创建最近邻列表。下面是我如何使用方形晶格完成此任务的示例代码 N = int #number of nodes L = side # a 32x32 graph, L would be 32 for i in range(N): nearNeighbor[i][0] = (i

我试图在python中构造一个最近邻列表,它将节点的最近邻存储在有限的3d六边形最近邻填充(HCP)晶格中。我已经用二维正方形晶格定义了这样的结构。我不需要坐标,但这只是一种快速的方法,可以从整数列表中为HCP创建最近邻列表。下面是我如何使用方形晶格完成此任务的示例代码

N = int #number of nodes
L = side # a 32x32 graph, L would be 32

for i in range(N):

    nearNeighbor[i][0] = (i + 1 ) % N
    nearNeighbor[i][1] = (i + (N - 1)) % N
    nearNeighbor[i][2] = (i + L) % N
    nearNeighbor[i][3] = (i + N - L) % N

    if (i-L < 0):
         nearNeighbor[i][3] = -2
    if (i+L >= N):
         nearNeighbor[i][2] = -2
    if (i%L) == 0:
         nearNeighbor[i][1] = -2     
    if ((i+1)%L) == 0:
         nearN[eighbori][0] = -2
N=int#节点数
L=边#一个32x32的图形,L将是32
对于范围(N)中的i:
近邻[i][0]=(i+1)%N
近邻[i][1]=(i+(N-1))%N
近邻[i][2]=(i+L)%N
近邻[i][3]=(i+N-L)%N
如果(i-L<0):
近邻[i][3]=-2
如果(i+L>=N):
近邻[i][2]=-2
如果(i%L)==0:
近邻[i][1]=-2
如果((i+1)%L)==0:
nearN[eighbori][0]=-2

就这样。现在,一个HCP晶格,当被可视化时,就像一个紧密堆积在一起的巨大球体立方体。每个节点最多应该有12个最近的邻居,它们应该出来组成一个立方体。我想我主要想知道如何使用整数和模运算来表示HCP晶格,就像我对正方形晶格所做的那样。你能帮我堆叠一下吗?

这个问题的答案取决于人们如何选择截断HCP晶格并为其编制索引。一个选择是

选择此选项后,以下代码将返回给定站点的邻居列表

def neighbors(i, W, H, D):
  A = W * H

  plane = i / A
  plane_index = i % A
  row = plane_index / W
  col = plane_index % W

  r = -1 if row % 2 else 1   # (-1)**row
  p = -1 if plane % 2 else 1 # (-1)**plane

  nbors = []

  # first include neighbors in same plane
  if col != W-1: nbors.append(i+1)
  if col != 0:   nbors.append(i-1)
  if row != H-1: nbors.append(i+W)
  if row != 0:   nbors.append(i-W)
  if (col != 0 or r > 0) and (col != W-1 or r < 0):
    if row != H-1: nbors.append(i+W+r)
    if row != 0:   nbors.append(i-W+r)

  # now add neighbors from other planes
  if plane != D-1: nbors.append(i+A)
  if plane != 0:   nbors.append(i-A)

  if (col != 0 or p < 0) and (col != W-1 or p > 0):
    if plane != D-1: nbors.append(i+A-p)
    if plane != 0:   nbors.append(i-A-p)

  if ((col != W - 1 or p > 0 or r < 0) and
      (col != 0 or p < 0 or r > 0) and
      (row != H-1 or p < 0) and
      (row != 0 or p > 0)):
    if plane != D-1:
      nbors.append(i + A + p*W + (r-p)/2) #10
    if plane != 0:
      nbors.append(i - A + p*W + (r-p)/2) #11

  return nbors

请注意,测试并没有涵盖所有独特类型的网站,因此,可能仍然有一个角落的情况是错误的。

我最初写了一个更长的答案,激发并构建了这段代码。但是,SO给了我一个关于我的帖子如何“似乎包含未正确格式化为代码的代码”(尽管它似乎正确地呈现了所有内容)。如果有人想要更长的描述,让我知道,我会把它放在其他地方。这真的很有帮助,谢谢!我还对你的详细描述感兴趣,也许还有如何在其他配置中找到最近的邻居(比如巨大球体中的球体填充)。我真的很感激。更多细节请参阅。
def test_neighbors():
  n = lambda i: set(neighbors(i, 5, 5, 5))

  # test bottom layer
  assert n(0) == set([1,5,6,25,30])
  assert n(2) == set([1,3,7,8,26,27,32])
  assert n(4) == set([3,9,28,29,34])
  assert n(5) == set([0,6,10,30])
  assert n(9) == set([3,4,8,13,14,33,34,38])
  assert n(20) == set([15,16,21,45])
  assert n(21) == set([16,17,20,22,45,46])
  assert n(24) == set([19,23,48,49])

  # test second layer
  assert n(25) == set([0,1,26,30,31,50,51])
  assert n(34) == set([4,9,28,29,33,38,39,54,59])
  assert n(36) == set([7,11,12,31,32,35,37,41,42,57,61,62])
  assert n(49) == set([24,44,48,74])