Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > HTML и CSS
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2024, 23:15   #71
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

??
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time
import random
import os

# Функция для генерации кадра
def update(ax, i):
    ax.clear()  # Очистка текущего окна

    # Генерация линии
    points = []
    for j in range(100):
        x = np.random.uniform(-100, 100)
        y = np.random.uniform(-100, 100)
        z = np.random.uniform(-100, 100)
        points.append([x, y, z])

    # Создание трубки
    tube_vertices = []
    tube_faces = []
    for j in range(len(points) - 1):
        x1, y1, z1 = points[j]
        x2, y2, z2 = points[j+1]
        vec = np.array([x2-x1, y2-y1, z2-z1])
        vec = vec / np.linalg.norm(vec)
        perp_vec1 = np.array([vec[1], -vec[0], 0])
        perp_vec1 = perp_vec1 / np.linalg.norm(perp_vec1)
        perp_vec2 = np.cross(vec, perp_vec1)
        perp_vec2 = perp_vec2 / np.linalg.norm(perp_vec2)
        radius = 5
        num_points = 10
        angles = np.linspace(0, 2*np.pi, num_points)
        for k in range(num_points):
            pos1 = np.array([x1, y1, z1]) + radius * (np.cos(angles[k]) * perp_vec1 + np.sin(angles[k]) * perp_vec2)
            pos2 = np.array([x2, y2, z2]) + radius * (np.cos(angles[k]) * perp_vec1 + np.sin(angles[k]) * perp_vec2)
            tube_vertices.append(pos1.tolist())
            tube_vertices.append(pos2.tolist())

            # Создание граней для трубки
            if k == 0:
                tube_faces.append([j*2, j*2+1, (j+1)*2])
            elif k == num_points - 1:
                tube_faces.append([j*2+1, (j+1)*2, (j+1)*2+1])
            else:
                tube_faces.append([j*2+1, (j+1)*2, (j+1)*2+1, j*2+1])

    # Отрисовка трубки
    ax.plot_trisurf(*zip(*tube_vertices), triangles=tube_faces, color='b')

    # Сохранение трубки в файл OBJ
    desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
    filename = os.path.join(desktop_path, f"tube_{i+1}.obj")
    with open(filename, "w") as f:
        for j, vertex in enumerate(tube_vertices):
            f.write(f"v {vertex[0]} {vertex[1]} {vertex[2]}\n")
        for face in tube_faces:
            f.write(f"f {{{' '.join(str(v+1) for v in face)}}}\n")
    print(f"Model saved as {filename}")

# Запуск анимации
plt.ion()  # Включение интерактивного режима
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_xlim(-150, 150)
ax.set_ylim(-150, 150)
ax.set_zlim(-150, 150)

for i in range(100):
    update(ax, i)
    plt.pause(5)  # Пауза между кадрами
    plt.draw()  # Отрисовка текущего кадра

plt.ioff()  # Выключение интерактивного режима
plt.show()  # Окончательный кадр
MakarovDs вне форума Ответить с цитированием
Старый 24.10.2024, 02:56   #72
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

Странный куб
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_fractal_field(shape, scale):
    array = np.zeros(shape, dtype=float)
    # Создаем фрактал, заполняя массив значениями
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                # Преобразуем координаты в диапазон (-1, 1)
                xf = (x / shape[0]) * 2 - 1
                yf = (y / shape[1]) * 2 - 1
                zf = (z / shape[2]) * 2 - 1
                # Вычисляем значение фрактала
                value = np.sin(10 * np.sqrt(xf**2 + yf**2 + zf**2)) * np.cos(10 * xf) * np.sin(10 * yf) * np.cos(10 * zf)
                array[x, y, z] = value
    return array

# Параметры
shape = (64, 64, 64)  # Размеры 3D массива
scale = 2  # Масштабирование координат для массива

# Генерация 3D-поля
fractal_field = generate_fractal_field(shape, scale)

# Создание изосурфейса
verts, faces, _, _ = measure.marching_cubes(fractal_field, level=0.0)

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "fractal.obj")
with open(filename, "w") as f:
    for j, vert in enumerate(verts):
        f.write(f"v {vert[0]} {vert[1]} {vert[2]}\n")
    for face in faces:
        f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], color='r', alpha=0.5)
