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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2024, 19:58   #81
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

Линия но от границы к границе а не по всему кубу вцелом.
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time
import random
import os

def generate_line(num_points, min_distance, max_distance):
    points = [np.random.uniform(-100, 100, 3)]
    for i in range(1, num_points):
        distance = np.random.uniform(min_distance, max_distance)
        direction = np.random.uniform(-1, 1, 3)
        direction /= np.linalg.norm(direction)
        new_point = points[-1] + direction * distance
        points.append(new_point)
    return points

def save_to_obj(points, filename):
    with open(filename, 'w') as f:
        for i, point in enumerate(points):
            f.write(f"v {point[0]} {point[1]} {point[2]}\n")
        for i in range(len(points) - 1):
            f.write(f"l {i+1} {i+2}\n")

num_points = 100
min_distance = 1
max_distance = 5

points = generate_line(num_points, min_distance, max_distance)

desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "line.obj")
save_to_obj(points, filename)
print(f"Model saved as {filename}")

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(*zip(*points), 'b-', linewidth=5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 25.10.2024, 21:30   #82
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

Процедурный генератор мешуры
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time
import random
import os

def generate_line(num_points, min_distance, max_distance, radius, num_circles):
    points = [np.random.uniform(-100, 100, 3)]
    for i in range(1, num_points):
        distance = np.random.uniform(min_distance, max_distance)
        direction = np.random.uniform(-1, 1, 3)
        direction /= np.linalg.norm(direction)
        new_point = points[-1] + direction * distance
        points.append(new_point)

    # Создание трубки
    tube_points = []
    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)
        for k in range(num_circles):
            angle = 2 * np.pi * k / num_circles
            pos1 = np.array([x1, y1, z1]) + radius * (np.cos(angle) * perp_vec1 + np.sin(angle) * perp_vec2)
            pos2 = np.array([x2, y2, z2]) + radius * (np.cos(angle) * perp_vec1 + np.sin(angle) * perp_vec2)
            tube_points.append(pos1.tolist())
            tube_points.append(pos2.tolist())
            tube_faces.append([len(tube_points)-2, len(tube_points)-1, len(tube_points)])
            tube_faces.append([len(tube_points)-1, len(tube_points)-2, len(tube_points)])

    return tube_points, tube_faces

def save_to_obj(points, faces, filename):
    with open(filename, 'w') as f:
        for i, point in enumerate(points):
            f.write(f"v {point[0]} {point[1]} {point[2]}\n")
        for face in faces:
            f.write(f"f {face[0]+1} {face[1]+1} {face[2]+1}\n")

num_points = 100
min_distance = 1
max_distance = 5
radius = 5
num_circles = 10

points, faces = generate_line(num_points, min_distance, max_distance, radius, num_circles)

desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
filename = os.path.join(desktop_path, "tube.obj")
save_to_obj(points, faces, filename)
print(f"Model saved as {filename}")

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(*zip(*points), 'b-', linewidth=5)
plt.show()
MakarovDs вне форума Ответить с цитированием
Старый 25.10.2024, 23:37   #83
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

Куб изрешеченный пулями:
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_lines_field(shape, num_lines):
    array = np.ones(shape, dtype=float)
    # Генерируем линии внутри куба
    for _ in range(num_lines):
        x1 = np.random.randint(0, shape[0])
        y1 = np.random.randint(0, shape[1])
        z1 = np.random.randint(0, shape[2])
        x2 = np.random.randint(0, shape[0])
        y2 = np.random.randint(0, shape[1])
        z2 = np.random.randint(0, shape[2])
        dx = x2 - x1
        dy = y2 - y1
        dz = z2 - z1
        length = int(np.sqrt(dx**2 + dy**2 + dz**2))
        for i in range(length):
            x = x1 + i * dx // length
            y = y1 + i * dy // length
            z = z1 + i * dz // length
            if 0 <= x < shape[0] and 0 <= y < shape[1] and 0 <= z < shape[2]:
                array[x, y, z] = 0.0
                # Делаем линии более жирными
                if x > 0:
                    array[x-1, y, z] = 0.0
                if x < shape[0] - 1:
                    array[x+1, y, z] = 0.0
                if y > 0:
                    array[x, y-1, z] = 0.0
                if y < shape[1] - 1:
                    array[x, y+1, z] = 0.0
                if z > 0:
                    array[x, y, z-1] = 0.0
                if z < shape[2] - 1:
                    array[x, y, z+1] = 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_lines = 100  # Количество линий

# Генерация 3D-поля с линиями
lines_field = generate_lines_field(shape, num_lines)

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

