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

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

Метки:
  1. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    390
    Код (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
    Сообщения:
    390
    dcc0, 16:40 про рейкастинг.
     
  3. dcc0

    dcc0 Active Member

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

    Application Active Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    390
    Ну не всегда можно сразу сообразить как методы топографов перенести в 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
    Сообщения:
    390
    Даже если есть сам алгоритм, там много чего другого, что нужно реализовывать и держать в уме.
     
  7. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    29 мар 2021
    Сообщения:
    390
    3d куб в консоли.
    Код (C):
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <math.h>
    4. #include <windows.h>
    5. #include <string.h>
    6. #include <conio.h>
    7.  
    8. #define WIDTH 80
    9. #define HEIGHT 25
    10. #define PI 3.14159265359
    11.  
    12. // Структура для 3D вектора
    13. typedef struct {
    14.     double x, y, z;
    15. } TVec3;
    16.  
    17. // Глобальный буфер экрана
    18. char screen[WIDTH * HEIGHT + 1];
    19.  
    20. // Функция создания вектора
    21. TVec3 MakeVec(double x, double y, double z) {
    22.     TVec3 v;
    23.     v.x = x;
    24.     v.y = y;
    25.     v.z = z;
    26.     return v;
    27. }
    28.  
    29. // Поворот точки вокруг осей
    30. void RotatePoint(TVec3* p, double ax, double ay, double az) {
    31.     double x, y, z;
    32.     double cosA, sinA;
    33.  
    34.     // Поворот вокруг X
    35.     cosA = cos(ax);
    36.     sinA = sin(ax);
    37.     y = p->y * cosA - p->z * sinA;
    38.     z = p->y * sinA + p->z * cosA;
    39.     p->y = y;
    40.     p->z = z;
    41.  
    42.     // Поворот вокруг Y
    43.     cosA = cos(ay);
    44.     sinA = sin(ay);
    45.     x = p->x * cosA + p->z * sinA;
    46.     z = -p->x * sinA + p->z * cosA;
    47.     p->x = x;
    48.     p->z = z;
    49.  
    50.     // Поворот вокруг Z
    51.     cosA = cos(az);
    52.     sinA = sin(az);
    53.     x = p->x * cosA - p->y * sinA;
    54.     y = p->x * sinA + p->y * cosA;
    55.     p->x = x;
    56.     p->y = y;
    57. }
    58.  
    59. // Проекция 3D на 2D
    60. void ProjectPoint(const TVec3* p, int* sx, int* sy) {
    61.     double scale;
    62.     scale = 8.0 / (p->z + 8.0); // Перспектива
    63.     *sx = (int)(p->x * scale * 5.0 + WIDTH / 2.0);
    64.     *sy = (int)(-p->y * scale * 5.0 + HEIGHT / 2.0);
    65.  
    66.     // Ограничение
    67.     if (*sx < 0) *sx = 0;
    68.     if (*sx >= WIDTH) *sx = WIDTH - 1;
    69.     if (*sy < 0) *sy = 0;
    70.     if (*sy >= HEIGHT) *sy = HEIGHT - 1;
    71. }
    72.  
    73. // Рисование линии
    74. void DrawLine(TVec3 p1, TVec3 p2) {
    75.     int x1, y1, x2, y2;
    76.     int x, y, dx, dy, sx, sy, err, e2;
    77.  
    78.     ProjectPoint(&p1, &x1, &y1);
    79.     ProjectPoint(&p2, &x2, &y2);
    80.  
    81.     x = x1;
    82.     y = y1;
    83.     dx = abs(x2 - x1);
    84.     dy = abs(y2 - y1);
    85.  
    86.     if (x1 < x2) sx = 1; else sx = -1;
    87.     if (y1 < y2) sy = 1; else sy = -1;
    88.  
    89.     err = dx - dy;
    90.  
    91.     while (1) {
    92.         if (x >= 0 && x < WIDTH && y >= 0 && y < HEIGHT) {
    93.             screen[y * WIDTH + x] = '#';
    94.         }
    95.      
    96.         if (x == x2 && y == y2) break;
    97.      
    98.         e2 = 2 * err;
    99.         if (e2 > -dy) {
    100.             err = err - dy;
    101.             x = x + sx;
    102.         }
    103.         if (e2 < dx) {
    104.             err = err + dx;
    105.             y = y + sy;
    106.         }
    107.     }
    108. }
    109.  
    110. // Очистка консоли
    111. void ClrScr() {
    112.     HANDLE hConsole;
    113.     CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
    114.     DWORD dwSize, NumCells;
    115.     COORD Coord;
    116.  
    117.     hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    118.     GetConsoleScreenBufferInfo(hConsole, &ConsoleInfo);
    119.     dwSize = ConsoleInfo.dwSize.X * ConsoleInfo.dwSize.Y;
    120.     Coord.X = 0;
    121.     Coord.Y = 0;
    122.     FillConsoleOutputCharacter(hConsole, ' ', dwSize, Coord, &NumCells);
    123.     FillConsoleOutputAttribute(hConsole, ConsoleInfo.wAttributes, dwSize, Coord, &NumCells);
    124.     SetConsoleCursorPosition(hConsole, Coord);
    125. }
    126.  
    127. // Перемещение курсора
    128. void GotoXY(int x, int y) {
    129.     HANDLE hConsole;
    130.     COORD Coord;
    131.  
    132.     hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    133.     Coord.X = x - 1;
    134.     Coord.Y = y - 1;
    135.     SetConsoleCursorPosition(hConsole, Coord);
    136. }
    137.  
    138. // Главная функция
    139. int main() {
    140.     TVec3 cube[8];
    141.     TVec3 rotated[8];
    142.     int edges[12][2];
    143.     int i;
    144.     double angle;
    145.     HANDLE hConsole;
    146.  
    147.     // Вершины куба
    148.     cube[0] = MakeVec(-1, -1, -1);
    149.     cube[1] = MakeVec( 1, -1, -1);
    150.     cube[2] = MakeVec( 1,  1, -1);
    151.     cube[3] = MakeVec(-1,  1, -1);
    152.     cube[4] = MakeVec(-1, -1,  1);
    153.     cube[5] = MakeVec( 1, -1,  1);
    154.     cube[6] = MakeVec( 1,  1,  1);
    155.     cube[7] = MakeVec(-1,  1,  1);
    156.  
    157.     // Ребра куба (соединения вершин)
    158.     edges[0][0] = 0; edges[0][1] = 1;
    159.     edges[1][0] = 1; edges[1][1] = 2;
    160.     edges[2][0] = 2; edges[2][1] = 3;
    161.     edges[3][0] = 3; edges[3][1] = 0;
    162.     edges[4][0] = 4; edges[4][1] = 5;
    163.     edges[5][0] = 5; edges[5][1] = 6;
    164.     edges[6][0] = 6; edges[6][1] = 7;
    165.     edges[7][0] = 7; edges[7][1] = 4;
    166.     edges[8][0] = 0; edges[8][1] = 4;
    167.     edges[9][0] = 1; edges[9][1] = 5;
    168.     edges[10][0] = 2; edges[10][1] = 6;
    169.     edges[11][0] = 3; edges[11][1] = 7;
    170.  
    171.     // Инициализация экрана
    172.     memset(screen, ' ', WIDTH * HEIGHT);
    173.     screen[WIDTH * HEIGHT] = '\0';
    174.  
    175.     ClrScr();
    176.  
    177.     // Скрываем курсор
    178.     hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    179.     CONSOLE_CURSOR_INFO cursorInfo;
    180.     GetConsoleCursorInfo(hConsole, &cursorInfo);
    181.     cursorInfo.bVisible = FALSE;
    182.     SetConsoleCursorInfo(hConsole, &cursorInfo);
    183.  
    184.     angle = 0;
    185.  
    186.     while (1) {
    187.         // Очистка экрана
    188.         memset(screen, ' ', WIDTH * HEIGHT);
    189.      
    190.         // Копируем и поворачиваем вершины
    191.         for (i = 0; i < 8; i++) {
    192.             rotated[i] = cube[i];
    193.             RotatePoint(&rotated[i], angle, angle * 0.7, angle * 0.3);
    194.         }
    195.      
    196.         // Рисуем все ребра
    197.         for (i = 0; i < 12; i++) {
    198.             DrawLine(rotated[edges[i][0]], rotated[edges[i][1]]);
    199.         }
    200.      
    201.         // Вывод на экран
    202.         GotoXY(1, 1);
    203.         printf("%s", screen);
    204.      
    205.         angle += 0.05;
    206.         Sleep(50);
    207.      
    208.         // Выход по нажатию ESC
    209.         if (GetAsyncKeyState(VK_ESCAPE)) break;
    210.     }
    211.  
    212.     // Показываем курсор обратно
    213.     cursorInfo.bVisible = TRUE;
    214.     SetConsoleCursorInfo(hConsole, &cursorInfo);
    215.  
    216.     return 0;
    217. }