plt.show()

Последний раз редактировалось MakarovDs; 24.10.2024 в 16:14.
MakarovDs вне форума Ответить с цитированием
Старый 24.10.2024, 19:46   #73
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

Процедурный генератор щебёнки
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure

# Функция для генерации 3D поля
def generate_field(shape):
    field = np.zeros(shape)
    for i in range(shape[0]):
        for j in range(shape[1]):
            for k in range(shape[2]):
                field[i, j, k] = np.random.uniform(-1, 1)
    return field

# Функция для отрисовки изосурфейса
def draw_isosurface(field, level):
    verts, faces, _, _ = measure.marching_cubes(field, level=level)
    return verts, faces

# Функция для сохранения изосурфейса в файл OBJ
def save_to_obj(verts, faces, filename):
    with open(filename, 'w') as f:
        for i, vert in enumerate(verts):
            f.write(f"v {vert[0]} {vert[1]} {vert[2]}\n")
        for i, face in enumerate(faces):
            f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")

# Генерация 3D поля
field = generate_field((100, 100, 100))

# Отрисовка изосурфейса
verts, faces = draw_isosurface(field, level=0.0)

# Сохранение изосурфейса в файл OBJ который сохраняется в C:\Users\Ваш компьютер
filename = "isosurface.obj"
save_to_obj(verts, faces, filename)

# Отрисовка изосурфейса в 3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], cmap='viridis', edgecolor='none')
plt.show()

Последний раз редактировалось MakarovDs; 24.10.2024 в 20:08.
MakarovDs вне форума Ответить с цитированием
Старый 24.10.2024, 22:41   #74
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

Многогранник OBJ
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_cube_field(shape):
    array = np.zeros(shape, dtype=float)
    # Создаем куб, заполняя массив значениями
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                # Преобразуем координаты в диапазон (-1, 1)
                xf = (x / shape[0]) * 2 - 1
                yf = (y / shape[1]) * 2 - 1
                zf = (z / shape[2]) * 2 - 1
                # Вычисляем значение куба
                if abs(xf) < 0.5 and abs(yf) < 0.5 and abs(zf) < 0.5:
                    value = 1.0
                else:
                    value = 0.0
                array[x, y, z] = value
    return array

# Параметры
shape = (64, 64, 64)  # Размеры 3D массива

# Генерация 3D-поля
cube_field = generate_cube_field(shape)

# Создание изосурфейса
verts, faces, _, _ = measure.marching_cubes(cube_field, level=0.5)

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "cube.obj")
with open(filename, "w") as f:
    for j, vert in enumerate(verts):
        f.write(f"v {vert[0]} {vert[1]} {vert[2]}\n")
    for face in faces:
        f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], color='r', alpha=0.5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 24.10.2024, 22:59   #75
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

Сыр с дырками многогранный
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_spheres_field(shape, num_spheres, min_radius, max_radius):
    array = np.ones(shape, dtype=float)
    # Генерируем сферы внутри куба
    for _ in range(num_spheres):
        x = np.random.randint(0, shape[0])
        y = np.random.randint(0, shape[1])
        z = np.random.randint(0, shape[2])
        radius = np.random.uniform(min_radius, max_radius)
        for i in range(shape[0]):
            for j in range(shape[1]):
                for k in range(shape[2]):
                    distance = np.sqrt((i - x) ** 2 + (j - y) ** 2 + (k - z) ** 2)
                    if distance < radius:
                        array[i, j, k] = 0.0
    return array

def generate_cube_field(shape):
    array = np.zeros(shape, dtype=float)
    # Создаем куб, заполняя массив значениями
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                # Преобразуем координаты в диапазон (-1, 1)
                xf = (x / shape[0]) * 2 - 1
                yf = (y / shape[1]) * 2 - 1
                zf = (z / shape[2]) * 2 - 1
                # Вычисляем значение куба
                if abs(xf) < 0.5 and abs(yf) < 0.5 and abs(zf) < 0.5:
                    value = 1.0
                else:
                    value = 0.0
                array[x, y, z] = value
    return array

