vector operations added

This commit is contained in:
Mario Hüttel 2018-07-28 10:37:00 +02:00
parent f04418376c
commit 01367af99c
2 changed files with 95 additions and 0 deletions

View File

@ -24,3 +24,88 @@
*/ */
#include "vector-operations.h" #include "vector-operations.h"
#include <math.h>
#include <stdlib.h>
double vector_2d_scalar_multipy(struct vector_2d *a, struct vector_2d *b)
{
if (a && b)
return (a->x * b->x) + (a->y * b->y);
else
return 0.0;
}
void vector_2d_normaize(struct vector_2d *vec)
{
double len;
if (!vec)
return;
len = sqrt(pow(vec->x,2)+pow(vec->y,2));
vec->x = vec->x/len;
vec->y = vec->y/len;
}
void vector_2d_rotate(struct vector_2d *vec, double angle)
{
double sin_val, cos_val;
struct vector_2d temp;
sin_val = sin(angle);
cos_val = cos(angle);
vecor_2d_copy(&temp, vec);
/* Apply rotation matrix */
vec->x = (cos_val * temp.x) - (sin_val * temp.y);
vec->y = (sin_val * temp.x) + (cos_val * temp.y);
}
struct vector_2d *vecor_2d_copy(struct vector_2d *opt_res, struct vector_2d *vec)
{
struct vector_2d *res;
if (!vec)
return NULL;
if (opt_res) {
opt_res->x = vec->x;
opt_res->y = vec->y;
return opt_res;
} else {
res = vector_2d_alloc();
if (res) {
res->x = vec->x;
res->y = vec->y;
}
return res;
}
}
struct vector_2d *vector_2d_alloc(void)
{
return (struct vector_2d *)malloc(sizeof(struct vector_2d));
}
void vector_2d_free(struct vector_2d *vec)
{
if (vec) {
free(vec);
}
}
void vector_2d_scale(struct vector_2d *vec, double scale)
{
if (!vec)
return;
vec->x *= scale;
vec->y *= scale;
}
double vector_2d_abs(struct vector_2d *vec)
{
double len = 0.0;
if (vec) {
len = sqrt(pow(vec->x,2)+pow(vec->y,2));
}
return len;
}

View File

@ -31,4 +31,14 @@ struct vector_2d {
double y; double y;
}; };
double vector_2d_scalar_multipy(struct vector_2d *a, struct vector_2d *b);
void vector_2d_normalize(struct vector_2d *vec);
void vecor_2d_rotate(struct vector_2d *vec, double angle);
struct vector_2d *vecor_2d_copy(struct vector_2d *opt_res, struct vector_2d *vec);
struct vector_2d *vector_2d_alloc(void);
void vector_2d_free(struct vector_2d *vec);
void vector_2d_scale(struct vector_2d *vec, double scale);
double vector_2d_abs(struct vector_2d *vec);
#endif /* _VECTOR_OPERATIONS_H_ */ #endif /* _VECTOR_OPERATIONS_H_ */