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

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

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео. В прошлой статье мы уже столкнулись с технологией вокселей. Продолжим эту интересную темы. Воксель это аналог пикселей, но только в пространстве. Представим себе, что пространство представляет собой некоторый куб. Он может быть сплошным, как это было в предыдущей статье. Но его можно делить на прямоугольные части: разных размеров, разных цветов или вообще без цвета или точнее, эта часть может быть пустым местом. В результате у нас появляется очень мощный инструмент объёмных изображений. Воксельная структура определяется трёхмерным массивом (списком). Если кратко, то двумерные массивы определяют деление куба на части, путём разрезания перпендикулярно оси X, а одномерные массивы внутри двумерных деление путём разрезания перпендикулярно оси Y, наконец элементы одномерного массива определяют разрезание куба перпендикулярно оси Z. Первый

Доброго времени суток, читатели, зрители моего канала 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. Убран один столбкик

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

Ну, пока всё!

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

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