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

如何使用圆方程和周期边界条件[Python]绘制圆?,python,geometry,Python,Geometry,我必须写一个二维伊辛模型模拟,在这里我不会忽略远处邻居的影响,所以我想计算一个圆中的自旋 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

我必须写一个二维伊辛模型模拟,在这里我不会忽略远处邻居的影响,所以我想计算一个圆中的自旋

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
我已经写了一个简单的函数,可以得到一个网格的元素,它们在一个圆中

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
它就像一个符咒,但如果它是网格的ouf,它会减少圆的一些部分。对于周期边界条件,我应该如何解决这个问题


提前谢谢

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

以下代码中有一个限制,即2*半径+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
将numpy导入为np
def计数圆(网格,x,y,r):
#限制:2*r+1mask=X**2+Y**2不幸的是,不清楚你在问什么。“如果它是网格的ouf,它会切割圆的某些部分”是什么意思?边界条件在哪里起作用?是
x
y
整数吗?那么距离
(0,0)
平方米(2)的像素
g[1][1]
会有什么影响呢?好的,通过“t减少圆的某些部分,如果它是网格的ouf”,我的意思是,如果我想在半径为r=10,中心为2,2的圆中计数,函数会“减少”圆的顶部和左侧(因为这将超出网格),这是一个问题,因为:我应该使用周期性边界条件:网格的顶行与网格的底部“相邻”,网格的左侧与网格的右侧“相邻”。因此圆的顶部(当前被切割)应该是“进来”在网格的底部,左边在右边,我问的另外两个问题呢?它不适合585个字符。是的,x,y是整数。是的,它将被计算。因为这是在一个r=1的圆上,所以如果圆有(0,0)原点,所以条件是1^2+1^2==1。但是对于R=2,它是1^2+1^2==2。但是现在我已经写下了,我认为我的代码中有一个错误。条件应该有R^2。实际上我不知道为什么,但是如果我使用R,它会起作用,但如果我使用R^2,它不会起作用。但是我的主要问题是周期边界条件。我的意思是:如果你的半径是
r=2
你应该合计超过13个站点,但你的代码只合计超过9个站点(十字中心在(x,y))忽略四个中间像素。不管它是R还是R^2,你只计算那些给出整数的值——这对我来说是违反直觉的,因为自旋应该是各向同性的。它可以工作,而且比我的代码快得多。(同时,我也修改了我的代码,除了周期性边界条件外,它似乎还可以工作。我删除了外部for,并将内部条件更改为math.sqrt((I-x)**2+(j-y)**2)