143 lines
9 KiB
C
143 lines
9 KiB
C
#include "vector2.h"
|
|
|
|
extern inline void bgc_fp32_vector2_reset(BGC_FP32_Vector2* vector);
|
|
extern inline void bgc_fp64_vector2_reset(BGC_FP64_Vector2* vector);
|
|
|
|
extern inline void bgc_fp32_vector2_make(const float x1, const float x2, BGC_FP32_Vector2* destination);
|
|
extern inline void bgc_fp64_vector2_make(const double x1, const double x2, BGC_FP64_Vector2* destination);
|
|
|
|
extern inline float bgc_fp32_vector2_get_square_modulus(const BGC_FP32_Vector2* vector);
|
|
extern inline double bgc_fp64_vector2_get_square_modulus(const BGC_FP64_Vector2* vector);
|
|
|
|
extern inline float bgc_fp32_vector2_get_modulus(const BGC_FP32_Vector2* vector);
|
|
extern inline double bgc_fp64_vector2_get_modulus(const BGC_FP64_Vector2* vector);
|
|
|
|
extern inline int bgc_fp32_vector2_is_zero(const BGC_FP32_Vector2* vector);
|
|
extern inline int bgc_fp64_vector2_is_zero(const BGC_FP64_Vector2* vector);
|
|
|
|
extern inline int bgc_fp32_vector2_is_unit(const BGC_FP32_Vector2* vector);
|
|
extern inline int bgc_fp64_vector2_is_unit(const BGC_FP64_Vector2* vector);
|
|
|
|
extern inline void bgc_fp32_vector2_copy(const BGC_FP32_Vector2* source, BGC_FP32_Vector2* destination);
|
|
extern inline void bgc_fp64_vector2_copy(const BGC_FP64_Vector2* source, BGC_FP64_Vector2* destination);
|
|
|
|
extern inline void bgc_fp32_vector2_swap(BGC_FP32_Vector2* vector1, BGC_FP32_Vector2* vector2);
|
|
extern inline void bgc_fp64_vector2_swap(BGC_FP64_Vector2* vector1, BGC_FP64_Vector2* vector2);
|
|
|
|
extern inline void bgc_fp64_vector2_convert_to_fp32(const BGC_FP64_Vector2* source, BGC_FP32_Vector2* destination);
|
|
extern inline void bgc_fp32_vector2_convert_to_fp64(const BGC_FP32_Vector2* source, BGC_FP64_Vector2* destination);
|
|
|
|
extern inline void bgc_fp32_vector2_add(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2, BGC_FP32_Vector2* sum);
|
|
extern inline void bgc_fp64_vector2_add(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2, BGC_FP64_Vector2* sum);
|
|
|
|
extern inline void bgc_fp32_vector2_add_scaled(const BGC_FP32_Vector2* basic_vector, const BGC_FP32_Vector2* scalable_vector, const float scale, BGC_FP32_Vector2* sum);
|
|
extern inline void bgc_fp64_vector2_add_scaled(const BGC_FP64_Vector2* basic_vector, const BGC_FP64_Vector2* scalable_vector, const double scale, BGC_FP64_Vector2* sum);
|
|
|
|
extern inline void bgc_fp32_vector2_subtract(const BGC_FP32_Vector2* minuend, const BGC_FP32_Vector2* subtrahend, BGC_FP32_Vector2* difference);
|
|
extern inline void bgc_fp64_vector2_subtract(const BGC_FP64_Vector2* minuend, const BGC_FP64_Vector2* subtrahend, BGC_FP64_Vector2* difference);
|
|
|
|
extern inline void bgc_fp32_vector2_multiply(const BGC_FP32_Vector2* multiplicand, const float multiplier, BGC_FP32_Vector2* product);
|
|
extern inline void bgc_fp64_vector2_multiply(const BGC_FP64_Vector2* multiplicand, const double multiplier, BGC_FP64_Vector2* product);
|
|
|
|
extern inline void bgc_fp32_vector2_divide(const BGC_FP32_Vector2* dividend, const float divisor, BGC_FP32_Vector2* quotient);
|
|
extern inline void bgc_fp64_vector2_divide(const BGC_FP64_Vector2* dividend, const double divisor, BGC_FP64_Vector2* quotient);
|
|
|
|
extern inline void bgc_fp32_vector2_get_middle2(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2, BGC_FP32_Vector2* middle);
|
|
extern inline void bgc_fp64_vector2_get_middle2(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2, BGC_FP64_Vector2* middle);
|
|
|
|
extern inline void bgc_fp32_vector2_get_middle3(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2, const BGC_FP32_Vector2* vector3, BGC_FP32_Vector2* middle);
|
|
extern inline void bgc_fp64_vector2_get_middle3(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2, const BGC_FP64_Vector2* vector3, BGC_FP64_Vector2* middle);
|
|
|
|
extern inline void bgc_fp32_vector2_interpolate(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2, const float phase, BGC_FP32_Vector2* interpolation);
|
|
extern inline void bgc_fp64_vector2_interpolate(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2, const double phase, BGC_FP64_Vector2* interpolation);
|
|
|
|
extern inline void bgc_fp32_vector2_revert(BGC_FP32_Vector2* vector);
|
|
extern inline void bgc_fp64_vector2_revert(BGC_FP64_Vector2* vector);
|
|
|
|
extern inline void bgc_fp32_vector2_get_reverse(const BGC_FP32_Vector2* vector, BGC_FP32_Vector2* reverse);
|
|
extern inline void bgc_fp64_vector2_get_reverse(const BGC_FP64_Vector2* vector, BGC_FP64_Vector2* reverse);
|
|
|
|
extern inline int bgc_fp32_vector2_normalize(BGC_FP32_Vector2* vector);
|
|
extern inline int bgc_fp64_vector2_normalize(BGC_FP64_Vector2* vector);
|
|
|
|
extern inline int bgc_fp32_vector2_get_normalized(const BGC_FP32_Vector2* vector, BGC_FP32_Vector2* normalized);
|
|
extern inline int bgc_fp64_vector2_get_normalized(const BGC_FP64_Vector2* vector, BGC_FP64_Vector2* normalized);
|
|
|
|
extern inline float bgc_fp32_vector2_get_dot_product(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2);
|
|
extern inline double bgc_fp64_vector2_get_dot_product(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2);
|
|
|
|
extern inline float bgc_fp32_vector2_get_cross_product(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2);
|
|
extern inline double bgc_fp64_vector2_get_cross_product(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2);
|
|
|
|
extern inline float bgc_fp32_vector2_get_square_distance(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2);
|
|
extern inline double bgc_fp64_vector2_get_square_distance(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2);
|
|
|
|
extern inline float bgc_fp32_vector2_get_distance(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2);
|
|
extern inline double bgc_fp64_vector2_get_distance(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2);
|
|
|
|
extern inline int bgc_fp32_vector2_are_close_enough(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2, const float distance);
|
|
extern inline int bgc_fp64_vector2_are_close_enough(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2, const double distance);
|
|
|
|
extern inline int bgc_fp32_vector2_are_close(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2);
|
|
extern inline int bgc_fp64_vector2_are_close(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2);
|
|
|
|
extern inline int bgc_fp32_vector2_are_parallel(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2);
|
|
extern inline int bgc_fp64_vector2_are_parallel(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2);
|
|
|
|
extern inline int bgc_fp32_vector2_are_orthogonal(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2);
|
|
extern inline int bgc_fp64_vector2_are_orthogonal(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2);
|
|
|
|
extern inline int bgc_fp32_vector2_get_attitude(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2);
|
|
extern inline int bgc_fp64_vector2_get_attitude(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2);
|
|
|
|
// =================== Angle ==================== //
|
|
|
|
float bgc_fp32_vector2_get_angle(const BGC_FP32_Vector2* vector1, const BGC_FP32_Vector2* vector2, const int angle_unit)
|
|
{
|
|
const float square_modulus1 = bgc_fp32_vector2_get_square_modulus(vector1);
|
|
|
|
// square_modulus1 != square_modulus1 is check for NaN value at square_modulus1
|
|
if (square_modulus1 <= BGC_FP32_SQUARE_EPSYLON || square_modulus1 != square_modulus1) {
|
|
return 0.0f;
|
|
}
|
|
|
|
const float square_modulus2 = bgc_fp32_vector2_get_square_modulus(vector2);
|
|
|
|
// square_modulus2 != square_modulus2 is check for NaN value at square_modulus2
|
|
if (square_modulus2 <= BGC_FP32_SQUARE_EPSYLON || square_modulus2 != square_modulus2) {
|
|
return 0.0f;
|
|
}
|
|
|
|
const float multiplier = sqrtf(1.0f / (square_modulus1 * square_modulus2));
|
|
|
|
const float x = bgc_fp32_vector2_get_dot_product(vector1, vector2);
|
|
|
|
const float y = fabsf(bgc_fp32_vector2_get_cross_product(vector1, vector2));
|
|
|
|
return bgc_fp32_radians_to_units(atan2f(y * multiplier, x * multiplier), angle_unit);
|
|
}
|
|
|
|
double bgc_fp64_vector2_get_angle(const BGC_FP64_Vector2* vector1, const BGC_FP64_Vector2* vector2, const int angle_unit)
|
|
{
|
|
const double square_modulus1 = bgc_fp64_vector2_get_square_modulus(vector1);
|
|
|
|
// square_modulus1 != square_modulus1 is check for NaN value at square_modulus1
|
|
if (square_modulus1 <= BGC_FP64_SQUARE_EPSYLON || square_modulus1 != square_modulus1) {
|
|
return 0.0;
|
|
}
|
|
|
|
const double square_modulus2 = bgc_fp64_vector2_get_square_modulus(vector2);
|
|
|
|
// square_modulus2 != square_modulus2 is check for NaN value at square_modulus2
|
|
if (square_modulus2 <= BGC_FP64_SQUARE_EPSYLON || square_modulus2 != square_modulus2) {
|
|
return 0.0;
|
|
}
|
|
|
|
const double multiplier = sqrt(1.0 / (square_modulus1 * square_modulus2));
|
|
|
|
const double x = bgc_fp64_vector2_get_dot_product(vector1, vector2);
|
|
|
|
const double y = bgc_fp64_vector2_get_cross_product(vector1, vector2);
|
|
|
|
return bgc_fp64_radians_to_units(atan2(y * multiplier, x * multiplier), angle_unit);
|
|
}
|