# Объединение полей
field = np.minimum(lines_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, "lines.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, 23:51   #84
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

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

def generate_lines_field(shape, num_lines):
    array = np.zeros(shape, dtype=float)
    # Генерируем линии внутри куба
    for _ in range(num_lines):
        x1 = np.random.randint(0, shape[0])
        y1 = np.random.randint(0, shape[1])
        z1 = np.random.randint(0, shape[2])
        x2 = np.random.randint(0, shape[0])
        y2 = np.random.randint(0, shape[1])
        z2 = np.random.randint(0, shape[2])
        dx = x2 - x1
        dy = y2 - y1
        dz = z2 - z1
        length = int(np.sqrt(dx**2 + dy**2 + dz**2))
        for i in range(length):
            x = x1 + i * dx // length
            y = y1 + i * dy // length
            z = z1 + i * dz // length
            if 0 <= x < shape[0] and 0 <= y < shape[1] and 0 <= z < shape[2]:
                array[x, y, z] = 1.0
                # Делаем линии более жирными
                if x > 0:
                    array[x-1, y, z] = 1.0
                if x < shape[0] - 1:
                    array[x+1, y, z] = 1.0
                if y > 0:
                    array[x, y-1, z] = 1.0
                if y < shape[1] - 1:
                    array[x, y+1, z] = 1.0
                if z > 0:
                    array[x, y, z-1] = 1.0
                if z < shape[2] - 1:
                    array[x, y, z+1] = 1.0
    return array

def generate_cube_field(shape):
    array = np.ones(shape, dtype=float)
    # Удаляем все 6 сторон куба
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                if x == 0 or x == shape[0] - 1 or y == 0 or y == shape[1] - 1 or z == 0 or z == shape[2] - 1:
                    array[x, y, z] = 0.0
    return array
# Параметры
shape = (64, 64, 64)  # Размеры 3D массива
num_lines = 100  # Количество линий

# Генерация 3D-поля с линиями
lines_field = generate_lines_field(shape, num_lines)

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

# Объединение полей логическим оператором "или"
field = np.logical_or(lines_field, cube_field).astype(float)

# Создание изосурфейса
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, "lines.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 вне форума Ответить с цитированием
Старый 26.10.2024, 00:04   #85
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

Лес линий изурфейса
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_lines_field(shape, num_lines):
    array = np.zeros(shape, dtype=float)
    # Генерируем линии внутри куба
    for _ in range(num_lines):
        x1 = np.random.randint(0, shape[0])
        y1 = np.random.randint(0, shape[1])
        z1 = np.random.randint(0, shape[2])
        x2 = np.random.randint(0, shape[0])
        y2 = np.random.randint(0, shape[1])
        z2 = np.random.randint(0, shape[2])
        dx = x2 - x1
        dy = y2 - y1
        dz = z2 - z1
        length = int(np.sqrt(dx**2 + dy**2 + dz**2))
        for i in range(length):
            x = x1 + i * dx // length
            y = y1 + i * dy // length
            z = z1 + i * dz // length
            if 0 <= x < shape[0] and 0 <= y < shape[1] and 0 <= z < shape[2]:
                array[x, y, z] = 1.0
                # Делаем линии более жирными
                if x > 0:
                    array[x-1, y, z] = 1.0
                if x < shape[0] - 1:
                    array[x+1, y, z] = 1.0
                if y > 0:
                    array[x, y-1, z] = 1.0
                if y < shape[1] - 1:
                    array[x, y+1, z] = 1.0
                if z > 0:
                    array[x, y, z-1] = 1.0
                if z < shape[2] - 1:
                    array[x, y, z+1] = 1.0
    return array

def generate_cube_field(shape):
    array = np.ones(shape, dtype=float)
    # Удаляем все 6 сторон куба
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                if x == 0 or x == shape[0] - 1 or y == 0 or y == shape[1] - 1 or z == 0 or z == shape[2] - 1:
                    array[x, y, z] = 0.0
    return array

# Параметры
shape = (64, 64, 64)  # Размеры 3D массива
num_lines = 100  # Количество линий

# Генерация 3D-поля с линиями
lines_field = generate_lines_field(shape, num_lines)

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

# Объединение полей логическим оператором "или"
field = np.logical_and(lines_field, cube_field).astype(float)

# Создание изосурфейса
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, "lines.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; 26.10.2024 в 00:12.
MakarovDs вне форума Ответить с цитированием
Старый 26.10.2024, 02:15   #86
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

А это прям чё-то экзотическое, сопля с кристалликами.
Код:
import numpy as np
import random
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os
# Генерация случайной функции с двумя переменными
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)

