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

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

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2024, 12:14   #21
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 974
По умолчанию

Читатели "благодарны" за картинки анимации
размером в несколько мегабайт

Хорошо бы додумать на форуме скрывающие спойлеры

Вообще есть сайт ezgif сжимающий gifы
и сжав размещали бы мини анимации
без массовой траты мегабайт
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Старый 17.08.2024, 05:48   #22
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 106
По умолчанию

Цитата:
Сообщение от сфинкс Посмотреть сообщение
Читатели "благодарны" за картинки анимации
размером в несколько мегабайт

Хорошо бы додумать на форуме скрывающие спойлеры

Вообще есть сайт ezgif сжимающий gifы
и сжав размещали бы мини анимации
без массовой траты мегабайт
А что лагает разве!? У меня все нормально зайди в режим инкогнито, и посмотри будет лагать или нет, мои гиф не очень много весят...

Вообщем я немного изменил код генерации шума фрактальной пены, и получилось неказисто странно будто-бы это кипящий сыр с дырками где дырки увеличиваются, и уменьшаются... Но может быть что-то можно из него вылепить в будущем...

Код:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np
import noise as perlin_noise
from skimage import measure

# Инициализация Pygame
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

# Инициализация камеры
gluPerspective(25, (display[0]/display[1]), 0.1, 1000.0)
glTranslatef(-15, 0.0, -150.0)  # Переместить камеру вниз и назад
glRotatef(35, 1, 0, 0)  # Повернуть камеру на 35 градусов вокруг оси X

# Параметры шума Перлина
octaves = 4
persistence = 0.5
lacunarity = 2
scale = 10

# Создание 3D-массива шума Перлина
shape = (32, 32, 32)

# Нормализация шума в диапазон от 0 до 1
def normalize_noise(noise):
    return (noise - noise.min()) / (noise.max() - noise.min())

# Генерация шума Перлина для одного кадра
def generate_noise(base, offset, particles):
    noise = np.zeros(shape)
    for i in range(shape[0]):
        for j in range(shape[1]):
            for k in range(shape[2]):
                noise[i][j][k] = perlin_noise.pnoise3((i + offset[0]) / scale,
                                                     (j + offset[1]) / scale,
                                                     (k + offset[2]) / scale,
                                                     octaves=octaves,
                                                     persistence=persistence,
                                                     lacunarity=lacunarity,
                                                     repeatx=shape[0],
                                                     repeaty=shape[1],
                                                     repeatz=shape[2],
                                                     base=int(base))
                for particle in particles:
                    dist = np.sqrt((i - particle['x'])**2 + (j - particle['y'])**2 + (k - particle['z'])**2)
                    if dist < 5:
                        noise[i][j][k] += 0.5 - dist / 10
    return normalize_noise(noise)

# Функция для обновления кадра
def update(offset, particles):
    base = 42  # Фиксированный base для каждого кадра
    noise = generate_noise(base, offset, particles)
    U = np.where(noise > 0.5, noise, noise.min())  # Устанавливаем значение в минимальное, если шум ниже 0.5
    U = normalize_noise(U)  # Нормализация массива U

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

    # Отрисовка изосурфейса
    glColor4f(0.0, 1.0, 0.0, 0.5)  # Зеленый полупрозрачный цвет
    glEnable(GL_BLEND)  # Включить смешивание цветов
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)  # Установить функцию смешивания
    glBegin(GL_TRIANGLES)
    for face in faces:
        for vertex_index in face:
            vertex = verts[vertex_index]
            glVertex3fv(vertex)
    glEnd()
    glDisable(GL_BLEND)  # Выключить смешивание цветов

# Создание системы частиц
particles = []
for _ in range(10):
    particle = {
        'x': np.random.randint(0, shape[0]),
        'y': np.random.randint(0, shape[1]),
        'z': np.random.randint(0, shape[2]),
        'vx': np.random.uniform(-1, 1),
        'vy': np.random.uniform(-1, 1),
        'vz': np.random.uniform(-1, 1),
        'lifetime': np.random.randint(100, 200)
    }
    particles.append(particle)

# Основной цикл
offset = [0, 0, 0]
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                offset[2] += 5
            if event.key == pygame.K_s:
                offset[2] -= 5
            if event.key == pygame.K_a:
                offset[0] -= 5
            if event.key == pygame.K_d:
                offset[0] += 5
            if event.key == pygame.K_q:
                offset[1] -= 5
            if event.key == pygame.K_e:
                offset[1] += 5

    # Обновление системы частиц
    for particle in particles:
        particle['x'] += particle['vx']
        particle['y'] += particle['vy']
        particle['z'] += particle['vz']
        particle['lifetime'] -= 1
        if particle['lifetime'] <= 0:
            particles.remove(particle)
            new_particle = {
                'x': np.random.randint(0, shape[0]),
                'y': np.random.randint(0, shape[1]),
                'z': np.random.randint(0, shape[2]),
                'vx': np.random.uniform(-1, 1),
                'vy': np.random.uniform(-1, 1),
                'vz': np.random.uniform(-1, 1),
                'lifetime': np.random.randint(100, 200)
            }
            particles.append(new_particle)

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    update(offset, particles)
    pygame.display.flip()
    clock.tick(60)
По задумке что-бы получилось как у Дэвида Лейнвебера код должен создать систему частиц, которая генерирует каплеобразные аморфные градиенты. Каждая частица имеет случайный вектор перемещения, время существования и удаляется после истечения этого времени. Новая частица генерируется на месте удаленной с новым случайным вектором перемещения. Дальше можно разделить куб на мелкие кубы, и получиться 27 кубов пропорционально размещенных относительно друг друг, и там где места стыков между кубами сделать так что-бы вероятность генерации было нулевой, и таким образом получится что-то похожее на квантовую пену... Функция генерации шума Перлина учитывает положение частиц и создает градиенты вокруг них.


Последний раз редактировалось MakarovDs; 17.08.2024 в 12:00.
MakarovDs на форуме Ответить с цитированием
Старый 17.08.2024, 16:46   #23
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 974
По умолчанию

https://ezgif.com/optimize
там поставив ручку на 200 и оптимизировав

уменьшает файл в 3...5 раз
и народ меньше потратит зря мегабайт мегабайт мегабайт

лично я данную тему дальше не смотрю
и всем кому жалко мегабайт мегабайт мегабайт
тему не читайте

ведь эдак вставит гиф на гигабайт
и уйдут вникуда мегабайты мегабайты мегабайты
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Старый 18.08.2024, 11:16   #24
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 106
По умолчанию

Цитата:
Сообщение от сфинкс Посмотреть сообщение
ет файл в 3...5 раз
и народ меньше потратит зря мегабайт мегабайт мегабайт

лично я данную тему дальше не смотрю
и всем кому жалко мегабайт мегабайт мегабайт
тему не читайте

ведь эдак вставит гиф на гигабайт
О чём ты говоришь? Я все свои гифки выкладывают на postimage вот ссылка да и весят они от силы 1 мегабайт...

Вообщем мне так понравился код с суперсотами что я решил его переписать, и сделать из него бесконечному процедурную генерированное пространство квантовой пены как выше с постоянным генерацией в случайном месте:

Код:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np
import noise as perlin_noise
from skimage import measure
import random

# Инициализация Pygame
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

# Инициализация камеры
gluPerspective(25, (display[0]/display[1]), 0.1, 1000.0)
glTranslatef(-15, 0.0, -150.0)  # Переместить камеру вниз и назад
glRotatef(35, 1, 0, 0)  # Повернуть камеру на 35 градусов вокруг оси X

# Параметры шума Перлина
octaves = 4
persistence = 0.5
lacunarity = 2
scale = 10

# Создание 3D-массива шума Перлина
shape = (32, 32, 32)

# Нормализация шума в диапазон от 0 до 1
def normalize_noise(noise):
    return (noise - noise.min()) / (noise.max() - noise.min())

# Генерация шума Перлина для одного кадра
def generate_noise(base, offset, scale):
    noise = np.zeros(shape)
    for i in range(shape[0]):
        for j in range(shape[1]):
            for k in range(shape[2]):
                noise[i][j][k] = perlin_noise.pnoise3((i + offset[0]) / scale,
                                                     (j + offset[1]) / scale,
                                                     (k + offset[2]) / scale,
                                                     octaves=octaves,
                                                     persistence=persistence,
                                                     lacunarity=lacunarity,
                                                     repeatx=shape[0],
                                                     repeaty=shape[1],
                                                     repeatz=shape[2],
                                                     base=int(base))
    return normalize_noise(noise)

# Функция для обновления кадра
def update(offset):
    base = random.randint(0, 1000)  # Случайный base для каждого кадра
    scale = random.uniform(1, 10)  # Случайный масштаб для каждого кадра
    noise = generate_noise(base, offset, scale)
    U = np.where(noise > 0.5, noise, noise.min())  # Устанавливаем значение в минимальное, если шум ниже 0.5
    U = normalize_noise(U)  # Нормализация массива U

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

    # Отрисовка изосурфейса
    glColor4f(0.0, 1.0, 0.0, 0.5)  # Зеленый полупрозрачный цвет
    glEnable(GL_BLEND)  # Включить смешивание цветов
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)  # Установить функцию смешивания
    glBegin(GL_TRIANGLES)
    for face in faces:
        for vertex_index in face:
            vertex = verts[vertex_index]
            glVertex3fv(vertex)
    glEnd()
    glDisable(GL_BLEND)  # Выключить смешивание цветов

# Основной цикл
offset = [0, 0, 0]
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                offset[2] += 5
            if event.key == pygame.K_s:
                offset[2] -= 5
            if event.key == pygame.K_a:
                offset[0] -= 5
            if event.key == pygame.K_d:
                offset[0] += 5
            if event.key == pygame.K_q:
                offset[1] -= 5
            if event.key == pygame.K_e:
                offset[1] += 5

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    update(offset)
    pygame.display.flip()
    clock.tick(60)
Вот гифка

Последний раз редактировалось MakarovDs; 18.08.2024 в 11:21.
MakarovDs на форуме Ответить с цитированием
Старый 18.08.2024, 12:19   #25
MakarovDs
Форумчанин
 
Аватар для MakarovDs
 
Регистрация: 10.01.2020
Сообщений: 106
По умолчанию

И вот наконец-то код в котором можно перемещаться:

Код:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np
import noise as perlin_noise
from skimage import measure
import random

# Инициализация Pygame
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

# Инициализация камеры
gluPerspective(25, (display[0]/display[1]), 0.1, 1000.0)
glTranslatef(-15, 0.0, -150.0)  # Переместить камеру вниз и назад
glRotatef(35, 1, 0, 0)  # Повернуть камеру на 35 градусов вокруг оси X

# Параметры шума Перлина
octaves = 4
persistence = 0.5
lacunarity = 2
scale = 10

# Создание 3D-массива шума Перлина
shape = (32, 32, 32)

# Нормализация шума в диапазон от 0 до 1
def normalize_noise(noise):
    return (noise - noise.min()) / (noise.max() - noise.min())

# Генерация шума Перлина для одного кадра
def generate_noise(base, offset, scale):
    noise = np.zeros(shape)
    for i in range(shape[0]):
        for j in range(shape[1]):
            for k in range(shape[2]):
                noise[i][j][k] = perlin_noise.pnoise3((i + offset[0]) / scale,
                                                     (j + offset[1]) / scale,
                                                     (k + offset[2]) / scale,
                                                     octaves=octaves,
                                                     persistence=persistence,
                                                     lacunarity=lacunarity,
                                                     repeatx=shape[0],
                                                     repeaty=shape[1],
                                                     repeatz=shape[2],
                                                     base=int(base))
    return normalize_noise(noise)

# Чанки и их шум
chunks = {}  # Словарь для хранения шума каждого чанка

# Создание чанка и добавление его в словарь
def create_chunk(offset):
    base = random.randint(0, 1000)  # Случайный base для каждого чанка
    scale = random.uniform(1, 10)  # Случайный масштаб для каждого чанка
    noise = generate_noise(base, offset, scale)
    chunks[tuple(offset)] = noise

# Функция для обновления кадра
def update(offset):
    # Проверить, существует ли шум для текущего чанка
    if tuple(offset) not in chunks:
        create_chunk(offset)  # Создать чанк, если его нет

    noise = chunks[tuple(offset)]  # Получить шум для текущего чанка
    U = np.where(noise > 0.5, noise, noise.min())  # Установить значение в минимальное, если шум ниже 0.5
    U = normalize_noise(U)  # Нормализация массива U

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

    # Отрисовка изосурфейса
    glColor4f(0.0, 1.0, 0.0, 0.5)  # Зеленый полупрозрачный цвет
    glEnable(GL_BLEND)  # Включить смешивание цветов
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)  # Установить функцию смешивания
    glBegin(GL_TRIANGLES)
    for face in faces:
        for vertex_index in face:
            vertex = verts[vertex_index]
            glVertex3fv(vertex)
    glEnd()
    glDisable(GL_BLEND)  # Выключить смешивание цветов

