Как создать симулятор потока частиц с регулируемой скоростью потока в Python?Python

Программы на Python
Ответить
Anonymous
 Как создать симулятор потока частиц с регулируемой скоростью потока в Python?

Сообщение Anonymous »

Я создаю 2D-симулятор потока частиц, используя Python и Pygame, который предназначен для воспроизведения движения частиц в одном направлении с динамикой столкновений. Моя цель — включить ползунок для динамической регулировки скорости потока частиц, аналогичный симулятору броуновского движения, который можно найти на MinuteLabs. Цель состоит в том, чтобы смоделировать частицы, которые в основном движутся в одном направлении (например, вправо), но также взаимодействуют и меняют направление при столкновении. Скорость потока будет контролироваться регулируемым ползунком в реальном времени. Этот симулятор является компонентом проекта турбулентного потока, в котором взаимодействие частиц описывает поток. В идеале центральный поток должен иметь четкую цветовую маркировку и действовать как индикатор красителя. Частицы должны в основном двигаться вправо, чтобы имитировать направленный поток. Они также должны участвовать в случайных столкновениях, изменяя свою скорость при ударе, чтобы отразить естественное поведение. Моделирование должно включать ползунок для динамической регулировки скорости потока частиц. Более того, симуляция должна обеспечивать четкую визуализацию, частицы различимы на фоне, а любые изменения скорости потока должны быть сразу заметны.
Я начал программировать только недавно, поэтому Мне этот проект показался довольно сложным. Вот упрощенная версия моего кода:

Код: Выделить всё

import pygame
import pygame_gui
import random
import sys

pygame.init()

# Set up the display
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption('Particle Flow Simulation')

# Create a GUI manager
manager = pygame_gui.UIManager((800, 600))

# Create a slider for flow speed
flow_speed_slider = pygame_gui.elements.UIHorizontalSlider(
relative_rect=pygame.Rect((100, 550), (600, 30)),
start_value=1.0,
value_range=(0.1, 5.0),
manager=manager
)

class Particle:
def __init__(self, x, y, vx, vy, radius=5):
self.x = x
self.y = y
self.vx = vx
self.vy = vy
self.radius = radius

def move(self):
self.x += self.vx
self.y += self.vy

def draw(self, screen):
pygame.draw.circle(screen, (255, 255, 255), (int(self.x), int(self.y)), self.radius)

def check_collision(p1, p2):
dx = p1.x - p2.x
dy = p1.y - p2.y
distance = (dx**2 + dy**2)**0.5
if distance < p1.radius + p2.radius:
return True
return False

def handle_collision(p1, p2):
p1.vx, p2.vx = p2.vx, p1.vx
p1.vy, p2.vy = p2.vy, p1.vy

particles = []

for _ in range(50):  # Create 50 particles
x = random.randint(100, 700)
y = random.randint(100, 500)
vx = random.uniform(-2, 2) + 1  # Add a flow to the right
vy = random.uniform(-2, 2)
particles.append(Particle(x, y, vx, vy))

# Main loop
running = True
clock = pygame.time.Clock()
while running:
time_delta = clock.tick(60) / 1000.0  # Frame time

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

manager.process_events(event)

manager.update(time_delta)

# Get flow speed from slider
flow_speed = flow_speed_slider.get_current_value()

for particle in particles:
particle.vx = (random.uniform(-2, 2) + 1) * flow_speed
particle.vy = random.uniform(-2, 2) * flow_speed
particle.move()

screen.fill((0, 0, 0))  # Fill the screen with black

for i in range(len(particles)):
for j in range(i + 1, len(particles)):
if check_collision(particles[i], particles[j]):
handle_collision(particles[i], particles[j])

for particle in particles:
particle.draw(screen)

manager.draw_ui(screen)
pygame.display.flip()

pygame.quit()
sys.exit()
Вот некоторые проблемы, с которыми я столкнулся:
  • Частицы иногда перекрываются или не сталкиваются, как ожидалось. (это случается часто).
  • Ползунок не меняет последовательно скорость всех частиц.
  • Моделирование запаздывает, когда количество частиц увеличивается.
В идеале — получение полного кода (или видео моделирования) было бы полезно. Однако, если это невозможно, было бы полезно следующее (первое является наиболее важным): улучшения в обнаружении столкновений и реагировании для предотвращения перекрытия частиц, улучшенные методы динамической регулировки скорости потока всех частиц и советы по оптимизации производительности при управление большим количеством частиц.
Я ценю любую помощь или предложения о том, как улучшить мою симуляцию. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»