我需要测量在python结合的圆的区域的面积改变的值。我想出了使用numpy数组的方式。首先,我用零填充一个网格(numpy数组),网格中的每个位置对应的长度为0.5cm。然后我将圆的中心放到网格上,并在网格中将此值更改为1。我知道圆的半径,所以我可以计算圆的面积,因为我知道圆的面积,我改变了圆的区域中的网格中的零点。然后我计算网格中的频率,并用它来计算组合圆的面积,因为我知道网格中每个位置的长度,我可以计算出面积。目前这是一种非常粗糙的谷物方法,我计划一旦确定了算法,就将其更改为更精细的谷物。
例
如果你看我贴下面的图片,描述我的想法更好。我的网格上有两个圆圈(红线),圆圈的中心标有蓝色方块,圆圈占据的区域是浅橙色。我想改变与橙色标记的区域。我现在可以将橙色的方块水平和垂直地改变为圆心,但是从中心对角线的方格会给我带来麻烦。
当前代码
class area():
def make_grid(self):
'''
Each square in the grid represents 0.5 cm
'''
import numpy as np
grid = np.zeros((10,10))
square_length = 0.5
circles = {'c1':[[4,2],1.5],'c2':[[5,6],2.0]}
print grid
for key,val in circles.iteritems():
grid[val[0][0]][val[0][1]] = 1
area = int((val[1] - square_length)/0.5)
for i in xrange(1,area+1):
grid[val[0][0]][val[0][1]+i] = 1 # Change column vals in +ve direction
grid[val[0][0]][val[0][1]-i] = 1 # Chnage column vals in -ve direction
grid[val[0][0]+i][val[0][1]] = 1 # Chnage row vals in +ve direction
grid[val[0][0]-i][val[0][1]] = 1 # Chnage row vals in -ve direction
print ''
print grid
在上述词典中,关键是圆名称,在值的第一个元素是圆心坐标和所述第二元件是圆的半径。
代码输出:
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 1. 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 1. 0. 0. 0. 1. 0. 0. 0.]
[ 1. 1. 1. 1. 1. 0. 1. 0. 0. 0.]
[ 0. 0. 1. 1. 1. 1. 1. 1. 1. 1.]
[ 0. 0. 1. 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
你不是应该改为通过满格步进的面积,计算出到每个圆心为每个网格的距离点,然后看看它是否在圈内并且将网格点计数器加1?这样,有些点将会有2个而不是1个,但是至少圆中的所有点(舍入问题除外)都将被计数。这是慢的,因为你必须通过所有的点,但它可能更直接。 – Evert 2013-03-15 12:27:38
你认为几何解决方案“测量面积”? http://mathworld.wolfram.com/Circle-CircleIntersection.html – MBo 2013-03-15 12:35:32
我已经考虑过一个几何解决方案,但是如果我有多个圆圈,并且在这个问题中描述了'缺少区域',就会出现问题:http://stackoverflow.com/questions/1667310 /合并区域的重叠圆圈 – Harpal 2013-03-15 12:38:14