4

環境

Pythonで結合された円の面積を測定する必要があります。numpy 配列を使用する方法を思いつきました。まず、グリッド (numpy 配列) にゼロを入力します。グリッド内の各位置は 0.5cm の長さに対応します。次に、円の中心をグリッドにドロップし、グリッドでこの値を 1 に変更します。円の半径を知っているので、円の面積を計算できます。円の面積を知っているので、グリッドのゼロを変更して、円の面積に収まるようにします。次に、グリッド内の 1 の頻度をカウントし、これを使用して組み合わせた円の面積を計算します。これは、グリッド内の各位置の長さを知っているため、面積を計算できます。これは現在、非常に粗い方法です。アルゴリズムが完成したら、より細かい方法に変更する予定です。

以下に投稿した画像を見ると、私のアイデアをよりよく説明しています。グリッドには 2 つの円 (赤い線) があり、円の中心は青い四角でマークされ、円が占める領域は明るいオレンジ色で示されます。オレンジ色でマークされた領域を 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

上記の辞書では、キーは円の名前、値の最初の要素は円の中心座標、2 番目の要素は円の半径です。

コードは次を出力します。

[[ 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.]]
4

4 に答える 4

1

モンテカルロ法を使用して、重複領域の領域を見つけることができます。そうすれば、より正確になります。 http://www.chem.unl.edu/zeng/joy/mclab/mcintro.html

正方形の境界を見つけてから乱数を入力し、乱数ごとに乱数が円の内側にあるかどうかを確認します。

if (np.sqrt((xx - val[0][0]) ** 2 + (yy - val[0][1]) ** 2) <= radius) :inside=inside+1

面積=円内の総ピクセル数/生成された総ピクセル数*正方形の面積

于 2013-03-15T13:02:13.850 に答える
1

中心から左右に直接検索しているだけです。中心から斜めの正方形を取得するには、おそらくピタゴラスの定理を使用する必要があります。定理を使用すると、辺の長さとして円の中心に対する水平方向と垂直方向の両方のオフセットを使用して、正方形の斜辺を見つけることができます。次に、斜辺を半径と比較し、斜辺が 2 つのうち短い場合は、2 乗値を 1 増やします。

また、中心として正方形の中央を使用していないため、radius の使用法は少し奇妙です。これにより、半径 2 の円の直径は 3.5 になります。

于 2013-03-15T12:33:42.847 に答える
0

停止条件をわずかに変更してFloodfill アルゴリズムを使用できます。色と円の中心までの距離の両方を考慮してください。

PS 低サイズ領域のハック方法: 塗りつぶされた円を描き、色のピクセルを数えます...

于 2013-03-15T12:58:41.623 に答える