X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=math%2Fmath.h;h=147f4c09734fd890371f9b5159270d09b9cb97ec;hb=8524173a28f2c22a539ef1b0910a1136d9cb254b;hp=53e2114641a55f761003750d74af9d37e41eb680;hpb=3ffe2a08e25fc091b6241885055450009267e2d8;p=physik%2Fposic.git diff --git a/math/math.h b/math/math.h index 53e2114..147f4c0 100644 --- a/math/math.h +++ b/math/math.h @@ -8,6 +8,9 @@ #ifndef MATH_H #define MATH_H +#include +#include + /* datatypes */ typedef struct s_3dvec { @@ -18,14 +21,111 @@ typedef struct s_3dvec { /* function prototypes */ -int v3_add(t_3dvec *sum,t_3dvec *a,t_3dvec *b); -int v3_sub(t_3dvec *sum,t_3dvec *a,t_3dvec *b); -int v3_scale(t_3dvec *result,t_3dvec *a,double s); -int v3_zero(t_3dvec *vec); -int v3_set(t_3dvec *vec,double *ptr); -int v3_copy(t_3dvec *trg,t_3dvec *src); -int v3_cmp(t_3dvec *a,t_3dvec *b); -double v3_absolute_square(t_3dvec *a); -double v3_norm(t_3dvec *a); +static inline int v3_add(t_3dvec *sum,t_3dvec *a,t_3dvec *b) __attribute__((always_inline)); +static inline int v3_sub(t_3dvec *sum,t_3dvec *a,t_3dvec *b) __attribute__((always_inline)); +static inline int v3_scale(t_3dvec *result,t_3dvec *a,double s) __attribute__((always_inline)); +static inline int v3_zero(t_3dvec *vec) __attribute__((always_inline)); +static inline int v3_set(t_3dvec *vec,double *ptr) __attribute__((always_inline)); +static inline int v3_copy(t_3dvec *trg,t_3dvec *src) __attribute__((always_inline)); +static inline int v3_cmp(t_3dvec *a,t_3dvec *b) __attribute__((always_inline)); +static inline double v3_scalar_product(t_3dvec *a,t_3dvec *b) __attribute__((always_inline)); +static inline double v3_absolute_square(t_3dvec *a) __attribute__((always_inline)); +static inline double v3_norm(t_3dvec *a) __attribute__((always_inline)); +static inline int v3_per_bound(t_3dvec *a,t_3dvec *dim) __attribute__((always_inline)); + +/* function definitions */ + +static inline int v3_add(t_3dvec *sum,t_3dvec *a,t_3dvec *b) { + + sum->x=a->x+b->x; + sum->y=a->y+b->y; + sum->z=a->z+b->z; + + return 0; +} + +static inline int v3_sub(t_3dvec *sum,t_3dvec *a,t_3dvec *b) { + + sum->x=a->x-b->x; + sum->y=a->y-b->y; + sum->z=a->z-b->z; + + return 0; +} + +static inline int v3_scale(t_3dvec *result,t_3dvec *a,double s) { + + result->x=s*a->x; + result->y=s*a->y; + result->z=s*a->z; + + return 0; +} + +static inline int v3_zero(t_3dvec *vec) { + + vec->x=.0; + vec->y=.0; + vec->z=.0; + + return 0; +} + +static inline int v3_set(t_3dvec *vec,double *ptr) { + + memcpy(vec,ptr,sizeof(t_3dvec)); + + return 0; +} + +static inline int v3_copy(t_3dvec *trg,t_3dvec *src) { + + //memcpy(trg,src,sizeof(t_3dvec)); + + /* faster this way? */ + trg->x=src->x; + trg->y=src->y; + trg->z=src->z; + + return 0; +} + +static inline int v3_cmp(t_3dvec *a,t_3dvec *b) { + + return(memcmp(a,b,sizeof(t_3dvec))); +} + +static inline double v3_scalar_product(t_3dvec *a,t_3dvec *b) { + + return(a->x*b->x+a->y*b->y+a->z*b->z); +} + +static double v3_absolute_square(t_3dvec *a) { + + return(a->x*a->x+a->y*a->y+a->z*a->z); +} + +static inline double v3_norm(t_3dvec *a) { + + return(sqrt(a->x*a->x+a->y*a->y+a->z*a->z)); +} + +static inline int v3_per_bound(t_3dvec *a,t_3dvec *dim) { + + double x,y,z; + + x=0.5*dim->x; + y=0.5*dim->y; + z=0.5*dim->z; + + if(a->x>=x) a->x-=dim->x; + else if(-a->x>x) a->x+=dim->x; + if(a->y>=y) a->y-=dim->y; + else if(-a->y>y) a->y+=dim->y; + if(a->z>=z) a->z-=dim->z; + else if(-a->z>z) a->z+=dim->z; + + return 0; +} #endif