2017-08-20 4 views
0

私は、配列の各要素が1または0、土地を表す0および水を表す0のいずれかである、 。私は、2つのランダムな座標を円の中心、半径(最大5)の変数とし、配列内の必要な要素を置き換えて完全な円にするアルゴリズムが必要です。2D配列内に円を作成するためのアルゴリズム編集:ダイヤモンドは大丈夫ですaswel

x = random.randint(0,MAPWIDTH) 
y = random.randint(0,MAPHEIGHT) 
rad = random.randint(0,5) 

tileMap[x][y] = 1 #this creates the center of the circle 

どうすればよいですか?

+0

ここでの主な問題は、あなたの半径が本当に大きいか、座標に小数点が含まれていない限り、円の近くには行けないことです。 – Adi219

+0

半径が十分に大きい場合(例えば25)、私はちょうどalgorythmが必要です –

+0

半径5または10の円はグリッド上でどのように見えますか? – Anonta

答えて

0

以前にそうようにあなたは、円の定義を使用することができ、前記のように:

import math 

def dist(x1, y1, x2, y2): 
    return math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) 

def make_circle(tiles, cx, cy, r): 
    for x in range(cx - r, cx + r): 
     for y in range(cy - r, cy + r): 
      if dist(cx, cy, x, y) <= r: 
       tiles[x][y] = 1 

width = 50 
height = 50 

cx = width // 2 
cy = height // 2 
r = 23 

tiles = [[0 for _ in range(height)] for _ in range(width)] 

make_circle(tiles, cx, cy, r) 

print("\n".join("".join(map(str, i)) for i in tiles)) 

これは私が意図的にかなり大きな配列と半径を使用

00000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000 
00000000000000000000000001000000000000000000000000 
00000000000000000001111111111111000000000000000000 
00000000000000001111111111111111111000000000000000 
00000000000000111111111111111111111110000000000000 
00000000000001111111111111111111111111000000000000 
00000000000111111111111111111111111111110000000000 
00000000001111111111111111111111111111111000000000 
00000000011111111111111111111111111111111100000000 
00000000111111111111111111111111111111111110000000 
00000001111111111111111111111111111111111111000000 
00000001111111111111111111111111111111111111000000 
00000011111111111111111111111111111111111111100000 
00000111111111111111111111111111111111111111110000 
00000111111111111111111111111111111111111111110000 
00001111111111111111111111111111111111111111111000 
00001111111111111111111111111111111111111111111000 
00001111111111111111111111111111111111111111111000 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00111111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00011111111111111111111111111111111111111111111100 
00001111111111111111111111111111111111111111111000 
00001111111111111111111111111111111111111111111000 
00001111111111111111111111111111111111111111111000 
00000111111111111111111111111111111111111111110000 
00000111111111111111111111111111111111111111110000 
00000011111111111111111111111111111111111111100000 
00000001111111111111111111111111111111111111000000 
00000001111111111111111111111111111111111111000000 
00000000111111111111111111111111111111111110000000 
00000000011111111111111111111111111111111100000000 
00000000001111111111111111111111111111111000000000 
00000000000111111111111111111111111111110000000000 
00000000000001111111111111111111111111000000000000 
00000000000000111111111111111111111110000000000000 
00000000000000001111111111111111111000000000000000 
00000000000000000001111111111111000000000000000000 
00000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000 

注出力 - この結果を実際にサークルを少しだけ良く見えるようになりました。半径が約5の場合、おそらく信念を超えてピクセル化されます。

+0

円を作成する関数を実行すると、xとcx、yとcyはまったく同じですか? –

+0

私はこれを実行すると、私はparralellogramを取得するため、 –

+0

申し訳ありません、それはおそらく私の部分にいくつかの明確な命名です。 'cx'はcyと同じ中心x座標を参照し、forループのxとyは位置を反復します。 –

1

((x – h)(x - h)) + ((y – k)(y - k)) = r * rがtrueの場合は、座標を1に設定する必要があります。 hは中央のx座標で、kは中央のy座標です。

+0

forループでこれをどのように実装するのですか? –

関連する問題