/
Zamar_Terrier
/
TigorEngine
Обзор
Документация
Войти
/
Zamar_Terrier
/
TigorEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
includes/Tools/intersections2D.h
186 строк
12 KB
Zamar_Terrier
Офигенное обновление движка
31 июл 2026, 21:03
Верифицирован
31 июл 2026, 21:03
1682686
Код
Авторство
О чём код?
/** * @file intersections2D.h * @brief Обнаружение столкновений и тесты пересечений в 2D пространстве * @details Предоставляет функции для обнаружения пересечений между различными 2D формами, * включая круги, квадраты, треугольники и общие формы. Использует алгоритм GJK для пересечения * выпуклых форм общего вида. */ #ifndef INTERSECTIONS2D_H #define INTERSECTIONS2D_H #include "Variabels/engine_includes.h" #include "Variabels/std_intersect.h" #define MAX_CONTACT_POINTS 2048 #ifdef __cplusplus extern "C" { #endif /** * @brief Структура облака точек в 2D для обнаружения столкновений * @details Хранит массив точек (до 2048) и центральную точку для использования * в алгоритмах обнаружения столкновений. */ typedef struct { vec2 points[MAX_CONTACT_POINTS]; ///< Массив 2D точек vec2 center; ///< Центральная точка облака uint32_t num_points; ///< Количество действительных точек в массиве } Point2D; /** * @brief Манифольд 2D столкновений для хранения результатов столкновений * @details Хранит информацию о столкновении, включая точки столкновения и глубины проникновения. */ typedef struct { Point2D collisions; ///< Точки столкновения float depths[32]; ///< Глубины проникновения для до 32 точек столкновения } Manfloid2D; /** * @brief Тестирует пересечение двух 2D форм с использованием алгоритма GJK * * Алгоритм GJK (Gilbert-Johnson-Keerthi) эффективно определяет, пересекаются ли * две выпуклые формы, используя метод простогокса. * * @param gjk Указатель на объект GJK, содержащий состояние алгоритма * @param obj1 Указатель на первое облако точек * @param obj2 Указатель на второе облако точек * @return true если формы пересекаются, false в противном случае */ bool IntersectGJK2D(GJKObject *gjk, Point2D *obj1, Point2D *obj2); /** * @brief Тестирует пересечение двух отрезков линий в 2D пространстве * * Определяет, пересекаются ли два отрезка линий, и вычисляет параметр * пересечения и координаты точки пересечения. * * @param a Первая точка первого отрезка линии * @param b Вторая точка первого отрезка линии * @param c Первая точка второго отрезка линии * @param d Вторая точка второго отрезка линии * @param t Указатель для сохранения параметрического значения точки пересечения на первой линии * @param p Указатель для сохранения координат точки пересечения * @return 1 если линии пересекаются, 0 если параллельны или совпадают, -1 если нет пересечения */ int IntersectLineToLine(vec2 a, vec2 b, vec2 c, vec2 d, float *t, vec2 *p); /** * @brief Тестирует пересечение круга и треугольника * * Определяет, пересекаются ли круг и треугольник, и вычисляет ближайшую точку * на треугольнике к центру круга, расстояние и глубину проникновения. * * @param sPos Центральная позиция круга * @param r Радиус круга * @param p0 Первая вершина треугольника * @param p1 Вторая вершина треугольника * @param p2 Третья вершина треугольника * @param resPos Указатель для сохранения ближайшей точки на треугольнике к центру круга * @param dist Указатель для сохранения расстояния от центра круга до ближайшей точки * @param depth Указатель для сохранения глубины проникновения (отрицательное значение если нет столкновения) * @param dir Указатель для сохранения направления нормали столкновения * @return 1 если столкновение обнаружено, 0 в противном случае */ int IntersectionCircleTriangle(vec2 sPos, float r, vec2 p0, vec2 p1, vec2 p2, vec2 *resPos, float *dist, float *depth, vec2 *dir); /** * @brief Тестирует пересечение двух кругов * * Определяет, пересекаются ли два круга, и вычисляет расстояние между центрами * и глубину проникновения. * * @param o1 Указатель на структуру параметров первого круга * @param o2 Указатель на структуру параметров второго круга * @param dist Указатель для сохранения расстояния между центрами кругов * @param depth Указатель для сохранения глубины проникновения (отрицательное значение если нет столкновения) * @param dir Указатель для сохранения направления нормали столкновения * @return 1 если столкновение обнаружено, 0 в противном случае */ int IntersectionCircleCircle(InterCircleParam *o1, InterCircleParam *o2, float *dist, float *depth, vec2 *dir); /** * @brief Тестирует пересечение круга и квадрата * * Определяет, пересекаются ли круг и квадрат, и вычисляет расстояние между * формами и глубину проникновения. * * @param sph Указатель на структуру параметров круга * @param box Указатель на структуру параметров квадрата * @param dist Указатель для сохранения расстояния между формами * @param depth Указатель для сохранения глубины проникновения (отрицательное значение если нет столкновения) * @param dir Указатель для сохранения направления нормали столкновения * @return 1 если столкновение обнаружено, 0 в противном случае */ int IntersectionCircleSquare(InterCircleParam *sph, InterSquareParam *box, float *dist, float *depth, vec2 *dir); /** * @brief Тестирует пересечение двух осево-выровненных квадратов (AABB) * * Определяет, пересекаются ли два осево-выровненных квадрата, и вычисляет * расстояние между ними и глубину проникновения. * * @param box1 Указатель на структуру параметров первого квадрата * @param box2 Указатель на структуру параметров второго квадрата * @param dist Указатель для сохранения расстояния между квадратами * @param depth Указатель для сохранения глубины проникновения (отрицательное значение если нет столкновения) * @param dir Указатель для сохранения направления нормали столкновения * @return 1 если столкновение обнаружено, 0 в противном случае */ int IntersectionSquareSquare(InterSquareParam *box1, InterSquareParam *box2, float *dist, float *depth, vec2 *dir); /** * @brief Тестирует пересечение двух ориентированных ограничивающих блоков (OBB) * * Определяет, пересекаются ли два ориентированных ограничивающих блока, * и возвращает структуру манифольда с информацией о столкновении. * * @param sq1 Указатель на первый OOB структуру (специфичную для реализации) * @param sq2 Указатель на вторую OOB структуру (специфичную ��ля реализации) * @return Структура Manfloid2D, содержащая информацию о столкновении * @details Возвращает точки столкновения и глубины для пересечения */ Manfloid2D IntersectionSquareOOBSquareOOB(void *sq1, void *sq2); /** * @brief Тестирует пересечение треугольника и квадрата * * Определяет, пересекаются ли треугольник и квадрат. * * @param triangle Структура параметров треугольника * @param box Указатель на структуру параметров квадрата * @return 1 если столкновение обнаружено, 0 в противном случае */ int IntersectionTriangleSquare(InterTriangleParam triangle, InterSquareParam *box); /** * @brief Тестирует пересечение общей формы и квадрата * * Определяет, пересекаются ли форма общего вида и квадрат. * * @param obj1 Указатель на первую форму (специфичный тип для реализации) * @param square Указатель на структуру параметров квадрата * @return 1 если столкновение обнаружено, 0 в противном случае */ int IntersectionSphapeSquare(void *obj1, InterSquareParam *square); /** * @brief Тестирует пересечение двух общих форм * * Определяет, пересекаются ли две формы общего вида. * * @param obj1 Указатель на первую форму (специфичный тип для реализации) * @param obj2 Указатель на вторую форму (специфичный тип для реализации) * @return 1 если столкновение обнаружено, 0 в противном случае */ int IntersectionShapeShape(void *obj1, void *obj2); Point2D GetVertices2D(float rot, vec2 pos, vec2 size, vec3 color); #ifdef __cplusplus } #endif #endif // INTERSECTIONS2D_H