Опыт работы с нейронными сетями и простой код на Ассемблере.

Тема в разделе "WASM.BEGINNERS", создана пользователем dcc0, 17 май 2026.

Метки:
  1. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    387
    Код (Python):
    1. import pygame
    2. import random
    3. import math
    4.  
    5. # Инициализация Pygame
    6. pygame.init()
    7.  
    8. # Настройки экрана
    9. WIDTH, HEIGHT = 800, 600
    10. screen = pygame.display.set_mode((WIDTH, HEIGHT))
    11. pygame.display.set_caption("Струя воды из пожарного крана")
    12.  
    13. # Цвета
    14. WHITE = (255, 255, 255)
    15. BLACK = (0, 0, 0)
    16. RED = (200, 0, 0)
    17. GRAY = (80, 80, 80)
    18. BLUE_SHADES = [(0, 100, 255), (0, 150, 255), (100, 200, 255), (150, 220, 255)]
    19.  
    20. # Параметры крана (сопло в левом углу)
    21. CRANE_X, CRANE_Y = 30, HEIGHT // 2 - 20  # позиция сопла
    22.  
    23. class WaterDrop:
    24.     """Класс одной капли/частицы воды"""
    25.     def __init__(self):
    26.         # Начальная позиция (из сопла крана)
    27.         self.x = CRANE_X + 10
    28.         self.y = CRANE_Y + 10
    29.        
    30.         # Угол разлета струи (от -45 до +45 градусов от горизонтали)
    31.         angle = random.uniform(-math.pi / 3, math.pi / 3)
    32.         # Базовая скорость (напор воды)
    33.         base_speed = random.uniform(6, 12)
    34.        
    35.         # Вектор скорости
    36.         self.vx = base_speed * math.cos(angle) * random.uniform(0.8, 1.2)
    37.         self.vy = base_speed * math.sin(angle) * random.uniform(0.8, 1.2) + 1
    38.        
    39.         # Немного случайного разброса для реализма
    40.         self.vx += random.uniform(-0.5, 0.5)
    41.         self.vy += random.uniform(-0.5, 0.5)
    42.        
    43.         # Размер капли
    44.         self.size = random.randint(2, 5)
    45.         # Цвет (оттенок синего)
    46.         self.color = random.choice(BLUE_SHADES)
    47.         # Прозрачность (будем уменьшать со временем)
    48.         self.lifetime = random.randint(40, 80)
    49.         self.max_lifetime = self.lifetime
    50.        
    51.     def update(self):
    52.         """Обновление позиции и состояния капли"""
    53.         # Движение
    54.         self.x += self.vx
    55.         self.y += self.vy
    56.        
    57.         # Гравитация (тянет вниз)
    58.         self.vy += 0.15
    59.        
    60.         # Сопротивление воздуха (немного замедляем)
    61.         self.vx *= 0.999
    62.         self.vy *= 0.999
    63.        
    64.         # Уменьшаем время жизни
    65.         self.lifetime -= 1
    66.        
    67.         # Если капля упала на пол, она "разбивается" и исчезает быстрее
    68.         if self.y >= HEIGHT - 10:
    69.             self.lifetime = min(self.lifetime, 10)
    70.             self.vy *= -0.3  # небольшой отскок
    71.             self.vx *= 0.8
    72.        
    73.         # Не даем улететь слишком далеко вверх/вниз за экран
    74.         if self.y > HEIGHT + 50 or self.x > WIDTH + 50:
    75.             self.lifetime = 0
    76.        
    77.     def draw(self, surface):
    78.         """Отрисовка капли"""
    79.         if self.lifetime > 0:
    80.             # Прозрачность уменьшается к концу жизни
    81.             alpha = int(255 * (self.lifetime / self.max_lifetime))
    82.             # Создаем поверхность с альфа-каналом для капли
    83.             drop_surf = pygame.Surface((self.size * 2, self.size * 2), pygame.SRCALPHA)
    84.             pygame.draw.circle(drop_surf, (*self.color, alpha), (self.size, self.size), self.size)
    85.             surface.blit(drop_surf, (int(self.x - self.size), int(self.y - self.size)))
    86.  
    87. class WaterJet:
    88.     """Управляет потоком частиц"""
    89.     def __init__(self):
    90.         self.drops = []
    91.         self.spawn_rate = 8  # частиц за кадр
    92.        
    93.     def update(self):
    94.         # Создаем новые капли
    95.         for _ in range(self.spawn_rate):
    96.             self.drops.append(WaterDrop())
    97.        
    98.         # Обновляем существующие
    99.         for drop in self.drops:
    100.             drop.update()
    101.        
    102.         # Удаляем мертвые капли
    103.         self.drops = [d for d in self.drops if d.lifetime > 0]
    104.        
    105.         # Ограничиваем общее количество (для производительности)
    106.         if len(self.drops) > 1500:
    107.             self.drops = self.drops[-1200:]
    108.            
    109.     def draw(self, surface):
    110.         for drop in self.drops:
    111.             drop.draw(surface)
    112.  
    113. def draw_crane(surface):
    114.     """Рисует пожарный кран в левом углу"""
    115.     # Основание крана
    116.     pygame.draw.rect(surface, GRAY, (CRANE_X - 10, CRANE_Y + 15, 20, 40))
    117.     # Корпус
    118.     pygame.draw.rect(surface, RED, (CRANE_X - 5, CRANE_Y - 5, 10, 25))
    119.     # Головка (сопло)
    120.     pygame.draw.circle(surface, RED, (CRANE_X + 5, CRANE_Y + 5), 12)
    121.     pygame.draw.circle(surface, GRAY, (CRANE_X + 5, CRANE_Y + 5), 8)
    122.     # Вентиль (ручка)
    123.     pygame.draw.line(surface, RED, (CRANE_X - 15, CRANE_Y - 10), (CRANE_X + 5, CRANE_Y - 5), 4)
    124.     pygame.draw.circle(surface, RED, (CRANE_X - 15, CRANE_Y - 10), 4)
    125.     # Труба внизу
    126.     pygame.draw.rect(surface, GRAY, (CRANE_X + 2, CRANE_Y + 40, 6, 30))
    127.     # Блеск на сопле
    128.     pygame.draw.circle(surface, (200, 200, 200), (CRANE_X + 8, CRANE_Y + 2), 2)
    129.  
    130. # Основной цикл
    131. def main():
    132.     clock = pygame.time.Clock()
    133.     jet = WaterJet()
    134.     running = True
    135.    
    136.     # Для FPS и счетчика частиц
    137.     font = pygame.font.Font(None, 24)
    138.    
    139.     while running:
    140.         for event in pygame.event.get():
    141.             if event.type == pygame.QUIT:
    142.                 running = False
    143.             # Нажатие пробела увеличивает напор
    144.             if event.type == pygame.KEYDOWN:
    145.                 if event.key == pygame.K_SPACE:
    146.                     jet.spawn_rate = min(jet.spawn_rate + 2, 20)
    147.                 if event.key == pygame.K_DOWN:
    148.                     jet.spawn_rate = max(jet.spawn_rate - 2, 2)
    149.        
    150.         # Обновление
    151.         jet.update()
    152.        
    153.         # Рендеринг
    154.         screen.fill(BLACK)
    155.        
    156.         # Рисуем фон (пол)
    157.         pygame.draw.rect(screen, (30, 30, 40), (0, HEIGHT - 10, WIDTH, 10))
    158.        
    159.         # Рисуем кран
    160.         draw_crane(screen)
    161.        
    162.         # Рисуем струю
    163.         jet.draw(screen)
    164.        
    165.         # Статистика
    166.         fps = int(clock.get_fps())
    167.         info_text = f"Частиц: {len(jet.drops)}  |  FPS: {fps}  |  Напор: {jet.spawn_rate} (SPACE +, DOWN -)"
    168.         text_surf = font.render(info_text, True, WHITE)
    169.         screen.blit(text_surf, (10, 10))
    170.        
    171.         pygame.display.flip()
    172.         clock.tick(60)
    173.    
    174.     pygame.quit()
    175.  
    176. if __name__ == "__main__":
    177.     main()
     
    dcc0 нравится это.
  2. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    387
    dcc0, 16:40 про рейкастинг.
     
  3. dcc0

    dcc0 Active Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    138
    Интересно. Но ничего , что топографы знали про рейкастинг и раньше?! :) Ладно, это я так...
     
  4. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    387
    Ну не всегда можно сразу сообразить как методы топографов перенести в 3d игры.
     
  5. dcc0

    dcc0 Active Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    138
    "Математическое и геометрическое представление линейной перспективы появилось в 1415–1425 годах в Италии. Первые практические опыты провел архитектор Филиппо Брунеллески около 1415 года, а в 1435 году теоретик Леон Баттиста Альберти описал её математические законы в своем трактате "... ИИ Вики. Я думаю, что над этой темой думали очень много и давно. Почти уверен, что в научной литературе алгоритм в явном или неявном виде существует. Так что вопрос почти всегда один: на чьих плечах стоит тот или иной ученый или программист?! Молодец человек, если сумел понять или закодировать, но надо надо понимать, что он, скорее всего, не сделал открытия. Бывает, что играясь на бумажке, можно открыть новый алгоритм, но большая часть их давно известна..
    --- Сообщение объединено, 25 июл 2026 в 11:19 ---
    Application, я думаю, многое из физического, видимого, особенно воспринимаемого, не так просто переложить на код. Что-то легче, что-то труднее. При видимой лёгкости и понятности, можно помучиться, если с 0 нуля делать. + если есть пробелы в понимании геометрии или недостаточно смекалки, то можно долго сидеть. Но тригонометрии не один год и не сто лет, и инженерная школа в общем тоже не вчера появилась.
    Как-то так...
    --- Сообщение объединено, 25 июл 2026 в 11:25 ---
    Omnis ars imitatio est naturae.
    Всякое искусство - пожражаие природе.
     
  6. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    387
    Даже если есть сам алгоритм, там много чего другого, что нужно реализовывать и держать в уме.