2015-11-10 33 views
5

(sorry für mein gebrochenes Sprache)isometrischer ascii Würfel mit Python

Ich bin ein Anfänger in Python, aber ich habe keine andere Wahl, ich es für ein Projekt benötigen, und für diese ein Ich habe ascii isometrisch schaffen Würfel durch Programmierung. Ich weiß nicht wirklich, wie es zu tun, so begann ich mit der Idee Koordinaten von „Ecken“ zu finden (nicht das richtige Wort, aber ...) eine Fliese

#what I expect really : 
- for a 2 wide 
     .-⁻``⁻-. 
    .-⁻`  `⁻-. 
    |    | 
    |    | 
    `⁻-.  .-⁻` 
     `⁻-..-⁻`  
- for 3 wide 
      .-⁻``⁻-. 
     .-⁻`  `⁻-. 
    .-⁻`    `⁻-. 
    |      | 
    |      | 
    `⁻-.    .-⁻` 
     `⁻-.  .-⁻` 
      `⁻-..-⁻` 

# what I except for the beginning 
- 2 wide 
     .-⁻``⁻-. 
    .-⁻`  `⁻-. 
    `⁻-.  .-⁻` 
     `⁻-..-⁻` 

- 3 wide (,etc.) 
      .-⁻``⁻-. 
     .-⁻`  `⁻-. 
    .-⁻`    `⁻-. 
    `⁻-.    .-⁻` 
     `⁻-.  .-⁻` 
      `⁻-..-⁻` 

Was ich begann zu zeichnen zu do

#! /usr/bin/env python 
import numpy as np 
x = 2 // number of tiles 
y = 2 // idem 
z = 2 // elevation, not used yet. 
w = 4 // wideness of a tile (.-⁻` ---> 4 characters) 
s = range (x * y) // just to apply a number to a corner 
c = 0 // counter 

def makeMatrix (x, y): 
    matrix = np.full (y*2*h+z, x*2*w), '.', dtype=str) 
    return matrix 

def getOut(): 
    global x, y, w, h, c 
    for i in range (int(x)): 
     for j in range (int(y)): 
     cx = (j - i) * w 
     cy = (j + i) 
     dec = w 
     cx += dec 
     matrix[cy][cx] = str (s[c]) 
     c += 1 
    return matrix 

matrix = makeMatrix (x, y) 
print (getOut()) 

Ich finde einige Koordonate, aber sie sind in gewissem Sinne falsch. Ich bin ein bisschen verwirrt. Ich arbeite bereits mit Fliesen, aber ich weiß nicht wirklich, wie es diesmal geht ... Irgendeine Idee?

+0

konnte man das Ding in Standard-Bild machen und dann in ASCII-Kunst sehen mein [Bild in ASCII-Kunst Umwandlung] konvertieren (http: // Stackoverflow. com/a/32987834/2521214) – Spektre

Antwort

-1

Ich würde vorschlagen, das Skript mit einer recursive Funktion neu erstellen. Auf diese Weise werden Sie in der Lage sein, die Koordinaten größtenteils loszuwerden, da Sie wahrscheinlich von der Mitte aus (und anschließend nach unten) aufbauen würden. Sie können den Würfel auch horizontal aufteilen, weil die eine Hälfte ziemlich einfach ist, um die andere anzupassen.

+0

Hallo Martijn Luyckx. Ich glaube ich verstehe was du meinst. Ich überprüfe den Link für die rekursive Funktion, und die Funktion zum Erstellen eines Pascal-Dreiecks könnte interessant sein, aber außer der Tatsache, dass die Demonstration nur eine Zeile erzeugt und sie in einen Boucle legt, übersteigt die Rekursionsgrenze, ich weiß nicht, wie Implementiere es für mein Projekt. Ich denke, Koordinaten sind nützlich, weil ich den Zweck für einen "Würfel" erkläre, aber er muss für 2x3 Blöcke usw. adaptiv sein. Argh, ich bin zum ersten Mal so verwirrt !!! – krshk

0

Hier ist etwas, das ich schnell aufgepeitscht habe. Es benötigt Argumente für die Breite und Höhe des Würfels. Da die Neigung der Kanten unterschiedlich sein kann, werden unterschiedliche Steigungen nicht elegant gehandhabt. Es verwendet nur einen Punkt für die schrägen Kanten (und ein Rohr für vertikale Kanten). Hier ist der Code:

from math import sqrt 

def draw_cube(width, height): 
    cube = [[' ']*width for row in range(height)] 
    vertices = { 
     'tc': (width//2, 0), 
     'tl': (0, int(.25*height)), 
     'tr': (width-1, int(.25*height)), 
     'cc': (width//2, int(.5*height)), 
     'bl': (0, int(.75*height)), 
     'br': (width-1, int(.75*height)), 
     'bc': (width//2, height-1) 
    } 
    edges = (
     ('tc', 'tl'), 
     ('tc', 'tr'), 
     ('tl', 'cc'), 
     ('tl', 'bl'), 
     ('tr', 'cc'), 
     ('tr', 'br'), 
     ('bl', 'bc'), 
     ('br', 'bc'), 
     ('cc', 'bc') 
    ) 

    for edge in edges: 
     v1 = vertices[edge[0]] 
     v2 = vertices[edge[1]] 
     x1 = v1[0] 
     y1 = v1[1] 
     x2 = v2[0] 
     y2 = v2[1] 
     if x1 > x2: # Always moving left to right 
      x1, x2 = x2, x1 
      y1, y2 = y2, y1 
     try: 
      m = (y2-y1)/(x2-x1) 
     except ZeroDivisionError: 
      c = '|' 
      for yy in range(min(y1, y2), max(y1, y2)): 
       cube[yy][x1] = c 
     else: 
      c = '.' 
      yy = y1 
      for xx in range(x1, x2): 
       cube[int(yy)][xx] = c 
       yy += m 

    cube_str = '\n'.join(''.join(row) for row in cube) 
    return cube_str 

x = draw_cube(40,20) 
print(x) 

Welche druckt:

    .......     
      ....  ....    
     ....    ....   
    ....      ....  
....        ... 
|...        ...| 
| ....      .... | 
|  ....    ....  | 
|   ....  ....   | 
|    .... ...    | 
|     |     | 
|     |     | 
|     |     | 
|     |     | 
|     |     | 
......    |    .... 
     .....   |   .....  
      ..... | .....   
       ....|....    
        .