# Генерация линии
def generate_line():
    points = []
    for i in range(100):
        x, y, z = generate_space()
        points.append([x, y, z])
    return points

# Генерация 3D-поля с линией
def generate_line_field(shape, line):
    array = np.zeros(shape, dtype=float)
    for point in line:
        x, y, z = int(point[0] / 20 + shape[0] / 2), int(point[1] / 20 + shape[1] / 2), int(point[2] / 20 + shape[2] / 2)
        if 0 <= x < shape[0] and 0 <= y < shape[1] and 0 <= z < shape[2]:
            array[x, y, z] = 1.0
    return array

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

# Генерация линии
line = generate_line()

# Генерация 3D-поля с линией
line_field = generate_line_field(shape, line)

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

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

Ломанная линия изурфейса
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

def generate_lines_field(shape):
    array = np.zeros(shape, dtype=float)
    # Генерируем ломанную линию внутри куба
    x, y, z = np.random.randint(0, shape[0]), np.random.randint(0, shape[1]), np.random.randint(0, shape[2])
    for _ in range(100):  # количество сегментов ломанной линии
        dx = np.random.randint(-5, 6)
        dy = np.random.randint(-5, 6)
        dz = np.random.randint(-5, 6)
        length = int(np.sqrt(dx**2 + dy**2 + dz**2))
        for i in range(length):
            new_x = x + i * dx // length
            new_y = y + i * dy // length
            new_z = z + i * 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
        x, y, z = new_x, new_y, new_z
    return array

def generate_cube_field(shape):
    array = np.ones(shape, dtype=float)
    # Удаляем все 6 сторон куба
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                if x == 0 or x == shape[0] - 1 or y == 0 or y == shape[1] - 1 or z == 0 or z == shape[2] - 1:
                    array[x, y, z] = 0.0
    return array

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

# Генерация 3D-поля с линиями
lines_field = generate_lines_field(shape)

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

# Объединение полей логическим оператором "или"
field = np.logical_and(lines_field, cube_field).astype(float)

# Создание изосурфейса
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, "lines.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; 26.10.2024 в 03:50.
MakarovDs вне форума Ответить с цитированием
Старый 26.10.2024, 03:55   #88
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

НАОНЕЦ-ТО я смог это дурацкую линию сгенерировать изурфейсом
Код:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from skimage import measure
import os

# Функция для генерации ломанной линии
def generate_lines_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])

    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
                # Делаем линии более жирными
                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
    return array

def generate_cube_field(shape):
    array = np.ones(shape, dtype=float)
    # Удаляем все 6 сторон куба
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                if x == 0 or x == shape[0] - 1 or y == 0 or y == shape[1] - 1 or z == 0 or z == shape[2] - 1:
                    array[x, y, z] = 0.0
    return array

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

# Генерация 3D-поля с линиями
lines_field = generate_lines_field(shape)

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

# Объединение полей логическим оператором "или"
field = np.logical_and(lines_field, cube_field).astype(float)

# Создание изосурфейса
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, "lines.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 вне форума Ответить с цитированием
Старый 26.10.2024, 04:03   #89
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

Блин смотрю на свой комментарий на степике спустя год, и как-то стыдно стало :/ я реально когда то мог изучить целый курс по молекулярной биологии клетки, и даже начал изучать генную инженерию, причем фанатично изучал только ради этой цели, верил что смогу с помощью генной инженерии создавать что-то классное, я был вдохновлен советским фильмом повелители времени, там была такая структура, я очень впечатлился, это дало мне какие-то необычные чувства, и еще очень панический просто срался с момента когда гигантские комары его кусали в конце в шею, и чё-то в башке запало я хотел с помощью генной инженерии создать подобное строение, и даже жить в нем, какой же я был наивный, интересно что я скажу спустя 10 лет?
MakarovDs вне форума Ответить с цитированием
Старый 26.10.2024, 04:08   #90
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 377
По умолчанию

Воо! Другой разговор! Теперь мы сделали процедурный генератор зоны Долонгов!

Код:
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
    return array

def generate_cube_field(shape):
    array = np.ones(shape, dtype=float)
    # Удаляем все 6 сторон куба
    for x in range(shape[0]):
        for y in range(shape[1]):
            for z in range(shape[2]):
                if x == 0 or x == shape[0] - 1 or y == 0 or y == shape[1] - 1 or z == 0 or z == shape[2] - 1:
                    array[x, y, z] = 0.0
    return array

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

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

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

# Объединение полей логическим оператором "или"
field = np.logical_and(delaunay_field, cube_field).astype(float)

# Создание изосурфейса
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, "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; 26.10.2024 в 04:12.
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