2014-04-01 11 views
6

Ich habe ein Array zeichnen, die 100 * 100 sein, ich Wie kann ich einen Kreis in einem Datenfeld/Karte in Python

map[x][y]

irgendwie jeden Punkt wie

zugreifen kann es wie folgt aussehen:

for i in map: 
    for ii in i: 
     print ii, 
    print '\n', 

Ausgang:

. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 
. . . . . . . . . . . 

ich einen Kreis machen möchte es gerne:

. . . . . # . . . . . 
. . . # # . # # . . . 
. . # . . . . . # . . 
. # . . . . . . . # . 
. # . . . . . . . # . 
# . . . . . . . . . # 
. # . . . . . . . # . 
. # . . . . . . . # . 
. . # . . . . . # . . 
. . . # # . # # . . . 
. . . . . # . . . . . 

Wie kann ich das tun?

Ich möchte versuchen, ein Triangulationssystem zu machen, wo ich den Punkt finden werde, dass 3 Kreise überlappen werden. Gibt es noch eine andere Möglichkeit, dies zu erreichen?

Ich möchte nur die Entfernung (Punkte von der Mitte) und die Richtung.

Antwort

8

Die Grundformel für einen Kreis ist

(x - a)**2 + (y - b)**2 = r**2 

wobei (x, y) ein Punkt ist, (a, b) ist der Mittelpunkt des Kreises und r der Radius ist.

width, height = 11, 11 
a, b = 5, 5 
r = 5 
EPSILON = 2.2 

map_ = [['.' for x in range(width)] for y in range(height)] 

# draw the circle 
for y in range(height): 
    for x in range(width): 
     # see if we're close to (x-a)**2 + (y-b)**2 == r**2 
     if abs((x-a)**2 + (y-b)**2 - r**2) < EPSILON**2: 
      map_[y][x] = '#' 

# print the map 
for line in map_: 
    print ' '.join(line) 

Dies führt zu

. . . # # # # # . . . 
. . # . . . . . # . . 
. # . . . . . . . # . 
# . . . . . . . . . # 
# . . . . . . . . . # 
# . . . . . . . . . # 
# . . . . . . . . . # 
# . . . . . . . . . # 
. # . . . . . . . # . 
. . # . . . . . # . . 
. . . # # # # # . . . 

Sie werden mit dem Wert für EPSILON mit dieser Methode zur Geige haben.

Alternativ kann durch Winkel iterieren und berechnen die (x, y) Koordinate wie Sie

import math 
# draw the circle 
for angle in range(0, 360, 5): 
    x = r * math.sin(math.radians(angle)) + a 
    y = r * math.cos(math.radians(angle)) + b 
    map_[int(round(y))][int(round(x))] = '#' 

gehen Gibt:

. . . # # # # # . . . 
. # # . . . . . # # . 
. # . . . . . . . # . 
# . . . . . . . . # # 
# . . . . . . . . . # 
# . . . . . . . . . # 
# . . . . . . . . . # 
# . . . . . . . . . # 
. # . . . . . . . # . 
. # # . . . . . # # . 
. . . # # # # # . . . 
1

Die Formel des Kreises ist

(x-a)^2 + (y-b)^2 - r^2 = 0 

wo x, y coodrinates der Punkt sind, a, b sind Koordinaten der Mitte und r ist der Kreisradius. Finde einfach alle Punkte, für die diese Gleichung zutrifft. Da Ihr Feld eine Ganzzahl ist, müssen Sie =0 durch <1 oder sogar <= 1 ersetzen, was auch immer am besten aussieht.