2016-03-31 3 views
0

Mit Python 3 möchte ich herausfinden, wie viele vollständige und wie viele partielle quadratische Kacheln (Seitenlänge 1 Einheit) einen Kreis mit einem gegebenen ausfüllen müssten Radius r. Mehrere Teilkacheln können nicht zu einer vollständigen Kachel zusammengefasst werden, auch der Rest einer Teilkachel darf nirgendwo anders wiederverwendet werden.Anzahl der vollständigen und partiellen quadratischen Kacheln, die benötigt werden, um einen Kreis zu füllen

Der Mittelpunkt des Kreises wird an einer Grenze zwischen vier Fliesen immer, so können wir die Notwendigkeit für ein Viertel des Kreises und multiplizieren sie mit 4.

Wenn also zum Beispiel berechnen r=1 würde es 0 vollständige und 4 partielle Kacheln geben.
Für r=2 wäre das Ergebnis 4 vollständige und 12 teilweise Fliesen, und so weiter ...

Welche Ansätze könnte ich verwenden? Der Code sollte so kurz wie möglich sein.

Antwort

2

Ich denke, das folgende sollte den Trick tun. Entschuldigung, dass die print-Anweisung Python 2 ist, aber ich denke, es sollte einfach zu konvertieren sein.

import math 

# Input argument is the radius 
circle_radius = 2. 

# This is specified as 1, but doesn't have to be 
tile_size = 1. 

# Make a square box covering a quarter of the circle 
tile_length_1d = int(math.ceil(circle_radius/tile_size)) 

# How many tiles do you need? 
num_complete_tiles = 0 
num_partial_tiles = 0 

# Now loop over all tile_length_1d x tile_length_1d tiles and check if they 
# are needed 
for i in range(tile_length_1d): 
    for j in range(tile_length_1d): 
     # Does corner of tile intersect circle? 
     intersect_len = ((i * tile_size)**2 + (j * tile_size)**2)**0.5 
     # Does *far* corner intersect (ie. is the whole tile in the circle) 
     far_intersect_len = (((i+1) * tile_size)**2 + ((j+1) * tile_size)**2)**0.5 
     if intersect_len > circle_radius: 
      # Don't need tile, continue 
      continue 
     elif far_intersect_len > circle_radius: 
      # Partial tile 
      num_partial_tiles += 1 
     else: 
      # Keep tile. Maybe you want to store this or something 
      # instead of just adding 1 to count? 
      num_complete_tiles += 1 

# Multiple by 4 for symmetry 
num_complete_tiles = num_complete_tiles * 4 
num_partial_tiles = num_partial_tiles * 4 

print "You need %d complete tiles" %(num_complete_tiles) 
print "You need %d partial tiles" %(num_partial_tiles) 
Verwandte Themen