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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2024, 05:40   #101
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

Дубль 2
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import random
import os
from scipy.interpolate import interp1d

# Генерация случайной функции с двумя переменными
def generate_function():
    functions = [lambda x, y: x + y, lambda x, y: x - y, lambda x, y: x * y, lambda x, y: x / y]
    return random.choice(functions)

# Генерация фрактала
def generate_fractal(x, y, z, depth):
    if depth == 0:
        return np.array([x, y, z])
    else:
        x1 = x + np.random.uniform(-1, 1)
        y1 = y + np.random.uniform(-1, 1)
        z1 = z + np.random.uniform(-1, 1)
        return np.array([x1, y1, z1]) + generate_fractal(x1, y1, z1, depth - 1)

# Генерация полостей и самоподобия
def generate_cavity(x, y, z, depth):
    if depth == 0:
        return np.array([x, y, z])
    else:
        x1 = x + np.random.uniform(-1, 1)
        y1 = y + np.random.uniform(-1, 1)
        z1 = z + np.random.uniform(-1, 1)
        return np.array([x1, y1, z1]) + generate_cavity(x1, y1, z1, depth - 1)

# Генерация трехмерного пространства
def generate_space():
    x = np.random.uniform(-10, 10)
    y = np.random.uniform(-10, 10)
    z = np.random.uniform(-10, 10)
    depth = np.random.randint(1, 10)
    return generate_fractal(x, y, z, depth)

# Визуализация пространства
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

points = []
for i in range(100):
    x, y, z = generate_space()
    points.append([x, y, z])

# Интерполяция
t = np.linspace(0, 1, len(points))
x = np.array([point[0] for point in points])
y = np.array([point[1] for point in points])
z = np.array([point[2] for point in points])

x_interp = interp1d(t, x, kind='cubic')
y_interp = interp1d(t, y, kind='cubic')
z_interp = interp1d(t, z, kind='cubic')

t_interp = np.linspace(0, 1, 1000)
x_interp = x_interp(t_interp)
y_interp = y_interp(t_interp)
z_interp = z_interp(t_interp)

ax.plot(x_interp, y_interp, z_interp, 'b-')

ax.scatter(*zip(*points))

# Генерация трубы
radius = 1.0
theta = np.linspace(0, 2*np.pi, 100)

tube_x = []
tube_y = []
tube_z = []

for i in range(len(x_interp)):
    for j in range(len(theta)):
        tube_x.append(x_interp[i] + radius * np.cos(theta[j]))
        tube_y.append(y_interp[i] + radius * np.sin(theta[j]))
        tube_z.append(z_interp[i])

ax.scatter(tube_x, tube_y, tube_z, s=0.1)

# Сохранение изогнутой линии изурфейсом
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "tube.obj")
with open(filename, "w") as f:
    for i in range(len(tube_x)):
        f.write(f"v {tube_x[i]} {tube_y[i]} {tube_z[i]}\n")
    for i in range(len(tube_x) - 1):
        f.write(f"l {i+1} {i+2}\n")
print(f"Tube saved as {filename}")

plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 27.10.2024, 05:46   #102
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

Ну вот теперь это 100% похоже на зону Долоногов!
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import random
from scipy.interpolate import interp1d

# Генерация случайной функции с двумя переменными
def generate_function():
    functions = [lambda x, y: x + y, lambda x, y: x - y, lambda x, y: x * y, lambda x, y: x / y]
    return random.choice(functions)

# Генерация фрактала
def generate_fractal(x, y, z, depth):
    if depth == 0:
        return np.array([x, y, z])
    else:
        x1 = x + np.random.uniform(-1, 1)
        y1 = y + np.random.uniform(-1, 1)
        z1 = z + np.random.uniform(-1, 1)
        return np.array([x1, y1, z1]) + generate_fractal(x1, y1, z1, depth - 1)

# Генерация полостей и самоподобия
def generate_cavity(x, y, z, depth):
    if depth == 0:
        return np.array([x, y, z])
    else:
        x1 = x + np.random.uniform(-1, 1)
        y1 = y + np.random.uniform(-1, 1)
        z1 = z + np.random.uniform(-1, 1)
        return np.array([x1, y1, z1]) + generate_cavity(x1, y1, z1, depth - 1)

# Генерация трехмерного пространства
def generate_space():
    x = np.random.uniform(-10, 10)
    y = np.random.uniform(-10, 10)
    z = np.random.uniform(-10, 10)
    depth = np.random.randint(1, 10)
    return generate_fractal(x, y, z, depth)

