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

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

Метки:
  1. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    973
    dcc0, 16:40 про рейкастинг.

     
  2. dcc0

    dcc0 Active Member

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

    Application Moderator Команда форума

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

    dcc0 Active Member

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

    Application Moderator Команда форума

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

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    973
    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. }
     
  7. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    526
    Не в обиду. Скомпилировал, не понравилось. Бред какой-то, а не 3d куб в консоли. Проверять нужно качество работы бредогенератора, перед тем как постить его выхлоп. :)
     
  8. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    973
    GRAFik, это же консоль. а что ожидал увидеть?
     
  9. dcc0

    dcc0 Active Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    144
    3D куб какой-то видел на Ютубе.
    --- Сообщение объединено, 31 июл 2026 в 17:48 ---
    Кодил руками на смартфоне на даче, вечерком. После повторого просмотра лекции о сети Хопфилда. Уже кодил когда-то пример этот. Ещё раз набросал модель (для ращжевывания). Спрошу у Алисы, понимает ли, о чем код?! :) хе-хе

    P.S.

    А ведь если вдуматься, все ведь до тупого угла треугольника просто:
    Умножение векторов на себя, их сумма и умножение на искомый образец. Всё. Вся нейронка. Вот только с ёмкостью сети непонятно.
    Сколько образцов может хранить.
    (даже уравнения школьные бывают сложнее)

    Код (Text):
    1.  
    2. <?php
    3.  
    4. $x1=array(-1,1,-1,1);
    5. $x2=array(1,-1,1,1);
    6. $x3=array(-1,1,-1,-1);
    7.  
    8. $y=array($x1, $x2, $x3);
    9. $z=0;
    10. $res1=array();
    11. $res2=array();
    12. $res3=array();
    13. $current_arr=array($res1, $res2, $res3);
    14. $res=array();
    15.  
    16.  
    17. while($z < 3) {
    18. for($i=0; $i < count($y[$z]); $i++)
    19. {
    20. for($j=0; $j < count($y[$z]); $j++){
    21. print  $y[$z][$j]*$y[$z][$i];
    22. if($z==0)
    23. $res1[]=$y[$z][$j]*$y[$z][$i];
    24. if($z==1)
    25. $res2[]=$y[$z][$j]*$y[$z][$i];
    26. if($z==2)
    27. $res3[]=$y[$z][$j]*$y[$z][$i];
    28. }
    29. print "\n";
    30. }
    31. $z++;
    32. }
    33. print_r($res1);
    34. print_r($res2);
    35. print_r($res3);
    36.  
    37. for($i=0; $i < count($res1); $i++){
    38. $res[]=$res1[$i]+$res2[$i]+$res3[$i];
    39. }
    40. print_r($res);
    41. //Искомый вектор
    42. $vec=array(1,-1,1,1);
    43. $ii=0;
    44. $rr=0;
    45.  
    46. for($i=0; $i < 16; $i++)
    47. {
    48.  
    49. $matr=$res[$i]*$vec[$ii];
    50. $rr+=$matr;
    51. $ii++;
    52. $matr=0;
    53.  
    54. if ($ii==4) {
    55. if($rr < 0)
    56. $rr=-1;
    57. else
    58. $rr=1;
    59. print $rr;
    60. $rr=0;
    61. $ii=0;
    62. }
    63. }
    64. print "\n";
    65. ?>
    66.  
     
  10. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    784
    Application,

    Браузерная версия дипсик.

    Код (Text):
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <style>
    7. body { background:#000; margin:0; display:flex; justify-content:center; align-items:center; height:100vh; overflow:hidden; }
    8. pre { color:#0f0; font-family:'Courier New',monospace; font-size:10px; line-height:1.1; text-shadow:0 0 10px #0f0; white-space:pre; }
    9. </style>
    10. </head>
    11. <body>
    12. <pre id="d"></pre>
    13. <script>
    14. // Адаптивный размер
    15. const W = 60;  // Уменьшил ширину
    16. const H = 30;  // Увеличил высоту
    17. const d = document.getElementById('d');
    18.  
    19. // Вершины куба (чуть больше для перспективы)
    20. const v = [
    21.     [-1.5,-1.5,-1.5], [1.5,-1.5,-1.5], [1.5,1.5,-1.5], [-1.5,1.5,-1.5],
    22.     [-1.5,-1.5,1.5], [1.5,-1.5,1.5], [1.5,1.5,1.5], [-1.5,1.5,1.5]
    23. ];
    24.  
    25. const e = [[0,1],[1,2],[2,3],[3,0],[4,5],[5,6],[6,7],[7,4],[0,4],[1,5],[2,6],[3,7]];
    26.  
    27. function rot(p,a,b,c){
    28.     let x=p[0],y=p[1],z=p[2],t,C=Math.cos,S=Math.sin;
    29.     t=y*C(a)-z*S(a);z=y*S(a)+z*C(a);y=t;
    30.     t=x*C(b)+z*S(b);z=-x*S(b)+z*C(b);x=t;
    31.     t=x*C(c)-y*S(c);y=x*S(c)+y*C(c);x=t;
    32.     return [x,y,z];
    33. }
    34.  
    35. function proj(p){
    36.     const dist = 5;  // Уменьшил дистанцию для лучшей перспективы
    37.     const scale = dist / (p[2] + dist);
    38.     let x = Math.round(p[0] * scale * 4 + W/2);
    39.     let y = Math.round(-p[1] * scale * 4 + H/2);
    40.     x = Math.max(0, Math.min(W-1, x));
    41.     y = Math.max(0, Math.min(H-1, y));
    42.     return [x,y];
    43. }
    44.  
    45. function line(p1,p2,s){
    46.     let [x1,y1]=proj(p1),[x2,y2]=proj(p2);
    47.     let x=x1,y=y1,dx=Math.abs(x2-x1),dy=Math.abs(y2-y1);
    48.     let sx=x1<x2?1:-1,sy=y1<y2?1:-1,err=dx-dy;
    49.     while(true){
    50.         if(x>=0&&x<W&&y>=0&&y<H) s[y*W+x] = (x===x1&&y===y1 || x===x2&&y===y2) ? 'O' : '#';
    51.         if(x===x2&&y===y2) break;
    52.         let e2=2*err;
    53.         if(e2>-dy){err-=dy;x+=sx;}
    54.         if(e2<dx){err+=dx;y+=sy;}
    55.     }
    56. }
    57.  
    58. let a=0;
    59. function draw(){
    60.     let s=Array(W*H).fill(' ');
    61.     let r=v.map(p=>rot(p,a,a*0.7,a*0.3));
    62.     e.forEach(([i,j])=>line(r[i],r[j],s));
    63.  
    64.     let out='';
    65.     for(let y=0;y<H;y++){
    66.         for(let x=0;x<W;x++) out += s[y*W+x];
    67.         out += '\n';
    68.     }
    69.     d.textContent = out;
    70.     a += 0.04;
    71.     requestAnimationFrame(draw);
    72. }
    73. draw();
    74. </script>
    75. </body>
    76. </html>
     
    Application нравится это.
  11. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    526
    Вот у Инди на JS - ещё более-менее приемлемый вариант. В цвете (правда, только в зелёном), но и то хоть что-то. Да и на 3D куб, это хоть и отдалённо, но похоже. :) То же ведь по сути консоль.
     
  12. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    784
    GRAFik,

    Это дипсика, я в JS вообще ничего не понимаю. Вопрос был как увидеть консольный куб без консоли тем же алгоритмом. По ссылке еще есть графический и попытки собрать в одну строку(не эксплойты если что).
     
  13. dcc0

    dcc0 Active Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    144
  14. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    973
    Поправил немного код с рейкастингом.

    Что делает алгоритм DDA
    • Шагает от одной ячейки сетки к другой.
    • Проверяет пересечения по осям X и Y.
    • Находит точное попадание луча в стену.
    • Работает быстро за счет целочисленной или фиксированной математики.
    Код (Pascal):
    1. unit RaycasterGame;
    2.  
    3. interface
    4.  
    5. uses
    6.   Windows, Messages, SysUtils, Math, GameInput;
    7.  
    8. const
    9.   MAP_WIDTH = 16;
    10.   MAP_HEIGHT = 16;
    11.   FOV = Pi / 3.0;
    12.   MAX_DEPTH = 16.0;
    13.   MOVE_SPEED = 0.08;
    14.   ROTATE_SPEED = 0.03;
    15.   MOUSE_SENSITIVITY = 0.005;
    16.   PITCH_LIMIT = 1.5;  // Ограничение наклона
    17.  
    18. const
    19.   worldMap: array[0..MAP_HEIGHT-1, 0..MAP_WIDTH-1] of Integer = (
    20.     (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1),
    21.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    22.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    23.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    24.     (1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,1),
    25.     (1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,1),
    26.     (1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,1),
    27.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    28.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    29.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    30.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    31.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    32.     (1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1),
    33.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    34.     (1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1),
    35.     (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
    36.   );
    37.  
    38. type
    39.   TPlayerState = record
    40.     X, Y, Angle: Double;
    41.     Pitch: Double;
    42.   end;
    43.  
    44. var
    45.   PlayerState: TPlayerState;
    46.  
    47. procedure InitGame;
    48. procedure UpdatePlayer(var State: TGameState);
    49.  
    50. function CastRay(RayAngle: Double): Double;
    51. function GetWallColor(Distance: Double): COLORREF;
    52. function CanMove(X, Y: Double): Boolean;
    53.  
    54. implementation
    55.  
    56. procedure InitGame;
    57. begin
    58.   PlayerState.X := 3.0;
    59.   PlayerState.Y := 4.0;
    60.   PlayerState.Angle := 0.0;
    61.   PlayerState.Pitch := 0.0;
    62. end;
    63.  
    64. function CanMove(X, Y: Double): Boolean;
    65. var
    66.   MapX, MapY: Integer;
    67. begin
    68.   Result := False;
    69.   MapX := Trunc(X);
    70.   MapY := Trunc(Y);
    71.  
    72.   if (MapX >= 0) and (MapX < MAP_WIDTH) and
    73.      (MapY >= 0) and (MapY < MAP_HEIGHT) then
    74.   begin
    75.     if worldMap[MapY, MapX] = 0 then
    76.       Result := True;
    77.   end;
    78. end;
    79.  
    80. function CastRay(RayAngle: Double): Double;
    81. var
    82.   Distance: Double;
    83.   Hit: Boolean;
    84.   EyeX, EyeY: Double;
    85.   TestX, TestY: Integer;
    86. begin
    87.   Distance := 0;
    88.   Hit := False;
    89.  
    90.   EyeX := Cos(RayAngle);
    91.   EyeY := Sin(RayAngle);
    92.  
    93.   while (not Hit) and (Distance < MAX_DEPTH) do
    94.   begin
    95.     Distance := Distance + 0.1;
    96.     TestX := Trunc(PlayerState.X + EyeX * Distance);
    97.     TestY := Trunc(PlayerState.Y + EyeY * Distance);
    98.  
    99.     if (TestX < 0) or (TestX >= MAP_WIDTH) or
    100.        (TestY < 0) or (TestY >= MAP_HEIGHT) then
    101.     begin
    102.       Hit := True;
    103.       Distance := MAX_DEPTH;
    104.     end
    105.     else if worldMap[TestY, TestX] = 1 then
    106.       Hit := True;
    107.   end;
    108.  
    109.   Result := Distance;
    110. end;
    111.  
    112. function GetWallColor(Distance: Double): COLORREF;
    113. var
    114.   Brightness: Double;
    115.   Gray: Integer;
    116. begin
    117.   if Distance <= 0 then Distance := 0.1;
    118.   Brightness := 1.0 - (Distance / MAX_DEPTH);
    119.   if Brightness < 0.1 then Brightness := 0.1;
    120.   Gray := Trunc(200 * Brightness);
    121.   Result := RGB(Gray, Gray, Gray);
    122. end;
    123.  
    124. procedure UpdatePlayer(var State: TGameState);
    125. var
    126.   NewX, NewY: Double;
    127.   DirX, DirY, RightX, RightY: Double;
    128.   MoveX, MoveY: Double;
    129.   DeltaX, DeltaY: Integer;
    130. begin
    131.   // ==========================================
    132.   // ПОВОРОТ МЫШЬЮ (HORIZONTAL + VERTICAL)
    133.   // ==========================================
    134.   if State.Input.MouseCaptured then
    135.   begin
    136.     DeltaX := State.Input.MouseX - State.CenterX;
    137.     DeltaY := State.Input.MouseY - State.CenterY;
    138.  
    139.     // Горизонтальный поворот
    140.     PlayerState.Angle := PlayerState.Angle + DeltaX * MOUSE_SENSITIVITY;
    141.  
    142.     // Вертикальный наклон (Pitch)
    143.     PlayerState.Pitch := PlayerState.Pitch - DeltaY * MOUSE_SENSITIVITY;
    144.  
    145.     // Ограничение наклона
    146.     if PlayerState.Pitch > PITCH_LIMIT then
    147.       PlayerState.Pitch := PITCH_LIMIT;
    148.     if PlayerState.Pitch < -PITCH_LIMIT then
    149.       PlayerState.Pitch := -PITCH_LIMIT;
    150.   end;
    151.  
    152.   // ==========================================
    153.   // ДВИЖЕНИЕ
    154.   // ==========================================
    155.   DirX := Cos(PlayerState.Angle);
    156.   DirY := Sin(PlayerState.Angle);
    157.  
    158.   RightX := -DirY;
    159.   RightY := DirX;
    160.  
    161.   MoveX := 0;
    162.   MoveY := 0;
    163.  
    164.   if State.Input.W then
    165.   begin
    166.     MoveX := MoveX + DirX * MOVE_SPEED;
    167.     MoveY := MoveY + DirY * MOVE_SPEED;
    168.   end;
    169.  
    170.   if State.Input.S then
    171.   begin
    172.     MoveX := MoveX - DirX * MOVE_SPEED;
    173.     MoveY := MoveY - DirY * MOVE_SPEED;
    174.   end;
    175.  
    176.   if State.Input.A then
    177.   begin
    178.     MoveX := MoveX - RightX * MOVE_SPEED;
    179.     MoveY := MoveY - RightY * MOVE_SPEED;
    180.   end;
    181.  
    182.   if State.Input.D then
    183.   begin
    184.     MoveX := MoveX + RightX * MOVE_SPEED;
    185.     MoveY := MoveY + RightY * MOVE_SPEED;
    186.   end;
    187.  
    188.   NewX := PlayerState.X + MoveX;
    189.   NewY := PlayerState.Y + MoveY;
    190.  
    191.   if CanMove(NewX, PlayerState.Y) then
    192.     PlayerState.X := NewX;
    193.  
    194.   if CanMove(PlayerState.X, NewY) then
    195.     PlayerState.Y := NewY;
    196.  
    197.   if PlayerState.X < 0.5 then PlayerState.X := 0.5;
    198.   if PlayerState.X > MAP_WIDTH - 0.5 then PlayerState.X := MAP_WIDTH - 0.5;
    199.   if PlayerState.Y < 0.5 then PlayerState.Y := 0.5;
    200.   if PlayerState.Y > MAP_HEIGHT - 0.5 then PlayerState.Y := MAP_HEIGHT - 0.5;
    201. end;
    202.  
    203. end.
    Код (Pascal):
    1. unit RaycasterRenderer;
    2.  
    3. interface
    4.  
    5. uses
    6.   Windows, Messages, SysUtils, Math,
    7.   GameInput, RaycasterGame;
    8.  
    9. type
    10.   TGameGraphics = record
    11.     hWnd: HWND;
    12.     Width: Integer;
    13.     Height: Integer;
    14.     hBuffer: HDC;
    15.     hBitmap: HBITMAP;
    16.     hOldBitmap: HBITMAP;
    17.   end;
    18.  
    19. var
    20.   Graphics: TGameGraphics;
    21.  
    22. procedure InitGraphics;
    23. procedure FreeGraphics;
    24. procedure RecreateBuffer;
    25. procedure RenderScene(hDC: HDC; const State: TGameState);
    26.  
    27. implementation
    28.  
    29. procedure DrawRect(hDC: HDC; X, Y, W, H: Integer; Color: COLORREF);
    30. var
    31.   Brush: HBRUSH;
    32. begin
    33.   Brush := CreateSolidBrush(Color);
    34.   SelectObject(hDC, Brush);
    35.   Rectangle(hDC, X, Y, X + W, Y + H);
    36.   DeleteObject(Brush);
    37. end;
    38.  
    39. procedure DrawText(hDC: HDC; X, Y: Integer; const Text: string; Color: COLORREF);
    40. var
    41.   OldColor: COLORREF;
    42.   OldBkMode: Integer;
    43. begin
    44.   OldColor := SetTextColor(hDC, Color);
    45.   OldBkMode := SetBkMode(hDC, TRANSPARENT);
    46.   TextOut(hDC, X, Y, PChar(Text), Length(Text));
    47.   SetBkMode(hDC, OldBkMode);
    48.   SetTextColor(hDC, OldColor);
    49. end;
    50.  
    51. procedure DrawLine(hDC: HDC; X1, Y1, X2, Y2: Integer; Color: COLORREF; Thickness: Integer);
    52. var
    53.   Pen: HPEN;
    54.   OldPen: HPEN;
    55. begin
    56.   Pen := CreatePen(PS_SOLID, Thickness, Color);
    57.   OldPen := SelectObject(hDC, Pen);
    58.   MoveToEx(hDC, X1, Y1, nil);
    59.   LineTo(hDC, X2, Y2);
    60.   SelectObject(hDC, OldPen);
    61.   DeleteObject(Pen);
    62. end;
    63.  
    64. procedure DrawCrosshair(hDC: HDC; Width, Height: Integer);
    65. var
    66.   CX, CY: Integer;
    67. begin
    68.   CX := Width div 2;
    69.   CY := Height div 2;
    70.   DrawLine(hDC, CX, CY - 9, CX, CY - 3, RGB(0, 255, 0), 2);
    71.   DrawLine(hDC, CX, CY + 3, CX, CY + 9, RGB(0, 255, 0), 2);
    72.   DrawLine(hDC, CX - 9, CY, CX - 3, CY, RGB(0, 255, 0), 2);
    73.   DrawLine(hDC, CX + 3, CY, CX + 9, CY, RGB(0, 255, 0), 2);
    74. end;
    75.  
    76. procedure DrawHUD(hDC: HDC; Width, Height: Integer; const State: TGameState);
    77. var
    78.   InfoText: string;
    79. begin
    80.   DrawCrosshair(hDC, Width, Height);
    81.  
    82.   InfoText := Format('X: %.2f  Y: %.2f', [PlayerState.X, PlayerState.Y]);
    83.   DrawText(hDC, 10, Height - 70, InfoText, RGB(0, 255, 0));
    84.  
    85.   InfoText := Format('Angle: %.2f deg', [PlayerState.Angle * 180 / Pi]);
    86.   DrawText(hDC, Width - 150, 10, InfoText, RGB(0, 255, 0));
    87.  
    88.   DrawText(hDC, 10, Height - 90, 'W/A/S/D - äâèæåíèå | ESC - âûõîä', RGB(0, 255, 0));
    89. end;
    90.  
    91.  
    92. function CastRayDDA(x, y, angle: Double; var dist, side: Double): Boolean;
    93. var
    94.   ray_dir_x, ray_dir_y: Double;
    95.   map_x, map_y: Integer;
    96.   delta_dist_x, delta_dist_y: Double;
    97.   step_x, step_y: Integer;
    98.   side_dist_x, side_dist_y: Double;
    99.   hit: Boolean;
    100. begin
    101.   ray_dir_x := Cos(angle);
    102.   ray_dir_y := Sin(angle);
    103.   map_x := Trunc(x);
    104.   map_y := Trunc(y);
    105.  
    106.   if ray_dir_x <> 0 then
    107.     delta_dist_x := Abs(1 / ray_dir_x)
    108.   else
    109.     delta_dist_x := 1e30;
    110.  
    111.   if ray_dir_y <> 0 then
    112.     delta_dist_y := Abs(1 / ray_dir_y)
    113.   else
    114.     delta_dist_y := 1e30;
    115.  
    116.   if ray_dir_x > 0 then
    117.   begin
    118.     step_x := 1;
    119.     side_dist_x := (map_x + 1 - x) * delta_dist_x;
    120.   end
    121.   else
    122.   begin
    123.     step_x := -1;
    124.     side_dist_x := (x - map_x) * delta_dist_x;
    125.   end;
    126.  
    127.   if ray_dir_y > 0 then
    128.   begin
    129.     step_y := 1;
    130.     side_dist_y := (map_y + 1 - y) * delta_dist_y;
    131.   end
    132.   else
    133.   begin
    134.     step_y := -1;
    135.     side_dist_y := (y - map_y) * delta_dist_y;
    136.   end;
    137.  
    138.   hit := False;
    139.   side := 0;
    140.  
    141.   while not hit do
    142.   begin
    143.     if side_dist_x < side_dist_y then
    144.     begin
    145.       side_dist_x := side_dist_x + delta_dist_x;
    146.       map_x := map_x + step_x;
    147.       side := 0;
    148.     end
    149.     else
    150.     begin
    151.       side_dist_y := side_dist_y + delta_dist_y;
    152.       map_y := map_y + step_y;
    153.       side := 1;
    154.     end;
    155.  
    156.     if (map_x < 0) or (map_x >= MAP_WIDTH) or (map_y < 0) or (map_y >= MAP_HEIGHT) then
    157.       Break;
    158.  
    159.     if worldMap[map_y, map_x] = 1 then
    160.       hit := True;
    161.   end;
    162.  
    163.   if hit then
    164.   begin
    165.     if side = 0 then
    166.       dist := (map_x - x + (1 - step_x) / 2) / ray_dir_x
    167.     else
    168.       dist := (map_y - y + (1 - step_y) / 2) / ray_dir_y;
    169.     Result := True;
    170.   end
    171.   else
    172.     Result := False;
    173. end;
    174.  
    175.  
    176. procedure RenderWalls(hDC: HDC; State: TGameState);
    177. var
    178.   i: Integer;
    179.   ray_angle, dist, side, height, shade: Double;
    180.   color: COLORREF;
    181.   wall_y_top, wall_y_bottom: Integer;
    182.   PlayerAngle: Double;
    183.   HalfHeight: Integer;
    184.   PitchOffset: Integer;
    185. begin
    186.   PlayerAngle := PlayerState.Angle;
    187.   HalfHeight := Graphics.Height div 2;
    188.  
    189.   PitchOffset := Round(PlayerState.Pitch * Graphics.Height / 1.5);
    190.  
    191.   for i := 0 to Graphics.Width - 1 do
    192.   begin
    193.     ray_angle := PlayerAngle - FOV / 2.0 + (i / Graphics.Width) * FOV;
    194.  
    195.     if CastRayDDA(PlayerState.X, PlayerState.Y, ray_angle, dist, side) then
    196.     begin
    197.       dist := dist * Cos(PlayerAngle - ray_angle);
    198.  
    199.       height := Min(Graphics.Height / Max(dist, 0.1), Graphics.Height * 2);
    200.  
    201.       if side = 0 then
    202.         color := RGB(180, 170, 160)
    203.       else
    204.         color := RGB(140, 130, 120);
    205.  
    206.       shade := Max(0.3, 1 - Min(dist / 15, 1) * 0.7);
    207.       color := RGB(
    208.         Trunc(GetRValue(color) * shade),
    209.         Trunc(GetGValue(color) * shade),
    210.         Trunc(GetBValue(color) * shade)
    211.       );
    212.  
    213.       wall_y_top := HalfHeight + PitchOffset - Trunc(height / 2);
    214.       wall_y_bottom := HalfHeight + PitchOffset + Trunc(height / 2);
    215.  
    216.       if wall_y_top < 0 then wall_y_top := 0;
    217.       if wall_y_bottom > Graphics.Height then wall_y_bottom := Graphics.Height;
    218.  
    219.       DrawLine(hDC, i, wall_y_top, i, wall_y_bottom, color, 1);
    220.     end;
    221.   end;
    222. end;
    223.  
    224.  
    225. procedure RenderScene(hDC: HDC; const State: TGameState);
    226. var
    227.   HalfHeight: Integer;
    228.   PitchOffset: Integer;
    229. begin
    230.   HalfHeight := Graphics.Height div 2;
    231.   PitchOffset := Round(PlayerState.Pitch * Graphics.Height / 1.5);
    232.  
    233.   DrawRect(Graphics.hBuffer, 0, 0, Graphics.Width, HalfHeight + PitchOffset, RGB(30, 40, 60));
    234.  
    235.   DrawRect(Graphics.hBuffer, 0, HalfHeight + PitchOffset, Graphics.Width,
    236.            Graphics.Height - (HalfHeight + PitchOffset), RGB(50, 50, 50));
    237.  
    238.   if HalfHeight + PitchOffset < 0 then
    239.     DrawRect(Graphics.hBuffer, 0, 0, Graphics.Width, Graphics.Height, RGB(50, 50, 50))
    240.   else if HalfHeight + PitchOffset > Graphics.Height then
    241.     DrawRect(Graphics.hBuffer, 0, 0, Graphics.Width, Graphics.Height, RGB(30, 40, 60));
    242.  
    243.   RenderWalls(Graphics.hBuffer, State);
    244.  
    245.   DrawHUD(Graphics.hBuffer, Graphics.Width, Graphics.Height, State);
    246.  
    247.   BitBlt(hDC, 0, 0, Graphics.Width, Graphics.Height, Graphics.hBuffer, 0, 0, SRCCOPY);
    248. end;
    249.  
    250. procedure InitGraphics;
    251. begin
    252.   FillChar(Graphics, SizeOf(Graphics), 0);
    253.   Graphics.Width := 800;
    254.   Graphics.Height := 600;
    255.   RecreateBuffer;
    256. end;
    257.  
    258. procedure FreeGraphics;
    259. begin
    260.   if Graphics.hBitmap <> 0 then
    261.   begin
    262.     SelectObject(Graphics.hBuffer, Graphics.hOldBitmap);
    263.     DeleteObject(Graphics.hBitmap);
    264.     Graphics.hBitmap := 0;
    265.   end;
    266.   if Graphics.hBuffer <> 0 then
    267.   begin
    268.     DeleteDC(Graphics.hBuffer);
    269.     Graphics.hBuffer := 0;
    270.   end;
    271. end;
    272.  
    273. procedure RecreateBuffer;
    274. var
    275.   hdcWin: HDC;
    276. begin
    277.   if Graphics.hBitmap <> 0 then
    278.   begin
    279.     SelectObject(Graphics.hBuffer, Graphics.hOldBitmap);
    280.     DeleteObject(Graphics.hBitmap);
    281.     Graphics.hBitmap := 0;
    282.   end;
    283.  
    284.   if Graphics.hBuffer = 0 then
    285.     Graphics.hBuffer := CreateCompatibleDC(0);
    286.  
    287.   hdcWin := GetDC(Graphics.hWnd);
    288.   Graphics.hBitmap := CreateCompatibleBitmap(hdcWin, Graphics.Width, Graphics.Height);
    289.   Graphics.hOldBitmap := SelectObject(Graphics.hBuffer, Graphics.hBitmap);
    290.   ReleaseDC(Graphics.hWnd, hdcWin);
    291. end;
    292.  
    293. end.
     

    Вложения:

    • Main.rar
      Размер файла:
      22,1 КБ
      Просмотров:
      25
  15. dcc0

    dcc0 Active Member

    Публикаций:
    2
    Регистрация:
    22 дек 2022
    Сообщения:
    144
    https://ru.wikipedia.org/wiki/Хебб,_Дональд

    https://ru.wikipedia.org/wiki/Розенблатт,_Фрэнк
    --- Сообщение объединено, 1 авг 2026 в 14:45 ---
    "
    Критика перцептронов в 70-х гг

    Однако в 1969 году бывший сокурсник Розенблатта Марвин Минский и Сеймур Пейперт опубликовали книгу «Перцептроны», в которой привели строгое математическое доказательство того, что перцептрон не способен к обучению в большинстве интересных для применения случаев. В результате принятия идей и выводов книги М. Минского и С. Паперта работы по нейронным сетям были свернуты во многих научных центрах и финансирование существенно урезано. Так как Розенблатт погиб в результате трагической случайности при кораблекрушении в Чесапикском заливе, во время плавания на яхте в день своего рождения, то он не смог аргументированно ответить на критику и исследования нейронных сетей приостановились практически на десятилетие."
    --- Сообщение объединено, 1 авг 2026 в 14:46 ---
    "
    Имя Хебба часто всплывает в дискуссиях об участии исследоватей-психологов в допросах, использующих техники сенсорной депривации из-за его исследований в этой области. В докладе на симпозиуме по сенсорной депривации в июне 1958 г. в Гарварде Хебб замечает:
    Работа, которую мы провели в Университете МакГилла, на самом деле началась с проблемы промывания мозгов. Нам не разрешили сказать это в первой публикации… Главным импульсом, конечно, была обеспокоенность «признаниями» на российских коммунистических процессах. Термин «промывание мозгов» появился немного позже, в применении к китайским технологиям. Мы не знали, какими были русские технологии, но, кажется, они приводили к некоторым специфическим изменениям отношения. Как? Одним из возможных факторов была сенсорная депривация, и мы сконцентрировались на этом вопросе.[11]
    Оригинальный текст (англ.)​
    Недавние исторические исследования показали, что работы Хебба по сенсорной депривации финансировались ЦРУ (McCoy, 2007), частично были засекречены и первоначально использовались только госагентствами США. В некоторых его исследованиях добровольцы подвергались многочасовой сенсорной депривации[источник не указан 1655 дней].
    "
    --- Сообщение объединено, 1 авг 2026 в 14:47 ---
    Всяких интересностей ...
     
  16. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    580
    А я думал, что имя Хебба в первую очередь известно в нейросайнсе из-за правила Хебба.
     
  17. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    973