# Основной цикл
offset = [0, 0, 0]
clock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                offset[2] += 5
            if event.key == pygame.K_s:
                offset[2] -= 5
            if event.key == pygame.K_a:
                offset[0] -= 5
            if event.key == pygame.K_d:
                offset[0] += 5
            if event.key == pygame.K_q:
                offset[1] -= 5
            if event.key == pygame.K_e:
                offset[1] += 5

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    update(offset)
    pygame.display.flip()
    clock.tick(60)

Последний раз редактировалось MakarovDs; 18.08.2024 в 12:23.
MakarovDs на форуме Ответить с цитированием
Старый 18.08.2024, 12:38   #26
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,597
По умолчанию

Цитата:
Сообщение от MakarovDs Посмотреть сообщение
Вот гифка
довольно быстро хостинг картинок её удалит и ничего не останется.
на форуме работает пережималка и ограничения на загрузку по размеру тоже стоят.
так что лучше грузить на форум

да и у кого мегабайты сейчас что либо стоят, у всех интернеты безлимитные по 100мегабит, фильмы в 4к смотрят онлайн, если сервер раздаёт с таким качеством.
Alar вне форума Ответить с цитированием
Старый 18.08.2024, 12:50   #27
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 974
По умолчанию

"вот ссылка да и весят они от силы 1 мегабайт"

из сотни картинок по ссылке малого размера
на форум внезапно вставлены все мега-мегабайтные

06-02-02-32-83.gif 06-21-48-09-929.gif
06-20-29-49-288.gif 06-20-22-11-368.gif
06-02-17-26-299.gif = суммарно около 22 МБ

и значит могут вставиться ещё больше
хотя небось оформляется ссылка с мини картинкой
обязательно указывая размер именно анимации

Гифы уменьшает в разы https://ezgif.com/optimize
там поставив ручку на 200 и оптимизировав и сохранив

уменьшает файл в 3...5 раз
и народ меньше потратит зря мегабайт мегабайт мегабайт

Проверяем сервис хранилища избегаемый автором


Картинка сейчас аж 7 ... КИЛОбайт

Пишет же хранилище:
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую

Последний раз редактировалось сфинкс; 18.08.2024 в 13:09.
сфинкс вне форума Ответить с цитированием
Старый 18.08.2024, 17:44   #28
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,597
По умолчанию

Цитата:
Сообщение от сфинкс Посмотреть сообщение
Пишет же хранилище:
так не недо делать, удалил ссылку и пример, так постят только спамеры на автомате, для этого даже все теги удалены, чтобы было понятно, что если так постит кто-то это автобот.

нужно подгружать на форум. или делать ссылкой, как это было у автора, чтобы было понятно что переход идёт на сторонний ресурс.
Alar вне форума Ответить с цитированием
Старый 21.08.2024, 10:11   #29
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,597
По умолчанию

сфинкс, вы нехороший человек, тему почищу чуть позже от ваших не правильных советов.


картинки нужно грузить на форум, если они нужны, если не нужны, не вставлять их вообще.
Alar вне форума Ответить с цитированием
Старый 21.08.2024, 17:57   #30
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 974
По умолчанию

насчёт "картинки" много мегабайтные
якобы "нужно грузить на форум"

автор темы противоречит требованию
заметно вызвав меню на картинке
и там картинка ссылкой на файлообменник

в сообщении 6 картинка 7+ мегабайт
i.postimg.cc/L831JLCn/2024-08-01-00-19-59-981.gif
доказывает менеджер закачек даже не загружая

главное пишу: сервис ezgif.com превратит картинку 5 мегабайт
в картинку около 0,5 мегабайт и можно размещать
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Компьютерное моделирование, моделирование физических процессов. (в Excel ) Dytchi Помощь студентам 0 06.02.2012 15:54
моделирование RGB Traffka Помощь студентам 1 20.10.2010 17:08
Формула по квантовой физике StudentPolitech Свободное общение 1 18.09.2009 01:36
Вопрос на засыпку по квантовой физике. Kostia Помощь студентам 5 26.10.2008 00:20