diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/CurveFitting.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/CurveFitting.cpp index 0d5ef4cc..b42aec41 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/CurveFitting.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/CurveFitting.cpp @@ -7,7 +7,6 @@ inline void OpenSpaceToolkitMathematicsPy_CurveFitting(pybind11::module& aModule // Create "curve fitting" python submodule auto curve_fitting = aModule.def_submodule("curve_fitting"); - // Add object to python "interpolators" submodules OpenSpaceToolkitMathematicsPy_CurveFitting_Interpolator(curve_fitting); } diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/CurveFitting/Interpolator.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/CurveFitting/Interpolator.cpp index a265b42e..f19d6de8 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/CurveFitting/Interpolator.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/CurveFitting/Interpolator.cpp @@ -62,7 +62,6 @@ inline void OpenSpaceToolkitMathematicsPy_CurveFitting_Interpolator(pybind11::mo // Create "interpolator" python submodule auto interpolator = aModule.def_submodule("interpolator"); - // Add object to python "interpolator" submodules OpenSpaceToolkitMathematicsPy_CurveFitting_Interpolator_BarycentricRational(interpolator); OpenSpaceToolkitMathematicsPy_CurveFitting_Interpolator_CubicSpline(interpolator); diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry.cpp index bb6757c7..a3f84331 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry.cpp @@ -9,7 +9,6 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry(pybind11::module& aModule) // Create "geometry" python submodule auto geometry = aModule.def_submodule("geometry"); - // Add object to python "geometry" submodules OpenSpaceToolkitMathematicsPy_Geometry_2D(geometry); OpenSpaceToolkitMathematicsPy_Geometry_3D(geometry); diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/2D.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/2D.cpp index 1e1b132a..c9537faa 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/2D.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/2D.cpp @@ -9,7 +9,6 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_2D(pybind11::module& aModule) // Create "d2" python submodule auto d2 = aModule.def_submodule("d2"); - // Add object to python "d2" submodules OpenSpaceToolkitMathematicsPy_Geometry_2D_Object(d2); OpenSpaceToolkitMathematicsPy_Geometry_2D_Transformation(d2); diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/2D/Object.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/2D/Object.cpp index 8d91755a..f76182b2 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/2D/Object.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/2D/Object.cpp @@ -62,7 +62,6 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_2D_Object(pybind11::module &a // Create "object" python submodule auto object = aModule.def_submodule("object"); - // Add object to python "object" submodules OpenSpaceToolkitMathematicsPy_Geometry_2D_Object_Point(object); OpenSpaceToolkitMathematicsPy_Geometry_2D_Object_PointSet(object); diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D.cpp index e10b0eaf..6707f7e2 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D.cpp @@ -9,7 +9,6 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_3D(pybind11::module& aModule) // Create "d3" python submodule auto d3 = aModule.def_submodule("d3"); - // Add object to python "d3" submodules OpenSpaceToolkitMathematicsPy_Geometry_3D_Object(d3); OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation(d3); diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Object.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Object.cpp index e4c7fb83..4f006383 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Object.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Object.cpp @@ -225,7 +225,6 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_3D_Object(pybind11::module& a // Create "object" python submodule auto object = aModule.def_submodule("object"); - // Add object to python "object" submodules OpenSpaceToolkitMathematicsPy_Geometry_3D_Object_Point(object); OpenSpaceToolkitMathematicsPy_Geometry_3D_Object_PointSet(object); diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation.cpp index 5949114e..e6e3f521 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation.cpp @@ -64,7 +64,6 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation(pybind11::m // Create "transformation" python submodule auto transformation_module = aModule.def_submodule("transformation"); - // Add object to python "transformation" submodules OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation(transformation_module); } diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation.cpp index 87eb13e0..a0586778 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation.cpp @@ -1,5 +1,6 @@ /// Apache License 2.0 +#include #include #include #include @@ -9,9 +10,9 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation(py // Create "rotation" python submodule auto rotation = aModule.def_submodule("rotation"); - // Add object to python "rotation" submodules OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation_Quaternion(rotation); OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation_RotationVector(rotation); OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation_RotationMatrix(rotation); + OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation_EulerAngle(rotation); } diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/EulerAngle.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/EulerAngle.cpp new file mode 100644 index 00000000..87b4b99c --- /dev/null +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/EulerAngle.cpp @@ -0,0 +1,90 @@ +/// Apache License 2.0 + +#include +#include +#include +#include + +inline void OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation_EulerAngle(pybind11::module& aModule) +{ + using namespace pybind11; + + using ostk::core::type::Real; + using ostk::core::type::String; + + using ostk::mathematics::object::Vector3d; + using ostk::mathematics::geometry::Angle; + using ostk::mathematics::geometry::d3::transformation::rotation::EulerAngle; + + class_ eulerAngle(aModule, "EulerAngle"); + + eulerAngle + // Define constructor + .def( + init(), + arg("phi"), + arg("theta"), + arg("psi"), + arg("axis_sequence") + ) + .def( + init(), + arg("vector"), + arg("angle_unit"), + arg("axis_sequence") + ) + + // Define methods + .def(self == self) + .def(self != self) + + .def("__str__", &(shiftToString)) + .def("__repr__", &(shiftToString)) + + .def("is_defined", &EulerAngle::isDefined) + .def("is_unitary", &EulerAngle::isUnitary) + .def("is_near", &EulerAngle::isNear, arg("euler_angle"), arg("angular_tolerance")) + + .def_property_readonly("phi", &EulerAngle::phi) + .def_property_readonly("theta", &EulerAngle::theta) + .def_property_readonly("psi", &EulerAngle::psi) + .def_property_readonly("axis_sequence", &EulerAngle::getAxisSequence) + + .def("to_vector", &EulerAngle::toVector, arg("angle_unit")) + .def( + "to_string", + +[](const EulerAngle& aEulerAngle) -> String + { + return aEulerAngle.toString(); + } + ) + .def( + "to_string", + +[](const EulerAngle& aEulerAngle, const Angle::Unit& anAngleUnit) -> String + { + return aEulerAngle.toString(anAngleUnit); + }, + arg("angle_unit") + ) + + // Define static methods + .def_static("undefined", &EulerAngle::Undefined) + .def_static("unit", &EulerAngle::Unit) + .def_static("xyz", &EulerAngle::XYZ, arg("phi"), arg("theta"), arg("psi")) + .def_static("zxy", &EulerAngle::ZXY, arg("phi"), arg("theta"), arg("psi")) + .def_static("zyx", &EulerAngle::ZYX, arg("phi"), arg("theta"), arg("psi")) + .def_static("quaternion", &EulerAngle::Quaternion, arg("quaternion"), arg("axis_sequence")) + .def_static("rotation_vector", &EulerAngle::RotationVector, arg("rotation_vector"), arg("axis_sequence")) + .def_static("rotation_matrix", &EulerAngle::RotationMatrix, arg("rotation_matrix"), arg("axis_sequence")) + + ; + + enum_(eulerAngle, "AxisSequence") + + .value("Undefined", EulerAngle::AxisSequence::Undefined) + .value("XYZ", EulerAngle::AxisSequence::XYZ) + .value("ZXY", EulerAngle::AxisSequence::ZXY) + .value("ZYX", EulerAngle::AxisSequence::ZYX) + + ; +} diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/Quaternion.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/Quaternion.cpp index a2e30804..206b3c39 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/Quaternion.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/Quaternion.cpp @@ -147,6 +147,7 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation_Qu ) .def_static("rotation_vector", &Quaternion::RotationVector, arg("rotation_vector")) .def_static("rotation_matrix", &Quaternion::RotationMatrix, arg("rotation_matrix")) + .def_static("euler_angle", &Quaternion::EulerAngle, arg("euler_angle")) .def_static("parse", &Quaternion::Parse, arg("string"), arg("format")) .def_static("shortest_rotation", &Quaternion::ShortestRotation, arg("first_vector"), arg("second_vector")) .def_static("lerp", &Quaternion::LERP, arg("first_quaternion"), arg("second_quaternion"), arg("ratio")) diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/RotationMatrix.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/RotationMatrix.cpp index 4764f4bb..fd8ed8c2 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/RotationMatrix.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/RotationMatrix.cpp @@ -75,6 +75,7 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation_Ro .def_static("columns", &RotationMatrix::Columns, arg("first_column"), arg("second_column"), arg("third_column")) .def_static("quaternion", &RotationMatrix::Quaternion, arg("quaternion")) .def_static("rotation_vector", &RotationMatrix::RotationVector, arg("rotation_vector")) + .def_static("euler_angle", &RotationMatrix::EulerAngle, arg("euler_angle")) ; } diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/RotationVector.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/RotationVector.cpp index 6c3c6038..aa4aa04b 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/RotationVector.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/3D/Transformation/Rotation/RotationVector.cpp @@ -55,6 +55,7 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_3D_Transformation_Rotation_Ro .def_static("z", &RotationVector::Z, arg("angle")) .def_static("quaternion", &RotationVector::Quaternion, arg("quaternion")) .def_static("rotation_matrix", &RotationVector::RotationMatrix, arg("rotation_matrix")) + .def_static("euler_angle", &RotationVector::EulerAngle, arg("euler_angle")) ; } diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/Angle.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/Angle.cpp index fda4e7b9..1ef6dfab 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/Angle.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Geometry/Angle.cpp @@ -82,6 +82,7 @@ inline void OpenSpaceToolkitMathematicsPy_Geometry_Angle(pybind11::module& aModu .def("is_defined", &Angle::isDefined) .def("is_zero", &Angle::isZero) + .def("is_near", &Angle::isNear, arg("angle"), arg("tolerance")) .def("get_unit", &Angle::getUnit) .def("in_unit", &Angle::in, arg("unit")) diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Object.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Object.cpp index 7e6e2dd4..c2632adc 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Object.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Object.cpp @@ -9,7 +9,6 @@ inline void OpenSpaceToolkitMathematicsPy_Object(pybind11::module& aModule) // Create "object" python submodule auto object = aModule.def_submodule("object"); - // Add object to python "object" submodules OpenSpaceToolkitMathematicsPy_Object_Interval(object); // OpenSpaceToolkitMathematicsPy_Object_Vector(object) ; diff --git a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Solver.cpp b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Solver.cpp index 0d1aa81b..853c02a1 100644 --- a/bindings/python/src/OpenSpaceToolkitMathematicsPy/Solver.cpp +++ b/bindings/python/src/OpenSpaceToolkitMathematicsPy/Solver.cpp @@ -7,7 +7,6 @@ inline void OpenSpaceToolkitMathematicsPy_Solver(pybind11::module& aModule) // Create "object" python submodule auto solver = aModule.def_submodule("solver"); - // Add object to python "interpolators" submodules OpenSpaceToolkitMathematicsPy_Solver_NumericalSolver(solver); } diff --git a/bindings/python/test/curve_fitting/interpolator/test_barycentric_rational.py b/bindings/python/test/curve_fitting/interpolator/test_barycentric_rational.py index 23fa51ac..779938bd 100644 --- a/bindings/python/test/curve_fitting/interpolator/test_barycentric_rational.py +++ b/bindings/python/test/curve_fitting/interpolator/test_barycentric_rational.py @@ -14,7 +14,7 @@ def interpolator() -> BarycentricRational: class TestBarycentricRational: - def test_constructors(self, interpolator: BarycentricRational): + def test_constructor_success(self, interpolator: BarycentricRational): assert interpolator is not None assert isinstance(interpolator, Interpolator) assert isinstance(interpolator, BarycentricRational) diff --git a/bindings/python/test/curve_fitting/interpolator/test_cubic_spline.py b/bindings/python/test/curve_fitting/interpolator/test_cubic_spline.py index 78b118bf..e8a30dde 100644 --- a/bindings/python/test/curve_fitting/interpolator/test_cubic_spline.py +++ b/bindings/python/test/curve_fitting/interpolator/test_cubic_spline.py @@ -16,7 +16,7 @@ def interpolator() -> CubicSpline: class TestCubicSpline: - def test_constructors(self, interpolator: CubicSpline): + def test_constructor_success(self, interpolator: CubicSpline): assert interpolator is not None assert isinstance(interpolator, Interpolator) assert isinstance(interpolator, CubicSpline) diff --git a/bindings/python/test/curve_fitting/interpolator/test_linear.py b/bindings/python/test/curve_fitting/interpolator/test_linear.py index 7e4082c1..addf1f1e 100644 --- a/bindings/python/test/curve_fitting/interpolator/test_linear.py +++ b/bindings/python/test/curve_fitting/interpolator/test_linear.py @@ -12,12 +12,11 @@ def interpolator() -> Linear: class TestLinear: - def test_constructors(self, interpolator: Linear): + def test_constructor_success(self, interpolator: Linear): assert interpolator is not None assert isinstance(interpolator, Interpolator) assert isinstance(interpolator, Linear) - def test_evaluate(self): interpolator = Linear( x=[0.0, 1.0, 2.0, 4.0, 5.0, 6.0], y=[0.0, 3.0, 6.0, 9.0, 17.0, 5.0] diff --git a/bindings/python/test/geometry/d3/object/test_linestring.py b/bindings/python/test/geometry/d3/object/test_linestring.py index fd7ddc73..9688fe76 100644 --- a/bindings/python/test/geometry/d3/object/test_linestring.py +++ b/bindings/python/test/geometry/d3/object/test_linestring.py @@ -41,7 +41,9 @@ def test_constructor_success(self): assert linestring.is_defined() # Construction with Array of Points using python numpy array - linestring: LineString = LineString(np.array((point_1, point_2, point_3, point_4))) + linestring: LineString = LineString( + np.array((point_1, point_2, point_3, point_4)) + ) assert linestring is not None assert isinstance(linestring, LineString) diff --git a/bindings/python/test/geometry/d3/transformation/rotation/test_euler_angle.py b/bindings/python/test/geometry/d3/transformation/rotation/test_euler_angle.py new file mode 100644 index 00000000..7953580f --- /dev/null +++ b/bindings/python/test/geometry/d3/transformation/rotation/test_euler_angle.py @@ -0,0 +1,138 @@ +# Apache License 2.0 + +import pytest + +import numpy as np + +from ostk.mathematics.geometry import Angle +from ostk.mathematics.geometry.d3.transformation.rotation import Quaternion +from ostk.mathematics.geometry.d3.transformation.rotation import RotationVector +from ostk.mathematics.geometry.d3.transformation.rotation import RotationMatrix +from ostk.mathematics.geometry.d3.transformation.rotation import EulerAngle + + +@pytest.fixture +def euler_angle() -> EulerAngle: + return EulerAngle.unit() + + +class TestEulerAngle: + def test_constructor_success(self): + EulerAngle( + phi=Angle.zero(), + theta=Angle.zero(), + psi=Angle.zero(), + axis_sequence=EulerAngle.AxisSequence.ZYX, + ) + + EulerAngle( + vector=(0.0, 0.0, 0.0), + angle_unit=Angle.Unit.Degree, + axis_sequence=EulerAngle.AxisSequence.ZYX, + ) + + def test_operators_success(self, euler_angle: EulerAngle): + assert (euler_angle == euler_angle) is True + assert (euler_angle != euler_angle) is False + + def test_str_success(self, euler_angle: EulerAngle): + assert str(euler_angle) is not None + + def test_repr_success(self, euler_angle: EulerAngle): + assert repr(euler_angle) is not None + + def test_is_defined_success(self, euler_angle: EulerAngle): + assert euler_angle.is_defined() + + def test_is_unitary_success(self, euler_angle: EulerAngle): + assert euler_angle.is_unitary() + + def test_is_near_success(self, euler_angle: EulerAngle): + assert euler_angle.is_near( + euler_angle=euler_angle, + angular_tolerance=Angle.zero(), + ) + + def test_properties_success(self, euler_angle: EulerAngle): + assert euler_angle.phi == Angle.degrees(0.0) + assert euler_angle.theta == Angle.degrees(0.0) + assert euler_angle.psi == Angle.degrees(0.0) + assert euler_angle.axis_sequence == EulerAngle.AxisSequence.ZYX + + def test_to_vector_success(self, euler_angle: EulerAngle): + assert np.array_equal( + euler_angle.to_vector(angle_unit=Angle.Unit.Degree), np.array((0.0, 0.0, 0.0)) + ) + + def test_to_string_success(self, euler_angle: EulerAngle): + assert euler_angle.to_string() == "[0, 0, 0] (ZYX)" + assert euler_angle.to_string(angle_unit=Angle.Unit.Degree) == "[0, 0, 0] (ZYX)" + + def test_undefined_success(self): + assert not EulerAngle.undefined().is_defined() + + def test_unit_success(self, euler_angle: EulerAngle): + assert EulerAngle.unit() == euler_angle + + def test_xyz_success(self): + assert EulerAngle.xyz( + phi=Angle.zero(), + theta=Angle.zero(), + psi=Angle.zero(), + ) == EulerAngle( + phi=Angle.zero(), + theta=Angle.zero(), + psi=Angle.zero(), + axis_sequence=EulerAngle.AxisSequence.XYZ, + ) + + def test_zxy_success(self): + assert EulerAngle.zxy( + phi=Angle.zero(), + theta=Angle.zero(), + psi=Angle.zero(), + ) == EulerAngle( + phi=Angle.zero(), + theta=Angle.zero(), + psi=Angle.zero(), + axis_sequence=EulerAngle.AxisSequence.ZXY, + ) + + def test_zyx_success(self): + assert EulerAngle.zyx( + phi=Angle.zero(), + theta=Angle.zero(), + psi=Angle.zero(), + ) == EulerAngle( + phi=Angle.zero(), + theta=Angle.zero(), + psi=Angle.zero(), + axis_sequence=EulerAngle.AxisSequence.ZYX, + ) + + def test_quaternion_success(self): + assert ( + EulerAngle.quaternion( + quaternion=Quaternion.unit(), + axis_sequence=EulerAngle.AxisSequence.ZYX, + ) + == EulerAngle.unit() + ) + + def test_rotation_vector_success(self): + assert ( + EulerAngle.rotation_vector( + rotation_vector=RotationVector.unit(), + axis_sequence=EulerAngle.AxisSequence.ZYX, + ) + == EulerAngle.unit() + ) + + def test_rotation_matrix_success(self): + assert ( + EulerAngle.rotation_matrix( + rotation_matrix=RotationMatrix.unit(), + axis_sequence=EulerAngle.AxisSequence.ZYX, + ) + == EulerAngle.unit() + ) diff --git a/bindings/python/test/geometry/d3/transformation/rotation/test_quaternion.py b/bindings/python/test/geometry/d3/transformation/rotation/test_quaternion.py index 501b97ac..25a60810 100644 --- a/bindings/python/test/geometry/d3/transformation/rotation/test_quaternion.py +++ b/bindings/python/test/geometry/d3/transformation/rotation/test_quaternion.py @@ -4,13 +4,11 @@ import numpy as np -from ostk.mathematics import geometry - - -Angle = geometry.Angle -Quaternion = geometry.d3.transformation.rotation.Quaternion -RotationVector = geometry.d3.transformation.rotation.RotationVector -RotationMatrix = geometry.d3.transformation.rotation.RotationMatrix +from ostk.mathematics.geometry import Angle +from ostk.mathematics.geometry.d3.transformation.rotation import Quaternion +from ostk.mathematics.geometry.d3.transformation.rotation import RotationVector +from ostk.mathematics.geometry.d3.transformation.rotation import RotationMatrix +from ostk.mathematics.geometry.d3.transformation.rotation import EulerAngle @pytest.fixture @@ -19,7 +17,7 @@ def quaternion() -> Quaternion: class TestQuaternion: - def test_constructors_success(self, quaternion: Quaternion): + def test_constructor_success(self, quaternion: Quaternion): assert Quaternion(0.0, 0.0, 0.0, 1.0, Quaternion.Format.XYZS) == quaternion assert ( Quaternion(np.array((0.0, 0.0, 0.0, 1.0)), Quaternion.Format.XYZS) @@ -160,6 +158,9 @@ def test_rotation_vector_success(self, quaternion: Quaternion): def test_rotation_matrix_success(self, quaternion: Quaternion): assert Quaternion.rotation_matrix(RotationMatrix.rz(Angle.zero())) == quaternion + def test_euler_angle_success(self, quaternion: Quaternion): + assert Quaternion.euler_angle(EulerAngle.unit()) == quaternion + def test_parse_success(self, quaternion: Quaternion): assert ( Quaternion.parse("[0.0, 0.0, 0.0, 1.0]", Quaternion.Format.XYZS) == quaternion diff --git a/bindings/python/test/geometry/d3/transformation/rotation/test_rotation_matrix.py b/bindings/python/test/geometry/d3/transformation/rotation/test_rotation_matrix.py index c7f3130f..de3506da 100644 --- a/bindings/python/test/geometry/d3/transformation/rotation/test_rotation_matrix.py +++ b/bindings/python/test/geometry/d3/transformation/rotation/test_rotation_matrix.py @@ -1,24 +1,23 @@ # Apache License 2.0 -from ostk.mathematics import geometry - - -Angle = geometry.Angle -Quaternion = geometry.d3.transformation.rotation.Quaternion -RotationMatrix = geometry.d3.transformation.rotation.RotationMatrix - - -# isDefined -# getRowAt -# getColumnAt -# toTransposed -# transpose -# Undefined -# Unit -# RX -# RY -# RZ -# Rows -# Columns -# Quaternion -# RotationVector +import pytest + +from ostk.mathematics.geometry.d3.transformation.rotation import Quaternion +from ostk.mathematics.geometry.d3.transformation.rotation import RotationMatrix +from ostk.mathematics.geometry.d3.transformation.rotation import EulerAngle + + +@pytest.fixture +def rotation_matrix() -> RotationMatrix: + return RotationMatrix.unit() + + +class TestRotationMatrix: + def test_is_defined_success(self, rotation_matrix: RotationMatrix): + assert rotation_matrix.is_defined() is True + + def test_quaternion_success(self, rotation_matrix: RotationMatrix): + assert RotationMatrix.quaternion(Quaternion.unit()) == rotation_matrix + + def test_euler_angle_success(self, rotation_matrix: RotationMatrix): + assert RotationMatrix.euler_angle(EulerAngle.unit()) == rotation_matrix diff --git a/bindings/python/test/geometry/d3/transformation/rotation/test_rotation_vector.py b/bindings/python/test/geometry/d3/transformation/rotation/test_rotation_vector.py index edd72d88..cc8772f5 100644 --- a/bindings/python/test/geometry/d3/transformation/rotation/test_rotation_vector.py +++ b/bindings/python/test/geometry/d3/transformation/rotation/test_rotation_vector.py @@ -1,34 +1,39 @@ # Apache License 2.0 -import numpy +import pytest -from ostk.mathematics import geometry +import numpy as np +from ostk.mathematics.geometry import Angle +from ostk.mathematics.geometry.d3.transformation.rotation import Quaternion +from ostk.mathematics.geometry.d3.transformation.rotation import RotationVector +from ostk.mathematics.geometry.d3.transformation.rotation import EulerAngle -Angle = geometry.Angle -Quaternion = geometry.d3.transformation.rotation.Quaternion -RotationVector = geometry.d3.transformation.rotation.RotationVector +@pytest.fixture +def rotation_vector() -> RotationVector: + return RotationVector.unit() -def test_geometry_d3_transformation_rotation_rotation_vector(): - rv: RotationVector = RotationVector( - numpy.array([[0.0], [0.0], [1.0]], dtype=float), Angle.zero() - ) - assert (rv == rv) is True - assert (rv != rv) is False +class TestRotationVector: + def test_constructor_success(self): + RotationVector( + np.array([[0.0], [0.0], [1.0]], dtype=float), + Angle.zero(), + ) - assert rv.is_defined() is True + def test_operators_success(self, rotation_vector: RotationVector): + assert (rotation_vector == rotation_vector) is True + assert (rotation_vector != rotation_vector) is False - # assert numpy.array_equal(rv.get_axis(), numpy.array([[0.0], [0.0], [1.0]], dtype=float)) - assert rv.get_angle() == Angle.zero() + def test_get_angle_success(self, rotation_vector: RotationVector): + assert rotation_vector.get_angle() == Angle.zero() - assert RotationVector.undefined().is_defined() is False - assert RotationVector.unit().is_defined() is True - assert ( - RotationVector.quaternion( - Quaternion(0.0, 0.0, 0.0, 1.0, Quaternion.Format.XYZS) - ).is_defined() - is True - ) - # assert RotationVector.RotationMatrix().is_defined() is True + def test_is_defined_success(self, rotation_vector: RotationVector): + assert rotation_vector.is_defined() is True + + def test_quaternion_success(self, rotation_vector: RotationVector): + assert RotationVector.quaternion(Quaternion.unit()) == rotation_vector + + def test_euler_angle_success(self, rotation_vector: RotationVector): + assert RotationVector.euler_angle(EulerAngle.unit()) == rotation_vector diff --git a/bindings/python/test/solver/test_numerical_solver.py b/bindings/python/test/solver/test_numerical_solver.py index 5dc1869f..982886ef 100644 --- a/bindings/python/test/solver/test_numerical_solver.py +++ b/bindings/python/test/solver/test_numerical_solver.py @@ -59,7 +59,7 @@ def numerical_solver_conditional() -> NumericalSolver: class TestNumericalSolver: - def test_constructors(self, numerical_solver: NumericalSolver): + def test_constructor_success(self, numerical_solver: NumericalSolver): assert numerical_solver is not None assert isinstance(numerical_solver, NumericalSolver) assert numerical_solver.is_defined() diff --git a/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/EulerAngle.hpp b/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/EulerAngle.hpp index 5e8ae201..f4c8d19a 100644 --- a/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/EulerAngle.hpp +++ b/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/EulerAngle.hpp @@ -3,6 +3,13 @@ #ifndef __OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle__ #define __OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle__ +#include +#include +#include + +#include +#include + namespace ostk { namespace mathematics @@ -16,7 +23,350 @@ namespace transformation namespace rotation { -} +using ostk::core::type::Integer; +using ostk::core::type::Real; +using ostk::core::type::String; + +using ostk::mathematics::geometry::Angle; +using ostk::mathematics::object::Vector3d; +using ostk::mathematics::object::Vector4d; + +class RotationMatrix; +class Quaternion; +class RotationVector; + +/// @brief Euler Angle +/// +/// Implementation from "Fundamentals of Spacecraft Attitude Determination and Control", +/// F. Landis Markley and John L. Crassidis, Springer +/// +/// @ref https://en.wikipedia.org/wiki/Euler_angles + +class EulerAngle +{ + public: + enum class AxisSequence + { + + Undefined, ///< Undefined sequence + XYZ, ///< X -> Y -> Z sequence + ZXY, ///< Z -> X -> Y sequence + ZYX ///< Z -> Y -> X sequence + + }; + + /// @brief Construct Euler Angle from angles and axis sequence + /// + /// @code + /// EulerAngle( + /// Angle::Degrees(1.0), + /// Angle::Degrees(2.0), + /// Angle::Degrees(3.0), + /// EulerAngle::AxisSequence::ZYX + /// ); + /// @endcode + /// + /// @param [in] aFirstAngle A first angle (phi) + /// @param [in] aSecondAngle A second angle (theta) + /// @param [in] aThirdAngle A third angle (psi) + /// @param [in] anAxisSequence An axis sequence + + EulerAngle( + const Angle& aFirstAngle, + const Angle& aSecondAngle, + const Angle& aThirdAngle, + const EulerAngle::AxisSequence& anAxisSequence + ); + + /// @brief Construct Euler Angle from vector of angles and axis sequence + /// + /// @code + /// EulerAngle( + /// {1.0, 0.0, 0.0}, + /// Angle::Unit::Degree, + /// EulerAngle::AxisSequence::ZYX + /// ); + /// @endcode + /// + /// @param [in] aVector A vector of angles + /// @param [in] anAngleUnit An angle unit + /// @param [in] anAxisSequence An axis sequence + + EulerAngle(const Vector3d& aVector, const Angle::Unit& anAngleUnit, const EulerAngle::AxisSequence& anAxisSequence); + + /// @brief Equal to operator + /// + /// @code + /// EulerAngle::Unit() == EulerAngle::Unit(); + /// @endcode + /// + /// @param [in] aEulerAngle A Euler Angle + /// @return True if Euler Angles are equal + + bool operator==(const EulerAngle& aEulerAngle) const; + + /// @brief Not equal to operator + /// + /// @code + /// EulerAngle::Unit() != EulerAngle::Unit(); + /// @endcode + /// + /// @param [in] aEulerAngle A Euler Angle + /// @return True if Euler Angles are not equal + + bool operator!=(const EulerAngle& aEulerAngle) const; + + /// @brief Output stream operator + /// + /// @code + /// std::cout << EulerAngle::Unit(); + /// @endcode + /// + /// @param [in] anOutputStream An output stream + /// @param [in] aEulerAngle A Euler Angle + /// @return Output stream reference + + friend std::ostream& operator<<(std::ostream& anOutputStream, const EulerAngle& aEulerAngle); + + /// @brief Check if Euler Angle is defined + /// + /// @code + /// EulerAngle::Unit().isDefined(); + /// @endcode + /// + /// @return True if Euler Angle is defined + + bool isDefined() const; + + /// @brief Check if Euler Angle is unitary + /// + /// @code + /// EulerAngle::Unit().isUnitary(); + /// @endcode + /// + /// @return True if Euler Angle is unitary + + bool isUnitary() const; + + /// @brief Check if Euler Angle is equal to another Euler Angle + /// within a given angular tolerance + /// + /// @code + /// EulerAngle::Unit().isNear( + /// EulerAngle::Unit(), + /// Angle::Degrees(1e-6) + /// ); + /// @endcode + /// + /// @param [in] aEulerAngle A Euler Angle + /// @param [in] anAngularTolerance An angular tolerance + /// @return True if equal within given angular tolerance + + bool isNear(const EulerAngle& aEulerAngle, const Angle& anAngularTolerance) const; + + /// @brief Get first angle of rotation (phi) + /// + /// @code + /// EulerAngle::Unit().phi(); + /// @endcode + /// + /// @return First angle of rotation + + Angle phi() const; + + /// @brief Get second angle of rotation (theta) + /// + /// @code + /// EulerAngle::Unit().theta(); + /// @endcode + /// + /// @return Second angle of rotation + + Angle theta() const; + + /// @brief Get third angle of rotation (psi) + /// + /// @code + /// EulerAngle::Unit().psi(); + /// @endcode + /// + /// @return Third angle of rotation + + Angle psi() const; + + /// @brief Get axis sequence + /// + /// @code + /// EulerAngle::Unit().getAxisSequence(); + /// @endcode + /// + /// @return Axis sequence (e.g, ZYX) + + AxisSequence getAxisSequence() const; + + /// @brief Return vector containing the three angles + /// + /// @code + /// EulerAngle::Unit().toVector(Angle::Unit::Degree); + /// @endcode + /// + /// @param [in] anAngleUnit An angle unit + /// @return Vector containing the three angles + + Vector3d toVector(const Angle::Unit& anAngleUnit) const; + + /// @brief Return string from of Euler Angle [phi; theta; psi] + /// + /// @code + /// EulerAngle::Unit().toString(Angle::Unit::Degree); + /// @endcode + /// + /// @param [in] (optional) anAngleUnit An angle unit + /// @return String from of Euler Angle + + String toString(const Angle::Unit& anAngleUnit = Angle::Unit::Degree) const; + + /// @brief Construct undefined Euler Angle + /// + /// @code + /// EulerAngle::Undefined(); + /// @endcode + /// + /// @return Undefined Euler Angle + + static EulerAngle Undefined(); + + /// @brief Construct unitary Euler Angle + /// + /// @code + /// EulerAngle::Unit(); + /// @endcode + /// + /// @return Unitary Euler Angle + + static EulerAngle Unit(); + + /// @brief Construct Euler Angle from angles following XYZ sequence + /// + /// @code + /// EulerAngle::XYZ( + /// Angle::Degrees(1.0), + /// Angle::Degrees(2.0), + /// Angle::Degrees(3.0) + /// ); + /// @endcode + /// + /// @param [in] aFirstAngle A first angle (phi) + /// @param [in] aSecondAngle A second angle (theta) + /// @param [in] aThirdAngle A third angle (psi) + /// @return Euler Angle + + static EulerAngle XYZ(const Angle& aFirstAngle, const Angle& aSecondAngle, const Angle& aThirdAngle); + + /// @brief Construct Euler Angle from angles following ZXY sequence + /// + /// @code + /// EulerAngle::ZXY( + /// Angle::Degrees(1.0), + /// Angle::Degrees(2.0), + /// Angle::Degrees(3.0) + /// ); + /// @endcode + /// + /// @param [in] aFirstAngle A first angle (phi) + /// @param [in] aSecondAngle A second angle (theta) + /// @param [in] aThirdAngle A third angle (psi) + /// @return Euler Angle + + static EulerAngle ZXY(const Angle& aFirstAngle, const Angle& aSecondAngle, const Angle& aThirdAngle); + + /// @brief Construct Euler Angle from angles following ZYX sequence + /// + /// @code + /// EulerAngle::ZYX( + /// Angle::Degrees(1.0), + /// Angle::Degrees(2.0), + /// Angle::Degrees(3.0) + /// ); + /// @endcode + /// + /// @param [in] aFirstAngle A first angle (phi) + /// @param [in] aSecondAngle A second angle (theta) + /// @param [in] aThirdAngle A third angle (psi) + /// @return Euler Angle + + static EulerAngle ZYX(const Angle& aFirstAngle, const Angle& aSecondAngle, const Angle& aThirdAngle); + + /// @brief Construct Euler Angle from Rotation Matrix + /// + /// @code + /// EulerAngle::RotationMatrix( + /// RotationMatrix::Unit(), + /// EulerAngle::AxisSequence::ZYX + /// ); + /// @endcode + /// + /// @param [in] aRotationMatrix A Rotation Matrix + /// @param [in] anAxisSequence An axis sequence + /// @return Euler Angle + + static EulerAngle Quaternion( + const rotation::Quaternion& aQuaternion, const EulerAngle::AxisSequence& anAxisSequence + ); + + /// @brief Construct Euler Angle from Quaternion + /// + /// @code + /// EulerAngle::Quaternion( + /// Quaternion::Unit(), + /// EulerAngle::AxisSequence::ZYX + /// ); + /// @endcode + /// + /// @param [in] aQuaternion A Quaternion + /// @param [in] anAxisSequence An axis sequence + /// @return Euler Angle + + static EulerAngle RotationVector( + const rotation::RotationVector& aRotationVector, const EulerAngle::AxisSequence& anAxisSequence + ); + + /// @brief Construct Euler Angle from Rotation Vector + /// + /// @code + /// EulerAngle::RotationVector( + /// RotationVector::Unit(), + /// EulerAngle::AxisSequence::ZYX + /// ); + /// @endcode + /// + /// @param [in] aRotationVector A Rotation Vector + /// @param [in] anAxisSequence An axis sequence + /// @return Euler Angle + + static EulerAngle RotationMatrix( + const rotation::RotationMatrix& aRotationMatrix, const EulerAngle::AxisSequence& anAxisSequence + ); + + /// @brief Construct a string representation of an axis sequence + /// + /// @code + /// EulerAngle::StringFromAxisSequence(EulerAngle::AxisSequence::ZYX); + /// @endcode + /// + /// @param [in] anAxisSequence An axis sequence + /// @return String representation of axis sequence + + static String StringFromAxisSequence(const EulerAngle::AxisSequence& anAxisSequence); + + private: + Angle phi_; + Angle theta_; + Angle psi_; + + EulerAngle::AxisSequence axisSequence_; +}; +} // namespace rotation } // namespace transformation } // namespace d3 } // namespace geometry diff --git a/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/Quaternion.hpp b/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/Quaternion.hpp index c7de9d8e..2479f6e7 100644 --- a/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/Quaternion.hpp +++ b/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/Quaternion.hpp @@ -33,6 +33,7 @@ using ostk::mathematics::geometry::Angle; class RotationVector; class RotationMatrix; +class EulerAngle; /// @brief Quaternion /// @@ -47,7 +48,7 @@ class RotationMatrix; class Quaternion { public: - /// @brief Quaternion format + /// @brief Quaternion format enum class Format { @@ -57,17 +58,17 @@ class Quaternion }; - /// @brief Constructor + /// @brief Constructor /// /// @code - /// Quaternion quaternion = { 0.0, 0.0, 0.0, 0.1, Quaternion::Format::XYZS } ; + /// Quaternion(0.0, 0.0, 0.0, 0.1, Quaternion::Format::XYZS) ; /// @endcode /// - /// @param [in] aFirstComponent A first component - /// @param [in] aSecondComponent A second component - /// @param [in] aThirdComponent A third component - /// @param [in] aFourthComponent A fourth component - /// @param [in] aFormat A quaternion format + /// @param [in] aFirstComponent A first component + /// @param [in] aSecondComponent A second component + /// @param [in] aThirdComponent A third component + /// @param [in] aFourthComponent A fourth component + /// @param [in] aFormat A Quaternion format Quaternion( const Real& aFirstComponent, @@ -77,430 +78,426 @@ class Quaternion const Quaternion::Format& aFormat ); - /// @brief Constructor + /// @brief Constructor /// /// @code - /// Quaternion quaternion = { Vector4d(0.0, 0.0, 0.0, 0.1), Quaternion::Format::XYZS } ; + /// Quaternion({0.0, 0.0, 0.0, 0.1}, Quaternion::Format::XYZS) ; /// @endcode /// - /// @param [in] aVector A 4D vector - /// @param [in] aFormat A quaternion format + /// @param [in] aVector A 4D vector + /// @param [in] aFormat A Quaternion format Quaternion(const Vector4d& aVector, const Quaternion::Format& aFormat); - /// @brief Constructor + /// @brief Constructor /// /// @code - /// Quaternion quaternion = { Vector3d(0.0, 0.0, 0.0), 1.0 } ; + /// Quaternion({0.0, 0.0, 0.0}, 1.0); /// @endcode /// - /// @param [in] aVectorPart A vector part - /// @param [in] aVectorPart A scalar part + /// @param [in] aVectorPart A vector part + /// @param [in] aVectorPart A scalar part Quaternion(const Vector3d& aVectorPart, const Real& aScalarPart); - /// @brief Equal to operator + /// @brief Equal to operator /// /// @code - /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.0) == Quaternion::XYZS(0.0, 0.0, 0.0, 1.0) ; // True + /// Quaternion::Unit() == Quaternion::Unit() /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return True if quaternions are equal + /// @param [in] aQuaternion A Quaternion + /// @return True if Quaternions are equal bool operator==(const Quaternion& aQuaternion) const; - /// @brief Not equal to operator + /// @brief Not equal to operator /// /// @code - /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.0) != Quaternion::XYZS(1.0, 0.0, 0.0, 0.0) ; // True + /// Quaternion::Unit() != Quaternion::Unit(); /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return True if quaternions are not equal + /// @param [in] aQuaternion A Quaternion + /// @return True if Quaternions are not equal bool operator!=(const Quaternion& aQuaternion) const; - /// @brief Addition operator (quaternion) + /// @brief Addition operator /// /// @code - /// Quaternion q_1 = ... ; - /// Quaternion q_2 = ... ; - /// Quaternion q_3 = q_1 + q_2 ; - /// @encode + /// Quaternion q_1 = ... ; + /// Quaternion q_2 = ... ; + /// Quaternion q_3 = q_1 + q_2 ; + /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return Quaternion + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion Quaternion operator+(const Quaternion& aQuaternion) const; - /// @brief Multiplication operator (quaternion) + /// @brief Multiplication operator (Quaternion) /// /// @code - /// Quaternion q_B_A = ... ; - /// Quaternion q_C_B = ... ; - /// Quaternion q_C_A = q_C_B * q_B_A ; - /// @encode + /// Quaternion q_B_A = ... ; + /// Quaternion q_C_B = ... ; + /// Quaternion q_C_A = q_C_B * q_B_A ; + /// @endcode /// - /// @note This operator uses cross multiplication + /// @note This operator uses cross multiplication /// - /// @param [in] aQuaternion A quaternion - /// @return Quaternion + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion Quaternion operator*(const Quaternion& aQuaternion) const; - /// @brief Multiplication operator (vector) + /// @brief Multiplication operator (vector) /// - /// Example: /// @code - /// Quaternion q_B_A = ... ; - /// Vector3d v_A = ... ; - /// Vector3d v_B = q_B_A * v_A ; + /// Quaternion q_B_A = ... ; + /// Vector3d v_A = ... ; + /// Vector3d v_B = q_B_A * v_A ; /// @endcode /// - /// @note This operator uses transformVector + /// @note This operator uses transformVector /// - /// @param [in] aVector A vector - /// @return Vector + /// @param [in] aVector A vector + /// @return Vector Vector3d operator*(const Vector3d& aVector) const; - /// @brief Multiplication operator (scalar) + /// @brief Multiplication operator (scalar) /// - /// Example: /// @code - /// Quaternion q_1 = ... ; - /// Real scalar = ... ; - /// Quaternion q_2 = q_1 * scalar ; + /// Quaternion q_1 = ... ; + /// Real scalar = ... ; + /// Quaternion q_2 = q_1 * scalar ; /// @endcode /// - /// @param [in] aScalar A scalar - /// @return Quaternion + /// @param [in] aScalar A scalar + /// @return Quaternion Quaternion operator*(const Real& aScalar) const; - /// @brief Multiplication operator (scalar) + /// @brief Multiplication operator (scalar) /// - /// Example: /// @code - /// Real scalar = ... ; - /// Quaternion q_1 = ... ; - /// Quaternion q_2 = scalar * q_1 ; + /// Real scalar = ... ; + /// Quaternion q_1 = ... ; + /// Quaternion q_2 = scalar * q_1 ; /// @endcode /// - /// @param [in] aScalar A scalar - /// @param [in] aQuaternion A quaternion - /// @return Quaternion + /// @param [in] aScalar A scalar + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion friend Quaternion operator*(const Real& aScalar, const Quaternion& aQuaternion); - /// @brief Division operator (quaternion) + /// @brief Division operator (Quaternion) /// /// @code - /// Quaternion q_A_B = ... ; - /// Quaternion q_C_B = ... ; - /// Quaternion q_C_A = q_C_B / q_A_B ; + /// Quaternion q_A_B = ... ; + /// Quaternion q_C_B = ... ; + /// Quaternion q_C_A = q_C_B / q_A_B ; /// @endcode /// - /// @note This is equivalent to multiplying with the inverse + /// @note This is equivalent to multiplying with the inverse /// - /// @param [in] aQuaternion A quaternion - /// @return Quaternion + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion Quaternion operator/(const Quaternion& aQuaternion) const; - /// @brief Power operator (quaternion) + /// @brief Power operator (Quaternion) /// /// @code - /// Quaternion q_1 = ... ; - /// Real scalar = ... ; - /// Quaternion q_2 = q_1 ^ scalar ; + /// Quaternion q_1 = ... ; + /// Real scalar = ... ; + /// Quaternion q_2 = q_1 ^ scalar ; /// @endcode /// - /// @param [in] aScalar A scalar - /// @return Quaternion + /// @param [in] aScalar A scalar + /// @return Quaternion Quaternion operator^(const Real& aScalar) const; - /// @brief Addition assignment operator (quaternion) + /// @brief Addition assignment operator (Quaternion) /// - /// @param [in] aQuaternion A quaternion - /// @return Reference to quaternion + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion reference Quaternion& operator+=(const Quaternion& aQuaternion); - /// @brief Multiplication assignment operator (quaternion) + /// @brief Multiplication assignment operator (Quaternion) /// - /// @note This operator uses cross multiplication + /// @note This operator uses cross multiplication /// - /// @param [in] aQuaternion A quaternion - /// @return Reference to quaternion + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion reference Quaternion& operator*=(const Quaternion& aQuaternion); - /// @brief Division assignment operator (quaternion) + /// @brief Division assignment operator (Quaternion) /// - /// @note This is equivalent to multiplying with the inverse + /// @note This is equivalent to multiplying with the inverse /// - /// @param [in] aQuaternion A quaternion - /// @return Reference to quaternion + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion reference Quaternion& operator/=(const Quaternion& aQuaternion); - /// @brief Output stream operator + /// @brief Output stream operator /// /// @code - /// std::cout << Quaternion::XYZS(0.0, 0.0, 0.0, 1.0) ; + /// std::cout << Quaternion::XYZS(0.0, 0.0, 0.0, 1.0); /// @endcode /// - /// @param [in] anOutputStream An output stream - /// @param [in] aQuaternion A quaternion - /// @return A reference to output stream + /// @param [in] anOutputStream An output stream + /// @param [in] aQuaternion A Quaternion + /// @return Output stream reference friend std::ostream& operator<<(std::ostream& anOutputStream, const Quaternion& aQuaternion); - /// @brief Check if quaternion is defined + /// @brief Check if Quaternion is defined /// /// @code - /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.0).isDefined() ; // True + /// Quaternion::Unit().isDefined(); /// @endcode /// - /// @return True if quaternion is defined + /// @return True if Quaternion is defined bool isDefined() const; - /// @brief Check if quaternion is unitary, i.e. its norm is equal to 1.0 + /// @brief Check if Quaternion is unitary (i.e., its norm is equal to 1.0) /// /// @code - /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.0).isUnitary() ; // True + /// Quaternion::Unit().isUnitary(); /// @endcode /// - /// @return True if quaternion is unitary + /// @return True if Quaternion is unitary bool isUnitary() const; - /// @brief Check if quaternion is near a given quaternion + /// @brief Check if Quaternion is near another Quaternion /// /// @code - /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.0).isNear(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0 + 1e-19), - /// Angle::Radians(1e-6)) ; // True + /// Quaternion::Unit().isNear( + /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.0 + 1e-19), + /// Angle::Radians(1e-6) + /// ); /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @param [in] anAngularTolerance An angular tolerance - /// @return True if quaternions are near each other + /// @param [in] aQuaternion A Quaternion + /// @param [in] anAngularTolerance An angular tolerance + /// @return True if Quaternion are near each other bool isNear(const Quaternion& aQuaternion, const Angle& anAngularTolerance) const; - /// @brief Get first component of vector part + /// @brief Get first component of vector part /// /// @code - /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).x() ; // &0.0 + /// Quaternion::Unit().x(); /// @endcode /// - /// @return First component of vector part + /// @return Real Real x() const; - /// @brief Get second component of vector part + /// @brief Get second component of vector part /// /// @code - /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).y() ; // &0.0 + /// Quaternion::Unit().y(); /// @endcode /// - /// @return Second component of vector part + /// @return Real Real y() const; - /// @brief Get third component of vector part + /// @brief Get third component of vector part /// /// @code - /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).z() ; // &0.0 + /// Quaternion::Unit().z(); /// @endcode /// - /// @return Third component of vector part + /// @return Real Real z() const; - /// @bref Get scalar part + /// @bref Get scalar part /// /// @code - /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).s() ; // &1.0 + /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).s(); /// @endcode /// - /// @return Scalar part + /// @return Real Real s() const; - /// @brief Get vector part + /// @brief Get vector part /// /// @code - /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).getVectorPart() ; // [0.0, 0.0, 0.0] + /// Quaternion::Unit().getVectorPart(); /// @endcode /// - /// @return Vector part + /// @return Vector Vector3d getVectorPart() const; - /// @brief Get scalar part + /// @brief Get scalar part /// /// @code - /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).getScalarPart() ; // 1.0 + /// Quaternion::Unit().getScalarPart(); /// @endcode /// - /// @return Scalar part + /// @return Real Real getScalarPart() const; - /// @brief Get normalized quaternion + /// @brief Calculate normalized Quaternion /// /// @code - /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.000000000000001).toNormalized() ; // [0.0, 0.0, 0.0, 1.0] - /// @encode + /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.000000000000001).toNormalized(); + /// @endcode /// - /// @return Normalized quaternion + /// @return Quaternion Quaternion toNormalized() const; - /// @brief Get conjugate quaternion + /// @brief Calculate conjugate of Quaternion /// /// @code - /// Quaternion::XYZS(0.0, 0.0, 0.70710678118, 0.70710678118).toConjugate() ; // [0.0, 0.0, - /// -0.70710678118, 0.70710678118] - /// @encode + /// Quaternion::XYZS(0.0, 0.0, 0.70710678118, 0.70710678118).toConjugate(); + /// @endcode /// - /// @return Conjugate quaternion + /// @return Quaternion Quaternion toConjugate() const; - /// @brief Get inverse quaternion + /// @brief Calculate inverse of Quaternion /// /// @code - /// Quaternion::XYZS(0.0, 0.0, 0.70710678118, 0.70710678118).toInverse() ; // [0.0, 0.0, - /// -0.70710678118, 0.70710678118] - /// @encode + /// Quaternion::XYZS(0.0, 0.0, 0.70710678118, 0.70710678118).toInverse(); + /// @endcode /// - /// @return Inverse quaternion + /// @return Quaternion Quaternion toInverse() const; - /// @brief Get exponential + /// @brief Calculate exponential of Quaternion /// /// @code - /// Quaternion q_1 = ... - /// Quaternion q_2 = q_1.exp() ; + /// Quaternion q_1 = ... + /// Quaternion q_2 = q_1.exp(); /// @endcode /// - /// @return Exponential + /// @return Quaternion Quaternion exp() const; - /// @brief Get logarithm + /// @brief Calculate logarithm of Quaternion /// /// @code - /// Quaternion q_1 = ... - /// Quaternion q_2 = q_1.log() ; + /// Quaternion q_1 = ... + /// Quaternion q_2 = q_1.log(); /// @endcode /// - /// @return Logarithm + /// @return Quaternion Quaternion log() const; - /// @brief Get power + /// @brief Calculate power of Quaternion /// /// @code - /// Quaternion q_1 = ... - /// Real scalar = ... - /// Quaternion q_2 = q_1 ^ scalar ; + /// Quaternion q_1 = ... + /// Real scalar = ... + /// Quaternion q_2 = q_1 ^ scalar ; /// @endcode /// - /// @param [in] aValue A power value - /// @return Power + /// @param [in] aValue A power value + /// @return Quaternion Quaternion pow(const Real& aValue) const; - /// @brief Get quaternion norm + /// @brief Calculate norm of Quaternion /// /// @code - /// Quaternion::XYZS(0.0, 0.0, -0.70710678118, 0.70710678118).norm() ; // 1.0 - /// @encode + /// Quaternion::XYZS(0.0, 0.0, -0.70710678118, 0.70710678118).norm(); + /// @endcode /// - /// @return Quaternion norm + /// @return Quaternion norm Real norm() const; - /// @brief Multiply quaternion using cross multiplication + /// @brief Multiply Quaternion using cross multiplication /// /// @code - /// Quaternion q_1 = ... - /// Quaternion q_2 = ... - /// Quaternion q_3 = q_1.crossMultiply(q_2) + /// Quaternion q_1 = ... + /// Quaternion q_2 = ... + /// Quaternion q_3 = q_1.crossMultiply(q_2) /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return Quaternion + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion Quaternion crossMultiply(const Quaternion& aQuaternion) const; - /// @brief Multiply quaternion using dot multiplication + /// @brief Multiply Quaternion using dot multiplication /// /// @code - /// Quaternion q_1 = ... - /// Quaternion q_2 = ... - /// Quaternion q_3 = q_1.dotMultiply(q_2) + /// Quaternion q_1 = ... + /// Quaternion q_2 = ... + /// Quaternion q_3 = q_1.dotMultiply(q_2) /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return Quaternion + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion Quaternion dotMultiply(const Quaternion& aQuaternion) const; - /// @brief Calculate quaternion dot product + /// @brief Calculate Quaternion dot product /// /// @code - /// Quaternion q_1 = ... - /// Quaternion q_2 = ... - /// Real q_3 = q_1.dotProduct(q_2) + /// Quaternion q_1 = ... + /// Quaternion q_2 = ... + /// Real q_3 = q_1.dotProduct(q_2) /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return Quaternion + /// @param [in] aQuaternion A Quaternion + /// @return Quaternion Real dotProduct(const Quaternion& aQuaternion) const; - /// @brief Rotate vector using quaternion + /// @brief Rotate vector using Quaternion /// /// @code - /// Quaternion q = ... - /// Vector3d v_1 = ... - /// Vector3d v_2 = q.rotateVector(v_1) + /// Vector3d v_1 = ... + /// Vector3d v_2 = q.rotateVector(v_1); /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return Vector + /// @param [in] aQuaternion A Quaternion + /// @return Vector Vector3d rotateVector(const Vector3d& aVector) const; - /// @brief Convert quaternion to its vector representation + /// @brief Convert Quaternion to its vector representation /// /// @code - /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).toVector() ; // [0.0, 0.0, 0.0, 1.0] + /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).toVector(); /// @endcode /// - /// @param [in] (optional) aFormat A quaternion format - /// @return Vector representation + /// @param [in] (optional) aFormat A Quaternion format + /// @return Vector representation Vector4d toVector(const Quaternion::Format& aFormat = Quaternion::Format::XYZS) const; - /// @brief Convert quaternion to its string representation + /// @brief Convert Quaternion to its string representation /// /// @code - /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).toString() ; // "[0.0, 0.0, 0.0, 1.0]" + /// Quaternion::XYSZ(0.0, 0.0, 0.0, 1.0).toString(); /// @endcode /// - /// @param [in] (optional) aPrecision A quaternion precision - /// @param [in] (optional) aFormat A quaternion format - /// @return String representation + /// @param [in] (optional) aPrecision A Quaternion precision + /// @param [in] (optional) aFormat A Quaternion format + /// @return String representation String toString(const Quaternion::Format& aFormat) const; @@ -508,96 +505,88 @@ class Quaternion const Integer& aPrecision = Integer::Undefined(), const Quaternion::Format& aFormat = Quaternion::Format::XYZS ) const; - /// @brief Normalize quaternion + /// @brief Normalize Quaternion /// /// @code - /// Quaternion quaternion = Quaternion::XYZS(0.0, 0.0, 0.0, 1.000000000000001) ; // [0.0, 0.0, - /// 0.0, 1.000000000000001] quaternion.normalize() ; // [0.0, 0.0, 0.0, 1.0] + /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.000000000000001).normalize(); /// @endcode /// - /// @return Reference to quaternion + /// @return Quaternion reference Quaternion& normalize(); - /// @brief Conjugate quaternion + /// @brief Conjugate Quaternion /// /// @code - /// Quaternion quaternion = Quaternion::XYZS(0.0, 0.0, 0.70710678118, 0.70710678118) ; // [0.0, - /// 0.0, 0.70710678118, 0.70710678118] quaternion.conjugate() ; // [0.0, 0.0, -0.70710678118, - /// 0.70710678118] + /// Quaternion::XYZS(0.0, 0.0, 0.70710678118, 0.70710678118).conjugate(); /// @endcode /// - /// @return Reference to quaternion + /// @return Quaternion reference Quaternion& conjugate(); - /// @brief Inverse quaternion + /// @brief Inverse Quaternion /// /// @code - /// Quaternion quaternion = Quaternion::XYZS(0.0, 0.0, 0.70710678118, 0.70710678118) ; // [0.0, - /// 0.0, 0.70710678118, 0.70710678118] quaternion.inverse() ; // [0.0, 0.0, -0.70710678118, - /// 0.70710678118] + /// Quaternion::XYZS(0.0, 0.0, 0.70710678118, 0.70710678118).inverse(); /// @endcode /// - /// @return Reference to quaternion + /// @return Quaternion reference Quaternion& inverse(); - /// @brief Rectify quaternion (enforce positive scalar part) + /// @brief Rectify Quaternion (enforce positive scalar part) /// /// @code - /// Quaternion quaternion = Quaternion::XYZS(0.0, 0.0, -0.70710678118, -0.70710678118) ; // - /// [0.0, 0.0, -0.70710678118, -0.70710678118] quaternion.rectify() ; // [0.0, 0.0, - /// 0.70710678118, 0.70710678118] + /// Quaternion::XYZS(0.0, 0.0, -0.70710678118, -0.70710678118).rectify(); /// @endcode /// - /// @return Reference to quaternion + /// @return Quaternion reference Quaternion& rectify(); - /// @brief Get angular difference with quaternion + /// @brief Compute angular difference with Quaternion /// /// @code - /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.0).angularDifferenceWith(Quaternion::XYZS(0.0, 0.0, - /// 0.0, 1.0)) ; // 0.0 [rad] + /// Quaternion::Unit().angularDifferenceWith(Quaternion::Unit()); /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return Angular difference + /// @param [in] aQuaternion A Quaternion + /// @return Angular difference Angle angularDifferenceWith(const Quaternion& aQuaternion) const; - /// @brief Constructs an undefined quaternion + /// @brief Construct undefined Quaternion /// /// @code - /// Quaternion quaternion = Quaternion::Undefined() ; // Undefined + /// Quaternion::Undefined(); /// @endcode /// - /// @return Undefined quaternion + /// @return Quaternion static Quaternion Undefined(); - /// @brief Constructs a unit quaternion + /// @brief Construct unitary Quaternion /// /// @code - /// Quaternion quaternion = Quaternion::Unit() ; // [0.0, 0.0, 0.0, 1.0] + /// Quaternion::Unit(); /// @endcode /// - /// @return Unit quaternion + /// @return Quaternion static Quaternion Unit(); - /// @brief Constructs a quaternion using the vector-scalar format + /// @brief Construct Quaternion using the vector-scalar format /// /// @code - /// Quaternion quaternion = Quaternion::XYZS(0.0, 0.0, 0.0, 1.0) ; // [0.0, 0.0, 0.0, 1.0] + /// Quaternion::XYZS(0.0, 0.0, 0.0, 1.0); /// @endcode /// - /// @param [in] aFirstComponent A first component - /// @param [in] aSecondComponent A second component - /// @param [in] aThirdComponent A third component - /// @param [in] aFourthComponent A fourth component - /// @return Quaternion + /// @param [in] aFirstComponent A first component + /// @param [in] aSecondComponent A second component + /// @param [in] aThirdComponent A third component + /// @param [in] aFourthComponent A fourth component + /// @return Quaternion static Quaternion XYZS( const Real& aFirstComponent, @@ -606,101 +595,109 @@ class Quaternion const Real& aFourthComponent ); - /// @brief Constructs a quaternion from a rotation vector + /// @brief Construct Quaternion from rotation vector /// /// @code - /// Quaternion quaternion = Quaternion::RotationVector(RotationVector(Vector3d(0.0, 0.0, 1.0), - /// Angle::Degrees(0.0))) ; // [0.0, 0.0, 0.0, 1.0] + /// Quaternion::RotationVector(RotationVector::Unit()); /// @endcode /// - /// @param [in] aRotationVector A rotation vector - /// @return Quaternion + /// @param [in] aRotationVector A Rotation Vector + /// @return Quaternion static Quaternion RotationVector(const rotation::RotationVector& aRotationVector); - /// @brief Constructs a rquaternion from a rotation matrix + /// @brief Construct Quaternion from Rotation Matrix /// /// @code - /// Quaternion quaternion = Quaternion::RotationMatrix(RotationMatrix::Unit()) ; + /// Quaternion::RotationMatrix(RotationMatrix::Unit()); /// @endcode /// - /// @param [in] aRotationMatrix A rotation matrix - /// @return Quaternion + /// @param [in] aRotationMatrix A Rotation Matrix + /// @return Quaternion static Quaternion RotationMatrix(const rotation::RotationMatrix& aRotationMatrix); - /// @brief Constructs a quaternion from a string + /// @brief Construct Quaternion from Euler Angle + /// + /// @code + /// Quaternion::EulerAngle(EulerAngle::Unit()); + /// @endcode + /// + /// @param [in] EulerAngle A Euler Angle + /// @return Quaternion + + static Quaternion EulerAngle(const rotation::EulerAngle& aEulerAngle); + + /// @brief Construct Quaternion from string /// /// @code - /// Quaternion quaternion = Quaternion::Parse("[0.0, 0.0, 0.0, 1.0]") ; // [0.0, 0.0, 0.0, 1.0] + /// Quaternion::Parse("[0.0, 0.0, 0.0, 1.0]"); /// @endcode /// - /// @param [in] aString A string - /// @param [in] (optional) aFormat A quaternion format - /// @return Quaternion + /// @param [in] aString A string + /// @param [in] (optional) aFormat A Quaternion format + /// @return Quaternion static Quaternion Parse(const String& aString, const Quaternion::Format& aFormat = Quaternion::Format::XYZS); - /// @brief Constructs a quaternion describing the shortest rotation between two vectors + /// @brief Construct Quaternion describing the shortest rotation between two vectors /// /// @code - /// Vector3d v_1 = ... - /// Vector3d v_2 = ... - /// Quaternion q = Quaternion.ShortestRotation(v_1, v_2) + /// Quaternion::ShortestRotation({1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}); /// @endcode /// - /// @param [in] aFirstVector A first vector - /// @param [in] aSecondVector A second vector - /// @return Quaternion + /// @param [in] aFirstVector A first vector + /// @param [in] aSecondVector A second vector + /// @return Quaternion static Quaternion ShortestRotation(const Vector3d& aFirstVector, const Vector3d& aSecondVector); - /// @brief Linear interpolator method + /// @brief Linear interpolator method /// /// @code - /// Quaternion q_1 = ... - /// Quaternion q_2 = ... - /// Quaternion q = Quaternion.LERP(q_1, q_2, 0.5) + /// Quaternion q_1 = ... + /// Quaternion q_2 = ... + /// Quaternion::LERP(q_1, q_2, 0.5); /// @endcode /// - /// @param [in] aFirstQuaternion A first quaternion - /// @param [in] aSecondQuaternion A second quaternion - /// @param [in] aRatio An interpolator ratio - /// @return Quaternion + /// @param [in] aFirstQuaternion A first Quaternion + /// @param [in] aSecondQuaternion A second Quaternion + /// @param [in] aRatio An interpolator ratio + /// @return Quaternion static Quaternion LERP(const Quaternion& aFirstQuaternion, const Quaternion& aSecondQuaternion, const Real& aRatio); - /// @brief Normalized linear interpolator method + /// @brief Normalized linear interpolator method /// /// @code - /// Quaternion q_1 = ... - /// Quaternion q_2 = ... - /// Quaternion q = Quaternion.NLERP(q_1, q_2, 0.5) + /// Quaternion q_1 = ... + /// Quaternion q_2 = ... + /// Quaternion::NLERP(q_1, q_2, 0.5); /// @endcode /// - /// @param [in] aFirstQuaternion A first quaternion - /// @param [in] aSecondQuaternion A second quaternion - /// @param [in] aRatio An interpolator ratio - /// @return Quaternion + /// @param [in] aFirstQuaternion A first Quaternion + /// @param [in] aSecondQuaternion A second Quaternion + /// @param [in] aRatio An interpolator ratio + /// @return Quaternion static Quaternion NLERP( const Quaternion& aFirstQuaternion, const Quaternion& aSecondQuaternion, const Real& aRatio ); - /// Spherical linear interpolator method + /// Spherical linear interpolator method /// - /// @ref https://en.wikipedia.org/wiki/Slerp + /// @ref https://en.wikipedia.org/wiki/Slerp /// /// @code - /// Quaternion q_1 = ... - /// Quaternion q_2 = ... - /// Quaternion q = Quaternion.SLERP(q_1, q_2, 0.5) + /// Quaternion q_1 = ... + /// Quaternion q_2 = ... + /// Quaternion::SLERP(q_1, q_2, 0.5); /// @endcode /// - /// @param [in] aFirstQuaternion A first quaternion - /// @param [in] aSecondQuaternion A second quaternion - /// @param [in] aRatio An interpolator ratio - /// @return Quaternion + /// @param [in] aFirstQuaternion A first Quaternion + /// @param [in] aSecondQuaternion A second Quaternion + /// @param [in] aRatio An interpolator ratio + /// @return Quaternion static Quaternion SLERP( const Quaternion& aFirstQuaternion, const Quaternion& aSecondQuaternion, const Real& aRatio diff --git a/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationMatrix.hpp b/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationMatrix.hpp index 84976476..8fd4ef72 100644 --- a/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationMatrix.hpp +++ b/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationMatrix.hpp @@ -31,6 +31,7 @@ using ostk::mathematics::geometry::Angle; class Quaternion; class RotationVector; +class EulerAngle; /// @brief Rotation matrix /// @@ -39,23 +40,23 @@ class RotationVector; class RotationMatrix { public: - /// @brief Constructor + /// @brief Constructor /// - /// @param [in] aMatrix A matrix + /// @param [in] aMatrix A matrix RotationMatrix(const Matrix3d& aMatrix); - /// @brief Constructor + /// @brief Constructor /// - /// @param [in] aFirstCoefficient A first coefficient - /// @param [in] aSecondCoefficient A second coefficient - /// @param [in] aThirdCoefficient A third coefficient - /// @param [in] aFourthCoefficient A fourth coefficient - /// @param [in] aFifthCoefficient A fifth coefficient - /// @param [in] aSixthCoefficient A sixth coefficient - /// @param [in] aSeventhCoefficient A seventh coefficient - /// @param [in] aEighthCoefficient A eighth coefficient - /// @param [in] aNinthCoefficient A ninth coefficient + /// @param [in] aFirstCoefficient A first coefficient + /// @param [in] aSecondCoefficient A second coefficient + /// @param [in] aThirdCoefficient A third coefficient + /// @param [in] aFourthCoefficient A fourth coefficient + /// @param [in] aFifthCoefficient A fifth coefficient + /// @param [in] aSixthCoefficient A sixth coefficient + /// @param [in] aSeventhCoefficient A seventh coefficient + /// @param [in] aEighthCoefficient A eighth coefficient + /// @param [in] aNinthCoefficient A ninth coefficient RotationMatrix( const Real& aFirstCoefficient, @@ -69,253 +70,262 @@ class RotationMatrix const Real& aNinthCoefficient ); - /// @brief Equal to operator + /// @brief Equal to operator /// /// @code - /// RotationMatrix(...) == RotationMatrix(...) ; + /// RotationMatrix(...) == RotationMatrix(...); /// @endcode /// - /// @param [in] aRotationMatrix A rotation matrix - /// @return True if rotation matrices are equal + /// @param [in] aRotationMatrix A Rotation Matrix + /// @return True if rotation matrices are equal bool operator==(const RotationMatrix& aRotationMatrix) const; - /// @brief Not equal to operator + /// @brief Not equal to operator /// /// @code - /// RotationMatrix(...) != RotationMatrix(...) ; + /// RotationMatrix(...) != RotationMatrix(...); /// @endcode /// - /// @param [in] aRotationMatrix A rotation matrix - /// @return True if rotation matrices are not equal + /// @param [in] aRotationMatrix A Rotation Matrix + /// @return True if rotation matrices are not equal bool operator!=(const RotationMatrix& aRotationMatrix) const; - /// @brief Matrix multiplication operator + /// @brief Matrix multiplication operator /// /// @code - /// RotationMatrix rotationMatrix_A_B = ... ; - /// RotationMatrix rotationMatrix_B_C = ... ; - /// RotationMatrix rotationMatrix_A_C = rotationMatrix_A_B * rotationMatrix_B_C ; + /// RotationMatrix rotationMatrix_A_B = ... ; + /// RotationMatrix rotationMatrix_B_C = ... ; + /// RotationMatrix rotationMatrix_A_C = rotationMatrix_A_B * rotationMatrix_B_C ; /// @endcode /// - /// @param [in] aRotationMatrix A rotation matrix - /// @return Rotation matrix + /// @param [in] aRotationMatrix A Rotation Matrix + /// @return Rotation matrix RotationMatrix operator*(const RotationMatrix& aRotationMatrix) const; - /// @brief Vector multiplication operator + /// @brief Vector multiplication operator /// /// @code - /// RotationMatrix rotationMatrix_B_A = ... ; - /// Vector3d vector_A = ... ; - /// Vector3d vector_B = rotationMatrix_B_A * vector_A ; + /// RotationMatrix rotationMatrix_B_A = ... ; + /// Vector3d vector_A = ... ; + /// Vector3d vector_B = rotationMatrix_B_A * vector_A ; /// @endcode /// - /// @param [in] aVector A vector - /// @return Vector + /// @param [in] aVector A vector + /// @return Vector Vector3d operator*(const Vector3d& aVector) const; - /// @brief Index function operator + /// @brief Index function operator /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::Unit() ; - /// double value_00 = rotationMatrix(0, 0) ; // 1.0 + /// RotationMatrix::Unit(); + /// double value_00 = rotationMatrix(0, 0); // 1.0 /// @endcode /// - /// @param [in] aRowIndex A row index - /// @param [in] aColumnIndex A column index - /// @return Value at index + /// @param [in] aRowIndex A row index + /// @param [in] aColumnIndex A column index + /// @return Value at index double operator()(const Index& aRowIndex, const Index& aColumnIndex) const; - /// @brief Index function operator + /// @brief Index function operator /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::Unit() ; - /// rotationMatrix(0, 0) = 0.0 ; + /// RotationMatrix::Unit(); + /// rotationMatrix(0, 0) = 0.0 ; /// @endcode /// - /// @param [in] aRowIndex A row index - /// @param [in] aColumnIndex A column index - /// @return Reference of value at index + /// @param [in] aRowIndex A row index + /// @param [in] aColumnIndex A column index + /// @return Reference of value at index double& operator()(const Index& aRowIndex, const Index& aColumnIndex); - /// @brief Output stream operator + /// @brief Output stream operator /// /// @code - /// std::cout << RotationMatrix(...) ; + /// std::cout << RotationMatrix(...); /// @endcode /// - /// @param [in] anOutputStream An output stream - /// @param [in] aRotationMatrix A rotation matrix - /// @return A reference to output stream + /// @param [in] anOutputStream An output stream + /// @param [in] aRotationMatrix A Rotation Matrix + /// @return Output stream reference friend std::ostream& operator<<(std::ostream& anOutputStream, const RotationMatrix& aRotationMatrix); - /// @brief Check if rotation matrix is defined + /// @brief Check if Rotation Matrix is defined /// /// @code - /// RotationMatrix(Vector3d(0.0, 0.0, 1.0), Angle::Degrees(90.0)).isDefined() ; // True + /// RotationMatrix(Vector3d(0.0, 0.0, 1.0), Angle::Degrees(90.0)).isDefined(); /// @endcode /// - /// @return True if rotation matrix is defined + /// @return True if Rotation Matrix is defined bool isDefined() const; - /// @brief Access underlying rotation matrix + /// @brief Access underlying 3D Matrix /// - /// @return Reference to underlying rotation matrix + /// @return Matrix reference const Matrix3d& accessMatrix() const; - /// @brief Get row at index + /// @brief Get row at index /// - /// @param [in] aRowIndex Index of row - /// @return Row at index + /// @param [in] aRowIndex Index of row + /// @return Vector Vector3d getRowAt(const Index& aRowIndex) const; - /// @brief Get column at index + /// @brief Get column at index /// - /// @param [in] aColumnIndex Index of column - /// @return Column at index + /// @param [in] aColumnIndex Index of column + /// @return Vector Vector3d getColumnAt(const Index& aColumnIndex) const; - /// @brief Get underlying rotation matrix + /// @brief Get underlying 3D Matrix /// - /// @return Underlying rotation matrix + /// @return Matrix Matrix3d getMatrix() const; - /// @brief Get transposed rotation matrix + /// @brief Calculate transposed Rotation Matrix /// /// @code - /// RotationMatrix(...).toTransposed() ; + /// RotationMatrix(...).toTransposed(); /// @endcode /// - /// @return Transposed rotation matrix + /// @return Rotation Matrix RotationMatrix toTransposed() const; - /// @brief Transpose rotation matrix + /// @brief Transpose Rotation Matrix /// /// @code - /// RotationMatrix(...).transpose() ; + /// RotationMatrix(...).transpose(); /// @endcode + /// + /// @return Rotation Matrix reference RotationMatrix& transpose(); - /// @brief Constructs an undefined rotation matrix + /// @brief Construct an undefined Rotation Matrix /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::Undefined() ; // Undefined + /// RotationMatrix::Undefined(); /// @endcode /// - /// @return Undefined rotation matrix + /// @return Rotation Matrix static RotationMatrix Undefined(); - /// @brief Constructs a unit rotation matrix + /// @brief Construct unitary Rotation Matrix /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::Unit() ; + /// RotationMatrix::Unit(); /// @endcode /// - /// @return Unit rotation matrix + /// @return Rotation Matrix static RotationMatrix Unit(); - /// @brief Constructs a rotation matrix representing a rotation around the X-axis + /// @brief Construct Rotation Matrix representing a rotation around the X-axis /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::RX(Angle::Degrees(30.0)) ; + /// RotationMatrix::RX(Angle::Degrees(30.0)); /// @endcode /// - /// @param [in] aRotationAngle A rotation angle - /// @return Rotation matrix + /// @param [in] aRotationAngle A rotation angle + /// @return Rotation matrix static RotationMatrix RX(const Angle& aRotationAngle); - /// @brief Constructs a rotation matrix representing a rotation around the Y-axis + /// @brief Construct Rotation Matrix representing a rotation around the Y-axis /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::RY(Angle::Degrees(30.0)) ; + /// RotationMatrix::RY(Angle::Degrees(30.0)); /// @endcode /// - /// @param [in] aRotationAngle A rotation angle - /// @return Rotation matrix + /// @param [in] aRotationAngle A rotation angle + /// @return Rotation matrix static RotationMatrix RY(const Angle& aRotationAngle); - /// @brief Constructs a rotation matrix representing a rotation around the Z-axis + /// @brief Construct Rotation Matrix representing a rotation around the Z-axis /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::RZ(Angle::Degrees(30.0)) ; + /// RotationMatrix::RZ(Angle::Degrees(30.0)); /// @endcode /// - /// @param [in] aRotationAngle A rotation angle - /// @return Rotation matrix + /// @param [in] aRotationAngle A rotation angle + /// @return Rotation matrix static RotationMatrix RZ(const Angle& aRotationAngle); - /// @brief Constructs a rotation matrix from row vectors + /// @brief Construct Rotation Matrix from row vectors /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::Rows(Vector3d(1.0, 0.0, 0.0), Vector3d(1.0, - /// 0.0, 0.0), Vector3d(1.0, 0.0, 0.0)) ; + /// RotationMatrix::Rows({1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}); /// @endcode /// - /// @param [in] aFirstRow A first row - /// @param [in] aSecondRow A second row - /// @param [in] aThirdRow A third row - /// @return Rotation matrix + /// @param [in] aFirstRow A first row + /// @param [in] aSecondRow A second row + /// @param [in] aThirdRow A third row + /// @return Rotation matrix static RotationMatrix Rows(const Vector3d& aFirstRow, const Vector3d& aSecondRow, const Vector3d& aThirdRow); - /// @brief Constructs a rotation matrix from column vectors + /// @brief Construct Rotation Matrix from column vectors /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::Columns(Vector3d(1.0, 0.0, 0.0), - /// Vector3d(1.0, 0.0, 0.0), Vector3d(1.0, 0.0, 0.0)) ; + /// RotationMatrix::Columns({1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}); /// @endcode /// - /// @param [in] aFirstColumn A first column - /// @param [in] aSecondColumn A second column - /// @param [in] aThirdColumn A third column - /// @return Rotation matrix + /// @param [in] aFirstColumn A first column + /// @param [in] aSecondColumn A second column + /// @param [in] aThirdColumn A third column + /// @return Rotation matrix static RotationMatrix Columns( const Vector3d& aFirstColumn, const Vector3d& aSecondColumn, const Vector3d& aThirdColumn ); - /// @brief Constructs a rotation matrix from a quaternion + /// @brief Construct Rotation Matrix from Quaternion /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::Quaternion(Quaternion::XYZS(0.0, 0.0, - /// 0.0, 1.0)) ; + /// RotationMatrix::Quaternion(Quaternion::Unit()); /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return Rotation matrix + /// @param [in] aQuaternion A Quaternion + /// @return Rotation matrix static RotationMatrix Quaternion(const rotation::Quaternion& aQuaternion); - /// @brief Constructs a rotation matrix from a rotation vector + /// @brief Construct Rotation Matrix from Rotation Vector /// /// @code - /// RotationMatrix rotationMatrix = RotationMatrix::RotationVector(Vector3d(0.0, 0.0, 1.0), - /// Angle::Degrees(90.0)) ; + /// RotationMatrix::RotationVector(RotationVector::Unit()); /// @endcode /// - /// @param [in] aRotationVector A rotation vector - /// @return Rotation matrix + /// @param [in] aRotationVector A Rotation Vector + /// @return Rotation matrix static RotationMatrix RotationVector(const rotation::RotationVector& aRotationVector); + /// @brief Construct Rotation Matrix from Euler Angle + /// + /// @code + /// RotationMatrix::EulerAngle(EulerAngle::Unit()); + /// @endcode + /// + /// @param [in] aEulerAngle A Euler Angle + /// @return Rotation matrix + + static RotationMatrix EulerAngle(const rotation::EulerAngle& aEulerAngle); + private: Matrix3d matrix_; diff --git a/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationVector.hpp b/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationVector.hpp index ee0e3714..20c0182d 100644 --- a/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationVector.hpp +++ b/include/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationVector.hpp @@ -30,167 +30,187 @@ using ostk::mathematics::geometry::Angle; class Quaternion; class RotationMatrix; +class EulerAngle; -/// @brief Rotation vector +/// @brief Rotation Vector /// /// @ref https://en.wikipedia.org/wiki/Axis–angle_representation#Rotation_vector class RotationVector { public: - /// @brief Constructor + /// @brief Constructor /// - /// @param [in] anAxis A rotation axis - /// @param [in] anAngle A rotation angle + /// @code + /// RotationVector({1.0, 0.0, 0.0}, Angle::Degrees(45.0)); + /// @endcode + /// + /// @param [in] anAxis A rotation axis + /// @param [in] anAngle A rotation angle RotationVector(const Vector3d& anAxis, const Angle& anAngle); - /// @brief Equal to operator + /// @brief Equal to operator /// /// @code - /// RotationVector(Vector3d(0.0, 0.0, 1.0), Angle::Degrees(90.0)) == - /// RotationVector(Vector3d(0.0, 0.0, 1.0), Angle::Degrees(90.0)) ; // True + /// RotationVector::Unit() == RotationVector::Unit(); /// @endcode /// - /// @param [in] aRotationVector A rotation vector - /// @return True if rotation vectors are equal + /// @param [in] aRotationVector A Rotation Vector + /// @return True if Rotation Vectors are equal bool operator==(const RotationVector& aRotationVector) const; - /// @brief Not equal to operator + /// @brief Not equal to operator /// /// @code - /// RotationVector(Vector3d(0.0, 0.0, 1.0), Angle::Degrees(90.0)) != - /// RotationVector(Vector3d(1.0, 0.0, 0.0), Angle::Degrees(90.0)) ; // True + /// RotationVector::Unit() != RotationVector::Unit(); /// @endcode /// - /// @param [in] aRotationVector A rotation vector - /// @return True if rotation vectors are not equal + /// @param [in] aRotationVector A Rotation Vector + /// @return True if Rotation Vectors are not equal bool operator!=(const RotationVector& aRotationVector) const; - /// @brief Output stream operator + /// @brief Output stream operator /// /// @code - /// std::cout << RotationVector(Vector3d(0.0, 0.0, 1.0), Angle::Degrees(90.0)) ; + /// std::cout << RotationVector::Unit(); /// @endcode /// - /// @param [in] anOutputStream An output stream - /// @param [in] aRotationVector A rotation vector - /// @return A reference to output stream + /// @param [in] anOutputStream An output stream + /// @param [in] aRotationVector A Rotation Vector + /// @return Reference to output stream friend std::ostream& operator<<(std::ostream& anOutputStream, const RotationVector& aRotationVector); - /// @brief Check if rotation vector is defined + /// @brief Check if Rotation Vector is defined /// /// @code - /// RotationVector(Vector3d(0.0, 0.0, 1.0), Angle::Degrees(90.0)).isDefined() ; // True + /// RotationVector::Unit().isDefined(); /// @endcode /// - /// @return True if rotation vector is defined + /// @return True if Rotation Vector is defined bool isDefined() const; - /// @brief Get rotation axis + /// @brief Get rotation axis + /// + /// @code + /// RotationVector::Unit().getAxis(); + /// @endcode /// - /// @return Rotation axis + /// @return Rotation axis Vector3d getAxis() const; - /// @brief Get rotation angle + /// @brief Get rotation angle /// - /// @return Rotation angle + /// @code + /// RotationVector::Unit().getAngle(); + /// @endcode + /// + /// @return Rotation angle Angle getAngle() const; - /// @brief Convert rotation vector to its string representation + /// @brief Convert Rotation Vector to string representation /// /// @code - /// RotationVector(Vector3d(0.0, 0.0, 1.0), Angle::Degrees(90.0)).toString() ; // "[0.0, - /// 0.0, 1.0] : 90.0 [deg]" + /// RotationVector::Unit().toString(); /// @endcode /// - /// @param [in] (optional) aPrecision A precision - /// @return String representation + /// @param [in] (optional) aPrecision A precision + /// @return String representation String toString(const Integer& aPrecision = Integer::Undefined()) const; - /// @brief Constructs an undefined rotation vector + /// @brief Construct an undefined Rotation Vector /// /// @code - /// RotationVector rotationVector = RotationVector::Undefined() ; // Undefined + /// RotationVector::Undefined(); /// @endcode /// - /// @return Undefined rotation vector + /// @return Undefined Rotation Vector static RotationVector Undefined(); - /// @brief Constructs a unit rotation vector + /// @brief Construct a unitary Rotation Vector /// /// @code - /// RotationVector rotationVector = RotationVector::Unit() ; + /// RotationVector::Unit(); /// @endcode /// - /// @return Unit rotation vector + /// @return Unitary Rotation Vector static RotationVector Unit(); - /// @brief Constructs a rotation vector around X-axis + /// @brief Construct Rotation Vector around X-axis /// /// @code - /// RotationVector rotationVector = RotationVector::X(Angle::Degrees(45.0)) ; + /// RotationVector::X(Angle::Degrees(45.0)); /// @endcode /// - /// @param [in] anAngle A rotation angle - /// @return Rotation vector + /// @param [in] anAngle A rotation angle + /// @return Rotation Vector static RotationVector X(const Angle& anAngle); - /// @brief Constructs a rotation vector around Y-axis + /// @brief Construct Rotation Vector around Y-axis /// /// @code - /// RotationVector rotationVector = RotationVector::X(Angle::Degrees(45.0)) ; + /// RotationVector::X(Angle::Degrees(45.0)); /// @endcode /// - /// @param [in] anAngle A rotation angle - /// @return Rotation vector + /// @param [in] anAngle A rotation angle + /// @return Rotation Vector static RotationVector Y(const Angle& anAngle); - /// @brief Constructs a rotation vector around Z-axis + /// @brief Construct Rotation Vector around Z-axis /// /// @code - /// RotationVector rotationVector = RotationVector::X(Angle::Degrees(45.0)) ; + /// RotationVector::X(Angle::Degrees(45.0)); /// @endcode /// - /// @param [in] anAngle A rotation angle - /// @return Rotation vector + /// @param [in] anAngle A rotation angle + /// @return Rotation Vector static RotationVector Z(const Angle& anAngle); - /// @brief Constructs a rotation vector from a quaternion + /// @brief Construct Rotation Vector from Quaternion /// /// @code - /// RotationVector rotationVector = RotationVector::Quaternion(Quaternion::XYZS(0.0, 0.0, - /// 0.0, 1.0)) ; + /// RotationVector::Quaternion(Quaternion::Unit()); /// @endcode /// - /// @param [in] aQuaternion A quaternion - /// @return Rotation vector + /// @param [in] aQuaternion A quaternion + /// @return Rotation Vector static RotationVector Quaternion(const rotation::Quaternion& aQuaternion); - /// @brief Constructs a rotation vector from a rotation matrix + /// @brief Construct Rotation Vector from Rotation Matrix /// /// @code - /// RotationVector rotationVector = RotationVector::RotationMatrix(RotationMatrix::Unit()) ; + /// RotationVector::RotationMatrix(RotationMatrix::Unit()); /// @endcode /// - /// @param [in] aRotationMatrix A rotation matrix - /// @return Rotation vector + /// @param [in] aRotationMatrix A Rotation Matrix + /// @return Rotation Vector static RotationVector RotationMatrix(const rotation::RotationMatrix& aRotationMatrix); + /// @brief Construct Rotation Vector from Euler Angle + /// + /// @code + /// RotationVector::EulerAngle(EulerAngle::Unit()); + /// @endcode + /// + /// @param [in] aEulerAngle A Euler Angle + /// @return Rotation Vector + + static RotationVector EulerAngle(const rotation::EulerAngle& aEulerAngle); + private: Vector3d axis_; Angle angle_; diff --git a/include/OpenSpaceToolkit/Mathematics/Geometry/Angle.hpp b/include/OpenSpaceToolkit/Mathematics/Geometry/Angle.hpp index 2b144a1f..08621d07 100644 --- a/include/OpenSpaceToolkit/Mathematics/Geometry/Angle.hpp +++ b/include/OpenSpaceToolkit/Mathematics/Geometry/Angle.hpp @@ -88,6 +88,21 @@ class Angle bool isZero() const; + /// @brief Check if angles are near within an angular tolerance + /// + /// @code + /// Angle::Zero().isNear( + /// Angle::Degrees(1.0), + /// Angle::Degrees(2.0) + /// ); + /// @endcode + /// + /// @param [in] anAngle An angle + /// @param [in] aTolerance A tolerance + /// @return True if angles are near + + bool isNear(const Angle& anAngle, const Angle& aTolerance) const; + Angle::Unit getUnit() const; Real in(const Angle::Unit& aUnit) const; diff --git a/include/OpenSpaceToolkit/Mathematics/Solver/NumericalSolver.hpp b/include/OpenSpaceToolkit/Mathematics/Solver/NumericalSolver.hpp index 118db88d..c7272cb8 100644 --- a/include/OpenSpaceToolkit/Mathematics/Solver/NumericalSolver.hpp +++ b/include/OpenSpaceToolkit/Mathematics/Solver/NumericalSolver.hpp @@ -101,7 +101,7 @@ class NumericalSolver /// /// @param [in] anOutputStream An output stream /// @param [in] aNumericalSolver A numerical solver - /// @return A reference to output stream + /// @return Output stream reference friend std::ostream& operator<<(std::ostream& anOutputStream, const NumericalSolver& aNumericalSolver); diff --git a/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Cuboid.cpp b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Cuboid.cpp index 4a4032bd..156dd171 100644 --- a/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Cuboid.cpp +++ b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Cuboid.cpp @@ -84,7 +84,8 @@ bool Cuboid::operator==(const Cuboid& aCuboid) const return true; // (0 == 0) && (1 == 1) && (2 == 2) } } - else if (((axes_[1] == aCuboid.axes_[2]) || (axes_[1] == -aCuboid.axes_[2])) && (extent_[1] == aCuboid.extent_[2])) + else if (((axes_[1] == aCuboid.axes_[2]) || (axes_[1] == -aCuboid.axes_[2])) && + (extent_[1] == aCuboid.extent_[2])) { if (((axes_[2] == aCuboid.axes_[1]) || (axes_[2] == -aCuboid.axes_[1])) && (extent_[2] == aCuboid.extent_[1])) @@ -93,7 +94,8 @@ bool Cuboid::operator==(const Cuboid& aCuboid) const } } } - else if (((axes_[0] == aCuboid.axes_[1]) || (axes_[0] == -aCuboid.axes_[1])) && (extent_[0] == aCuboid.extent_[1])) + else if (((axes_[0] == aCuboid.axes_[1]) || (axes_[0] == -aCuboid.axes_[1])) && + (extent_[0] == aCuboid.extent_[1])) { if (((axes_[1] == aCuboid.axes_[0]) || (axes_[1] == -aCuboid.axes_[0])) && (extent_[1] == aCuboid.extent_[0])) @@ -104,7 +106,8 @@ bool Cuboid::operator==(const Cuboid& aCuboid) const return true; // (0 == 1) && (1 == 0) && (2 == 2) } } - else if (((axes_[1] == aCuboid.axes_[2]) || (axes_[1] == -aCuboid.axes_[2])) && (extent_[1] == aCuboid.extent_[2])) + else if (((axes_[1] == aCuboid.axes_[2]) || (axes_[1] == -aCuboid.axes_[2])) && + (extent_[1] == aCuboid.extent_[2])) { if (((axes_[2] == aCuboid.axes_[0]) || (axes_[2] == -aCuboid.axes_[0])) && (extent_[2] == aCuboid.extent_[0])) @@ -113,7 +116,8 @@ bool Cuboid::operator==(const Cuboid& aCuboid) const } } } - else if (((axes_[0] == aCuboid.axes_[2]) || (axes_[0] == -aCuboid.axes_[2])) && (extent_[0] == aCuboid.extent_[2])) + else if (((axes_[0] == aCuboid.axes_[2]) || (axes_[0] == -aCuboid.axes_[2])) && + (extent_[0] == aCuboid.extent_[2])) { if (((axes_[1] == aCuboid.axes_[0]) || (axes_[1] == -aCuboid.axes_[0])) && (extent_[1] == aCuboid.extent_[0])) @@ -124,7 +128,8 @@ bool Cuboid::operator==(const Cuboid& aCuboid) const return true; // (0 == 2) && (1 == 0) && (2 == 1) } } - else if (((axes_[1] == aCuboid.axes_[1]) || (axes_[1] == -aCuboid.axes_[1])) && (extent_[1] == aCuboid.extent_[1])) + else if (((axes_[1] == aCuboid.axes_[1]) || (axes_[1] == -aCuboid.axes_[1])) && + (extent_[1] == aCuboid.extent_[1])) { if (((axes_[2] == aCuboid.axes_[0]) || (axes_[2] == -aCuboid.axes_[0])) && (extent_[2] == aCuboid.extent_[0])) diff --git a/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/EulerAngle.cpp b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/EulerAngle.cpp new file mode 100644 index 00000000..ed729067 --- /dev/null +++ b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/EulerAngle.cpp @@ -0,0 +1,339 @@ +/// Apache License 2.0 + +#include +#include + +#include +#include +#include +#include + +namespace ostk +{ +namespace mathematics +{ +namespace geometry +{ +namespace d3 +{ +namespace transformation +{ +namespace rotation +{ + +EulerAngle::EulerAngle( + const Angle& aFirstAngle, + const Angle& aSecondAngle, + const Angle& aThirdAngle, + const EulerAngle::AxisSequence& anAxisSequence +) + : phi_(aFirstAngle), + theta_(aSecondAngle), + psi_(aThirdAngle), + axisSequence_(anAxisSequence) +{ +} + +EulerAngle::EulerAngle( + const Vector3d& aVector, const Angle::Unit& anAngleUnit, const EulerAngle::AxisSequence& anAxisSequence +) + : phi_(Angle(aVector(0), anAngleUnit)), + theta_(Angle(aVector(1), anAngleUnit)), + psi_(Angle(aVector(2), anAngleUnit)), + axisSequence_(anAxisSequence) +{ +} + +bool EulerAngle::operator==(const EulerAngle& aEulerAngle) const +{ + if ((!this->isDefined()) || (!aEulerAngle.isDefined())) + { + return false; + } + + if (axisSequence_ != aEulerAngle.axisSequence_) + { + return false; + } + + if ((phi_ == aEulerAngle.phi_) && (theta_ == aEulerAngle.theta_) && (psi_ == aEulerAngle.psi_)) + { + return true; + } + + // https://math.stackexchange.com/a/55552 + if ((phi_ + Angle::Pi() == aEulerAngle.phi_) && (Angle::Pi() - theta_ == aEulerAngle.theta_) && + (psi_ + Angle::Pi() == aEulerAngle.psi_)) + { + return true; + } + + return false; +} + +bool EulerAngle::operator!=(const EulerAngle& aEulerAngle) const +{ + return !((*this) == aEulerAngle); +} + +std::ostream& operator<<(std::ostream& anOutputStream, const EulerAngle& aEulerAngle) +{ + ostk::core::utils::Print::Header(anOutputStream, "Euler Angle"); + + ostk::core::utils::Print::Line(anOutputStream) + << "Phi:" << (aEulerAngle.isDefined() ? String::Format("{}", aEulerAngle.phi_.toString()) : "Undefined"); + ostk::core::utils::Print::Line(anOutputStream) + << "Theta:" << (aEulerAngle.isDefined() ? String::Format("{}", aEulerAngle.theta_.toString()) : "Undefined"); + ostk::core::utils::Print::Line(anOutputStream) + << "Psi:" << (aEulerAngle.isDefined() ? String::Format("{}", aEulerAngle.psi_.toString()) : "Undefined"); + ostk::core::utils::Print::Line(anOutputStream + ) << "Axis sequence:" + << (aEulerAngle.isDefined() ? String::Format("{}", EulerAngle::StringFromAxisSequence(aEulerAngle.axisSequence_)) + : "Undefined"); + + ostk::core::utils::Print::Footer(anOutputStream); + + return anOutputStream; +} + +bool EulerAngle::isDefined() const +{ + return phi_.isDefined() && theta_.isDefined() && psi_.isDefined() && + axisSequence_ != EulerAngle::AxisSequence::Undefined; +} + +bool EulerAngle::isUnitary() const +{ + return phi_.isZero() && theta_.isZero() && psi_.isZero(); +} + +bool EulerAngle::isNear(const EulerAngle& aEulerAngle, const Angle& anAngularTolerance) const +{ + return Quaternion::EulerAngle(*this).isNear(Quaternion::EulerAngle(aEulerAngle), anAngularTolerance); +} + +Angle EulerAngle::phi() const +{ + if (!this->isDefined()) + { + throw ostk::core::error::runtime::Undefined("Euler Angle"); + } + + return phi_; +} + +Angle EulerAngle::theta() const +{ + if (!this->isDefined()) + { + throw ostk::core::error::runtime::Undefined("Euler Angle"); + } + + return theta_; +} + +Angle EulerAngle::psi() const +{ + if (!this->isDefined()) + { + throw ostk::core::error::runtime::Undefined("Euler Angle"); + } + + return psi_; +} + +EulerAngle::AxisSequence EulerAngle::getAxisSequence() const +{ + if (!this->isDefined()) + { + throw ostk::core::error::runtime::Undefined("Euler Angle"); + } + + return axisSequence_; +} + +Vector3d EulerAngle::toVector(const Angle::Unit& anAngleUnit) const +{ + if (!this->isDefined()) + { + throw ostk::core::error::runtime::Undefined("Euler Angle"); + } + + return {phi_.in(anAngleUnit), theta_.in(anAngleUnit), psi_.in(anAngleUnit)}; +} + +String EulerAngle::toString(const Angle::Unit& anAngleUnit) const +{ + if (!this->isDefined()) + { + throw ostk::core::error::runtime::Undefined("Euler Angle"); + } + + return String::Format( + "[{}, {}, {}] ({})", + phi_.in(anAngleUnit), + theta_.in(anAngleUnit), + psi_.in(anAngleUnit), + EulerAngle::StringFromAxisSequence(axisSequence_) + ); +} + +EulerAngle EulerAngle::Undefined() +{ + return {Angle::Undefined(), Angle::Undefined(), Angle::Undefined(), EulerAngle::AxisSequence::Undefined}; +} + +EulerAngle EulerAngle::Unit() +{ + return {Angle::Zero(), Angle::Zero(), Angle::Zero(), EulerAngle::AxisSequence::ZYX}; +} + +EulerAngle EulerAngle::XYZ(const Angle& aFirstAngle, const Angle& aSecondAngle, const Angle& aThirdAngle) +{ + return {aFirstAngle, aSecondAngle, aThirdAngle, EulerAngle::AxisSequence::XYZ}; +} + +EulerAngle EulerAngle::ZXY(const Angle& aFirstAngle, const Angle& aSecondAngle, const Angle& aThirdAngle) +{ + return {aFirstAngle, aSecondAngle, aThirdAngle, EulerAngle::AxisSequence::ZXY}; +} + +EulerAngle EulerAngle::ZYX(const Angle& aFirstAngle, const Angle& aSecondAngle, const Angle& aThirdAngle) +{ + return {aFirstAngle, aSecondAngle, aThirdAngle, EulerAngle::AxisSequence::ZYX}; +} + +EulerAngle EulerAngle::Quaternion( + const rotation::Quaternion& aQuaternion, const EulerAngle::AxisSequence& anAxisSequence +) +{ + if (!aQuaternion.isDefined()) + { + throw ostk::core::error::runtime::Undefined("Quaternion"); + } + + if (!aQuaternion.isUnitary()) + { + throw ostk::core::error::RuntimeError("Quaternion is not unitary."); + } + + const Real q_x = aQuaternion.x(); + const Real q_y = aQuaternion.y(); + const Real q_z = aQuaternion.z(); + const Real q_s = aQuaternion.s(); + + Real phi = Real::Undefined(); + Real theta = Real::Undefined(); + Real psi = Real::Undefined(); + + switch (anAxisSequence) + { + case EulerAngle::AxisSequence::ZYX: // 3-2-1 + { + phi = std::atan2(2.0 * (q_x * q_y + q_s * q_z), q_s * q_s - q_z * q_z - q_y * q_y + q_x * q_x); + theta = std::asin(-2.0 * (q_x * q_z - q_y * q_s)); + psi = std::atan2(2.0 * (q_y * q_z + q_x * q_s), q_s * q_s + q_z * q_z - q_y * q_y - q_x * q_x); + break; + } + + default: + // TBI: This is an inefficient fallback. + return EulerAngle::RotationMatrix(RotationMatrix::Quaternion(aQuaternion), anAxisSequence); + } + + // https://math.stackexchange.com/a/55552 + if (phi < 0.0) + { + phi = phi + M_PI; + theta = M_PI - theta; + psi = psi + M_PI; + } + + return EulerAngle::ZYX(Angle::Radians(phi), Angle::Radians(theta), Angle::Radians(psi)); +} + +EulerAngle EulerAngle::RotationVector( + const rotation::RotationVector& aRotationVector, const EulerAngle::AxisSequence& anAxisSequence +) +{ + return EulerAngle::Quaternion(Quaternion::RotationVector(aRotationVector), anAxisSequence); +} + +EulerAngle EulerAngle::RotationMatrix( + const rotation::RotationMatrix& aRotationMatrix, const EulerAngle::AxisSequence& anAxisSequence +) +{ + if (!aRotationMatrix.isDefined()) + { + throw ostk::core::error::runtime::Undefined("Rotation Matrix"); + } + + Real phi = Real::Undefined(); + Real theta = Real::Undefined(); + Real psi = Real::Undefined(); + + switch (anAxisSequence) + { + case EulerAngle::AxisSequence::XYZ: // 1-2-3 + { + phi = std::atan2(-aRotationMatrix(2, 1), aRotationMatrix(2, 2)); + theta = std::asin(aRotationMatrix(2, 0)); + psi = std::atan2(-aRotationMatrix(1, 0), aRotationMatrix(0, 0)); + break; + } + + case EulerAngle::AxisSequence::ZXY: // 3-1-2 + { + phi = std::atan2(-aRotationMatrix(1, 0), aRotationMatrix(1, 1)); + theta = std::asin(aRotationMatrix(1, 2)); + psi = std::atan2(-aRotationMatrix(0, 2), aRotationMatrix(2, 2)); + break; + } + + case EulerAngle::AxisSequence::ZYX: // 3-2-1 + { + phi = std::atan2(aRotationMatrix(0, 1), aRotationMatrix(0, 0)); + theta = std::asin(-aRotationMatrix(0, 2)); + psi = std::atan2(aRotationMatrix(1, 2), aRotationMatrix(2, 2)); + break; + } + + default: + throw ostk::core::error::runtime::ToBeImplemented("Axis sequence is not supported."); + } + + // https://math.stackexchange.com/a/55552 + if (phi < 0.0) + { + phi = phi + M_PI; + theta = M_PI - theta; + psi = psi + M_PI; + } + + return EulerAngle::ZYX(Angle::Radians(phi), Angle::Radians(theta), Angle::Radians(psi)); +} + +String EulerAngle::StringFromAxisSequence(const EulerAngle::AxisSequence& anAxisSequence) +{ + switch (anAxisSequence) + { + case EulerAngle::AxisSequence::XYZ: + return "XYZ"; + + case EulerAngle::AxisSequence::ZXY: + return "ZXY"; + + case EulerAngle::AxisSequence::ZYX: + return "ZYX"; + + default: + throw ostk::core::error::runtime::Wrong("Axis sequence"); + } +} + +} // namespace rotation +} // namespace transformation +} // namespace d3 +} // namespace geometry +} // namespace mathematics +} // namespace ostk diff --git a/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/Quaternion.cpp b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/Quaternion.cpp index bae2652d..188f9165 100644 --- a/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/Quaternion.cpp +++ b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/Quaternion.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -540,21 +541,24 @@ Quaternion Quaternion::RotationMatrix(const rotation::RotationMatrix& aRotationM z = rotationMatrix_12 - rotationMatrix_21; s = 1.0 + trace; } - else if ((rotationMatrix_11 >= trace) && (rotationMatrix_11 >= rotationMatrix_22) && (rotationMatrix_11 >= rotationMatrix_33)) + else if ((rotationMatrix_11 >= trace) && (rotationMatrix_11 >= rotationMatrix_22) && + (rotationMatrix_11 >= rotationMatrix_33)) { x = 1.0 + 2.0 * rotationMatrix_11 - trace; y = rotationMatrix_12 + rotationMatrix_21; z = rotationMatrix_13 + rotationMatrix_31; s = rotationMatrix_23 - rotationMatrix_32; } - else if ((rotationMatrix_22 >= rotationMatrix_11) && (rotationMatrix_22 >= trace) && (rotationMatrix_22 >= rotationMatrix_33)) + else if ((rotationMatrix_22 >= rotationMatrix_11) && (rotationMatrix_22 >= trace) && + (rotationMatrix_22 >= rotationMatrix_33)) { x = rotationMatrix_21 + rotationMatrix_12; y = 1.0 + 2.0 * rotationMatrix_22 - trace; z = rotationMatrix_23 + rotationMatrix_32; s = rotationMatrix_31 - rotationMatrix_13; } - else if ((rotationMatrix_33 >= rotationMatrix_11) && (rotationMatrix_33 >= rotationMatrix_22) && (rotationMatrix_33 >= trace)) + else if ((rotationMatrix_33 >= rotationMatrix_11) && (rotationMatrix_33 >= rotationMatrix_22) && + (rotationMatrix_33 >= trace)) { x = rotationMatrix_31 + rotationMatrix_13; y = rotationMatrix_32 + rotationMatrix_23; @@ -569,6 +573,66 @@ Quaternion Quaternion::RotationMatrix(const rotation::RotationMatrix& aRotationM return Quaternion::XYZS(x, y, z, s).normalize(); } +Quaternion Quaternion::EulerAngle(const rotation::EulerAngle& aEulerAngle) +{ + // Fundamentals of Spacecraft Attitude Determination and Control + // F. Landis Markley and John L. Crassidis, Springer + // Table B.5, p. 364 + + if (!aEulerAngle.isDefined()) + { + throw ostk::core::error::runtime::Undefined("Euler angle"); + } + + const Real phi = aEulerAngle.phi().inRadians(); + const Real theta = aEulerAngle.theta().inRadians(); + const Real psi = aEulerAngle.psi().inRadians(); + + const Real c_phi = std::cos(phi / 2.0); + const Real c_theta = std::cos(theta / 2.0); + const Real c_psi = std::cos(psi / 2.0); + + const Real s_phi = std::sin(phi / 2.0); + const Real s_theta = std::sin(theta / 2.0); + const Real s_psi = std::sin(psi / 2.0); + + switch (aEulerAngle.getAxisSequence()) + { + case EulerAngle::AxisSequence::XYZ: // 1-2-3 + { + const Real x = s_phi * c_theta * c_psi + c_phi * s_theta * s_psi; + const Real y = c_phi * s_theta * c_psi - s_phi * c_theta * s_psi; + const Real z = c_phi * c_theta * s_psi + s_phi * s_theta * c_psi; + const Real s = c_phi * c_theta * c_psi - s_phi * s_theta * s_psi; + + return Quaternion::XYZS(x, y, z, s).toNormalized(); + } + + case EulerAngle::AxisSequence::ZXY: // 3-1-2 + { + const Real x = c_phi * s_theta * c_psi - s_phi * c_theta * s_psi; + const Real y = c_phi * c_theta * s_psi + s_phi * s_theta * c_psi; + const Real z = c_phi * s_theta * s_psi + s_phi * c_theta * c_psi; + const Real s = c_phi * c_theta * c_psi - s_phi * s_theta * s_psi; + + return Quaternion::XYZS(x, y, z, s).toNormalized(); + } + + case EulerAngle::AxisSequence::ZYX: // 3-2-1 + { + const Real x = c_phi * c_theta * s_psi - s_phi * s_theta * c_psi; + const Real y = c_phi * s_theta * c_psi + s_phi * c_theta * s_psi; + const Real z = s_phi * c_theta * c_psi - c_phi * s_theta * s_psi; + const Real s = c_phi * c_theta * c_psi + s_phi * s_theta * s_psi; + + return Quaternion::XYZS(x, y, z, s).toNormalized(); + } + + default: + throw ostk::core::error::runtime::ToBeImplemented("Axis sequence is not supported."); + } +} + Quaternion Quaternion::Parse(const String& aString, const Quaternion::Format& aFormat) { using ostk::mathematics::object::VectorXd; diff --git a/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationMatrix.cpp b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationMatrix.cpp index dc89088e..e7310a95 100644 --- a/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationMatrix.cpp +++ b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationMatrix.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -275,7 +276,8 @@ RotationMatrix& RotationMatrix::transpose() throw ostk::core::error::runtime::Undefined("Rotation matrix"); } - matrix_ = matrix_.transpose(); + // https://eigen.tuxfamily.org/dox/group__TutorialMatrixArithmetic.html + matrix_.transposeInPlace(); return *this; } @@ -528,6 +530,38 @@ RotationMatrix RotationMatrix::RotationVector(const rotation::RotationVector& aR return RotationMatrix(matrix); } +RotationMatrix RotationMatrix::EulerAngle(const rotation::EulerAngle& aEulerAngle) +{ + if (!aEulerAngle.isDefined()) + { + throw ostk::core::error::runtime::Undefined("Euler Angle"); + } + + switch (aEulerAngle.getAxisSequence()) + { + case EulerAngle::AxisSequence::XYZ: // 1-2-3 + { + return RotationMatrix::RX(aEulerAngle.phi()) * RotationMatrix::RY(aEulerAngle.theta()) * + RotationMatrix::RZ(aEulerAngle.psi()); + } + + case EulerAngle::AxisSequence::ZXY: // 3-1-2 + { + return RotationMatrix::RX(aEulerAngle.psi()) * RotationMatrix::RY(aEulerAngle.phi()) * + RotationMatrix::RZ(aEulerAngle.theta()); + } + + case EulerAngle::AxisSequence::ZYX: // 3-2-1 + { + return RotationMatrix::RX(aEulerAngle.psi()) * RotationMatrix::RY(aEulerAngle.theta()) * + RotationMatrix::RZ(aEulerAngle.phi()); + } + + default: + throw ostk::core::error::runtime::ToBeImplemented("Axis sequence is not supported."); + } +} + RotationMatrix::RotationMatrix() : matrix_(Matrix3d::Undefined()) { diff --git a/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationVector.cpp b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationVector.cpp index 18c6e3a0..1c37718a 100644 --- a/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationVector.cpp +++ b/src/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformation/Rotation/RotationVector.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -189,6 +190,11 @@ RotationVector RotationVector::RotationMatrix(const rotation::RotationMatrix& aR return RotationVector(axis, angle); } +RotationVector RotationVector::EulerAngle(const rotation::EulerAngle& aEulerAngle) +{ + return RotationVector::Quaternion(Quaternion::EulerAngle(aEulerAngle)); +} + RotationVector::RotationVector() : axis_(Vector3d::Undefined()), angle_(Angle::Undefined()) diff --git a/src/OpenSpaceToolkit/Mathematics/Geometry/Angle.cpp b/src/OpenSpaceToolkit/Mathematics/Geometry/Angle.cpp index afd90171..3ce51ae0 100644 --- a/src/OpenSpaceToolkit/Mathematics/Geometry/Angle.cpp +++ b/src/OpenSpaceToolkit/Mathematics/Geometry/Angle.cpp @@ -260,6 +260,12 @@ bool Angle::isZero() const return value_ == 0.0; } +bool Angle::isNear(const Angle& anAngle, const Angle& aTolerance) const +{ + return Angle::ReduceRange(this->inDegrees(), 0.0, 360.0) + .isNear(Angle::ReduceRange(anAngle.inDegrees(), 0.0, 360.0), aTolerance.inDegrees().abs()); +} + Angle::Unit Angle::getUnit() const { if (!this->isDefined()) diff --git a/test/OpenSpaceToolkit/Mathematics/CurveFitting/Interpolator.test.cpp b/test/OpenSpaceToolkit/Mathematics/CurveFitting/Interpolator.test.cpp index f653512a..ef8e4f63 100644 --- a/test/OpenSpaceToolkit/Mathematics/CurveFitting/Interpolator.test.cpp +++ b/test/OpenSpaceToolkit/Mathematics/CurveFitting/Interpolator.test.cpp @@ -31,8 +31,7 @@ class MockInterpolator : public Interpolator class OpenSpaceToolkit_Mathematics_Interpolator : public ::testing::Test { protected: - const Interpolator::Type defaulttype_ = - Interpolator::Type::BarycentricRational; + const Interpolator::Type defaulttype_ = Interpolator::Type::BarycentricRational; const MockInterpolator defaultInterpolator_ {defaulttype_}; }; diff --git a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Composite.test.cpp b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Composite.test.cpp index 20f2fbfd..e4a2e0ac 100644 --- a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Composite.test.cpp +++ b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Composite.test.cpp @@ -70,7 +70,7 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Object_Composite, Constructor) Unique cuboidUPtr = std::make_unique(center, axes, extent); - Array> objects= Array>::Empty(); + Array> objects = Array>::Empty(); objects.emplace_back(std::move(pyramidUPtr)); objects.emplace_back(std::move(cuboidUPtr)); @@ -166,7 +166,7 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Object_Composite, EqualToOperator) Unique cuboidUPtr = std::make_unique(center, axes, extent); - Array> objects= Array>::Empty(); + Array> objects = Array>::Empty(); objects.emplace_back(std::move(pyramidUPtr)); objects.emplace_back(std::move(cuboidUPtr)); @@ -291,7 +291,7 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Object_Composite, NotEqualToOperat Unique cuboidUPtr = std::make_unique(center, axes, extent); - Array> objects= Array>::Empty(); + Array> objects = Array>::Empty(); objects.emplace_back(std::move(pyramidUPtr)); objects.emplace_back(std::move(cuboidUPtr)); @@ -760,7 +760,7 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Object_Composite, AccessObjectAt) Unique cuboidUPtr = std::make_unique(center, axes, extent); - Array> objects= Array>::Empty(); + Array> objects = Array>::Empty(); objects.emplace_back(std::move(pyramidUPtr)); objects.emplace_back(std::move(cuboidUPtr)); @@ -821,7 +821,7 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Object_Composite, AccessObjects) Unique cuboidUPtr = std::make_unique(center, axes, extent); - Array> objects= Array>::Empty(); + Array> objects = Array>::Empty(); objects.emplace_back(std::move(pyramidUPtr)); objects.emplace_back(std::move(cuboidUPtr)); @@ -879,7 +879,7 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Object_Composite, GetObjectCount) Unique cuboidUPtr = std::make_unique(center, axes, extent); - Array> objects= Array>::Empty(); + Array> objects = Array>::Empty(); objects.emplace_back(std::move(pyramidUPtr)); objects.emplace_back(std::move(cuboidUPtr)); @@ -942,7 +942,7 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Object_Composite, ConstIterator) Unique cuboidUPtr = std::make_unique(center, axes, extent); - Array> objects= Array>::Empty(); + Array> objects = Array>::Empty(); objects.emplace_back(std::move(pyramidUPtr)); objects.emplace_back(std::move(cuboidUPtr)); diff --git a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Polygon.test.cpp b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Polygon.test.cpp index 328f204c..774380e4 100644 --- a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Polygon.test.cpp +++ b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Object/Polygon.test.cpp @@ -302,7 +302,7 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Object_Polygon, GetYAxis) TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Object_Polygon, GetNormalVector) { using ostk::core::type::Real; - + using ostk::mathematics::object::Vector3d; using Polygon2d = ostk::mathematics::geometry::d2::object::Polygon; using ostk::mathematics::geometry::d3::object::Point; diff --git a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle.test.cpp b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle.test.cpp new file mode 100644 index 00000000..79b61fa4 --- /dev/null +++ b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle.test.cpp @@ -0,0 +1,575 @@ +/// Apache License 2.0 + +#include +#include + +#include +#include +#include +#include +#include + +#include + +using ostk::core::type::String; +using ostk::core::filesystem::Path; +using ostk::core::filesystem::File; +using ostk::core::container::Table; + +using ostk::mathematics::object::Vector3d; +using ostk::mathematics::geometry::Angle; +using ostk::mathematics::geometry::d3::transformation::rotation::EulerAngle; +using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; +using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix; +using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, Constructor) +{ + { + EulerAngle eulerAngle = { + Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX + }; + + EXPECT_TRUE(eulerAngle.isDefined()); + } + + { + EulerAngle eulerAngle = { + Angle::Degrees(0.0), Angle::Undefined(), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX + }; + + EXPECT_FALSE(eulerAngle.isDefined()); + } + + { + EulerAngle eulerAngle = { + Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::Undefined + }; + + EXPECT_FALSE(eulerAngle.isDefined()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, EqualToOperator) +{ + { + EXPECT_TRUE( + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) == + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) + ); + + EXPECT_TRUE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) == + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + ); + } + + { + EXPECT_FALSE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) == + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::XYZ) + ); + + EXPECT_FALSE( + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) == + EulerAngle::Undefined() + ); + + EXPECT_FALSE( + EulerAngle::Undefined() == + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) + ); + + EXPECT_FALSE(EulerAngle::Undefined() == EulerAngle::Undefined()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, NotEqualToOperator) +{ + { + EXPECT_TRUE( + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) != + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(1.0), EulerAngle::AxisSequence::ZYX) + ); + + EXPECT_TRUE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) != + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::XYZ) + ); + } + + { + EXPECT_FALSE( + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) != + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) + ); + + EXPECT_FALSE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) != + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + ); + } + + { + EXPECT_TRUE( + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) != + EulerAngle::Undefined() + ); + + EXPECT_TRUE( + EulerAngle::Undefined() != + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) + ); + + EXPECT_TRUE(EulerAngle::Undefined() != EulerAngle::Undefined()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, IsDefined) +{ + { + EXPECT_TRUE( + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) + .isDefined() + ); + + EXPECT_TRUE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .isDefined() + ); + } + + { + EXPECT_FALSE( + EulerAngle(Angle::Degrees(1.0), Angle::Undefined(), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .isDefined() + ); + } + + { + EXPECT_FALSE(EulerAngle::Undefined().isDefined()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, IsUnitary) +{ + { + EXPECT_TRUE( + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) + .isUnitary() + ); + + EXPECT_TRUE(EulerAngle::Unit().isUnitary()); + } + + { + EXPECT_FALSE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .isUnitary() + ); + } + + { + EXPECT_ANY_THROW(EulerAngle::Undefined().isUnitary()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, IsNear) +{ + { + EXPECT_TRUE( + EulerAngle(Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX) + .isNear( + EulerAngle( + Angle::Degrees(0.0), Angle::Degrees(0.0), Angle::Degrees(0.0), EulerAngle::AxisSequence::ZYX + ), + Angle::Degrees(0.0) + ) + ); + + EXPECT_TRUE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .isNear( + EulerAngle( + Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX + ), + Angle::Degrees(0.0) + ) + ); + + EXPECT_TRUE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .isNear( + EulerAngle( + Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX + ), + Angle::Degrees(1.0) + ) + ); + + EXPECT_TRUE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(4.0), EulerAngle::AxisSequence::ZYX) + .isNear( + EulerAngle( + Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX + ), + Angle::Degrees(1.0) + ) + ); + } + + { + EXPECT_FALSE( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.1), EulerAngle::AxisSequence::ZYX) + .isNear( + EulerAngle( + Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX + ), + Angle::Degrees(0.0) + ) + ); + } + + { + EXPECT_ANY_THROW(EulerAngle::Unit().isNear(EulerAngle::Undefined(), Angle::Undefined())); + EXPECT_ANY_THROW(EulerAngle::Undefined().isNear(EulerAngle::Unit(), Angle::Undefined())); + EXPECT_ANY_THROW(EulerAngle::Unit().isNear(EulerAngle::Unit(), Angle::Undefined())); + EXPECT_ANY_THROW(EulerAngle::Undefined().isNear(EulerAngle::Undefined(), Angle::Undefined())); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, Phi) +{ + { + EXPECT_EQ( + Angle::Degrees(1.0), + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .phi() + ); + } + + { + EXPECT_ANY_THROW(EulerAngle::Undefined().phi()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, Theta) +{ + { + EXPECT_EQ( + Angle::Degrees(2.0), + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .theta() + ); + } + + { + EXPECT_ANY_THROW(EulerAngle::Undefined().theta()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, Psi) +{ + { + EXPECT_EQ( + Angle::Degrees(3.0), + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .psi() + ); + } + + { + EXPECT_ANY_THROW(EulerAngle::Undefined().psi()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, GetAxisSequence) +{ + { + EXPECT_EQ( + EulerAngle::AxisSequence::ZYX, + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .getAxisSequence() + ); + } + + { + EXPECT_ANY_THROW(EulerAngle::Undefined().getAxisSequence()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, ToVector) +{ + { + EXPECT_EQ( + Vector3d(1.0, 2.0, 3.0), + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX) + .toVector(Angle::Unit::Degree) + ); + } + + { + EXPECT_ANY_THROW(EulerAngle::Undefined().toVector(Angle::Unit::Degree)); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, ToString) +{ + { + EXPECT_EQ( + "[1.1, 2.2, 3.3] (ZYX)", + EulerAngle(Angle::Degrees(1.1), Angle::Degrees(2.2), Angle::Degrees(3.3), EulerAngle::AxisSequence::ZYX) + .toString(Angle::Unit::Degree) + ); + } + + { + EXPECT_ANY_THROW(EulerAngle::Undefined().toString(Angle::Unit::Degree)); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, Undefined) +{ + { + EXPECT_NO_THROW(EulerAngle::Undefined()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, Unit) +{ + { + EXPECT_NO_THROW(EulerAngle::Unit()); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, XYZ) +{ + { + EXPECT_EQ( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::XYZ), + EulerAngle::XYZ(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0)) + ); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, ZXY) +{ + { + EXPECT_EQ( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZXY), + EulerAngle::ZXY(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0)) + ); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, ZYX) +{ + { + EXPECT_EQ( + EulerAngle(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0), EulerAngle::AxisSequence::ZYX), + EulerAngle::ZYX(Angle::Degrees(1.0), Angle::Degrees(2.0), Angle::Degrees(3.0)) + ); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, Quaternion) +{ + { + EXPECT_EQ(EulerAngle::Unit(), EulerAngle::Quaternion(Quaternion::Unit(), EulerAngle::AxisSequence::ZYX)); + } + + // XYZ + + { + // TBI + } + + // ZXY + + { + // TBI + } + + // ZYX + { + const Table referenceDataTable = Table::Load( + File::Path(Path::Parse("/app/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/" + "EulerAngle/Quaternion-EulerAngle-ZYX.csv")), + Table::Format::CSV, + true + ); + + const Angle angularTolerance = Angle::Degrees(1e-8); + + for (const auto& referenceDataRow : referenceDataTable) + { + const Quaternion quaternion = Quaternion::XYZS( + referenceDataRow[0].accessReal(), + referenceDataRow[1].accessReal(), + referenceDataRow[2].accessReal(), + referenceDataRow[3].accessReal() + ) + .normalize(); + + const EulerAngle referenceEulerAngle = EulerAngle::ZYX( + Angle::Radians(referenceDataRow[4].accessReal()), + Angle::Radians(referenceDataRow[5].accessReal()), + Angle::Radians(referenceDataRow[6].accessReal()) + ); + + const EulerAngle eulerAngle = EulerAngle::Quaternion(quaternion, EulerAngle::AxisSequence::ZYX); + + EXPECT_TRUE(eulerAngle.phi().isNear(referenceEulerAngle.phi(), angularTolerance)) + << String::Format("{} / {}", referenceEulerAngle.phi().toString(), eulerAngle.phi().toString()); + EXPECT_TRUE(eulerAngle.theta().isNear(referenceEulerAngle.theta(), angularTolerance)) + << String::Format("{} / {}", referenceEulerAngle.theta().toString(), eulerAngle.theta().toString()); + EXPECT_TRUE(eulerAngle.psi().isNear(referenceEulerAngle.psi(), angularTolerance)) + << String::Format("{} / {}", referenceEulerAngle.psi().toString(), eulerAngle.psi().toString()); + } + } + + { + EXPECT_ANY_THROW(EulerAngle::Quaternion(Quaternion::Unit(), EulerAngle::AxisSequence::Undefined)); + EXPECT_ANY_THROW(EulerAngle::Quaternion(Quaternion::Undefined(), EulerAngle::AxisSequence::ZYX)); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, RotationVector) +{ + { + EXPECT_EQ( + EulerAngle::Unit(), EulerAngle::RotationVector(RotationVector::Unit(), EulerAngle::AxisSequence::ZYX) + ); + } + + { + const Table referenceDataTable = Table::Load( + File::Path(Path::Parse("/app/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/" + "EulerAngle/RotationVector-EulerAngle-ZYX.csv")), + Table::Format::CSV, + true + ); + + const Angle angularTolerance = Angle::Degrees(1e-6); + + for (const auto& referenceDataRow : referenceDataTable) + { + const RotationVector rotationVector = RotationVector( + Vector3d( + referenceDataRow[0].accessReal(), referenceDataRow[1].accessReal(), referenceDataRow[2].accessReal() + ) + .normalized(), + Angle::Radians(referenceDataRow[3].accessReal()) + ); + + const EulerAngle referenceEulerAngle = EulerAngle::ZYX( + Angle::Radians(referenceDataRow[4].accessReal()), + Angle::Radians(referenceDataRow[5].accessReal()), + Angle::Radians(referenceDataRow[6].accessReal()) + ); + + const EulerAngle eulerAngle = EulerAngle::RotationVector(rotationVector, EulerAngle::AxisSequence::ZYX); + + EXPECT_TRUE(eulerAngle.phi().isNear(referenceEulerAngle.phi(), angularTolerance)) + << String::Format("{} / {}", referenceEulerAngle.phi().toString(), eulerAngle.phi().toString()); + EXPECT_TRUE(eulerAngle.theta().isNear(referenceEulerAngle.theta(), angularTolerance)) + << String::Format("{} / {}", referenceEulerAngle.theta().toString(), eulerAngle.theta().toString()); + EXPECT_TRUE(eulerAngle.psi().isNear(referenceEulerAngle.psi(), angularTolerance)) + << String::Format("{} / {}", referenceEulerAngle.psi().toString(), eulerAngle.psi().toString()); + } + } + + { + EXPECT_ANY_THROW(EulerAngle::RotationVector(RotationVector::Unit(), EulerAngle::AxisSequence::Undefined)); + EXPECT_ANY_THROW(EulerAngle::RotationVector(RotationVector::Undefined(), EulerAngle::AxisSequence::ZYX)); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, RotationMatrix) +{ + { + EXPECT_EQ( + EulerAngle::Unit(), EulerAngle::RotationMatrix(RotationMatrix::Unit(), EulerAngle::AxisSequence::ZYX) + ); + } + + // XYZ + + { + // TBI + } + + // ZXY + + { + // TBI + } + + // ZYX + + { + const Table referenceDataTable = Table::Load( + File::Path(Path::Parse("/app/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/" + "EulerAngle/RotationMatrix-EulerAngle-ZYX.csv")), + Table::Format::CSV, + true + ); + + const Angle angularTolerance = Angle::Degrees(1e-8); + + for (const auto& referenceDataRow : referenceDataTable) + { + const Vector3d x = + Vector3d( + referenceDataRow[0].accessReal(), referenceDataRow[1].accessReal(), referenceDataRow[2].accessReal() + ) + .normalized(); + + Vector3d y = + Vector3d( + referenceDataRow[3].accessReal(), referenceDataRow[4].accessReal(), referenceDataRow[5].accessReal() + ) + .normalized(); + + const Vector3d z = x.cross(y); + + // Ensure that the y-axis is orthogonal to the x-axis + y = z.cross(x); + + const RotationMatrix rotationMatrix = RotationMatrix::Rows(x, y, z); + + const EulerAngle referenceEulerAngle = EulerAngle::ZYX( + Angle::Radians(referenceDataRow[9].accessReal()), + Angle::Radians(referenceDataRow[10].accessReal()), + Angle::Radians(referenceDataRow[11].accessReal()) + ); + + const EulerAngle eulerAngle = EulerAngle::RotationMatrix(rotationMatrix, EulerAngle::AxisSequence::ZYX); + + EXPECT_TRUE(eulerAngle.phi().isNear(referenceEulerAngle.phi(), angularTolerance)) + << String::Format("{} / {}", referenceEulerAngle.phi().toString(), eulerAngle.phi().toString()); + EXPECT_TRUE(eulerAngle.theta().isNear(referenceEulerAngle.theta(), angularTolerance)) + << String::Format("{} / {}", referenceEulerAngle.theta().toString(), eulerAngle.theta().toString()); + EXPECT_TRUE(eulerAngle.psi().isNear(referenceEulerAngle.psi(), angularTolerance)) + << String::Format("{} / {}", referenceEulerAngle.psi().toString(), eulerAngle.psi().toString()); + } + } + + { + EXPECT_ANY_THROW(EulerAngle::RotationMatrix(RotationMatrix::Unit(), EulerAngle::AxisSequence::Undefined)); + EXPECT_ANY_THROW(EulerAngle::RotationMatrix(RotationMatrix::Undefined(), EulerAngle::AxisSequence::ZYX)); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_EulerAngle, StringFromAxisSequence) +{ + { + EXPECT_EQ("XYZ", EulerAngle::StringFromAxisSequence(EulerAngle::AxisSequence::XYZ)); + EXPECT_EQ("ZXY", EulerAngle::StringFromAxisSequence(EulerAngle::AxisSequence::ZXY)); + EXPECT_EQ("XYZ", EulerAngle::StringFromAxisSequence(EulerAngle::AxisSequence::XYZ)); + } + + { + EXPECT_ANY_THROW(EulerAngle::StringFromAxisSequence(EulerAngle::AxisSequence::Undefined)); + } +} diff --git a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle/Quaternion-EulerAngle-ZYX.csv b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle/Quaternion-EulerAngle-ZYX.csv new file mode 100644 index 00000000..4eb8baf0 --- /dev/null +++ b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle/Quaternion-EulerAngle-ZYX.csv @@ -0,0 +1,100 @@ +-0.167306652737,0.489611363453,0.516652212916,0.682172769624,1.59536823263,0.998903032253,0.538686954879 +-0.661950429178,0.330190402639,0.60133648629,0.301977412356,2.24198230768,1.66538339835,0.0283488798577 +-0.79568960965,0.487217431567,0.111836326188,0.342037798522,2.19203990898,2.60493360934,0.531171461764 +-0.788441788373,0.291678870697,0.412270623576,0.351163659385,2.80687353652,2.11612507667,0.648386305012 +-0.0751130246808,0.189005525231,-0.42407761332,0.882492562482,2.20283755225,2.86831964156,2.83252964467 +-0.374210970397,0.37403240596,0.0822207221413,0.844574248824,2.94458457381,2.37548992118,2.22782869209 +0.194179460986,0.259381040654,-0.0376611910418,0.945302833683,0.0342206573914,0.529397403605,0.414470475012 +-0.74287504687,0.252593806855,-0.13017041084,0.60612597504,2.57529043036,3.02854538784,1.33581992831 +0.720854097757,0.302993923725,-0.424386625496,0.456574248106,0.107655010554,1.09410975238,2.07799613823 +-0.314864255519,0.693883292103,0.103922236863,0.639207827097,1.62156547245,1.88020412783,1.01279631886 +-0.290089564052,0.561882671987,-0.174186159563,0.754847726078,2.05249773484,2.29773480875,1.87690303066 +-0.833453753963,0.409593795307,0.0566937423201,0.366570023915,2.36916066782,2.73575028943,0.661767549362 +0.0263980012791,0.540776343073,0.219682595318,0.811543991177,0.879636439509,1.04740522242,0.595703229489 +-0.370951654438,0.562530233285,0.449428324608,0.586488523119,1.89454077997,1.45469158419,0.654442618615 +0.0400743056383,0.875936273595,0.373392102994,0.302833340388,2.79218701973,0.524290067561,2.2410406113 +-0.369694092567,0.571297202456,0.443328674507,0.583442774183,2.0207795449,1.4652051882,0.793869188063 +-0.463006622911,0.490354250045,0.559475764335,0.48183445884,2.46949085663,1.43373006955,0.848277170795 +0.381192019623,0.573001871667,0.39857516706,0.606217234533,1.54296571797,0.401565596395,1.51348538074 +-0.323504387586,0.747673384011,0.0673538220954,0.576014656674,1.26750824621,2.01040055043,0.693266967694 +-0.80574403284,0.244266598585,0.0350362707165,0.538407691338,2.75655936516,2.81640082872,1.11421041112 +-0.00873425283404,0.739805551544,0.146430984481,0.656634925599,2.22482228044,1.34280453231,2.00350050363 +0.138622328143,0.884032363649,0.28710485554,0.341820760174,2.59649995776,0.552436606585,2.35542262495 +0.61956774063,0.330129955058,-0.301405306054,0.645216916259,0.0335221013281,0.926450480464,1.54698745762 +0.804234860286,0.174323327833,0.00906399838215,0.568098152441,0.300201616214,0.18453185225,1.93958400525 +0.252465968003,0.415220802004,0.627826079183,0.608018942863,1.70677781725,0.189038681016,1.00359154751 +0.066076665628,0.453811802326,0.861585619621,0.217621098223,2.68988644253,0.0837545219648,0.950328912561 +-0.168222397925,0.7368448073,0.101523022172,0.646880229069,0.830498659902,1.7293443566,0.445444839874 +0.0365804333686,0.641716779747,-0.11519918859,0.757357639054,2.43645357497,1.76887598774,2.65257982282 +-0.139774684268,0.550105113216,0.564192568404,0.59961166417,2.00408713917,0.956915342508,0.905263492612 +0.035730669844,0.393446874326,-0.335116558116,0.855347747289,2.27784239992,2.37036553828,2.8551809702 +-0.829691811116,0.227157533459,0.454184316586,0.23179206226,2.81061836662,2.1083328439,0.35565711525 +-0.50258419707,0.274708182432,-0.241288395159,0.783405673787,2.41270233154,2.95258895539,1.92849993574 +0.096844873456,0.689915793824,-0.0738692349439,0.713568920319,0.649828508133,1.52415841367,0.891911063017 +0.456132356782,0.53964606946,-0.486740962849,0.513623040661,0.136044023198,1.62762095512,1.59634378127 +0.0867375162472,0.666662839071,-0.636291308738,0.378378953831,0.482434142178,2.47935501752,1.69292610015 +-0.682083228278,0.379657310213,0.534460415975,0.323998241137,2.25664861602,1.79437795898,0.163835656947 +0.0777969659037,0.752914532127,-0.524014967118,0.390481310238,0.404145493039,2.40801457228,1.37313511169 +-0.277900809496,0.892862449583,-0.274286921553,0.224353450767,0.69362886054,2.89078706036,0.687159429991 +0.682838838395,0.644665173815,-0.164357052816,0.301868669523,1.42489900935,0.660696831658,2.88504702656 +0.126539474611,0.624282442121,-0.358350611642,0.682527679263,1.46166007456,1.91044704467,2.17226397554 +0.0410656249549,0.669405102651,-0.016900212127,0.741569151072,0.282071848886,1.46311888085,0.364189944881 +-0.285297429902,0.703641298951,0.0331647727166,0.649918761656,1.59193813028,1.93741985752,1.12978832217 +0.402605560635,0.328721627694,-0.0430541329746,0.853227516941,0.240360421317,0.638032723988,0.961502403773 +0.0130588842269,0.808649240772,-0.274595461254,0.520108838225,0.523152761194,2.12874482842,0.949540334853 +0.28192121067,0.718539195278,0.578085608249,0.264648607323,2.34900036594,0.0543984308172,1.76383301867 +0.71455119582,0.541227066121,-0.138081271669,0.421216587831,1.05107404715,0.711908493365,2.50101868946 +-0.257966940664,0.692023076349,-0.546097301948,0.39539202841,0.95835547184,2.87287978618,1.4763873996 +-0.194458823722,0.407778174011,-0.138315941321,0.881346371782,2.57258284554,2.41410671163,2.48553551184 +-0.576294070972,0.425523502567,0.516508351078,0.469077835537,3.08519775225,1.67545108039,1.31560147166 +0.00184513752302,0.913168254065,0.390271081418,0.117510928188,3.04410905992,0.214822785554,2.32330123075 +0.107205386543,0.559702509429,0.532220474058,0.626084237965,1.81151249238,0.627012357569,1.12319211587 +0.929899232787,0.358797855098,0.0106632303306,0.0802359742163,0.733508449587,0.03775450008,2.98395407874 +-0.125683172796,0.363917989933,-0.818371611297,0.426656000194,0.917654350422,3.03657521969,2.35665495658 +-0.837120415343,0.480138251609,0.212407530614,0.153556864049,2.11669307529,2.61443557495,0.0615045233893 +0.250819369563,0.70605297991,-0.145313550534,0.646113616512,1.80245329057,1.39897967225,2.37242754007 +-0.0285444275141,0.135908486422,-0.941345674445,0.307542550194,0.627383118771,3.1117332785,2.86450773645 +-0.797684003594,0.217768533015,0.23842717467,0.509342300244,3.01026904506,2.49531798455,1.09250100932 +-0.278181912159,0.636534167652,0.293290036,0.656825724178,1.05606173412,1.53501725606,0.223949095594 +0.91683751292,0.266868466294,-0.14151800327,0.26108016269,0.470183653727,0.410258241662,2.68634012437 +-0.0382643590057,0.350374787551,0.41894570749,0.836814101969,1.03164630542,0.666779539313,0.29641978525 +0.085277053303,0.652566333531,-0.691720595779,0.297334192277,0.35530368825,2.6110095564,1.72651840248 +0.243247442705,0.833366313997,-0.0610359585645,0.492550383285,2.4250408471,1.01720802189,2.87620701181 +-0.499321600017,0.476577143267,0.0432310535762,0.722276430654,2.48990858831,2.32090722241,1.63994774106 +-0.149659329075,0.212555041053,0.757104682138,0.599345426301,1.84433096976,0.502255084727,0.163254383566 +0.172278664874,0.729157227267,-0.538963290941,0.384926448262,0.248787814527,2.29798302608,1.38515634926 +0.829614050197,0.300523491383,0.0675110134963,0.465691337584,0.606019472836,0.168685044107,2.17143500492 +-0.715459240576,0.447910189152,0.248936228527,0.474895032249,2.43600707629,2.24432089009,0.821141757004 +0.806920623461,0.536818061247,-0.0751390148344,0.234647831871,1.11021194322,0.382443799527,2.8145765442 +-0.722150833463,0.203798055051,-0.147176659158,0.644440499569,2.63563219758,3.09146771967,1.44422918892 +0.0513918485115,0.777746554736,-0.163422293863,0.604782877048,0.420619224495,1.86327293625,0.728909317283 +-0.222250204532,0.424504435047,0.716173545056,0.507440917322,2.19329644126,0.846794953799,0.615572742425 +0.680034439077,0.363251677115,-0.529569499094,0.353776096382,0.597985285072,1.35717930757,2.669391941 +-0.147833631143,0.377095562213,-0.716442442818,0.568026742848,1.24660562654,2.92329073878,2.32983200595 +0.335043160076,0.617822141054,-0.352559434356,0.617854131778,1.06483442394,1.59556875418,2.08041091148 +-0.0781883434356,0.177351414343,0.971630527594,0.135525557104,2.89872478641,0.2013698225,0.336428129342 +-0.087958285748,0.532594971296,-0.0831590706489,0.837669687578,2.63391947642,2.07065925821,2.62691470483 +-0.135008524833,0.685966406092,0.246809296849,0.671049893022,1.9777081397,1.41111551146,1.42915883254 +0.0573002818828,0.837059330414,0.455491405454,0.297617093967,2.7190190672,0.462343470887,2.04401426524 +0.275579318221,0.246255753878,-0.857493719979,0.357936674912,0.679493792273,2.43545087211,2.84132735013 +0.0413199172154,0.737823996369,-0.0602262944871,0.671029960788,0.203886488364,1.66900803243,0.347791978462 +0.319753150616,0.742904258064,0.450889364971,0.377557898311,2.13000149815,0.276127761975,1.89698634871 +-0.733015373775,0.661672037787,0.0990217871436,0.122773213247,1.68112965843,2.82888070725,0.051467035761 +-0.68312640256,0.687307462738,0.0517042953458,0.241398913902,1.62530055172,2.72737738194,0.286545927323 +0.901664550543,0.397172790003,-0.0229072588538,0.169499470997,0.803363890212,0.176871230586,2.84525141043 +-0.443079346309,0.521477964478,0.193525336998,0.703057159396,2.67923688441,2.01079602349,1.72039576007 +-0.461996788616,0.284288010055,-0.140687807459,0.828218712346,2.5861624059,2.79370722806,2.02383381517 +0.296703701826,0.49208635694,-0.167292823591,0.801143583767,0.0520631338461,1.09240462766,0.741029138234 +-0.0258985260018,0.637850141781,-0.336146883899,0.692446196774,1.49134545994,2.0945611022,1.94958957536 +-0.639026470189,0.150131246511,0.740036474469,0.14646431536,2.9660359629,1.42773053121,0.248130127113 +0.262300711036,0.684042132925,-0.146012788756,0.664804454628,1.44079892786,1.40391158844,2.02868691348 +0.0387951140802,0.271760469853,0.93326965832,0.231622388833,2.67026673316,0.0535045372805,0.553862174683 +-0.291222586186,0.499722226703,-0.446930569035,0.682436933274,1.6824874586,2.70622338038,1.94440953608 +0.0463973071449,0.0973973876904,-0.768982963268,0.630100183276,1.3637693958,2.94625507853,3.04836324751 +0.620407055935,0.363293326568,-0.578618340327,0.385115385378,0.0767607485362,1.50411315438,2.10233328343 +-0.263036219996,0.696899243895,0.113318631859,0.657496979843,1.58449298201,1.79017843468,1.04241602683 +-0.736702000074,0.152352805982,-0.118660811694,0.648057402831,2.753555555,3.11895930834,1.43849448517 +-0.581897214853,0.116327754838,0.792885683117,0.138548830052,2.85334781516,1.26962637195,0.0783806820491 +0.521217584782,0.506244198882,0.0541383575648,0.684921950774,0.895993171158,0.690651871949,1.64338168424 +0.200201084496,0.0593190269242,-0.956049783052,0.205838750332,0.416900849569,2.7221793077,3.10763819015 +0.425594576744,0.371844625415,-0.800938645106,0.197732439353,0.000416397828653,2.16462981197,2.27251407607 diff --git a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle/RotationMatrix-EulerAngle-ZYX.csv b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle/RotationMatrix-EulerAngle-ZYX.csv new file mode 100644 index 00000000..1ea87cb6 --- /dev/null +++ b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle/RotationMatrix-EulerAngle-ZYX.csv @@ -0,0 +1,1000 @@ +-0.560316766273,-0.501084059491,-0.659514887443,0.771435648502,-0.0258238057437,-0.63578311654,0.301549600653,-0.865013234801,0.401023617714,0.729649825946,2.42141943681,2.13352363701 +0.377054094,-0.40194616675,-0.8344276417,-0.603497819801,0.576792392678,-0.550546017372,0.702581377275,0.711160892333,-0.0250917022637,2.32425148943,2.15449922763,1.52525181315 +0.859750547899,-0.312607194006,-0.403863513633,-0.381000223124,-0.919196478071,-0.0995824516763,-0.340099728562,0.239488156195,-0.909383086314,2.79285182063,2.72585647115,0.10907091477 +0.226359885836,-0.10668402003,-0.968183723244,-0.707195650314,-0.701514799301,-0.0880414592011,-0.669802593501,0.704624372437,-0.234241284805,2.70116532107,1.82372491575,0.359522671108 +0.115852005002,-0.368086439987,-0.922545763436,-0.992396068014,-0.08177025813,-0.0919982014847,-0.0415735147432,0.926188964296,-0.374760784086,1.87572178724,1.96696618091,0.240724884696 +-0.439045286838,0.830775893025,-0.34212666028,0.14302463168,0.44055968944,0.886256799564,0.887007999309,0.340174331202,-0.312247071328,2.05696452388,0.349179205712,1.9095375441 +-0.755246656821,0.206576418069,-0.622035908014,-0.597652526866,-0.606682493558,0.524163914383,-0.269098391843,0.76763437619,0.581655843261,2.87460124072,0.671340201511,0.733454605492 +0.207014694935,0.971672018542,-0.114010545401,-0.872065592152,0.236091866166,0.428674974444,0.443448440143,0.0106826547262,0.896236219879,1.3608847838,0.114258993939,0.446142107779 +0.106342556079,0.13688343378,-0.984862521534,0.676245912333,0.716180718461,0.172559104534,0.728960031016,-0.684359630649,-0.0164063743446,0.910310261853,1.39657908354,1.66558822479 +-0.20863385938,0.474407738311,-0.855224655018,0.81874760685,0.563008981081,0.11257550133,0.534905850593,-0.676726078301,-0.505882937002,1.98511679333,1.02598416616,2.9226278498 +0.371364293306,0.495978384445,-0.784916558509,0.726495915204,0.371204132097,0.578282956265,0.57818011627,-0.784992314916,-0.222474310141,0.928095080639,0.902561445936,1.93805721115 +-0.00416914923941,0.0103370877133,-0.999937879477,0.211606088842,0.977311535783,0.009220910512,0.977346142039,-0.211554500409,-0.0062619483471,1.95416107814,1.5596499223,2.16735938015 +0.832080537829,0.125189119812,-0.540342172005,0.248674565281,0.786595667797,0.565179808544,0.495785174394,-0.60464447379,0.623379596367,0.149333075266,0.570843704238,0.736470580547 +0.97830581268,-0.0165677382701,-0.206502413849,-0.138406512859,-0.793963465837,-0.592001395365,-0.15414724803,0.607739685198,-0.779032156564,3.1246591401,2.93359368436,0.649819150776 +-0.782324124932,-0.594194042242,-0.186821850204,-0.583255839303,0.804098411032,-0.115058121378,0.218590003129,0.0189521909175,-0.975632730586,0.649568731934,2.95366661619,0.117389586497 +0.0937875445439,-0.267433386484,-0.959001188885,0.186846084655,0.950859555002,-0.246889949796,0.977902059072,-0.156030415159,0.13914766404,1.90809014256,1.85813607477,2.08402250377 +0.460609515762,0.88759924551,-0.00254034628311,0.0213973124001,-0.00824260203406,0.999737072701,0.887344932375,-0.460542765529,-0.0227888592738,1.09211287736,0.00254034901541,1.59358723258 +0.602818886266,-0.739322011964,-0.300020587605,-0.223965251863,0.204111676002,-0.952983730017,0.765799553616,0.641670777226,-0.0425400674162,2.25483749979,2.83687841783,1.52618712272 +-0.541377893772,-0.0477338055655,-0.839423290087,0.431663062713,-0.872540407976,-0.228779887092,-0.72151020535,-0.486204401723,0.492979009007,0.08794353046,2.14537144883,2.70709470903 +0.95182789796,0.202864562046,-0.22993395167,0.231543379753,-0.967116579056,0.105229206058,-0.201025659947,-0.153399778296,-0.967500486853,0.209989585869,0.232009815584,3.03325453074 +0.973800453961,-0.227120328072,-0.0113592447386,0.157841159947,0.71102989684,-0.685217231268,0.163703524981,0.665471894505,0.728250172353,2.91245789437,3.13023316455,2.38663003663 +0.5296537048,0.149866077355,-0.834869517859,0.367567983016,0.846497414173,0.385144006393,0.764434909494,-0.510864254629,0.393264519744,0.275743118412,0.98789569541,0.774966341917 +-0.414948390264,-0.713862080251,-0.564108822655,0.695780933321,0.15053542027,-0.702301915184,0.586265064834,-0.683915212306,0.434227194141,1.04426088018,2.54223909703,2.12455688735 +-0.0099254425884,0.120402256987,-0.992675567394,0.669055907869,0.738574989779,0.0828925606961,0.743145798437,-0.663332707611,-0.0878865250165,1.65304603551,1.44968983374,2.38542840703 +-0.193176704594,-0.189143429912,-0.962760366718,0.849982032454,0.457894505126,-0.260505598175,0.490115604024,-0.868652626253,0.0723139654301,0.774849085007,1.84455931958,1.84156961342 +-0.00944957670276,0.06968993038,-0.997523944126,0.769767005309,0.637238483553,0.0372273100942,0.638255014111,-0.767509236871,-0.0596666429371,1.70556894445,1.5004105561,2.58376915941 +0.126682040981,-0.104220038552,-0.986453163641,0.445049608238,0.894725637353,-0.0373748588057,0.886500144783,-0.434285870629,0.159728757186,2.45316870288,1.73558427213,2.9117384839 +-0.0585333206111,0.850107406243,-0.523346203033,0.385217167862,0.50287615625,0.773772127347,0.920967743172,-0.156310490134,-0.356910978693,1.63954185547,0.550773151238,2.00297541992 +0.264507096064,-0.0574253436012,-0.96267249158,-0.267722828282,-0.963361547614,-0.0160939676896,-0.926477459709,0.261986370813,-0.270190040823,2.92780706581,1.84488416636,0.0594950653443 +0.791309750046,0.394190361913,-0.467378688065,-0.144226236098,0.86319266846,0.483835932871,0.594161318417,-0.315455822091,0.739905366926,0.462165916637,0.486323352928,0.579123172587 +0.0440847393555,0.164731480266,-0.985352766863,-0.941225093161,0.337476780357,0.0143089735481,0.33489081767,0.926807942418,0.16992697876,1.30930806689,1.39943045874,0.0840084155825 +-0.0750789927162,-0.0909251141177,-0.993023548802,0.883296931987,-0.468203724381,-0.0239123904783,-0.462763087114,-0.878929972238,0.115466138353,0.880566010624,1.68898751204,2.93738495601 +-0.0362209143476,0.113782632697,-0.992845183229,-0.34728643024,0.930143869552,0.119266580841,0.937059326156,0.349121604073,0.00582450290268,1.87898756244,1.4511020079,1.52199909387 +-0.861554844748,-0.0991592197614,-0.497886230607,0.388635366327,-0.75982704755,-0.521176946777,-0.326627925218,-0.642518721088,0.693169453683,0.114589141853,2.62043293374,2.49689247345 +-0.979980409756,-0.198730475205,-0.0120247544571,-0.0151917392417,0.13486159092,-0.990747981251,0.198513494639,-0.970730935697,-0.135180778689,0.200077050119,3.12956760933,1.43519054833 +-0.52615236848,-0.84591937346,-0.0870867311851,0.0305411038946,0.0835448836336,-0.99603588961,0.849841706505,-0.526726367314,-0.0181220269269,1.01436530622,3.05439546596,1.55260418343 +-0.664933812459,-0.212311483932,-0.71609137604,0.593325957973,0.432213790757,-0.679084344301,0.453681973021,-0.876421743723,-0.161423649093,0.309065268328,2.34340623714,1.3374198257 +0.696365592359,0.411961248829,-0.587675838572,0.648693546044,-0.711610072613,0.269829182773,-0.307036879054,-0.569121282345,-0.76277737308,0.534210948668,0.628183294565,2.80158485124 +0.391227789022,0.913220259368,-0.113884041799,0.865693378606,-0.323197667668,0.382254158712,0.312275185269,-0.248137110271,-0.917012640682,1.16604546348,0.11413166099,2.74664770995 +0.823074083384,0.10335227197,-0.558450858304,0.556934579184,-0.339467908608,0.758014124891,-0.111233662936,-0.934922374801,-0.336967691813,0.124914821522,0.592517147387,1.98910054951 +0.147390155406,-0.190952745981,-0.970470602796,-0.951829600523,0.239351124166,-0.191654509285,0.268880184577,0.951970634086,-0.146476476538,2.22814616925,1.81441850753,0.918222541873 +0.168467776886,-0.35413098076,-0.919896655401,-0.863224181847,0.397544441893,-0.311130886598,0.475880888486,0.846492566528,-0.238720997794,2.01483330568,1.97377577592,0.916334531372 +0.352057332976,0.214314816725,-0.911111844742,0.169629757265,0.942703215837,0.287291476206,0.920478886096,-0.255694751965,0.295531409616,0.546828319518,1.14597367928,0.771261133656 +-0.408066131949,-0.0807056448263,-0.909378156132,0.830667105575,-0.446093241387,-0.3331560891,-0.378779872317,-0.891340237441,0.249075067893,0.195256086384,1.99980596651,2.21277425173 +-0.272360590888,-0.902027584273,-0.334911847718,0.790148956065,-0.0110488232919,-0.612815266401,0.549075892533,-0.43153697491,0.715745418095,1.27755824732,2.80008098019,2.43351496938 +0.080959654792,0.694545649867,-0.714878922998,0.886823197261,0.277193160724,0.369741218215,0.454961702888,-0.663905333537,-0.593497731257,1.45475508619,0.796450938088,2.58444238419 +0.50004214659,0.36976022084,-0.783093372924,0.847836742035,-0.393261503381,0.355694038205,-0.176438971005,-0.841797344402,-0.510143627293,0.636720090184,0.899624392361,2.53271946844 +-0.846912071592,0.367914301056,-0.383899739608,-0.530297196736,-0.531389219953,0.660613639014,0.0390490220951,0.763062621281,0.645143867581,2.73177154651,0.394015962712,0.797244963158 +0.027150089995,-0.0854364871729,-0.995973633824,0.594986591558,0.802013966613,-0.0525790188474,0.803276931375,-0.591163432577,0.0726083156685,1.87848507087,1.66056348135,2.51484448179 +-0.843406407411,-0.0610840433027,-0.533792442427,0.517431723414,-0.359870757011,-0.77637455513,-0.144672193398,-0.931000417778,0.335124124102,0.0722991590596,2.57851357314,1.97828829639 +-0.559231099313,0.182819915336,-0.808602161831,-0.743091834708,-0.542959544352,0.391164234546,-0.367525649107,0.819616868881,0.439491849178,2.82563148724,0.94177238319,0.727283622723 +-0.115717699605,-0.777096247075,-0.618652436171,-0.276163431985,0.623450103039,-0.731466833051,0.9541190559,0.0862055207214,-0.286749778317,1.42297218947,2.47456630033,1.19718795455 +0.193334496319,0.035639496515,-0.980485389397,0.92727954965,0.319896280245,0.194471094731,0.320584480806,-0.946782021467,0.0287992099373,0.182294609798,1.37291548899,1.42377494408 +-0.149379121721,-0.0518103512441,-0.987421675627,0.933476876319,0.321904588545,-0.158108688096,0.326047234878,-0.945353438338,0.000277940125684,0.333855092999,1.72957152776,1.57255423044 +0.999036457131,-0.00494236621865,-0.0436088332733,-0.0426257073483,0.127326864685,-0.99094445788,0.0104501864265,0.991848497779,0.126993507937,3.13664556095,3.09796998643,1.69825559506 +0.512725001107,-0.228934992109,-0.827467124802,-0.858523054385,-0.128678959691,-0.496366689477,0.00715809534069,0.9648992148,-0.262522888431,2.72164780696,2.16701087231,1.08430549479 +0.352522429717,-0.931102517245,-0.0936805151949,-0.596175227411,-0.146291586777,-0.789413624065,0.721320341297,0.334136011257,-0.606671320579,1.93272601102,3.04777457044,0.915554435114 +0.951477360547,0.08073414385,-0.296939102145,0.287877056731,-0.574434722344,0.766258148389,-0.108708935116,-0.814559235281,-0.569803141132,0.0846485945093,0.301485573008,2.21020025081 +-0.502232754787,-0.805430904226,-0.314711484595,0.864655763825,-0.462901467063,-0.195173363639,0.0115182508365,-0.370139555178,0.928904752701,1.01323474268,2.82143997529,2.93449388497 +0.111646218899,0.97683245805,-0.182574562043,0.309506930773,0.140404245425,0.940474405643,0.944320169015,-0.161508503696,-0.286660812852,1.45699600947,0.183604392918,1.86665505247 +0.881451561009,0.283395228011,-0.377796625628,0.43263642816,-0.163739720405,0.886574884029,0.189390777557,-0.944921398161,-0.266935731354,0.311071811524,0.387415397471,1.86324961457 +0.0883004686074,-0.389352113437,-0.91684674783,0.516381870749,0.804994148988,-0.292120152773,0.851793866382,-0.447648692455,0.272135733299,1.79381215933,1.9814833618,2.32079198895 +0.206420978256,0.338936477654,-0.917884766107,0.10705918099,0.924632305162,0.365504352939,0.97258866511,-0.173715757393,0.154577243253,1.02376680191,1.16271709356,1.17069308779 +0.0831787826519,0.530479279071,-0.843607150629,-0.0152383366107,0.847118811818,0.531185007095,0.996418126699,-0.0313281525246,0.078545933348,1.41526341531,1.00396590744,1.4239908821 +0.193938799791,-0.777159349818,-0.598674441517,-0.116316378339,0.587739769526,-0.800645029615,0.974093548929,0.224911778943,0.0235891845281,1.81534982166,2.49974746538,1.60025053142 +0.567389840806,0.135924764611,-0.81215345035,0.402562544928,-0.906174701572,0.129579348863,-0.718339868009,-0.400464565968,-0.568872538828,0.235130326919,0.94783361991,2.9176311375 +-0.32586422466,-0.0593469530139,-0.943552036856,0.889619729036,0.318541521118,-0.327273642437,0.319983194555,-0.946049279103,-0.0510050655418,0.180147308847,1.90839717756,1.41619166169 +0.0697644076782,0.0966317298963,-0.992872215443,0.867133993549,0.486170152822,0.10824610726,0.493164845314,-0.868504974817,-0.049875285106,0.945482525264,1.45132860529,2.00256069862 +-0.0413516797182,0.605039386526,-0.795120984088,-0.180794619784,0.778133781011,0.601515689161,0.982651181265,0.168627280124,0.0772107269509,1.6390356424,0.919207048713,1.44313412107 +0.167020906814,-0.848299569777,-0.502485678008,0.0692794571405,0.518482215912,-0.852277272137,0.983516331082,0.107536187856,0.145367103555,1.76519881867,2.61512127821,1.73973377344 +-0.159458168952,-0.151213653532,-0.975554982223,-0.590894884253,0.806248986357,-0.028386753286,0.790832680229,0.571923948602,-0.217914361386,0.758866691142,1.79236015637,0.129536218365 +-0.939122789105,0.264158934941,-0.219700805812,0.0970311950078,0.817323468678,0.567950081207,0.329595713229,0.512057032604,-0.793198752635,2.86739495777,0.221507772511,2.52019247195 +-0.572039870856,0.348733944154,-0.742398156211,-0.276982398018,0.76981467484,0.575035753314,0.772043481508,0.534574599655,-0.343771523056,2.5941207155,0.836642851623,2.10961601906 +0.148953078449,0.846331957801,-0.511405120843,-0.743997290062,0.436590962779,0.50582246253,0.651368569092,0.305140211089,0.694700251026,1.3965820831,0.536819113007,0.629347700105 +0.188030967481,-0.0106071738618,-0.98210582074,-0.101180465446,-0.994830682412,-0.00862709355513,-0.976937494766,0.100992084807,-0.188132214482,3.08524053396,1.7602576808,0.0458244438036 +-0.195982660517,0.780922576097,-0.593085766917,0.615838290075,0.568683625112,0.545290871927,0.76310811636,-0.25837736873,-0.592374153786,1.8166811229,0.63488604296,2.39755677795 +0.017759472228,0.0161011765066,-0.999712635341,0.865432069032,0.500477923387,0.0234346344631,0.500711428906,-0.865599561181,-0.00504625071687,0.7364631341,1.54682223984,1.78289077561 +0.546411192022,-0.369860856696,-0.751423819104,-0.28958587386,0.758430015646,-0.583886918014,0.78585929459,0.536644070173,0.307308169521,2.54654497911,2.29137532727,2.05527327049 +-0.150958165993,-0.978445350541,-0.140912483919,0.425557456428,0.0643388596775,-0.902641325452,0.892251356625,-0.196227437275,0.406672238371,1.41771959998,3.0002096188,1.99409574147 +-0.519096120187,-0.51899557358,-0.67910441952,0.83062824788,-0.119020975978,-0.543958381773,0.201484321549,-0.846449999635,0.492875710791,0.785301306243,2.3950507762,2.30696636396 +-0.959054191813,0.135148919872,-0.248897221004,0.0454584309539,0.940864387785,0.335719726636,0.279550689896,0.310658933969,-0.908483592875,3.00159553085,0.251541477064,2.78761866334 +-0.884343045258,-0.425169614909,-0.192790499925,0.36643584308,-0.376322870483,-0.850944105131,0.289244103154,-0.823171850654,0.488595899574,0.448149282123,2.94758744656,2.09201485526 +0.0393319811676,-0.996009982865,-0.080106861698,-0.929440559849,-0.00703299116212,-0.368904842395,0.366869514903,0.0889643246981,-0.926008697565,1.61026536413,3.06139986779,0.379110441336 +0.328899450964,-0.0290843164401,-0.94391697394,-0.681326183069,0.684814530013,-0.258502788666,0.653926435787,0.728136774253,0.205419216626,3.05339287208,1.90729366059,2.24226649192 +0.4452836381,-0.88543605725,-0.133137035274,-0.206434105783,0.0431660433814,-0.977507878571,0.871267720973,0.462752289265,-0.163563067867,2.03675930094,3.00805912809,1.4050056228 +-0.178820591251,0.474718271581,-0.861780574608,0.126587484869,0.879719533504,0.458333013263,0.975704260941,-0.027131255027,-0.217405359137,1.93104590871,1.03876931101,2.01370545055 +-0.0906539106993,-0.947904221701,-0.305384110517,0.474799808027,0.228414069542,-0.849936559476,0.875412480361,-0.222046390011,0.429358113829,1.47545015817,2.83125087009,2.0385673106 +-0.241930636551,0.970292866985,-0.0011486406762,0.515485810961,0.129532816375,0.847051136697,0.822036462571,0.204335512722,-0.531510162128,1.81515159511,0.00114864092878,2.13117915573 +-0.0504785098587,0.0144397985164,-0.998620754972,-0.446775442817,-0.894594107809,0.00964810702781,-0.893220926612,0.446646252075,0.0516091248669,2.8629749396,1.51826895874,0.184812478724 +0.33917003664,0.827790575659,-0.446907651641,-0.595988094718,0.556645722771,0.578743233459,0.727847427144,0.0700592761188,0.682150878201,1.18193087865,0.463305582607,0.703569927662 +0.41324957113,0.361488121748,-0.835793712465,-0.252035981692,0.927380537411,0.276483639234,0.875044373671,0.0963933434756,0.474347622994,0.718685728842,0.989576825994,0.527729686655 +0.204287436229,0.833875229096,-0.512756029412,0.974062578824,-0.121090321064,0.19115236509,0.0973074300027,-0.53850648691,-0.836983887313,1.33054262405,0.538391880512,2.91706116277 +-0.187841259059,-0.217979891274,-0.957705815162,0.660704045396,0.693440714479,-0.287419797334,0.7267639409,-0.686749402987,0.0137634190893,0.859527877613,1.86267207686,1.61864589547 +-0.0823313277451,-0.46796775617,-0.879902114816,0.640674993704,0.651435870494,-0.406407257656,0.763385292571,-0.597191330998,0.246181659079,1.39664478913,2.0659364993,2.11543387808 +-0.17817460941,0.42071822816,-0.889522333084,0.163456150579,0.904082236765,0.394863768917,0.970327725771,-0.0750431986231,-0.229853481464,1.97139666136,1.09629863239,2.09795628134 +-0.10707242517,0.979974701299,-0.167884128443,-0.966323640085,-0.0628307784214,0.249541411183,0.233995979411,0.188949406185,0.953700164371,1.67962503442,0.168682940009,0.255918614953 +0.348315608256,0.925677245356,-0.147641032489,-0.677772086732,0.357509704847,0.642504326357,0.6475347369,-0.123727314565,0.751924408527,1.21090225816,0.148182739909,0.707089159608 +-0.907845472878,0.381231285192,-0.174583231055,-0.368215210728,-0.525662859729,0.766874250768,0.200584535704,0.760487518039,0.617595805478,2.74402441455,0.175482482929,0.892806732726 +0.572149535155,0.789313351684,-0.222776440126,0.815118551442,-0.517220600023,0.26089192783,0.0907009179502,-0.330858404405,-0.939311481734,0.943573379068,0.224661560085,2.87067340625 +0.308553679273,0.949932313876,-0.0492262740948,-0.705167487511,0.263168487531,0.658392862757,0.638383459658,-0.168436772188,0.751062988177,1.25673041581,0.0492461768705,0.719743793543 +0.0554611440226,-0.995038703964,-0.0825956361896,-0.712300380668,0.0185385476164,-0.701629881029,0.699680090616,0.0977460989817,-0.707738278554,1.62647638941,3.05890281615,0.781064051522 +-0.659894230355,-0.129806397485,-0.740060743396,0.719110595483,-0.394576024218,-0.572004993489,-0.217760318261,-0.909648316815,0.353723597611,0.194228068608,2.30843198036,2.12463006487 +-0.532340450175,-0.473400458591,-0.701787468478,0.76726384383,0.0804368724457,-0.636267320788,0.357658830533,-0.877166982596,0.320403254641,0.726861560453,2.36368911992,2.03729349837 +0.926419993807,0.361707997797,-0.104466833987,0.295222399683,-0.525722206311,0.79778436718,0.233644451677,-0.76992433792,-0.593823866209,0.372234720641,0.104657786569,2.21066603061 +0.887975882437,0.284762937821,-0.361121726642,0.434644793158,-0.776236823821,0.456662125783,-0.150275533572,-0.562464632299,-0.813050306822,0.310326635022,0.369470513594,2.6298375117 +-0.641463166004,0.230314092754,-0.731765280223,-0.299154555455,0.803259571275,0.515053990476,0.706421657801,0.549299080497,-0.44636191768,2.79688283082,0.820908433018,2.2848668376 +-0.939211019739,-0.0988813554642,-0.328793457877,-0.0845558130362,0.994751085685,-0.0576245781707,0.332765645587,-0.0263202406739,-0.942642174978,0.104894880227,2.80656693584,0.061054936239 +0.871474404715,-0.482543375763,-0.087659867865,0.0519316255797,0.268524370113,-0.961872012754,0.487683778889,0.833694520291,0.259071377512,2.63590616666,3.05382012897,1.83389364994 +0.0228231504627,-0.999566173368,-0.0186163600655,0.968907420239,0.0267043241983,-0.245978230897,0.246368656304,-0.012423531231,0.969096559205,1.59362541609,3.12297521805,2.89301986367 +0.433732372951,0.161898116534,-0.886377588005,-0.0994171240354,0.986317810318,0.131504420071,0.895540319641,0.0310833864377,0.443893409486,0.357250735778,1.08946117701,0.288014952491 +0.0182221809682,0.606902880983,-0.79456708035,0.193988858279,0.777451598311,0.598278643399,0.980834478893,-0.165039102452,-0.103565533249,1.5407804729,0.91829424173,1.74220353889 +-0.255686336162,0.791643298008,-0.554910250598,0.892415470357,0.414005347557,0.17942742394,0.371778328803,-0.449333351659,-0.812330236615,1.88320170436,0.588255078736,2.9242032219 +-0.664126596502,-0.193435714814,-0.722162369591,0.1800586924,0.896130133859,-0.40562254681,0.725613348217,-0.399416333446,-0.56031407395,0.283422341046,2.33466935391,0.626599901677 +0.63113594302,-0.0432442597814,-0.774465851684,-0.764779470149,0.132047534656,-0.630615422132,0.129536803527,0.990299642829,0.0502676232257,3.07318143918,2.25572234433,1.65034014799 +-0.383358848765,0.735066179701,-0.559208104853,-0.917563404794,-0.234002105481,0.321434927807,0.105420070468,0.636333816554,0.764176604361,2.05151897859,0.593430281972,0.39816265012 +0.0250981400865,0.204519575915,-0.978540661614,0.783646332279,0.603738004066,0.146283452079,0.620700015523,-0.770501243032,-0.145118314543,1.4486893011,1.36325581905,2.35219612278 +-0.900473998984,0.41081652551,-0.142745786354,-0.336713281887,-0.45080017824,0.826682142725,0.275264859644,0.792470177147,0.5442612198,2.71357613437,0.143235059331,0.988560852492 +-0.318166691861,-0.344905444332,-0.883068621717,-0.279426058735,0.924210928408,-0.260298362482,0.905919993096,0.163934115671,-0.390428702619,0.825701882093,2.05923065676,0.588024875898 +0.657427827751,-0.405824441904,-0.6348977663,0.491024129417,0.86984703907,-0.0475545260976,0.571562731141,-0.280486454174,0.771131242653,2.58855592808,2.45371646564,3.08000212625 +-0.465065624726,-0.780636618555,-0.417516987042,0.700233717538,-0.0358154775215,-0.713014721021,0.541651830534,-0.623958108642,0.563284628886,1.0335064016,2.71088163666,2.23941248475 +0.767878836971,-0.143231717264,-0.624377103121,-0.163094487635,0.898851731621,-0.406774818131,0.619485496065,0.41418623798,0.666848918746,2.95718283348,2.46725881263,2.593855943 +0.149359917095,0.143930479782,-0.978251313393,0.968623365462,0.177462063722,0.173999976495,0.198646397013,-0.97354570151,-0.112908706594,0.766888122579,1.36185623362,2.14639836497 +-0.455908372612,0.061804669038,-0.887878222882,-0.653320226537,0.654221742827,0.381007339576,0.604417270915,0.753773237849,-0.257886929722,3.0068502636,1.09271267423,2.16581963664 +-0.0334876152211,0.984329252079,-0.173131461982,0.0909324239954,0.175510893984,0.980268953073,0.995293863084,0.0170836060057,-0.095384886186,1.60480395632,0.174008262587,1.66779577037 +0.169937828193,-0.826088202524,-0.537307562017,-0.872625106038,0.127188747417,-0.471538383213,0.4578717712,0.549000277033,-0.699251125817,1.77367993837,2.57435121608,0.593301402375 +-0.944837500855,0.0186547957834,-0.327007791303,-0.327298471238,-0.0154821649446,0.944794164511,0.0125621536332,0.999706107395,0.0207338161752,3.12185129879,0.333135547502,1.54885452247 +-0.752014753189,0.658870036949,-0.0190810219191,0.108445069638,0.15222588191,0.982378210135,0.650164192999,0.736693664482,-0.185927316053,2.42211748198,0.0190821799624,1.75784633402 +0.358546481354,0.541383204972,-0.760492370825,0.931032176457,-0.148044899931,0.333559281097,0.0679963757111,-0.827639373749,-0.557126161575,0.985837809296,0.864071034192,2.60211921411 +-0.967664712017,-0.177897773349,-0.178822222763,-0.0406617598846,0.809680399275,-0.585460735074,0.248941009879,-0.559258467319,-0.790732786934,0.181812212967,2.96180340525,0.637330525004 +-0.515531558387,-0.071841173009,-0.853853651493,0.854486631435,0.0311775685505,-0.518536937854,0.0638733826155,-0.996928686055,0.0453143014213,0.138461900595,2.11824815151,1.65796364658 +-0.29256629075,0.194896846608,-0.93617315957,0.0140346268147,0.979779199813,0.199588949754,0.956142246095,0.0452541577758,-0.289385670753,2.5539388029,1.21158157999,2.53781375552 +-0.245648532962,-0.86655562607,-0.434440036345,-0.316557807677,0.49531390153,-0.808984111926,0.916213922974,-0.0612003748119,-0.395988082486,1.29456638201,2.69217616787,1.11559355972 +-0.185807438554,-0.4878425087,-0.852927477857,0.439851268844,0.734917709418,-0.516165498344,0.878638979942,-0.471068622484,0.078024969313,1.20688418895,2.1200249104,1.72082319289 +0.0241802922476,-0.33222786235,-0.942889156235,0.576449245182,0.775212479337,-0.258363851204,0.816775110539,-0.537280428973,0.210257364785,1.64345047106,1.91039281054,2.25389745113 +-0.178398785044,0.0628702811594,-0.981947657078,-0.817605700441,-0.564703812297,0.112385599535,-0.547443871187,0.822895456376,0.152145574288,2.8027686403,1.38049698139,0.636211357708 +-0.289122934283,-0.949572437989,-0.121326476434,0.449301123833,-0.0226918297644,-0.893092145853,0.845302566537,-0.312725544006,0.433204691955,1.27523730245,3.01996653142,2.02242194386 +0.273523005457,-0.803928392108,-0.528094978056,-0.946753016018,-0.321960665712,-0.000237476333486,-0.169834896727,0.500040468459,-0.849185278815,1.89874371602,2.58523700962,0.000279651959614 +0.95545429265,0.293290782383,-0.0329789573228,0.0436444360387,-0.029893485913,0.998599791059,0.291894258011,-0.955555805,-0.0413623702303,0.297834156504,0.0329849383001,1.61219303097 +0.444807916268,0.785447646515,-0.430369506598,0.396356363922,0.258275066924,0.881019649375,0.803148523253,-0.562464207207,-0.196434378881,1.05551631398,0.444902093291,1.79017064134 +0.0484857485239,0.0237230569159,-0.998542111661,-0.419559057124,0.907727257457,0.00119316996672,0.906432198113,0.418889535128,0.0539650589251,0.455034055642,1.51679183223,0.0221064447771 +-0.180007234931,-0.174308185811,-0.96809816224,0.886820088435,-0.454591894488,-0.083044206387,-0.425614292665,-0.87347745582,0.236409830705,0.769314873248,1.82406660507,2.80378490203 +0.224702370329,0.562219942149,-0.795875355454,0.95176947543,0.0484754271595,0.302960391143,0.208910771403,-0.825565787573,-0.52421123603,1.19057457822,0.920451976857,2.61755491118 +0.126085134807,0.143305326464,-0.981614039319,0.992001377104,-0.0241824290543,0.123888974281,-0.00598386195984,-0.989383036812,-0.145208126026,0.849234107326,1.37874123496,2.43525411324 +0.244837586691,0.196909877933,-0.949358233817,0.949778426029,-0.245511309497,0.194023551041,-0.194873029414,-0.949184227051,-0.247131150455,0.67732517545,1.25118698552,2.47600112525 +-0.370515852726,0.8294012714,-0.418104692486,-0.510304350409,0.194344972112,0.837746681144,0.776084707253,0.523759069434,0.351239183965,1.99092500281,0.431357889187,1.17379194486 +0.799604834096,-0.582039281432,-0.147859339103,-0.57745359407,-0.677619496759,-0.455389025239,0.164861930068,0.449513172757,-0.877928500239,2.51238056014,2.9931891845,0.478502190373 +0.337545541104,0.259312368683,-0.904886790228,0.368952642882,0.847939341832,0.380621622984,0.865989003967,-0.46233750445,0.190544160204,0.655066134509,1.13111367839,1.10665837995 +0.825803509895,-0.279099619429,-0.490053023131,-0.27590206778,0.557925325862,-0.782686003297,0.491860358273,0.781551491072,0.383732530239,2.81567186904,2.62944207391,2.02663489676 +-0.691638649048,0.71053989151,-0.129495334724,0.681087178225,0.701317304861,0.210414575446,0.24032526875,0.0573332405804,-0.968997763013,2.3427153952,0.129860012142,2.92776563791 +-0.0270341988939,0.235469272594,-0.971505725024,-0.983106594761,0.169734097496,0.0684964195006,0.181026449524,0.956945430947,0.2269027694,1.68510571088,1.33150306179,0.293176678678 +-0.96757675264,0.0915696792683,-0.235393758603,-0.107214171112,0.694935734544,0.711034068359,0.228692696131,0.713217581592,-0.662586094062,3.04723552777,0.237623691319,2.32093881984 +-0.111766677339,0.540700191577,-0.833757466333,-0.993730122199,-0.0583292667692,0.0953841751645,0.00294178011032,0.839190681232,0.543829335787,1.77463281757,0.985878513163,0.173627527569 +-0.763984669567,-0.622739552659,-0.168887164171,0.547155032289,-0.486541865169,-0.681100861899,0.341977770196,-0.612758078684,0.712445606134,0.683892987282,2.97189214819,2.37868348537 +0.809232930398,-0.387764753994,-0.44133950641,-0.44484734997,0.0862487543149,-0.891443765811,0.383735455207,0.917714360757,-0.102700791029,2.69474284047,2.68450177518,1.45609475304 +-0.775936722214,0.359192694426,-0.518558397281,-0.482208171091,-0.867731434154,0.120488331028,-0.406690893497,0.343544417,0.846510337028,2.70805072429,0.545164085228,0.141385643998 +-0.0622618398606,-0.0936917168473,-0.993652517479,0.994257462049,-0.0926442958321,-0.0535642941707,-0.087037707101,-0.991281441693,0.0989218929187,0.984267873652,1.68352794614,2.64531370524 +0.310665329744,0.514126232371,-0.799475621944,-0.539298271976,0.787946843695,0.297148355801,0.782716057545,0.338842129463,0.522055154712,1.02725119668,0.92642176308,0.517456633536 +0.835845975693,-0.459464379539,-0.300423016516,-0.543695611799,-0.768496957383,-0.337353684141,-0.0758721729514,0.445314395038,-0.892153856094,2.63897993898,2.83645652684,0.361515430054 +0.0226942120263,0.967223802294,-0.252909250556,-0.652975550033,0.205901249671,0.728853624841,0.757038905077,0.148602798292,0.636246260924,1.54733738298,0.255686087138,0.853133639087 +-0.774852096412,-0.127476405357,-0.619155872752,0.420596199781,0.627230455253,-0.655500413984,0.471914256423,-0.768330477126,-0.432394741532,0.163056462715,2.47392536072,0.987673650828 +-0.654317451811,0.548195294444,-0.520913228288,-0.167221688784,0.566899203114,0.806636349484,0.737499545122,0.614904230477,-0.279261899095,2.44421679224,0.547920444888,1.90408670794 +-0.145538513169,-0.620556769268,-0.770537369178,0.664409390171,0.515769719342,-0.540871296024,0.733061186694,-0.590669867799,0.337239386545,1.34043083279,2.26190885987,2.12832442875 +0.475540721139,0.574689848314,-0.666027477499,0.786336598677,-0.617119553831,0.0289518541829,-0.394380243064,-0.537489566898,-0.745365138275,0.87952618985,0.728870422499,3.10276965855 +0.397439205084,0.689258134892,-0.605776610433,0.872511672344,-0.488302841173,0.0168438987866,-0.284192645728,-0.53524158918,-0.795456460987,1.04774631983,0.650741594248,3.12042068157 +0.315912675492,0.711194136751,-0.628014395786,0.837292547385,0.102347836997,0.537090411715,0.446251466728,-0.695505442188,-0.563144571429,1.15277585766,0.678999047487,2.37987060633 +0.797147110715,-0.599328315778,-0.0732260458219,-0.434707750143,-0.485518706654,-0.758485832072,0.419029421216,0.636456719186,-0.647562497956,2.49691399705,3.06830100903,0.864125239242 +0.360041263794,0.0439800724039,-0.931899158491,0.253162261407,-0.966013441695,0.0522197267694,-0.897930486043,-0.254722954788,-0.358938794977,0.121550687701,1.19961403322,2.99712257175 +0.269434966754,-0.312138122341,-0.911029412956,-0.780936083512,0.482741548266,-0.396357705926,0.563510099429,0.818248367037,-0.113692469768,2.28289904598,1.99581892999,1.29145336622 +-0.911233675351,0.385235027091,-0.145764065562,-0.387127132361,-0.680171830485,0.622494067766,0.140661907767,0.623666781957,0.768930408286,2.74161908624,0.146285243003,0.680542118177 +0.464813365767,0.583235179072,-0.666172095556,0.690107319214,0.23272659324,0.685266532647,0.55470751119,-0.778251282487,-0.294320434793,0.897913621092,0.729064316187,1.97647043351 +0.436956134041,-0.813798476874,-0.383146676825,-0.888534732217,-0.456777471274,-0.0431320226872,-0.1399119958,0.359285931779,-0.922679929692,2.0635528078,2.7483921076,0.046712456408 +0.0931894073311,0.0831443189942,-0.992170729552,-0.559198207897,0.828860980482,0.0169363313067,0.823779763435,0.553241807217,0.123735217709,0.728493317879,1.44558044859,0.136030290131 +-0.373807689614,0.927456297087,-0.00962435347866,-0.784634296125,-0.310676521104,0.536497083477,0.494587537783,0.208098333077,0.843847291422,1.95392593363,0.00962450206591,0.566310195796 +0.106870662127,0.0257013292985,-0.99394069403,0.380204094963,0.922634194192,0.064737855091,0.918707520242,-0.384818899459,0.0888307765892,0.236008275627,1.46065609731,0.629779665759 +0.846475489083,-0.0887283139679,-0.524982411783,-0.336683669344,0.674642794883,-0.656887514047,0.412460123138,0.732792184465,0.541195215433,3.03715315628,2.58889820558,2.25992843497 +0.311588034375,-0.865725428943,-0.391704453021,-0.298495550939,0.302181727682,-0.905310228333,0.902116014104,0.399005871056,-0.164258978322,1.91627713464,2.73910930683,1.39130947622 +0.209008122247,0.546443180805,-0.810996581366,0.961296371795,0.0374287401232,0.272962222635,0.179512925461,-0.836659392803,-0.517470936409,1.20547678979,0.945853519314,2.65619343345 +0.734103598956,0.07071923081,-0.67534487219,0.599799507882,0.398710470893,0.693736629237,0.318327592811,-0.91434607824,0.250277431786,0.0960377753513,0.741432224139,1.22456172045 +0.778262972507,-0.3735192406,-0.504767394476,0.155260362176,0.893352681044,-0.421681404864,0.608441423279,0.24980865512,0.753256045622,2.69412174751,2.61248016107,2.63124783382 +-0.06209899661,0.184121803699,-0.980939792252,0.443916372641,0.885365528899,0.138080173588,0.893913848601,-0.426880594124,-0.1367149942,1.89608683732,1.37524037069,2.351226542 +0.0197679732018,-0.010241810195,-0.999752135561,-0.737256840326,0.675270537952,-0.0214953940862,0.675323314145,0.737499020947,0.00579788527466,2.66356918805,1.59306175645,1.83425356807 +-0.0121088764144,0.834900072954,-0.550268337534,-0.87920202186,0.253238864738,0.403576364699,0.476295265428,0.48868389125,0.730979394076,1.58529869407,0.582685570833,0.50445683435 +0.88858482256,0.0220882169182,-0.458180230683,0.458408420731,-0.0791131529881,0.885213436877,-0.0166952962735,-0.996620900693,-0.0804241716444,0.0248526292044,0.47594680705,1.66140044281 +0.926668445627,-0.24080623103,-0.288613844047,-0.306845305798,-0.0411526735597,-0.950869294787,0.217098019771,0.969700374629,-0.112025145639,2.88735354243,2.84881389713,1.45352351398 +-0.276792346635,-0.960659826196,-0.0227748804117,-0.349154766197,0.122625497951,-0.929006962565,0.895252448244,-0.249190059163,-0.369360756345,1.29026716882,3.11881580385,1.19237216264 +-0.225733122822,0.252239770623,-0.940967403993,-0.894613671042,-0.436021771693,0.0977312344876,-0.385630570425,0.863863480375,0.324081703322,2.30079485298,1.22547698412,0.292890641688 +-0.76099033271,-0.391078281545,-0.517640310664,0.0209840650285,0.782632930148,-0.622129701641,0.648423767714,-0.484296886581,-0.587369681812,0.474711233986,2.5975019517,0.814129434485 +0.827514754108,-0.542707881116,-0.143831455212,-0.375090926328,-0.34377771477,-0.860885404577,0.417763244817,0.766345247654,-0.488045932959,2.561130873,2.99726060545,1.0550619298 +0.90705235144,-0.264751735592,-0.327356915687,-0.397499234851,-0.282289642594,-0.873101893239,0.138745774854,0.922073248818,-0.361290096425,2.85760063178,2.80808764713,1.17844977305 +0.672744984713,-0.563907206311,-0.478981052041,-0.738558235518,-0.550429246035,-0.389306277703,-0.0441125638812,0.615659246484,-0.786776825998,2.44397832097,2.6420990733,0.45948825795 +0.393545328688,-0.376314533682,-0.838754699544,-0.884735043776,0.0928117706199,-0.456760196984,0.249731809313,0.921831517672,-0.296413016656,2.37857248326,2.14660048936,0.995161928602 +0.251735336815,0.820088907222,-0.51389055688,-0.489959028582,0.565908630046,0.663089415351,0.834607375063,0.0848622807345,0.544269163925,1.27296556321,0.539713872861,0.883495669949 +-0.435099471081,0.591402833748,-0.678919095695,0.464818777388,0.79332254098,0.393170255947,0.771123825629,-0.144506173599,-0.620069360103,2.20508727701,0.746289436423,2.57649435273 +-0.0418591528009,0.200666427559,-0.978764934076,-0.641735167303,0.745437411642,0.180274902222,0.765783119671,0.635654033398,0.0975713249446,1.77644792595,1.36434706379,1.07470635657 +-0.262259034085,0.961786759494,-0.07865385116,0.879721728912,0.271788067186,0.390155002808,0.396623094035,0.0331281722518,-0.917383586883,1.83700342749,0.0787351754974,2.73947553411 +0.31109468187,0.587174612247,-0.747292495376,-0.327458921872,0.804386074861,0.495715338733,0.892183138934,0.0904931892576,0.442515795537,1.08358117117,0.843978161138,0.842039471516 +0.59732991534,-0.799572895835,-0.0622909021204,0.585714843968,0.487981748273,-0.647156808593,0.547845866824,0.350081415673,0.759807810308,2.21241397163,3.07926139789,2.43609074267 +0.485681933912,0.268724568005,-0.831805365228,0.84826921902,0.0848843245764,0.52271788137,0.211074373466,-0.959469519053,-0.186723996514,0.505368152247,0.98235231713,1.9138865016 +-0.223507801578,-0.0010630473156,-0.974701560768,0.0502442495358,0.998657342322,-0.0126106310458,0.973406275931,-0.0517917228638,-0.223154295097,0.00475616194303,1.79621075958,0.0564507745785 +0.0665140840491,-0.337151105694,-0.939097976013,0.433891061721,0.857308869159,-0.277056040218,0.898506774144,-0.389038089127,0.203309965389,1.7655777484,1.92159667022,2.20386320917 +0.1386093024,-0.942399697123,-0.304417923506,-0.990336002124,-0.130439140426,-0.0471193542112,0.00469725286501,0.308007210157,-0.951372426712,1.71683051223,2.83226536322,0.0494873317442 +-0.0510119200189,0.316743357402,-0.947138548238,0.413008469212,0.870168260526,0.268758632851,0.909297414697,-0.377466348056,-0.175206642883,1.73047644993,1.24419610441,2.1485136111 +0.326644067045,-0.466208240096,-0.822163931543,0.582911982192,0.784109496116,-0.213039712537,0.74398741554,-0.409661048878,0.527883084168,2.18195158536,2.17639063656,2.75800932967 +-0.779971968017,0.180803049305,-0.599127687951,-0.618318497428,-0.0749091620237,0.782349572239,0.096571035234,0.980662467318,0.170220916303,2.91380862585,0.642411164009,1.35655876936 +-0.965545911371,0.170984187474,-0.196177217508,-0.107032800368,0.426209463478,0.898270267173,0.237202598385,0.888318580733,-0.393223888445,2.96632416978,0.197457852277,1.98342226435 +0.357894922673,-0.112243915778,-0.926991115219,-0.772486773174,0.522118842842,-0.361463828371,0.524571643912,0.845454444261,0.100156742578,2.83768543967,1.95528294643,1.84110129192 +0.178918180062,-0.527404619739,-0.830561648477,-0.890239852323,0.272628748231,-0.36489254716,0.418880997634,0.804684989742,-0.420738371325,1.89785587131,2.161477248,0.714433483793 +-0.579985095785,0.136912896528,-0.803039318734,-0.310178405532,0.874404784106,0.373102707406,0.753263994499,0.465479464956,-0.464674318523,2.90977376822,0.932377994148,2.46506537899 +-0.208051987035,-0.0800734190627,-0.974834662007,0.492456021879,0.852535556028,-0.175129073038,0.845104394265,-0.516499151275,-0.137939079039,0.367397506291,1.79561448054,0.903636074587 +0.261740120374,0.478956319683,-0.837909871777,0.947435942666,-0.293025341739,0.128457322263,-0.184003380217,-0.827488364229,-0.530476920455,1.07065951354,0.993442474073,2.90401160271 +-0.820698674969,-0.0951247178674,-0.563387054301,0.383056764053,0.640014052758,-0.666070212354,0.423935372925,-0.762452162646,-0.488820518453,0.115392091725,2.54311296486,0.937687300991 +-0.0493135197424,0.407113363326,-0.912045440848,0.00401531619889,0.913229863706,0.407424954159,0.99877527703,0.0164294076877,-0.0466692677958,1.69133876722,1.14824451558,1.68484615023 +0.396532520154,-0.429700355903,-0.811245686952,-0.843551345983,0.178097611412,-0.50665803803,0.362192058377,0.885233779827,-0.291852818904,2.31607258594,2.19531322406,1.04818448196 +-0.34280342799,-0.219401003404,-0.913427068497,0.125782473762,0.952868603329,-0.276080050139,0.930948215022,-0.209534303864,-0.299049822691,0.569327283004,1.98996632296,0.745480968234 +-0.22821499614,-0.967257019425,-0.111048520521,0.163103573858,0.0744644674866,-0.983794829869,0.95985162381,-0.24262914387,0.140769168548,1.33909338056,3.03031461959,1.71291954827 +0.76944289689,0.245120148833,-0.589808223969,-0.0998184985973,0.958230020869,0.268013981806,0.630867573872,-0.147347683191,0.761770808377,0.30840373262,0.630821339389,0.338304362672 +-0.175937726642,-0.247384427405,-0.952809981802,-0.509788916774,0.85090471781,-0.126792829226,0.842117080149,0.463424326386,-0.275820080914,0.952598646288,1.87923079451,0.430886131679 +-0.744263300135,0.61522541142,-0.259941980479,-0.667864848674,-0.688679221606,0.282271985209,-0.00535574254601,0.383690790704,0.923446096505,2.45082746665,0.262962117434,0.296652673095 +0.0161130194274,-0.138144064527,-0.990281065173,-0.651083652191,0.750205377668,-0.115247425859,0.75883492833,0.646612796621,-0.0778552682361,1.68691090043,1.71032925269,0.976669688216 +0.662474220413,-0.587493093531,-0.464736239539,0.358784617383,0.793466799732,-0.491613706127,0.657572433742,0.158941192824,0.736434784354,2.41610916392,2.6582559489,2.55297249959 +-0.419323203958,0.898837793389,-0.127509496892,-0.0152714799024,0.133450437716,0.990937819732,0.907708561447,0.417470480212,-0.0422322818154,2.00730066316,0.127857572123,1.61338905003 +-0.482261194354,0.168255606767,-0.859717506634,-0.0297483453713,0.977670463013,0.208027646479,0.875522230653,0.125898834558,-0.466487199276,2.80590796713,1.03471634105,2.7221159587 +-0.60021391038,-0.115846673377,-0.791405591372,0.236760579382,-0.970846005242,-0.0374494613495,-0.763994561393,-0.209851333978,0.610143202691,0.190664475304,2.22848768631,3.08029140546 +-0.770697349369,-0.474857360743,-0.424895378445,0.0376564116512,0.631707877305,-0.774291387277,0.636087722203,-0.612744355093,-0.468974162363,0.552202596897,2.70274634408,1.02620953939 +-0.000733535556727,-0.00272611908213,-0.999996015092,-0.579405557923,0.815037404457,-0.00179688160284,0.815039055122,0.579401930969,-0.00217738746398,1.30794510976,1.57361941391,0.689946758459 +0.68397754734,-0.729317283973,-0.0164625038337,0.0304943516643,0.0511310463599,-0.99822628227,0.728865426023,0.682262350856,0.0572125454145,2.32412461281,3.12512940607,1.62804789734 +-0.209857678932,0.073360123796,-0.974975921154,-0.970986797392,-0.132566813984,0.199024317913,-0.114649002978,0.988455528624,0.0990518755469,2.80530021608,1.34661270397,1.10900058828 +0.665344203063,0.0541587710249,-0.744569619963,0.390432735872,-0.875335747844,0.285218525531,-0.636301320296,-0.480472846338,-0.603544922704,0.081220558051,0.839889888259,2.7001270828 +0.0770688475682,0.0355477306632,-0.996391866476,0.372903643424,0.925804857501,0.0618727609568,0.9246638662,-0.376326619669,0.0580948351609,0.432166999353,1.48582214971,0.816878978287 +0.206708807666,0.850258094833,-0.484079168117,0.910834024741,0.0134444797117,0.412553784784,0.357285387621,-0.52619427794,-0.771664910214,1.33230996283,0.505310510794,2.65062779268 +-0.648568792144,0.59176774428,-0.47871647004,-0.168376471173,0.501809380928,0.848431911922,0.742299054164,0.630871050249,-0.22581813954,2.40195738513,0.499192198831,1.83092508157 +-0.051019151572,0.663250723032,-0.746656229178,0.589918473652,0.623276777959,0.513344185221,0.805849390778,-0.414275918265,-0.423062906586,1.647568016,0.843021157914,2.26007913922 +0.518202259757,-0.503812763884,-0.691114402202,-0.765885250453,0.0862791174065,-0.637162221917,0.380639200715,0.859493230251,-0.341152731239,2.37027309455,2.37856283374,1.07921177366 +-0.289571860672,-0.171004923838,-0.941756578703,-0.484657982505,0.87464888263,-0.00979653552076,0.825381595083,0.453593042426,-0.336152605763,0.533437542308,1.91377665611,0.0291348729601 +0.513612858305,-0.851732898621,-0.103696196607,-0.734987781416,-0.374382134665,-0.565359158776,0.442712991624,0.366591170993,-0.818300751801,2.11343421964,3.03770971279,0.60458844069 +0.275677572688,-0.704985339988,-0.65345049263,-0.216299812156,0.616863473627,-0.756765383831,0.936598242139,0.349964462919,0.0175672284773,1.94355491173,2.42945883483,1.59400573144 +-0.226864406839,-0.00488006693572,-0.973914126531,0.0526388894297,0.998464357357,-0.0172648315349,0.972502796001,-0.0551825337858,-0.226259142878,0.0215076243564,1.79970714436,0.0761579819834 +-0.106692400564,0.113454675246,-0.987797939017,-0.554305501676,0.817975991742,0.153820309924,0.825446632117,0.563953290263,-0.0243832714828,2.32548706863,1.41441885339,1.72800614398 +-0.61997707631,0.0161005551487,-0.784454713144,-0.614980080275,-0.630862101332,0.473088268686,-0.487265764974,0.775727904118,0.401021561836,3.11562889184,0.901816406466,0.867657944018 +-0.655403656001,-0.27918357378,-0.701785280432,0.753377435683,-0.307545027126,-0.581238759628,-0.0535582589743,-0.909655203042,0.411896740063,0.402693610224,2.36369219135,2.18730626787 +0.405623507998,0.866106156073,-0.292112471783,0.888536985208,-0.298661757347,0.348286061474,0.214409877751,-0.400825749061,-0.890711582507,1.13280415069,0.29643490632,2.76885152775 +0.779179542279,0.533379303833,-0.329219925182,-0.542128093491,0.83710646147,0.0731430270997,0.314605103489,0.121487820002,0.941416134581,0.600274366792,0.335477327253,0.0775389119726 +0.419647269763,-0.52584154699,-0.739855956548,-0.77919762709,0.209376219996,-0.590772931368,0.465561195674,0.824410253429,-0.321870326566,2.24434644296,2.308736427,1.07193170816 +0.373999824791,0.233846837114,-0.897462972956,0.608304277075,0.668601529743,0.427712404447,0.700064309581,-0.70589492929,0.107806823782,0.558785695917,1.11398370267,1.32388498071 +0.250403498107,-0.0103515291777,-0.968086222389,-0.280586754574,-0.957802422945,-0.0623345149893,-0.926590071873,0.287240951894,-0.242741579178,3.10027678316,1.82411425121,0.251362468276 +0.58984834567,0.0315304434455,-0.806898234133,0.14706779469,0.978331128596,0.145736977411,0.794008811586,-0.204631458862,0.572429884936,0.0534043416163,0.938882036052,0.249297343933 +-0.617148277291,-0.0775630823733,-0.783014669141,0.0536421898537,0.988667123013,-0.1402135348,0.785016254166,-0.128535162995,-0.605993558191,0.125024296439,2.24209480406,0.227376692777 +-0.346706047847,0.244760076274,-0.905476350574,0.32085660761,0.938064531541,0.130713319972,0.881388650789,-0.245208971548,-0.403765534107,2.52687889018,1.13250079895,2.82850469043 +0.573201500783,-0.270185162659,-0.773589049418,0.357023312138,0.932101183646,-0.0610060491702,0.737546197937,-0.241220565716,0.63074419901,2.70111712798,2.25710716597,3.04517183078 +0.206616593036,-0.978311696599,-0.0146903975317,-0.330504778759,-0.0556540797704,-0.942161989587,0.920910513948,0.199521546963,-0.334835747192,1.77893478203,3.12690172762,1.2293270671 +-0.691566181171,0.673922581676,-0.259931858318,-0.540895817886,-0.244678769333,0.804713622372,0.478714874695,0.697108781859,0.533733468129,2.36911485847,0.262951634943,0.985156661726 +-0.00610963408961,0.0995307737357,-0.995015727238,0.106283797568,0.989462683147,0.0983226984713,0.994317065501,-0.10515333442,-0.0166237635469,1.63210377352,1.47091220623,1.73828587786 +-0.255119595834,0.92225602166,-0.290444181098,0.718272891695,0.381857526297,0.581608874302,0.647300583097,-0.0602383608876,-0.759850837336,1.84067318635,0.294690996563,2.48829237443 +-0.536639975112,-0.366509563531,-0.760058074723,0.826116493763,-0.411698338167,-0.384754489361,-0.171898446311,-0.834371151341,0.523713381503,0.599205473815,2.2781901776,2.50797765866 +0.0104013504231,-0.962010401858,-0.272814586534,0.907856675026,0.123448230034,-0.400695385689,0.419151606844,-0.24350877031,0.874651593071,1.58160800318,2.86527526749,2.71200668917 +0.951077646881,0.15343856836,-0.268156512773,0.285225991153,-0.76963356996,0.571235767403,-0.118732655888,-0.619774776616,-0.77574595242,0.159953035912,0.271478949322,2.50687219933 +-0.0616663986832,-0.0109813869454,-0.998036404353,-0.155602241578,0.987818995694,-0.00125465639638,0.985893096481,0.155219331553,-0.0626239684396,0.176229974663,1.63347389218,0.0200320835373 +-0.0814602504623,-0.143021037839,-0.986361602218,0.963121749046,-0.265926634897,-0.0409819639167,-0.256438538657,-0.953324712565,0.159409122398,1.05305368909,1.73614149309,2.88995536445 +0.219630970139,-0.503605089003,-0.835550208717,-0.934001535867,-0.355922654757,-0.0309870106392,-0.281786032218,0.787210885444,-0.548539564558,1.98204574893,2.1524591833,0.0564300453277 +-0.555089331331,0.195957010077,-0.808379047504,-0.401809892415,-0.91411036429,0.0543235883861,-0.728302577642,0.354969142461,0.586150376013,2.80223095081,0.941393265277,0.0924145970763 +0.163036142489,-0.269083903162,-0.949217082285,0.13998920617,0.958665147773,-0.247717897215,0.976638233123,-0.0924931754444,0.193965909628,2.11553789456,1.89085461076,2.23509211385 +-0.446249687838,0.678109800123,-0.583976296678,-0.218124260058,0.550455208282,0.805866534142,0.867918788412,0.486997086904,-0.0977282664751,2.15282990018,0.623618410408,1.69147805302 +0.272767990935,-0.386185648546,-0.881168694393,-0.44381308558,0.762115127849,-0.471392062907,0.853596841717,0.519654863117,0.0364863679971,2.18574673108,2.06326427085,1.64804363072 +0.471962002404,-0.343282481819,-0.812040027316,-0.652545870075,0.483331934326,-0.583587293135,0.592820171498,0.805324393606,0.00410674177082,2.51274455451,2.19395341003,1.57783327573 +-0.0610699944257,0.110587362573,-0.99198835226,-0.955061788629,-0.295274859175,0.02587928592,-0.290047299042,0.948990617856,0.123650198303,2.0753523402,1.44412850607,0.206316237967 +-0.0550698060638,0.878100590184,-0.475296402236,-0.76823264841,0.266802788696,0.581923422678,0.637797706469,0.397184623901,0.659892764136,1.63342898829,0.495300888509,0.722693933626 +0.122681307949,0.210049537009,-0.969963137796,-0.629942671144,0.771703595082,0.0874402219233,0.766890818665,0.600293889141,0.226992772809,1.0421806711,1.32507922427,0.367693008897 +0.290871965294,-0.0610255116052,-0.954813796894,0.175201453253,0.984486295455,-0.00954907527306,0.940583834958,-0.164507206511,0.297051221883,2.93479013178,1.87256001892,3.10945749529 +0.378625603817,0.37033576551,-0.848229964643,-0.548908971408,0.827741621362,0.116373318989,0.745212448395,0.421539119239,0.516684795314,0.774330169586,1.01263426083,0.221534090343 +0.0303378435674,-0.861371210384,-0.507069278472,-0.985010351795,0.0604187967693,-0.16156786764,0.169806425392,0.504370109066,-0.846626582961,1.60600218005,2.60981156025,0.188569876465 +-0.635001800684,0.674856385436,-0.375954215516,0.128864635695,0.572382625704,0.809797527447,0.761686693329,0.465775685098,-0.450429120258,2.32577723347,0.385426320217,2.07840576195 +0.491575810247,0.504622603725,-0.709724771013,0.0999314852829,0.776921753855,0.621615867427,0.865082031387,-0.376495174202,0.331488254352,0.798493995955,0.789107448011,1.080889361 +0.867684206294,-0.457376256057,-0.194759026858,-0.496499046099,-0.777821345239,-0.38533446785,0.0247551079667,0.431046302949,-0.901990171423,2.65648286556,2.94558088701,0.4037365907 +0.0560236109118,-0.465146112937,-0.883459364453,0.31863390276,0.846909101714,-0.425696381762,0.946220794018,-0.257651056767,0.195658227311,1.69066197862,2.05839729601,2.00162072088 +0.685296345526,-0.198779208472,-0.700610979851,-0.286214486637,0.81110562819,-0.51008717643,0.669664234111,0.550085889837,0.498954233727,2.85927699254,2.36533925493,2.34516175072 +-0.374534258015,-0.739115300555,-0.559850571187,0.875566146075,-0.0832210337666,-0.47587622696,0.305136057228,-0.668418156564,0.678313463345,1.10177668168,2.54738720487,2.52982182643 +-0.968116345844,0.199456991105,-0.15155081527,-0.244947558935,-0.627073316217,0.739445568964,0.0524541159642,0.752991344431,0.655936430556,2.93840978026,0.152137022091,0.845173660207 +-0.257957772049,0.0596040266882,-0.964315896292,-0.965783707214,0.0118047364923,0.259080063062,0.0268257100442,0.998152297096,0.0545194743346,2.9145166374,1.30284718037,1.36338768546 +0.17699750514,-0.626077083611,-0.759407248156,-0.489005086818,0.613672559094,-0.619903230578,0.854134596091,0.481075332555,-0.197536366693,1.84631513473,2.27919108673,1.26231230855 +0.860190693833,0.28476710764,-0.423059883054,0.483397901004,-0.190997876014,0.854310412358,0.162475966064,-0.939376125822,-0.301950417597,0.319695173783,0.436819643595,1.91053550591 +-0.164285284391,-0.369644638594,-0.914534409681,0.931178402817,0.247773914644,-0.267422641803,0.325449116545,-0.895528295689,0.303499496144,1.15257475701,1.98723723833,2.41930108197 +0.462330678408,0.544240456462,-0.700037619956,0.832481525034,-0.5382623054,0.131332406749,-0.305327454186,-0.643487386151,-0.701925301997,0.866594306181,0.775450176446,2.95662814219 +-0.587498987066,-0.650142128603,-0.481830004059,-0.54990190636,0.757570060123,-0.351703706815,0.59367738173,0.058333666272,-0.802586038877,0.835969955358,2.63885072277,0.413008811509 +-0.659738295882,-0.569007957108,-0.490892376896,-0.185908513049,0.756493569932,-0.627021134753,0.7281369416,-0.322408783068,-0.604871201892,0.711692156795,2.62847891192,0.803376639013 +0.146892610132,0.00060951278693,-0.989152258038,0.91618938827,0.376858267651,0.1362895848,0.372853276652,-0.926270735043,0.0547992654379,0.00414935297532,1.423368981,1.1884984543 +-0.306467579594,0.107075321474,-0.945839573178,0.312198452537,0.949995428997,0.0063883580549,0.899227306575,-0.293331826464,-0.324571549419,2.80546539833,1.24017114598,3.12191276078 +-0.144514516165,-0.982155367855,-0.120359411809,-0.458649841348,0.174267875188,-0.871361595842,0.876787247654,-0.0707215742971,-0.475649641312,1.42470443718,3.0209407354,1.07112992354 +-0.243801642731,0.969484801011,-0.0256900683322,0.91997216257,0.239571710926,0.31025250268,0.306939699448,0.0520059220946,-0.950307005641,1.81716318157,0.025692894992,2.8260262736 +0.171717423989,0.262501684226,-0.949529352931,-0.261730484717,0.941363781043,0.212911683829,0.949742217482,0.211960131911,0.230353256569,0.991504042286,1.25173206028,0.746070487943 +-0.0383983029927,0.000721840302621,-0.999262252501,-0.651325923253,-0.758403092366,0.0244804246024,-0.757825911424,0.651785415944,0.0295915450328,3.12279611225,1.53238179234,0.691153785612 +0.362211572852,-0.0183442894439,-0.931915373592,0.0244717796916,0.999648830191,-0.0101660364655,0.931774601763,-0.019123371656,0.362533292492,3.09099065489,1.94193391331,3.11355833703 +-0.969863264959,0.108468448445,-0.218173882433,0.076662484391,0.985812747858,0.149318751826,0.231274967886,0.128093020309,-0.964419031012,3.03021656866,0.219942883043,2.98798464441 +-0.449615087791,0.781029220177,-0.433404695475,0.168442631227,0.55064709874,0.817566420932,0.877196302327,0.29458637083,-0.379137860553,2.09313398035,0.448267320212,2.0050171141 +0.303787408189,-0.353079831726,-0.88489990567,-0.567255306117,0.679194961954,-0.465742011568,0.765463668836,0.643450725452,0.00604446911797,2.28129319224,2.05531358201,1.583773747 +0.385439576375,0.671049410832,-0.633347472708,-0.0892112420076,0.710267214767,0.698256283844,0.918410413303,-0.212633891583,0.333630245762,1.04942563543,0.685871235535,1.12506196556 +-0.0665335565924,0.928395936613,-0.365587569166,0.727598690749,0.295864943506,0.618921707831,0.68276894413,-0.224821974205,-0.695184614938,1.64233908227,0.374263992299,2.41416351585 +0.647380037402,0.750097186206,-0.135104768306,0.645197197472,-0.444982458465,0.621056509533,0.405733488325,-0.489228804246,-0.772033362976,0.858768066822,0.135519199486,2.46414868613 +-0.54971983674,0.671429719947,-0.496981118621,-0.799121337632,-0.595992607972,0.0787267361501,-0.243337602594,0.440425864834,0.864182775082,2.25685427823,0.520116365419,0.0908488670859 +0.0267389237085,-0.0224023188274,-0.999391397837,-0.759152339757,-0.650887851467,-0.00572100114008,-0.650363556021,0.758843291414,-0.034410813357,2.44421423942,1.60568655196,0.164748997137 +-0.884822276665,-0.230339753944,-0.4050100449,0.200471760152,0.596469653651,-0.777196902757,0.420595544553,-0.768874209495,-0.481593020999,0.254670756541,2.72460283671,1.01605070409 +-0.56958912336,-0.475987413316,-0.670077766319,0.821038719439,-0.367443859285,-0.43689865124,-0.0382577015921,-0.79901251094,0.600096121992,0.696114541287,2.4072791058,2.51228962566 +0.730670966996,0.544877512795,-0.411373837329,0.540370053364,-0.0932777090652,0.836241277634,0.417277058338,-0.833311325401,-0.362590804548,0.640757648097,0.423960832373,1.97992520689 +-0.372190138103,0.905787351228,-0.202543268103,0.919450083282,0.389632471149,0.0528968976322,0.12683077486,-0.16654072109,-0.977843618769,1.96066579451,0.203954323877,3.08754987078 +0.335132509092,-0.391878131495,-0.856806705976,-0.933572485376,-0.26070052506,-0.245922042082,-0.126998487778,0.882307636989,-0.453215862269,2.27829906332,2.11254811971,0.497156210557 +-0.0484746097606,0.0277779039556,-0.998438080334,-0.630545441693,0.774397819485,0.0521580591739,0.774637113859,0.632088921932,-0.02002340138,2.62123240249,1.51489773228,1.93734551978 +0.0143691990668,0.000853981869889,-0.999896393049,0.789726527163,0.613344153019,0.0118727525635,0.613290745417,-0.78981530795,0.00813885209481,0.0593615930475,1.55640127627,0.969863743028 +0.445212556155,0.328013255229,-0.833182503558,-0.394930959868,0.907027067965,0.146052849738,0.80362635396,0.26402500331,0.533362429167,0.634971266508,0.984837978103,0.267282010721 +0.0510422387903,0.524028149687,-0.850170093684,0.95280426147,0.229537819634,0.198686760209,0.299263644942,-0.820187105296,-0.487580129951,1.47369900286,1.01630826954,2.75464129549 +-0.357709605269,-0.890330430712,-0.281701193546,0.36162676365,0.146054092612,-0.920811753749,0.860970337532,-0.4312538999,0.269722360422,1.18876352238,2.85602600865,1.85574329967 +0.0746911452973,0.136261667909,-0.987853223244,-0.12157862668,0.984474624191,0.126603127361,0.989767584006,0.110645705662,0.0900980436505,1.06937845318,1.41477422952,0.95228942164 +-0.68995201933,-0.14028721865,-0.71013076775,0.178483230006,0.917778606744,-0.354719841015,0.701505486528,-0.37148610376,-0.608184287108,0.200594413163,2.35190873041,0.528007798708 +-0.611353296047,0.569289415916,-0.549687828079,-0.680983866602,-0.0246161137211,0.731884567656,0.403122959952,0.821768585352,0.402726049925,2.3918073774,0.581990498972,1.06775431063 +0.290401792495,0.919870896241,-0.263636744717,-0.915589000816,0.347191800517,0.202866052456,0.27814309357,0.182470238405,0.943048795978,1.26500025058,0.266790395497,0.211888215601 +-0.414310473261,0.679492020227,-0.605505925812,0.11665596,0.699450941953,0.705095572811,0.90262850539,0.221492605404,-0.369056644715,2.11834361905,0.650401426139,2.05299892713 +0.0294033451272,-0.181669936633,-0.982919873346,-0.819475747734,0.558688757859,-0.127774687314,0.572359102462,0.809236001402,-0.132446788797,1.73125524212,1.75588533847,0.767445765232 +-0.480085963036,-0.078292677834,-0.873720621648,0.71101079853,-0.618094663852,-0.335294841732,-0.513790922915,-0.782195143884,0.352405511329,0.161657456467,2.07879323149,2.38107035359 +-0.558236303776,-0.807678656279,-0.189808896889,-0.398478169539,0.461658985872,-0.792518850984,0.727727543485,-0.366778092251,-0.579557118408,0.966026978466,2.95062515221,0.93938082634 +-0.986178094468,0.107480530752,-0.12609798373,-0.148635369696,-0.237588351367,0.959926717083,0.0732140209701,0.965401321112,0.250279836042,3.03303418729,0.126434572132,1.31574642448 +-0.850613432506,0.185999908236,-0.491793475533,-0.294179509389,-0.943595163299,0.151942699904,-0.435792616616,0.273920064862,0.857352082501,2.926315488,0.514148338313,0.175402009735 +0.0722223892088,0.179159980696,-0.98116544365,-0.887617214376,0.460202276751,0.0186961283775,0.454884169036,0.869549058875,0.19226239094,1.18760598696,1.37640507942,0.0969379878476 +-0.188137124073,0.485533141597,-0.853734145362,-0.947424625355,0.139357176194,0.28803846395,0.258826200021,0.863039481052,0.433787796426,1.94046813736,1.02311495238,0.586159563824 +-0.187454371417,0.941880375172,-0.278787046871,-0.687416904546,0.0769459143486,0.722175411939,0.701654372167,0.327017866685,0.633040643946,1.76725076922,0.282530848755,0.851075197407 +0.713129508115,-0.420049829424,-0.56125256833,-0.596489747112,-0.784193190743,-0.171000061936,-0.368301895523,0.456726592605,-0.809786720909,2.60928342377,2.54569421551,0.208109438871 +-0.307598085805,0.0411200890878,-0.950627453781,-0.882439181728,-0.386042098507,0.268835616561,-0.355927672653,0.921564233493,0.155031788308,3.00869932139,1.2552515396,1.04770133426 +-0.45567474977,-0.110163708367,-0.883303164141,-0.09804933349,0.992485852267,-0.0731994620972,0.884729817868,0.0532521399392,-0.463052220562,0.237208005683,2.05873059089,0.156782980585 +0.195689321192,-0.071827560273,-0.978031947922,-0.614573220653,-0.786158208004,-0.0652305790605,-0.7642024902,0.613837171873,-0.197986061122,2.78981092096,1.7807913704,0.318270041974 +-0.194918537814,0.980770399824,-0.00980746890373,-0.95635097998,-0.187826857439,0.22386128454,0.217714415479,0.0530140967529,0.974571669421,1.76698027932,0.0098076261348,0.225785559031 +-0.375056430089,-0.26246052882,-0.889070944897,0.762993991528,-0.632093096357,-0.135271898153,-0.526472072518,-0.729090384211,0.437326386706,0.610584634328,2.04628102751,2.8416114489 +0.417191333027,0.348350078575,-0.839406703811,0.177687249489,0.87453415213,0.451239690328,0.891279211592,-0.337405156326,0.302950701384,0.695714460929,0.996190686728,0.979541715466 +-0.404070585536,0.535493152026,-0.741602350345,-0.201298553708,0.738805069809,0.643153139695,0.892303678228,0.409162746297,-0.190735400131,2.21722001142,0.835455789333,1.85909690018 +-0.0370971706065,0.118253824015,-0.99229019598,-0.633191663424,0.765420644797,0.114889311467,0.773105502052,0.632571948181,0.0464823952883,1.87478134292,1.44654069284,1.18634434724 +0.101050809906,-0.363556973576,-0.926075083771,0.914749948104,0.399951270893,-0.0571971446321,0.391179327496,-0.841347317031,0.372979122558,1.84190343612,1.95771783082,2.98942595776 +0.808449452202,-0.0802814941468,-0.583064631865,-0.351769907726,0.728338545386,-0.588031372737,0.471876483047,0.680498232917,0.560584284246,3.04261410084,2.51909684716,2.3323032382 +0.0485053228521,-0.184709813894,-0.981595394399,0.820404924369,0.567922883627,-0.066327658816,0.569721856458,-0.802088450798,0.179084123724,1.82760087111,1.76294907459,2.78688599208 +0.948363575894,0.307484315884,-0.0778455098469,0.164794517819,-0.267953767246,0.949233135492,0.271015303654,-0.913046643991,-0.304789322453,0.313531861903,0.0779243479967,1.88148776259 +-0.690235575528,-0.398323125038,-0.604080738259,0.713541522567,-0.236079416456,-0.659640056924,0.120138860693,-0.886343724063,0.447170501001,0.523398200959,2.49298080487,2.16653611266 +0.620649953009,0.206184674895,-0.756492905233,0.570569054577,0.543008370492,0.616111080517,0.537814642594,-0.814020754904,0.219375524606,0.32073711568,0.857933838775,1.22872873706 +-0.761129497741,-0.376578326248,-0.528082050319,-0.0333229217073,0.835816407233,-0.547996821422,0.647743367822,-0.399499308634,-0.648713212323,0.459448829937,2.58525223324,0.701434964857 +0.286568212503,-0.479168634813,-0.829624058833,-0.956946941275,-0.184885353094,-0.223763173458,-0.0461650427055,0.85802961815,-0.511521224594,2.10978293804,2.16315864709,0.412365542499 +0.136393718285,-0.290198766421,-0.947196616115,-0.983168470287,0.0776698055827,-0.1653697685,0.121558679844,0.953809245745,-0.27472060368,2.01015805535,1.89721550521,0.541856635586 +0.135657348484,0.320184855713,-0.937591991206,0.973808383378,-0.217378055519,0.0666634340583,-0.182467301904,-0.922078325931,-0.341287627354,1.17004047895,1.21563957304,2.9486922696 +0.853508202932,0.479302135171,-0.204433878671,-0.467501211425,0.877634301622,0.105833123038,0.230144226179,0.00524364727957,0.97314240444,0.51168051387,0.205885336739,0.108328250902 +-0.340156548673,-0.940358439613,-0.00441898667672,0.874404364986,-0.314562958391,-0.369414606779,0.345992093679,-0.12952277891,0.929254174516,1.2237094266,3.13717365253,2.76320978352 +0.39204883095,-0.284884248545,-0.874722058188,-0.664687221594,0.569634298939,-0.483433204198,0.635994191483,0.770945997073,0.0339655413268,2.5132005041,2.07673065369,1.64094007699 +0.232791042491,0.714880326517,-0.659359120127,0.899162562884,0.10012153958,0.426007468032,0.370560408089,-0.692041758907,-0.619486228972,1.25598895043,0.71996601321,2.53918399039 +-0.688425232066,0.666631227201,-0.285785770772,-0.316570688453,0.0783432948123,0.945328158562,0.652574669342,0.74125915514,0.157102405627,2.37227656987,0.289826296808,1.40611319945 +0.436037424833,0.581547555111,-0.686785123084,-0.00592277947936,0.764993118226,0.644011218652,0.899909042531,-0.276745316511,0.337010007212,0.927430860536,0.757056794639,1.08868423395 +0.406005150729,-0.862763280176,-0.301329288256,0.565349789332,0.496182844018,-0.658925034434,0.718010747332,0.0971705082892,0.689215829065,2.01063786696,2.83550622094,2.37865927833 +-0.725815704014,0.27395766176,-0.630982379603,-0.684457143763,-0.196105506675,0.702183059183,0.0686293097659,0.941535888755,0.329848735069,2.78067754979,0.68281884458,1.13164227604 +0.0508406604924,0.0393448922798,-0.997931463925,0.885024937458,0.461223802188,0.0632729355363,0.462759210948,-0.886411069282,-0.0113722880912,0.658613922536,1.50646515848,1.74863145243 +-0.0591820628682,-0.957787755781,-0.281318499765,0.94366646379,0.0382300659248,-0.328682319539,0.325562725988,-0.284922931571,0.901569650394,1.50908441353,2.85642483149,2.79200016541 +0.769203038315,0.285113293564,-0.571871572716,0.562734355318,-0.726248422676,0.3948332229,-0.302748627069,-0.625518695479,-0.71907553874,0.354960886609,0.608785496807,2.63945260387 +0.148811177797,0.0657158914874,-0.986679611104,0.335179843472,0.935371179728,0.112850470381,0.930327741117,-0.347508529019,0.11716704471,0.415851488677,1.40739457333,0.766634080554 +-0.354403174329,-0.0722355983673,-0.932298454549,0.854773679942,0.379238138445,-0.354316793884,0.379157415996,-0.922475177269,-0.0726581118524,0.201069021492,1.94087621299,1.36853497701 +-0.282672265332,-0.0719132033102,-0.956517057664,0.687142796822,-0.710950112463,-0.149615221032,-0.66927659991,-0.699555879668,0.250380518479,0.249120115027,1.86677529892,2.60297556408 +0.193339317415,-0.458775699284,-0.867262801052,-0.972938301182,0.0243498065556,-0.229778478133,0.126534463425,0.888218410453,-0.441652674506,1.96963459566,2.09191497838,0.479731516968 +0.183335460622,0.641060308651,-0.745271621324,0.83786189309,0.294629682618,0.459544120002,0.514174636662,-0.708685424426,-0.483103935215,1.29224376637,0.840942122757,2.38118251333 +-0.0999182598373,0.214802314576,-0.971532967533,0.684308351458,0.723664378641,0.089621131499,0.72231462776,-0.655873335895,-0.219298303197,2.00618866619,1.33161802837,2.75363262497 +0.727126139173,-0.351815725385,-0.589502564119,-0.527734279902,0.262752437995,-0.807748529026,0.439071870595,0.898435780509,0.00538894730385,2.69095306155,2.51114976772,1.57746779342 +0.720019425479,-0.661083485743,-0.211046563133,-0.00359977443136,0.300559711746,-0.953756206428,0.693944571674,0.687482715821,0.214029079545,2.39884171388,2.92894713825,1.79154578298 +-0.0947205658042,0.0071073563701,-0.995478528095,-0.379721412955,0.92411358225,0.0427286279293,0.920238916237,0.382051793069,-0.0848337459748,3.06669801523,1.47566606554,2.6750094538 +-0.442218777703,0.362252231185,-0.820497333114,0.602346959213,0.797758155409,0.0275692982455,0.664545478785,-0.482032412272,-0.57098516631,2.45527166768,0.962280471652,3.09334638467 +-0.185455943441,0.0380518510869,-0.981915551191,-0.430133251444,0.895290176573,0.115934834001,0.883510882245,0.443855332694,-0.149669517918,2.93922131908,1.38032732095,2.48252908921 +-0.389230227226,0.416706772554,-0.82149576744,-0.830555499926,0.226901046528,0.508619186256,0.398343308914,0.880267789251,0.257781355903,2.32211501831,0.964029249486,1.1017029535 +0.453955595368,0.464399427385,-0.760432435709,0.535827377057,0.539593934497,0.649405426409,0.711908238069,-0.702261744436,-0.0038862412906,0.796769998429,0.863978738564,1.57678056213 +-0.576175322524,0.699825846795,-0.42221532643,-0.729726655622,-0.207794418107,0.651398870032,0.36813177775,0.68342173214,0.630407590571,2.25959141038,0.435887769135,0.801773024891 +-0.494759813843,0.711011222329,-0.499675663133,-0.259813500676,0.427661237539,0.865796056108,0.829282624605,0.558183578788,-0.0268592795793,2.17873413834,0.523224304115,1.60180902068 +-0.0143926995518,0.0124245798917,-0.999819223667,-0.818659453888,-0.574260471337,0.00464861480984,-0.574098901549,0.81857836575,0.0184366582174,2.42945313487,1.55178150206,0.24699155056 +-0.675127697515,0.687037112531,-0.26866819323,-0.735191292796,-0.656637623104,0.168287833548,-0.0607976565719,0.311138293897,0.948417949549,2.34745170702,0.272010121627,0.17561274186 +-0.525903682467,-0.819464174073,-0.227824020196,0.458449242159,-0.0474914531675,-0.887450761586,0.716414411588,-0.57115937293,0.400658659687,1.00023178874,2.91175030564,1.99487321692 +-0.0292637662364,0.892690033432,-0.449720064258,0.345117322594,0.431268831501,0.833607358785,0.938103227599,-0.130811693613,-0.320703344515,1.60356614534,0.466451895945,1.93805911946 +-0.662330183814,0.572677764871,-0.483072360243,-0.725260266988,-0.651812344971,0.221671405626,-0.187926242811,0.497172851799,0.847055418906,2.4286599631,0.504160270767,0.255956443002 +0.143293349208,-0.615435858176,-0.77505207602,0.163078279321,0.787111820021,-0.594861713003,0.976151879006,-0.0411544317696,0.213152109675,1.79955304848,2.2547951506,1.91486573776 +0.516736904638,-0.0754476823742,-0.852813355084,-0.815360935353,0.260409027621,-0.517081892387,0.261092926918,0.962545991399,0.0730458620016,2.99660920533,2.12024348505,1.71113328177 +0.369018779083,0.220704630915,-0.902836976744,0.80045966838,-0.569124270968,0.188047556464,-0.472323469648,-0.792077666702,-0.386682699291,0.539010291049,1.12632236256,2.68895712668 +-0.919416682377,0.275797695222,-0.280372244485,-0.117488659875,0.487732011602,0.86505138556,0.375325697186,0.828283234268,-0.416025846388,2.85016310985,0.284181885819,2.01906876576 +-0.711780847423,0.701923602585,-0.0259090983357,-0.475538694632,-0.454413486411,0.753240554721,0.516943880078,0.548462979154,0.657234650142,2.36316701199,0.0259119979275,0.853359690838 +0.242171746081,0.304577526959,-0.921186938396,-0.550442657644,0.824992162057,0.128065659687,0.798977925882,0.476046702138,0.367442255787,0.899046005506,1.17111986729,0.335367094449 +0.306623845203,-0.724685191803,-0.617100632258,-0.949802594643,-0.275254681566,-0.148693952415,-0.0621035326004,0.631716893123,-0.772707524346,1.97106772321,2.47653991563,0.190108531618 +0.0192073562897,0.163727022202,-0.986318680582,0.477671569902,0.865128805866,0.152911806506,0.878328497074,-0.474073424126,-0.0615909065199,1.45401680328,1.40519058925,1.95370308405 +0.873834600315,0.376315714248,-0.30789539539,0.460815589943,-0.438947482444,0.771345642187,0.15511957761,-0.815911509213,-0.556979645747,0.406645382086,0.312980171984,2.19619333254 +0.12665602128,-0.809803447236,-0.572867025686,-0.70909095806,0.32993208477,-0.623165172837,0.693648517241,0.485142449476,-0.532436417092,1.72594281996,2.53159318359,0.863749578724 +0.47805092863,-0.04593272987,-0.877130260544,-0.870217898131,-0.160197072479,-0.465894524266,-0.119113892591,0.986015761687,-0.116553842905,3.04580336729,2.07173893728,1.32565563035 +0.0269520903771,0.146638319618,-0.988822930582,-0.239312551559,0.961364487499,0.136043466741,0.970568435243,0.232971082746,0.0610031729764,1.38902531442,1.42114371006,1.14926590945 +0.0294919160221,-0.10037626666,-0.994512358888,-0.99922255629,-0.0290027787891,-0.0267043408989,-0.0261631399048,0.99452674369,-0.101153577279,1.85656794048,1.67560727569,0.258109235642 +-0.07863843162,-0.0285826441162,-0.996493366525,-0.129790553651,0.99137450705,-0.0181933766463,0.988418134827,0.127904727145,-0.0816698935872,0.348623313065,1.65456606843,0.219188254149 +-0.320663319014,-0.232748267933,-0.918152100478,-0.270088200173,0.951564810915,-0.146890349433,0.907869704289,0.200879701323,-0.367994491304,0.627854490692,1.97820138845,0.379785939899 +-0.387374417867,-0.217682643784,-0.895854523334,0.921921458356,-0.0900189133205,-0.376772371424,0.00137295523241,-0.971859486675,0.23555732456,0.511966829047,2.03124206624,2.12953799525 +0.818311520607,0.0952309928619,-0.566830938852,0.268124654185,0.80905653424,0.523007355801,0.508404784654,-0.579964294076,0.636526505762,0.115853854682,0.602654019295,0.687808477734 +-0.531885143319,-0.613818012424,-0.583374358316,-0.296184528802,0.780237726366,-0.550911803517,0.793330271208,-0.120235344136,-0.596800253691,0.856789800773,2.51871555837,0.745436902359 +0.611340628333,0.539425423316,-0.579036137758,-0.649606863536,0.759948625908,0.0221135439924,0.451966325069,0.362626941444,0.815001927815,0.722985995375,0.617545978509,0.0271264630486 +0.118262730035,0.248367244786,-0.961419595391,0.903416347259,0.374940096034,0.207987566673,0.412132054309,-0.8931593565,-0.180037589707,1.12640136023,1.29211707202,2.28428732952 +0.67339032289,0.302374929146,-0.674622023997,0.682210148496,0.0974325769282,0.724635222882,0.284841686426,-0.948196337884,-0.140673090877,0.42205003615,0.740452533041,1.76254087861 +-0.656092428019,0.002896799961,-0.754674985969,-0.743912803558,0.165838388539,0.647372666699,0.127029392659,0.986148689315,-0.106650344415,3.13717745077,0.855158604678,1.73407309135 +-0.0424485001256,0.998727529684,-0.0272295113349,0.688231493963,0.0489864136917,0.723835438474,0.724248255472,0.0119855214351,-0.689435139604,1.61327334469,0.0272328773281,2.33185838075 +-0.336373618862,-0.914844437661,-0.223410929487,0.840054070753,-0.184268212894,-0.510249335059,0.425631233281,-0.359311676122,0.830501759576,1.21845510168,2.91628019966,2.59066171624 +-0.0449069831866,-0.0448654567372,-0.997983193071,0.434473579255,0.898687091658,-0.0599518157872,0.899564378902,-0.436289585114,-0.0208644705416,0.784935588842,1.63431774384,1.23588592572 +0.0463603773856,0.102464293285,-0.993655767361,-0.659583340489,0.750186454662,0.0465843341797,0.750200328151,0.653239123019,0.102362667993,1.14590354337,1.45809360078,0.427079572741 +-0.023029857562,-0.0701709928829,-0.997269099801,-0.596668237797,0.801356129802,-0.0426071265632,0.802157490562,0.594057560332,-0.0603239201936,1.25367623971,1.6447171503,0.614945429442 +-0.477416863141,0.112556267381,-0.871438021584,-0.506593088227,0.77507816213,0.377647038317,0.7179391212,0.62175954296,-0.313015157761,2.91005966153,1.05812644196,2.26288664359 +0.00714776024584,0.502543514274,-0.864522368585,0.518592500307,0.7373342648,0.432897217104,0.854991653847,-0.451429062215,-0.255345009035,1.55657411895,1.04419926164,2.10372016541 +0.336106067464,-0.941105452163,-0.0367864013229,-0.927457915525,-0.323930622504,-0.186790703021,0.163873507147,0.096899327722,-0.981710748613,1.91381741878,3.10479795041,0.188023114939 +0.0824675812122,0.00124586933137,-0.996592968999,0.925976296213,0.369629031962,0.0770861698539,0.368465733686,-0.929178576238,0.0293287667427,0.0151062337855,1.48822554015,1.20724104589 +0.190519470857,-0.673677457044,-0.714045527326,-0.220731700343,0.679345271685,-0.699833921943,0.956545789645,0.290944471865,-0.0192734688854,1.84640436837,2.34633283573,1.54326322528 +0.389538769032,-0.327520031603,-0.860807862603,0.0590351822077,0.941591727256,-0.331541651117,0.919116094236,0.0783303776441,0.386121687108,2.44247023501,2.10473773126,2.43210079193 +0.379563337192,-0.705132776198,-0.598931916825,-0.914430501457,-0.187600170678,-0.358640535867,0.140529466893,0.683808411687,-0.716001064972,2.06460186226,2.49942598139,0.464362439809 +-0.0582139558689,0.652706257999,-0.755371217423,-0.112286157769,0.747571931617,0.654620520479,0.991969230428,0.122925781784,0.0297707584265,1.65974956011,0.85622042188,1.52534975342 +-0.536167124511,0.32677491151,-0.778294913129,-0.655942053083,-0.741619320475,0.140501980394,-0.531286022394,0.585848906038,0.611977304893,2.59424289752,0.891945684541,0.225676020217 +0.626369982626,-0.0742679304531,-0.775979973564,-0.384716550293,0.836322787732,-0.390585932478,0.677977743585,0.543183642266,0.49527538802,3.02357485944,2.25332539451,2.47382704714 +0.461992114134,0.69726822699,-0.54806961794,0.0128411148218,0.61264835116,0.79025129142,0.886791064597,-0.372127689714,0.274085005608,0.985632147569,0.580054613276,1.23694591869 +0.696405029242,-0.515777167194,-0.498992934867,-0.709693444631,-0.391715755584,-0.585571499882,0.106561014886,0.761926952292,-0.63883649667,2.50411656085,2.61915634681,0.741922921448 +0.538135972731,0.672464271727,-0.508135295078,-0.676394091356,0.704254145908,0.215678304774,0.502892342388,0.227635456863,0.833835349902,0.895906192034,0.533018358033,0.253110758981 +-0.988158415268,-0.0462732997383,-0.146293294674,-0.00944402405143,0.969975986695,-0.243017274375,0.153146194027,-0.238757967336,-0.958926940016,0.0467936315429,2.99477244685,0.248200775893 +-0.615624324846,-0.187592204677,-0.765386082577,0.449423467811,-0.881396620026,-0.145459770343,-0.647321587188,-0.433531040355,0.626917538285,0.295780176732,2.26995163062,2.9136030265 +0.467582091502,0.783447763428,-0.409361197094,-0.561330093667,0.620911312119,0.547154154172,0.682843696354,-0.0260527246731,0.730099816385,1.03271382746,0.42175379624,0.643132217211 +-0.513541243114,-0.733465703507,-0.445312759081,0.846293596026,-0.518616011054,-0.121756241741,-0.141642299282,-0.43939218798,0.887058038798,0.959964912723,2.68006911799,3.00518653326 +-0.975497393934,-0.0552899995553,-0.212950347209,0.158926079576,0.492245812218,-0.855825076511,0.152142484724,-0.868698495626,-0.471397484124,0.0566182008079,2.92699907434,1.06733102289 +-0.174831990713,-0.0976996195542,-0.979739026151,0.591247600716,-0.80609871387,-0.0251224629337,-0.787311913838,-0.583660558746,0.198696508509,0.509589603635,1.77243840462,3.01582364952 +0.0547102412678,0.307704637947,-0.949907703562,-0.31926148655,0.906783297744,0.275347333632,0.946086091593,0.288204626469,0.147848573127,1.3948340365,1.25294044512,1.07802516799 +-0.135614311134,0.122027958101,-0.983218152831,-0.800322303751,-0.598481665024,0.0361096489753,-0.584031650457,0.791788402335,0.178824375278,2.40887909179,1.38733517688,0.199248719604 +0.319205501236,-0.498627761324,-0.80590210548,-0.116225928819,0.82337238004,-0.555472283069,0.940531435653,0.270976529286,0.20487151858,2.14022864109,2.20439506047,1.92414147314 +-0.427168607066,0.534786807886,-0.729061075115,-0.312266500136,0.669458666688,0.674028728237,0.848537927278,0.515585263275,-0.11897572132,2.24478333546,0.816949149072,1.74551093461 +0.125510352224,0.988046292562,-0.0895079618758,0.952760022796,-0.0948906556197,0.288520540755,0.276578181436,-0.121491922491,-0.953280767835,1.44444422861,0.0896279129554,2.84769672149 +0.955103696313,-0.247570226992,-0.162744929249,-0.295514347458,-0.75681033146,-0.58301748914,0.0211707282782,0.604935620461,-0.795992899065,2.8879668753,2.97812061643,0.63216803069 +0.999324408239,-0.0347257718183,-0.0120352760744,0.0198450525167,0.785477844969,-0.618571522909,0.0309338162724,0.617914780398,0.785636317374,3.10685738203,3.12955708695,2.47461225932 +0.752292530972,-0.1617143086,-0.638673962392,-0.651058615624,-0.330926887288,-0.683088628431,-0.100889181107,0.929696658951,-0.354239319488,2.92985281293,2.44881891927,1.09239172939 +-0.120516979771,-0.992152918287,-0.0332903037239,0.989256951012,-0.11723494643,-0.0873307059997,0.0827426278399,-0.0434574972885,0.995622972549,1.44991835758,3.10829619783,3.05410194006 +-0.0373625524254,0.011504222909,-0.999235554077,-0.214316700555,0.976574382652,0.0192568691805,0.976049379662,0.214872352812,-0.0340217644728,2.84289683994,1.53169278887,2.62653616161 +0.321357085994,0.862319843768,-0.391323536636,0.68601236994,0.0728692224813,0.723931698922,0.652776111367,-0.501093368005,-0.568145038674,1.21407367619,0.402069384669,2.23620295516 +-0.0355255109756,0.105910469942,-0.993740866839,-0.93761645596,0.340588895204,0.0698182352768,0.345851586065,0.934228118192,0.087203804941,1.89443237064,1.45885282731,0.675126737982 +0.130058374893,-0.678097019161,-0.723373521582,-0.987552754285,-0.153680348499,-0.03349489496,-0.0884555064621,0.718725805221,-0.689643995324,1.76029408143,2.33291683072,0.0485302496618 +0.458590980911,-0.241264573196,-0.855269383263,-0.831852470101,-0.455101102257,-0.317654615442,-0.312595233831,0.857131490756,-0.409401792059,2.65728396234,2.11552217622,0.659871745388 +-0.577319944641,-0.71970886831,-0.38564339278,0.328896858384,0.2273165029,-0.91659918397,0.747347668802,-0.65600789049,0.105475634868,0.894741153589,2.74568759964,1.68536520307 +0.355971500245,-0.631816490863,-0.688543544655,-0.934094923538,-0.262176602048,-0.242342945347,-0.0274037375856,0.729432211526,-0.683503975083,2.0838765193,2.38211388444,0.340731098965 +0.113627748904,-0.341448840739,-0.933006657981,0.719818956905,0.675571914441,-0.159572108148,0.68479880546,-0.653464059897,0.322545064238,1.89204986294,1.93891320511,2.68217144859 +-0.306736829599,0.572941948991,-0.760032920638,0.748095310952,0.638812903017,0.179642647139,0.588443644795,-0.513474048054,-0.624562630066,2.06233917075,0.863363769646,2.86152320697 +0.276456492298,0.406612234276,-0.87076879756,0.0117017682353,0.904590617835,0.426120737287,0.960955189635,-0.127993378981,0.245321867045,0.973686649583,1.05676373566,1.04842880772 +-0.438869596171,-0.750911499587,-0.493482925079,0.164274787206,0.472890822063,-0.865672030677,0.883406628821,-0.460983937027,-0.0841815773064,1.0418897478,2.62550294131,1.47385693482 +0.291308842191,0.195570799353,-0.936424701138,-0.550291892045,0.834966249312,0.00319312686716,0.782507502847,0.514376734456,0.35085407656,0.591239345741,1.21229780653,0.00910075990085 +0.920274716359,0.301201320098,-0.249744291631,0.0225855027678,0.596329926105,0.802421656173,0.390620457088,-0.744088962425,0.541984570354,0.316306252407,0.252416169675,0.976747110279 +-0.566815073361,-0.71466878348,-0.40984045985,0.218039530985,0.349599763966,-0.911174389435,0.794468020463,-0.605828800037,-0.0423323694995,0.900267212794,2.7193135025,1.52437058006 +0.0888066050679,0.181026615004,-0.979460438995,-0.293644928621,0.944400166588,0.147922213489,0.951780459345,0.274477121101,0.137026520062,1.11471945129,1.36776794975,0.823616925618 +-0.0961247907726,0.851990490031,-0.514657390402,0.492212607403,0.490095921695,0.719397481683,0.865151301052,-0.18416892364,-0.466470828512,1.68314501475,0.540608008085,2.14605915721 +-0.999494282874,0.0287924451183,-0.0134971703116,0.0239657138536,0.961034688734,0.275386948873,0.0209003124809,0.274924211655,-0.961238708534,3.11279360475,0.0134975801499,2.86257436504 +-0.459160537203,-0.040753264251,-0.887418037076,0.881771675171,-0.142281946329,-0.449704970635,-0.10793662002,-0.98898686503,0.101265328998,0.0885240582792,2.04987924917,1.79228370542 +-0.243500433149,0.314873674709,-0.917366942957,-0.947285391475,0.125851218878,0.294638520572,0.208225661613,0.940752911067,0.267630405903,2.22906056775,1.16141421306,0.833395430084 +-0.362769648735,0.111406660877,-0.925195513321,0.089114045921,0.992425423052,0.084560431054,0.927608143979,-0.0517719575897,-0.369949720409,2.84363463682,1.18155046998,2.91688021369 +-0.167198616237,0.0749692212535,-0.983068786298,-0.580653482237,-0.81332175244,0.0367322824585,-0.79679743743,0.57696390084,0.179517410945,2.72008322297,1.38651823116,0.201830846597 +-0.0471257647551,-0.0185162965328,-0.998717331911,0.998647904155,-0.0228376837778,-0.0466990762944,-0.0219436966651,-0.99956770004,0.0195675040384,0.374381469592,1.62145089005,1.96758473067 +-0.581704215987,0.0822757218911,-0.809228589887,0.00857920354151,0.995436413563,0.0950407482061,0.813355151438,0.0483430671378,-0.579755418681,3.00108555415,0.942837873099,2.97910543189 +0.0125623450895,0.0668818614421,-0.997681815057,0.234522473062,0.969732172334,0.067961191635,0.972029524816,-0.234832558538,-0.00350318935515,1.38513068579,1.5026922717,1.62229765354 +-0.924612772529,0.380402580168,-0.0196239108916,0.374500732682,0.917261555308,0.135574482758,0.0695731420718,0.11800472938,-0.990572794774,2.75128186554,0.019625170631,3.00557302215 +-0.782328611298,0.353378001931,-0.51291903035,-0.622855425706,-0.439062104881,0.647514931663,0.00361422367253,0.826043858284,0.563594252613,2.71732572721,0.538581750817,0.854579994749 +0.254350075125,0.519815356618,-0.815535427991,0.433223429824,0.692688639382,0.576628050586,0.864652241734,-0.499974443243,-0.0490107842045,1.11573843805,0.953653806747,1.65558802452 +0.278194675719,-0.636569820107,-0.719295896367,0.801561599513,0.566477975495,-0.191315721952,0.529251097862,-0.523336953987,0.667841079902,1.98280504269,2.33880439785,2.86259544045 +0.228986657726,-0.10378205879,-0.967881395036,-0.872931888598,-0.461889648637,-0.156996402351,-0.430760987617,0.880844615557,-0.196361235462,2.71606157253,1.82493025638,0.674453370821 +-0.589564840114,-0.0389367774964,-0.806782019296,0.473150679978,-0.826172678939,-0.305887460696,-0.654630990206,-0.562069952882,0.505505326114,0.0659474789228,2.20290733516,2.59742262918 +-0.793849912467,-0.195394439894,-0.575867458132,0.0186380131419,0.938710672555,-0.344201826981,0.607828052119,-0.283977615473,-0.741553621101,0.241337948701,2.5279278466,0.43456933924 +-0.337597715287,-0.827612893592,-0.448424665908,-0.0137795699068,0.480687700097,-0.876783586998,0.941189622811,-0.289821036739,-0.173683219042,1.18348327729,2.67659056764,1.37523670697 +0.831833711543,0.421189617147,-0.361458134158,0.540640947086,-0.762194020792,0.356044436838,-0.125539008583,-0.491588833352,-0.861731034748,0.468705717358,0.369831290305,2.74978163791 +-0.471484822192,-0.0506988349833,-0.880415635126,0.765161685897,-0.5198644741,-0.379826964556,-0.438440026546,-0.85274296051,0.283901015184,0.107118557064,2.06485467271,2.21266234 +0.55306475931,-0.45098909509,-0.700519955547,-0.548790528332,0.435432811257,-0.713601585546,0.626855906906,0.779106605665,-0.00667600081291,2.45750993436,2.36546681353,1.5614412382 +-0.306362116227,-0.50794473612,-0.805067946691,0.68043359902,0.474589446268,-0.558368135566,0.665696906306,-0.718858124068,0.200226437804,1.02807072744,2.20580264829,1.91510503447 +0.272403606949,-0.175917484345,-0.945964752844,-0.718736895799,-0.690836703406,-0.0784979225533,-0.639698014331,0.701282887235,-0.314624796435,2.56817763187,1.90103568878,0.244505134672 +0.848728695925,0.515050179359,-0.11992878493,-0.306062445954,0.663349296307,0.68285685928,0.431260222939,-0.542854514424,0.720641100882,0.54544033271,0.120218149283,0.758483184968 +-0.429786439957,0.69585117188,-0.575390965016,-0.872475960018,-0.484155050618,0.0661784417479,-0.232528095549,0.530457381469,0.815196694808,2.1240865018,0.613082091061,0.0810033145562 +-0.468954127207,0.19321151688,-0.861830224766,-0.0321123654532,0.971404216887,0.235250171943,0.882638557146,0.137996946195,-0.449339537856,2.75078003799,1.03886719417,2.65928572333 +0.313572247396,-0.299781979372,-0.901001226696,-0.720679147656,-0.692972981717,-0.0202487714011,-0.618299289824,0.655682248848,-0.433343716638,2.37867406962,2.01952069212,0.0466928511408 +0.582453627592,0.512286004317,-0.631118706335,0.572133903344,0.293158501538,0.765977081655,0.577417152802,-0.807230538791,-0.122344958598,0.721390458018,0.682994581851,1.72918251146 +0.416324522321,0.877166618075,-0.239275189371,-0.802641922785,0.47819960309,0.356498363801,0.427129764711,0.0436332870539,0.903136922265,1.1276546374,0.241619287324,0.375958029261 +-0.415989506934,-0.907325044043,-0.060942551425,0.272412872404,-0.0603959928185,-0.960283057749,0.867608181768,-0.416069211195,0.272291120725,1.14091365001,3.08061231559,1.84709665685 +0.53142006011,0.593104826041,-0.604830046409,0.653201619093,0.167708230813,0.738377677162,0.539370340792,-0.787464675172,-0.298293514563,0.840197313658,0.649552435653,1.95473333119 +-0.488484953226,-0.870986260716,-0.052586919624,0.629287247174,-0.309899219467,-0.712713150094,0.604466716218,-0.381241927675,0.699481652059,1.05966788002,3.08898146658,2.34682530766 +-0.327231188074,-0.0916904550059,-0.94048530558,0.59718863361,0.751258563166,-0.281027235615,0.732315154451,-0.653608010761,-0.191078734635,0.27319493574,1.91753709336,0.973667813402 +0.107871104203,0.703359238663,-0.70260202552,0.982251089177,0.0336800573543,0.184522225077,0.153449088264,-0.710036220994,-0.687242273283,1.4186164854,0.77904759892,2.87928258214 +-0.0080038553251,-0.0558156282477,-0.998409011349,0.856739954503,0.51451629089,-0.0356319627151,0.515686521695,-0.855662084033,0.0437013648508,1.4283691694,1.62721282623,2.4575610313 +-0.61733312388,-0.0564684403768,-0.784672625623,0.157371771434,0.968396423949,-0.193500624386,0.770800843095,-0.242939666015,-0.588936651059,0.0912177440407,2.23942480273,0.317447804647 +-0.28593974475,0.622297247162,-0.728686900217,-0.811868097746,0.246622222388,0.529195305427,0.509027164535,0.742915618088,0.434704186967,2.00151456273,0.816402627373,0.883115995431 +0.919513617845,0.173786813195,-0.352551911294,0.277177522449,-0.922652834567,0.268112603051,-0.278688585425,-0.344252654929,-0.896561644243,0.186795288351,0.360296713828,2.85101190211 +-0.133966297626,-0.0787714666989,-0.987850235175,-0.185123753158,0.981277293639,-0.0531419702864,0.973541076235,0.175755310085,-0.146040555531,0.531545268878,1.72683765239,0.348990601137 +-0.423584264865,0.646261450324,-0.634761772938,0.447136840283,0.758581244417,0.473944238999,0.787810266893,-0.0830700514206,-0.610290381651,2.15098484881,0.687700179404,2.48129118212 +-0.0949191576177,0.548261466657,-0.830902953236,-0.97967692907,0.0967103437438,0.175727698617,0.176701636001,0.830696378704,0.52793944562,1.74222459508,0.980728521984,0.321320699362 +-0.996260884052,-0.0188934935865,-0.0843047258886,0.0702904958255,-0.744624821258,-0.663771889856,-0.0502344215021,-0.66721579078,0.743168615746,0.0189621306741,3.05718774398,2.4125668842 +0.348468407855,0.443705333884,-0.825648439355,0.828605878417,0.265940550137,0.492633659067,0.438157582361,-0.855804417186,-0.274984967851,0.905046199099,0.971350573497,2.07990845643 +-0.372624208644,-0.912636117152,-0.168067000934,0.741929472824,-0.184204676354,-0.644677667183,0.55739739548,-0.364916366966,0.745750755033,1.1831601251,2.97272420523,2.42875890318 +0.248444152476,0.123159876354,-0.960784652228,0.616593568191,-0.785082421398,0.0588044494605,-0.747052792489,-0.607023258589,-0.270988724428,0.460221437424,1.28981814401,2.92790601218 +0.97219838896,0.231898153425,-0.0324582646265,-0.180453089095,0.830321916195,0.527259137543,0.149221228853,-0.506743289965,0.849084367384,0.234154258809,0.0324639666712,0.555698822706 +0.0691240261047,0.557636145144,-0.827202392794,-0.983838638339,0.175395876157,0.0360252736144,0.165176883149,0.811343463803,0.560748054849,1.44746643515,0.974110483961,0.0641568558865 +0.349859990199,0.811234862646,-0.468503985987,0.888276704604,-0.128401915319,0.440995968463,0.297594494768,-0.57044802197,-0.765523723286,1.16362826122,0.48759666091,2.61895390877 +0.85176581195,-0.523592822791,-0.0185891773805,-0.0598300193807,-0.0619585801747,-0.996283846664,0.520495312539,0.849712710429,-0.0841007690849,2.5904238423,3.12300240544,1.48658151461 +-0.0183169739003,0.15461095154,-0.987805619609,-0.974669474127,0.217493455868,0.0521153802554,0.222898866466,0.963738579864,0.146710752877,1.68871806813,1.41446817757,0.341322324386 +0.118944433048,-0.0767929324697,-0.989926798996,-0.750961350403,-0.659187826261,-0.0390955228984,-0.649545434937,0.74804696058,-0.136075246536,2.56830252038,1.71285376689,0.279772580266 +0.084318683571,0.673934484434,-0.733963670961,-0.8958216167,0.373821924882,0.240334765547,0.436341598583,0.637235811272,0.635245251992,1.44632902268,0.824139586667,0.361690266793 +-0.931779425892,-0.0411074217599,-0.360690007292,0.143370126515,0.871131802295,-0.469653478485,0.333514779743,-0.489325620529,-0.805809114361,0.044088528165,2.77258505906,0.527702298013 +0.947924707111,0.0148411639795,-0.318148533707,0.0430344429564,-0.995721508986,0.0817723257726,-0.315573741569,-0.0912053528833,-0.944507700994,0.0156552006694,0.323775906376,3.05523133439 +-0.736944102847,-0.424118081778,-0.526343273907,0.0462782363143,0.745184001443,-0.665251177253,0.67436764018,-0.514611170401,-0.529531518586,0.522216843061,2.58729849518,0.898506918913 +0.0927187498878,0.206974764877,-0.973942852596,0.658409316957,0.72102785663,0.21590739058,0.746927308888,-0.66127171168,-0.0694213120688,1.14963076794,1.34201213653,1.88188909075 +0.613362835304,-0.749973341147,-0.247640909053,0.621933220332,0.651901788713,-0.433846893869,0.486811156111,0.112089452858,0.866285664688,2.25632475655,2.89134809361,2.6772950672 +-0.0770944745485,-0.0422014419968,-0.996130252672,0.2626058339,0.962965450688,-0.0611205103216,0.961818391379,-0.266301669303,-0.0631569705618,0.50084412611,1.65879911915,0.769013232013 +-0.588388552466,-0.705676396329,-0.394740085362,0.693873061231,-0.190017105346,-0.694574455746,0.415137430528,-0.682579170017,0.601453730917,0.875786404445,2.73580770683,2.28446690455 +-0.196181564789,0.400652479819,-0.894980661272,-0.650028755887,0.630211986073,0.42461213964,0.734149446745,0.665064239773,0.136799659423,2.02613388927,1.10838785071,1.2591211424 +0.191253745259,0.242140977342,-0.951204369216,0.0483890222476,0.965588870795,0.255532062809,0.980347136197,-0.0948993134299,0.17295552278,0.902278445116,1.25711587636,0.975780452178 +-0.160696846728,-0.256645730441,-0.953052722832,0.841652250953,0.468745143378,-0.2681407821,0.515556022094,-0.845228347612,0.140680590263,1.01137572742,1.8784301602,2.05397046036 +-0.849250770999,-0.45107987678,-0.274408587186,0.0721201947138,0.415747105059,-0.906616248558,0.523040921412,-0.789734948827,-0.320541580967,0.488256261345,2.86361802674,1.23095516974 +0.315907115788,0.857657116813,-0.405742485051,-0.82183829316,0.461048644458,0.334687865538,0.474114452522,0.227724433086,0.850504008507,1.21787967485,0.417791042331,0.374905201817 +-0.938533064265,0.318918560415,-0.132085726346,0.312580612784,0.947540708458,0.0667829793144,0.146454934342,0.0213905969356,-0.988986043668,2.81402863341,0.13247284874,3.07416829548 +-0.287091824378,0.105640396239,-0.952060077441,-0.872231754819,0.382017671569,0.305408356948,0.395967233821,0.918097274417,-0.0175312420842,2.78900187039,1.25990105358,1.62813603004 +-0.0971525902089,-0.279776396125,-0.955136923371,0.336278982346,0.89401075196,-0.296076377667,0.936737861009,-0.349957059583,0.00722746154601,1.23657273877,1.87147089458,1.59520228087 +0.507138915003,-0.82491041646,-0.249665627803,-0.556552725664,-0.0922611957953,-0.825673625173,0.658072324631,0.557683312075,-0.505895383442,2.12201308055,2.88925772118,1.0210863504 +0.423754084252,0.429690825989,-0.797369594442,-0.254392111969,0.901341471766,0.350525611964,0.869319923531,0.0543078754458,0.491257086684,0.79235426087,0.922923933549,0.619747475819 +0.139286509196,-0.0220663293008,-0.990006235065,-0.266093759502,0.962147041143,-0.058882785038,0.953830896706,0.271636058598,0.128142390172,2.98447440598,1.71229159406,2.71085792663 +0.295433309188,-0.715258252295,-0.633344134216,-0.796145564378,0.182119232448,-0.577048373617,0.528082758802,0.67471343376,-0.51564559744,1.96249692647,2.45572573208,0.841533063257 +0.410778378093,0.312370259606,-0.856554694696,0.750160725156,0.418160451498,0.512250644935,0.518189164808,-0.852975180012,-0.0625566284142,0.650146132575,1.02855599506,1.6923157461 +0.899408706993,0.322706825763,-0.294829242768,0.328253850253,-0.053251594576,0.943087311689,0.288640585468,-0.944999773694,-0.153824705883,0.344491848546,0.299276813266,1.73248014047 +-0.0374211039141,0.178301704134,-0.983264035387,0.948903973792,0.314866552744,0.0209833859256,0.313338330728,-0.932237929,-0.180973849576,1.77766897902,1.38758685016,3.02616102823 +0.648324696205,0.755879555196,-0.0912205367673,-0.458228511476,0.483067618793,0.746104756012,0.608031018585,-0.4419182885,0.659550230633,0.861843782161,0.0913475233639,0.846896455029 +-0.510513722591,-0.11607720387,-0.851998721706,0.466893783377,0.794637321316,-0.38802283775,0.722070588025,-0.59588388996,-0.351477532136,0.223572258273,2.12180145905,0.83477690606 +0.825201142791,0.448437006981,-0.343434600335,-0.0188241475011,0.629518079771,0.776757773512,0.564525221233,-0.6345165388,0.527920483199,0.497783157476,0.350571497232,0.973861627151 +0.799902190744,0.125456634768,-0.586870614391,0.598155974683,-0.0874091889125,0.796598433117,0.0486406742797,-0.988240996157,-0.144961437352,0.155572598731,0.627188439792,1.75080215399 +0.0509180632523,-0.0797437916158,-0.995514077516,-0.81172392986,0.577408614267,-0.0877698915472,0.581817507924,0.812551672122,-0.0353294155686,2.13905938063,1.66555159491,1.1881166916 +0.301490304765,-0.246625986771,-0.921020748291,-0.95096712437,-0.147714123014,-0.271738967079,-0.0690298812116,0.957787116488,-0.279067581401,2.45595831714,1.97089966244,0.772093706638 +-0.318065460681,0.220027669766,-0.922183380494,-0.346123209945,0.878607410936,0.3290102445,0.88262850977,0.423835866801,-0.203297987581,2.53641256932,1.17368843522,2.1242793502 +-0.220865073269,-0.242809660876,-0.944596256607,-0.0390897183485,0.969939933463,-0.240184344603,0.974520709544,-0.0161243312449,-0.223717215726,0.832690421183,1.90523028138,0.820880298183 +0.838848499152,-0.284556548673,-0.464069785783,0.265850230603,0.958067191318,-0.106915442328,0.47503352551,-0.0336872012331,0.879322649609,2.81455096438,2.65900847344,3.02059816201 +0.197244174799,-0.558937413411,-0.805409028629,-0.275193869619,0.756949402719,-0.592702232025,0.940937335656,0.338550689872,-0.00451228936753,1.91004462762,2.20522742044,1.56318339411 +0.329891429851,0.0149349968833,-0.94390073121,0.9085894741,0.266332322721,0.321764294831,0.256196822902,-0.96376555227,0.0742909697941,0.0452415688734,1.23424980333,1.34388632484 +-0.105358011905,-0.197526857767,-0.974619325577,0.634813992338,0.741035151606,-0.218810646944,0.765448159224,-0.641755439825,0.0473188228477,1.08079818973,1.79657839058,1.78377140635 +-0.0746979433059,0.703655490216,-0.706603968539,0.275823211326,0.695518200769,0.663457601127,0.958301504413,-0.145338857463,-0.246038296107,1.67655721195,0.784687331513,1.92591712025 +0.25591432706,-0.602976430283,-0.755597301298,0.588198686891,0.717411866872,-0.373286107443,0.767157195068,-0.348912077455,0.538265919654,1.97217430026,2.28502715336,2.53524408032 +0.078705236033,0.465962090693,-0.881297234682,0.971378181064,0.162901720454,0.172879897113,0.224120314059,-0.86967945791,-0.439804189744,1.40346662171,1.07860032082,2.76706270996 +-0.803859468115,0.542230146512,-0.244533072886,-0.587706602477,-0.660640895587,0.467070183681,0.0917109858565,0.519172490885,0.849734676109,2.54816353199,0.247038116868,0.502586675412 +0.522880819144,0.255806391468,-0.813116682312,-0.220361118626,0.962047022507,0.160954974708,0.823429794438,0.0950190326671,0.55940571776,0.454990547322,0.949486463955,0.2801575738 +-0.584928281655,0.0463503509246,-0.809759563259,-0.715834679664,-0.498924274259,0.488523571535,-0.381365463448,0.865405230817,0.325014107024,3.06251680335,0.943742230333,0.983741360992 +-0.864389714098,0.497511737246,-0.0728868538526,0.105454385895,0.321101052675,0.941155399743,0.491639903443,0.805838808493,-0.330021241846,2.61933449807,0.0729515437771,1.90805491978 +0.409641913725,0.745697139853,-0.52548004542,-0.0910059391889,0.606560173164,0.789811797432,0.907695665712,-0.275718211124,0.316335338687,1.06845930851,0.5532792392,1.18984184415 +0.323563506575,-0.846308102015,-0.423165752012,0.873596073228,0.439004811126,-0.210011134582,0.363505925748,-0.301724000158,0.881377370753,1.93597212218,2.70465616677,2.90767835069 +-0.272076939033,-0.383928508531,-0.88236785956,-0.711951230352,0.697206837293,-0.083833594893,0.647379011745,0.60539369535,-0.463032276179,0.954278147929,2.06072195054,0.179113147888 +-0.865014645872,-0.249009408886,-0.435596116503,0.284453505429,-0.958540491203,-0.0169212875851,-0.41332295566,-0.138544003879,0.899983162795,0.280289024467,2.69089223584,3.12279308625 +-0.0445373864185,0.657586232123,-0.752061678676,0.4556601184,0.683312535482,0.570489119399,0.889038962988,-0.317276419192,-0.330068774825,1.63842163737,0.851184576955,2.09531057961 +0.80794201497,-0.494090218789,-0.321098981847,-0.0678853064149,0.46324398865,-0.883626953048,0.585338607662,0.735717243699,0.340732815713,2.59272981689,2.81470296246,1.93883377948 +-0.584339826799,0.535321380643,-0.609899980523,-0.80540111084,-0.474602346524,0.355079798541,-0.0993781539073,0.698701389794,0.708477487593,2.39994626485,0.655934373813,0.464596861809 +0.980257256547,-0.162718682472,-0.112331390809,-0.173156807803,-0.980737435761,-0.0903924886693,-0.0954590535154,0.108058838004,-0.989550835799,2.97709668796,3.02902367189,0.0910941781439 +0.132751053307,0.230288879353,-0.964024994433,0.664573925955,0.700917442748,0.258952187466,0.735335742901,-0.675042050911,-0.0599964558496,1.04786966311,1.30175060852,1.79846856504 +0.254977485753,0.706404992376,-0.660286656313,-0.915348973532,0.396417949566,0.0706333201456,0.311645212401,0.586382806712,0.747684736758,1.22439923912,0.721200389394,0.094189854564 +-0.749351132153,-0.383038609151,-0.540142855771,0.659293890207,-0.355600737573,-0.662479948205,0.0616802000436,-0.852542983865,0.519004830021,0.472535998422,2.57098580498,2.23534991295 +0.211830357907,0.367890753333,-0.905419401759,-0.39654574493,0.879108081469,0.264424759192,0.893240937064,0.303027019766,0.33210729237,1.04836335641,1.13236663047,0.672421289561 +0.000803609577237,-0.00472006280993,-0.999988537544,-0.806221632197,0.591603620581,-0.0034403331074,0.591613077939,0.806215155602,-0.00332999840727,1.7394333399,1.5755843281,0.801693515211 +0.110444823543,-0.69317763135,-0.712254668183,0.964662193412,0.247257971115,-0.0910513499132,0.239225403236,-0.677029000203,0.695990617272,1.72879941456,2.34888751776,3.01150873817 +-0.756302603261,-0.417084575207,-0.504030583819,-0.167488678588,0.868191643491,-0.467108994472,0.63241909747,-0.268856332074,-0.726472544463,0.503977576284,2.61333347399,0.571426040402 +0.303715258466,0.117048462421,-0.945545715034,0.8119535902,-0.551034974574,0.192592378243,-0.498486117295,-0.826232481957,-0.262395649017,0.367847417426,1.23926713923,2.50842536044 +0.299015202377,0.906211271011,-0.298949897205,-0.930382297642,0.346487920114,0.119728448792,0.212081797857,0.242337065896,0.946728080027,1.25208311559,0.303592037433,0.12579769631 +-0.579987497159,0.339611036322,-0.740458538439,-0.812655481833,-0.178033738343,0.554882920856,0.0566177621025,0.923562846817,0.37924411267,2.61186673985,0.83375234746,0.971252793132 +-0.663533584103,-0.435863694551,-0.608067449005,0.598542569803,-0.79689063841,-0.0819274224437,-0.448854068603,-0.418315849791,0.789646677263,0.581198427705,2.48796863348,3.0382105457 +0.00242012341577,-0.980388518503,-0.197059624963,-0.668734722673,0.14492743766,-0.729239266979,0.7434971511,0.133545462676,-0.655269101748,1.57326485683,2.94323482639,0.838774441856 +-0.196264476449,-0.082246583793,-0.977095570934,-0.0218368820098,0.996595518782,-0.0795017139971,0.980307811796,0.00573335842036,-0.197392306671,0.396828642094,1.78523700648,0.38288337083 +0.893709184711,-0.404781685001,-0.193483024191,-0.0297613011538,0.376820829608,-0.925807932201,0.447658528475,0.833161358838,0.324721406783,2.71631039621,2.94688163311,1.90813363452 +0.223512968642,-0.201278655844,-0.953692222654,-0.341013499959,0.900460014959,-0.269965839146,0.913100074304,0.38556278887,0.13262575219,2.40848846225,1.87631116869,2.02743448598 +0.200654330653,-0.978930998767,-0.037840973082,0.901462956707,0.199622152292,-0.384077510405,0.383539277356,0.0429545802901,0.922525081912,1.77296892132,3.10374264369,2.7470859903 +-0.249567478999,-0.690268880517,-0.679150164556,0.965122137788,-0.120021261983,-0.232667479085,0.0790906604945,-0.713529094896,0.696147181392,1.22386827696,2.39498845501,2.8190428022 +0.0258590924304,0.834342909788,-0.550638916373,-0.98276776271,0.122066896614,0.138806330289,0.183026861186,0.53756077018,0.823121853948,1.53981288232,0.583129449205,0.167062226258 +0.0493710951566,-0.0183190378156,-0.998612491318,-0.388720045986,0.920648146066,-0.036107021388,0.920032184661,0.389963336736,0.038332430003,2.78629139188,1.62348085325,2.38608114232 +0.407389063601,-0.125261602337,-0.904623502811,-0.105359694239,0.97748856818,-0.18279888924,0.907156814277,0.169781123972,0.385020628349,2.84329303255,2.01109711949,2.69832638606 +-0.00463831209473,-0.916428968439,-0.400170503494,-0.055363990156,0.399796361956,-0.914930433181,0.998455464533,0.0179113029221,-0.0525915446884,1.56573508075,2.7298897654,1.51337804183 +0.0283662587523,-0.308067442413,-0.950941536736,-0.988583651092,0.132186577841,-0.07231233251,0.147978782799,0.942136486696,-0.300800798332,1.66261549896,1.88532746103,0.235922597349 +0.960030430767,-0.279893717608,-0.00103867485725,-0.268883060834,-0.92122067902,-0.281166072177,0.0777397684494,0.270207267463,-0.959658564809,2.85790909615,3.14055397855,0.285009141306 +-0.22457052035,0.890911564045,-0.394771663674,-0.840860879141,0.0275681398143,0.540548776335,0.492464276187,0.453339368153,0.742941689477,1.81772063044,0.405819316365,0.628996580418 +-0.46063670181,0.391460118829,-0.796600781014,0.107295433267,0.915465553208,0.3878279398,0.881079746076,0.0931761571195,-0.463698916107,2.43720078241,0.921651060676,2.44505974676 +-0.0352399973607,0.0634413078102,-0.997363195155,-0.714962348485,0.695698613604,0.0695145975901,0.698274289112,0.715526826536,0.0208417291157,2.07783251244,1.49816073702,1.27950649342 +0.0874016689935,0.914105903825,-0.39594361322,0.871572232345,0.122309148526,0.474765537916,0.482413507339,-0.386588759251,-0.786019299482,1.47547173156,0.407095217162,2.59822795576 +0.581315118965,0.480191295063,-0.656878263157,-0.34224858845,0.876706364111,0.338011619374,0.738199591009,0.0283243936212,0.673987457272,0.690420340003,0.716671002072,0.464855080381 +-0.266863009892,0.799138024539,-0.538667385023,0.506804966212,0.591779287741,0.626854050655,0.819715109153,-0.105715147145,-0.562931121444,1.89309149609,0.56885460408,2.30251964885 +-0.430663811095,-0.281460291063,-0.85750147893,-0.161875513138,0.958808800658,-0.233413799993,0.88787668066,0.0382856152518,-0.458485781246,0.578866710647,2.11119920237,0.470898807431 +0.423388263594,0.302577243721,-0.85392586905,0.845825153101,-0.469677812454,0.25294774731,-0.324533801987,-0.82936708644,-0.454783516959,0.620495071262,1.02348326087,2.63400660851 +0.718070568175,-0.33242523237,-0.611447564396,-0.489573526904,0.383169357699,-0.783261773021,0.494663947419,0.861785767001,0.112396044946,2.70802819484,2.48370396839,1.71332079834 +-0.132975833663,-0.0553984274172,-0.989569826693,0.492870384081,-0.86992613378,-0.0175301529638,-0.859881510534,-0.490060747261,0.142983397063,0.394738767911,1.71535327285,3.01959875304 +-0.33071955538,0.671979250106,-0.662622413684,-0.940854984187,-0.289526381513,0.175972648834,-0.0735967011409,0.68162919673,0.727987062897,2.02815018868,0.724314797937,0.237175361408 +-0.10832033415,-0.542942356531,-0.832754647356,0.993187154384,-0.022900510996,-0.114257791695,0.0429648877161,-0.839457660684,0.541723965081,1.37387567677,2.15752792795,2.93372412379 +-0.342316396177,0.926946845181,-0.153587210136,-0.449050655253,-0.0178149825692,0.893328682744,0.825332050708,0.374769492628,0.422344448844,1.9245555796,0.154197540201,1.12916405808 +0.153469588829,-0.166040867714,-0.974103441917,-0.856189121016,-0.514502714843,-0.0471926421469,-0.493342958152,0.841259405099,-0.221122904679,2.31686933635,1.79887135125,0.21026803914 +-0.579307907069,-0.814873232521,-0.0195949924509,0.811579312929,-0.574398054971,-0.106798376722,0.0757718129161,-0.0777720346071,0.994087593223,0.952780483193,3.12199640696,3.03456957863 +0.413524794027,0.0561620270079,-0.908759083282,0.863936575655,-0.339278396198,0.37216093712,-0.287421011704,-0.939007985374,-0.188820458201,0.134987052388,1.14030083797,2.04031647645 +0.159479381026,-0.0906287267451,-0.983032431264,-0.950171188146,0.256080345038,-0.177757053595,0.267845179618,0.96239767808,-0.045273270052,2.62482432028,1.75527272149,1.32140671771 +-0.388770856142,-0.893066071177,-0.226473428745,0.359843886841,0.0791037988478,-0.929653142904,0.848156588442,-0.442917127148,0.290611114656,1.1602158638,2.9131371492,1.87377380699 +-0.3324414325,0.598727549804,-0.728702967651,-0.717721415809,0.340646615019,0.607318576173,0.611848562347,0.724903583094,0.316474536056,2.07765870662,0.816426089015,1.09041048604 +0.81868680963,-0.278232078147,-0.502333373795,-0.549884585756,-0.631912322832,-0.546181067597,-0.165465555589,0.723376614872,-0.670333814581,2.8139871141,2.61529742784,0.683694199706 +0.555443637701,0.64662594603,-0.52283577848,-0.712805491039,0.694036771394,0.101100405026,0.42824140071,0.316524637071,0.84641683398,0.861107611809,0.550174255968,0.118881939104 +0.929573609596,-0.00613725411364,-0.368585456108,-0.176704861541,-0.884922159939,-0.430915493754,-0.323524800054,0.465698512947,-0.823684769064,3.13499052453,2.76410577227,0.482000209816 +-0.553814769432,0.3173831465,-0.769777331101,-0.808341603472,0.0167716084767,0.588474778767,0.199682380932,0.948149066058,0.247265637075,2.62119845347,0.878492238312,1.17301489609 +0.705738860056,-0.54267108007,-0.455456650257,0.428220544476,0.83889023892,-0.335991565866,0.564411044094,0.042086409925,0.824420346306,2.48607951498,2.66870756522,2.75459563215 +0.387953799142,-0.723825375979,-0.570586255373,-0.426982256936,0.407489639541,-0.807241194395,0.816809648568,0.556802495285,-0.150973438892,2.06280966022,2.53437310717,1.38590829616 +-0.113332970688,0.820835264928,-0.559808097123,0.345981575731,0.560777865612,0.752213357163,0.931371240167,-0.108432713191,-0.347548499782,1.70799916328,0.594154189174,2.0036129297 +-0.347738490554,-0.935172476871,-0.0673081027089,-0.301550777758,0.179526083367,-0.936396024033,0.887775349185,-0.305324129237,-0.344430116983,1.21479522446,3.0742336251,1.21833062285 +-0.592608578949,0.370277401123,-0.715338883589,0.165152924347,0.925065967354,0.342019688941,0.788377817887,0.0845434933125,-0.609354423962,2.58311828573,0.79710895244,2.6301288972 +0.226474414302,-0.733423192516,-0.640936627403,0.582670346886,0.629321840878,-0.514246329547,0.780515603,-0.25699113073,0.569869241318,1.87029853538,2.44587479634,2.40745671948 +0.641056531501,-0.524783938656,-0.560043160077,-0.751351262176,-0.577983517007,-0.318443613366,-0.156581621675,0.62492949346,-0.764817183357,2.45559863084,2.54715475797,0.394534615512 +-0.0064261394462,0.000248954346148,-0.999979321163,-0.323871607488,-0.946099241666,0.00184574676218,-0.946079217928,0.323876771226,0.00616039490117,3.10287113003,1.56436532247,0.291103552586 +0.759364981366,-0.595724648378,-0.261681043239,0.117575021221,0.521185225494,-0.845305906232,0.63995385729,0.611128549522,0.465812147221,2.47637234863,2.87682912583,2.07445106427 +-0.850465094535,0.423548952416,-0.311954175938,-0.426009843357,-0.206679642536,0.880794606435,0.308585055279,0.881980617853,0.3562098446,2.67952999161,0.317249156808,1.18648650508 +0.0411318498288,0.909404472194,-0.41387398672,-0.936031894082,0.17996747352,0.302416933614,0.349503167641,0.374960283802,0.858633985689,1.52559769667,0.426705531676,0.338639646398 +0.832503264418,-0.34865187955,-0.430557988684,-0.220978712245,0.503689628244,-0.835143800273,0.508042048917,0.790404089872,0.342278616402,2.74498565842,2.69648174084,1.95975993956 +0.497746340478,0.865344398168,-0.0585461621212,0.350237376187,-0.13878494189,0.926322039156,0.793462261776,-0.481578459301,-0.372155648452,1.04881154396,0.0585796598042,1.95281577618 +-0.525289707446,-0.395216741808,-0.75357444904,0.743235500703,-0.644313835338,-0.180168454751,-0.41433285381,-0.654723917836,0.632190539052,0.645021684208,2.28810982968,2.86396205324 +-0.0148667336839,-0.838523734275,-0.544662213933,0.336351191485,0.508783898853,-0.792468813427,0.941619273494,-0.194979207415,0.274474502385,1.55306853254,2.56560636249,1.90421908241 +0.92959581787,0.0914361808497,-0.35705887502,0.350462497491,0.0807159961356,0.933092152909,0.114138745619,-0.992534308122,0.0429883001412,0.0980458383836,0.365117311008,1.52475808267 +-0.0307977131949,0.0185319232128,-0.999353825571,-0.708418109041,0.704929428995,0.0349039098069,0.7051207582,0.709035307977,-0.00858186437754,2.59990170173,1.5348451368,1.81188525241 +0.311133105548,0.340332469897,-0.887338718059,0.770541300316,-0.636863012021,0.0259154090595,-0.556293353492,-0.691794271336,-0.460389390633,0.83018922507,1.09154136144,3.08536179821 +0.401189708783,-0.643289237834,-0.652093378324,-0.295017023641,0.583218985997,-0.756849106582,0.86718612381,0.496018720271,0.0442001788632,2.12842692535,2.43125027679,1.62913032165 +-0.498093516984,0.376765568239,-0.780993312985,-0.829893179764,0.0539516165628,0.555307602371,0.251356636115,0.924736140561,0.285802225011,2.49399836573,0.896254712317,1.09547877764 +0.460493663472,-0.716415026871,-0.524113628114,0.824752975378,0.563635567273,-0.0457982194983,0.32821961475,-0.411174484346,0.850416032255,2.14207567635,2.58991864636,3.08779072684 +-0.39034594514,0.761600743591,-0.517295225645,0.88371907957,0.467524594372,0.0214788747635,0.258206567531,-0.448759469003,-0.855537437792,2.04442043963,0.543687425118,3.11649221633 +-0.668276989614,-0.617132958618,-0.415394723774,0.74045339871,-0.60559587485,-0.291517410636,-0.0716563290372,-0.502394812625,0.861663984832,0.745631030681,2.71321596013,2.81536161288 +-0.0690241569066,-0.970687122484,-0.230222014601,0.698272657988,0.117808742343,-0.706071097932,0.71249628832,-0.209493700313,0.669672627975,1.49980726299,2.90928683394,2.32974335689 +-0.808720798711,0.163720940873,-0.564947894281,-0.383035412057,0.582319484228,0.717068958608,0.446379370987,0.796303630412,-0.40822296034,2.9418478843,0.600370103457,2.08833172254 +0.71751922353,0.678491748531,-0.157528127772,0.544838974021,-0.405808114792,0.733805332739,0.433954670734,-0.612346896084,-0.660843871579,0.757449018952,0.158187025396,2.30392686076 +-0.120062702707,-0.092595994938,-0.988438631954,0.644773368802,0.749798304068,-0.148559099688,0.754885587557,-0.6551553136,-0.030319379278,0.656950627348,1.72300483196,1.36947149181 +0.655173539145,0.754886619742,-0.0298969051553,-0.215576659845,0.224736225303,0.950273819889,0.724067909338,-0.616149186781,0.309977164152,0.855996120412,0.0299013607142,1.25548150242 +0.653943879209,-0.555622864194,-0.513459478079,-0.749041904606,-0.380174008559,-0.542590037101,0.106271482483,0.73942609908,-0.66479727437,2.43730230839,2.60238121247,0.684525431095 +-0.484509771732,-0.827614852869,-0.283379491862,0.856026396558,-0.381826983034,-0.348463718947,0.180191813055,-0.411414402201,0.89345906463,1.04115966587,2.85427642397,2.76972231482 +0.191284315871,-0.56992125065,-0.799124570114,0.886349475607,0.450051134483,-0.108805254661,0.421657346187,-0.687490904964,0.591237125017,1.8946150516,2.21575506945,2.95959913581 +0.604481512634,0.394397523609,-0.692136326351,0.631981456639,-0.766366130092,0.115249265127,-0.484975813158,-0.507083373834,-0.712506079015,0.578099744419,0.764444725167,2.98122961636 +-0.266294236087,-0.07506557966,-0.960964379453,0.0472735596834,0.994746076954,-0.09080447643,0.962731837212,-0.0696089156299,-0.261346529503,0.274760081355,1.85112563705,0.334400019548 +-0.554523304362,-0.810005471745,-0.190774842846,-0.791991704935,0.584067871611,-0.177802870241,0.255446754206,0.0524962579131,-0.965396860711,0.970486293302,2.94964122751,0.182134855007 +-0.70832122799,-0.627951593948,-0.322424927135,-0.458849336238,0.756691460662,-0.46569874382,0.536412457548,-0.181919842293,-0.824115796698,0.725325898631,2.81330254359,0.514353977147 +0.314318946923,-0.0921892565886,-0.944830535374,-0.879001906486,0.347645980344,-0.326340191738,0.3585515974,0.933082747306,0.0282371861449,2.85629536314,1.9045157926,1.65710819436 +0.77914088566,-0.156547950982,-0.60698617722,-0.321632647687,-0.930973044834,-0.172747300224,-0.538044533691,0.32982105578,-0.775710094642,2.9433089782,2.48932992411,0.219120094254 +-0.866081295033,-0.0870294950827,-0.492269293558,-0.0843229785567,0.996052281607,-0.0277396393672,0.492740119821,0.0174848302979,-0.870000836223,0.100150331888,2.62689776077,0.0318738139549 +0.0544621724223,-0.17974699531,-0.982204097656,-0.998515074809,-0.0110173627452,-0.0533503804819,-0.00123172824342,0.983651175669,-0.180080113978,1.86499718993,1.75973513501,0.288021293152 +0.990537892466,0.137222137081,-0.00218373179657,0.0474816018812,-0.32772996065,0.943577538083,0.128764051942,-0.934752993035,-0.331144471402,0.137656804753,0.00218373353216,1.90831338432 +0.164617227946,0.684759280165,-0.709933726831,-0.928157343756,0.351118463418,0.12344946285,0.333804004611,0.638608293772,0.693364502719,1.33487165111,0.789404102746,0.176197782175 +-0.0143736765522,0.211677476617,-0.977233873397,0.417215359858,0.889459710582,0.186528192908,0.908693975396,-0.405035886242,-0.101099900767,1.63859591417,1.35700653447,2.06748347617 +-0.189516840913,0.103924756075,-0.976362131632,-0.718473415861,0.663083548222,0.210038469761,0.669237863328,0.74129606309,-0.0509983248304,2.64000415308,1.35293589131,1.80899154969 +0.353740119185,-0.853779024455,-0.382006944282,-0.93271512968,-0.291387872366,-0.212451393744,0.0700743529717,0.431456237919,-0.899408194212,1.96358864823,2.74962568637,0.231960626007 +0.679807857256,0.702410504497,-0.210904623908,-0.420455237934,0.608895565558,0.672654133368,0.600898219424,-0.368599611253,0.70926416551,0.801749149264,0.212500307679,0.758912175743 +-0.460564343109,0.14217727319,-0.876165571593,-0.880281562143,-0.199881142716,0.430292807443,-0.113951117623,0.969449922262,0.21721415934,2.84217134017,1.06784867439,1.10331174265 +-0.632236882229,0.566992759416,-0.528011113064,-0.767833793281,-0.549556759115,0.329269850437,-0.103478454981,0.613601319491,0.782806253216,2.41054593586,0.556256887649,0.39816129329 +-0.140022247926,0.702031527674,-0.69824458769,0.570261178877,0.633668876023,0.522748451385,0.809441756985,-0.324985368458,-0.489069067042,1.76766580631,0.77294237936,2.3229207491 +0.622205137507,-0.208336235864,-0.754623601331,-0.759102413483,0.0750824125053,-0.646626752599,0.191374744167,0.975171084558,-0.111431876663,2.81849095042,2.28651236383,1.40014446049 +0.248594679208,0.565089256454,-0.786685971472,-0.89642287666,0.441882901275,0.034139826611,0.366915128701,0.69671632233,0.61640867493,1.15635556867,0.905422361603,0.0553285248695 +0.358505232486,0.641248316378,-0.678435402248,0.750219131837,0.234593371993,0.618172471114,0.555558505026,-0.730593283955,-0.396973803839,1.06101325031,0.745630845272,2.14164972229 +-0.330227824602,0.842903463053,-0.424809764285,0.809935774698,0.484157158931,0.331052694176,0.484720150936,-0.234745814509,-0.842579834703,1.94419144012,0.438751735665,2.76721874741 +0.740570194018,0.207344778046,-0.639190058394,0.0177458470749,0.944839105452,0.327053741332,0.671744648393,-0.253549221701,0.696040170918,0.272990075762,0.693444630871,0.439260694928 +-0.320306684807,-0.776720365208,-0.542318266279,0.881760868444,-0.0351957594389,-0.4703817911,0.346267813331,-0.628861457548,0.696155060789,1.17966028681,2.56839872147,2.54737229283 +0.310458189273,0.207273783851,-0.927714013714,0.161368948444,0.950281481897,0.266317794453,0.936790144691,-0.232384775087,0.26157511563,0.588674984843,1.18824162168,0.79438209013 +0.411408102115,-0.278598639037,-0.867828423043,-0.614065129751,-0.788338716374,-0.0380274202222,-0.673548357535,0.548547961979,-0.495406644557,2.54634469481,2.09077772369,0.076609784016 +0.63217908057,-0.74848891012,-0.200284701158,-0.0550082948462,0.214482862839,-0.975177516684,0.772867192723,0.627504145784,0.0944184803705,2.27215121647,2.93994415227,1.66731730499 +-0.119409574029,0.195307358416,-0.973445627336,0.73217204886,0.679528955781,0.0465240703524,0.670570983937,-0.707174259998,-0.224140851919,2.11955102686,1.3398299462,2.9369325762 +0.312620194771,-0.0865993973795,-0.945922384868,-0.404413013794,0.888936924083,-0.215037808945,0.859487479894,0.449768484195,0.242877711059,2.87135730591,1.90116632059,2.41691677504 +0.842082629822,-0.530842875526,-0.0954079978559,-0.234324259283,-0.200752124862,-0.951204881124,0.485786976012,0.823349516225,-0.293439240849,2.57912472406,3.04603931475,1.27156689091 +-0.0628983610979,0.407690083505,-0.910951476196,0.517089664829,0.794004709794,0.319647930312,0.853617053894,-0.450938262557,-0.260753923584,1.72386928687,1.14558475277,2.25506952955 +-0.493361777154,-0.0241077253624,-0.869490065741,0.86409715066,0.100936423701,-0.493100347385,0.0996507454304,-0.994600752035,-0.0289667565822,0.0488253579933,2.08742363214,1.5121196186 +0.525525683375,0.16110615424,-0.835384679761,0.731239547002,0.416362444795,0.540306431079,0.434869498832,-0.894811221225,0.101001967087,0.297465964945,0.988832256584,1.3859946295 +0.0433926280803,-0.935230464446,-0.351370257991,0.979660080831,0.10880070313,-0.168607630385,0.195916323603,-0.336907087149,0.920929100841,1.61716086686,2.78255837025,2.96051385594 +-0.592388419663,0.0890946561265,-0.800710998113,-0.731246210127,0.357704682481,0.580798020232,0.338164073231,0.929574904126,-0.146749981926,2.99231245894,0.928481152762,1.81828593726 +-0.528099141416,0.283745844544,-0.800374657607,-0.0751412201374,0.923212074234,0.376873006496,0.845851697327,0.259167439493,-0.46622649478,2.64855486032,0.927919907545,2.46178247714 +0.937805116279,-0.194172477107,-0.287782231931,-0.0933643147369,0.657351844346,-0.747777812902,0.334372051186,0.728138449657,0.598339142557,2.93742760295,2.84968235733,2.2456325785 +-0.0222739429834,0.00186477533468,-0.99975016583,-0.505558237313,-0.862738466599,0.0096543739324,-0.862504921811,0.505646972565,0.0201593399458,3.05806739709,1.54844259898,0.446628237818 +0.310177677192,0.732678607477,-0.605782029048,0.718673740007,0.236417488037,0.653922645865,0.622332599175,-0.638191843802,-0.453225447772,1.1703261703,0.650748404695,2.17686777858 +0.531681656337,0.843059679668,-0.0810246433658,-0.236545258425,0.239673717224,0.94159590589,0.813241020259,-0.48146327564,0.326851888749,1.00813925258,0.0811135606679,1.23668465854 +-0.668517024746,0.54165156179,-0.509606292382,-0.734191673074,-0.589878630194,0.336163336534,-0.118522465438,0.598879609981,0.792019973192,2.46064585124,0.534727145611,0.401394492674 +0.457228362537,0.359802060784,-0.813317097784,0.842439874551,0.117861548731,0.525741108434,0.285021547008,-0.925554499955,-0.249221960018,0.66671417868,0.949830843683,2.01346054662 +0.984509021281,-0.127037327984,-0.120844959822,-0.12084931813,0.00770179930114,-0.992640984745,0.127033181976,0.991868035369,-0.00776988357183,3.01326552354,3.02045161727,1.56296900049 +0.759178637619,-0.169113475853,-0.628528780939,-0.335521427791,-0.929149005218,-0.155265893216,-0.557739336677,0.328759423269,-0.762131270803,2.92241274807,2.46193243761,0.200975593379 +-0.212008403115,-0.472430340071,-0.855489339962,0.41670232195,0.748120729553,-0.516405411373,0.883974893246,-0.465966680991,0.0382549384571,1.14897307087,2.11509755105,1.64474053695 +-0.410773880809,-0.775300772322,-0.479764037086,-0.298649526407,0.611596046236,-0.732638203076,0.861436752885,-0.157667335444,-0.482770889877,1.0835742297,2.64120689597,0.988156077532 +-0.14003259909,0.202363332046,-0.969247106282,0.495531002804,0.86180716747,0.10833942661,0.857228030603,-0.465120939049,-0.220958402434,2.17612351505,1.32215271565,2.68572226307 +0.375765851051,-0.464219423467,-0.802060067614,-0.791248511739,-0.611260788565,-0.016912747684,-0.482416643427,0.640984067852,-0.597003858367,2.25127743609,2.21085608753,0.0283218025513 +-0.047571810857,0.0344845707516,-0.998272376254,-0.952378096157,-0.302913348366,0.0349208439406,-0.301185797759,0.952393992926,0.0472524863538,2.51435324876,1.51200650756,0.636441057226 +0.245174419463,-0.808959232647,-0.534298104017,0.833700324385,0.457210070763,-0.309681643489,0.494806298628,-0.369518485477,0.786525788344,1.86507081025,2.57791547972,2.76649997607 +0.186392297748,0.0587388741122,-0.980717928871,0.359042602226,0.925094638707,0.123645943011,0.914519721563,-0.375166168656,0.15134075713,0.305284304038,1.37410185245,0.685023337345 +0.168170448879,-0.889026082701,-0.425853641995,-0.599018077411,0.250929596515,-0.760402314915,0.782876773866,0.382971228514,-0.490343751945,1.75774988669,2.70168750962,0.99805157793 +0.990464272423,0.134905311211,-0.0279478453679,-0.0391077953576,0.469824946885,0.881892907119,0.132102632055,-0.872390437987,0.470620673486,0.135371102966,0.0279514849074,1.08059379621 +0.723799085994,-0.689898126563,-0.0124682829306,0.5529781655,0.590769456431,-0.587542847653,0.412710590601,0.418368287892,0.809096993007,2.38017024896,3.12912404759,2.51351727326 +-0.312012611438,0.569040497304,-0.760816037378,-0.162513254203,0.757025302351,0.632852379161,0.936075623287,0.32110061356,-0.143724818521,2.07234383143,0.864569629182,1.79411475371 +-0.305698584448,0.946309817947,-0.105100446824,0.774547243424,0.311360521227,0.550573513281,0.553737251023,0.0869042822745,-0.828144131508,1.88325699894,0.105294906737,2.55486396429 +0.671607214726,0.580924862183,-0.459858732248,-0.537352022262,0.809228924696,0.237489687368,0.510094651314,0.0876062322694,0.855645133668,0.713125038423,0.477836105241,0.270741215088 +-0.0398487302394,0.0501531393634,-0.997946261735,-0.996978228128,-0.0686465743344,0.0363601494882,-0.0666820165934,0.99637960158,0.0527370668401,2.24219979313,1.50669575544,0.603617717449 +0.609131371993,-0.715462912618,-0.342157554823,0.0976004186286,0.495783154052,-0.862944507162,0.787040742235,0.492251851014,0.371826552623,2.27609145848,2.79238056904,1.9776378268 +0.295744839636,0.555261719945,-0.7773155165,-0.792085106322,0.597396200787,0.125375291142,0.533981436168,0.578620948159,0.61649138208,1.08139264508,0.890387388986,0.200632960279 +-0.774594522584,-0.0799802709588,-0.62738065147,0.521929241628,-0.641085326817,-0.56267172532,-0.357201892934,-0.76329074408,0.538325224828,0.102889753923,2.463407709,2.33408495279 +-0.758381602291,0.40577444057,-0.510102390394,-0.275682843329,0.509466967983,0.81513335009,0.590640597318,0.758808613495,-0.274505323966,2.65029735126,0.535303828935,1.8956288249 +0.498753826844,-0.438875598825,-0.747417439564,0.200507952432,0.89735896882,-0.393120136968,0.843232578367,0.0462070323032,0.535559267445,2.41996918116,2.29742644385,2.50838660508 +-0.0216523400227,0.714243096268,-0.699562703126,-0.885249728539,0.311480675898,0.345416714512,0.464611767279,0.62676677319,0.625539221577,1.60110213014,0.774785342125,0.504523297276 +-0.585442730143,0.76980173271,-0.254287439798,0.428199802436,0.559951097281,0.709295212058,0.688405214185,0.306365893941,-0.657448249,2.22099064292,0.257110852664,2.31827800034 +0.709300351051,-0.546011920525,-0.44582955784,0.196538572181,0.760571090813,-0.618792538307,0.67695317537,0.351287059915,0.646785744967,2.48554613519,2.6794918482,2.37830978972 +-0.280545460252,-0.476660127718,-0.833120259852,0.956534718459,-0.210818390223,-0.201486820232,-0.079596338579,-0.853434665917,0.515086103381,1.03882735843,2.15686722276,2.76872045326 +0.955120106605,-0.265569072493,-0.131219852514,-0.182372906264,-0.178121654335,-0.966960598638,0.233421732106,0.947494455916,-0.218560177041,2.87039511373,3.00999328155,1.34850362818 +0.238387322417,-0.970035502396,-0.0469319571495,-0.813696024533,-0.173119084535,-0.554913112324,0.530160602242,0.170472597977,-0.830583426977,1.81177207448,3.09464345055,0.588994525236 +-0.0672896056751,-0.0855825618565,-0.994056202674,0.0444976284099,0.995065593614,-0.0886815960191,0.996740723576,-0.0502004931519,-0.0631493503793,0.904493660556,1.67988065012,0.952001726452 +-0.639710552986,-0.71136077492,-0.291094926619,-0.232333302353,0.5399738206,-0.808980537271,0.732660661572,-0.449882341253,-0.510699749376,0.838380684495,2.84622152511,1.00768803792 +-0.0689754970521,0.0247891011162,-0.997310323456,-0.984284135704,0.16121097214,0.0720816388834,0.162564205804,0.986608596622,0.0132799120335,2.79657722768,1.49743580422,1.38860499949 +-0.384073980107,-0.858536342116,-0.339709474509,-0.25789491149,0.453038280581,-0.853373617448,0.88655366021,-0.240149256911,-0.395412369524,1.15014080763,2.79498466867,1.13689452261 +0.888484779425,0.452759709355,-0.0748561441362,0.236112117488,-0.311140693304,0.9205664218,0.393504592991,-0.835583696918,-0.38334582395,0.471287239571,0.0749262296855,1.96538054125 +-0.906300031824,0.154282461151,-0.393468136571,0.0906423799996,0.980280796548,0.175594757518,0.412800449689,0.123476645974,-0.902413046579,2.97297574108,0.404400988242,2.94941057714 +0.313045826168,-0.610421651725,-0.727590350283,-0.812539661767,0.224497675236,-0.537940602547,0.491712933299,0.759596077478,-0.425713742211,2.04465944304,2.32678982578,0.901335561562 +-0.335196679261,0.0187484883866,-0.941961613016,-0.693802739711,-0.681318925458,0.23332869558,-0.637401713664,0.731746551748,0.241383593939,3.08571807382,1.22842620418,0.768431833186 +0.269034893882,0.187611996397,-0.944680879812,0.74510225338,-0.662048070463,0.0807154533225,-0.610280966345,-0.725599125692,-0.317904153658,0.608946509119,1.23662028115,2.89294799929 +0.270098303746,-0.161179198796,-0.949246107282,0.31147237764,0.94750402025,-0.0722571074556,0.911060845543,-0.276147419843,0.306122096937,2.60357164786,1.89076234433,2.90979520234 +0.0194152902,0.996996911501,-0.0749680262757,-0.560922412871,0.0729318464474,0.824649618027,0.827640678825,0.0260404345395,0.560653906188,1.55132501624,0.0750384270839,0.973709091193 +-0.0972344287529,0.331653201256,-0.938377120332,-0.994865288017,-0.0589905199068,0.0822385387746,-0.0280806795458,0.941555241427,0.335686167094,1.85598550893,1.21790431192,0.240254423656 +0.974380753447,0.138333178615,-0.177330423238,0.220089640255,-0.748766185163,0.625227758668,-0.0462892813068,-0.648238483624,-0.760029059171,0.141027891942,0.178273217452,2.45320047442 +0.112821749974,-0.549504570458,-0.827838136219,-0.964569200372,0.139406138223,-0.223991487161,0.238490063582,0.82377828065,-0.514307139656,1.77329758352,2.16634981643,0.410748054167 +0.0260764551125,-0.0584643622501,-0.99794886484,-0.513778453532,0.855566101071,-0.0635479927655,0.857526512229,0.514381730862,-0.00772759859322,1.99033812852,1.63485624775,1.44978789096 +0.00580000094203,0.971550147132,-0.23676290165,-0.185467387416,0.233704081089,0.954454949533,0.982633303015,0.0383759571997,0.181546351423,1.56482655564,0.239032660379,1.38283223532 +0.285178267677,0.0540512762311,-0.956949222886,0.949838347191,-0.149662149025,0.274605818137,-0.128376282274,-0.987258679722,-0.0940203672746,0.187313154801,1.27630263237,1.90066936161 +-0.010356580339,0.217243811787,-0.976062430116,-0.938445335611,0.334932020428,0.0845038091565,0.345272491394,0.916856405296,0.200402691485,1.61843287492,1.3515536054,0.399046756286 +-0.473174062094,-0.0798198064172,-0.877345488086,0.87450628103,-0.162964591494,-0.456816490901,-0.106513245193,-0.983397854595,0.146913539797,0.167116829627,2.07129059878,1.88195266614 +-0.682229274418,0.364984592028,-0.63352147928,-0.656933510948,-0.686354781311,0.312018391067,-0.320938591199,0.629049570187,0.70802193393,2.65034784394,0.686096109401,0.415085053085 +-0.283599763268,0.925238682907,-0.25200109906,-0.920192744439,-0.188625895839,0.343024174806,0.26984530264,0.329171157716,0.904892182291,1.86821964192,0.254747534562,0.362340575516 +-0.0572565774817,0.0836731487337,-0.994846967385,-0.704125331263,0.703047855196,0.0996555627058,0.707763521389,0.706202886914,0.0186622695756,2.17089968156,1.46923388954,1.38567278172 +0.293685092496,-0.589020083955,-0.752864135912,-0.842259463885,0.213003594169,-0.495205476915,0.452048738458,0.779541409784,-0.433551759874,2.03332287175,2.28918971148,0.851683937578 +0.132536761641,-0.32446105613,-0.936567685685,0.849639359728,0.523797834187,-0.0612273411254,0.510438013097,-0.787629895291,0.345097352685,1.95859400761,1.92888710927,2.96599939192 +0.941654308518,-0.137464865634,-0.307230489969,-0.296043503285,0.0960328212756,-0.950334647059,0.160141835299,0.985840305503,0.0497341395124,2.99663428992,2.82931125833,1.62308191968 +0.595372628004,0.369865182952,-0.713253938134,0.506685802764,0.516110585641,0.690579003929,0.623539037352,-0.772547480631,0.119872678575,0.555885945783,0.794129787461,1.39892602012 +0.0606675121524,0.767929650473,-0.637654690953,-0.522579447228,0.568719629899,0.635191863851,0.850429405832,0.294689725801,0.435807057312,1.49195867604,0.691449833265,0.969458210518 +-0.649316074488,0.350605855684,-0.674880855685,-0.636445221507,0.235274581481,0.734563374617,0.416324531383,0.906488502557,0.0703738538088,2.64648899096,0.740803232085,1.47528417746 +-0.00789206791534,-0.827271555249,-0.561746819431,0.772784994524,0.351471581164,-0.528461048586,0.634618836391,-0.438280163264,0.636529206704,1.56125674035,2.54509691655,2.44869292332 +0.435987003788,-0.403264309251,-0.804545355721,-0.884504714012,-0.356941519339,-0.300406662148,-0.166032356543,0.842597560319,-0.512311046069,2.39516509047,2.20668311744,0.530341270043 +-0.783759335916,-0.496964964206,-0.372487755123,-0.512000336128,0.856491829467,-0.0654018490688,0.35153514642,0.139454546033,-0.925729696198,0.565101072663,2.75990440684,0.0705317774036 +0.348503347175,-0.507227787251,-0.788203900554,0.148780099594,0.860197859451,-0.487774665763,0.92542417246,0.0527220488604,0.375247233956,2.17279477407,2.23370765689,2.22653825826 +0.467313021541,-0.128750394605,-0.874666722694,-0.711500236632,0.532474843302,-0.45851712566,0.524772286969,0.836596603591,0.15722649169,2.87275040442,2.07684482403,1.90113392186 +0.164581436915,0.0922769873102,-0.982037630764,0.69427968697,0.696367890246,0.181789652332,0.700634474519,-0.711727981076,0.0505431901337,0.511003370493,1.38097323672,1.29961424886 +-0.0438982438977,-0.191015549933,-0.980604917317,0.997974509814,0.0368512965108,-0.0518542159093,0.0460415241363,-0.980895020697,0.189010942609,1.34490362479,1.7680682399,2.8738354493 +-0.99090955221,-0.131042287705,-0.0304331755143,0.0207024486233,0.0749887123996,-0.996969458727,0.132927303289,-0.988536601166,-0.071594135196,0.131481515513,3.11115477836,1.49910762527 +-0.752068343536,-0.645382499861,-0.133696056503,0.655199279516,-0.710095721196,-0.257833222957,0.0714640523161,-0.281505764793,0.956894661713,0.709202781689,3.00749506415,2.87839551051 +-0.244555074232,0.425172964856,-0.871447511685,-0.442902025244,0.750520672297,0.490465611934,0.862572090728,0.505911721954,0.00476632848711,2.09277309611,1.05814578989,1.56107866599 +-0.811938805064,0.34729179881,-0.469194824471,0.28578678109,0.937347991051,0.199260280604,0.509000287412,0.0276974755409,-0.860320613064,2.73741068224,0.488378791138,2.91399412402 +0.120717603789,0.22752611503,-0.966260382669,0.890695062842,0.404929568229,0.206626111134,0.438280235881,-0.885586761279,-0.153774260145,1.08299603213,1.31029269899,2.21058477075 +-0.169686556304,-0.01456302642,-0.985390476345,0.852967213216,-0.502991882239,-0.139449272425,-0.493612606999,-0.864168435355,0.0977727444075,0.0856133141004,1.74194092021,2.18228352805 +-0.951880529772,0.291911644695,-0.0933329991593,-0.294448584745,-0.955559312097,0.014367741869,-0.0849911053131,0.0411581432543,0.995531274879,2.84402937751,0.093469037822,0.0144312336605 +-0.0829412384194,-0.909823338899,-0.406622973975,0.162117507808,0.390275162053,-0.906312976596,0.983279545517,-0.141091423833,0.115128386983,1.47988569297,2.72283805599,1.69714899096 +0.908329417,-0.262458808953,-0.325657863126,-0.376192750995,-0.172364177353,-0.910367840196,0.182802309371,0.949424016954,-0.25529855409,2.86030707273,2.80988521642,1.29738475338 +0.00454120891325,0.00756871625469,-0.999961045219,0.809275715883,0.587372849209,0.00812106487992,0.587411434264,-0.809281070177,-0.0034577954471,1.03037885107,1.56196965883,1.97332833575 +-0.447170492218,0.653109342216,-0.611135613428,-0.229532932896,0.576583297295,0.784134130106,0.864495913007,0.490917394671,-0.107920934036,2.17116581411,0.657494511811,1.70756776785 +-0.640318864951,-0.0351339204278,-0.767305257914,0.438253939383,0.803683930957,-0.402524066035,0.630813154431,-0.594018305069,-0.499216403417,0.054814448282,2.26696424876,0.678577755464 +0.0227657617714,-0.586621883384,-0.809540910656,0.131865979359,0.804437958155,-0.579215793092,0.991006096641,-0.0935646162547,0.0956691120808,1.6095850998,2.19822297035,1.73448850195 +0.0620098125421,0.10622967479,-0.992406186671,0.993681172369,-0.0997737264728,0.0514094464491,-0.0935548546414,-0.989323233175,-0.111745377861,1.04242341186,1.44748011667,2.71040536828 +0.423378761444,0.748326757745,-0.510644189236,-0.866351280085,0.499256921028,0.0133411506496,0.264926185669,0.436748887174,0.859688621362,1.05592839569,0.535933862066,0.0155173390754 +0.789935960318,-0.116616476085,-0.601998152905,-0.362963198728,-0.880207013427,-0.305766790027,-0.4942255507,0.46003935812,-0.737634661615,2.99502354895,2.49559150724,0.392963471878 +0.665220505749,-0.663111388319,-0.343169004154,0.379133473633,0.695945285531,-0.609850775778,0.643225845176,0.275578384906,0.714364798874,2.35778228287,2.79130393859,2.43495645307 +0.449267718125,0.781501279751,-0.432913694861,-0.851365576491,0.521390556395,0.0576935253606,0.270804676137,0.342647978906,0.899587233087,1.04905390595,0.447722561387,0.0640456182959 +0.398041935463,-0.897814052627,-0.188394650983,-0.857011916263,-0.290668801779,-0.425490567528,0.327250963324,0.330819549872,-0.885135714128,1.98810271436,2.95206538364,0.448094090469 +0.262218942345,0.965008059393,-0.000819500595663,-0.515844019511,0.140886456751,0.845018315683,0.815564941504,-0.221157074519,0.534736733898,1.30547534643,0.00081950068739,1.00659994851 +-0.045478746149,0.185576203911,-0.981576872278,0.859223521836,0.508490349801,0.0563249827578,0.509574943626,-0.840832347559,-0.182576943031,1.81112752946,1.37854661472,2.84235607261 +-0.991306388714,0.126811752927,-0.0350773860748,0.011957116586,0.352322711824,0.935802187482,0.131029275573,0.927247262629,-0.350776058034,3.01435981193,0.0350845833978,1.92942668393 +-0.263648119071,0.692140831372,-0.671885956736,-0.945273745652,-0.324176318748,0.0369764809494,-0.192216583807,0.644864934627,0.739731032875,1.93474427237,0.736752193703,0.0499448156681 +-0.53890960553,-0.275821707935,-0.795926392639,0.333304634458,0.79793998674,-0.502194980271,0.773617772364,-0.535923654071,-0.338084869952,0.473054412949,2.22105637724,0.978274396252 +0.500490345637,-0.278698361625,-0.819656414086,-0.807642784097,-0.491291959316,-0.326106338497,-0.311805303388,0.825202662344,-0.470975603233,2.633505065,2.18078167013,0.605611123673 +-0.43877426618,0.50994613251,-0.739886535406,-0.858861554488,0.0041511444518,0.512190978271,0.264261184363,0.860196320579,0.436151712712,2.28131594716,0.832901680215,0.865408205299 +0.488270048446,0.173791362328,-0.855212793503,-0.266616351139,0.962823334465,0.043439013743,0.830968158894,0.206803745106,0.516453415048,0.341950423448,1.02596127929,0.083912717467 +0.837018561135,0.464793794062,-0.28873284766,0.546418557852,-0.682289878649,0.485702873296,0.0287521816745,-0.564311306368,-0.825061247153,0.506900814203,0.292903051607,2.60953302785 +0.590280919047,0.79660908855,-0.130316524852,0.645382450218,-0.368792841874,0.668934475665,0.484819481416,-0.478963255191,-0.731808903073,0.933085343603,0.130688220263,2.40105085216 +-0.172960803068,-0.706556790251,-0.686193895886,0.747196761076,0.359782710877,-0.558796386166,0.641702081062,-0.609371728179,0.465708638588,1.33072347821,2.38534894514,2.26558210967 +-0.046609680077,0.520752987133,-0.852434081977,0.805321757659,0.524477279202,0.276370132689,0.591002880166,-0.673602189718,-0.443819429095,1.66006285455,1.02062332214,2.58464285299 +-0.0444722671179,-0.052102600483,-0.997651009362,0.998422471151,0.0319443610313,-0.046174959662,0.0342751595018,-0.998130691253,0.0505997689709,0.864243884846,1.63935157227,2.40188544456 +0.847679618285,-0.508691254235,-0.150573811166,-0.525828068419,-0.768028421949,-0.365564201668,0.0703143456733,0.389057259208,-0.918526179186,2.60110074143,2.99044397767,0.378772387978 +0.402736105582,-0.306788782299,-0.862371307683,-0.856593958043,0.20570142347,-0.473216351605,0.322568473823,0.929283362295,-0.179950027112,2.4906067038,2.1016576801,1.20741332327 +0.055026672237,0.0639171589629,-0.996436983523,-0.697974887585,0.716084112866,0.00738915438286,0.714004987128,0.695081390984,0.0840162976147,0.860004683987,1.48635540855,0.0877233433493 +0.160775184741,-0.422688164257,-0.891900249898,-0.935962297155,-0.352095361428,-0.00185331181371,-0.313250567877,0.835082973277,-0.452228381979,1.93426100479,2.04006280582,0.00409815374748 +-0.472104549781,-0.15594290478,-0.867639962499,-0.295459916998,0.955292613209,-0.0109298030703,0.83055447234,0.251192821546,-0.497072866771,0.319031007839,2.0911568982,0.0219847890321 +-0.381607048108,0.645432490077,-0.661659248848,-0.913355626081,-0.153352060645,0.37717985869,0.141977326145,0.748264689965,0.648029623252,2.10475152193,0.723029514371,0.527109734279 +-0.377289934786,-0.725737635271,-0.575288788228,-0.66921146164,0.643054971814,-0.372338989141,0.640162732997,0.244510097903,-0.728290112047,1.09137859969,2.5286354861,0.47260777933 +0.00444185093137,-0.00753799587524,-0.999961723557,-0.465136125381,0.885196031779,-0.00873900386605,0.885228024198,0.465157138977,0.000425714623657,2.10328246911,1.57954580535,1.61947216635 +0.123392924488,0.164669356751,-0.978600117072,0.366140712506,0.909004915504,0.199125694561,0.922342216768,-0.382876045916,0.0518726192889,0.9277193514,1.36354456037,1.31595821751 +0.327817821172,-0.51502634913,-0.792012206866,-0.161898455735,0.795311267275,-0.584182230281,0.930765473228,0.319730899113,0.177335236205,2.13762750255,2.22749469711,1.86551734448 +-0.0565849846471,-0.163215592499,-0.98496640038,-0.362500365148,0.92258092247,-0.13205274235,0.930264276848,0.349578477398,-0.111369939213,1.23707457353,1.74441325886,0.870161199936 +0.231985030184,0.656098824121,-0.718134582622,0.50035135908,0.552627584368,0.666521770434,0.834165129478,-0.51394268745,-0.2000786115,1.2309335863,0.801118031763,1.86242114983 +0.77385629986,0.588526358201,-0.234058011763,0.339668022451,-0.0737255209649,0.937651418216,0.534576525571,-0.805109479053,-0.256956543109,0.650194385637,0.236249553136,1.83827234254 +0.179114010573,-0.210356655126,-0.961076609257,-0.938765436814,-0.328805196472,-0.102988336313,-0.294342701387,0.92067215686,-0.256369174673,2.2761476734,1.85071970898,0.381987286658 +0.438835064302,-0.27983841393,-0.853881870301,-0.697324977487,-0.705376808338,-0.127206265696,-0.566711268736,0.65125572577,-0.504682392737,2.57392369986,2.11819393566,0.246909133195 +0.265741467132,-0.0625009007974,-0.962016169327,-0.321965637036,-0.946353199304,-0.0274545212077,-0.908691147318,0.317031953541,-0.271608429948,2.91059648974,1.84729861742,0.100739087866 +0.00468639625555,-0.105577092731,-0.994400078027,-0.88503537797,0.462465677623,-0.0532717257199,0.46550017984,0.880328901327,-0.0912721647499,1.61515558935,1.6766750906,0.528316624641 +0.0705841559373,0.0489947937222,-0.996301855423,0.859352117238,0.504156537359,0.0856745261842,0.506489699332,-0.862221372981,-0.00651831606901,0.606777535117,1.48476811971,1.64673234571 +-0.166993314564,0.498449556816,-0.850682827028,0.703702596432,0.664581525736,0.251264902893,0.690590970594,-0.556668155152,-0.461740919103,1.89406906191,1.01728287404,2.64323755768 +0.174754907065,0.125446691994,-0.976587860832,0.31789733076,0.931543147856,0.176546455016,0.931880898802,-0.34130703355,0.122912567693,0.622601422605,1.35398272687,0.962621721852 +-0.205414325052,-0.710309409902,-0.673249951555,-0.686858711271,0.594672184187,-0.417839806751,0.697158565761,0.376597312204,-0.610036391231,1.28928629926,2.40299731083,0.600548564835 +0.895295064082,-0.445334995521,-0.0111126052633,-0.438096526692,-0.875673872924,-0.203142072399,0.0807352558129,0.186740488495,-0.979086210926,2.68001356933,3.1304798196,0.204578652111 +0.148697773191,0.656336519147,-0.739669754608,0.988876352792,-0.0960147602857,0.113598964329,0.00353993464729,-0.74833384224,-0.663312844306,1.348000201,0.832579497676,2.97197813345 +0.772558694454,-0.183785225842,-0.607763156489,-0.577471852823,-0.601316387831,-0.552218128028,-0.263968412543,0.777587032098,-0.570682998425,2.90804219251,2.48835187252,0.768955748369 +0.354053426855,0.840370097504,-0.41039526088,0.500875229989,0.200193188722,0.84204910259,0.789791222359,-0.503687191032,-0.350041481363,1.17205821907,0.422887463868,1.96476518571 +-0.579687993576,0.807186478635,-0.111408342651,-0.686257219127,-0.409911611526,0.600852311248,0.439332288022,0.424761650158,0.791558387774,2.19360566376,0.111640102814,0.649283957044 +-0.0396258778387,0.138624806523,-0.989551894962,-0.884540091176,0.455778755091,0.0992701038098,0.464778029718,0.879231988399,0.10455856573,1.84922129891,1.42611495469,0.759458359523 +-0.186773743605,-0.0612488457949,-0.980491788639,0.88801590497,-0.43739054408,-0.141835342811,-0.420170585859,-0.897183420956,0.136083018562,0.316880335575,1.76864461107,2.33549955304 +0.203349415005,0.720113302143,-0.663389664898,-0.764220268585,0.540283259218,0.352223481463,0.612059144611,0.435351388978,0.660191465874,1.29557710303,0.725339693649,0.490100439501 +-0.873341441495,0.210517589615,-0.439268791323,-0.0261150995359,0.880255947234,0.473779979458,0.48640798528,0.42524323842,-0.763266310035,2.90505657276,0.454784570097,2.58607198586 +-0.520079607695,-0.0916955054207,-0.849181450542,0.0772333237423,0.985098725653,-0.153673401801,0.850618725025,-0.145507508407,-0.505247810123,0.174516959578,2.12715928281,0.29526390297 +0.157671732707,0.413519799093,-0.896739092749,0.952764050298,-0.302411612178,0.0280692229916,-0.259577135289,-0.858806493092,-0.441668561545,1.20652094915,1.11234531521,3.07812532369 +-0.0239332089385,-0.0225655222447,-0.999458852938,0.962174971253,0.270867593976,-0.0291559810131,0.271378934711,-0.962352089279,0.0152292499958,0.755993221675,1.60369604947,2.05215349987 +-0.433356254167,-0.376784538731,-0.81867928296,0.0694183852491,0.891755054675,-0.447162174441,0.898545182372,-0.250611918781,-0.360291855863,0.715681845988,2.18248531477,0.892571401614 +-0.127979679833,-0.265704560902,-0.955521997583,0.991676308968,-0.0479973233991,-0.119475332929,-0.0141173574585,-0.962858942557,0.269635600313,1.12192678466,1.87016795325,2.72449218929 +0.0186532195756,-0.00453390149689,-0.999815733591,-0.326981796587,-0.945028894125,-0.00181492976189,-0.944846528331,0.326955399109,-0.0191103347244,2.90315381697,1.58999383017,0.0946871174557 +0.00599055232923,-0.763230002275,-0.64609912313,0.727500532449,0.446618592209,-0.520840482662,0.686080963568,-0.466917333925,0.557925725084,1.57864511327,2.43913019663,2.39055841749 +0.447861882964,-0.318481556865,-0.835457498455,0.330812768672,0.927122621651,-0.176086786861,0.830651940268,-0.197517448243,0.520580648668,2.52344546824,2.15262790553,2.81542298598 +0.243460608067,0.478829550213,-0.843474477482,0.681148670035,0.534689764844,0.500143324139,0.690480572956,-0.69629671636,-0.195978216025,1.10041205079,1.00371887378,1.9442520522 +-0.111854223205,-0.856879694367,-0.503235354613,0.683941641532,0.301000958689,-0.664546652875,0.720910856993,-0.418515964151,0.552387476343,1.44099360649,2.61425396588,2.26428876935 +0.47831283874,-0.0740689713122,-0.875060349796,-0.876524810919,0.0210586575424,-0.480895819056,0.0540470548611,0.997030751999,-0.0548506648052,2.98795828816,2.07603216503,1.45722777062 +-0.246900934587,-0.109602280166,-0.962822553061,0.899442789684,-0.395667110069,-0.185607667127,-0.360614193545,-0.911830509575,0.19627155989,0.41777959777,1.84432920896,2.3841120134 +0.973953710449,0.218691716724,-0.0599007757715,-0.21771873291,0.975754588505,0.022395007288,0.0633460594039,-0.00877017944242,0.997953085426,0.220876711803,0.0599366554262,0.0224371760618 +0.525721726873,-0.695263416028,-0.490127991679,-0.823589839484,-0.271825875896,-0.497805654339,0.212876589115,0.665371682239,-0.715516654091,2.21822027019,2.62935606841,0.607853736187 +-0.915076846561,0.199410280235,-0.350528037429,-0.301243037985,-0.915871910728,0.265388913116,-0.268117505868,0.348445380621,0.898164138547,2.92703059539,0.358134854106,0.287304222595 +-0.826118869322,-0.294202863884,-0.480595764267,-0.0619420822923,0.895126536115,-0.441488009784,0.56008105859,-0.334952473083,-0.757704459921,0.342122311294,2.6402587021,0.527575789101 +-0.2241511916,0.434183983218,-0.872490981054,0.801769673795,0.591093724302,0.0881680172898,0.554005084351,-0.679773843133,-0.480609913242,2.04736601047,1.06027723456,2.96015974956 +0.197128343216,0.0973891630234,-0.975528455365,0.792753197543,-0.60125569497,0.100169641365,-0.576786601861,-0.793099577727,-0.195730109392,0.458867747084,1.34911181876,2.66857002758 +0.456366925758,-0.653862478418,-0.603484124391,-0.889317869639,-0.313051660437,-0.333335243618,0.0290337013477,0.688812396241,-0.724358010221,2.18014883824,2.49372923934,0.431287493222 +-0.347062864092,0.833336463642,-0.430229830128,0.301802603844,0.533583258213,0.790065880081,0.887954141091,0.144358044178,-0.436690048432,1.96542316091,0.444747359026,2.07573011851 +-0.32998349749,-0.0456141442593,-0.942884002,-0.0232661355952,0.998921442206,-0.0401825737751,0.943699940828,0.00867768080858,-0.330688856082,0.137361108679,1.91040828343,0.120918924932 +0.78612043144,-0.579021405975,-0.216214890086,-0.608094170006,-0.661952527204,-0.438224066127,0.11061712199,0.475975906061,-0.872473947561,2.506751632,2.92365667126,0.4654679788 +0.41525402509,-0.0180002180097,-0.909527397497,-0.534533600519,-0.813828578127,-0.227940508338,-0.736096409829,0.580826168123,-0.347567314143,3.09827228713,1.99944704687,0.58045354642 +0.195197637965,0.969300612513,-0.149513225886,0.458773524838,0.0444983272938,0.887438308716,0.866847584666,-0.241818571351,-0.436003490249,1.37207431506,0.150075946642,2.02746432727 +-0.273478435704,-0.515526894266,-0.812060075667,0.960951778692,-0.109388867262,-0.254176621166,0.0422045522787,-0.849862398867,0.525311982311,1.08306046815,2.19391905641,2.69094150193 +0.683029980184,0.105556769303,-0.722722501811,0.454302750812,-0.836195939634,0.307222006283,-0.571908259054,-0.53817666151,-0.619101626739,0.153328943091,0.807733405431,2.68095884292 +-0.428957272834,-0.366837285474,-0.825485350608,0.61507957653,0.550649548058,-0.564324542935,0.661568418698,-0.749810296814,-0.0105710062177,0.707495805663,2.17053108863,1.55206637755 +-0.104917784475,0.403295555948,-0.909035177017,0.601990653291,0.753338935065,0.264740820928,0.791580388748,-0.519454659685,-0.32181880722,1.82530591712,1.14096290107,2.45319885166 +0.0410829773616,-0.12460588456,-0.991355416843,-0.853397153144,0.511642560017,-0.0996754221683,0.519639767509,0.8501148536,-0.0853185074383,1.88927634474,1.70237950772,0.862850407082 +0.537486425581,0.546059403424,-0.642594327899,0.755054324802,-0.650960097363,0.0783831502268,-0.375501410003,-0.527323505615,-0.762186730081,0.793309964387,0.697879416045,3.03911309056 +0.445705362293,-0.84601750621,-0.29257667236,0.880283135853,0.473595162127,-0.0284468476694,0.162629427706,-0.244871398076,0.955818846669,2.0556749507,2.84467234076,3.11183967981 +0.380038499602,0.0726145152243,-0.922115974809,0.0563754432189,0.993242022592,0.101449957903,0.923251075397,-0.0905395865653,0.373376532528,0.188795881762,1.17351418525,0.265304510392 +-0.952616216484,0.180152029437,-0.245086903733,-0.301896469664,-0.461539947084,0.834169886085,0.037160001294,0.868634631785,0.494057699837,2.95468702332,0.247609329097,1.03607657564 +0.953526060422,0.285264553323,-0.0970164249651,-0.121298872435,0.658157936754,0.743044220645,0.275816307788,-0.696744045475,0.662173013232,0.290693383347,0.0971692626467,0.842885431904 +-0.19341559172,-0.336577864302,-0.921577858969,-0.386955440572,0.88934143931,-0.24359246979,0.901585212773,0.309494984756,-0.302253136493,1.04922261505,1.96946696216,0.678341536149 +0.448004931267,-0.872137533523,-0.196641054158,0.601647162847,0.456797824759,-0.655252957821,0.661295904266,0.175248023998,0.729366750741,2.04533277551,2.94366175059,2.40966991972 +-0.00658514637795,0.535957960883,-0.844218988186,-0.420781114841,0.764371432539,0.488548428011,0.907138296645,0.35844856993,0.220487490518,1.58308239309,1.00510637474,1.14685234833 +0.0675427625357,-0.693023274211,-0.717744186066,-0.9134198382,0.246453150732,-0.323921354154,0.401375353518,0.677480321409,-0.616375080362,1.6679505214,2.34103545134,0.483859543538 +0.228178805382,0.571710620819,-0.788087177169,-0.661961999036,0.684665686411,0.305023293675,0.713961304699,0.452083912448,0.534676903838,1.19105232745,0.907695353341,0.518431893136 +-0.691490385477,0.613861934884,-0.380807788383,0.533346707041,0.789381357463,0.304003885796,0.487218982473,0.00711318422586,-0.873250860708,2.41559387946,0.390669750793,2.8065856852 +-0.0279186713082,-0.0342952087147,-0.999021714705,0.871193623147,-0.490882364881,-0.00749498748849,-0.490145099721,-0.870550597328,0.0435825505329,0.88753531713,1.61503307269,2.9712863101 +-0.156413032771,0.30871955684,-0.938204241306,-0.374459912042,0.860445979685,0.345561123851,0.913955544571,0.405370141066,-0.0189818671181,2.03975046647,1.21740444133,1.62567174115 +0.968076613166,-0.241492657732,-0.0671488443909,-0.245394460615,-0.967713007943,-0.0575594732297,-0.0510806200174,0.07219993435,-0.996081291732,2.89712592165,3.07439324454,0.0577217281287 +0.308587045122,0.524314923494,-0.793642171627,0.17354321022,0.789324074034,0.588939946291,0.935230875116,-0.31947044801,0.15258388866,1.03883636661,0.916772461442,1.31728809505 +0.238310265613,-0.158218816238,-0.958214497642,-0.811655392332,-0.574245141999,-0.107042239277,-0.533313923878,0.803249228496,-0.265267667685,2.5554943939,1.8608990461,0.383541807776 +0.174634574489,-0.137550213913,-0.974978309526,0.496269704622,0.867521825189,-0.0335001954521,0.85042292165,-0.478001905303,0.219761308832,2.47443020018,1.79496920596,2.99031822783 +-0.329180300931,-0.13553079486,-0.934490092576,0.396896036723,0.878121028393,-0.267164734812,0.856804449984,-0.458840781904,-0.235268509047,0.390570588097,1.93476866055,0.848796596021 +-0.167421610107,-0.090259447416,-0.98174499572,0.731680001932,-0.678788843455,-0.0623705120485,-0.66076802226,-0.728765351916,0.179684953754,0.494447563779,1.7621641251,2.80749442434 +0.168292146292,0.615159354676,-0.770231602735,0.978459847136,-0.00947770215526,0.206219544912,0.119557856448,-0.788345826092,-0.603503750978,1.30375552127,0.879204219939,2.81232766121 +-0.493154674136,0.738898045251,-0.459160261893,0.468161389533,0.670274869894,0.575809440821,0.733228055061,0.0690020109264,-0.676472720633,2.15931967026,0.47704969257,2.43640588782 +0.317761843548,-0.588014368167,-0.74381887151,0.743996162992,0.640941421326,-0.188848626902,0.587790030741,-0.493389498529,0.641147161347,2.06623775634,2.30282670235,2.85514515046 +-0.531605779958,0.837807583491,-0.124393519767,-0.846697572554,-0.529530090835,0.0519721418824,-0.0223274572222,0.13295238225,0.990870904159,2.13621230845,0.124716580049,0.0524029517041 +-0.811649159254,-0.023941756213,-0.583654379399,0.103656671082,-0.989205941177,-0.103570751082,-0.574874714023,-0.144562783069,0.805369893235,0.0294891155339,2.51837074847,3.01369440503 +0.266449787175,0.113923870023,-0.957092400322,-0.176082366247,0.98203277904,0.0678720943188,0.947628361338,0.150442589479,0.28172240958,0.404038891391,1.27679631506,0.236413120945 +0.634651030509,-0.581486365757,-0.509010487035,-0.715155902652,-0.192308760037,-0.671989118747,0.292865334881,0.790500441019,-0.537902359517,2.39988267562,2.60755783472,0.895773191516 +0.875552500563,-0.474500379325,-0.0908691849808,-0.097618689349,0.0104529061137,-0.995168994816,0.473157912592,0.880193232634,-0.0371680370393,2.64495554338,3.05059794734,1.53346521049 +-0.168860049507,0.172128964718,-0.970493638921,0.648060449789,0.761263495518,0.0222608133218,0.742633110694,-0.625179582117,-0.240096965838,2.34660821339,1.32726966304,3.04914103191 +-0.970762560733,0.170923154991,-0.16853879603,-0.125376749947,0.237696607609,0.96321388762,0.20469665667,0.956182826566,-0.209317177816,2.96730798106,0.169347070854,1.78478053149 +0.759595865953,-0.195758149007,-0.620236138519,-0.618133295479,-0.513903597976,-0.594822932483,-0.20230014693,0.835213648766,-0.511363678284,2.88936745564,2.47254894852,0.860703208749 +-0.303718218105,-0.256238404928,-0.917658500658,-0.315837110074,0.935773495232,-0.156763788933,0.898889405818,0.242218590245,-0.365141055824,0.700808551548,1.97944534248,0.405527337386 +0.000849931381634,-0.0276903285838,-0.999616188004,-0.897434039005,0.440957727087,-0.0129780028205,0.441147847384,0.897100623467,-0.0244754596121,1.60148085313,1.59850324111,0.487550238116 +0.165834541641,-0.130530624831,-0.977476680428,-0.985000434947,-0.0698452799484,-0.157783966308,-0.047676492677,0.988980987103,-0.140155482218,2.47475880647,1.78343866073,0.844497271292 +-0.0397615969203,0.562781100893,-0.825649106999,-0.262627938296,0.79136408278,0.552059285323,0.964077580611,0.238789281506,0.116336140563,1.64133109592,0.971351756875,1.36310387643 +0.252604050455,-0.65360085125,-0.713440341542,-0.543191960553,0.514398516575,-0.663578676673,0.800708241299,0.555157719383,-0.225091578975,1.93959399869,2.34719688365,1.24376740526 +-0.0893225291535,0.482725192287,-0.871204840733,-0.38297219206,0.790809336449,0.477444126045,0.919431229562,0.376293744457,0.114233235043,1.75376488539,1.0576512538,1.33595125313 +0.619583011808,-0.698379221334,-0.358306230323,0.0404736860373,0.484298854683,-0.873965960488,0.783886963929,0.526992488145,0.328329324339,2.29647917743,2.77513962007,1.93016081448 +0.489253661365,0.0987608674701,-0.866531676223,0.804652342095,0.332121439074,0.492168627676,0.336400747921,-0.938052045872,0.0830234667676,0.199183622314,1.0482109857,1.40368055586 +-0.0181640115089,-0.801388526457,-0.597868295153,-0.998518517884,0.0452154624587,-0.0302709662461,0.0512916964891,0.596432721787,-0.801022577867,1.54813453244,2.50075352171,0.0377724289939 +-0.613539138832,-0.540647349445,-0.575560742806,-0.61090189752,0.78681446326,-0.0878741828433,0.500368460964,0.297696899451,-0.813023959874,0.722327669406,2.52830296422,0.107665191543 +0.482842861939,0.861486381733,-0.157175013162,-0.199774477421,0.283112621523,0.938049786368,0.852615346358,-0.421531087373,0.308801900143,1.05994534388,0.157829456422,1.25277430705 +-0.0487005049355,0.297563663442,-0.95345903269,0.974879187397,0.221883225011,0.0194526203825,0.217344958073,-0.92856001457,-0.30089444751,1.73302222478,1.26450716208,3.07703317986 +0.688802619644,-0.716687040856,-0.109135863222,0.0216401107633,0.170802542802,-0.985067610359,0.72462587366,0.676155438373,0.133158425871,2.33635744385,3.03223897462,1.70515882426 +0.0722952326901,0.255741438393,-0.964038233691,0.997341227441,-0.00966122479879,0.0722297499716,0.00915835006219,-0.966696941872,-0.25575994057,1.29529607253,1.30180041995,2.86634844055 +-0.012148182067,0.50747955761,-0.861578156803,-0.542151017629,0.720656167993,0.432119152107,0.840193249054,0.472354936612,0.266375896248,1.59473002464,1.03837042132,1.01837559732 +-0.381802581139,-0.163759339502,-0.909620617489,0.420285012304,0.845773880275,-0.328674690047,0.823156909385,-0.507788757429,-0.254093054532,0.405178658245,1.99922271334,0.91268457235 +-0.704370746502,-0.563710540795,-0.431384141651,0.705211552779,-0.624961684147,-0.33481272254,-0.0808610987923,-0.540049367692,0.837739913791,0.67492612039,2.69556619964,2.76137777917 +-0.476713530556,-0.625987517953,-0.617157870525,0.850746536888,-0.151795080143,-0.503178480877,0.221301919914,-0.764916911181,0.60491948161,0.919951450038,2.47646717316,2.44775367003 +-0.0188435837476,-0.118891105559,-0.992728474645,-0.174718746405,0.978018389978,-0.113812954093,0.984438052396,0.171303630679,-0.0392018763603,1.41360935081,1.6914640938,1.23908217918 +-0.501377334518,-0.471661582292,-0.725366197325,0.829798552493,-0.49957261159,-0.248719858533,-0.245061483534,-0.726610320281,0.64185848265,0.754868532088,2.33002642558,2.7719087759 +-0.463030669089,-0.503320357148,-0.729569199983,0.310238477281,0.679020542996,-0.665344414122,0.830273862468,-0.534415306919,-0.158257995162,0.827066632161,2.32390082502,1.33727695241 +-0.162651438854,0.0576462596598,-0.984998181819,-0.958458557294,0.227836822967,0.171602960495,0.234311125193,0.971991404719,0.0181935637875,2.8009892575,1.39736346915,1.46516964347 +0.238344668512,-0.859142110461,-0.452842856877,-0.342857445656,0.361821440537,-0.866910616572,0.908647671515,0.361884068729,-0.208325058143,1.84141258,2.67164136322,1.33496068444 +-0.0168507599874,0.00328722919973,-0.999852612144,-0.998507797312,0.0518962655434,0.0169987155617,0.0519444953383,0.998647070665,0.00240783247257,2.94893328307,1.55362708242,1.43008452392 +0.357711917393,-0.919646640247,-0.162148824348,0.488863944403,0.33236248005,-0.806565078415,0.795647049902,0.20924922685,0.568472104016,1.94175520176,2.97872474581,2.18474068061 +-0.567872444767,-0.570443825223,-0.593392558716,-0.553168432814,0.798326634953,-0.238074082722,0.60952897504,0.193050320358,-0.76889921472,0.787657092792,2.50632551524,0.300267859322 +0.8669050049,0.289334748972,-0.405907767254,0.497962507115,-0.53952958329,0.678926483695,-0.0225622247902,-0.790691616113,-0.61179875304,0.322130908388,0.417971885997,2.30423354277 +-0.106497506118,0.725977222196,-0.679422809481,-0.947183583165,0.133806431548,0.291443131091,0.302492216386,0.674576097804,0.673383655353,1.71645281814,0.746975713623,0.408462082155 +0.164976274283,0.905668112034,-0.390574064382,0.0592622899999,0.386182420214,0.920516767529,0.9845155204,-0.175009740191,0.0100389705812,1.39061221166,0.401255105914,1.55989096041 +0.0605537630767,-0.0882015323819,-0.994260394194,-0.974800828319,0.209028968277,-0.0779117162582,0.214701157161,0.973923703432,-0.0733214362037,2.17243059615,1.67798872147,0.815741187646 +-0.716248019179,0.674979172851,-0.177177569798,0.071152998881,0.32320528208,0.94365014512,0.694208920839,0.663280831815,-0.279521935409,2.38584942245,0.178117904655,1.85877568056 +0.0306284382531,0.0936846438762,-0.995130688036,-0.514900863996,0.854810209358,0.0646266681344,0.856702398168,0.510414237144,0.0744198057904,1.2548186659,1.47207177258,0.715083595075 +0.209894959266,-0.976211545251,-0.054361061372,0.966348700099,0.215588581648,-0.140327307676,0.148708761985,-0.0230777464642,0.988611714338,1.78258176585,3.0872047826,3.00059078503 +-0.432596118937,-0.326045009969,-0.840568408492,-0.458121922266,0.882482457289,-0.106531764824,0.776521024969,0.338997587088,-0.531126852766,0.64586094825,2.1432609894,0.19795018661 +0.904452152804,-0.162163863681,-0.394549343689,-0.359461309025,-0.787744306349,-0.500246414408,-0.229682107712,0.594274170001,-0.770768668452,2.96418255093,2.73601529788,0.575687931471 +-0.000478830806738,0.0118949447799,-0.999929137994,0.342979775513,0.939278271225,0.0110092140216,0.939342666076,-0.342950199727,-0.00452948086272,1.61102958757,1.55889146705,1.96111404118 +0.399963857342,0.47202835949,-0.785632319,-0.0622687444912,0.869194549787,0.4905338297,0.914413208719,-0.147275464548,0.377039018223,0.867854295654,0.903717487627,0.915478244196 +0.630996700043,0.553274173945,-0.543811413066,-0.42817210423,0.832918142939,0.350593805311,0.646924890304,0.0116213428302,0.762465166874,0.719863134776,0.574972142969,0.430986997041 +0.981754011203,-0.146249171879,-0.121532881199,-0.189372519099,-0.809896305007,-0.555163060862,-0.0172368935106,0.568048549739,-0.822814520194,2.9937129064,3.01975858788,0.593551979477 +0.404108357874,-0.596960942722,-0.693061373877,0.767635179916,0.633358394604,-0.0979457734626,0.497426040383,-0.492437586754,0.714193641459,2.16587941354,2.37586549628,3.00530110011 +0.600237301793,-0.784592529306,-0.155337517985,-0.549413512091,-0.263321370906,-0.792973296118,0.581257235884,0.561316682971,-0.589121046264,2.22384783075,2.98562354411,0.931837510916 +0.242526632231,-0.451440660854,-0.858709591414,-0.923019946194,0.165142376778,-0.347508524097,0.298688820659,0.876886152884,-0.376637310013,2.06378104653,2.1088463732,0.745194810507 +-0.640867730333,0.53368295513,-0.551788959314,-0.0629069308367,0.679873105537,0.730626634076,0.76506945454,0.502946382601,-0.402136377313,2.44719841349,0.584507796336,2.07394603915 +-0.153397452915,0.593805728889,-0.789850604721,-0.97079324752,-0.239774816684,0.00827694711788,-0.184471385338,0.768051296219,0.613243438096,1.82359889237,0.910565366404,0.0134961812186 +-0.00997839591494,0.983276056528,-0.181847816248,-0.97039673965,0.0343640845909,0.239059150351,0.241310172374,0.178849954849,0.953824980989,1.58094409082,0.182865273821,0.245573484673 +-0.91942055962,0.368270067662,-0.137996347097,-0.315256191408,-0.480384645173,0.81844005673,0.235115648834,0.795994817788,0.557774938239,2.76061582525,0.138438120595,0.972587965143 +0.210705868436,0.60272229161,-0.769629051039,-0.555463026565,0.721674108367,0.413094792309,0.804402799054,0.340458985062,0.486850918007,1.23448654038,0.878259970737,0.703624727842 +0.622010065402,0.593874063559,-0.510310763331,0.699370938392,-0.128293803348,0.703150759478,0.352113290108,-0.794263367313,-0.495138298129,0.762261928019,0.535546108431,2.18431606652 +-0.334548586679,-0.408633621593,-0.849173602072,0.890227401363,0.158566382771,-0.427026786182,0.309147888579,-0.89881881687,0.31072868781,0.884756146036,2.12717414431,2.19984337825 +0.91102859403,-0.280986562433,-0.301783784507,0.13390939122,0.893816474224,-0.427972411901,0.389993815082,0.349483421834,0.85191910535,2.84242196133,2.8350295341,2.67605664342 +-0.266613578397,0.360550462209,-0.893823564254,-0.373984216435,0.816026694635,0.440722406398,0.888286556057,0.451778483158,-0.0827236150298,2.20751931263,1.10580078387,1.75633751974 +-0.851365498578,0.423547366318,-0.309490575487,-0.172739250075,0.330721801978,0.927784587703,0.495315999453,0.843344957998,-0.208401877403,2.67995360578,0.314657258318,1.79175202924 +-0.296048196211,-0.73879173597,-0.605427317176,0.314164141894,0.523260602568,-0.792148492234,0.90202902252,-0.424717685837,0.0771915142314,1.18966991361,2.49128999806,1.66793539743 +-0.040182389255,0.0904894963026,-0.995086441799,0.652366718288,0.756712627542,0.042469567794,0.756837525803,-0.647454747745,-0.0894388570965,1.98869610449,1.47162387776,2.69827103084 +-0.552429438299,-0.054947295466,-0.831746662405,0.799327981703,0.248095290347,-0.547287405825,0.236424392497,-0.967176055136,-0.093134231106,0.0991387447489,2.15934608609,1.40223680597 +0.526892022478,-0.135223703647,-0.839106278502,-0.847877420172,-0.152234168766,-0.507866752429,-0.0590650235917,0.979050207003,-0.194864094066,2.89037060657,2.14595448774,1.2044276757 +0.0231857749884,0.243215471032,-0.969695134817,0.381710745147,0.894317803183,0.233436445202,0.923990977703,-0.375555457369,-0.0721025073264,1.47575336276,1.32397988301,1.87037462118 +0.0299901588785,-0.479004709557,-0.877299879513,-0.618633786673,0.680499288694,-0.392699574832,0.785106889765,0.554504469151,-0.275920215523,1.63332403013,2.07138563626,0.958311340277 +0.302160730432,-0.272676785252,-0.913425565533,-0.848239292618,-0.514131398905,-0.127118083366,-0.434958613484,0.813213548488,-0.386645482467,2.40744050331,1.98997001571,0.317639460086 +-0.0388375169971,-0.0686981897933,-0.996881239663,0.110578650916,0.991211054548,-0.0726154756503,0.993108256554,-0.113053987375,-0.030899623031,1.05625559962,1.6497948432,1.16848198435 +-0.317998360568,0.761045534316,-0.565408469492,-0.847031712152,0.0398629433085,0.530045492726,0.425927600989,0.647472501692,0.631953351338,1.96659025492,0.600928397529,0.697921495274 +-0.0193480235519,-0.0320007557056,-0.9993005582,0.837758963449,0.545000963217,-0.0336729751252,0.545697327413,-0.837824505327,0.0162642284574,1.0269929462,1.60820015953,2.02075604816 +-0.393337300197,-0.58312968574,-0.710806259034,0.889762497877,-0.0467360374857,-0.454024713173,0.231535020344,-0.811033607447,0.537229952577,0.977370990949,2.35094885608,2.43993749609 +-0.110397700557,0.223430579441,-0.968447790995,-0.614159123882,0.750767879219,0.243220398169,0.781422368675,0.621632019529,0.0543388814003,2.02971514837,1.31892515718,1.35099181969 +-0.140373321202,-0.664079307653,-0.734366396182,0.504220022233,0.590376599662,-0.630252044622,0.852090077324,-0.458752813308,0.251968959215,1.36248244578,2.31685992641,1.95112233252 +-0.524240570423,-0.175607658572,-0.833266928765,0.404153683839,0.809976507195,-0.424968066602,0.749554283666,-0.559553400529,-0.353650064039,0.323227623568,2.15660198976,0.876738900144 +-0.730073268282,-0.669157082302,-0.138642786123,0.0554020251967,0.144255977908,-0.987988273433,0.681119401092,-0.72898491894,-0.068244775726,0.741890141972,3.00250181985,1.50183139186 +-0.565282557144,0.0502422558047,-0.823365864194,-0.733772858615,-0.486650453089,0.474076711586,-0.376872687453,0.872150819664,0.311961416222,3.05294569251,0.967316676908,0.988789867065 +-0.278103228268,0.385577863176,-0.879766051775,0.42850123572,0.869512736159,0.245630398452,0.859677431025,-0.30867023356,-0.407034889783,2.19565098874,1.0753698751,2.59863089472 +-0.166879120308,0.304797738471,-0.937683154284,0.281576260112,0.926145882114,0.250935479325,0.944915958669,-0.222153423709,-0.240378217373,2.07172407926,1.21590182651,2.33470997304 +0.517800331277,0.851548947912,-0.0821413795786,-0.749426715219,0.497809696245,0.436514724654,0.412604429744,-0.164468524752,0.895939556511,1.02446501257,0.0822340319751,0.453366975624 +-0.406558503058,-0.0253501459269,-0.913272989688,0.133180377759,0.98729299147,-0.0866921909646,0.903865681709,-0.156875489149,-0.398016218681,0.0622723894271,1.99034473202,0.214461117967 +0.0447000400069,-0.198591049509,-0.979062562597,-0.115571042352,0.972433936487,-0.202523019281,0.992292920761,0.122204067951,0.0205164612715,1.79219250403,1.77578857453,1.67175623984 +0.407380927848,0.0467053482273,-0.912063259907,0.731776941435,-0.614198643899,0.295402325342,-0.546391148913,-0.787768136116,-0.284390710309,0.114149461027,1.14828796935,2.33720445297 +0.16452833065,0.1805209672,-0.969712642392,0.965165559346,-0.232226127524,0.120525801171,-0.203435177554,-0.955763153766,-0.212440397376,0.831713862375,1.32405155213,2.62553459807 +0.097848298996,0.0667939351952,-0.992957340778,0.991086548761,-0.0971766684081,0.0911270979588,-0.0904055487725,-0.993023295466,-0.0757071424166,0.59897113619,1.45204497909,2.26402953782 +0.0873126164045,0.543527294706,-0.8348380603,0.972229030348,0.136171044963,0.190336961893,0.217134105027,-0.828272616004,-0.516543564486,1.41151639934,0.987838548865,2.78854867813 +-0.567249168389,0.504372651685,-0.651027349038,-0.817585931406,-0.439827317166,0.371625047383,-0.0989021017474,0.743074800614,0.6618596641,2.41480146337,0.708937111737,0.511618976328 +-0.365527035733,0.859937549701,-0.356226608724,-0.824781539001,-0.121850145368,0.552166600761,0.431422529628,0.495640951383,0.753800138127,1.97271974467,0.364226463277,0.632213618641 +0.501830459208,0.76239854787,-0.408551887055,0.859914822266,-0.38876922363,0.330764250191,0.0933417840904,-0.517307398907,-0.850694049808,0.988660128022,0.420866933429,2.77076387074 +-0.599265100955,-0.782892942694,-0.167212377104,0.00623701177671,0.204299527992,-0.978888554712,0.800526350885,-0.587656654128,-0.117546664764,0.917480566036,2.97359109705,1.45128679789 +0.023055865623,0.00578389196158,-0.999717446909,0.335071606503,0.942100502216,0.0131780969674,0.941910529496,-0.335280763418,0.0197829246111,0.245791889911,1.54702380492,0.587634383136 +-0.603014256444,-0.361610104807,-0.711063948339,0.79771665788,-0.278574628837,-0.534831104097,-0.00468404388129,-0.889738336968,0.456446876934,0.540177483419,2.35058243373,2.27728477137 +-0.358466636492,0.42978018319,-0.828728341895,0.527240287756,0.825794914777,0.200200993242,0.770402070019,-0.365173592782,-0.522617352989,2.26596903371,0.976831612981,2.77576247666 +0.960494065062,0.277245907207,-0.0242045019952,0.237125836021,-0.769760856329,0.592654673444,0.145679404417,-0.574980809246,-0.805092901551,0.281011022952,0.0242068660183,2.50702628344 +0.343523251866,-0.0907230140294,-0.934751897646,-0.203082206766,0.964597635239,-0.168252843621,0.916923875097,0.247630242129,0.312937486506,2.88339207367,1.93403251929,2.64827565843 +0.09481140067,0.422148896118,-0.901554827955,0.312494733482,0.847236592975,0.429577928984,0.945176089334,-0.322460020825,-0.0515916187031,1.34986995241,1.1233497758,1.6903222474 +-0.436647338413,-0.111706854075,-0.892670533069,0.333137696619,0.901644544387,-0.275783231306,0.835678393252,-0.417802219155,-0.356486926438,0.250456786587,2.03835664307,0.658443494928 +0.19891457776,-0.862559301252,-0.465214404955,-0.0110023926602,0.472704995087,-0.881152049862,0.979955069435,0.180392459495,0.0845376983776,1.79744374465,2.6577158465,1.66644354952 +-0.820155291368,0.47889496478,-0.313057360159,0.316591429768,0.835630015287,0.448878986085,0.476566012887,0.269039198369,-0.836960420272,2.61308979206,0.318410506299,2.64931260551 +-0.126345227966,-0.242978186679,-0.96176841504,-0.414028157956,0.893969905147,-0.171459887763,0.901453031383,0.376536066653,-0.213548642515,1.09128814382,1.8482047208,0.676511526181 +0.197141790221,-0.163205696741,-0.966694892456,-0.177198761081,0.96387385831,-0.198866247356,0.964228040258,0.210501985305,0.16109997071,2.4500935666,1.82960760531,2.25166074991 +0.0416676702239,-0.0543002822073,-0.997654892541,0.466663045604,0.883971926387,-0.0286222855115,0.883453115409,-0.464376046661,0.0621729857879,2.22531332157,1.63929486139,2.71015244913 +-0.0400613398041,0.136383661933,-0.989845738391,-0.364333746709,0.920445396722,0.141566919378,0.93040636824,0.366305566994,0.0128148947329,1.85650017327,1.42816748586,1.48052055277 +-0.374829086023,-0.921194890725,-0.104418051947,-0.0755841856766,0.142619131166,-0.986887437503,0.924007676996,-0.362021762781,-0.123085564249,1.18436062653,3.03698391732,1.44671607316 +0.27516057179,0.794101012183,-0.541931953461,0.961385937344,-0.230132458435,0.150917630025,-0.00487228999563,-0.562532340426,-0.826760924794,1.2372378046,0.572734198872,2.96103971404 +-0.0414279492514,-0.180820002001,-0.982643298403,0.584305653908,0.793393020049,-0.170629477373,0.810475556591,-0.581232864362,0.0727855037381,1.34557192354,1.75738220233,1.97399646068 +-0.092665904599,-0.375699690347,-0.922096943275,0.922951098139,0.315065465037,-0.221122190622,0.373596440788,-0.871540874207,0.317556615451,1.3289741455,1.96812765353,2.53333828277 +0.769204123701,0.631974644566,-0.0945148914539,-0.123683147463,0.292359576359,0.948276519347,0.62691904989,-0.717728309833,0.303048804896,0.687770920318,0.0946561780894,1.26147576011 +-0.00439317050994,-0.432207442064,-0.901763509506,-0.524335505948,0.768862440245,-0.365954676405,0.851500427044,0.47121892471,-0.229999451608,1.56063218154,2.01776031832,1.00969011462 +-0.866665852834,-0.109124983355,-0.486808008911,0.401982588673,0.425158672351,-0.810956288421,0.295466238234,-0.898516466923,-0.324604160065,0.125254398969,2.63316085396,1.19005435745 +-0.0654217134222,0.31682919211,-0.946223685203,0.4739780637,0.844319885356,0.249937444821,0.878102952133,-0.432137934251,-0.205406940576,1.77442336299,1.24135640694,2.25870926158 +0.193250310684,0.0300746946435,-0.980688447043,0.426015758524,0.89782085013,0.111482261194,0.8838353302,-0.439332714254,0.160691864375,0.154387160202,1.37395105223,0.606528585325 +-0.888039048267,0.376755898301,-0.263517820741,-0.254752512455,0.0739144745982,0.964177269926,0.38273725472,0.923358892057,0.0303405719993,2.74035234592,0.266667112005,1.53933887158 +0.228820182224,-0.107652865412,-0.967497899107,-0.719678356701,-0.687961375731,-0.0936600683229,-0.655518410957,0.717718612041,-0.234894884632,2.70184746703,1.82645120134,0.379412653361 +-0.44754126253,-0.803624986062,-0.392292875426,-0.709378308342,0.586137811393,-0.391439499424,0.544508249696,0.103098728568,-0.832394989282,1.06266866842,2.73846969345,0.439571297009 +-0.793425101997,0.064876153932,-0.605200538807,-0.0192283857636,0.991135483055,0.131456165354,0.608364098794,0.115937650829,-0.785144308021,3.0600069483,0.650017753365,2.97570204215 +-0.946518163952,0.135392133771,-0.292869143854,-0.209109865657,0.433847819845,0.876384124286,0.245716156151,0.890755319562,-0.382333010971,2.99951415113,0.29722618223,1.98216711141 +-0.830148795878,0.0296889652358,-0.556750879699,-0.552940023357,-0.17187554993,0.815301248561,-0.071486413197,0.984671194196,0.159098497946,3.10584446306,0.590469248966,1.37807745791 +-0.442666388484,-0.23924081435,-0.86418186816,0.89274287868,-0.207872805231,-0.399748732846,-0.084003696783,-0.948447536554,0.305598837256,0.495484688319,2.09807048329,2.22349871388 +-0.666969620269,-0.00611512746312,-0.745059816964,0.742652131983,-0.0861971321951,-0.66410681766,-0.060160921697,-0.996259333516,0.0620322809763,0.00916826784353,2.30096813606,1.6639331683 +-0.284497439958,-0.281262489478,-0.916489289992,0.902387024065,0.244192280049,-0.355060261313,0.323664742375,-0.928041778358,0.18433554233,0.77968034024,1.98237779058,2.04965963334 +0.0463031389313,0.0883151233577,-0.995015808071,0.975712181399,0.209498949292,0.0639994477734,0.214106885445,-0.973812419941,-0.0764696827068,1.08790249929,1.47091301686,2.44473799554 +0.409240718376,0.368494521478,-0.834705829657,0.820598225761,0.251327622815,0.513276706942,0.398924286428,-0.895011851123,-0.199532453618,0.733055185938,0.987598389694,1.941560423 +0.309590492821,-0.298337852066,-0.90285561015,-0.645556623347,0.631199530921,-0.429934644125,0.698147815873,0.715948097414,0.00281939745017,2.374702191,2.01522695384,1.57735396776 +-0.146872082089,-0.126182740002,-0.981074160106,0.713433211714,0.673497350469,-0.19342794869,0.685158116004,-0.728340054533,-0.00889500068212,0.709772746148,1.76565956566,1.52484258262 +-0.079338185986,-0.485540639033,-0.870606535751,-0.880788973645,0.443131169439,-0.166869861198,0.46681499135,0.75358148499,-0.462816064254,1.4088260054,2.08515882811,0.346045317298 +0.633714612689,0.672482128655,-0.382326530998,0.770862546373,-0.590269977574,0.239483377655,-0.064627581295,-0.446485319147,-0.892453996306,0.81506914444,0.392312805335,2.87942629791 +-0.24212456949,-0.460066939851,-0.854233049996,0.203024512864,0.836915149374,-0.508285431549,0.948765903701,-0.296498640139,-0.109232853894,1.08634550438,2.11751882195,1.35911139765 +0.511904055071,-0.161089534376,-0.843803531823,-0.852056506667,0.0298038760454,-0.52260064908,0.109334111094,0.986489681085,-0.122000660917,2.8367166308,2.13726091381,1.34145458942 +-0.975222195011,-0.0389329601069,-0.217774872231,-0.019729433892,0.995776076592,-0.0896702555205,0.220346136331,-0.0831518484709,-0.971871056416,0.0399009544391,2.92205861154,0.0920051011835 +-0.785811162348,-0.346585734548,-0.512229583037,0.481633603086,0.176633347614,-0.858387868559,0.38798181595,-0.921237748423,0.0281268799104,0.415390190209,2.60381385284,1.60355170577 +0.291931939228,0.795644408109,-0.530778408287,0.953507864121,-0.285523076619,0.0964330118642,-0.0748230974906,-0.534253262567,-0.842006505627,1.21913478386,0.559518765793,3.0275618535 +0.866114704449,-0.473952490965,-0.158790286369,-0.417383682592,-0.510973294313,-0.751463341758,0.275020326964,0.717129924635,-0.640381519837,2.64088879059,2.982127381,0.865038414659 +0.634672574458,0.502817710113,-0.586826272101,0.761827880862,-0.279703389838,0.584281005728,0.12964953981,-0.817887745421,-0.560580621068,0.66999585048,0.627133675725,2.33549591898 +-0.759147654532,0.156629013203,-0.631792838549,-0.410604457479,-0.868370959506,0.278093250879,-0.505073081956,0.470530794858,0.723534348165,2.93812551312,0.683863967891,0.366946028583 +-0.995146001751,0.094698690911,-0.0267692573454,0.0532628635579,0.747032373049,0.662650511947,0.0827496378523,0.65800820022,-0.748450202671,3.04671774616,0.0267724554878,2.41692310332 +0.223885834866,0.541752458918,-0.810172454606,0.892697303973,0.219597576682,0.393533261357,0.391109519732,-0.811345288747,-0.434456172708,1.17890952229,0.944446250317,2.40557874149 +-0.649975655056,0.0309327727074,-0.759325234276,-0.746183587244,0.163377081959,0.645382044388,0.144019797122,0.986078644259,-0.083109598565,3.09403787022,0.862275520314,1.69886730261 +-0.248768924851,-0.100385073282,-0.963346697244,0.130601775681,0.982054359428,-0.136060322346,0.959717249098,-0.159662369361,-0.231194138318,0.383543521204,1.84238214454,0.531928965471 +-0.23341477464,0.217873528499,-0.947654298022,0.515109667463,0.854299094124,0.0695347989478,0.824730000343,-0.471915440898,-0.311634791344,2.39061839776,1.24580751241,2.92205964693 +-0.205633999129,0.80761157112,-0.552700831007,-0.852032874991,0.130076342455,0.507070138213,0.48140901356,0.575190138412,0.661363490327,1.82011840751,0.585601584932,0.654106336663 +-0.122743670794,0.306754088114,-0.943841046313,-0.948397886539,-0.316419468415,0.0204980198176,-0.292361830765,0.897652855748,0.329763415919,1.95142083055,1.23406911227,0.0620799019075 +0.0280443979392,0.883917208104,-0.466801757668,0.327724256691,0.433044203778,0.839684184173,0.944357095235,-0.176530696458,-0.277536646027,1.53907956275,0.485670871462,1.89001728871 +-0.665255060443,-0.551934081312,-0.502796653172,0.576470822688,0.048243505058,-0.815692316262,0.47446506209,-0.832491041457,0.28607965805,0.692565212211,2.6147615594,1.90811248089 +0.801529344669,0.389965521052,-0.453296373276,0.362925382736,0.28521050869,0.887096461665,0.475221923106,-0.875546605341,0.0870762061413,0.452811083777,0.470460016171,1.47295110673 +0.220273505725,-0.487134609929,-0.845091388244,-0.0608603159355,0.857819584231,-0.510334775273,0.973537674987,0.163845758926,0.159307760835,1.99546332952,2.13485656964,1.87337437358 +0.575361724424,-0.411389812123,-0.706906859882,-0.0634727455939,0.839230844353,-0.540058145438,0.815432459885,0.355598105124,0.456749264912,2.52086324788,2.35647718166,2.27281256454 +-0.507520644185,0.860369791555,-0.0467612821177,-0.26797871136,-0.106032809261,0.957572166272,0.818907934987,0.498518670803,0.284374627695,2.10374634295,0.0467783404143,1.28211741863 +0.0803446159428,0.898213342446,-0.432154525767,0.337384423358,0.383459009592,0.859727246769,0.937932030354,-0.214876660935,-0.272234323738,1.48158438697,0.446880553471,1.87745928614 +-0.980262454698,0.1727398074,-0.0961586129772,-0.132268755515,-0.211532342173,0.968379597332,0.14693704851,0.961984941231,0.230205292339,2.96716550587,0.0963074210874,1.33740623607 +0.233785733678,-0.790942467729,-0.565468163094,-0.94945077943,-0.0604035590333,-0.308049715948,0.209493312944,0.608901817044,-0.765082432835,1.85819194836,2.54059188181,0.38277670705 +0.748542238787,0.646457184944,-0.147572439112,-0.197313233633,0.429627755238,0.881185269829,0.633049764698,-0.630486399508,0.449149079317,0.712349095035,0.148113386848,1.09941080441 +0.272270454694,-0.417791707878,-0.86678652985,-0.345563316804,0.798266646999,-0.493311619941,0.898028281058,0.433843807283,0.0729709346374,2.14835830395,2.09287083756,1.71765198155 +0.073542712045,0.116403737336,-0.990475461301,-0.573233956052,0.81764139999,0.0535291757006,0.816084738942,0.563837486299,0.126858140888,1.00732924011,1.43266814943,0.399293691537 +0.573988361118,-0.577901917436,-0.580143719371,-0.789909397051,-0.577491542721,-0.206268423509,-0.215825174048,0.576656649931,-0.787963579322,2.35279699537,2.52268752602,0.25602906451 +-0.430204397074,0.00250953378169,-0.902728020491,-0.715921463864,-0.610087876485,0.339483785394,-0.549891475037,0.792329783112,0.264259116164,3.13575936752,1.12606903329,0.909356525727 +0.659844595508,0.747184063571,-0.0795052509242,0.439997455662,-0.298443919876,0.846955409511,0.609103725805,-0.59384105772,-0.525685694475,0.847392316081,0.0795892499858,2.12628088527 +-0.755686390508,0.164261581092,-0.634000167333,-0.642478485369,0.00196542019487,0.766301202506,0.127119923849,0.986414856995,0.104049290532,2.92755480187,0.686714945972,1.43584046907 +0.355919027887,-0.501759588602,-0.788390107012,-0.458144729467,0.641610994942,-0.615173746214,0.814509086782,0.580148814025,-0.00151694937622,2.1877644497,2.23340502728,1.56833044409 +-0.146280729634,-0.0451322931298,-0.988213045985,-0.117351644723,0.992696576525,-0.0279660228926,0.982257878369,0.11187753605,-0.150508728348,0.299265864737,1.72448550959,0.183714822572 +-0.657036664195,-0.640213047309,-0.398032757395,-0.613966742282,0.760815794921,-0.210247866983,0.437433036333,0.106238318203,-0.892953390984,0.772430209994,2.73222124239,0.231240479625 +0.667559425582,-0.138994061307,-0.731467746546,-0.724607063732,-0.347172972285,-0.59532808644,-0.171198763154,0.927443571457,-0.332474668596,2.93631329757,2.32112066845,1.06147120799 +0.0601586403778,0.945960799125,-0.318652011614,-0.473939090521,0.308021409068,0.824926996789,0.878500242723,0.101395158039,0.466857949983,1.507286575,0.32430702567,1.05579866637 +0.928917029829,-0.359277817584,-0.0896247816498,0.356378699232,0.933156570212,-0.0470429399948,0.100535438664,0.0117586249911,0.99486399086,2.772542676,3.05184744945,3.09434204893 +0.524216231756,-0.435622166419,-0.731731282978,0.0584264357352,0.875631266721,-0.479433244933,0.849578539024,0.208574238257,0.484471973559,2.44823472534,2.32073410099,2.36142185346 +0.997404817213,0.0573545420526,-0.0435211110308,0.0644304256704,-0.441282338898,0.895052298821,0.0321302170449,-0.895533558211,-0.443832508126,0.057440518041,0.04353486155,2.03113710338 diff --git a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle/RotationVector-EulerAngle-ZYX.csv b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle/RotationVector-EulerAngle-ZYX.csv new file mode 100644 index 00000000..e1e36c9e --- /dev/null +++ b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/EulerAngle/RotationVector-EulerAngle-ZYX.csv @@ -0,0 +1,1000 @@ +-0.255293429706,0.358530622228,0.89793154398,2.24535180048,2.32455565987,0.710763176763,0.441191276551 +0.757621292935,0.622351089386,0.196695444868,2.31384105607,1.27426985267,0.210009099682,2.2464538896 +0.633905446324,0.758841424957,-0.149410765642,2.56436294595,1.69403166357,0.628809438166,2.97069637588 +0.0211561998819,0.420400312982,-0.907092052689,2.58571673254,0.498741241729,2.88133257303,2.34024513004 +-0.276209385718,0.756294601373,0.593065638168,2.3681094789,3.04613054358,0.943103921397,1.76285643017 +-0.541742647645,0.679280087473,0.495069153235,1.97973219613,1.77676459407,1.6322061356,0.456664376791 +-0.089455068695,0.546180519493,-0.832877320385,2.76979437366,0.408842070861,3.08706260636,1.99205113742 +0.118450645964,0.976056583402,-0.182436264126,1.5784937865,1.66818966187,1.63708517288,1.97156036442 +0.550872223853,0.432176970017,-0.713976792041,2.28879913047,0.745898925983,1.78312370773,2.6649260818 +0.162571840593,0.984196337005,0.0701994791461,2.40032484187,2.70184189378,0.700659767244,2.83621553954 +-0.527100754436,0.229760773349,0.818153275189,2.72596242886,2.88991859903,1.16440287827,0.38137512102 +-0.585756288127,0.573330587965,0.572871371098,2.11174969441,1.83795269188,1.5891422554,0.250219546151 +0.363337692592,0.902144917266,-0.232637635375,1.64702353154,1.07124171392,1.43276038205,1.70134087182 +-0.90279412905,0.424114276233,0.0713431233384,0.540036046309,3.12330687548,2.9123588459,2.64976899044 +-0.800046577832,0.482449007935,0.356606825568,2.58211411727,2.13979045056,2.24185827479,0.172548669125 +0.405658075809,0.422424427639,-0.81055482755,2.36771810826,0.561898978365,2.10786585814,2.50590466752 +-0.175959851391,0.568833913138,0.803409055191,0.889159732884,0.740925680825,0.516708097364,0.0372993709262 +-0.00514512804176,0.533596341123,0.84572363831,2.22778280375,2.31345863478,0.443972054793,0.927973860829 +-0.238809288386,0.701771672127,0.671183018245,1.71978914115,1.74501493467,1.07182351885,0.690472361542 +0.997803432405,0.0629021347209,-0.020775748581,3.07633710617,0.124489572802,0.0455336380611,3.07903194077 +-0.592018060528,0.637149901324,0.493512532011,2.09530228372,1.75035375645,1.71247222305,0.291091216164 +-0.237701781279,0.890257026314,0.388510347706,2.06393491814,3.06376120844,1.16872243442,2.26712109187 +-0.463483125875,0.404043726151,-0.788626692033,1.0558204473,2.22686808409,2.97467135243,2.53138037489 +-0.891382263556,0.27939594695,0.356897135105,2.11560692056,3.03605287095,2.33497336633,1.08207176321 +0.145928943054,0.988779159101,0.0319455490869,2.76778070973,2.82625142331,0.35977929706,3.01918855109 +0.450092356943,0.890457115071,-0.0671043697624,2.00175182658,1.82266186014,1.01952660989,2.47409728395 +-0.524559253623,0.827618035473,0.199714738561,1.65397086787,2.24102780712,1.92413495045,1.45529307724 +-0.504002475931,0.665400874819,0.550657043945,1.99510881219,2.65052166969,1.51054650464,1.29556587379 +-0.269887336365,0.164847712629,0.948675949579,2.19562200453,2.16231744228,0.569851951139,0.0344142173379 +0.750953001358,0.659547205842,0.0326660836045,1.28163287123,0.510413596236,0.661915386928,1.19989178484 +0.0167611269842,0.830016387873,0.557487094456,0.698230436501,0.441072045989,0.560252752072,0.141014958672 +-0.129904884702,0.252729882509,-0.958776474168,2.08428535753,1.08565808559,3.10718004002,2.64688718888 +-0.691202587353,0.28090192905,0.665832628738,2.60340060154,2.55328837716,1.60608193277,0.19027201872 +-0.00747698624202,0.963251665033,-0.268496414308,3.13719557193,0.0155855974805,3.14137223959,0.543680881359 +0.877975824531,0.350748564222,-0.325781976535,2.85255303595,0.746862536454,0.721040903527,3.10636330281 +-0.0390910957617,0.858665178258,-0.51104402734,3.07723199418,0.100110109119,3.126279124,1.07447480717 +-0.653666997465,0.711907953535,-0.256722656029,1.54614478573,2.12667813048,2.56160105658,1.67731505563 +0.206102314057,0.97813418209,0.0278452503645,2.58369552101,2.67541535102,0.53195571692,2.95549942535 +-0.890672528107,0.35821521699,0.279971973583,2.80874352553,2.41718344385,2.49548567921,0.120450950105 +-0.358747453307,0.641830508004,0.677756492954,1.82464395085,1.81096206392,1.18226394182,0.546866096601 +-0.156201373774,0.976535935542,0.148252141387,1.60446469098,0.844455065868,1.58350759635,0.533664146032 +0.0194495244217,0.952312046475,0.304505307241,2.49908319182,2.87807246372,0.594346535872,2.44150699788 +-0.845415378704,0.249479191011,0.472263666509,2.79977252248,2.6284040925,2.10819093838,0.106789689536 +-0.874554028311,0.423437000168,0.236339498295,1.65451214994,2.9226984514,2.43935321168,1.54054389187 +0.0793035311747,0.933963842958,0.348457300097,2.60448608965,2.78470552817,0.44060619557,2.34665774232 +0.325206503306,0.889268082395,0.321625570876,2.79395637793,2.40192520011,0.100187539607,2.40865082633 +-0.498721192068,0.807187024365,0.315794680573,1.81372330811,1.90978599025,1.77676089134,0.962752668062 +-0.798952566613,0.501986030705,0.33118698839,2.2772633474,2.34887797515,2.18330140682,0.618952921121 +-0.0631589173245,0.833836210153,-0.548386839557,2.01055102905,0.936818964265,2.35899841506,1.57507767631 +-0.810965765067,0.404493849616,0.42275200001,2.66260160458,2.26590924027,2.15614996523,0.0924481198708 +-0.557308349734,0.611269522943,0.561922569077,2.0481039091,2.83202078488,1.56437733416,1.34724874971 +0.67294993013,0.498522665591,-0.546455435906,2.08645130624,0.138447957419,1.38489372114,1.82926447046 +-0.500475017654,0.865104493638,-0.0334510357267,2.82208210261,1.07595823419,2.90015846588,0.221807826364 +0.744929097896,0.596016888969,-0.299740733252,1.98618127822,0.74895776641,1.03277241384,2.14291292212 +0.642658516572,0.225566013155,-0.732195332399,2.71323510525,0.222087709849,1.69510652796,2.74014988776 +-0.542376509335,0.725546745357,0.423567754229,2.05238078546,1.40877632377,1.77527708078,0.15338749941 +0.0691395061707,0.995153284636,0.0699261665185,1.11029201531,0.221914795244,1.09472124596,0.221311416012 +-0.98172292244,0.18477789224,-0.0455766836795,1.97885147344,2.84011904478,3.03427930062,1.16341910631 +-0.376354306181,0.843311438737,0.383644696972,1.7348750387,1.41709351705,1.56142007165,0.57247944809 +-0.722712546278,0.687450874793,0.0713993711329,2.74675735102,1.65826958151,2.76939395778,0.198399717526 +-0.636898799377,0.407466619682,0.654469917718,2.38302565712,3.05172259874,1.54492934747,1.02615131989 +-0.107467309982,0.924546361544,-0.365601972972,1.05209509924,2.50911518675,2.24192059054,2.7035512519 +0.278595828533,0.957679584332,0.0723476197057,1.68603139523,1.64764549856,1.19130931003,1.86986540159 +-0.305904224161,0.805751676788,-0.507135919644,2.28947859743,1.00390803826,2.78488245932,1.32074520782 +-0.783096577617,0.605088113421,0.143624946027,1.58736049474,2.63329171145,2.33874057515,1.57713961625 +0.0279641249738,0.862541011852,-0.505213826599,2.69036477446,0.191821366243,2.72683221822,1.10019642544 +0.124027554972,0.880542305931,0.457452088281,0.975615178436,0.644864626873,0.781300848396,0.404873312105 +-0.233188151684,0.68443639891,-0.690775000823,2.35465166847,0.892815684882,2.93010985365,1.68152883389 +0.223712066302,0.583209452622,0.780909499087,2.42520665216,2.3027867502,0.0765931921934,1.24878009843 +-0.382907539521,0.800711790811,-0.460697779714,1.54283505645,1.79186506702,2.46142162486,1.87687365567 +0.128695023265,0.641697689043,0.756083108437,1.93705819156,1.96011941651,0.485877072109,1.07809835058 +0.490947041266,0.466638917,0.735675963868,0.964071018221,0.806506461067,0.230137720984,0.601396815586 +-0.261083018591,0.963859668666,0.0530112867402,2.70001712661,0.532718769932,2.68791688252,0.0158964591441 +-0.189751464167,0.974341848515,0.121046867281,1.7089046236,0.751929706874,1.70359438312,0.418147831052 +0.515667128896,0.650704063693,-0.557379254789,2.02713999546,0.285994200742,1.63084699622,1.68612506427 +-0.160282621991,0.290814017942,0.943258547831,2.60258662973,2.6855720308,0.444725747268,0.493286582871 +0.0366659262867,0.637557747888,0.769529549762,2.71717134806,2.76290579077,0.210158043284,1.34334405596 +0.427962908922,0.902494578404,-0.048490045774,2.45545802681,2.17202714667,0.65427525808,2.89522851184 +0.782668629032,0.466275244935,-0.412331435972,2.33057118772,0.74264283458,1.08230008338,2.59795171008 +0.447920545746,0.689350663323,-0.569353007962,1.72388104599,1.93454139512,1.79396070577,3.09797404191 +0.138626645527,0.355665540726,-0.924275216745,2.10952709996,0.978188270524,2.61896964642,2.68967782712 +-0.619586518329,0.761347947539,-0.190949860128,2.61432404424,1.41967218236,2.97832883109,0.631837238912 +0.186660551075,0.941676821107,-0.280004648645,1.73818919062,0.513447874189,1.71591688788,1.02436070379 +0.0734528554242,0.304137825824,-0.949792009302,2.37860530682,0.713730556032,2.80489289599,2.64835787436 +-0.0335508687936,0.995903356131,-0.0839693065924,2.51267890154,0.135326838167,2.52192907881,0.211614772869 +0.854414814178,0.516652011688,-0.0551907975267,2.38726266775,0.936812786659,0.450397380717,2.50412406809 +0.449441111171,0.869772228849,-0.203712929172,1.79646528726,1.48723616246,1.2861550437,2.2344185146 +0.505687390661,0.726365498571,0.465481928126,1.37314425295,1.07978655046,0.550434643215,1.12109143899 +-0.545358565034,0.670066606695,0.503581947787,1.93838058909,2.60371442014,1.62314207281,1.28730344602 +0.377609109357,0.2541761576,0.890396451834,0.492190388356,0.448431739008,0.0802894956172,0.20745427054 +0.294709507235,0.287279780202,-0.911381717083,2.72071026304,0.274711714437,2.45859893494,2.62906099108 +-0.791740843254,0.390803405061,0.469488163553,2.21845315028,2.84749726313,2.00396521533,0.933037395157 +-0.0269334121213,0.999627759822,-0.00435121875097,1.479031484,2.83923159663,1.66762844538,2.81768326392 +0.663334925075,0.623067929163,0.414455224149,1.13423508776,0.736898458107,0.418021111386,0.962892603926 +0.191382687861,0.855847891673,0.480517484704,1.62545401626,1.59531422315,0.859602420584,1.27723157328 +-0.205551008002,0.276747343049,-0.938701065955,1.45016511023,1.72984725908,3.03639399387,2.69157327634 +-0.271148517931,0.937527727711,0.217991378264,1.62497584137,2.00537686742,1.62628383714,1.4975343266 +-0.104483431095,0.988400944696,0.110212454608,1.5831646904,1.79947253367,1.56498990274,1.58302988962 +0.459611347296,0.884599932177,0.0789960089513,1.9240495609,1.66966040421,0.896441165553,2.14195691268 +-0.405877002719,0.444787581393,0.798390797857,2.52458979462,2.88744729299,1.00787315582,0.875894720246 +0.103225090402,0.279316656387,-0.954634373033,3.03008230378,0.0500794354593,2.91202699545,2.57807744109 +0.282969282098,0.0990695469093,-0.953998747517,2.51636331968,0.651356113925,2.56302980276,3.13498968693 +-0.223760184925,0.649377661152,-0.726801233378,1.38899946649,1.83078431686,2.61168936746,2.36178529783 +-0.126006184436,0.354912069642,-0.926369183591,0.844353348255,2.32862824629,2.9135041221,2.92998291665 +-0.113536806577,0.748522998348,-0.65331670306,1.52200579589,1.65382671661,2.39781282409,2.23696145581 +-0.716018741141,0.636408149889,0.286882953642,1.36495656454,3.00891398175,2.23662913637,2.022928003 +0.0197788878299,0.993099439332,0.11559541165,3.09992034054,3.09746496412,0.0368103737997,2.90902589406 +0.0573663644984,0.985632492831,0.158863744449,1.88695935226,2.50827934883,1.18059637052,2.3897527063 +-0.898961889838,0.437710546455,-0.0166432611397,2.61253713028,2.28473161186,2.94733045259,0.496390184577 +0.648549692999,0.34974461629,-0.6760636058,2.46843506175,0.491302700631,1.6075262005,2.66101903938 +0.213998745754,0.968356459765,-0.128414577235,1.98205965136,2.66720574003,1.18388234634,3.08301086539 +0.428766341846,0.689680101745,-0.583524447951,2.13199775258,0.161951143857,1.8274488789,1.52947118254 +0.518996852636,0.854394221567,0.025549581333,2.82544672208,2.02399870682,0.24213201401,2.92995233956 +0.257605510126,0.966019486386,-0.021112865138,1.59561534454,1.38821368963,1.3306187015,1.67338136818 +0.3339650538,0.435299863473,-0.83605105807,2.76142044068,0.041842394197,2.36616799136,2.19860225669 +0.522602525935,0.543857834418,-0.656586061251,2.20192552575,0.465077585371,1.74599565762,2.15012462862 +0.551273289198,0.830248440942,-0.0823728531165,2.69710916191,1.94131632408,0.459396683069,3.0220333632 +-0.0424407903787,0.914127934932,0.403198335673,2.50560709204,2.93314148394,0.611191498871,2.2448025159 +-0.471357915405,0.452746089749,-0.756863722081,1.31949440479,2.00619286095,2.97027218666,2.33111261178 +-0.913806204005,0.283112171962,0.291214216015,2.23397839728,2.89005696372,2.42999701615,0.886688349078 +-0.0877641259178,0.781707076956,-0.617439473988,1.01971323742,2.32725597787,2.44687777586,2.73375192144 +-0.396799488092,0.867517954259,0.299937935728,1.82789438254,1.18957519375,1.72403347208,0.385484286142 +-0.201233470999,0.938550243675,-0.280407792772,1.86547251045,1.13541862837,2.17089562212,1.22959943445 +-0.157872244445,0.952050956337,0.262059785111,1.85686343548,2.91118904704,1.31086254096,2.42692301093 +0.25804706607,0.55581201995,-0.790243449939,1.83099471759,1.28161015007,2.22507722024,2.62070049898 +0.372484607231,0.657289600093,-0.655153111102,2.38824874932,0.0505584797622,2.08298439355,1.59712056252 +0.986974395927,0.137556575387,-0.0834249983719,3.11288923072,0.276496547322,0.169399587063,3.13613544696 +-0.50694514496,0.779869219443,-0.367165658208,1.27199840246,2.21765484831,2.48050794777,2.08685479762 +-0.418263539696,0.205266707083,0.884828339467,2.72938981072,2.82558555238,0.913128411502,0.299703571644 +0.160008455516,0.896629726828,0.412858846498,2.6005869108,2.60729427177,0.345933594677,2.18300013202 +-0.368229945134,0.660191976974,-0.654639794884,1.78001620858,1.52378257384,2.77903115895,1.90859404374 +0.0380538466801,0.970002256451,-0.240098994652,1.73877595397,0.863579840774,1.82836049819,1.16776740048 +-0.600002778039,0.698666429017,0.389694607752,2.25075910016,1.45959682465,1.96288116559,0.0604946674007 +0.431786221643,0.901873056789,0.013625279373,2.72086563455,2.20859710149,0.365154280879,2.92596175588 +-0.225880573367,0.465092346201,0.855959739755,2.24437228004,2.39707040983,0.744310094086,0.692953638967 +-0.999844832306,0.0148731175091,0.00943936891907,2.85755523631,3.11508219331,3.11892511664,0.283780413211 +-0.735617497821,0.624035796914,-0.263526509237,1.50464900164,2.26132300683,2.68417804392,1.71727970299 +-0.504973721519,0.732674024109,-0.456278768924,2.11298780947,1.43562874177,2.85957849835,1.36061555667 +-0.233646667922,0.931276778225,-0.279522444373,1.60528696694,1.61435977518,2.1000952017,1.66270764512 +0.237475308159,0.363457807476,-0.900835112659,2.00421205439,1.11593005284,2.45536849431,2.81335487622 +-0.678508769637,0.734426385059,0.0156119971429,2.79197964843,1.52234250191,2.86600638282,0.220191129244 +-0.248713917579,0.264397688629,0.931791419498,2.21391455475,2.23437297726,0.621563648873,0.242321914052 +-0.851777423183,0.397778240947,0.340951158357,2.36329400952,2.57030224035,2.25251796232,0.619370327922 +0.178132518613,0.901073325725,0.395393054414,2.19199859311,2.31680164933,0.670412496598,2.01211801721 +-0.865092204952,0.310914937284,0.393633558916,2.17886040854,2.97841314448,2.23037263824,1.00633582129 +-0.458168671547,0.883734582315,0.0953659081327,2.2720348261,1.10286617418,2.29791143073,0.323665958472 +-0.0820305040442,0.967855446661,0.237753718742,1.66554067966,2.09819170311,1.39658080738,1.76075099697 +-0.93882727489,0.337196385656,0.0700138944981,1.78057861637,2.79025872936,2.71999031071,1.34719666749 +-0.374062927885,0.812907850987,-0.446382965385,1.23526707491,2.16558180684,2.42664025805,2.23069204478 +0.170426254134,0.901551386018,0.39769333697,2.27855720775,2.3963231412,0.610374717106,2.06564674283 +0.543657576551,0.729878260582,-0.414384078107,2.06114287895,1.73516634552,1.34785999468,2.9839253845 +0.978218495533,0.20531712288,-0.0305524802449,1.73973236873,0.212096103942,0.239591981911,1.74361036932 +-0.152389801693,0.35226703173,0.923409598551,1.8011840174,1.80621911057,0.541954406136,0.297595639707 +0.213003517518,0.887505111782,-0.408612503584,1.84384540155,0.626406415045,1.83564319582,1.34862128178 +-0.0501646924158,0.827609731087,0.559057811541,1.60292003374,1.62795393668,1.02773062479,0.973889204671 +-0.802164578428,0.589485759589,0.0950711752143,0.977219353622,2.98906656962,2.59209587229,2.29235363316 +-0.0483367957907,0.972614030422,-0.227344456713,2.27486906275,0.371551165847,2.33311662813,0.619703943513 +0.00060806707846,0.244847138713,0.969561503422,3.04020749975,3.04297763099,0.0236074627612,0.493559128301 +-0.899673893322,0.338293745111,0.275942435471,2.33805651081,2.70373893408,2.41530388952,0.713726679664 +0.745441212122,0.666563412489,0.00325828200299,0.80434634122,0.177092160952,0.500008494801,0.659432329128 +-0.632747318944,0.653948966469,0.414706618737,1.88357597999,2.54524901702,1.83474161032,1.24782348632 +-0.417538525209,0.908647940144,0.00452778502244,3.09696583219,0.861709715538,3.09726235734,0.0104134223811 +0.999266471744,0.0382185258185,0.00242130820982,2.02332747649,0.0571249322045,0.0308990337037,2.02355029777 +0.401181164143,0.895658352426,-0.191962989314,1.64795741627,1.11348894335,1.350999374,1.74315677961 +0.425769213264,0.84029349842,-0.335600079781,1.87512087158,1.98725867613,1.41179632938,2.88814320781 +0.731196197656,0.579253319011,0.36030225221,1.84291706731,1.13710853501,0.225586240212,1.67777077515 +-0.459557257052,0.743353482535,0.486037784019,1.843724455,1.61245713859,1.53640846201,0.488643992757 +-0.130109227894,0.282783827637,0.9503183128,3.05994399671,3.13739373205,0.273332511068,0.577869819435 +0.300531948978,0.664882374026,-0.683821596876,1.20212307447,2.2574911604,2.29102442756,3.12571317405 +0.00370144361009,0.977380069902,0.211458029579,2.05383290058,2.74856060267,1.04397655407,2.48742020212 +0.0383980187969,0.994746431497,0.0948953590878,1.54122020767,1.33997524673,1.4348634757,1.28418350694 +-0.317648718792,0.867537438298,0.38272455448,1.67365606678,1.45955489936,1.49340701686,0.705838012301 +0.396566584827,0.850210664168,-0.346232249123,1.67943706597,0.421358934333,1.49852823105,1.22538493588 +0.6234472425,0.698902298785,-0.350498377416,1.61880327077,0.288234287512,1.18660183563,1.35363658043 +-0.684094603647,0.724665176559,-0.0829153492612,2.98228121983,1.51347268149,3.13935853124,0.229956419684 +-0.349884984998,0.929498207219,0.116677247349,1.19863779967,2.92259691096,2.0401781142,2.53754114971 +0.0638860451845,0.242324476614,0.968089572955,1.41107674551,1.40463422885,0.188340535232,0.268247294602 +0.845979393372,0.502991680651,-0.176969588307,2.59857648987,0.976212460669,0.567820540956,2.81319920843 +0.75997585449,0.429304682615,-0.487989948746,2.42263978849,0.767169434951,1.20174617427,2.76286298379 +-0.70108961882,0.188418967355,0.687729335658,2.76710594256,2.95390195171,1.58941720529,0.343624160053 +-0.496338603644,0.86801912999,-0.0138123315776,2.74643558339,1.07661384561,2.81484565906,0.228055357923 +-0.230478076641,0.689340737257,0.686796333818,2.29452164932,2.72993126078,0.89412667564,1.37495739666 +-0.112567833107,0.993076460704,0.0335801451013,1.33883302458,2.92231193207,1.81885910724,2.79297532737 +-0.330986360861,0.584385061218,-0.740906289047,2.3073903243,1.06013807078,3.11866869472,1.81934776268 +0.0840237510648,0.0907882163753,-0.99231925761,2.28635733333,0.851896593686,2.93349580211,3.0538091764 +0.00697496772042,0.990520113891,-0.137190574762,1.56012335715,1.65286010401,1.70195988784,1.79668711681 +-0.647043520085,0.761420503976,0.0396673573675,1.94837036474,1.8810241472,2.30417613914,0.991378052302 +-0.21875857096,0.451778650236,-0.864893484091,1.41753703295,1.77383070341,2.85137154098,2.53366162295 +-0.0709686100181,0.743901506085,-0.664510350286,2.72235992967,0.390013242523,2.92738062499,1.50064356108 +0.359548850847,0.910127896058,0.205892779555,1.8766972701,1.78132792722,0.881279932426,1.96782895794 +-0.557585383971,0.829033745264,0.0424451268633,2.13507874263,1.48544294366,2.31321606957,0.664924600576 +-0.28792218175,0.839501190504,0.460802092442,1.41960961529,0.84730992461,1.23038612269,0.131998382171 +-0.940795433375,0.07223633496,0.331188563288,2.85379186715,3.09115510815,2.45894436097,0.287719514179 +0.917453408484,0.343926170205,0.199985081218,1.95365334412,0.669140856772,0.0670576542388,1.89584533787 +0.880902510358,0.457496522149,0.121275304442,2.00302020253,0.78524891324,0.267002068505,1.9961512646 +-0.264466200759,0.602718713857,0.752853093653,2.57448682406,2.9880468147,0.762618214945,1.28852528081 +0.156409418757,0.949132919843,0.273281529188,2.0668808284,2.33443070069,0.881397535831,2.18342500476 +-0.112787206405,0.687817747251,0.717067495176,1.60729658001,1.60741566727,0.88070361824,0.676374921128 +-0.333335696789,0.605454734716,0.72271147594,1.61412497975,1.42977488614,1.02792108279,0.24140004188 +-0.282778620506,0.953754187265,-0.101927435266,2.03298215687,0.969266474114,2.19400302905,0.740298355525 +-0.364057539365,0.451075698055,0.814857547462,2.14723664192,2.24083157291,0.990919778672,0.499966263067 +-0.882314907455,0.451587014749,-0.132625684512,0.938700514031,2.85294254911,2.81960040199,2.25290842863 +0.516577393223,0.435973413592,-0.73693621125,2.03117404154,1.39679285623,1.91778934489,3.1379663348 +-0.0575862526833,0.674131257212,0.736363274174,2.22926629257,2.43303702996,0.645430252782,1.23647987816 +-0.776107514749,0.629025224364,0.0445465224714,2.9888586671,1.7846258875,2.97639859644,0.0632649659445 +0.489082561197,0.570543680035,-0.659756134875,2.22217176967,0.331573324102,1.80785794561,1.97748259925 +0.145836304058,0.537482982486,0.830568369225,1.31978229913,1.27368008192,0.444047673815,0.556248919872 +0.595303055923,0.797445654646,-0.0984616651049,1.72520191964,1.05550719651,1.02668481659,1.84989065768 +0.596696761208,0.782382083224,-0.178413146977,1.64752038488,0.813977743446,1.10775665249,1.66581409197 +-0.281982208021,0.956190930573,0.07864438092,1.68325623088,1.46393623536,1.7956994055,1.07881934653 +-0.0657132424836,0.85702533383,-0.511066871296,1.43931738929,1.80891096194,2.17939948623,2.24754558226 +-0.522767389198,0.582471277981,0.622447963381,2.1370991724,2.68407337013,1.44045179759,1.10140080432 +0.826702096383,0.406500347842,-0.389000142725,1.84810509608,0.0901034212647,0.928292355993,1.70642527657 +-0.720461754252,0.693494194785,-0.000813916705687,1.64180963569,2.30631832586,2.37855741407,1.47246603317 +-0.355089645135,0.93477416255,-0.0104215616311,3.0811229069,0.727068059174,3.09247620656,0.0409857928197 +-0.590931837585,0.389766293948,0.706315651412,2.37058175659,2.45329951299,1.41799141908,0.411961966654 +0.310975037593,0.911658021445,0.268652522656,2.17610337806,2.13068482575,0.66695869047,2.18962252063 +0.134886511899,0.881756073285,-0.452008690328,2.02981430087,0.510801235734,2.06894748871,1.25535371593 +0.440186804968,0.705806737763,0.555042724176,1.01582359882,0.785505283505,0.505553241633,0.693771713217 +-0.888853114241,0.114419088356,0.443676023156,2.79345326542,3.06423521645,2.20743019525,0.351606885221 +-0.566201273479,0.743716782552,0.355389174372,1.77573134414,2.42492651922,1.81502108268,1.35617312852 +-0.300157500828,0.527340384895,0.79486954474,2.36139367175,2.66365314237,0.893243176338,0.939225635644 +0.781567889321,0.55190370076,0.290781600982,2.15607897008,1.16128294801,0.107434164927,2.00822632598 +-0.306284464995,0.327755102162,0.893737332503,2.11905763743,2.12612046709,0.769989741349,0.259489864536 +-0.545139050066,0.79591282452,0.263336651187,2.1728218018,1.3561463147,2.06396789635,0.258475661777 +0.398061426135,0.915579022969,0.0571152669808,2.18449333924,2.05442484108,0.793310923644,2.52116528812 +0.131492564558,0.989859140133,-0.0537455873638,1.64367225669,2.13349266438,1.46890428429,2.32590198986 +-0.932166208496,0.277468616714,0.232545321339,1.94485726118,2.9766210637,2.5541182295,1.21291566139 +0.651259458924,0.680291434966,-0.336250919216,2.42821942327,1.59105006884,0.978659443873,3.09775842684 +0.602009417755,0.767738540554,0.219458866948,1.91295640801,1.39250152612,0.578525558356,1.90065695474 +0.299784386536,0.862041465233,-0.408673260452,1.87025106809,0.302917022632,1.75904324718,1.13665081426 +0.663746459212,0.747685883018,-0.0201608089749,2.16908723294,1.40700265622,0.692847938265,2.39085366566 +0.130495785991,0.932095377397,0.337889119793,2.3683300527,2.5667404748,0.613088836553,2.25945830526 +0.436835853214,0.890139557181,0.129715095841,1.62022539091,1.2972474743,0.978370225686,1.62769123695 +-0.693094398251,0.623962640058,0.360958140128,2.27818506578,1.88498586504,2.0507712253,0.342798330299 +0.116631209927,0.992646128831,0.03241641232,1.19886501161,0.272307570667,1.17416961202,0.340856092407 +-0.0884483638964,0.96101592061,-0.261964286226,2.51523886257,0.368562614255,2.59310169117,0.637033610627 +-0.382465689256,0.831685410776,0.40251630283,1.80082620751,3.11481104713,1.52238626216,2.21458312742 +-0.489922451247,0.638942076444,-0.593067462195,1.32357405456,2.05422372875,2.73000897829,2.16141367098 +0.208829488346,0.858304184124,-0.468726116525,1.47079399282,1.99861135312,1.91267178032,2.6631222694 +-0.848389803371,0.526151793592,-0.0583012147029,1.24801484369,2.72267243155,2.65772405172,1.94009826479 +0.89504617962,0.436103321712,0.0933071762504,2.49387589734,0.86762336906,0.113258628491,2.47649365145 +0.028175657837,0.989282967218,0.143266685163,1.6713483817,2.09224285518,1.36967985789,1.97082581611 +-0.0849617161188,0.983370136675,-0.160513803422,2.77148213283,0.234617837654,2.80597596012,0.363525325184 +0.51338981363,0.841749892041,-0.16699706138,1.13882558802,0.172373826843,0.951469888783,0.724013191293 +-0.381456474693,0.534755571556,0.754007583917,2.33630890241,2.72364185468,1.06027316834,0.986449245064 +-0.616645452388,0.48719544328,0.618376087908,2.23580443418,2.78995101293,1.56848089889,0.983747414114 +-0.0351138955974,0.993371960476,0.109449360331,2.19096552719,3.08310761733,0.951803281214,2.89196838744 +-0.278737965885,0.13485876068,0.95085133488,2.7836312009,2.8217913133,0.595021577303,0.182961194738 +0.426068119184,0.511632537211,-0.746122044093,2.34195935195,0.401509064499,2.00701302204,2.19731076428 +0.25263274563,0.779259085004,-0.573525914213,2.07998451615,0.487146693043,2.03108538505,1.57486514917 +0.182531797411,0.721200200276,0.668245773691,2.6735685307,2.55555432278,0.0946567803599,1.61840554809 +-0.239631953741,0.970428178719,-0.0290805208818,1.61353189976,1.63388745431,1.84634591434,1.41640018905 +-0.0919252759564,0.962874358601,-0.253816298114,1.18657527777,2.48880321815,2.06974633122,2.62099149198 +0.367104487276,0.681179614121,0.633426103605,2.13209174121,1.91133387509,0.222179840359,1.4861031665 +-0.632409375403,0.597154435081,-0.493421688382,1.05893195133,2.41006273859,2.7718077918,2.28966255132 +-0.841439940637,0.394526517419,0.369225748498,1.95017806453,2.95710822178,2.22716381298,1.2653181797 +-0.614261434374,0.522301913615,0.591509595252,2.19184434138,2.08609537758,1.60121027555,0.364521942609 +-0.814922169723,0.579402378849,-0.0139549517045,1.85934459072,2.31297686169,2.57015667977,1.22599226193 +0.855103475703,0.443689423481,0.268212120031,1.71230514923,0.789098241222,0.178505090466,1.63073748542 +0.879671994696,0.340179134752,-0.332348218028,2.18744226206,0.303194313698,0.83151682532,2.21377212997 +-0.342770293812,0.199021038299,0.918095393733,2.43777444693,2.43512841125,0.752417725271,0.1376930912 +-0.824827935726,0.548694038593,0.136358822447,2.24955269183,2.22107693691,2.48532511639,0.716314760765 +0.371026615844,0.923036703057,0.101698058703,2.37928501353,2.20524921408,0.609453424428,2.60667618756 +-0.113329230635,0.788044754341,-0.605096645702,2.34194554118,0.714370608297,2.67623139926,1.48606359318 +-0.988168605789,0.12824751335,-0.0841152890574,1.96976374411,2.88532618076,3.13882686611,1.18246493383 +-0.157228594846,0.98716938667,-0.0278526656707,1.61584213993,1.47011663144,1.76296906896,1.33714901301 +0.18058991593,0.965143786115,0.189432717312,1.68602232746,1.77348223419,1.16961670878,1.76395383902 +-0.751751517182,0.491309883925,-0.439868451213,1.9193453717,2.00058211221,3.12343218335,1.48872202977 +-0.714345003259,0.591666243868,0.373687399019,2.16837741366,2.15958972939,2.00723010831,0.618375861217 +0.739114459011,0.24939564691,-0.625708900196,2.62404538334,0.226026182012,1.4141895305,2.64712977447 +-0.821246173788,0.471150104329,0.321826507965,1.51404761931,3.07864355644,2.33822270206,1.79508219455 +0.77788322669,0.58901429307,-0.218997370288,1.33232783041,0.193920734427,0.77884784617,1.1773655808 +-0.386037246443,0.922455868512,-0.00710035260444,2.48850789372,0.88455912371,2.55250528035,0.300772259967 +-0.0687399504274,0.979327522458,0.190243062873,1.56003961861,1.44663088036,1.44587520554,1.18781949592 +-0.8810450679,0.309898048821,0.357383250399,2.70501357849,2.56941218325,2.3214464068,0.23892228693 +-0.0143012313554,0.997840741679,-0.0641040484463,1.70068929575,0.552302085464,1.72326480616,0.605392562548 +0.625257352227,0.0906526213302,-0.775135695045,2.97340277708,0.0818812082478,1.78259291846,2.9749083895 +-0.817123203554,0.568368758227,-0.0962633101721,0.690998705131,2.96181684231,2.79022538544,2.53750315896 +-0.0617917447341,0.615582839366,0.78564594326,1.30322473873,1.21978740144,0.680766746516,0.391015028959 +0.560961304798,0.163556136904,-0.811524370922,2.74190177068,0.415059733224,1.92410855156,3.03529919617 +0.0193877640995,0.866074271782,0.499539258078,2.29158142573,2.59278464503,0.687483433326,1.89438914722 +-0.674271658587,0.738303705322,-0.0162901545122,1.17092164506,2.69543376858,2.40286080586,2.12561115136 +-0.826148713705,0.497698201503,0.264149206064,2.20216831944,2.41435537301,2.29536328616,0.762485071981 +-0.00862219561726,0.979360453947,-0.20193751258,1.05206287759,2.79401128176,2.1262799101,2.93687309922 +-0.196268976098,0.936848156389,0.289471969097,1.6742983294,2.19155151832,1.46604733383,1.67490709083 +-0.371289479382,0.243509512366,0.896017432803,2.13011022845,2.04603773339,0.797493863554,0.0275604769844 +0.744222826388,0.629003232688,-0.224693831583,2.66588211943,1.37217186425,0.648438013022,3.04879257826 +0.437310763593,0.690052523614,-0.576703399244,1.81212156994,1.55981147682,1.75800420928,2.76511851868 +-0.154618467987,0.764224166651,-0.626142597548,1.66117920836,1.48568365599,2.42667764855,2.03365731247 +-0.631019024855,0.608930540332,0.480643929871,2.17638616597,1.83224261401,1.78761016121,0.280328841988 +-0.133677560326,0.984348170382,0.114843325149,1.57436371994,2.26631072556,1.59321782327,2.01668367632 +-0.724828195204,0.688918551844,-0.00391361234737,2.83617255814,1.64510629355,2.93858976376,0.22991904185 +0.0821006132994,0.992548040153,0.0900437520593,1.46048401702,0.949065992133,1.3701416286,0.941534935369 +-0.0693527718183,0.765668650368,-0.639485504828,1.7961876031,1.26458511295,2.37728055307,1.96440139513 +-0.38584169313,0.754018713372,0.531584393795,1.59342894302,1.06484250784,1.30006192312,0.0904339933287 +-0.320721221994,0.94355292762,-0.082739171749,2.32312922878,0.840550306475,2.44159577584,0.498344454849 +0.509046716905,0.820199093504,-0.261045756572,1.85019588043,1.37864789752,1.27967954791,2.28886417457 +0.727293428871,0.575648392774,-0.373728773602,1.78790246923,0.324685423204,1.10284601998,1.67216563333 +-0.164270291575,0.951148972539,-0.261401804403,2.68024761312,0.454478472956,2.79253239223,0.617910291191 +0.206159432465,0.972528704678,0.108102761217,2.93267523488,2.70334080079,0.158275192812,2.88487052647 +-0.444595291733,0.752849210236,0.485338122567,1.83235655773,1.77417524968,1.52221165391,0.676290547143 +0.0264880357816,0.874701144389,-0.483938314214,2.47731174915,0.315897634566,2.54459905267,1.10862394266 +-0.496420041746,0.592721813077,0.634230237734,2.00274333692,1.98146358348,1.39698497901,0.497118475528 +-0.23344450183,0.966881770674,0.103166400073,1.63693820346,1.51279314045,1.70915996278,1.16261647448 +-0.14522566403,0.96832451907,0.203118517806,1.68630465692,2.68611601318,1.46847401496,2.31564859506 +-0.188363578114,0.0703568653906,0.979575966392,2.88113324208,2.89443180501,0.39079983896,0.0942412842073 +0.666312036291,0.744594321979,0.0400944631008,1.70741636879,1.02286960546,0.785674624721,1.76203885284 +-0.608573774789,0.313061141216,0.729130086129,2.59572413638,2.99261595392,1.4003177175,0.685530743605 +0.370279966501,0.928901258954,-0.0059327498902,2.5023428425,2.30414457227,0.592137984719,2.88450907897 +0.331997534115,0.705553214156,-0.626076911678,2.21834424947,0.28247811639,2.0309904623,1.62754590127 +0.00701813729513,0.706326458995,0.707851452688,1.25602305628,1.1415535497,0.731776620611,0.492614130632 +0.746940615283,0.664875721682,-0.00447123682845,2.46750042297,1.33429114546,0.434499754783,2.60855317962 +-0.0103137036175,0.925396870046,0.378859156452,2.97435151308,3.09687822976,0.162518824618,2.36078052222 +-0.835478550828,0.530398621116,0.143711147181,1.96557698617,2.45091466527,2.42628840614,1.0796893873 +-0.215890611728,0.882287380535,-0.418282466662,1.50968696956,1.74481145464,2.22117893814,1.952143859 +-0.21536000838,0.96563004971,-0.145528945186,1.46553973047,1.98784022732,1.94104454142,1.92061820777 +0.529505037477,0.570910976811,-0.627443281774,2.18110048573,0.284521213232,1.70881877872,1.91321151197 +0.393183788313,0.755873803755,0.523508645015,2.47309421901,2.10768427004,0.101305185588,1.87249742154 +-0.0115976539169,0.999904529093,-0.00751179898007,1.79440093503,0.0966948342581,1.79529898316,0.0921500249478 +-0.68729930309,0.625932957524,-0.368547962493,2.15953470094,1.7526382697,3.01466489651,1.21658779382 +-0.293107449358,0.955474223222,0.0340151714575,0.560855058973,3.11274883365,2.60669366047,2.96524790571 +0.64306825596,0.680244538096,-0.351753587852,1.90058131023,0.833645549917,1.23165931628,2.07267447419 +0.232217537854,0.268247513831,-0.934942932182,2.10186865568,1.03262429697,2.54917577928,2.925865522 +-0.7839669356,0.612711662126,0.0999012661588,0.453262050227,3.13664324018,2.86173882446,2.78320487414 +-0.389866565632,0.743195919967,-0.543749837284,1.27024117743,2.0791523589,2.54642211635,2.22544137706 +0.59402762539,0.798609358874,-0.0967174864863,1.48401104385,0.689118385773,1.01234525114,1.39011169668 +0.168605625669,0.790526241592,-0.588761755166,1.49565492952,1.78595652795,2.0654947475,2.55609777213 +0.828884578315,0.558769902396,-0.0269546287021,2.58046566917,1.10561302547,0.345431485023,2.68686842057 +0.0142602639459,0.962862478049,-0.269615454374,2.58421154096,0.137334281012,2.59891746037,0.584306011726 +-0.695584379211,0.487468254069,0.527766115502,2.12239069248,2.83613559086,1.79640543069,1.10964197154 +0.730099955797,0.67503531412,-0.106213837313,1.71911185595,0.781700706833,0.85814402503,1.77848858735 +0.867231087399,0.497128080887,0.0278192782454,0.645166013593,0.108380199135,0.298502538249,0.580605021322 +0.816938354779,0.565731391227,-0.112070145313,1.50038328878,0.431254019134,0.706851216269,1.46270881051 +0.386150456471,0.646087048882,0.658376298354,0.953740509215,0.785881199251,0.433241547683,0.575766649669 +0.672660041726,0.72188559199,0.162510493024,1.84299172009,1.19452906851,0.590293431936,1.8580015596 +0.00947647304652,0.949170869692,0.314618589068,2.62649229402,2.94663453658,0.480256357898,2.45357464185 +0.873784477624,0.297258526147,-0.384887068238,2.12681109734,0.109046326975,0.873054210162,2.05922231578 +-0.500348551246,0.834031914474,0.232469552642,2.20096240928,1.18803251463,2.10887021774,0.188646777865 +0.932116418619,0.361849154729,-0.0149723533052,2.12329649436,0.559991307425,0.335553402102,2.15970501496 +0.64770581561,0.421961546017,-0.634370262629,2.33134909813,0.109462434607,1.5512912283,2.07928087302 +-0.0817677590151,0.102744017267,0.991341364264,2.73765979395,2.75082903487,0.197254995967,0.167385266439 +-0.340078000069,0.892339649491,0.296777532531,1.5808377591,3.05053297245,1.67822011093,2.39805078208 +-0.64066051174,0.545167056829,0.540691213953,2.2527691059,1.82467710783,1.7260392867,0.108856245141 +0.15167470286,0.322124187843,-0.934468186788,1.95916780048,1.16043825437,2.62543464145,2.82033365168 +-0.254246546206,0.911533903257,0.323209896129,1.78011908589,2.86915716989,1.43569418945,2.2218402167 +-0.729028581295,0.559195561383,0.394737446647,2.36960708378,2.00299003195,2.05714487392,0.281054175963 +-0.609223246586,0.700196353976,-0.372252739006,2.40084027686,1.47746252022,3.06313287325,1.04874162446 +-0.887336086411,0.250744975112,0.386990474313,2.60840188034,2.79621909696,2.26811832944,0.434657270762 +-0.0409568443678,0.979594318152,-0.196767651672,1.95864615328,0.563402170187,2.03152790458,0.751559608842 +0.305498291205,0.951935844727,0.0221120237671,2.98363391716,2.51428592391,0.136741532078,3.05072855795 +0.0749758993602,0.987234669196,-0.140521608491,1.28159620598,2.86602302098,1.87605855632,3.05062408225 +0.0324532314537,0.999323723019,-0.0172882728782,1.59243122062,2.48481570545,1.54483616613,2.53510189887 +0.255765804149,0.966250272216,0.0307288930923,2.52841195633,2.55260919232,0.572532715714,2.89992188093 +-0.459640357336,0.594847890409,-0.659459421938,1.43410500644,1.9148964283,2.80794751821,2.14333588542 +0.00370111111638,0.867566552176,0.497307328844,2.57442964327,2.82844725554,0.481038067767,2.02320077669 +0.609232676885,0.590285110644,-0.529527179253,1.96908993385,0.0863745695759,1.44269697873,1.56058383002 +0.0721744884361,0.0420369048071,-0.996505766091,2.4146451118,0.727304399415,2.98738167612,3.1160630232 +-0.434127465187,0.856149409148,0.280252623871,1.45375586194,2.96706286548,1.86251775272,2.27473764721 +0.0100857207089,0.755361548252,0.655230653786,1.87458641376,2.01079941947,0.79261002293,1.19350268202 +-0.672584775797,0.717766457474,0.18011394141,2.47386163428,1.60058295532,2.41982680677,0.249949417393 +-0.423993702021,0.527020823854,-0.736531324433,1.35029214099,1.95309800706,2.86790986108,2.30149088808 +0.17636677118,0.976270136919,0.125663764802,1.60011834796,1.56188307076,1.26311320537,1.61394463084 +-0.662880891625,0.587879819133,-0.463666088662,1.75844522586,1.920572428,2.92708386568,1.64100400418 +0.438756678145,0.34231486839,-0.830850833942,2.56581487172,0.348642557728,2.11276768201,2.55837531358 +0.00657990034389,0.298125624525,-0.954503963802,2.37293248781,0.742931030037,2.92178278816,2.6220428695 +0.408740068034,0.0873632515821,-0.908459805967,3.02310049195,0.0548314566277,2.29296831519,2.97462491532 +-0.587040089067,0.729373983634,0.351279839767,1.72588914105,2.59748912604,1.85923470363,1.52855277153 +0.114703423975,0.44184872185,0.889726267752,1.56201589448,1.54758418533,0.347632743608,0.566238983705 +-0.646900658829,0.760788348995,0.0521596169461,2.3004595038,1.61023137551,2.46860365292,0.561051138862 +0.314081853765,0.734370095853,-0.60170852699,1.98502878557,0.710653227021,1.92675959102,1.87771435514 +0.82286899678,0.264545960185,-0.502893675729,2.77779234976,0.572994208919,1.10771545872,3.0621946743 +-0.0457723476633,0.996674100161,-0.0674212893521,1.1969918887,2.89634558361,1.95820937616,2.91392375894 +-0.466578997625,0.719160983072,0.514889812875,1.95964252218,2.96972491804,1.49063889902,1.74020625136 +-0.521378276083,0.833187975139,0.184289151372,1.85533934155,1.74664356003,1.96645585759,0.90778138955 +-0.651885105328,0.697730053806,0.297016129979,2.04234768947,1.96208518761,2.01452047041,0.708547572916 +-0.337461625848,0.55290870733,-0.761847499464,1.2881839041,1.96566690675,2.78874083003,2.40864971581 +0.48467410055,0.475987707874,0.733843796873,1.08710073475,0.918320268288,0.233225132841,0.685512842565 +-0.741802767631,0.544644872415,0.391267960466,1.84635234077,2.83081373097,2.03693279425,1.39785814197 +0.313719085956,0.819161110874,-0.480161857647,2.11018904062,0.0630194989265,1.94482746734,1.10333816551 +0.463450697944,0.836622963419,-0.292019635736,1.60575270176,0.528708643692,1.35208783944,1.3225677432 +0.5753012817,0.817821260461,0.0140292983772,2.28342930825,1.70495949679,0.650331845095,2.53413908123 +-0.134260297501,0.989310426768,0.0569126699631,2.01358867567,0.330826709666,2.01064722118,0.0961626011682 +0.956674801444,0.282604312597,0.0700580244015,0.751310506443,0.122799415521,0.175765617398,0.73239890928 +0.352119485127,0.366032756298,-0.8614127289,2.12205705392,1.01360370287,2.25646134451,2.85253134386 +-0.319540611979,0.947426294945,0.0166497129833,1.05362553396,2.89304008486,2.16924052234,2.64222297866 +0.415498241145,0.888448831171,0.194986886728,2.73894714769,2.21402799419,0.193798435275,2.61234544779 +-0.684676269225,0.615702527027,0.390036927192,2.18719045074,2.00683830267,1.96364331597,0.488621948805 +0.0427586977595,0.907493876305,-0.417883426609,2.42021689994,0.271373696548,2.4592525344,0.959943012347 +0.643491347131,0.564656791813,-0.516799374639,2.10378312131,0.72383690832,1.41485261338,2.31599555174 +0.76770963789,0.628548367835,0.124695072809,1.87027842044,1.00910732464,0.496782040673,1.88881639392 +-0.331349524071,0.630264142554,-0.702121501956,2.01515335263,1.2861187663,2.90293363236,1.85775680407 +0.0518720858783,0.150596335479,-0.987233523766,2.79010180256,0.334747304018,2.98987247087,2.86452066274 +-0.138121840731,0.888260168419,0.438082446937,1.81681820028,2.24992241867,1.21325248493,1.58477093412 +-0.622512185897,0.651830703249,-0.433122745549,0.839976359694,2.62018551994,2.73474568107,2.48936054974 +-0.144133762285,0.84625895256,-0.512904712186,1.15962288247,2.21971990167,2.32129928867,2.52803213076 +-0.758712765469,0.415401461153,-0.501793349483,1.29793430218,2.33948002245,3.01937361528,2.04523216692 +-0.693777904408,0.664263813875,-0.278254927956,1.36525512797,2.31381553486,2.62187542563,1.88193596784 +0.515250260038,0.774886515999,-0.366153051133,1.51623125812,0.0388540159369,1.26004643415,0.93613442406 +0.489037908894,0.715852018245,-0.498395236372,1.88463547239,1.83356743989,1.58726105404,3.03401180195 +0.237296980078,0.815992476614,-0.527111393687,1.35751814785,2.18575166418,2.03066579745,2.89774579739 +0.29722132518,0.501366458659,-0.81258301606,2.76121292623,0.0188695270506,2.43148535919,2.04293251093 +-0.700559926768,0.707434407904,-0.0935539818481,2.56131595281,1.63822427001,2.87079243872,0.552411963977 +-0.852343997448,0.360167329323,0.379195470571,2.42900261283,2.63049039891,2.20887662482,0.561863974656 +0.241355248184,0.87378465343,-0.422194296035,2.04568047007,0.181041329458,1.95900880033,1.02193959263 +-0.313075178179,0.543961845993,-0.778517464744,2.10566770918,1.19869305348,3.04140954854,1.99033999186 +0.278856978015,0.511470405173,0.812795675705,1.72107348881,1.63304343103,0.247642815372,0.890504945242 +-0.151897761204,0.528444675978,0.835268396728,2.40577338565,2.60097072124,0.613356035502,0.953138898518 +-0.277041699226,0.955361149185,-0.102630266094,0.839005230122,2.90919556667,2.36432478138,2.80021574355 +0.518792126412,0.632194147143,-0.575487002365,1.93064175225,1.69406188125,1.66683135292,3.07514328388 +-0.0578276700317,0.362995784634,-0.929994634886,1.66630194924,1.47444461168,2.83434777635,2.67668994668 +-0.000453696496466,0.998803727856,0.0488969056393,1.57259138238,1.60783022197,1.52230122218,1.5584157946 +-0.887924147774,0.25021691546,-0.385982127847,0.431590259505,2.95824202359,3.06828444359,2.75037649044 +0.915635010502,0.269807790247,-0.298020609798,2.22205045585,0.212533977696,0.711376706953,2.22931853131 +0.414042784517,0.178633440588,-0.892557374342,2.62055112476,0.510163615682,2.24853133139,2.99495052958 +-0.719559649945,0.542811319875,0.433116359869,2.12432313807,2.43087223959,1.92695643632,0.813661048975 +0.29184025297,0.903131970748,-0.314931595999,1.63244667914,2.26616340285,1.61577539933,2.90217150559 +-0.159192987177,0.937728934932,-0.308742671857,1.26576454787,2.24386080993,2.10622093454,2.37366584482 +-0.632287975121,0.536952230436,-0.558474904313,1.34784173802,2.1528787648,2.89033403197,2.07040930781 +0.257833049136,0.655908457586,0.70944077557,1.24832545189,1.14001315737,0.520312212444,0.705193781702 +0.926759618465,0.153764218278,-0.342743599152,2.57616334538,0.106647778125,0.73182347997,2.57498364493 +-0.886129803369,0.415104423313,0.206063799169,1.78616940292,2.82142268427,2.46372047501,1.36105407948 +0.784605493377,0.508759962382,-0.354340966359,1.45849137165,0.00354013355127,0.851721823904,1.22452296083 +-0.816487622835,0.490808688964,0.304063796915,1.72412816907,2.88516263142,2.26081750616,1.4982231753 +-0.204682614076,0.978780833532,0.00964921783176,1.74028524292,1.08112065412,1.82816082552,0.846949874116 +-0.0884701482975,0.648097363129,-0.756401243233,2.38769963858,0.711518034048,2.80750627161,1.84985610593 +0.518053922667,0.387598014891,-0.762487975028,2.16744092575,1.14797793571,1.92597299381,3.0464233357 +0.0204516897653,0.495869894026,-0.868155963284,1.35292969166,1.82310759629,2.62022629016,2.7667598389 +0.3068858381,0.344182788865,-0.887332682945,1.82364047776,1.39064304071,2.40242914897,3.02676374661 +0.212408902362,0.902665457355,0.374269328554,1.7685824499,1.8053648153,0.910723611831,1.61793980127 +-0.433700357372,0.834035180597,-0.34101219559,1.67633676871,1.70871674242,2.4128701338,1.60189296452 +0.274942636034,0.849732554869,0.449845675855,2.01476226284,1.98050355178,0.631739482585,1.74546741512 +-0.583472346972,0.728962511132,-0.358013516063,0.665334528268,2.79359563085,2.72412099249,2.66930483538 +0.304321057738,0.769500030409,-0.561478759186,1.62743287664,1.70176113414,1.89215131888,2.63706204817 +-0.617528910498,0.180652528435,0.765521200666,2.83196680511,3.06743933252,1.36078565509,0.403470297614 +-0.0063574484563,0.891493617841,0.452988644668,1.41454879972,1.23269939796,1.08235492606,0.794190493692 +0.625245618076,0.487052575852,0.609793166109,1.38783211306,1.03689279308,0.167809303035,1.05518937675 +0.512971675496,0.856048047934,-0.0635751505455,1.94265262437,1.57931369414,1.00098497257,2.29602246445 +0.0799576838443,0.949490122,0.30343908288,2.03227939924,2.42290648468,0.95290385415,2.13994241594 +-0.654371438507,0.755045538254,-0.0412826310805,1.97357698852,1.84491116758,2.42473421814,1.02768146385 +-0.840872398865,0.48145468981,-0.247254909934,2.11204405084,2.16375120952,3.04382445443,1.13227477664 +0.86735074917,0.455692724626,0.200117012363,1.0899985877,0.42265559638,0.3159631189,1.03651813647 +-0.994804972679,0.087938764403,0.0512819661165,1.67835972383,3.09520519898,2.99716817902,1.4650566456 +-0.42606146403,0.677376087786,-0.599694309264,0.692368616286,2.63597924629,2.75873006304,2.73656032578 +0.632204878868,0.0908548638952,-0.769455901818,2.96542611592,0.108608526179,1.76448187703,2.9959309666 +0.945984686223,0.294032729206,-0.136593292611,1.77423856309,0.225669049303,0.4592666724,1.77254006426 +0.410603079201,0.135020264797,-0.901761963849,2.82951646752,0.264542492038,2.27194155265,2.96778001358 +0.855437564368,0.517897991587,-0.00287119808675,2.54294565856,1.00725297422,0.300851684693,2.61581257885 +0.14052241896,0.972345192223,-0.186542962692,1.65908345612,0.50807696314,1.64719685931,0.851186494364 +0.985040540538,0.130845414923,0.112136572492,1.06849319813,0.166156715289,0.0574353930704,1.06011467936 +-0.177509454634,0.261240159375,0.948811874212,2.9875965907,3.08402380102,0.384314985634,0.526149923461 +0.45243051953,0.891490568552,-0.0234774611208,2.81784184825,2.1854090881,0.309200576862,3.03308753105 +0.108157711983,0.683722247071,0.721682615974,2.17835894697,2.23296648063,0.45420677118,1.29201792204 +0.809917554143,0.428448022787,-0.400581885837,2.44478136495,0.737200219311,1.01260614847,2.72042401854 +-0.0255596989129,0.763173656571,-0.645687750935,0.884303442574,2.4675145621,2.51763507396,2.89232694983 +-0.690961619605,0.319289517795,-0.648557047652,0.896799769584,2.508536429,3.06047732781,2.47317250377 +0.458661005358,0.879125252248,-0.12949468338,1.394310292,0.5309691412,1.15411172272,1.08382056479 +-0.551487962505,0.834112399973,-0.0108411910043,2.78967374384,1.19912435619,2.86203845416,0.217731379115 +0.306012598876,0.66245892561,-0.68374297891,1.86125966033,1.1724835175,2.01286839774,2.39838522488 +0.180474938298,0.816482772895,0.548438399651,2.55948378984,2.50612815586,0.270521493454,1.86916822494 +0.264311025366,0.904958904911,-0.333450239604,1.67957088787,1.13212315966,1.64412075742,1.77282068379 +0.533459727127,0.801003851095,0.271686492236,2.24332796488,1.74677227663,0.40210892293,2.14931474683 +0.730082809824,0.604096389279,0.319447402961,2.13910519944,1.28186289929,0.150967240553,1.96668108759 +-0.0971699264196,0.921267614736,0.376595256793,2.4643501551,3.04132756743,0.697652530182,2.32899607762 +0.30073618906,0.923467480645,0.23825523453,2.21338547347,2.1922338393,0.674732066327,2.2799294274 +-0.616659252808,0.661849575563,0.426247000287,1.93452185392,2.37151127284,1.79527638155,1.0568415103 +0.257090910051,0.958627572303,-0.122218826655,1.43655504809,0.450186956101,1.35693606757,0.807121792532 +-0.22931991178,0.435360083291,0.870559576329,2.42929285368,2.60684173489,0.688364229826,0.731686970932 +0.650746717469,0.44077147622,-0.61826306331,2.33361107449,0.987775343023,1.52516484236,2.92926007666 +0.185116717215,0.87443966829,0.448427326919,1.69009138355,1.69887257192,0.887243876011,1.40214687166 +0.687026034709,0.340669780891,-0.641824997971,2.46197958154,0.204438203876,1.50812948873,2.38322093285 +-0.0302900739647,0.917225488128,-0.397215200298,1.94523425364,0.841213149133,2.14937313361,1.29242998011 +0.754311833957,0.656425529966,-0.0109169941202,2.08832534954,1.11767739382,0.622135331954,2.22506948387 +0.953902465918,0.223960060589,-0.199779820742,2.09417500052,0.168774360281,0.500425734158,2.09605393503 +0.0846048805177,0.292503875902,-0.952514302662,1.74295432417,1.39352981012,2.74901354665,2.8754661104 +0.0634111313591,0.869008254653,-0.490717517278,1.48788665771,1.7655691465,2.03413974149,2.31781492064 +-0.739136576953,0.358009462823,0.570531633777,2.31217760606,3.04797976601,1.81419927121,1.00114507634 +0.5986165997,0.227443979347,-0.768067316595,2.70526187369,0.283593704145,1.80542795531,2.79015721406 +0.53109385501,0.775191332196,-0.34207852265,1.44378243588,0.0541698821914,1.18796115312,0.911350378768 +0.316523082519,0.256849517423,-0.913149201189,2.38044160499,0.726265418021,2.39999324231,2.88654533317 +0.991196576315,0.101985053922,-0.084429828135,3.08386632264,0.201518279405,0.173994259287,3.10098904814 +0.12059877182,0.962502003521,0.242993476154,1.59028505702,1.58369399757,1.20111748908,1.45788791998 +0.541464989821,0.421811610372,-0.727248671469,2.30109623804,0.734451916359,1.81343969846,2.67528431481 +-0.853548329771,0.281279408173,0.438562587646,2.20006437608,3.0944580648,2.17658588297,1.05062184353 +-0.64859705085,0.574632937527,0.499118074945,2.22205744303,1.90265795299,1.78576401079,0.261610878898 +0.63837225735,0.601672586123,-0.480073911137,2.28726517678,1.50373720411,1.29229642167,3.13113645004 +-0.291570414799,0.526773372357,0.798433783973,2.26269239123,2.51211927624,0.905867729031,0.852137333028 +0.0134642009249,0.787531994377,-0.616126669709,1.8282519815,1.15904522548,2.25963678352,1.92697970868 +0.122606005795,0.589041936062,-0.798747372392,1.21120559985,2.04715413391,2.479412816,2.89806251656 +-0.028221142421,0.925560616252,-0.377546173023,2.70395170734,0.227968935266,2.76048290647,0.818773150048 +0.128673422015,0.898304988259,-0.420108674674,2.08471791053,0.392760538588,2.10062054742,1.10199024517 +0.821608670115,0.428666631028,-0.375771356858,2.26923048414,0.557946538255,0.989142529891,2.41601021381 +0.519438686523,0.844099051537,-0.132967071627,1.61605382851,0.941837650178,1.15656946833,1.63733758991 +-0.489601213303,0.624052565407,0.608973765889,2.07552100019,2.58416588288,1.41945467795,1.11315557422 +-0.826689835166,0.535195858093,-0.173635566386,2.05338222973,2.16062582298,2.87451015485,1.12035098378 +-0.497580170465,0.849192334141,0.176879488909,1.16109017066,2.97507789713,2.15913369342,2.4213942954 +-0.862168508977,0.447965673099,0.236626747966,2.58808684044,2.29763135969,2.48168241785,0.331385364451 +0.0090856997675,0.996041896937,-0.0884193960941,2.0885264344,0.127249049371,2.0930315541,0.250726489706 +0.0802049671787,0.995115367282,0.0575549219395,2.95222723367,2.9689544015,0.179122694068,3.01050501103 +0.0723995111224,0.988303692912,0.134216695553,2.91645768568,2.96584322563,0.202825430764,2.8537036829 +0.813374798078,0.572345603936,-0.104124672907,1.25774459761,0.283484115792,0.647430395861,1.16418229828 +-0.0699573639584,0.996284749517,0.0502261396956,1.62714168737,0.43031471544,1.62710244523,0.306665737727 +0.578788492827,0.579658564505,0.573585067071,1.48241569028,1.14894936041,0.278292784657,1.1551728327 +0.488778266306,0.52529852225,-0.696532317203,2.26867431964,0.420751777562,1.84842413586,2.16888950481 +0.372881567122,0.584743945756,-0.720440042475,1.72930471974,1.57764253651,2.04762322705,2.87804755978 +-0.0332741909768,0.9230406014,0.383260846398,1.84210317227,2.2498585291,1.13243271996,1.76457449498 +-0.312312874136,0.927942444904,-0.203429318423,1.46720772173,1.96241572714,2.09443750135,1.85562688039 +0.446067287961,0.844854037754,-0.295373711597,1.55395824423,0.340119416082,1.34346977694,1.09808067348 +-0.405888017074,0.861179058436,-0.305982919307,2.25034815185,1.15112294666,2.65498769321,1.00215843803 +0.129950148339,0.174875536244,0.975977205559,0.315828043532,0.309537194638,0.0480624907813,0.0488805249239 +-0.814588009799,0.555877010025,0.165671735723,1.79136686693,2.5572063852,2.35650100637,1.30567969063 +-0.353934466184,0.930046989876,0.0987065867561,0.605903902447,3.1387696758,2.57603623923,2.92040733954 +0.162497286336,0.586917954994,0.793172078454,2.01971657642,2.00629772436,0.351108588702,1.04883543716 +-0.397420776401,0.829207229884,-0.393029383626,2.61566931102,0.958404924029,3.01628075293,0.950409004123 +-0.570592991285,0.315037633688,0.758402879515,2.52642380804,2.683271774,1.31695263742,0.430331777939 +-0.480584480875,0.774145104029,0.411992614802,1.72614491147,2.94264820056,1.68527153924,1.94051823128 +0.607814522612,0.585300780958,-0.536641874914,2.01003597812,0.207624462606,1.46709610189,1.71427386692 +0.358773587497,0.929613500664,-0.0842629948309,2.25352088295,2.29226613572,0.879705784107,2.90304921597 +-0.861862421786,0.420425158027,0.28361215138,2.32257891928,2.52423591778,2.33998042139,0.664455258009 +0.988994270588,0.142747971096,-0.0389017929048,2.60149988047,0.247352582911,0.145385857329,2.61388656124 +-0.155901516463,0.982334304058,0.103508609477,1.60132187479,1.47044312483,1.62545963068,1.20623788347 +0.373855236931,0.905396247472,0.201221015012,2.38098834271,2.16051850076,0.517166913627,2.42353294827 +-0.0292447428345,0.954465018571,-0.296885960162,2.52898930652,0.264827561313,2.57941388857,0.680002851438 +-0.352725077529,0.934902119515,-0.0392816319402,0.804997936587,2.96630565985,2.40785167123,2.77597608156 +0.889718345381,0.456219898634,-0.0162686810336,1.4238584658,0.382121040831,0.482120515829,1.40453096635 +-0.0837848395941,0.573984387414,-0.814568612002,1.01166012447,2.2133309098,2.66974975059,2.80930614569 +-0.240324138593,0.637641483359,0.731886362155,2.20558391714,2.53827396796,0.916738135801,1.12870086433 +-0.0724526763348,0.805968027403,-0.587508424191,1.53333895306,1.63676784591,2.27143562195,2.1814727992 +0.0396428368882,0.997904144954,-0.0511445301688,1.57016258035,1.75842820417,1.58261384914,1.84921956306 +-0.458756034013,0.888555838439,0.00337982732037,0.95157317131,2.89505120291,2.33167861776,2.57123184325 +-0.284888317807,0.262497549951,0.921918479393,2.87853772626,3.02704971169,0.624276451214,0.517780512125 +-0.00587760967479,0.972559007381,-0.232582094896,2.52525011534,0.175667300886,2.54755727647,0.523364162904 +-0.124329178294,0.715009432336,-0.687970760349,2.16517878267,0.923342814598,2.66478272299,1.77291550517 +-0.135020675583,0.779590435649,0.611562073555,2.72965608367,3.09268315775,0.489716334382,1.79897552564 +0.371620294016,0.400586463624,-0.837513487794,2.17658246308,0.911264251781,2.18408085735,2.74742061128 +0.423992211549,0.592654140095,-0.684829668439,2.3012687157,0.243145536116,1.95912686764,1.87853119071 +0.745693027112,0.472884942933,0.469384426737,1.86423901368,1.12890646332,0.00141205474995,1.57599612917 +-0.0342528155995,0.998340964707,0.0462824244286,1.56465698993,1.03469073314,1.55649382766,0.954379454041 +-0.247681331836,0.832768889651,0.495126180169,1.74920935896,1.97738705115,1.30145744807,1.13971580716 +0.777653029837,0.620815535991,0.0992161048301,2.60952549958,1.2993849477,0.172153202371,2.59844840374 +-0.194871596918,0.98064721449,-0.0188706498865,1.55614100374,1.81705176345,1.78606778824,1.64110139242 +-0.386317534795,0.712254793767,-0.586047669619,1.82475552299,1.50015247567,2.72337921256,1.76739725094 +-0.572896178069,0.419946915112,-0.703871122893,1.17116089108,2.20868335066,3.00061932405,2.34435173758 +-0.405072353194,0.83997801406,0.361044768103,1.67938137804,2.89874424588,1.64658443575,2.06791165414 +0.325509326823,0.186608626688,-0.926941691045,2.23335987035,0.958894674818,2.45428448657,3.11216634491 +0.603880164532,0.722225024188,0.337223607302,2.4223966165,1.68516471764,0.119219379867,2.16158263673 +0.302793935567,0.830126360299,0.468194466564,2.24302557022,2.12011667839,0.432862855511,1.86936123345 +0.252272420376,0.902886605876,0.34807241035,2.84736058639,2.56051082686,0.0901190121014,2.37872326683 +-0.661414937607,0.705862486257,-0.253551633409,1.43640364728,2.23463524783,2.55411293051,1.80068299202 +0.169921176828,0.979154595084,0.111279254987,2.02465856803,2.43422669294,1.021374129,2.50731507998 +-0.315477552922,0.600513764563,-0.734749707161,0.548402939826,2.69951119367,2.85876536594,2.90061697763 +-0.051183699801,0.401994392206,-0.91421044487,2.25724225091,0.86640807943,2.90489406967,2.4229297259 +-0.224742862881,0.898867170378,-0.376202678885,2.74911974513,0.572235172885,2.95946281915,0.846471519574 +0.669403130789,0.47771288356,-0.568937474043,2.33421936572,1.09734262455,1.42438896746,2.97686353115 +0.0484983096539,0.983089424368,0.176587365505,2.50408699198,2.90693110556,0.606118402769,2.71245156444 +0.704056963064,0.671489385835,0.231096943885,1.8981997444,1.19431203532,0.434317248705,1.85114850491 +-0.45237367761,0.738999248844,0.499237584736,1.83358016382,1.60307346975,1.50977350588,0.475737375753 +0.757489861899,0.630035640072,0.171067826778,2.39620350331,1.30143392477,0.203935039079,2.34413927758 +-0.1230433157,0.678742654858,-0.723994993725,2.20032783092,0.904264119234,2.72231763968,1.84123610815 +0.311984807462,0.917511725988,0.246653020634,2.39447649216,2.27583468926,0.512164313222,2.37553527835 +-0.543761962588,0.337859516302,0.76822774962,2.35897451204,2.30065529923,1.26026905815,0.198201728385 +-0.36062017372,0.908803371591,-0.209832128355,1.78891044031,1.47465598397,2.22220984015,1.2988970128 +0.6786963332,0.566816715362,-0.467001176109,2.24849450918,1.13376487657,1.27731232386,2.79583526862 +-0.188894900249,0.915098464391,-0.356249234566,0.904976484108,2.6399648662,2.37467780543,2.75246026355 +0.195631282563,0.149304290865,-0.969245392051,2.60712614202,0.507924074261,2.69838567783,2.95274134378 +-0.399999781897,0.858783445317,-0.320142419139,2.20844359631,1.17121079462,2.63438167072,1.05411842574 +-0.726431009119,0.59074817115,0.351161767956,2.36712068172,1.94068729558,2.12452970816,0.29380952079 +0.385837804319,0.812308053649,-0.437361194821,1.81055450819,0.607354299694,1.63568287366,1.55909133934 +-0.650114172575,0.757280933299,-0.0622667702679,2.83505707562,1.44119279571,2.99158953818,0.295856961695 +-0.0446017428327,0.835655396067,-0.547440173498,1.06842708804,2.33929497163,2.33815724326,2.73228603692 +-0.861760383992,0.353517607821,0.363860332467,2.59144671997,2.52087203429,2.26949859459,0.336290251815 +0.32277632938,0.848295375144,0.419774222292,2.33295262686,2.16181982732,0.394736050202,2.01009987604 +-0.135424256252,0.986503272822,-0.0920410969605,1.71506681276,1.1043651231,1.84736552258,1.05751658186 +0.109352590414,0.71553271217,0.689967353419,1.66812686928,1.67917437434,0.680735156944,0.991927322769 +0.883003611282,0.465741023524,0.0582230321294,2.68423807308,0.945342784708,0.108333440806,2.68157635903 +-0.998402212074,0.0376668083774,-0.0421216627403,1.35528973593,3.07082104837,3.13785849676,1.78773253498 +0.248893616483,0.959568025636,0.131457871011,1.56520395497,1.39064893497,1.18637864829,1.51002373749 +-0.200923569944,0.55433899439,-0.807674438335,2.33437991443,0.891521312239,3.01532404215,1.9989924303 +-0.420063215276,0.65898157358,0.623931230869,1.9458792972,2.12510983747,1.3305303352,0.801359440128 +-0.0792781292134,0.429809753761,0.899432350875,1.49816742431,1.48046202285,0.517613503179,0.327408941444 +-0.143981428512,0.669418250643,0.728799392116,2.11316838524,2.36311686519,0.821906096156,1.13217396311 +0.60217169096,0.79624114163,-0.0582176861536,1.60637559919,0.91117649755,0.982777515022,1.62862757124 +-0.205761307364,0.349371744192,0.914112503334,2.29990952752,2.3853246274,0.611315074944,0.480731151377 +-0.0826856254619,0.284660407314,0.955055778397,2.16884685269,2.20398705077,0.366858746521,0.391983530465 +-0.195101507925,0.315232038802,-0.928743324777,1.32508419563,1.85043220989,2.97214209119,2.71170919687 +0.038010357019,0.992611014874,0.115232746694,1.4573886523,0.912403494685,1.3826377912,0.839342412041 +-0.116876934118,0.863152067643,-0.491231402085,2.99770233931,0.274613245041,3.13205532941,1.03611601075 +0.203757222082,0.979007990365,0.00513315209127,1.40269660888,0.703250254321,1.30292856363,0.886392205201 +-0.253418422508,0.939781471751,0.229324853619,1.6004225131,2.72874446346,1.61065634814,2.23376874564 +-0.100288496773,0.622437683931,0.776217461178,0.77790627733,0.6347919275,0.477105470569,0.0772771990033 +-0.0435738185538,0.997628962902,0.0532707679381,1.4281487165,0.106960842653,1.42566784456,0.0169969424174 +-0.963205924126,0.267803945568,0.0227023009129,2.86251953292,2.61440786794,3.02466789529,0.257999821964 +0.913462308099,0.249458032279,0.32149230444,0.973605060483,0.375450530051,0.0778265997485,0.915487725116 +0.370630865698,0.906507008426,0.202182603272,2.97266423659,2.36455104791,0.00360394825277,2.70123116961 +-0.676517151081,0.421234602758,0.604057905943,2.38125115259,2.28155808752,1.67014051468,0.280006379574 +0.212766810647,0.398960726764,-0.891942051249,1.77341320234,1.38275242794,2.47442406519,2.85901439581 +-0.0380832627134,0.703670664896,0.70950494041,1.27320860759,1.15107555264,0.764033499774,0.453681095381 +-0.0473499877566,0.526002019683,-0.84916420906,2.46291406616,0.640649639102,2.87991674226,2.11967200617 +-0.727792897298,0.42498069708,0.538246138632,2.31545626289,2.61321275322,1.81753975752,0.668518428206 +-0.661951337946,0.732885900683,-0.157158145737,2.09158729235,1.75261886303,2.64101680934,1.0180910566 +0.0834398192765,0.709964298316,0.699277120801,2.9582064984,2.89404347185,0.0137527830072,1.58425229496 +-0.806042641478,0.329499275522,0.491655862927,2.73795638551,2.37299743122,2.04389601561,0.0122978520584 +-0.375562597419,0.188082489188,0.907511825092,2.53631960324,2.54052312271,0.815578589066,0.142522051009 +0.147666556807,0.686014284814,-0.712445779714,1.34942773115,1.93748797531,2.2914428294,2.77361805088 +-0.447086286424,0.36860139891,0.815013411677,2.17884993603,2.13106199454,1.06559208153,0.218861485455 +-0.124151879919,0.800682630437,0.586083301271,2.74239302217,3.10034581194,0.467902949877,1.86802576787 +0.615638172335,0.691852654519,-0.377265881308,1.499657875,0.045684239013,1.13339011449,1.07022874699 +0.93373765932,0.356750540502,0.0293774644907,2.87507668229,0.724460372155,0.0400756106838,2.87159895232 +0.832317699367,0.48552043929,0.267426906562,2.22340067591,1.03982284248,0.0280019982664,2.08576113559 +0.189087819366,0.977046789886,0.0981089544414,1.35257444985,0.777204063469,1.22070126531,0.859007355229 +-0.527555466576,0.76187713538,-0.375803752338,2.12074325566,1.46515384838,2.78651289553,1.23653992773 +-0.238658088411,0.947362356759,-0.213417154494,2.84301474114,0.538982046279,2.96155823109,0.493004329992 +-0.141281074438,0.931014754382,0.33652813423,2.12944030851,2.97475984738,1.03964127641,2.35225948043 +-0.377483176537,0.713176888137,0.590665029995,1.56267612295,1.13814953155,1.2063155653,0.113458922851 +0.715726679166,0.119382733802,-0.688101070774,2.90958213961,0.269448040837,1.53178134528,3.07805493048 +-0.698764060293,0.545825277579,0.4623889644,1.83801661324,3.03962521865,1.93370226537,1.5882828886 +0.871594993327,0.486232989502,0.0624471578805,2.06091769669,0.809424359103,0.356441462404,2.08999623218 +0.806769678958,0.450866132311,-0.381893199533,1.82872011799,0.154094649584,0.966039195372,1.69782673043 +0.0933098510566,0.799348099547,-0.59357888056,2.46345445948,0.304304601267,2.49811006385,1.3796019851 +-0.0271421763085,0.993712936308,0.108618149861,1.55629118311,1.38720732544,1.4872708074,1.25221508259 +-0.14616707595,0.593393466667,0.791529771787,1.84471512378,1.92812480732,0.801302117935,0.714741733621 +0.183768836702,0.938330541648,-0.292856294566,1.76492493616,0.49125263604,1.74476819393,1.01993627246 +-0.37946776577,0.529654504232,-0.758597601425,1.91148166014,1.42732980798,3.02617147492,2.02252935048 +0.541123319925,0.82175787845,0.178604428384,2.2379218878,1.73751688391,0.511092379583,2.27861713546 +-0.765026828277,0.202320223483,0.611392246587,2.79770190249,2.6905124655,1.78898996313,0.0822263594549 +-0.0653513580944,0.934984409183,-0.348616342962,2.02322894507,0.749777259908,2.20055417092,1.10884431881 +-0.22394275024,0.942023186189,-0.249883895634,1.87957190215,1.13570802976,2.1722638694,1.16672288525 +-0.620061970976,0.784518796184,-0.00730825446995,2.59508551336,1.41595689195,2.73082170345,0.371577648056 +-0.00100749933781,0.276356307807,0.961054720648,2.78038634523,2.79383219042,0.099704289914,0.542474125274 +0.780706511578,0.4853142581,0.393659006838,1.53458599341,0.882710661317,0.189929987083,1.38069583536 +-0.187578072651,0.973654665677,0.12965746668,1.65221839781,1.00568403312,1.65171378182,0.674011581607 +-0.265177734033,0.732969978709,0.626446948818,1.93570236726,2.25358735906,1.14355136642,1.13312879124 +0.128518910224,0.964949405422,-0.22881331843,1.56266553253,1.79847599398,1.67961351874,2.15679377793 +-0.32083233371,0.928855434366,-0.185186920963,1.13193135321,2.5306697433,2.20310742426,2.4223866421 +-0.0868305413689,0.824979391439,0.558452738186,1.68300150639,1.78538518387,1.06278138785,1.06703046987 +-0.974659378789,0.221726661849,0.0296037626792,3.06991678242,2.69631736143,3.06801434988,0.0568731773728 +-0.536928952652,0.815731460103,0.215149912391,2.05410184692,1.47696637867,2.04093820988,0.502975960662 +-0.924005935686,0.373263925594,-0.0829883887508,2.2369319047,2.45692537124,2.97137337076,0.907512406469 +-0.778272258625,0.391165585431,0.491204413895,2.0471690409,3.12390059227,2.00972289622,1.31716059658 +0.304391502687,0.509236482534,0.80499939003,1.83919721029,1.72181915844,0.181991053672,0.97157722269 +0.117424647708,0.986245849223,0.116321008424,1.55212432078,1.43166072075,1.33646578383,1.43276155589 +-0.556603925693,0.550984393001,0.621778311436,2.16632327504,2.70567969276,1.48536072096,1.04904572672 +-0.908632202739,0.416619504219,-0.0285606171054,2.67522031543,2.31357694365,3.0029471016,0.450337545367 +-0.218168867286,0.975030811414,0.0414398617429,1.71723148477,1.1474258642,1.795071222,0.866845781811 +0.0305979872466,0.733459028318,0.679044635466,2.92692817735,2.95013968225,0.115419339491,1.63671020897 +-0.208260734194,0.723458923942,-0.658205630455,1.1477658506,2.13508240077,2.52423677889,2.52637918384 +0.859796433372,0.0935247582048,-0.5019992159,3.01198313256,0.195656265135,1.05866455874,3.10562606587 +-0.142579655787,0.89706455279,0.418265740747,2.18284180068,2.8874110454,0.975752987371,2.13359695799 +0.00156583463244,0.999287723328,-0.0377040338401,1.62587650408,0.57909883308,1.63661759201,0.619459762855 +-0.507714356218,0.7957322207,0.330206549647,1.96139462406,1.47280016316,1.8273075489,0.433961086099 +0.0888316860545,0.867365795778,-0.489678984506,1.76055548645,1.13931418005,2.01372532329,1.79764314145 +-0.526222668153,0.742084794356,0.415210623066,1.97891228189,1.50961003382,1.73623315499,0.325066228576 +0.998534909144,0.046671154154,-0.0273831808167,2.60496580654,0.072923798889,0.0747725409757,2.60694459957 +0.720720393884,0.393285316647,-0.570866686319,2.38669376084,0.52762703895,1.37342472246,2.57162446225 +0.209691463867,0.954117517513,0.213750445045,2.29596042692,2.44588764887,0.693851104722,2.4401059372 +0.0907485329301,0.765907265287,-0.636514544022,1.54052287086,1.63794800618,2.17743203018,2.40720358829 +-0.106614731626,0.950291637778,-0.292539060928,1.31274210385,2.20518271457,2.03182268619,2.37018539239 +-0.4270019467,0.638681970111,0.640120831226,1.97841063702,2.17178125474,1.31730095235,0.794186012461 +-0.512962022458,0.595177444936,-0.61857398309,0.871090817269,2.47367989162,2.7921579353,2.55061582887 +0.00290998843734,0.977102177323,-0.212750715714,1.67430868858,1.11068199415,1.80562082554,1.33927855952 +0.870781213104,0.384234078274,-0.306764163486,2.53353030805,0.659381586926,0.783655084038,2.73082765032 +-0.51954065065,0.530741842342,0.669619749641,2.09581102284,2.09652253364,1.37829181371,0.454327271448 +0.448016316698,0.843256952891,-0.296983318341,2.01452862398,2.0535170963,1.25894514865,2.98885579274 +-0.680618906418,0.235844282036,0.693639228171,2.68212453081,2.9632712402,1.55265991678,0.48036217412 +-0.52610427238,0.444443606765,0.725040809189,2.10889294167,1.90661052445,1.28196367528,0.125419931427 +-0.619656238481,0.734688966309,-0.276148997635,2.00781234804,1.70717195639,2.70583092826,1.21627093199 +-0.75484194224,0.634192669691,-0.167371741776,2.26036976702,1.88458043677,2.85511678779,0.907833183318 +-0.133434393686,0.956151670274,-0.260709121464,1.92275644571,0.914241475365,2.12416630349,1.06781916348 +0.422804868338,0.901209407857,-0.0951716685745,1.75368287236,1.48855249627,1.2047144606,2.06936048979 +-0.718310956235,0.66445335481,-0.20623071894,2.00521165763,1.917135768,2.73851584978,1.16815247049 +0.247003144278,0.931340872473,0.26756985252,2.37788586775,2.38618103801,0.55894528377,2.35532349336 +0.809023957559,0.581631105612,0.0847672877917,2.28632508479,1.10121980464,0.331452116895,2.32018884234 +-0.151215162578,0.512320808093,0.845376463004,2.75121403027,2.94809226263,0.456721196505,1.04457286246 +0.823989566371,0.3847688275,-0.415925647075,2.30810307429,0.447506638455,1.03129352057,2.41216472117 +-0.397641697644,0.89103995926,-0.218926634507,2.25884764896,1.10470760479,2.56403638935,0.844051510409 +-0.615324542472,0.751739956933,0.23719769093,2.07095982284,1.73851024302,2.07490923903,0.608520055954 +-0.359122171242,0.0869556482782,0.929230854715,2.94849159463,2.98252414931,0.744901688001,0.124355736253 +-0.660995747858,0.745073905485,0.0891599499718,1.77951988299,2.13387030369,2.21421545328,1.23513497605 +0.205395367167,0.505258807714,-0.838168408122,2.26741387374,0.690131118942,2.40717128535,2.33140762398 +0.0689822107856,0.983316748531,-0.168314071464,1.52032555365,2.05824450791,1.68842654905,2.29039911673 +0.191916191658,0.768785324584,0.610030573072,2.12836276012,2.13735870574,0.493064404376,1.52546185741 +0.371427550961,0.926405230377,0.0617650671335,0.833202090995,0.21722399905,0.745186516409,0.410987758952 +0.922948306024,0.322826328006,-0.209641566378,2.12103140677,0.341295490736,0.606309516043,2.15898732182 +-0.590831010212,0.805102972194,-0.0522295082906,2.1196425217,1.58315236007,2.44722822834,0.831873393871 +-0.752893839976,0.574732419422,-0.320676646783,2.17710400618,1.89803029274,3.04818048395,1.14812996035 +0.840302094177,0.12403905128,-0.527737344026,2.93336015738,0.227972742873,1.12665656573,3.03851906557 +-0.817658857504,0.552581982685,0.161515154573,2.91215830653,1.95511530423,2.74493270184,0.0106203225901 +0.68536938181,0.662147650861,0.303033494744,1.43486680241,0.907119532749,0.496662927449,1.32386528215 +0.248658388734,0.365821588509,-0.896852034113,2.82498050783,0.122114632898,2.56062491376,2.40355104056 +0.161565209968,0.861596481059,0.481194541486,1.46865511285,1.36598007267,0.906399349505,1.04417956134 +-0.0238440538831,0.307264819571,0.951325281777,0.542839437734,0.52006335382,0.162701312999,0.0301057199467 +0.902489198226,0.369161393412,-0.221885359364,2.61975186089,0.663872319694,0.591809996875,2.77568273031 +0.184587807961,0.796737766885,-0.575444412581,1.32009120991,2.12035221409,2.12237531371,2.81942994865 +-0.757637752428,0.527005899362,0.385032229994,2.4411709138,2.06909614273,2.11714359907,0.253433821114 +0.201466268551,0.879153839442,-0.431856306231,1.57983396191,1.69623336818,1.82877080294,2.34928338383 +-0.174919863094,0.236556645694,0.955742640502,1.57619515121,1.54305746186,0.416578711854,0.0573214691248 +0.0361334429446,0.993238265065,-0.110327345257,2.17131715158,0.0618283428229,2.17014734635,0.253896950188 +0.0521339862468,0.426268425017,0.903093171999,2.78053156297,2.77044192687,0.0594937287818,0.870838563272 +0.818396207773,0.563612623769,0.112109131792,2.11226565055,1.00979369748,0.351122530245,2.1277478778 +-0.808902434345,0.546725437007,-0.216259446592,2.21986839168,2.03847927295,2.98609108862,1.00525102424 +-0.371508614585,0.179931112537,0.91082717572,2.54374360556,2.54447568262,0.80285856286,0.130269514862 +-0.959356665556,0.245536765128,-0.139091643254,1.0592379993,2.89495517659,2.99508069534,2.09997073356 +-0.342651668386,0.881774490807,0.32413512848,1.68245924145,2.51867202774,1.59426906008,1.80032139871 +-0.235251904771,0.89248863319,0.384864366925,1.55329876086,1.1880510822,1.37714413057,0.560230925031 +-0.0462739454604,0.815867857937,0.576383865454,2.2057587258,2.54108874818,0.774476573173,1.66027722034 +0.201394517268,0.0902162907512,-0.975346743111,2.98882637658,0.123087112833,2.72537951083,2.98314720969 +0.783575051628,0.308737753564,-0.539157804349,2.6562695644,0.643437108711,1.22315965887,2.98883642269 +-0.0602756288142,0.225347867065,0.97241204609,2.12155049738,2.14074166573,0.285161314929,0.298756858634 +0.374603267628,0.927123248448,-0.0107179322059,1.96108046723,1.94932998929,1.04107314195,2.42282208201 +-0.86416563216,0.470719746311,0.177878274748,1.78513439285,2.70956117675,2.43878794724,1.34029048221 +-0.477283670119,0.819358120358,-0.317572934681,2.0316517416,1.43552419855,2.60070438768,1.21450357537 +0.141076686972,0.983653600338,0.111906045119,2.93042969395,2.83419383375,0.1758519508,2.8877233778 +0.763786936653,0.582341527694,-0.278402335695,1.71506132525,0.419123933447,0.960542110855,1.66711802055 +-0.210314411168,0.947755790274,-0.239847473319,2.4279098314,0.641898556697,2.58081410025,0.686619298072 +-0.655129972974,0.449320214606,0.607384609007,2.27496238402,2.78808278538,1.63442859141,0.897609803137 +-0.299727790813,0.935775941073,-0.185705787532,2.07328570785,1.02844577691,2.31203438517,0.879409022292 +-0.103818465641,0.965321142311,0.239534587064,1.36225615781,0.622978618948,1.30213197775,0.313210415169 +0.573473451303,0.788913368626,0.22078020168,1.32438684165,0.845967968651,0.733341335301,1.18324048111 +0.568437868553,0.802469781953,0.181440454825,2.27752873032,1.70080732136,0.45577481117,2.29521887086 +0.758799950829,0.598448045127,-0.257065306694,1.4564864579,0.231177249838,0.874705463983,1.29825185938 +-0.235917592783,0.562080740823,0.792721975355,2.03633501889,2.19043950654,0.883925147453,0.755490711081 +-0.00741252853832,0.970932743528,0.239237668367,1.67836630147,2.00750237373,1.3142986548,1.74504727717 +0.00660556928389,0.125982770976,0.99201043738,2.09157186645,2.09435717758,0.0996332866801,0.195084844626 +-0.498823400403,0.548524207185,0.671041287361,2.01306399775,1.89568344658,1.34111841575,0.334724602209 +0.610084160863,0.520754025371,0.59717046287,1.54074230031,1.16293454798,0.167930560652,1.17958336977 +0.0135487872743,0.183789670927,-0.982872213069,1.46934758828,1.674402882,2.94552607214,2.98922767215 +-0.457932485855,0.885321653784,-0.0806437086248,2.85695375674,0.979397465416,2.96443224435,0.276281925681 +0.585439926647,0.306302699577,-0.750625571453,2.5028176904,0.591595524386,1.79547031405,2.84338502714 +-0.826599614583,0.546071333498,0.136158642411,1.58402315672,2.69977491464,2.42069287046,1.57819502228 +0.000161360788222,0.795335745788,0.606169139296,1.47879554205,1.41978046928,0.913886960547,0.799782290856 +0.233235257692,0.540826553365,0.808150947376,1.82050270695,1.7591763136,0.29316555767,0.936425136777 +-0.653568812175,0.631561590402,-0.417106419612,1.41869976215,2.16386370639,2.73773793946,1.90212352825 +-0.452694121186,0.376061310967,0.808483718474,2.35552484858,2.47369396767,1.09891373496,0.452069820341 +-0.815662543674,0.37047727865,0.444343561731,2.51638982867,2.51169416595,2.0799886903,0.376606887265 +-0.515929944332,0.210531519518,0.830357014681,2.7745379644,2.93449330059,1.12863339663,0.365250723122 +-0.229663043687,0.180383143475,0.956408285156,2.20986731976,2.2014969266,0.518349852153,0.10504732345 +-0.756041603362,0.411749187218,0.508786498259,2.5141246255,2.27506141901,1.92537698862,0.187708187432 +0.938284652001,0.345686697031,-0.0110733606247,2.39628440162,0.61112649853,0.255231570683,2.43297555308 +-0.898008897039,0.3329664283,-0.287599336689,0.915815046041,2.78441161205,2.97774338321,2.278619562 +0.402876895696,0.592530285841,-0.697565815731,1.81085617723,1.47462383144,1.96477123452,2.82288700872 +-0.374220943827,0.337257400521,0.863838023587,2.63434393656,2.85071520204,0.878307225837,0.607042752365 +-0.33435155116,0.880639997126,0.335681747641,1.69720521057,1.70057124038,1.56934533005,0.973655675818 +-0.0416838006209,0.970243488348,-0.238516318276,2.12409333753,0.468536254941,2.19690665808,0.72476575151 +-0.929266734873,0.202363724104,0.309050576161,2.9726970278,2.72627255524,2.49269246896,0.0401898605973 +-0.656037142013,0.413113894019,0.631626613489,2.36768848433,2.34802117558,1.60360266414,0.34119971019 +0.241488775919,0.850509573674,0.467243658271,2.54936477749,2.41963977515,0.271639563304,2.03378258628 +-0.0300045511528,0.940858758558,-0.337467810843,1.95513055975,0.755022130703,2.1096462593,1.13125528162 +0.86059723381,0.295872330445,-0.414526193666,2.55949004044,0.428604724362,0.95687143026,2.6964629488 +-0.894736237209,0.383618876796,-0.228656124323,1.68855816503,2.47558928812,2.98865903818,1.51099976914 +-0.720805546782,0.299150599122,0.625258572731,2.5481288303,2.78829934613,1.7004142811,0.491402095943 +0.483938391815,0.660342880886,0.574239420965,1.35002896583,1.11017004701,0.441474433804,1.01566667381 +-0.486521822787,0.622298795598,-0.613221595305,1.73130061777,1.69016126143,2.86999158185,1.86171948474 +0.798591594581,0.601479767097,0.0217613151499,2.78050618071,1.26216422952,0.179828827939,2.82376007166 +0.848272407732,0.329993286715,-0.414171888234,2.32091696334,0.307403289413,0.983185260094,2.3593741772 +0.144714839605,0.941353937252,0.304812040475,2.25533307272,2.48757077961,0.717197983539,2.26239526415 +-0.335753623505,0.934871875793,-0.115256583993,2.60321293367,0.780320319652,2.72195456498,0.420038959914 +-0.110984924039,0.504249176672,-0.856396587138,1.69452322404,1.45131642377,2.73702921898,2.4372400804 +-0.107278799784,0.671055707127,-0.733604455446,2.19549801184,0.896659939,2.70859896146,1.87059710905 +0.922485247181,0.152142107298,-0.354786904944,3.00008689186,0.315051235973,0.737929243572,3.1109264524 +-0.483936458434,0.398760511987,0.778970832752,2.04316433531,1.84073614822,1.12806986547,0.0490686985007 +0.692238708597,0.192877253347,-0.695416375606,2.76210476799,0.0171873977681,1.57535516694,2.61759313038 +-0.179219006328,0.978642517903,0.10069443839,1.71801941493,0.745934167481,1.72094125378,0.444202568161 +-0.0694501501101,0.994744348413,0.0752353504008,1.63853118298,3.12077815921,1.50820863201,2.97106342018 +-0.850847233735,0.525285026256,0.0116028460425,1.99624559278,2.34739574641,2.6267424519,1.07698642606 +0.913195936449,0.350130271256,-0.208523319567,1.8961899588,0.279808267781,0.622483301786,1.89954255138 +0.319705226795,0.887274872703,0.332463333662,0.504054115205,0.216997430315,0.428290542385,0.211648957142 +0.289538202728,0.913288431479,0.286481884396,2.84463115772,2.49250638434,0.105172346675,2.49825743529 +0.140917474857,0.899037303429,-0.414577124698,2.52191713298,0.0140729936265,2.46246466755,0.869120724259 +-0.314015234692,0.947435025863,0.0613294721107,2.4979466273,0.67546576364,2.49404254305,0.10534031697 +0.399818950588,0.483205306321,-0.778882172536,2.1534993477,0.859319259948,2.05242338726,2.5724769738 +-0.135010861161,0.909117522053,-0.39405253262,1.23833942163,2.2104575534,2.17404124195,2.43358088273 +-0.000494825196269,0.225211158633,0.974309852755,2.51999053595,2.53242565887,0.132409707654,0.41263963928 +-0.85002496354,0.526640746236,-0.0103482250972,2.7091628137,2.07227893724,2.93623137953,0.383850983813 +-0.324152534977,0.94474091419,0.0488849580527,1.72150048669,1.47472758023,1.88104367045,1.06698525495 +0.0415442131314,0.642398726917,0.765243721968,2.30429069903,2.39804268471,0.437994731123,1.22357050082 +-0.68623564121,0.726402635725,0.0376809705983,2.09358003731,1.85238547927,2.40987615799,0.839000091707 +-0.770918937456,0.36603812375,0.521248581612,2.60408815059,2.33263355173,1.93494804343,0.112594457477 +-0.446830546323,0.867163184402,0.219932886333,1.71380281793,1.93429009412,1.81392433371,1.19990460166 +0.375388277968,0.83848783376,-0.394995940993,1.75177502797,0.895829081207,1.59274202641,1.75930424049 +-0.0546743997257,0.917428546998,-0.394126339094,2.50652995247,0.385339201729,2.61180711538,0.917263348394 +-0.426746399081,0.511594248381,0.74576057545,1.75583134391,1.50422689149,1.07515511475,0.0678801605671 +-0.633432463286,0.750884112915,-0.186912716069,2.28318509905,1.58141996892,2.75990701105,0.873592926716 +0.744232740523,0.623100980876,-0.24054686771,1.86476358344,0.713913403875,0.974223931704,1.96374099318 +-0.633607439362,0.752042564897,0.181586324836,2.03274357693,1.82133488989,2.14513546004,0.748620569216 +0.545179462326,0.254070426681,0.798891464558,0.991097693964,0.8199381956,0.0155999025704,0.579935312294 +0.842024249777,0.254387841471,-0.475691064557,2.45852079391,0.164236815627,1.05883238152,2.43891599969 +0.657855779011,0.509661476783,-0.554500634,2.23126729324,0.882487559545,1.43692185385,2.64555462398 +0.0772711679857,0.935175066065,0.345654108044,2.05360398198,2.4063779532,0.909457276713,2.06130480489 +-0.422686949094,0.901023566872,-0.0974283070095,2.19898977819,1.15227365216,2.41593690391,0.699040567097 +0.906841404484,0.421470060328,-0.00128660823208,1.80273643134,0.540319513187,0.424229815428,1.82577217281 +0.164616292147,0.28721283885,-0.943615526345,1.6090196405,1.55951968102,2.67675968972,3.01046475487 +-0.725365169806,0.688300526487,-0.00936779961967,1.99764533164,2.00344980005,2.47675121393,1.017039076 +-0.404945596445,0.90921699932,0.0966618439019,2.10642735015,1.06378478246,2.14246594303,0.409650944545 +-0.264170527466,0.886369209162,0.38021514629,2.03030034866,3.13349331146,1.22092340487,2.32548966553 +-0.251688755198,0.795466890367,-0.551257831542,0.566417950229,2.77572080034,2.72440634053,2.9170744203 +-0.194759731199,0.55554473049,0.808355552667,2.69485241345,2.97038923877,0.569760551715,1.15399071172 +-0.309883713451,0.204937512258,0.928424848982,2.87540227768,2.9888783316,0.667704385663,0.381448567252 +-0.0206095603415,0.969397476524,-0.2446298807,3.00930086336,0.0726206130053,3.02348806474,0.498678399143 +0.56785846595,0.709390270339,-0.417495158052,2.02625643225,1.4522325794,1.36275419539,2.72527011179 +-0.468818045836,0.862470360932,0.190668603637,1.62137535123,2.22667552298,1.87100246393,1.52897068393 +-0.900902612254,0.294603455557,0.318721331585,2.4313554922,2.77233228614,2.37048276517,0.629678300931 +0.0157119556215,0.957774936352,-0.28708936892,2.12159636246,0.400953802949,2.17492500108,0.794952728609 +0.553804883507,0.729910362802,-0.400663216777,1.89189856075,1.04548733872,1.39463436685,2.20906294368 +0.408667132663,0.578139690479,-0.706219281083,2.05701205166,0.89589863797,1.93443644958,2.40938255676 +0.800949246728,0.588310441512,0.111225575179,1.543309308,0.718385872474,0.52527456248,1.52510855504 +0.353693641938,0.639185492192,-0.682892900991,1.62442163143,1.74525368673,2.03818535818,2.90248953659 +0.527695491371,0.837138132856,0.144004218359,1.8676574203,1.47597760644,0.778626219162,1.95331807447 +-0.0784227353538,0.995909424227,0.0448808791844,1.61036354034,0.831146878438,1.62001806662,0.705307063693 +-0.235582377903,0.960027367801,0.151156859899,1.4143745098,2.93901405797,1.77916905831,2.57980805877 +-0.897908929523,0.159509941313,0.410263492046,2.61908738526,3.04384152003,2.26711257198,0.533086243371 +0.820978062162,0.357127031326,-0.445483226333,2.60431345304,0.67771457329,1.04060759917,2.89303499579 +-0.0756060397719,0.347615055437,-0.934584132106,2.65463881104,0.508705378469,3.11203379124,2.4370965576 +0.671804650107,0.671674055212,-0.312301898248,2.32857697287,1.43284758778,1.00077056178,2.89059277848 +0.424450355321,0.726844357794,0.539943677998,1.0364524264,0.800544704416,0.538746836937,0.707494183778 +-0.125835747314,0.852151294845,-0.507940484105,2.16185125237,0.835453202304,2.48798734791,1.37369799806 +-0.029845592349,0.856561781149,0.515180701979,2.98695640934,3.1126800569,0.163220272453,2.05625491161 +0.29692622059,0.363492140834,-0.883010919003,1.50681519259,1.75637069726,2.48783468472,3.13639362664 +-0.949233079768,0.249360258648,0.191770752933,2.88641140334,2.66346371463,2.70691367252,0.1611305587 +0.512894761706,0.580595914468,0.632334838134,1.25605673339,1.02395806173,0.334348529032,0.902095634817 +0.286809135422,0.736388667669,0.612757904859,0.929467725494,0.739492045071,0.546225792524,0.501910350314 +0.411607144261,0.905422957553,0.10386927712,2.99568423295,2.28239150443,0.0466050655991,2.89179855928 +0.129964136038,0.959764351688,0.248921097082,0.97791557042,0.432629446536,0.897372558475,0.348884860746 +0.0739195145566,0.121999715097,0.989773698824,1.85770117826,1.85047679927,0.0231471774514,0.227847988079 +-0.465259924784,0.8209193038,-0.33109620813,1.33006366187,2.15310959949,2.39392845177,2.02527160567 +-0.960405400274,0.258270532495,0.104488272885,1.68450655819,2.95510210108,2.76436971526,1.46160916935 +-0.841127222179,0.535295738607,0.0772234960273,1.8249860811,2.48482419205,2.49886173398,1.2610450059 +0.879336295275,0.336025936938,-0.337422953453,2.42741557806,0.459390139849,0.834567606968,2.54565303754 +-0.778867603962,0.369909637831,0.506489995299,2.57576850459,2.38387188065,1.95842512026,0.191781918213 +0.0574343847546,0.213612259767,0.975228739284,1.2865501582,1.27998984313,0.165490976269,0.209397224768 +0.348923127089,0.322662690481,-0.879853078391,2.05165900631,1.13779155196,2.31581656381,2.98481812357 +-0.228536550314,0.819154803912,0.526076470105,2.14710379244,2.82540453205,1.06047772813,1.81344162133 +0.434978474603,0.397765081293,-0.807822175194,1.89912409839,1.43678775462,2.14207407825,3.11718809224 +0.236361686124,0.960012504357,0.150030479608,1.12932485472,0.524327549477,1.01155986581,0.592315229093 +0.816033755632,0.520603386089,-0.251119541378,2.67501106934,1.08213986136,0.67145561531,2.98824579683 +0.414081610026,0.516348610025,-0.749613589233,2.48128888391,0.158320577868,2.08178006154,2.02809698168 +0.971890036412,0.146271024557,0.184484537287,1.34309105094,0.294009832031,0.00367200806793,1.31595090498 +-0.178909087082,0.980937190298,-0.0758535908857,2.3083788089,0.514218435676,2.36157657511,0.369673445632 +-0.70908872871,0.695863801398,0.113871615078,2.05167979429,1.98491126838,2.31586954131,0.857606448332 +-0.71505824646,0.368639461629,0.593966877443,2.50600149146,2.33519999647,1.74219745444,0.172852671933 +-0.940373254751,0.340086814764,-0.00625301308856,3.07078513895,2.44799649596,3.12927735537,0.0708422807643 +0.299824385264,0.953112121277,0.0410197790845,1.69594535055,1.63616765657,1.19940692041,1.91636684937 +0.226579490948,0.106974263186,-0.96810032605,3.02649001802,0.0704397077582,2.67534485905,2.9382190879 +-0.462352614854,0.451736953795,-0.76299658198,1.45498862551,1.88336595142,3.00446299849,2.26064278851 +-0.149365050184,0.511652185173,0.846109994735,1.16576934371,1.06238193222,0.578580035532,0.149916984444 +0.233927303254,0.970790060766,0.0533354920402,2.20092167958,2.46421343908,0.870304021131,2.70718954253 +-0.268602699553,0.122334634989,0.955451111714,2.78434196146,2.81446669114,0.570259274738,0.158016528233 +-0.130300956976,0.361989459423,-0.923030493471,1.82053776757,1.33802461139,2.93945706596,2.55412972211 +-0.848714618046,0.248403777333,0.466882276942,2.29995209095,3.13576505773,2.13410805051,0.967339149106 +0.148314810113,0.988447513461,0.0312126614294,2.02384138843,2.6099362172,1.08025042072,2.75480543072 +-0.135082694606,0.971934338225,0.192604018121,1.61362196239,1.97556420287,1.51036424654,1.6392001885 +-0.414622843589,0.802363141022,0.429303258203,1.7971975702,2.47492372275,1.55301863696,1.50325730899 +-0.443306271817,0.596370960306,0.669194461328,2.35881392692,3.08765194095,1.18784987574,1.41941001449 +0.335874845035,0.92491902645,-0.178081113495,1.49982332465,0.563356875533,1.36142580495,1.0667808206 +-0.488580176221,0.770076620253,-0.410208983743,2.18073717084,1.36123628642,2.82008899764,1.23999515711 +0.242925042177,0.91386856009,0.325317811937,1.48180971726,1.30613629436,0.994062193101,1.22407955326 +-0.75899189671,0.563303271372,0.326528291561,1.49423541772,3.02824249644,2.22991913885,1.86050316553 +-0.119796624884,0.988716792799,-0.0899325986699,2.47502866384,0.337880121773,2.5079655628,0.293144548886 +-0.933913925411,0.319651944699,-0.160085646372,1.94355324095,2.54865530763,3.04770839767,1.23377213618 +0.505414816654,0.640467589351,-0.57823622344,1.93918282533,1.4436437215,1.67094261793,2.81368869543 +-0.0387784123724,0.944675878776,0.32570495666,1.69037116686,1.96543708165,1.25992486088,1.57259972522 +-0.110532636422,0.69249036497,-0.712909272425,0.816748479396,2.4730468521,2.64103048766,2.868903408 +-0.223288277769,0.272851636051,0.935785407941,2.79116219947,2.90503664364,0.522296124139,0.503924255032 +-0.610695441079,0.424194041667,0.668663213628,2.37503747116,2.91470839946,1.48991894708,0.921275667173 +-0.0534596601263,0.966864061218,0.249631632339,2.62381292271,3.11039019297,0.527636371257,2.62782576993 +0.003968037879,0.957756168678,0.28755412714,2.43230823445,2.89133024778,0.671001971944,2.47057932291 +0.616217613849,0.609241197864,-0.499100205577,2.15669637818,1.3544286843,1.39880031927,2.89828370329 +-0.600096878098,0.497668112102,0.626266865716,2.21734099325,2.44312508941,1.53766246039,0.665523705615 +-0.534689895845,0.730637563279,-0.424588584876,2.41981262538,1.31702886256,3.0561744635,1.11895041976 +-0.167016759711,0.950019728031,-0.263757309523,1.37349793371,2.08555482876,2.03052643207,2.17466981806 +0.0245202270229,0.126461819299,-0.991668375379,2.51966552888,0.613993065286,3.02356293913,2.92537006623 +0.0174047309779,0.838837108675,-0.544104199992,2.27258064609,0.545479720258,2.42582564349,1.35929713292 +-0.959988877088,0.275230619414,0.0516668365948,1.2434155502,3.00479602044,2.84290871298,1.91596555853 +0.00244084530665,0.882551957453,0.470208554441,3.05097599362,3.09458379094,0.0776518164476,2.16070892284 +-0.907868858684,0.388361972018,-0.157952885767,0.683424282576,2.95742567997,2.92692131123,2.49703643153 +0.82212707285,0.512846705103,-0.247174701684,2.45496812097,0.947106209846,0.755259891434,2.72236908832 +-0.122662020146,0.661121680412,0.740183863985,2.64567661778,2.91106706476,0.506630685149,1.39814968721 +-0.382358731109,0.449207591298,-0.807474049531,1.63053026707,1.66687925093,3.02006364167,2.26000994645 +-0.0965264050545,0.983201111132,0.154913615269,1.68422099805,2.70262011546,1.45697249732,2.43611402366 +0.797558947484,0.510941191682,0.320684929379,1.57917098468,0.857481810506,0.255796651753,1.47210468629 +-0.91637668169,0.391954956647,0.0813946510165,1.23150479413,2.96119286307,2.70883737314,1.95140436262 +0.628548703302,0.699557163257,0.339921024525,2.428125737,1.63336088783,0.0827234404888,2.15926158257 +-0.649924392397,0.756393997489,-0.0739351386679,2.54255622508,1.51270628932,2.79600161176,0.52130632809 +-0.26790777212,0.924994181247,-0.269464636451,2.29544328514,0.846081976209,2.5320059235,0.848346077602 +-0.0093148868139,0.941829374371,0.335962293205,1.70358097405,1.95946343253,1.21417667756,1.58391765553 +-0.840610312606,0.230891707664,0.489962571705,2.51902753982,3.00145518639,2.06340831645,0.647174947424 +0.267541471542,0.937583596463,0.222167865925,1.54818259259,1.37522165926,1.07428291434,1.42150220319 +0.08539196338,0.968878414921,0.23234205321,2.38399279921,2.74079748551,0.683537655401,2.52660796851 +-0.564886424281,0.676242236324,-0.472863368717,1.26265747132,2.2035436256,2.66552370676,2.11355993976 +0.292462833393,0.508572825536,0.809826630958,1.58919054422,1.49942675001,0.270575748328,0.831171212304 +-0.569526154089,0.819337641814,0.0657707268798,2.86036595303,1.22333478974,2.8360202245,0.0549763780809 +0.0788912198727,0.826990983689,-0.556652574164,1.74455233518,1.23323230501,2.09435467995,1.96180875019 +0.905426612611,0.405335131995,-0.126119308384,2.05212487957,0.523571498752,0.554289010984,2.11426957459 +-0.131057222128,0.975460503443,-0.176920351434,1.71206719166,1.20975433867,1.92103333557,1.25950592864 +-0.0628929885518,0.181487192179,-0.981380084914,2.38197551399,0.769298212103,3.12308803062,2.78335446181 +-0.201416011454,0.786933338789,0.58323881098,2.06412847221,2.54646891633,1.04755498806,1.51534351715 +0.326925102506,0.928914759701,-0.173888891427,1.59177929049,0.99645346419,1.40783820991,1.50979649148 +0.458623838294,0.756985300816,-0.465443261094,1.83780346327,1.7635065483,1.58116745852,2.85587231975 +0.65505534905,0.467067469141,0.593927999804,1.27216912824,0.919681664259,0.172660019615,0.986784812243 +-0.659127158503,0.535429571406,0.528078178859,2.13144312838,2.53222122061,1.7346064406,0.874585519086 +0.716378930833,0.368717327021,-0.592324877254,2.45085097186,0.579774017018,1.40510082271,2.70547599859 +0.955011009471,0.10174758559,-0.278570279492,2.66234767392,0.0657824895563,0.581192715418,2.66036343896 +0.795440338389,0.605951238512,0.00988759880241,2.4872446565,1.19711111581,0.362595287235,2.58381851232 +0.932910400644,0.3551908834,-0.0593095331268,1.82620040455,0.403615241868,0.425721427671,1.8468474122 +0.0784472619033,0.0278866665539,-0.996528153606,3.05731946614,0.0806179830968,2.98250272443,3.0920693868 +-0.309070011311,0.932523655816,0.18674945636,1.71711317259,1.32598789977,1.72131659124,0.787255750873 +0.161276218462,0.923756622585,0.347366785387,2.71051513306,2.67790766637,0.282828418724,2.35503770008 +-0.12182077476,0.912388329063,-0.390777731999,2.4213248518,0.557528146213,2.59659916946,0.968953797524 +-0.139721710578,0.977840183512,0.155905160602,1.51879574335,0.355515269207,1.49553910801,0.0664647266153 +-0.132618640291,0.912874422614,-0.386099190343,2.71215036007,0.420823778798,2.85537124365,0.861794590204 +0.928358546393,0.231451799759,-0.290827223156,2.97312927889,0.480165418859,0.612565941038,3.11472029599 +-0.122218513157,0.93940180974,0.320291858934,1.60130224923,1.64551364169,1.36699512408,1.19003602591 +0.417698489303,0.435591148906,-0.797363356964,1.78713656953,1.56589650776,2.16250684734,3.11663738131 +-0.716466544945,0.685595140429,-0.128976716479,2.29492242877,1.77687766808,2.773390189,0.822445676268 +0.352158320586,0.901516726459,-0.251499719992,1.69080643,1.39181007924,1.4630757385,2.04295245049 +0.739705768502,0.646948280041,0.185184499884,2.30039324261,1.3143601679,0.256785849193,2.25244799338 +-0.385893111163,0.918397280025,-0.0873667144792,1.23027125523,2.50773759534,2.13836945062,2.25327387687 +0.775653632551,0.617257419098,0.13173731772,2.31568022409,1.21785678499,0.286228687937,2.31349915156 +0.0472658004643,0.239580472064,0.969725291777,1.81436404977,1.81538509143,0.176535803499,0.346389608798 +-0.518674408984,0.837847929673,-0.170257758142,2.88555327796,1.11692466515,3.10313520171,0.424987731245 +0.529197898727,0.825325881052,0.196943580877,1.81884972628,1.43116253227,0.734550966234,1.83975896285 +-0.261463282682,0.800411898297,-0.539423530144,1.93620567236,1.24685739909,2.55187131139,1.61607934087 +0.927245125018,0.367736184408,-0.0706156980174,1.95912805129,0.465024222972,0.445186588946,1.99535629649 +0.293408112208,0.212055586834,-0.932171715824,2.58533250299,0.500192810246,2.47571855669,2.87044787004 +0.407914302002,0.7859821578,-0.464583652148,1.91702652154,0.0651458091219,1.68780430229,1.12562079191 +0.336320701654,0.830407685239,0.444197548321,1.61058442741,1.46518523833,0.74017230814,1.34489128856 +0.459929076803,0.85406026123,-0.242994474215,1.87844302839,1.66766764619,1.28544996344,2.5022374763 +0.147691928597,0.628545244137,0.763621614611,1.7240934047,1.71775938181,0.513434977179,0.931845565955 +0.680595632035,0.479167827263,-0.554245233603,2.12122504073,0.132488614061,1.38568679021,1.8753365899 +0.0871869724061,0.995912993826,0.0235741504882,1.77030111117,2.54959122687,1.34092711785,2.6196996509 +-0.39346408604,0.401159594577,0.827198278936,2.07847627658,2.05379607309,0.986798436075,0.274251484816 +-0.591371416126,0.561722917999,-0.578573427996,1.67339332141,1.86283609185,2.95900467042,1.84535355192 +0.29423070091,0.946591275139,0.131883480667,2.20863304618,2.26418387086,0.773393583136,2.48716151643 +-0.582442535696,0.810138113305,-0.0666102843624,3.03861926584,1.24714882597,3.1357051213,0.168307757177 +0.766036117743,0.425809662539,0.481533796947,1.11576157778,0.675249198157,0.176643623921,0.95395403149 +-0.815176234336,0.563927567794,0.132187008646,2.76467889749,1.96884239268,2.71309745308,0.172550143278 +-0.710709958748,0.497835954962,0.497041966522,2.17049739829,2.57640228552,1.84146347649,0.842768053819 +-0.484249611228,0.840226779172,0.243969821058,1.80208800552,1.79180407151,1.84338528487,0.952439392552 +-0.165288046958,0.876318559899,0.452488279528,1.8026834528,2.21315508006,1.23711291313,1.50362242433 +0.02872051761,0.999573503544,0.00528610253758,1.60111839593,2.27252941612,1.52513271653,2.29632317693 +-0.340545078975,0.872694232885,0.349905451623,1.70718713865,2.00770321007,1.56080178457,1.25409223867 +-0.461879084293,0.794835433552,-0.39357889306,1.69411058825,1.71498217427,2.51713925191,1.63364676056 +0.0431149793524,0.997658354426,0.0530933743384,1.36710204839,0.40064636048,1.34765299293,0.391678398234 +0.514217007337,0.450225261156,-0.729984988601,2.50370435582,0.0526452376907,1.90388816095,2.07378630864 +-0.415479526953,0.909377465342,0.0202333440342,1.66623186684,1.80465055922,1.98745343632,1.33424763493 +0.519683198956,0.625353233533,-0.582119151061,1.98514385971,1.27123225535,1.65151204992,2.69423089373 +0.0809020313525,0.99626861184,-0.0300618426818,1.87081194813,2.88374665687,1.26938338597,3.01158251568 +0.0272732170809,0.958916709773,-0.282373715752,2.12364513041,0.365331515767,2.16639265904,0.768053843267 +0.378822951152,0.905614599919,-0.19067083703,1.78468903617,1.73610010238,1.33590661091,2.37846627557 +0.868908587817,0.370503678617,-0.3282147013,2.78582835529,0.769978034993,0.749903001349,3.04983193281 +0.187963015954,0.550978425958,-0.813076059641,2.35514569058,0.553034808777,2.43296860395,2.15965378873 +-0.0987812564685,0.824637024696,0.556970412922,2.50792730052,2.91385631481,0.628120492042,1.87926791285 +0.697144011819,0.655999437541,-0.289231680024,1.61621771998,0.388102418689,1.04737564248,1.48657563434 +-0.461532949657,0.335901308852,0.821071036568,2.42029302253,2.51998966163,1.08722547183,0.393175944405 +0.298807648775,0.947204833305,-0.116262602744,1.56844949303,1.06765154033,1.38003860409,1.48719762593 +0.143407270055,0.50742465243,-0.849679102369,2.61983288043,0.334134162809,2.64049204907,2.15114822572 +-0.277537348018,0.862888621535,-0.422369799204,2.05375527053,1.11911569772,2.50739260635,1.31584420457 +-0.786000587517,0.487704908703,0.379930254718,2.01677837864,2.71489575265,2.09156501844,1.102144806 +0.0810280115232,0.784140216096,0.615271145796,1.27364844816,1.13167588338,0.795935572065,0.641545584644 +-0.481314115146,0.318811964807,0.816514331569,2.65008750543,2.92811413491,1.09721838741,0.613713930904 +-0.545783685949,0.518935429031,0.657895271794,2.17336019269,2.36510971307,1.43008306955,0.653216579164 +-0.756835620735,0.578597708149,0.304014038017,2.37794645628,2.02297051721,2.22023892505,0.373112298861 +-0.389504947421,0.833765547414,0.391306667309,1.75399500988,2.85232978569,1.56785102247,1.97555367669 +0.758220851546,0.475916796146,-0.445650472261,2.52529028591,1.0502465447,1.09455988614,3.02549605612 +0.266727522198,0.251996834839,-0.93024406697,1.92973443037,1.25470864625,2.53360229358,3.0598297044 +0.412382667794,0.91033320462,0.0351282204031,2.50169339284,2.18862772862,0.543887877882,2.77855971725 +0.849803234165,0.502147955754,-0.16025571358,2.18514599464,0.767042241038,0.675152648919,2.32755212012 +0.029584943099,0.48979745328,-0.871334141362,2.07596097429,0.993468351851,2.65584115484,2.38440157562 +0.251124843079,0.959631370539,-0.126664698583,1.77423410441,2.22203898643,1.36101683042,2.64159734644 +-0.691881528276,0.686372986468,-0.22403587721,2.41149009536,1.66282842839,2.95320903381,0.837452490418 +-0.924836509162,0.213381280944,0.314874356313,2.16980794242,3.07891905172,2.4579415206,1.01540884247 +0.229695762107,0.225468137351,-0.946786129973,2.0120253846,1.14818934999,2.60149559628,3.02832719719 +-0.0601530182356,0.732228925699,0.678396944839,1.8162701113,1.94728679849,0.8648576327,1.03885883925 +0.0151263600395,0.993533455924,0.112527619684,1.89698628483,2.76544372187,1.21941153217,2.651708488 +-0.162431154368,0.346673343244,-0.923814761289,1.49404041515,1.67426134681,2.93298009348,2.65479351516 +0.510516470239,0.767979364726,-0.386756550002,1.71247418942,0.391802016348,1.40094754236,1.39539002206 +0.247388546843,0.96860759154,-0.0244589554356,2.29471401138,2.54587526946,0.826781540818,2.92436086214 +-0.548407070967,0.832146347078,0.0823537586193,2.22032777291,1.38958959217,2.3156709218,0.502964564451 +-0.546593308245,0.702622415769,0.45558478491,2.07233691454,1.3477919109,1.74518972348,0.0303988998579 +0.653504794718,0.348998624137,-0.671663192107,2.47091617763,0.457071403024,1.59505550799,2.629658352 +0.418686366421,0.908130874961,-0.000201287660598,1.35027275916,0.695474483134,1.08908757799,1.079077372 +0.272715739369,0.198884842157,0.941313414895,1.24341162785,1.18956607733,0.0141608471001,0.395512117744 +0.191065104078,0.908484401026,0.371685645534,1.87082091394,1.97524156745,0.888135982044,1.75663440822 +-0.841542942426,0.537035020369,0.058299768018,2.34535229531,2.17749921242,2.6554584921,0.668887717607 +0.645846976709,0.750747867197,-0.138777961414,1.85422827669,1.09005199281,0.989020997904,2.05337430337 +-0.840836428576,0.483977952221,-0.242403469742,1.91410678998,2.23809768275,2.9572439054,1.30516749881 +0.0685026537582,0.895918097669,-0.438905626186,1.98144237855,0.678510754044,2.09941821482,1.31078580077 +0.524271944176,0.769652469163,0.364381675254,2.61291901002,1.92992860881,0.0322199719902,2.23492781898 +0.282882672991,0.470742010134,-0.835690943601,1.71492798128,1.49370911869,2.31412703958,2.88774632524 +0.572381384649,0.785237403518,-0.236181647516,1.79911321411,1.07079629956,1.19616679867,2.01705192582 +-0.898671730719,0.381715598059,-0.216060923363,2.19215571504,2.34007439401,3.13842523919,1.0376035233 +0.34643105807,0.907764321778,0.236536377987,2.21515470857,2.1038439311,0.636741209454,2.25971354989 +0.0514183659733,0.51136386287,0.857824662383,1.73377190591,1.75034579825,0.470489915048,0.680144439317 +-0.822373234877,0.565050829279,0.0664817485344,2.03224949578,2.28649173867,2.51675450935,0.999053752186 +-0.992896858644,0.1158053464,0.0272937692653,2.61711883357,2.93815565757,3.03283071188,0.516942235815 +-0.356760457167,0.905670002561,-0.229093480187,2.68470046364,0.827861675474,2.89462282752,0.604459165877 +0.286500480335,0.321195248424,-0.902635633663,2.44140245592,0.594658828144,2.41632913614,2.68932709764 +-0.0887737197834,0.968322865386,0.233388206742,1.43946454552,0.849391967782,1.36059800288,0.546238350726 +0.777787125255,0.392088472336,0.491237027971,0.796575794843,0.465811479591,0.166148712989,0.672073578675 +-0.0416368892054,0.393185708618,-0.918515850705,2.61796784169,0.51635576385,3.01602526404,2.36586202697 +0.249847970422,0.956848256805,0.148382630808,2.54457415376,2.51126111374,0.489502751552,2.67139440668 diff --git a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/Quaternion.test.cpp b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/Quaternion.test.cpp index 3d6013ab..82cca599 100644 --- a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/Quaternion.test.cpp +++ b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/Quaternion.test.cpp @@ -1,5 +1,9 @@ /// Apache License 2.0 +#include +#include + +#include #include #include #include @@ -7,12 +11,22 @@ #include +using ostk::core::type::Real; +using ostk::core::type::String; +using ostk::core::filesystem::Path; +using ostk::core::filesystem::File; +using ostk::core::container::Table; + +using ostk::mathematics::object::Vector3d; +using ostk::mathematics::object::Vector4d; +using ostk::mathematics::geometry::Angle; +using ostk::mathematics::geometry::d3::transformation::rotation::EulerAngle; +using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; +using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix; +using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; + TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Constructor) { - using ostk::mathematics::object::Vector3d; - using ostk::mathematics::object::Vector4d; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_NO_THROW(Quaternion(0.0, 0.0, 0.0, 1.0, Quaternion::Format::XYZS)); @@ -40,8 +54,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, EqualToOperator) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_TRUE( Quaternion(1.0, 0.0, 0.0, 0.0, Quaternion::Format::XYZS) == @@ -119,8 +131,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, NotEqualToOperator) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_TRUE( Quaternion(1.0, 0.0, 0.0, 0.0, Quaternion::Format::XYZS) != @@ -198,8 +208,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, AdditionOperator) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ( Quaternion::XYZS(2.0, 4.0, 6.0, 8.0), @@ -215,8 +223,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, MultiplicationOperator_Quaternion) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Quaternion::Unit(), Quaternion::Unit() * Quaternion::Unit()); } @@ -229,9 +235,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, MultiplicationOperator_Vector3d) { - using ostk::mathematics::object::Vector3d; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Vector3d::X(), Quaternion::Unit() * Vector3d::X()); } @@ -244,10 +247,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, MultiplicationOperator_Real) { - using ostk::core::type::Real; - - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Quaternion::Unit(), Quaternion::Unit() * 1.0); EXPECT_EQ(Quaternion::Unit(), 1.0 * Quaternion::Unit()); @@ -265,8 +264,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, DivisionOperator) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -277,11 +274,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, PowerOperator) { - using ostk::core::type::Real; - - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Quaternion::Unit(), Quaternion::Unit() ^ 1.0); EXPECT_TRUE((Quaternion::XYZS(1.0, 0.0, 0.0, 0.0) ^ 2.0) @@ -298,8 +290,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // MultiplicationAssignmentOperator) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -311,8 +301,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, DivisionAssignmentOperator) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -323,8 +311,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, StreamOperator) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { testing::internal::CaptureStdout(); @@ -336,8 +322,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, IsDefined) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_TRUE(Quaternion::XYZS(1.0, 0.0, 0.0, 0.0).isDefined()); EXPECT_TRUE(Quaternion::XYZS(0.0, 1.0, 0.0, 0.0).isDefined()); @@ -356,8 +340,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, IsUnitary) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_TRUE(Quaternion::XYZS(1.0, 0.0, 0.0, 0.0).isUnitary()); EXPECT_TRUE(Quaternion::XYZS(0.0, 1.0, 0.0, 0.0).isUnitary()); @@ -376,9 +358,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, IsNear) { - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_TRUE(Quaternion::XYZS(1.0, 0.0, 0.0, 0.0).isNear(Quaternion::XYZS(1.0, 0.0, 0.0, 0.0), Angle::Zero())); EXPECT_TRUE(Quaternion::XYZS(0.0, 1.0, 0.0, 0.0).isNear(Quaternion::XYZS(0.0, 1.0, 0.0, 0.0), Angle::Zero())); @@ -421,8 +400,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, X) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(1.0, Quaternion::XYZS(1.0, 2.0, 3.0, 4.0).x()); } @@ -434,8 +411,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Y) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(2.0, Quaternion::XYZS(1.0, 2.0, 3.0, 4.0).y()); } @@ -447,8 +422,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Z) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(3.0, Quaternion::XYZS(1.0, 2.0, 3.0, 4.0).z()); } @@ -460,8 +433,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, S) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(4.0, Quaternion::XYZS(1.0, 2.0, 3.0, 4.0).s()); } @@ -473,9 +444,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, GetVectorPart) { - using ostk::mathematics::object::Vector3d; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Vector3d(1.0, 2.0, 3.0), Quaternion::XYZS(1.0, 2.0, 3.0, 4.0).getVectorPart()); } @@ -487,8 +455,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, GetScalarPart) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(4.0, Quaternion::XYZS(1.0, 2.0, 3.0, 4.0).getScalarPart()); } @@ -501,8 +467,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, ToNormalized) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -513,8 +477,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, ToConjugate) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Quaternion::XYZS(-1.0, -2.0, -3.0, +4.0), Quaternion::XYZS(+1.0, +2.0, +3.0, +4.0).toConjugate()); EXPECT_EQ(Quaternion::XYZS(+1.0, +2.0, +3.0, +4.0), Quaternion::XYZS(-1.0, -2.0, -3.0, +4.0).toConjugate()); @@ -531,8 +493,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, ToInverse) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -543,9 +503,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Exp) { - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Quaternion::Unit(), Quaternion::Unit().exp()); EXPECT_TRUE(Quaternion::XYZS(1.0, 0.0, 0.0, 0.0) @@ -561,9 +518,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Log) { - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Quaternion({0.0, 0.0, 0.0}, 0.0), Quaternion::Unit().log()); EXPECT_TRUE(Quaternion::XYZS(0.841471, 0.0, 0.0, 0.540302) @@ -579,11 +533,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Pow) { - using ostk::core::type::Real; - - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Quaternion::Unit(), Quaternion::Unit().pow(1.0)); EXPECT_TRUE(Quaternion::XYZS(1.0, 0.0, 0.0, 0.0) @@ -600,8 +549,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Norm) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -613,8 +560,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, CrossMultiply) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -626,8 +571,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, DotMultiply) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -639,8 +582,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, RotateVector) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -651,9 +592,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, ToVector) { - using ostk::mathematics::object::Vector4d; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ( Vector4d(0.0, 0.0, 0.0, 1.0), Quaternion::XYZS(0.0, 0.0, 0.0, 1.0).toVector(Quaternion::Format::XYZS) @@ -670,8 +608,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, ToString) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ("[0.0, 0.0, 0.0, 1.0]", Quaternion::XYZS(0.0, 0.0, 0.0, 1.0).toString(Quaternion::Format::XYZS)); EXPECT_EQ("[1.0, 0.0, 0.0, 0.0]", Quaternion::XYZS(0.0, 0.0, 0.0, 1.0).toString(Quaternion::Format::SXYZ)); @@ -701,8 +637,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Normalize) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -714,8 +648,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Conjugate) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -727,8 +659,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Inverse) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -740,8 +670,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion // TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Rectify) // { -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; - // { // FAIL() ; @@ -752,9 +680,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, AngularDifferenceWith) { - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_EQ(Angle::Zero(), Quaternion::Unit().angularDifferenceWith(Quaternion::Unit())); EXPECT_EQ( @@ -780,8 +705,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Undefined) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_NO_THROW(Quaternion::Undefined()); EXPECT_FALSE(Quaternion::Undefined().isDefined()); @@ -790,8 +713,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Unit) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_NO_THROW(Quaternion::Unit()); EXPECT_EQ(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0), Quaternion::Unit()); @@ -800,8 +721,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, XYZS) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_NO_THROW(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0)); EXPECT_EQ(Quaternion(0.0, 0.0, 0.0, 1.0, Quaternion::Format::XYZS), Quaternion::XYZS(0.0, 0.0, 0.0, 1.0)); @@ -810,12 +729,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, RotationVector) { - using ostk::core::type::Real; - - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_TRUE(Quaternion(0.0, 0.0, 0.0, 1.0, Quaternion::Format::XYZS) .isNear( @@ -836,14 +749,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, RotationMatrix) { - using ostk::core::type::Real; - - using ostk::mathematics::object::Vector3d; - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; - using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - { EXPECT_TRUE(Quaternion(0.0, 0.0, 0.0, 1.0, Quaternion::Format::XYZS) .isNear(Quaternion::RotationMatrix(RotationMatrix::Unit()), Angle::Radians(Real::Epsilon()))); @@ -886,10 +791,58 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion } } -TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Parse) +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, EulerAngle) { - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; + { + EXPECT_EQ(Quaternion::Unit(), Quaternion::EulerAngle(EulerAngle::Unit())); + } + { + const Table referenceDataTable = Table::Load( + File::Path(Path::Parse("/app/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/" + "EulerAngle/Quaternion-EulerAngle-ZYX.csv")), + Table::Format::CSV, + true + ); + + const Real tolerance = 1e-10; + + for (const auto& referenceDataRow : referenceDataTable) + { + const Quaternion referenceQuaternion = Quaternion::XYZS( + referenceDataRow[0].accessReal(), + referenceDataRow[1].accessReal(), + referenceDataRow[2].accessReal(), + referenceDataRow[3].accessReal() + ) + .normalize(); + + const EulerAngle referenceEulerAngle = EulerAngle::ZYX( + Angle::Radians(referenceDataRow[4].accessReal()), + Angle::Radians(referenceDataRow[5].accessReal()), + Angle::Radians(referenceDataRow[6].accessReal()) + ); + + const Quaternion quaternion = Quaternion::EulerAngle(referenceEulerAngle); + + EXPECT_NEAR(quaternion.x(), referenceQuaternion.x(), tolerance) + << String::Format("{} / {}", referenceQuaternion.x().toString(), quaternion.x().toString()); + EXPECT_NEAR(quaternion.y(), referenceQuaternion.y(), tolerance) + << String::Format("{} / {}", referenceQuaternion.y().toString(), quaternion.y().toString()); + EXPECT_NEAR(quaternion.z(), referenceQuaternion.z(), tolerance) + << String::Format("{} / {}", referenceQuaternion.z().toString(), quaternion.z().toString()); + EXPECT_NEAR(quaternion.s(), referenceQuaternion.s(), tolerance) + << String::Format("{} / {}", referenceQuaternion.s().toString(), quaternion.s().toString()); + } + } + + { + EXPECT_ANY_THROW(Quaternion::EulerAngle(EulerAngle::Undefined())); + } +} + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, Parse) +{ { EXPECT_NO_THROW(Quaternion::Parse("[0.0, 0.0, 0.0, 1.0]", Quaternion::Format::XYZS)); EXPECT_EQ( @@ -912,11 +865,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, ShortestRotation) { - using ostk::mathematics::object::Vector3d; - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; - { EXPECT_TRUE(Quaternion::ShortestRotation({1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}) .isNear(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0), Angle::Radians(1e-9))); @@ -944,12 +892,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, LERP) { - using ostk::core::type::Real; - - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; - { EXPECT_TRUE(Quaternion::LERP(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0), Quaternion::XYZS(0.0, 0.0, 1.0, 0.0), 0.0) .isNear(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0), Angle::Radians(1e-9))); @@ -969,12 +911,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, NLERP) { - using ostk::core::type::Real; - - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; - { EXPECT_TRUE(Quaternion::NLERP(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0), Quaternion::XYZS(0.0, 0.0, 1.0, 0.0), 0.0) .isNear(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0), Angle::Radians(1e-9))); @@ -1004,12 +940,6 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_Quaternion, SLERP) { - using ostk::core::type::Real; - - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; - using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; - { EXPECT_TRUE(Quaternion::SLERP(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0), Quaternion::XYZS(0.0, 0.0, 1.0, 0.0), 0.0) .isNear(Quaternion::XYZS(0.0, 0.0, 0.0, 1.0), Angle::Radians(1e-9))); diff --git a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/RotationMatrix.test.cpp b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/RotationMatrix.test.cpp index 6af6ad40..1ed154d1 100644 --- a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/RotationMatrix.test.cpp +++ b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/RotationMatrix.test.cpp @@ -1,5 +1,9 @@ /// Apache License 2.0 +#include +#include + +#include #include #include #include @@ -7,266 +11,390 @@ #include -TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Constructor) -{ - using ostk::mathematics::geometry::Angle; - using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix; - - // { - - // EXPECT_NO_THROW(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(45.0))) ; - - // RotationMatrix rotationMatrix = { { 0.0, 0.0, 1.0 }, Angle::Degrees(45.0) } ; - - // EXPECT_TRUE(rotationMatrix.isDefined()) ; +using ostk::core::type::Real; +using ostk::core::type::String; +using ostk::core::filesystem::Path; +using ostk::core::filesystem::File; +using ostk::core::container::Table; - // } +using ostk::mathematics::object::Vector3d; +using ostk::mathematics::object::Matrix3d; +using ostk::mathematics::geometry::Angle; +using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; +using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix; +using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; +using ostk::mathematics::geometry::d3::transformation::rotation::EulerAngle; - // { - - // } +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Constructor) +{ + { + const RotationMatrix rotationMatrix = {1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0}; - // { + EXPECT_TRUE(rotationMatrix.isDefined()); + } - // EXPECT_ANY_THROW(RotationMatrix({ 0.0, 0.0, 0.9 }, Angle::Degrees(45.0))) ; - // EXPECT_ANY_THROW(RotationMatrix({ 0.0, 0.0, 1.1 }, Angle::Degrees(45.0))) ; + { + const RotationMatrix rotationMatrix = {Matrix3d::Identity()}; - // } + EXPECT_TRUE(rotationMatrix.isDefined()); + } } -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, EqualToOperator) -// { - -// using ostk::mathematics::geometry::Angle ; -// using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix ; - -// { - -// EXPECT_TRUE(RotationMatrix({ 1.0, 0.0, 0.0 }, Angle::Degrees(0.0)) == RotationMatrix({ 1.0, 0.0, 0.0 }, -// Angle::Degrees(0.0))) ; EXPECT_TRUE(RotationMatrix({ 0.0, 1.0, 0.0 }, Angle::Degrees(10.0)) == -// RotationMatrix({ 0.0, 1.0, 0.0 }, Angle::Degrees(10.0))) ; EXPECT_TRUE(RotationMatrix({ 0.0, 0.0, 1.0 }, -// Angle::Degrees(20.0)) == RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(20.0))) ; - -// EXPECT_TRUE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(30.0)) == RotationMatrix({ 0.0, 0.0, +1.0 }, -// Angle::Degrees(+30.0))) ; EXPECT_TRUE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(30.0)) == -// RotationMatrix({ 0.0, 0.0, -1.0 }, Angle::Degrees(-30.0))) ; - -// EXPECT_TRUE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(0.0)) == RotationMatrix({ 0.0, 0.0, 1.0 }, -// Angle::Degrees(+360.0))) ; EXPECT_TRUE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(0.0)) == -// RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(-360.0))) ; - -// EXPECT_TRUE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(+180.0)) == RotationMatrix({ 0.0, 0.0, 1.0 }, -// Angle::Degrees(-180.0))) ; - -// } - -// { - -// EXPECT_FALSE(RotationMatrix({ 1.0, 0.0, 0.0 }, Angle::Degrees(0.0)) == RotationMatrix({ 1.0, 0.0, 0.0 }, -// Angle::Degrees(1.0))) ; - -// } - -// { - -// EXPECT_FALSE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(0.0)) == RotationMatrix::Undefined()) ; -// EXPECT_FALSE(RotationMatrix::Undefined() == RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(0.0))) ; -// EXPECT_FALSE(RotationMatrix::Undefined() == RotationMatrix::Undefined()) ; - -// } - -// } - -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, NotEqualToOperator) -// { - -// using ostk::mathematics::geometry::Angle ; -// using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix ; - -// { - -// EXPECT_TRUE(RotationMatrix({ 1.0, 0.0, 0.0 }, Angle::Degrees(0.0)) != RotationMatrix({ 1.0, 0.0, 0.0 }, -// Angle::Degrees(1.0))) ; - -// } - -// { - -// EXPECT_TRUE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(0.0)) != RotationMatrix::Undefined()) ; -// EXPECT_TRUE(RotationMatrix::Undefined() != RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(0.0))) ; -// EXPECT_TRUE(RotationMatrix::Undefined() != RotationMatrix::Undefined()) ; - -// } - -// { - -// EXPECT_FALSE(RotationMatrix({ 1.0, 0.0, 0.0 }, Angle::Degrees(0.0)) != RotationMatrix({ 1.0, 0.0, 0.0 }, -// Angle::Degrees(0.0))) ; EXPECT_FALSE(RotationMatrix({ 0.0, 1.0, 0.0 }, Angle::Degrees(10.0)) != -// RotationMatrix({ 0.0, 1.0, 0.0 }, Angle::Degrees(10.0))) ; EXPECT_FALSE(RotationMatrix({ 0.0, 0.0, 1.0 }, -// Angle::Degrees(20.0)) != RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(20.0))) ; - -// EXPECT_FALSE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(30.0)) != RotationMatrix({ 0.0, 0.0, +1.0 }, -// Angle::Degrees(+30.0))) ; EXPECT_FALSE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(30.0)) != -// RotationMatrix({ 0.0, 0.0, -1.0 }, Angle::Degrees(-30.0))) ; - -// EXPECT_FALSE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(0.0)) != RotationMatrix({ 0.0, 0.0, 1.0 }, -// Angle::Degrees(+360.0))) ; EXPECT_FALSE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(0.0)) != -// RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(-360.0))) ; - -// EXPECT_FALSE(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(+180.0)) != RotationMatrix({ 0.0, 0.0, 1.0 }, -// Angle::Degrees(-180.0))) ; - -// } - -// } - -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, StreamOperator) -// { - -// using ostk::mathematics::geometry::Angle ; -// using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix ; - -// { - -// testing::internal::CaptureStdout() ; - -// EXPECT_NO_THROW(std::cout << RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(10.0)) << std::endl) ; - -// EXPECT_FALSE(testing::internal::GetCapturedStdout().empty()) ; - -// } - -// } - -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, IsDefined) -// { - -// using ostk::mathematics::object::Vector3d ; -// using ostk::mathematics::geometry::Angle ; -// using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix ; - -// { - -// EXPECT_TRUE(RotationMatrix({ 1.0, 0.0, 0.0 }, Angle::Degrees(10.0)).isDefined()) ; - -// } - -// { - -// EXPECT_FALSE(RotationMatrix::Undefined().isDefined()) ; -// EXPECT_FALSE(RotationMatrix(Vector3d::Undefined(), Angle::Degrees(10.0)).isDefined()) ; -// EXPECT_FALSE(RotationMatrix({ 1.0, 0.0, 0.0 }, Angle::Undefined()).isDefined()) ; +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, IsDefined) +{ + EXPECT_TRUE(RotationMatrix::Unit().isDefined()); + EXPECT_FALSE(RotationMatrix::Undefined().isDefined()); +} -// } +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, EqualToOperator) +{ + // TBI +} -// } +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, NotEqualToOperator) +{ + // TBI +} -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, GetAxis) -// { +TEST( + OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, + MultiplicationOperator_RotationMatrix +) +{ + // TBI +} -// using ostk::mathematics::object::Vector3d ; -// using ostk::mathematics::geometry::Angle ; -// using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix ; +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, MultiplicationOperator_Vector3d) +{ + // TBI +} -// { +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, IndexFunctionOperator) +{ + // TBI +} -// EXPECT_EQ(Vector3d(1.0, 0.0, 0.0), RotationMatrix({ 1.0, 0.0, 0.0 }, Angle::Degrees(10.0)).getAxis()) ; -// EXPECT_EQ(Vector3d(0.0, 1.0, 0.0), RotationMatrix({ 0.0, 1.0, 0.0 }, Angle::Degrees(20.0)).getAxis()) ; -// EXPECT_EQ(Vector3d(0.0, 0.0, 1.0), RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(30.0)).getAxis()) ; +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, AccessMatrix) +{ + { + const RotationMatrix rotationMatrix = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0}; + + const Matrix3d& matrix = rotationMatrix.accessMatrix(); + + EXPECT_EQ(1.0, matrix(0, 0)); + EXPECT_EQ(0.0, matrix(0, 1)); + EXPECT_EQ(0.0, matrix(0, 2)); + EXPECT_EQ(0.0, matrix(1, 0)); + EXPECT_EQ(0.0, matrix(1, 1)); + EXPECT_EQ(1.0, matrix(1, 2)); + EXPECT_EQ(0.0, matrix(2, 0)); + EXPECT_EQ(-1.0, matrix(2, 1)); + EXPECT_EQ(0.0, matrix(2, 2)); + } + + { + EXPECT_ANY_THROW(RotationMatrix::Undefined().accessMatrix()); + } +} -// } +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, GetRowAt) +{ + { + EXPECT_EQ(Vector3d(1.0, 0.0, 0.0), RotationMatrix::Unit().getRowAt(0)); + EXPECT_EQ(Vector3d(0.0, 1.0, 0.0), RotationMatrix::Unit().getRowAt(1)); + EXPECT_EQ(Vector3d(0.0, 0.0, 1.0), RotationMatrix::Unit().getRowAt(2)); + } + + { + EXPECT_ANY_THROW(RotationMatrix::Undefined().getRowAt(0)); + EXPECT_ANY_THROW(RotationMatrix::Undefined().getRowAt(1)); + EXPECT_ANY_THROW(RotationMatrix::Undefined().getRowAt(2)); + } +} -// { +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, GetColumnAt) +{ + { + EXPECT_EQ(Vector3d(1.0, 0.0, 0.0), RotationMatrix::Unit().getColumnAt(0)); + EXPECT_EQ(Vector3d(0.0, 1.0, 0.0), RotationMatrix::Unit().getColumnAt(1)); + EXPECT_EQ(Vector3d(0.0, 0.0, 1.0), RotationMatrix::Unit().getColumnAt(2)); + } + + { + EXPECT_ANY_THROW(RotationMatrix::Undefined().getColumnAt(0)); + EXPECT_ANY_THROW(RotationMatrix::Undefined().getColumnAt(1)); + EXPECT_ANY_THROW(RotationMatrix::Undefined().getColumnAt(2)); + } +} -// EXPECT_ANY_THROW(RotationMatrix::Undefined().getAxis()) ; +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, GetMatrix) +{ + { + const RotationMatrix rotationMatrix = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0}; + + const Matrix3d matrix = rotationMatrix.getMatrix(); + + EXPECT_EQ(1.0, matrix(0, 0)); + EXPECT_EQ(0.0, matrix(0, 1)); + EXPECT_EQ(0.0, matrix(0, 2)); + EXPECT_EQ(0.0, matrix(1, 0)); + EXPECT_EQ(0.0, matrix(1, 1)); + EXPECT_EQ(1.0, matrix(1, 2)); + EXPECT_EQ(0.0, matrix(2, 0)); + EXPECT_EQ(-1.0, matrix(2, 1)); + EXPECT_EQ(0.0, matrix(2, 2)); + } + + { + EXPECT_ANY_THROW(RotationMatrix::Undefined().getMatrix()); + } +} -// } +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, ToTransposed) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::Unit().toTransposed()); + } -// } + { + RotationMatrix rotationMatrix = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0}; -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, GetAngle) -// { + const RotationMatrix transposedRotationMatrix = rotationMatrix.toTransposed(); -// using ostk::mathematics::geometry::Angle ; -// using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix ; + const RotationMatrix referenceRotationMatrix = {1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0}; -// { + EXPECT_EQ(referenceRotationMatrix, transposedRotationMatrix); + } -// EXPECT_EQ(Angle::Degrees(0.0), RotationMatrix({ 1.0, 0.0, 0.0 }, Angle::Degrees(0.0)).getAngle()) ; + { + EXPECT_ANY_THROW(RotationMatrix::Undefined().toTransposed()); + } +} -// EXPECT_EQ(Angle::Degrees(-30.0), RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(-30.0)).getAngle()) ; -// EXPECT_EQ(Angle::Degrees(+30.0), RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(+30.0)).getAngle()) ; +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Transpose) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::Unit().transpose()); + } -// EXPECT_EQ(Angle::Degrees(-90.0), RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(-90.0)).getAngle()) ; -// EXPECT_EQ(Angle::Degrees(+90.0), RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(+90.0)).getAngle()) ; + { + RotationMatrix rotationMatrix = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0}; -// EXPECT_EQ(Angle::Degrees(-180.0), RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(-180.0)).getAngle()) ; -// EXPECT_EQ(Angle::Degrees(+180.0), RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(+180.0)).getAngle()) ; + rotationMatrix.transpose(); -// } + const RotationMatrix referenceRotationMatrix = {1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0}; -// { + EXPECT_EQ(referenceRotationMatrix, rotationMatrix); + } -// EXPECT_ANY_THROW(RotationMatrix::Undefined().getAngle()) ; + { + EXPECT_ANY_THROW(RotationMatrix::Undefined().transpose()); + } +} -// } +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Undefined) +{ + EXPECT_NO_THROW(RotationMatrix::Undefined()); +} -// } +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Unit) +{ + EXPECT_NO_THROW(RotationMatrix::Unit()); +} -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Undefined) -// { +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, RX) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::RX(Angle::Degrees(0.0))); + } -// using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix ; + { + const RotationMatrix rotationMatrix = RotationMatrix::RX(Angle::Degrees(90.0)); -// { + EXPECT_TRUE(rotationMatrix.getRowAt(0).isApprox(Vector3d(1.0, 0.0, 0.0), 1e-16)); + EXPECT_TRUE(rotationMatrix.getRowAt(1).isApprox(Vector3d(0.0, 0.0, 1.0), 1e-16)); + EXPECT_TRUE(rotationMatrix.getRowAt(2).isApprox(Vector3d(0.0, -1.0, 0.0), 1e-16)); + } -// EXPECT_NO_THROW(RotationMatrix::Undefined()) ; -// EXPECT_FALSE(RotationMatrix::Undefined().isDefined()) ; + { + EXPECT_ANY_THROW(RotationMatrix::RX(Angle::Undefined())); + } +} -// } +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, RY) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::RY(Angle::Degrees(0.0))); + } -// } + { + const RotationMatrix rotationMatrix = RotationMatrix::RY(Angle::Degrees(90.0)); -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Unit) -// { + EXPECT_TRUE(rotationMatrix.getRowAt(0).isApprox(Vector3d(0.0, 0.0, -1.0), 1e-16)); + EXPECT_TRUE(rotationMatrix.getRowAt(1).isApprox(Vector3d(0.0, 1.0, 0.0), 1e-16)); + EXPECT_TRUE(rotationMatrix.getRowAt(2).isApprox(Vector3d(1.0, 0.0, 0.0), 1e-16)); + } -// using ostk::mathematics::geometry::Angle ; -// using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix ; + { + EXPECT_ANY_THROW(RotationMatrix::RY(Angle::Undefined())); + } +} -// { +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, RZ) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::RZ(Angle::Degrees(0.0))); + } -// EXPECT_NO_THROW(RotationMatrix::Unit()) ; -// EXPECT_EQ(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Zero()), RotationMatrix::Unit()) ; + { + const RotationMatrix rotationMatrix = RotationMatrix::RZ(Angle::Degrees(90.0)); -// } + EXPECT_TRUE(rotationMatrix.getRowAt(0).isApprox(Vector3d(0.0, 1.0, 0.0), 1e-16)); + EXPECT_TRUE(rotationMatrix.getRowAt(1).isApprox(Vector3d(-1.0, 0.0, 0.0), 1e-16)); + EXPECT_TRUE(rotationMatrix.getRowAt(2).isApprox(Vector3d(0.0, 0.0, 1.0), 1e-16)); + } -// } + { + EXPECT_ANY_THROW(RotationMatrix::RZ(Angle::Undefined())); + } +} -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, RX) -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, RY) -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, RZ) +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Rows) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::Rows({1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0})); + } -// TEST (OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Quaternion) -// { + { + const RotationMatrix rotationMatrix = RotationMatrix::Rows({0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0}, {0.0, 0.0, 1.0}); -// using ostk::core::type::Real ; -// using ostk::mathematics::geometry::Angle ; -// using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion ; -// using ostk::mathematics::geometry::d3::transformation::rotation::RotationMatrix ; + EXPECT_EQ(Vector3d(0.0, 1.0, 0.0), rotationMatrix.getRowAt(0)); + EXPECT_EQ(Vector3d(-1.0, 0.0, 0.0), rotationMatrix.getRowAt(1)); + EXPECT_EQ(Vector3d(0.0, 0.0, 1.0), rotationMatrix.getRowAt(2)); + } +} -// { +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Columns) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::Columns({1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0})); + } + + { + const RotationMatrix rotationMatrix = + RotationMatrix::Columns({0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0}, {0.0, 0.0, 1.0}); + + EXPECT_EQ(Vector3d(0.0, 1.0, 0.0), rotationMatrix.getColumnAt(0)); + EXPECT_EQ(Vector3d(-1.0, 0.0, 0.0), rotationMatrix.getColumnAt(1)); + EXPECT_EQ(Vector3d(0.0, 0.0, 1.0), rotationMatrix.getColumnAt(2)); + } +} -// EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::Quaternion(Quaternion::Unit())) ; +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, Quaternion) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::Quaternion(Quaternion::Unit())); + } -// EXPECT_EQ(RotationMatrix({ 0.0, 0.0, 1.0 }, Angle::Degrees(180.0)), -// RotationMatrix::Quaternion(Quaternion::XYZS(0.0, 0.0, 1.0, 0.0))) ; + { + // TBI + } -// } + { + EXPECT_ANY_THROW(RotationMatrix::Quaternion(Quaternion::Undefined())); + } +} -// { +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, RotationVector) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::RotationVector(RotationVector::Unit())); + } -// EXPECT_ANY_THROW(RotationMatrix::Quaternion(Quaternion::Undefined())) ; + { + // TBI + } -// } + { + EXPECT_ANY_THROW(RotationMatrix::RotationVector(RotationVector::Undefined())); + } +} -// } +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationMatrix, EulerAngle) +{ + { + EXPECT_EQ(RotationMatrix::Unit(), RotationMatrix::EulerAngle(EulerAngle::Unit())); + } + + // XYZ + + { + // TBI + } + + // ZXY + + { + // TBI + } + + // ZYX + + { + const Table referenceDataTable = Table::Load( + File::Path(Path::Parse("/app/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/" + "EulerAngle/RotationMatrix-EulerAngle-ZYX.csv")), + Table::Format::CSV, + true + ); + + const Real tolerance = 1e-10; + + for (const auto& referenceDataRow : referenceDataTable) + { + const Vector3d x = + Vector3d( + referenceDataRow[0].accessReal(), referenceDataRow[1].accessReal(), referenceDataRow[2].accessReal() + ) + .normalized(); + + Vector3d y = + Vector3d( + referenceDataRow[3].accessReal(), referenceDataRow[4].accessReal(), referenceDataRow[5].accessReal() + ) + .normalized(); + + const Vector3d z = x.cross(y); + + // Ensure that the y-axis is orthogonal to the x-axis + y = z.cross(x); + + const RotationMatrix referenceRotationMatrix = RotationMatrix::Rows(x, y, z); + + const EulerAngle eulerAngle = EulerAngle::ZYX( + Angle::Radians(referenceDataRow[9].accessReal()), + Angle::Radians(referenceDataRow[10].accessReal()), + Angle::Radians(referenceDataRow[11].accessReal()) + ); + + const RotationMatrix rotationMatrix = RotationMatrix::EulerAngle(eulerAngle); + + EXPECT_TRUE(rotationMatrix.getRowAt(0).isApprox(referenceRotationMatrix.getRowAt(0), tolerance)) + << String::Format( + "{} / {}", rotationMatrix.getRowAt(0).toString(), referenceRotationMatrix.getRowAt(0).toString() + ); + EXPECT_TRUE(rotationMatrix.getRowAt(1).isApprox(referenceRotationMatrix.getRowAt(1), tolerance)) + << String::Format( + "{} / {}", rotationMatrix.getRowAt(1).toString(), referenceRotationMatrix.getRowAt(1).toString() + ); + EXPECT_TRUE(rotationMatrix.getRowAt(2).isApprox(referenceRotationMatrix.getRowAt(2), tolerance)) + << String::Format( + "{} / {}", rotationMatrix.getRowAt(2).toString(), referenceRotationMatrix.getRowAt(2).toString() + ); + } + } + + { + EXPECT_ANY_THROW(RotationMatrix::EulerAngle(EulerAngle::Undefined())); + } +} diff --git a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/RotationVector.test.cpp b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/RotationVector.test.cpp index f4be1ef2..077dbffc 100644 --- a/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/RotationVector.test.cpp +++ b/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/RotationVector.test.cpp @@ -1,16 +1,26 @@ /// Apache License 2.0 +#include +#include + +#include #include #include #include #include +using ostk::core::type::Real; +using ostk::core::type::String; +using ostk::core::filesystem::Path; +using ostk::core::filesystem::File; +using ostk::core::container::Table; + +using ostk::mathematics::object::Vector3d; using ostk::mathematics::geometry::Angle; using ostk::mathematics::geometry::d3::transformation::rotation::Quaternion; using ostk::mathematics::geometry::d3::transformation::rotation::RotationVector; -using ostk::mathematics::object::Vector3d; -using ostk::core::type::Real; +using ostk::mathematics::geometry::d3::transformation::rotation::EulerAngle; TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationVector, Constructor) { @@ -496,3 +506,68 @@ TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationVe EXPECT_ANY_THROW(RotationVector::Quaternion(Quaternion::Undefined())); } } + +TEST(OpenSpaceToolkit_Mathematics_Geometry_3D_Transformation_Rotation_RotationVector, EulerAngle) +{ + { + EXPECT_EQ(RotationVector::Unit(), RotationVector::EulerAngle(EulerAngle::Unit())); + } + + // XYZ + + { + // TBI + } + + // ZXY + + { + // TBI + } + + // ZYX + + { + const Table referenceDataTable = Table::Load( + File::Path(Path::Parse("/app/test/OpenSpaceToolkit/Mathematics/Geometry/3D/Transformations/Rotations/" + "EulerAngle/RotationVector-EulerAngle-ZYX.csv")), + Table::Format::CSV, + true + ); + + const Real tolerance = 1e-9; + const Angle angularTolerance = Angle::Degrees(1e-9); + + for (const auto& referenceDataRow : referenceDataTable) + { + const RotationVector referenceRotationVector = RotationVector( + Vector3d( + referenceDataRow[0].accessReal(), referenceDataRow[1].accessReal(), referenceDataRow[2].accessReal() + ) + .normalized(), + Angle::Radians(referenceDataRow[3].accessReal()) + ); + + const EulerAngle eulerAngle = EulerAngle::ZYX( + Angle::Radians(referenceDataRow[4].accessReal()), + Angle::Radians(referenceDataRow[5].accessReal()), + Angle::Radians(referenceDataRow[6].accessReal()) + ); + + const RotationVector rotationVector = RotationVector::EulerAngle(eulerAngle); + + EXPECT_TRUE(rotationVector.getAxis().isApprox(referenceRotationVector.getAxis(), tolerance)) + << String::Format( + "{} / {}", referenceRotationVector.getAxis().toString(), rotationVector.getAxis().toString() + ); + EXPECT_TRUE(rotationVector.getAngle().isNear(referenceRotationVector.getAngle(), angularTolerance)) + << String::Format( + "{} / {}", referenceRotationVector.getAngle().toString(), rotationVector.getAngle().toString() + ); + } + } + + { + EXPECT_ANY_THROW(RotationVector::EulerAngle(EulerAngle::Undefined())); + } +} diff --git a/test/OpenSpaceToolkit/Mathematics/Object/Interval.test.cpp b/test/OpenSpaceToolkit/Mathematics/Object/Interval.test.cpp index e74fd504..a01b2ffe 100644 --- a/test/OpenSpaceToolkit/Mathematics/Object/Interval.test.cpp +++ b/test/OpenSpaceToolkit/Mathematics/Object/Interval.test.cpp @@ -1225,11 +1225,9 @@ TEST(OpenSpaceToolkit_Mathematics_Object_Interval, SetUpperBound) TEST(OpenSpaceToolkit_Mathematics_Object_Interval, Undefined) { - using ostk::core::type::Real; using ostk::mathematics::object::Interval; - { EXPECT_NO_THROW(Interval::Undefined()); @@ -1239,11 +1237,9 @@ TEST(OpenSpaceToolkit_Mathematics_Object_Interval, Undefined) TEST(OpenSpaceToolkit_Mathematics_Object_Interval, Closed) { - using ostk::core::type::Real; using ostk::mathematics::object::Interval; - { EXPECT_NO_THROW(Interval::Closed(0.0, 1.0)); @@ -1255,11 +1251,9 @@ TEST(OpenSpaceToolkit_Mathematics_Object_Interval, Closed) TEST(OpenSpaceToolkit_Mathematics_Object_Interval, Open) { - using ostk::core::type::Real; using ostk::mathematics::object::Interval; - { EXPECT_NO_THROW(Interval::Open(0.0, 1.0)); @@ -1271,11 +1265,9 @@ TEST(OpenSpaceToolkit_Mathematics_Object_Interval, Open) TEST(OpenSpaceToolkit_Mathematics_Object_Interval, HalfOpenLeft) { - using ostk::core::type::Real; using ostk::mathematics::object::Interval; - { EXPECT_NO_THROW(Interval::HalfOpenLeft(0.0, 1.0)); @@ -1287,11 +1279,9 @@ TEST(OpenSpaceToolkit_Mathematics_Object_Interval, HalfOpenLeft) TEST(OpenSpaceToolkit_Mathematics_Object_Interval, HalfOpenRight) { - using ostk::core::type::Real; using ostk::mathematics::object::Interval; - { EXPECT_NO_THROW(Interval::HalfOpenRight(0.0, 1.0));