如何用圆方程和周期边界条件绘制圆[Python]?

时间:2016-12-05 19:01:28

标签: python geometry

我必须写一个2D Ising模型模拟,我不会忽视远处邻居的影响,所以我想计算一个圆圈内的旋转。

我写了一个简单的函数,可以得到一个网格的元素。

def countInCircle(g, x, y, r):
    spinSum = 0
    for R in range(0, r + 1, 1):
        for i in range(0, g.shape[0], 1):
            for j in range(0, g.shape[1], 1):
                if ((i - x) ** 2 + (j - y) ** 2) == R:
                    spinSum = spinSum + g[i][j]

    return spinSum

它就像一个魅力,但如果它是网格的一部分,它会削减圆圈的某些部分。我应该如何解决周期性边界条件?

提前致谢!

1 个答案:

答案 0 :(得分:0)

这是一个解决方案。它使用numpy数组并以这样一种方式移动网格,即人们可以轻松地将给定点r周围的半径(x,y)内的所有元素相加。一些有用的问题是

以下代码中有一个限制:2 * radius + 1必须小于或等于网格的最小形状。

import numpy as np

def countInCircle(grid, x, y, r):
    #restriction: 2*r+1 < min(g.shape)
    shifted_grid=np.roll(np.roll(grid,shift=-x+r,axis=0),shift=-y+r,axis=1)
    Y,X = np.ogrid[-r: r+1, -r: r+1]    
    mask = X**2+Y**2 <= r**2
    return np.sum(shifted_grid[mask])

g  = np.ones((5,5))    
s  = countInCircle(g, 0, 0, 2)
print "s = ", s
# setting r=2 and summing all ones around (0,0) gives 13. Works fine. 

# setting some spin (-1,0,1) particles
g2 = np.random.randint(-1,2, size=(10,15))
print g2
s  = countInCircle(g2, 3,9, r=3)
print "s = ", s