# Визуализация пространства
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

points = []
for i in range(100):
    x, y, z = generate_space()
    points.append([x, y, z])

# Интерполяция
t = np.linspace(0, 1, len(points))
x = np.array([point[0] for point in points])
y = np.array([point[1] for point in points])
z = np.array([point[2] for point in points])

x_interp = interp1d(t, x, kind='cubic')
y_interp = interp1d(t, y, kind='cubic')
z_interp = interp1d(t, z, kind='cubic')

t_interp = np.linspace(0, 1, 1000)
x_interp = x_interp(t_interp)
y_interp = y_interp(t_interp)
z_interp = z_interp(t_interp)

ax.plot(x_interp, y_interp, z_interp, 'b-')

ax.scatter(*zip(*points))

# Генерация трубы
radius = 1.0
theta = np.linspace(0, 2*np.pi, 100)

tube_x = []
tube_y = []
tube_z = []

for i in range(len(x_interp)):
    for j in range(len(theta)):
        tube_x.append(x_interp[i] + radius * np.cos(theta[j]))
        tube_y.append(y_interp[i] + radius * np.sin(theta[j]))
        tube_z.append(z_interp[i])

# Создание вершин и треугольников для меша
vertices = []
faces = []

for i in range(len(x_interp) - 1):
    for j in range(len(theta)):
        idx1 = i * len(theta) + j
        idx2 = (i + 1) * len(theta) + j
        idx3 = (i + 1) * len(theta) + (j + 1) % len(theta)
        idx4 = i * len(theta) + (j + 1) % len(theta)

        vertices.append([tube_x[idx1], tube_y[idx1], tube_z[idx1]])
        vertices.append([tube_x[idx2], tube_y[idx2], tube_z[idx2]])
        vertices.append([tube_x[idx3], tube_y[idx3], tube_z[idx3]])
        vertices.append([tube_x[idx4], tube_y[idx4], tube_z[idx4]])

        faces.append([idx1, idx2, idx3])
        faces.append([idx1, idx3, idx4])

# Сохранение меша в файл
import os
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "tube.obj")
with open(filename, "w") as f:
    for i, vertex in enumerate(vertices):
        f.write(f"v {vertex[0]} {vertex[1]} {vertex[2]}\n")
    for face in faces:
        f.write(f"f {face[0] + 1} {face[1] + 1} {face[2] + 1}\n")
print(f"Tube saved as {filename}")

# Визуализация меша
from mpl_toolkits.mplot3d.art3d import Poly3DCollection

mesh = Poly3DCollection(vertices, facecolors='b', alpha=0.5)
ax.add_collection3d(mesh)

plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 30.10.2024, 17:50   #103
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

Ад кубов Делона!
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
from scipy.spatial import Delaunay
import os

