// // Copyright (C) 2020 OpenSim Ltd. // // SPDX-License-Identifier: LGPL-3.0-or-later // #ifndef _COORD_H #define _COORD_H /** * @brief Structure for storing 3D coordinates. * * Some comparison and basic arithmetic operators are implemented. * * @ingroup utils */ typedef struct { double x; double y; double z; } COORD; extern const COORD COORD_NIL; extern const COORD COORD_ZERO; extern const COORD COORD_ONE; extern const COORD COORD_X_AXIS; extern const COORD COORD_Y_AXIS; extern const COORD COORD_Z_AXIS; /** @brief Subtracts two coordinate vectors. */ COORD Coord_Sub(COORD a, COORD b); /** @brief Adds two coordinate vectors. */ COORD Coord_Add(COORD a, COORD b); /** @brief Multiplies a coordinate vector by a real number. */ void Coord_ScalarMult(COORD *a, double t); /** @brief Multiplies a coordinate vector by a real number. */ COORD Coord_GetScalarMult(COORD a, double t); /** @brief Divides a coordinate vector by a real number. */ void Coord_ScalarDiv(COORD *a, double t); /** @brief Divides a coordinate vector by a real number. */ COORD Coord_GetScalarDiv(COORD a, double t); /** @brief Dot product. */ double Coord_Dot(COORD a, COORD b); /** @brief Cross product. */ COORD Coord_Cross(COORD a, COORD b); /** @brief Multiplies two coordinate vector in elementwise. */ COORD Coord_ElementwiseMult(COORD a, COORD b); /** @brief Divides two coordinate vector in elementwise. */ COORD Coord_ElementwiseDiv(COORD a, COORD b); /** @brief Calculate a coordinate vector length^2 (omits calling square root). */ double Coord_SquareLength(COORD a); /** @brief Calculate a coordinate vector length. */ double Coord_Length(COORD a); /** @brief Calculate two coordinates' distance. */ double Coord_Distance(COORD a, COORD b); /** @brief Normalize coordinate vector. */ void Coord_Normalize(COORD *a); /** @brief Normalize coordinate vector. */ COORD Coord_GetNormalized(COORD a); /** @brief Returns the angle between the two vectors. */ double Coord_Angle(COORD a, COORD b); #endif