#include "util.h" #include // Funcions de cĂ lcul // Returns 1 if the lines intersect, otherwise 0. In addition, if the lines // intersect the intersection point may be stored in the floats i_x and i_y. const bool get_line_intersection(vec2 p0, vec2 p1, vec2 p2, vec2 p3, vec2 *i) { vec2 s1, s2; s1.x = p1.x - p0.x; s1.y = p1.y - p0.y; s2.x = p3.x - p2.x; s2.y = p3.y - p2.y; float s, t; s = (-s1.y * (p0.x - p2.x) + s1.x * (p0.y - p2.y)) / (-s2.x * s1.y + s1.x * s2.y); t = ( s2.x * (p0.y - p2.y) - s2.y * (p0.x - p2.x)) / (-s2.x * s1.y + s1.x * s2.y); if (s >= 0 && s <= 1 && t >= 0 && t <= 1) { // Collision detected if (i != NULL) { i->x = p0.x + (t * s1.x); i->y = p0.y + (t * s1.y); } return true; } return false; // No collision } const float distance(vec2 p1, vec2 p2) { const float xx = p2.x-p1.x; const float yy = p2.y-p1.y; return SDL_sqrtf(xx*xx+yy*yy); } const void normalize(vec2 *v) { const float length = SDL_sqrtf(v->x*v->x + v->y*v->y); if (length > 0.0f) { v->x /= length; v->y /= length; } } const float dot(vec2 v1, vec2 v2) { return v1.x*v2.x + v1.y*v2.y; } float is_enemy_in_fov(double Ax, double Ay, double orientation_deg, double Bx, double By) { // Convert orientation angle to radians double orientation_rad = orientation_deg * DEG_TO_RAD; // Compute view direction vector from angle double view_dx = SDL_cosf(orientation_rad); double view_dy = SDL_sinf(orientation_rad); // Vector from A to B double to_enemy_dx = Bx - Ax; double to_enemy_dy = By - Ay; // Normalize both vectors double len = SDL_sqrtf(to_enemy_dx * to_enemy_dx + to_enemy_dy * to_enemy_dy); if (len == 0) return 0.0; // Same position to_enemy_dx /= len; to_enemy_dy /= len; // Compute signed angle using atan2 of perp-dot and dot double dot = view_dx * to_enemy_dx + view_dy * to_enemy_dy; double cross = view_dx * to_enemy_dy - view_dy * to_enemy_dx; float angle_rad = SDL_atan2f(cross, dot); return angle_rad * RAD_TO_DEG; // Signed angle in degrees }