Найти в Дзене
programmer's notes (python and more)

Программирование на языке python. Библиотека matplotlib. Технология вокселей (voxels)

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Технология вокселей в библиотеке matplotlib

В прошлой статье мы уже столкнулись с технологией вокселей. Продолжим эту интересную темы. Воксель это аналог пикселей, но только в пространстве.

Представим себе, что пространство представляет собой некоторый куб. Он может быть сплошным, как это было в предыдущей статье. Но его можно делить на прямоугольные части: разных размеров, разных цветов или вообще без цвета или точнее, эта часть может быть пустым местом. В результате у нас появляется очень мощный инструмент объёмных изображений.

Воксельная структура определяется трёхмерным массивом (списком). Если кратко, то двумерные массивы определяют деление куба на части, путём разрезания перпендикулярно оси X, а одномерные массивы внутри двумерных деление путём разрезания перпендикулярно оси Y, наконец элементы одномерного массива определяют разрезание куба перпендикулярно оси Z.

Первый пример. Делим куб перпендикулярно оси X.

#!/usr/bin/python3
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(projection = '3d')
a = np.array([[[1]],[[1]]])
a1 = np.array([[['blue']],[['red']]])
ax.voxels(a,  facecolors=a1, edgecolor='black', shade=False)
ax.set_ylabel('Значения по y')
ax.set_xlabel('Значения по x')
ax.set_zlabel('Значения по z')
plt.savefig("my_diag.png")

Массив a определяет деление куба, список a1 определяет цвета полученных частей. Полученный куб представлен на рисунке 1.

Рисунок 1. Куб разрезан перпендикулярно ос x
Рисунок 1. Куб разрезан перпендикулярно ос x

Второй пример. Делим куб перпендикулярно оси Y.

#!/usr/bin/python3
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(projection = '3d')
a = np.array([[[1],[1]]])
a1 = np.array([[['blue'],['red']]])
ax.voxels(a,  facecolors=a1, edgecolor='black', shade=False)
ax.set_ylabel('Значения по y')
ax.set_xlabel('Значения по x')
ax.set_zlabel('Значения по z')
plt.savefig("my_diag.png")

Результат выполнения представлен на рисунке 2.

Рисунок 2. Куб разрезан перпендикулярно ос y
Рисунок 2. Куб разрезан перпендикулярно ос y

Пример 3. Делим куб перпендикулярно оси z

#!/usr/bin/python3
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(projection = '3d')
a = np.array([[[1,1]]])
a1 = np.array([[['blue','red']]])
ax.voxels(a,  facecolors=a1, edgecolor='black', shade=False)
ax.set_ylabel('Значения по y')
ax.set_xlabel('Значения по x')
ax.set_zlabel('Значения по z')
plt.savefig("my_diag.png")

Результат выполнения программы см. на рисунке 3.

Рисунок 3. Куб разрезан перпендикулярно ос z
Рисунок 3. Куб разрезан перпендикулярно ос z

Попробуем теперь разделить куб 8 одинаковых разноцветных кубиков

#!/usr/bin/python3
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(projection = '3d')
a = np.array([[[1,1], [1, 1]],[[1,1], [1, 1]]])
a1 = np.array([[['blue','red'],['pink','green']],[['olive','cyan'],['violet','indigo']]])
ax.voxels(a,  facecolors=a1, edgecolor='black', shade=False, alpha=0.5)
ax.set_ylabel('Значения по y')
ax.set_xlabel('Значения по x')
ax.set_zlabel('Значения по z')
plt.savefig("my_diag.png")
plt.show()

Результат выполнения на рисунке 4. Мы добавили элемент прозрачности, чтобы были видны цвета задних кубиков.

Рисунок 4. Куб разрезан на 8 частей
Рисунок 4. Куб разрезан на 8 частей

Ну а теперь уберём одну колонку кубиков. Для для этого нужно просто взять следующий массив

a = np.array([[[1,1], [1, 1]],[[0,0], [1, 1]]])

и получим куб, представленный на рисунке 5

Рисунок 5. Убран один столбкик
Рисунок 5. Убран один столбкик

Основные идея я изложил, теперь те, кому интересно, могут поиграть с технологией. Но я всё же вернусь к ней в следующей статье, уж очень она интересная.

Ну, пока всё!

Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.

Позвольте, точка это абстракция, на самом деле есть только пиксели и воксели
Позвольте, точка это абстракция, на самом деле есть только пиксели и воксели