С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
2 / 1 / 1
Регистрация: 31.10.2022
Сообщений: 15

Алгоритм для рейкастинга

17.08.2023, 07:55. Показов 1842. Ответов 3

Студворк — интернет-сервис помощи студентам
Я пытаюсь реализовать функцию, которая принимает луч в качестве начальной и конечной позиции и возвращает все пересечения с сеткой карты. Я написал следующий код и столкнулся с проблемой. Функция возвращает правильные пересечения только тогда, когда позиция игрока имеет целочисленное значение.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
std::vector<vec2> Render::getRayIntersections(float x1, float y1, float x2, float y2, int step) {
    std::vector<vec2> points;
 
    float dx = x2 - x1;
    float dy = y2 - y1;
 
    int steps = std::max(std::abs(dx), std::abs(dy));
 
    float xInc = static_cast<float>(dx) / steps;
    float yInc = static_cast<float>(dy) / steps;
 
    float x = static_cast<float>(x1);
    float y = static_cast<float>(y1);
 
    for (int i = 0; i <= steps / step; ++i) {
        points.emplace_back(static_cast<int>(x), static_cast<int>(y));
        x += xInc * step;
        y += yInc * step;
    }
 
    return points;
}
UPD: step — это множитель для применения этого алгоритма к 2D превью, где каждый тайл имеет размер, равный step. В данном случае каждая плитка имеет размер 16 пикселей, поэтому step = 16

Получается, мне нужно сделать смещение точек пересечения в зависимости от положения игрока в тайле.
Я попытался реализовать это путем получения позиции игрока в тайле и умножения этой позиции на косинус и синус угла между осью x и лучом, но это дало необъяснимый результат

Сделал гифку, которая иллюстрирует мою проблему:
https://i.ibb.co/BzqhCsL/ezgif-com-resize-2.gif
Здесь можно заметить, что когда игрок находится в центре сетки, то есть его позиция целочисленная, алгоритм работает. Но когда игрок находится внутри тайла, точки пересечения просто следуют за игроком без какого-либо смещения. Это и есть суть проблемы
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.08.2023, 07:55
Ответы с готовыми решениями:

Помогите алгоритм для char переделать в алгоритм для float
char* DecToBin(char x, char* str) { int i; for (i = sizeof(x)*8-1; i&gt;=0; i--) { str = (x&amp;1 == 1) ? '1' : '0'; x = x &gt;&gt;...

Разработать алгоритм полного перебора и «жадный» алгоритм для задачи коммивояжера
Разработать алгоритм полного перебора и «жадный» алгоритм для задачи коммивояжера. Найти точное и приближенное решение задачи коммивояжера,...

Построить алгоритм ДО и алгоритм ПОКА для вычислений значения функции на отрезке [a,b] с шагом h.
Построить алгоритм ДО и алгоритм ПОКА для вычислений значения функции на отрезке с шагом h. Написать программу: F=3+tgx Мой...

3
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,013
17.08.2023, 08:16
Попробуй (для начала) заменить int на float и (возможно) abs на fabs.
0
2 / 1 / 1
Регистрация: 31.10.2022
Сообщений: 15
17.08.2023, 09:16  [ТС]
gunslinger, int я использую только у переменной steps, так как это количество итераций цикла. А fabs вроде только на скорость выполнения кода влияет. Все равно попробовал, никаких изменений не увидел
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
17.08.2023, 11:10
во первых странности вида:
C++
1
2
float x1
float x = static_cast<float>(x1);
во вторых
C++
1
x += xInc * step;
это означает что расстояние вычисляется от координат игрока и к нему прибавляется по шагу сетки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.08.2023, 11:10
Помогаю со студенческими работами здесь

Составить алгоритм-вычисление квадрата суммы двух чисел и алгоритм для вычисления функции
Здравствуйте!Мне нужно все с самого начала и точно,помогите пожалуйста! 1.составить алгоритм-вычисление квадрата суммы двух чисел.

Составить алгоритм Маркова и алгоритм для машины Тьюринга
Составить алгоритм Маркова и алгоритм для машины Тьюринга Алфавит A={a,b}. Приписать справа к непустому слову P столько палочек, со...

Кто может составить алгоритм по проге? Алгоритм нужен для отчета если вам это интересно)
uses crt; var a:array of integer; b:array of integer; i,j,m,n:integer; begin ClrScr; Randomize; Write('n='); Readln(n); ...

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void lab () { int s1 = 0; int s2 =...

нужен алгоритм для подсчета общей суммы за месяц(для графика)
в общем есть сайт на java(с использованием jsf 2.0, hibernate, eclipse, springframework). в нем реализована система подсчета семейного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru