#include "vec3.h" #include vec3_t vec3_scale(vec3_t v, double s) { v.x *= s; v.y *= s; v.z *= s; return v; } vec3_t vec3_add(vec3_t v, vec3_t u) { v.x += u.x; v.y += u.y; v.z += u.z; return v; } vec3_t vec3_sub(vec3_t v, vec3_t u) { v.x -= u.x; v.y -= u.y; v.z -= u.z; return v; } double vec3_dot(vec3_t v, vec3_t u) { return v.x * u.x + v.y * u.y + v.z * u.z; } vec3_t vec3_cross(vec3_t v, vec3_t u) { return (vec3_t) { .x = v.y * u.z - v.z * u.y, .y = v.z * u.x - v.x * u.z, .z = v.x * u.y - v.y * u.x, }; } vec3_t vec3_hadamard(vec3_t v, vec3_t u) { return (vec3_t) { .x = v.x * u.x, .y = v.y * u.y, .z = v.z * u.z, }; } double vec3_len_squared(vec3_t v) { return v.x * v.x + v.y * v.y + v.z * v.z; } double vec3_len(vec3_t v) { return sqrt(vec3_len_squared(v)); } vec3_t vec3_unit(vec3_t v) { const double l = vec3_len(v); return l == 0 ? v : vec3_scale(v, 1.0 / l); }