2 * math.h - basic vector calculations
4 * author: Frank Zirkelbach <frank.zirkelbach@physik.uni-augsburg.de>
16 typedef struct s_3dvec {
22 /* function prototypes */
24 static inline int v3_add(t_3dvec *sum,t_3dvec *a,t_3dvec *b) __attribute__((always_inline));
25 static inline int v3_sub(t_3dvec *sum,t_3dvec *a,t_3dvec *b) __attribute__((always_inline));
26 static inline int v3_scale(t_3dvec *result,t_3dvec *a,double s) __attribute__((always_inline));
27 static inline int v3_zero(t_3dvec *vec) __attribute__((always_inline));
28 static inline int v3_set(t_3dvec *vec,double *ptr) __attribute__((always_inline));
29 static inline int v3_copy(t_3dvec *trg,t_3dvec *src) __attribute__((always_inline));
30 static inline int v3_cmp(t_3dvec *a,t_3dvec *b) __attribute__((always_inline));
31 static inline double v3_scalar_product(t_3dvec *a,t_3dvec *b) __attribute__((always_inline));
32 static inline double v3_absolute_square(t_3dvec *a) __attribute__((always_inline));
33 static inline double v3_norm(t_3dvec *a) __attribute__((always_inline));
34 static inline int v3_per_bound(t_3dvec *a,t_3dvec *dim) __attribute__((always_inline));
36 /* function definitions */
38 static inline int v3_add(t_3dvec *sum,t_3dvec *a,t_3dvec *b) {
47 static inline int v3_sub(t_3dvec *sum,t_3dvec *a,t_3dvec *b) {
56 static inline int v3_scale(t_3dvec *result,t_3dvec *a,double s) {
65 static inline int v3_zero(t_3dvec *vec) {
74 static inline int v3_set(t_3dvec *vec,double *ptr) {
76 memcpy(vec,ptr,sizeof(t_3dvec));
81 static inline int v3_copy(t_3dvec *trg,t_3dvec *src) {
83 //memcpy(trg,src,sizeof(t_3dvec));
85 /* faster this way? */
93 static inline int v3_cmp(t_3dvec *a,t_3dvec *b) {
95 return(memcmp(a,b,sizeof(t_3dvec)));
98 static inline double v3_scalar_product(t_3dvec *a,t_3dvec *b) {
100 return(a->x*b->x+a->y*b->y+a->z*b->z);
103 static double v3_absolute_square(t_3dvec *a) {
105 return(a->x*a->x+a->y*a->y+a->z*a->z);
108 static inline double v3_norm(t_3dvec *a) {
110 return(sqrt(a->x*a->x+a->y*a->y+a->z*a->z));
113 static inline int v3_per_bound(t_3dvec *a,t_3dvec *dim) {
121 if(a->x>=x) a->x-=dim->x;
122 else if(-a->x>x) a->x+=dim->x;
123 if(a->y>=y) a->y-=dim->y;
124 else if(-a->y>y) a->y+=dim->y;
125 if(a->z>=z) a->z-=dim->z;
126 else if(-a->z>z) a->z+=dim->z;