Isometric ascii cube with python

(sorry for my broken tongue)

I am new to Python, but I have no choice, I need this for a project, and for this I need to create an isometric ascii cube by programming. I don’t know how to do this, so I started with the idea of ​​finding the coordinates of the “corners” (not the right word, but ...) to draw the tile

#what I expect really : - for a 2 wide .-⁻``⁻-. .-⁻` `⁻-. | | | | `⁻-. .-⁻` `⁻-..-⁻` - for 3 wide .-⁻``⁻-. .-⁻` `⁻-. .-⁻` `⁻-. | | | | `⁻-. .-⁻` `⁻-. .-⁻` `⁻-..-⁻` # what I except for the beginning - 2 wide .-⁻``⁻-. .-⁻` `⁻-. `⁻-. .-⁻` `⁻-..-⁻` - 3 wide (,etc.) .-⁻``⁻-. .-⁻` `⁻-. .-⁻` `⁻-. `⁻-. .-⁻` `⁻-. .-⁻` `⁻-..-⁻` 

What i started to 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 () ) 

I find some coordinators, but they are in a sense wrong. I am a bit confused. I already work with tiles, but this time I really don't know how to do this ... Any idea?

+5
source share
2 answers

Here, I quickly whipped something. It takes arguments for the width and height of the cube. Since the slope of the ribs may vary, it does not elegantly handle different slopes; it just uses a period symbol for sloping edges (and a channel for vertical edges). Here is the 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) 

What prints:

  ....... .... .... .... .... .... .... .... ... |... ...| | .... .... | | .... .... | | .... .... | | .... ... | | | | | | | | | | | | | | | | ...... | .... ..... | ..... ..... | ..... ....|.... . 
0
source

I would suggest rebuilding the script using the recursive function. This way, you can basically get rid of the coordinates, as you are likely to build up (and then down) from the middle. In addition, you can split the cube horizontally, because one half will be quite easy to adapt the other.

-1
source

Source: https://habr.com/ru/post/1235610/


All Articles