Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как в python сделать 3д объект в консоли?

0 1 Ученик (135), на голосовании 2 месяца назад
мне нужно чтоб в консоли крутился куб. как это сделать?
Голосование за лучший ответ
Red Мастер (1138) 3 месяца назад
 import sys, math, time 

w, h, theta, out = 80, 24, math.pi / 180 * 5, sys.stdout
# Определение вершин куба
cube = [(x, y, z) for x in (-1, 1) for y in (-1, 1) for z in (-1, 1)]
# Определение ребер куба
edges = [(0, 1), (0, 2), (0, 4), (1, 3), (1, 5), (2, 3), (2, 6), (3, 7), (4, 5), (4, 6), (5, 7), (6, 7)]
c, s = math.cos(theta), math.sin(theta)
ym = h / 3 # Y масштабирование
xm = 2 * ym # X масштабирование

def rotate_x(x, y, z, theta):
c, s = math.cos(theta), math.sin(theta)
return x, c*y - s*z, s*y + c*z

def rotate_y(x, y, z, theta):
c, s = math.cos(theta), math.sin(theta)
return c*x + s*z, y, -s*x + c*z

def rotate_z(x, y, z, theta):
c, s = math.cos(theta), math.sin(theta)
return c*x - s*y, s*x + c*y, z

def project_point(x, y, z, w, h, xm, ym):
""" Проекция точки на 2D плоскость """
return (round(w / 2 + xm * x / (y + 2)), round(h / 2 + ym * z / (y + 2)))

angle = 0

while True:
angle += theta
# Вращение куба
rotated_cube = [rotate_x(*rotate_y(*rotate_z(x, y, z, angle), angle), angle) for x, y, z in cube]
# Проекция вершин куба
proj = [project_point(x, y, z, w, h, xm, ym) for x, y, z in rotated_cube]

# Создание пустого экрана
screen = [[' ' for _ in range(w)] for _ in range(h)]

# Отображение вершин
for x, y in proj:
if 0 <= x < w and 0 <= y < h:
screen[y][x] = '*'

# Отображение ребер
for start, end in edges:
x1, y1 = proj[start]
x2, y2 = proj[end]
# Линия Брезенхэма
dx, dy = abs(x2 - x1), abs(y2 - y1)
sx, sy = 1 if x1 < x2 else -1, 1 if y1 < y2 else -1
err = dx - dy
while True:
if 0 <= x1 < w and 0 <= y1 < h:
screen[y1][x1] = '*'
if x1 == x2 and y1 == y2:
break
e2 = 2 * err
if e2 > -dy:
err -= dy
x1 += sx
if e2 < dx:
err += dx
y1 += sy

# Вывод на экран
out.write('\033[H' + '\n'.join(''.join(row) for row in screen))
out.flush()
time.sleep(1 / 15.0)
0 1Ученик (135) 3 месяца назад
спасибо большое!
Похожие вопросы