Made it work on MacOS
This commit is contained in:
parent
d0ba29e69b
commit
5b89234762
178
Angle.cpp
178
Angle.cpp
@ -9,6 +9,92 @@
|
|||||||
const float Rad2Deg = 57.29578F;
|
const float Rad2Deg = 57.29578F;
|
||||||
const float Deg2Rad = 0.0174532924F;
|
const float Deg2Rad = 0.0174532924F;
|
||||||
|
|
||||||
|
//===== AngleSingle, AngleOf<float>
|
||||||
|
|
||||||
|
template <> AngleOf<float> Passer::LinearAlgebra::AngleOf<float>::Degrees(float degrees) {
|
||||||
|
if (isfinite(degrees)) {
|
||||||
|
while (degrees < -180)
|
||||||
|
degrees += 360;
|
||||||
|
while (degrees >= 180)
|
||||||
|
degrees -= 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AngleOf<float>(degrees);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <> AngleOf<float> AngleOf<float>::Radians(float radians) {
|
||||||
|
if (isfinite(radians)) {
|
||||||
|
while (radians <= -pi)
|
||||||
|
radians += 2 * pi;
|
||||||
|
while (radians > pi)
|
||||||
|
radians -= 2 * pi;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Binary(radians * Rad2Deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <> float AngleOf<float>::InDegrees() const { return this->value; }
|
||||||
|
|
||||||
|
template <> float AngleOf<float>::InRadians() const {
|
||||||
|
return this->value * Deg2Rad;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===== Angle16, AngleOf<signed short>
|
||||||
|
|
||||||
|
template <>
|
||||||
|
AngleOf<signed short> AngleOf<signed short>::Degrees(float degrees) {
|
||||||
|
// map float [-180..180) to integer [-32768..32767]
|
||||||
|
signed short value = (signed short)roundf(degrees / 360.0F * 65536.0F);
|
||||||
|
return Binary(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
AngleOf<signed short> AngleOf<signed short>::Radians(float radians) {
|
||||||
|
if (!isfinite(radians))
|
||||||
|
return AngleOf<signed short>::zero;
|
||||||
|
|
||||||
|
// map float [-PI..PI) to integer [-32768..32767]
|
||||||
|
signed short value = (signed short)roundf(radians / pi * 32768.0F);
|
||||||
|
return Binary(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <> float AngleOf<signed short>::InDegrees() const {
|
||||||
|
float degrees = this->value / 65536.0f * 360.0f;
|
||||||
|
return degrees;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <> float AngleOf<signed short>::InRadians() const {
|
||||||
|
float radians = this->value / 65536.0f * (2 * pi);
|
||||||
|
return radians;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===== Angle8, AngleOf<signed char>
|
||||||
|
|
||||||
|
template <> AngleOf<signed char> AngleOf<signed char>::Degrees(float degrees) {
|
||||||
|
// map float [-180..180) to integer [-128..127)
|
||||||
|
signed char value = (signed char)roundf(degrees / 360.0F * 256.0F);
|
||||||
|
return Binary(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <> AngleOf<signed char> AngleOf<signed char>::Radians(float radians) {
|
||||||
|
if (!isfinite(radians))
|
||||||
|
return AngleOf<signed char>::zero;
|
||||||
|
|
||||||
|
// map float [-pi..pi) to integer [-128..127)
|
||||||
|
signed char value = (signed char)roundf(radians / pi * 128.0f);
|
||||||
|
return Binary(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <> float AngleOf<signed char>::InDegrees() const {
|
||||||
|
float degrees = this->value / 256.0f * 360.0f;
|
||||||
|
return degrees;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <> float AngleOf<signed char>::InRadians() const {
|
||||||
|
float radians = this->value / 128.0f * pi;
|
||||||
|
return radians;
|
||||||
|
}
|
||||||
|
|
||||||
//===== Generic
|
//===== Generic
|
||||||
|
|
||||||
template <typename T> AngleOf<T>::AngleOf() : value(0) {}
|
template <typename T> AngleOf<T>::AngleOf() : value(0) {}
|
||||||
@ -268,92 +354,6 @@ AngleOf<T> AngleOf<T>::SineRuleAngle(float a, AngleOf<T> beta, float b) {
|
|||||||
return alpha;
|
return alpha;
|
||||||
}
|
}
|
||||||
|
|
||||||
template class AngleOf<float>;
|
template class Passer::LinearAlgebra::AngleOf<float>;
|
||||||
template class AngleOf<signed char>;
|
template class Passer::LinearAlgebra::AngleOf<signed char>;
|
||||||
template class AngleOf<signed short>;
|
template class Passer::LinearAlgebra::AngleOf<signed short>;
|
||||||
|
|
||||||
//===== AngleSingle, AngleOf<float>
|
|
||||||
|
|
||||||
template <> AngleOf<float> AngleOf<float>::Degrees(float degrees) {
|
|
||||||
if (isfinite(degrees)) {
|
|
||||||
while (degrees < -180)
|
|
||||||
degrees += 360;
|
|
||||||
while (degrees >= 180)
|
|
||||||
degrees -= 360;
|
|
||||||
}
|
|
||||||
|
|
||||||
return AngleOf<float>(degrees);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <> AngleOf<float> AngleOf<float>::Radians(float radians) {
|
|
||||||
if (isfinite(radians)) {
|
|
||||||
while (radians <= -pi)
|
|
||||||
radians += 2 * pi;
|
|
||||||
while (radians > pi)
|
|
||||||
radians -= 2 * pi;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Binary(radians * Rad2Deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <> float AngleOf<float>::InDegrees() const { return this->value; }
|
|
||||||
|
|
||||||
template <> float AngleOf<float>::InRadians() const {
|
|
||||||
return this->value * Deg2Rad;
|
|
||||||
}
|
|
||||||
|
|
||||||
//===== Angle16, AngleOf<signed short>
|
|
||||||
|
|
||||||
template <>
|
|
||||||
AngleOf<signed short> AngleOf<signed short>::Degrees(float degrees) {
|
|
||||||
// map float [-180..180) to integer [-32768..32767]
|
|
||||||
signed short value = (signed short)roundf(degrees / 360.0F * 65536.0F);
|
|
||||||
return Binary(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
|
||||||
AngleOf<signed short> AngleOf<signed short>::Radians(float radians) {
|
|
||||||
if (!isfinite(radians))
|
|
||||||
return AngleOf<signed short>::zero;
|
|
||||||
|
|
||||||
// map float [-PI..PI) to integer [-32768..32767]
|
|
||||||
signed short value = (signed short)roundf(radians / pi * 32768.0F);
|
|
||||||
return Binary(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <> float AngleOf<signed short>::InDegrees() const {
|
|
||||||
float degrees = this->value / 65536.0f * 360.0f;
|
|
||||||
return degrees;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <> float AngleOf<signed short>::InRadians() const {
|
|
||||||
float radians = this->value / 65536.0f * (2 * pi);
|
|
||||||
return radians;
|
|
||||||
}
|
|
||||||
|
|
||||||
//===== Angle8, AngleOf<signed char>
|
|
||||||
|
|
||||||
template <> AngleOf<signed char> AngleOf<signed char>::Degrees(float degrees) {
|
|
||||||
// map float [-180..180) to integer [-128..127)
|
|
||||||
signed char value = (signed char)roundf(degrees / 360.0F * 256.0F);
|
|
||||||
return Binary(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <> AngleOf<signed char> AngleOf<signed char>::Radians(float radians) {
|
|
||||||
if (!isfinite(radians))
|
|
||||||
return AngleOf<signed char>::zero;
|
|
||||||
|
|
||||||
// map float [-pi..pi) to integer [-128..127)
|
|
||||||
signed char value = (signed char)roundf(radians / pi * 128.0f);
|
|
||||||
return Binary(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <> float AngleOf<signed char>::InDegrees() const {
|
|
||||||
float degrees = this->value / 256.0f * 360.0f;
|
|
||||||
return degrees;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <> float AngleOf<signed char>::InRadians() const {
|
|
||||||
float radians = this->value / 128.0f * pi;
|
|
||||||
return radians;
|
|
||||||
}
|
|
@ -7,14 +7,14 @@ if(ESP_PLATFORM)
|
|||||||
else()
|
else()
|
||||||
project(LinearAlgebra)
|
project(LinearAlgebra)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 11) # Enable c++11 standard
|
set(CMAKE_CXX_STANDARD 17) # Enable c++11 standard
|
||||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
|
|
||||||
add_compile_definitions(GTEST)
|
add_compile_definitions(GTEST)
|
||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
googletest
|
googletest
|
||||||
DOWNLOAD_EXTRACT_TIMESTAMP
|
DOWNLOAD_EXTRACT_TIMESTAMP ON
|
||||||
URL https://github.com/google/googletest/archive/refs/heads/main.zip
|
URL https://github.com/google/googletest/archive/refs/heads/main.zip
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -51,9 +51,9 @@ else()
|
|||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_compile_options(LinearAlgebraTest PRIVATE /W4 /WX)
|
target_compile_options(LinearAlgebraTest PRIVATE /W4 /WX)
|
||||||
else()
|
# else()
|
||||||
target_compile_options(LinearAlgebraTest PRIVATE -Wall -Wextra -Wpedantic -Werror)
|
# target_compile_options(LinearAlgebraTest PRIVATE -Wall -Wextra -Wpedantic -Werror)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
include(GoogleTest)
|
include(GoogleTest)
|
||||||
|
@ -99,5 +99,5 @@ template <typename T> void DirectionOf<T>::Normalize() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template class DirectionOf<float>;
|
template class Passer::LinearAlgebra::DirectionOf<float>;
|
||||||
template class DirectionOf<signed short>;
|
template class Passer::LinearAlgebra::DirectionOf<signed short>;
|
||||||
|
@ -48,7 +48,7 @@ Vector3 MatrixOf<float>::Multiply(const MatrixOf<float> *m, Vector3 v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> Vector3 MatrixOf<T>::operator*(const Vector3 v) const {
|
template <typename T> Vector3 MatrixOf<T>::operator*(const Vector3 v) const {
|
||||||
float *vData = new float[3]{v.x, v.y, v.z};
|
float *vData = new float[3]{v.Right(), v.Up(), v.Forward()};
|
||||||
MatrixOf<float> v_m = MatrixOf<float>(3, 1, vData);
|
MatrixOf<float> v_m = MatrixOf<float>(3, 1, vData);
|
||||||
float *rData = new float[3]{};
|
float *rData = new float[3]{};
|
||||||
MatrixOf<float> r_m = MatrixOf<float>(3, 1, rData);
|
MatrixOf<float> r_m = MatrixOf<float>(3, 1, rData);
|
||||||
|
@ -161,5 +161,5 @@ PolarOf<T> PolarOf<T>::Rotate(const PolarOf &v, AngleOf<T> angle) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
template class PolarOf<float>;
|
template class Passer::LinearAlgebra::PolarOf<float>;
|
||||||
template class PolarOf<signed short>;
|
template class Passer::LinearAlgebra::PolarOf<signed short>;
|
@ -290,5 +290,5 @@ SphericalOf<T> SphericalOf<T>::RotateVertical(const SphericalOf<T> &v,
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
template class SphericalOf<float>;
|
template class Passer::LinearAlgebra::SphericalOf<float>;
|
||||||
template class SphericalOf<signed short>;
|
template class Passer::LinearAlgebra::SphericalOf<signed short>;
|
||||||
|
@ -164,5 +164,5 @@ void SwingTwistOf<T>::Normalize() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template class SwingTwistOf<float>;
|
template class Passer::LinearAlgebra::SwingTwistOf<float>;
|
||||||
template class SwingTwistOf<signed short>;
|
template class Passer::LinearAlgebra::SwingTwistOf<signed short>;
|
@ -1,5 +1,5 @@
|
|||||||
#if GTEST
|
#if GTEST
|
||||||
#include <gtest/gtest.h>
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user