X-Git-Url: https://www.hackdaworld.org/gitweb/?a=blobdiff_plain;f=math%2Fmath.h;fp=math%2Fmath.h;h=8ff1bec031b76a9050ebceebae26452333f705bd;hb=01be83f52829176f95a7fa6bb38a9f3518d44aa9;hp=8bbcc6cff2e95f3737b2c8344afd52bf5ff55ef0;hpb=15dd7ee084a5db24a3e1a15428cd47e8d61fda5b;p=physik%2Fposic.git diff --git a/math/math.h b/math/math.h index 8bbcc6c..8ff1bec 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,16 +21,106 @@ 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_scalar_product(t_3dvec *a,t_3dvec *b); -double v3_absolute_square(t_3dvec *a); -double v3_norm(t_3dvec *a); -int v3_per_bound(t_3dvec *a,t_3dvec *dim); +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)); + + 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