#ifndef VEC3_H #define VEC3_H #include #include typedef struct vec3 vec3; struct vec3 { double e[3]; }; inline double length_sq(vec3 v) { return v.e[0]*v.e[0] + v.e[1]*v.e[1] + v.e[2]*v.e[2]; } inline double length(vec3 v) { return sqrt(length_sq(v)); } inline vec3 vecscale(double t, vec3 v) { vec3 o = {t*v.e[0], t*v.e[1], t*v.e[2]}; return o; } inline vec3 vecadd(vec3 v1, vec3 v2) { vec3 o = {v1.e[0] + v2.e[0], v1.e[1] + v2.e[1], v1.e[2] + v2.e[2]}; return o; } inline vec3 vecsub(vec3 v1, vec3 v2) { vec3 o = {v1.e[0] - v2.e[0], v1.e[1] - v2.e[1], v1.e[2] - v2.e[2]}; return o; } inline vec3 vecmul(vec3 v1, vec3 v2) { vec3 o = {v1.e[0] * v2.e[0], v1.e[1] * v2.e[1], v1.e[2] * v2.e[2]}; return o; } inline double dot(vec3 u, vec3 v) { return u.e[0] * v.e[0] + u.e[1] * v.e[1] + u.e[2] * v.e[2]; } inline vec3 cross(vec3 u, vec3 v) { vec3 o = {(u.e[1] * v.e[2] - u.e[2] * v.e[1]), (u.e[2] * v.e[0] - u.e[0] * v.e[2]), (u.e[0] * v.e[1] - u.e[1] * v.e[0])}; return o; } inline vec3 unit_vector(vec3 v) { double len = length(v); return vecscale((1/len), v); } inline vec3 color(double r, double g, double b) { vec3 o = {r, g, b}; return o; } inline vec3 point3(double x, double y, double z) { vec3 o = color(x, y, z); return o; } #endif