【发布时间】:2013-03-04 03:51:47
【问题描述】:
上下文
我需要在 python 中测量组合圆的面积。我想出了使用 numpy 数组的方法。首先,我用零填充一个网格(numpy 数组),网格中的每个位置对应于 0.5 厘米的长度。然后我将圆心放到网格上,并在网格中将此值更改为 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
在上面的字典中,key是圆的名字,value的第一个元素是圆心坐标,第二个元素是圆的半径。
代码输出:
[[ 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.]]
【问题讨论】:
-
您不应该逐步遍历整个网格,计算每个网格点到每个圆心的距离,然后查看它是否在圆内并将网格点计数器加一吗?这样,一些点将有 2 而不是 1,但至少圆内的所有点(舍入问题除外)都将被计算在内。它比较慢,因为您必须逐步完成所有要点,但它可能更简单。
-
你考虑几何解“测量面积”吗? mathworld.wolfram.com/Circle-CircleIntersection.html
-
我已经考虑过几何解决方案,但是如果我有多个带有“缺失区域”的圆圈,如本问题所述:stackoverflow.com/questions/1667310/…
标签: python algorithm numpy computational-geometry