76 lines
3.2 KiB
Python
76 lines
3.2 KiB
Python
import numpy as np
|
||
import matplotlib.pyplot as plt
|
||
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
|
||
import matplotlib.colors as mcolors
|
||
|
||
# Определяем новые параметры трапеции
|
||
height = 200000 # Высота трапеции увеличена до 200000 см
|
||
top_width = 8 # Ширина верхней стороны
|
||
bottom_width = 12 # Ширина нижней стороны
|
||
depth = 8 # Глубина трапеции
|
||
|
||
# Генерация температуры на каждом уровне z (реверсированная)
|
||
def calculate_temperature(z):
|
||
# Температура изменяется от 0°C у основания до 100°C на вершине
|
||
return 100 * (z / height)
|
||
|
||
# Сетка для разбиения трапеции на кубы
|
||
# Чтобы избежать слишком больших затрат памяти, увеличим шаг кубов до, например, 10000 см.
|
||
x_step, y_step, z_step = 1000, 1000, 10000
|
||
x_range = np.arange(0, bottom_width, x_step)
|
||
y_range = np.arange(0, depth, y_step)
|
||
z_range = np.arange(0, height, z_step)
|
||
|
||
fig = plt.figure(figsize=(10, 8))
|
||
ax = fig.add_subplot(111, projection='3d')
|
||
|
||
# Нормализация и палитра цветов
|
||
cmap = plt.get_cmap("coolwarm")
|
||
norm = mcolors.Normalize(vmin=0, vmax=100)
|
||
|
||
# Функция для добавления куба к визуализации
|
||
def add_cube(ax, x, y, z, temperature):
|
||
vertices = [
|
||
[x, y, z], [x+x_step, y, z], [x+x_step, y+y_step, z], [x, y+y_step, z], # нижняя грань
|
||
[x, y, z+z_step], [x+x_step, y, z+z_step], [x+x_step, y+y_step, z+z_step], [x, y+y_step, z+z_step] # верхняя грань
|
||
]
|
||
edges = [
|
||
[vertices[j] for j in [0, 1, 2, 3]], # нижняя грань
|
||
[vertices[j] for j in [4, 5, 6, 7]], # верхняя грань
|
||
[vertices[j] for j in [0, 1, 5, 4]], # боковая грань
|
||
[vertices[j] for j in [2, 3, 7, 6]], # боковая грань
|
||
[vertices[j] for j in [0, 3, 7, 4]], # передняя грань
|
||
[vertices[j] for j in [1, 2, 6, 5]] # задняя грань
|
||
]
|
||
|
||
# Определяем цвет в зависимости от температуры
|
||
color = cmap(norm(temperature))
|
||
|
||
ax.add_collection3d(Poly3DCollection(edges, color=color, edgecolor='black', linewidths=0.1, alpha=0.7))
|
||
|
||
# Заполняем трапецию кубами
|
||
for z in z_range:
|
||
# Линейная интерполяция для ширины на каждом уровне высоты
|
||
width = top_width + (bottom_width - top_width) * (height - z) / height
|
||
x_min = (bottom_width - width) / 2
|
||
x_max = x_min + width
|
||
for x in np.arange(x_min, x_max, x_step):
|
||
for y in y_range:
|
||
temperature = calculate_temperature(z)
|
||
add_cube(ax, x, y, z, temperature)
|
||
|
||
# Настройки графика
|
||
ax.set_xlabel("X")
|
||
ax.set_ylabel("Y")
|
||
ax.set_zlabel("Z")
|
||
ax.set_xlim(0, bottom_width)
|
||
ax.set_ylim(0, depth)
|
||
ax.set_zlim(0, height)
|
||
|
||
# Создаём цветовую шкалу
|
||
mappable = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
|
||
mappable.set_array([])
|
||
plt.colorbar(mappable, ax=ax, label="Температура (°C)")
|
||
|
||
plt.show()
|