# Функция для генерации 3D-поля с триангуляцией Делоне
def generate_delaunay_field(shape):
    array = np.zeros(shape, dtype=float)
    points = []
    for i in range(100):
        x = np.random.uniform(0, shape[0])
        y = np.random.uniform(0, shape[1])
        z = np.random.uniform(0, shape[2])
        points.append([x, y, z])

    # Преобразование точек в NumPy массив 
    points = np.array(points)

    # Выполнить триангуляцию Делоне
    triangulation = Delaunay(points)

    # Постройте график треугольников
    for triangle in triangulation.simplices:
        for i in range(3):
            dx = points[triangle[(i+1)%3], 0] - points[triangle[i], 0]
            dy = points[triangle[(i+1)%3], 1] - points[triangle[i], 1]
            dz = points[triangle[(i+1)%3], 2] - points[triangle[i], 2]
            length = int(np.sqrt(dx**2 + dy**2 + dz**2))
            for j in range(length):
                new_x = int(points[triangle[i], 0] + j * dx // length)
                new_y = int(points[triangle[i], 1] + j * dy // length)
                new_z = int(points[triangle[i], 2] + j * dz // length)
                if 0 <= new_x < shape[0] and 0 <= new_y < shape[1] and 0 <= new_z < shape[2]:
                    array[new_x, new_y, new_z] = 1.0
                    # Делаем линии более жирными
                    if new_x > 0:
                        array[new_x-1, new_y, new_z] = 1.0
                    if new_x < shape[0] - 1:
                        array[new_x+1, new_y, new_z] = 1.0
                    if new_y > 0:
                        array[new_x, new_y-1, new_z] = 1.0
                    if new_y < shape[1] - 1:
                        array[new_x, new_y+1, new_z] = 1.0
                    if new_z > 0:
                        array[new_x, new_y, new_z-1] = 1.0
                    if new_z < shape[2] - 1:
                        array[new_x, new_y, new_z+1] = 1.0
        # Генерируем куб в точке пересечения линий
        intersection_point = (points[triangle[0]] + points[triangle[1]] + points[triangle[2]]) / 3
        generate_cube(array, intersection_point, np.random.randint(2, 6))
    return array

# Функция для генерации куба в заданной точке
def generate_cube(array, point, size):
    x, y, z = int(point[0]), int(point[1]), int(point[2])
    for i in range(-size, size+1):
        for j in range(-size, size+1):
            for k in range(-size, size+1):
                new_x, new_y, new_z = x + i, y + j, z + k
                if 0 <= new_x < array.shape[0] and 0 <= new_y < array.shape[1] and 0 <= new_z < array.shape[2]:
                    array[new_x, new_y, new_z] = 1.0

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

# Генерация 3D-поля с триангуляцией Делоне
delaunay_field = generate_delaunay_field(shape)

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

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "delaunay.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 вне форума Ответить с цитированием
Старый 30.10.2024, 18:10   #104
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

Нагромождение кубов Делона
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
from scipy.spatial import Delaunay
import os

# Функция для генерации 3D-поля с триангуляцией Делоне
def generate_delaunay_field(shape):
    array = np.zeros(shape, dtype=float)
    points = []
    for i in range(100):
        x = np.random.uniform(0, shape[0])
        y = np.random.uniform(0, shape[1])
        z = np.random.uniform(0, shape[2])
        points.append([x, y, z])

    # Преобразование точек в NumPy массив 
    points = np.array(points)

    # Выполнить триангуляцию Делоне
    triangulation = Delaunay(points)

    # Постройте график треугольников
    for triangle in triangulation.simplices:
        for i in range(3):
            dx = points[triangle[(i+1)%3], 0] - points[triangle[i], 0]
            dy = points[triangle[(i+1)%3], 1] - points[triangle[i], 1]
            dz = points[triangle[(i+1)%3], 2] - points[triangle[i], 2]
            length = int(np.sqrt(dx**2 + dy**2 + dz**2))
            for j in range(length):
                new_x = int(points[triangle[i], 0] + j * dx // length)
                new_y = int(points[triangle[i], 1] + j * dy // length)
                new_z = int(points[triangle[i], 2] + j * dz // length)
                if 0 <= new_x < shape[0] and 0 <= new_y < shape[1] and 0 <= new_z < shape[2]:
                    array[new_x, new_y, new_z] = 1.0
                    # Делаем линии более жирными
                    for k in range(-2, 3):
                        for l in range(-2, 3):
                            for m in range(-2, 3):
                                x1, y1, z1 = new_x + k, new_y + l, new_z + m
                                if 0 <= x1 < shape[0] and 0 <= y1 < shape[1] and 0 <= z1 < shape[2]:
                                    array[x1, y1, z1] = 1.0
        # Генерируем куб в точке пересечения линий
        intersection_point = (points[triangle[0]] + points[triangle[1]] + points[triangle[2]]) / 3
        generate_cube(array, intersection_point, np.random.randint(4, 8))
    return array

# Функция для генерации куба в заданной точке
def generate_cube(array, point, size):
    x, y, z = int(point[0]), int(point[1]), int(point[2])
    for i in range(-size, size+1):
        for j in range(-size, size+1):
            for k in range(-size, size+1):
                new_x, new_y, new_z = x + i, y + j, z + k
                if 0 <= new_x < array.shape[0] and 0 <= new_y < array.shape[1] and 0 <= new_z < array.shape[2]:
                    array[new_x, new_y, new_z] = 1.0

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

# Генерация 3D-поля с триангуляцией Делоне
delaunay_field = generate_delaunay_field(shape)

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

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "delaunay.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 вне форума Ответить с цитированием
Старый 30.10.2024, 18:33   #105
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

Вот! Теперь это уже больше похоже на бэкрумс! Получается я изобрел бэкрумс ещё до того как это стало мейнстримом просто бэкрумс Кейна Пикселя это мир бесконечных ламинальных пространства а мой бэкрумс это мир всефрактального всемногообразия.
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
from scipy.spatial import Delaunay
import os

# Функция для генерации 3D-поля с триангуляцией Делоне
def generate_delaunay_field(shape):
    array = np.zeros(shape, dtype=float)

    # Генерация кубов на каждом уровне
    for level in range(3):
        for _ in range(10):
            x = np.random.randint(10, shape[0] - 10)
            y = np.random.randint(10, shape[1] - 10)
            z = level * (shape[2] // 3) + np.random.randint(10, shape[2] // 3 - 10)
            generate_cube(array, (x, y, z), np.random.randint(4, 8))

    # Генерация линий между кубами
    for level in range(3):
        points = []
        for _ in range(10):
            x = np.random.randint(10, shape[0] - 10)
            y = np.random.randint(10, shape[1] - 10)
            z = level * (shape[2] // 3) + np.random.randint(10, shape[2] // 3 - 10)
            points.append([x, y, z])
        points = np.array(points)
        triangulation = Delaunay(points)
        for triangle in triangulation.simplices:
            for i in range(3):
                dx = points[triangle[(i+1)%3], 0] - points[triangle[i], 0]
                dy = points[triangle[(i+1)%3], 1] - points[triangle[i], 1]
                dz = points[triangle[(i+1)%3], 2] - points[triangle[i], 2]
                length = int(np.sqrt(dx**2 + dy**2 + dz**2))
                for j in range(length):
                    new_x = int(points[triangle[i], 0] + j * dx // length)
                    new_y = int(points[triangle[i], 1] + j * dy // length)
                    new_z = int(points[triangle[i], 2] + j * dz // length)
                    if 0 <= new_x < shape[0] and 0 <= new_y < shape[1] and 0 <= new_z < shape[2]:
                        array[new_x, new_y, new_z] = 1.0
                        # Делаем линии более жирными
                        for k in range(-2, 3):
                            for l in range(-2, 3):
                                for m in range(-2, 3):
                                    x1, y1, z1 = new_x + k, new_y + l, new_z + m
                                    if 0 <= x1 < shape[0] and 0 <= y1 < shape[1] and 0 <= z1 < shape[2]:
                                        array[x1, y1, z1] = 1.0

    return array

# Функция для генерации куба в заданной точке
def generate_cube(array, point, size):
    x, y, z = int(point[0]), int(point[1]), int(point[2])
    for i in range(-size, size+1):
        for j in range(-size, size+1):
            for k in range(-size, size+1):
                new_x, new_y, new_z = x + i, y + j, z + k
                if 0 <= new_x < array.shape[0] and 0 <= new_y < array.shape[1] and 0 <= new_z < array.shape[2]:
                    array[new_x, new_y, new_z] = 1.0

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

# Генерация 3D-поля с триангуляцией Делоне
delaunay_field = generate_delaunay_field(shape)

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

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "delaunay.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; 30.10.2024 в 18:37.
MakarovDs вне форума Ответить с цитированием
Старый 30.10.2024, 18:49   #106
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

Воооот! Теперь это можно назвать закулисьем нулевого уровня!
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
from scipy.spatial import Delaunay
import os

# Функция для генерации 3D-поля с триангуляцией Делоне
def generate_delaunay_field(shape):
    array = np.zeros(shape, dtype=float)

    # Генерация кубов на каждом уровне
    points = []
    for level in range(3):
        for _ in range(10):
            x = np.random.randint(10, shape[0] - 10)
            y = np.random.randint(10, shape[1] - 10)
            z = level * (shape[2] // 3) + np.random.randint(10, shape[2] // 3 - 10)
            points.append([x, y, z])
            generate_cube(array, (x, y, z), np.random.randint(4, 8))

    # Генерация линий между кубами на разных уровнях
    for i in range(len(points) - 1):
        dx = points[i+1][0] - points[i][0]
        dy = points[i+1][1] - points[i][1]
        dz = points[i+1][2] - points[i][2]
        length = int(np.sqrt(dx**2 + dy**2 + dz**2))
        for j in range(length):
            new_x = int(points[i][0] + j * dx // length)
            new_y = int(points[i][1] + j * dy // length)
            new_z = int(points[i][2] + j * dz // length)
            if 0 <= new_x < shape[0] and 0 <= new_y < shape[1] and 0 <= new_z < shape[2]:
                array[new_x, new_y, new_z] = 1.0
                # Делаем линии более жирными
                for k in range(-2, 3):
                    for l in range(-2, 3):
                        for m in range(-2, 3):
                            x1, y1, z1 = new_x + k, new_y + l, new_z + m
                            if 0 <= x1 < shape[0] and 0 <= y1 < shape[1] and 0 <= z1 < shape[2]:
                                array[x1, y1, z1] = 1.0

    return array

# Функция для генерации куба в заданной точке
def generate_cube(array, point, size):
    x, y, z = int(point[0]), int(point[1]), int(point[2])
    for i in range(-size, size+1):
        for j in range(-size, size+1):
            for k in range(-size, size+1):
                new_x, new_y, new_z = x + i, y + j, z + k
                if 0 <= new_x < array.shape[0] and 0 <= new_y < array.shape[1] and 0 <= new_z < array.shape[2]:
                    array[new_x, new_y, new_z] = 1.0

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

# Генерация 3D-поля с триангуляцией Делоне
delaunay_field = generate_delaunay_field(shape)

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

# Сохранение изосурфейса в OBJ файл
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "delaunay.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 вне форума Ответить с цитированием
Старый 01.11.2024, 00:22   #107
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

Кубаполостие
Код:
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):
        # Выбираем случайную поверхность
        surface = np.random.randint(6)
        if surface == 0:  # Сверху
            x = np.random.randint(0, shape[0])
            y = np.random.randint(0, shape[1])
            z = 0
        elif surface == 1:  # Снизу
            x = np.random.randint(0, shape[0])
            y = np.random.randint(0, shape[1])
            z = shape[2] - 1
        elif surface == 2:  # Слева
            x = 0
            y = np.random.randint(0, shape[1])
            z = np.random.randint(0, shape[2])
        elif surface == 3:  # Справа
            x = shape[0] - 1
            y = np.random.randint(0, shape[1])
            z = np.random.randint(0, shape[2])
        elif surface == 4:  # Спереди
            x = np.random.randint(0, shape[0])
            y = 0
            z = np.random.randint(0, shape[2])
        elif surface == 5:  # Сзади
            x = np.random.randint(0, shape[0])
            y = shape[1] - 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]):
                    dx = abs(i - x)
                    dy = abs(j - y)
                    dz = abs(k - z)
                    if surface == 0 or surface == 1:  # Сверху или снизу
                        if dx < size // 2 and dy < size // 2:
                            array[i, j, k] = 0.0
                    elif surface == 2 or surface == 3:  # Слева или справа
                        if dy < size // 2 and dz < size // 2:
                            array[i, j, k] = 0.0
                    elif surface == 4 or surface == 5:  # Спереди или сзади
                        if dx < size // 2 and dz < 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()
MakarovDs вне форума Ответить с цитированием
Старый 01.11.2024, 00:31   #108
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

Одноплостьекубие
Код:
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 = 0
        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]):
                    dx = abs(i - x)
                    dy = abs(j - y)
                    if dx < size // 2 and dy < 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()
MakarovDs вне форума Ответить с цитированием
Старый 01.11.2024, 02:46   #109
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

����

Последний раз редактировалось MakarovDs; 01.11.2024 в 08:58.
MakarovDs вне форума Ответить с цитированием
Старый 01.11.2024, 04:44   #110
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 337
По умолчанию

Стена глюка
Код:
import numpy as np
import os

# Параметры
size = 100  # Размер поверхности
hair_length = 10  # Длина волос
hair_density = 0.1  # Плотность волос

# Генерация поверхности
x = np.linspace(0, size, size)
y = np.linspace(0, size, size)
X, Y = np.meshgrid(x, y)

# Генерация волос
hair_x = np.random.uniform(0, size, int(size * size * hair_density))
hair_y = np.random.uniform(0, size, int(size * size * hair_density))
hair_z = np.zeros(int(size * size * hair_density))

# Сохранение модели в формате OBJ на рабочий стол
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "hair_model.obj")
with open(filename, 'w') as f:
    for i in range(len(hair_x)):
        f.write(f'v {hair_x[i]} {hair_y[i]} {hair_z[i]}\n')
        f.write(f'v {hair_x[i]} {hair_y[i]} {hair_z[i] + hair_length}\n')
        f.write(f'l {i*2+1} {i*2+2}\n')

    # Сохранение поверхности
    for i in range(size):
        for j in range(size):
            f.write(f'v {X[i, j]} {Y[i, j]} 0\n')

    # Сохранение связей между вершинами поверхности
    for i in range(size-1):
        for j in range(size-1):
            f.write(f'f {(i*size+j)+1} {(i*size+j+1)+1} {(i*size+j+size+1)+1} {(i*size+j+size)+1}\n')

print(f"Модель сохранена на рабочий стол как {filename}")
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