# Параметры
shape = (64, 64, 64)  # Размеры 3D массива
num_spheres = 100  # Количество сфер
min_radius = 2  # Минимальный радиус сферы
max_radius = 10  # Максимальный радиус сферы

# Генерация 3D-поля с сферами
spheres_field = generate_spheres_field(shape, num_spheres, min_radius, max_radius)

# Генерация 3D-поля с кубом
cube_field = generate_cube_field(shape)

# Объединение полей
field = np.minimum(spheres_field, cube_field)

# Создание изосурфейса
verts, faces, _, _ = measure.marching_cubes(field, level=0.5)

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "sponge.obj")
with open(filename, "w") as f:
    for j, vert in enumerate(verts):
        f.write(f"v {vert[0]} {vert[1]} {vert[2]}\n")
    for face in faces:
        f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], color='r', alpha=0.5)
plt.show()

Последний раз редактировалось MakarovDs; 24.10.2024 в 23:16.
MakarovDs вне форума Ответить с цитированием
Старый 24.10.2024, 23:18   #76
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

Многогранная фрактальная пена с большим количеством дырок
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_spheres_field(shape, num_spheres, min_radius, max_radius):
    array = np.ones(shape, dtype=float)
    # Генерируем сферы внутри куба
    for _ in range(num_spheres):
        x = np.random.randint(0, shape[0])
        y = np.random.randint(0, shape[1])
        z = np.random.randint(0, shape[2])
        radius = np.random.uniform(min_radius, max_radius)
        for i in range(shape[0]):
            for j in range(shape[1]):
                for k in range(shape[2]):
                    distance = np.sqrt((i - x) ** 2 + (j - y) ** 2 + (k - z) ** 2)
                    if distance < radius:
                        array[i, j, k] = 0.0
    return array

def generate_cube_field(shape):
    array = np.ones(shape, dtype=float)
    return array

# Параметры
shape = (64, 64, 64)  # Размеры 3D массива
num_spheres = 500  # Количество сфер
min_radius = 2  # Минимальный радиус сферы
max_radius = 10  # Максимальный радиус сферы

# Генерация 3D-поля с сферами
spheres_field = generate_spheres_field(shape, num_spheres, min_radius, max_radius)

# Генерация 3D-поля с кубом
cube_field = generate_cube_field(shape)

# Объединение полей
field = np.minimum(spheres_field, cube_field)

# Создание изосурфейса
verts, faces, _, _ = measure.marching_cubes(field, level=0.5)

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "cheese.obj")
with open(filename, "w") as f:
    for j, vert in enumerate(verts):
        f.write(f"v {vert[0]} {vert[1]} {vert[2]}\n")
    for face in faces:
        f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], color='r', alpha=0.5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 25.10.2024, 00:12   #77
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

Сыр с дырками но эти дырки квадратные

Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_cubes_field(shape, num_cubes, min_size, max_size):
    array = np.ones(shape, dtype=float)
    # Генерируем кубы внутри куба
    for _ in range(num_cubes):
        x = np.random.randint(0, shape[0])
        y = np.random.randint(0, shape[1])
        z = np.random.randint(0, shape[2])
        size = np.random.randint(min_size, max_size + 1)
        for i in range(shape[0]):
            for j in range(shape[1]):
                for k in range(shape[2]):
                    if abs(i - x) < size // 2 and abs(j - y) < size // 2 and abs(k - z) < size // 2:
                        array[i, j, k] = 0.0
    return array

def generate_cube_field(shape):
    array = np.zeros(shape, dtype=float)
    # Создаем куб, заполняя массив значениями
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                # Преобразуем координаты в диапазон (-1, 1)
                xf = (x / shape[0]) * 2 - 1
                yf = (y / shape[1]) * 2 - 1
                zf = (z / shape[2]) * 2 - 1
                # Вычисляем значение куба
                if abs(xf) < 0.5 and abs(yf) < 0.5 and abs(zf) < 0.5:
                    value = 1.0
                else:
                    value = 0.0
                array[x, y, z] = value
    return array

# Параметры
shape = (64, 64, 64)  # Размеры 3D массива
num_cubes = 100  # Количество кубов
min_size = 2  # Минимальный размер куба
max_size = 10  # Максимальный размер куба

