| /* |
| * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230) |
| * |
| * SPDX-License-Identifier: BSD-2-Clause |
| */ |
| |
| /* A simple vector math library |
| * |
| * This file provides the macro VECTOR_2D_DEFINITION(name, T) |
| * which expands into a vector math library with vectors represented |
| * by tuples of type "T", and generated symbols (type and function |
| * names) prefixed with "name". |
| * |
| * Also provided in this file are 2 default implementations: |
| * vector_2d_long_int (long int) |
| * vector_2d_double (double) |
| * |
| * e.g. |
| * VECTOR_2D_DEFINITION(vector_2d_int, long int) |
| * would expand to |
| * |
| * typedef struct { |
| * long int x; |
| * long int y; |
| * } vector_2d_int_t; |
| * static inline void vector_2d_int_add(vector_2d_int_t *a, vector_2d_int_t *b, vector_2d_int_t *result) { |
| * result->x = a->x + b->x; |
| * result->y = a->y + b->y; |
| * } |
| * static inline void vector_2d_int_subtract(vector_2d_int_t *a, vector_2d_int_t *b, vector_2d_int_t *result) { |
| * ...etc |
| */ |
| |
| #pragma once |
| |
| #include <math.h> |
| |
| #define VECTOR_2D_DEFINITION(name, T) \ |
| typedef struct { \ |
| T x; \ |
| T y; \ |
| } name##_t; \ |
| static inline void name##_add(name##_t *a, name##_t *b, name##_t *result) {\ |
| result->x = a->x + b->x;\ |
| result->y = a->y + b->y;\ |
| }\ |
| static inline void name##_subtract(name##_t *a, name##_t *b, name##_t *result) {\ |
| result->x = a->x - b->x;\ |
| result->y = a->y - b->y;\ |
| }\ |
| static inline void name##_scalar_multiply(name##_t *a, T scalar, name##_t *result) {\ |
| result->x = a->x * scalar;\ |
| result->y = a->y * scalar;\ |
| }\ |
| static inline double name##_length(name##_t *a) {\ |
| return sqrt(a->x*a->x + a->y*a->y);\ |
| }\ |
| static inline double name##_angle(name##_t *a) {\ |
| return atan2(a->y, a->x);\ |
| }\ |
| static inline void name##_from_cartesian(T x, T y, name##_t *result) {\ |
| result->x = x;\ |
| result->y = y;\ |
| }\ |
| static inline void name##_from_polar(double length, double radians, name##_t *result) {\ |
| result->x = length * cos(radians);\ |
| result->y = length * sin(radians);\ |
| } |
| |
| /* Default implementations for long int and double */ |
| VECTOR_2D_DEFINITION(vector_2d_long_int, long int) |
| VECTOR_2D_DEFINITION(vector_2d_double, double) |