ray-tracer

default description
git clone _git@git.tontus.eu/ray-tracer.git
Log | Files | Refs

vec3.c (1906B)


      1 
      2 #include "../include/vec3.h"
      3 #include <math.h>
      4 #include <stdio.h>
      5 
      6 /* function implementations */
      7 double
      8 vec3_getx(vec3 vec)
      9 {
     10 	return vec.x;
     11 }
     12 
     13 double
     14 vec3_gety(vec3 vec)
     15 {
     16 	return vec.y;
     17 }
     18 
     19 double
     20 vec3_getz(vec3 vec)
     21 {
     22 	return vec.z;
     23 }
     24 
     25 /* needs testing */
     26 void
     27 vec3_set(vec3 *v, double x, double y, double z)
     28 {
     29 	v->x = x;
     30 	v->z = y;
     31 	v->z = z;
     32 }
     33 
     34 vec3
     35 vec3_neg(vec3 v)
     36 {
     37 	vec3 vec;
     38 
     39 	vec.x = -v.x;
     40 	vec.y = -v.y;
     41 	vec.z = -v.z;
     42 
     43 	return vec;
     44 }
     45 
     46 vec3
     47 vec3_acc_add(vec3 v1, vec3 v2)
     48 {
     49 	v1.x += v2.x;
     50 	v1.y += v2.y;
     51 	v1.z += v2.z;
     52 
     53 	return v1;
     54 }
     55 
     56 vec3
     57 vec3_acc_mul(vec3 v, double t)
     58 {
     59 	v.x *= t;
     60 	v.y *= t;
     61 	v.z *= t;
     62 
     63 	return v;
     64 }
     65 
     66 vec3
     67 vec3_acc_div(vec3 v, double t)
     68 {
     69 	return vec3_acc_mul(v, 1.0/t);
     70 }
     71 
     72 double
     73 vec3_length(vec3 v)
     74 {
     75 	return sqrt(vec3_length_squared(v));
     76 }
     77 
     78 double
     79 vec3_length_squared(vec3 v)
     80 {
     81 	return v.x*v.x + v.y*v.y + v.z*v.z;
     82 }
     83 
     84 void
     85 vec3_print(FILE * out, vec3 v)
     86 {
     87 	fprintf(out, "%f %f %f\n", v.x, v.y, v.z);
     88 }
     89 
     90 vec3
     91 vec3_add(vec3 u, vec3 v)
     92 {
     93 	vec3 tmp;
     94 
     95 	tmp.x = u.x + v.x;
     96 	tmp.y = u.y + v.y;
     97 	tmp.z = u.z + v.z;
     98 
     99 	return tmp; 
    100 }
    101 
    102 vec3
    103 vec3_sub(vec3 u, vec3 v)
    104 {
    105 	vec3 tmp;
    106 
    107 	tmp.x = u.x - v.x;
    108 	tmp.y = u.y - v.y;
    109 	tmp.z = u.z - v.z;
    110 
    111 	return tmp; 
    112 }
    113 
    114 vec3
    115 vec3_mul_vec(vec3 u, vec3 v)
    116 {
    117 	vec3 tmp;
    118 
    119 	tmp.x = u.x * v.x;
    120 	tmp.y = u.y * v.y;
    121 	tmp.z = u.z * v.z;
    122 
    123 	return tmp; 
    124 }
    125 
    126 vec3
    127 vec3_mul(double t, vec3 v)
    128 {
    129 	vec3 tmp;
    130 
    131 	tmp.x = t * v.x;
    132 	tmp.y = t * v.y;
    133 	tmp.z = t * v.z;
    134 
    135 	return tmp;
    136 }
    137 
    138 vec3
    139 vec3_div(vec3 v, double t)
    140 {
    141 	return vec3_mul(1.0/t, v);
    142 }
    143 
    144 double
    145 vec3_dot(vec3 u, vec3 v)
    146 {
    147 	double tmp = 0;
    148 
    149 	tmp = u.x * v.x + u.y * v.y + u.z * v.z;
    150 	return tmp;
    151 }
    152 
    153 vec3
    154 vec3_cross(vec3 u, vec3 v)
    155 {
    156 	vec3 tmp;
    157 
    158 	tmp.x = u.y * v.z - u.z * v.y; 
    159 	tmp.y = u.z * v.x - u.x * v.z; 
    160 	tmp.z = u.x * v.y - u.y * v.x; 
    161 
    162 	return tmp;
    163 }
    164 
    165 vec3
    166 vec3_unit_vector(vec3 v)
    167 {
    168 	float len = sqrtf(vec3_dot(v, v));
    169 	return vec3_mul(1.0f / len, v);
    170 	// return vec3_div(v, vec3_length(v));
    171 }