# Генерация 3D-поля с кубами
cubes_field = generate_cubes_field(shape, num_cubes, min_size, max_size)

# Генерация 3D-поля с кубом
cube_field = generate_cube_field(shape)

# Объединение полей
field = np.minimum(cubes_field, cube_field)

# Создание изосурфейса
verts, faces, _, _ = measure.marching_cubes(field, level=0.5)

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "sponge.obj")
with open(filename, "w") as f:
    for j, vert in enumerate(verts):
        f.write(f"v {vert[0]} {vert[1]} {vert[2]}\n")
    for face in faces:
        f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], color='r', alpha=0.5)
plt.show()

Это можно использовать как такую локацию бэкрумс TheMezzanine из видео про глубокие регионы.

Последний раз редактировалось MakarovDs; 25.10.2024 в 00:26.
MakarovDs вне форума Ответить с цитированием
Старый 25.10.2024, 03:03   #78
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

Это прям чё такое...
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_cube_field(shape):
    array = np.zeros(shape, dtype=float)
    # Создаем куб, заполняя массив значениями
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                # Преобразуем координаты в диапазон (-1, 1)
                xf = (x / shape[0]) * 2 - 1
                yf = (y / shape[1]) * 2 - 1
                zf = (z / shape[2]) * 2 - 1
                # Вычисляем значение куба
                if abs(xf) < 0.5 and abs(yf) < 0.5 and abs(zf) < 0.5:
                    # Создаем линии внутри куба
                    if abs(xf) < 0.1 or abs(yf) < 0.1 or abs(zf) < 0.1:
                        value = 1.0
                    else:
                        value = 0.0
                else:
                    value = 0.0
                array[x, y, z] = value
    return array

# Параметры
shape = (64, 64, 64)  # Размеры 3D массива

# Генерация 3D-поля
cube_field = generate_cube_field(shape)

# Создание изосурфейса
verts, faces, _, _ = measure.marching_cubes(cube_field, level=0.5)

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "cube.obj")
with open(filename, "w") as f:
    for j, vert in enumerate(verts):
        f.write(f"v {vert[0]} {vert[1]} {vert[2]}\n")
    for face in faces:
        f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], color='r', alpha=0.5)
plt.show()


Это знак свыше! Значит я на верном пути! Просто вспомнил картину гиперкубического тела, из книги про гиперпространства Митио Каку...

Интересно у фракталов есть бог? Восславим же ВСЕОБРАЗНОЕ ВСЕМНОГООБРАЗИЕ!

Последний раз редактировалось MakarovDs; 25.10.2024 в 03:43.
MakarovDs вне форума Ответить с цитированием
Старый 25.10.2024, 17:50   #79
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

Крестопустокрестие

Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_cubes_field(shape, num_cubes, min_size, max_size):
    array = np.ones(shape, dtype=float)
    # Генерируем кубы внутри куба
    for _ in range(num_cubes):
        x = np.random.randint(0, shape[0])
        y = np.random.randint(0, shape[1])
        z = np.random.randint(0, shape[2])
        size = np.random.randint(min_size, max_size + 1)
        for i in range(shape[0]):
            for j in range(shape[1]):
                for k in range(shape[2]):
                    if abs(i - x) < size // 2 and abs(j - y) < size // 2 and abs(k - z) < size // 2:
                        # Создаем линии внутри куба
                        xf = (i - x) / (size // 2)
                        yf = (j - y) / (size // 2)
                        zf = (k - z) / (size // 2)
                        if abs(xf) < 0.1 or abs(yf) < 0.1 or abs(zf) < 0.1:
                            array[i, j, k] = 0.0
                        else:
                            array[i, j, k] = 1.0
    return array

def generate_cube_field(shape):
    array = np.zeros(shape, dtype=float)
    # Создаем куб, заполняя массив значениями
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                # Преобразуем координаты в диапазон (-1, 1)
                xf = (x / shape[0]) * 2 - 1
                yf = (y / shape[1]) * 2 - 1
                zf = (z / shape[2]) * 2 - 1
                # Вычисляем значение куба
                if abs(xf) < 0.5 and abs(yf) < 0.5 and abs(zf) < 0.5:
                    # Создаем линии внутри куба
                    if abs(xf) < 0.1 or abs(yf) < 0.1 or abs(zf) < 0.1:
                        value = 1.0
                    else:
                        value = 0.0
                else:
                    value = 0.0
                array[x, y, z] = value
    return array

# Параметры
shape = (64, 64, 64)  # Размеры 3D массива
num_cubes = 400  # Количество кубов
min_size = 2  # Минимальный размер куба
max_size = 10  # Максимальный размер куба

# Генерация 3D-поля с кубами
cubes_field = generate_cubes_field(shape, num_cubes, min_size, max_size)

# Генерация 3D-поля с кубом
cube_field = generate_cube_field(shape)

# Объединение полей
field = np.minimum(cubes_field, cube_field)

# Создание изосурфейса
verts, faces, _, _ = measure.marching_cubes(field, level=0.5)

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "sponge.obj")
with open(filename, "w") as f:
    for j, vert in enumerate(verts):
        f.write(f"v {vert[0]} {vert[1]} {vert[2]}\n")
    for face in faces:
        f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], color='r', alpha=0.5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 25.10.2024, 18:05   #80
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 372
По умолчанию

Кубопустокрестие
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_cubes_field(shape, num_cubes, min_size, max_size):
    array = np.ones(shape, dtype=float)
    # Генерируем кубы внутри куба
    for _ in range(num_cubes):
        x = np.random.randint(0, shape[0])
        y = np.random.randint(0, shape[1])
        z = np.random.randint(0, shape[2])
        size = np.random.randint(min_size, max_size + 1)
        for i in range(shape[0]):
            for j in range(shape[1]):
                for k in range(shape[2]):
                    if abs(i - x) < size // 2 and abs(j - y) < size // 2 and abs(k - z) < size // 2:
                        # Создаем пустые крести внутри куба
                        xf = (i - x) / (size // 2)
                        yf = (j - y) / (size // 2)
                        zf = (k - z) / (size // 2)
                        if abs(xf) < 0.1 or abs(yf) < 0.1 or abs(zf) < 0.1:
                            array[i, j, k] = 0.0
                        else:
                            array[i, j, k] = 1.0
    return array

def generate_cube_field(shape):
    array = np.zeros(shape, dtype=float)
    # Создаем куб, заполняя массив значениями
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                # Преобразуем координаты в диапазон (-1, 1)
                xf = (x / shape[0]) * 2 - 1
                yf = (y / shape[1]) * 2 - 1
                zf = (z / shape[2]) * 2 - 1
                # Вычисляем значение куба
                if abs(xf) < 0.5 and abs(yf) < 0.5 and abs(zf) < 0.5:
                    array[x, y, z] = 1.0
                else:
                    array[x, y, z] = 0.0
    return array

# Параметры
shape = (64, 64, 64)  # Размеры 3D массива
num_cubes = 500  # Количество кубов
min_size = 2  # Минимальный размер куба
max_size = 10  # Максимальный размер куба

# Генерация 3D-поля с кубами
cubes_field = generate_cubes_field(shape, num_cubes, min_size, max_size)

# Генерация 3D-поля с кубом
cube_field = generate_cube_field(shape)

# Объединение полей
field = np.minimum(cubes_field, cube_field)

# Создание изосурфейса
verts, faces, _, _ = measure.marching_cubes(field, level=0.5)

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "sponge.obj")
with open(filename, "w") as f:
    for j, vert in enumerate(verts):
        f.write(f"v {vert[0]} {vert[1]} {vert[2]}\n")
    for face in faces:
        f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")
print(f"Model saved as {filename}")

# Визуализация
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(verts[:, 0], verts[:, 1], faces, verts[:, 2], color='r', alpha=0.5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с генератором слов Мой повелитель Общие вопросы C/C++ 6 27.02.2016 23:46
Зарубежные микроконтроллеры с встроенным ШИМ-генератором MyLastHit Компьютерное железо 6 22.10.2013 14:33
написание генератора фракталов Жюлиа kyzmich2370 Visual C++ 1 06.11.2012 09:57
Помогите с генератором чисел на Pascal vadmaruschak Помощь студентам 6 13.09.2009 17:06
Игры фракталов на VB Kail Свободное общение 1 29.05.2009 09:30