39 std::cout << __func__ << std::endl;
41 CHECK_IF_EQUAL( DualQuaternionf::make_rotation( Quaternionf::make_rotation(0.0_deg_f, 0.0f, 1.0f, 0.0f) ).dual(), Quaternionf::zero() );
42 CHECK_IF_EQUAL( DualQuaternionf::make_rotation( Quaternionf::make_rotation(45.0_deg_f, 0.0f, 0.0f, 1.0f) ).dual(), Quaternionf::zero() );
43 CHECK_IF_EQUAL( DualQuaternionf::make_rotation( Quaternionf::make_rotation(90.0_deg_f, 1.0f, 0.0f, 0.0f) ).dual(), Quaternionf::zero() );
47 CHECK_IF_EQUAL( DualQuaternionf::make_rotation( Quaternionf::make_rotation(0.0_deg_f, 0.0f, 1.0f, 0.0f) ).translation(), Vector3Df::zero() );
48 CHECK_IF_EQUAL( DualQuaternionf::make_rotation( Quaternionf::make_rotation(45.0_deg_f, 0.0f, 0.0f, 1.0f) ).translation(), Vector3Df::zero() );
49 CHECK_IF_EQUAL( DualQuaternionf::make_rotation( Quaternionf::make_rotation(90.0_deg_f, 1.0f, 0.0f, 0.0f) ).translation(), Vector3Df::zero() );
62 std::cout << __func__ << std::endl;
64 DualQuaternionf a{ Quaternionf::make_rotation(45.0_deg_f, 0.0f, 0.0f, 1.0f), {-43.1113f, -6.0f, 0.0f} };
67 DualQuaternionf normalized_a = a.normalized();
71 assert( !a.is_unit() );
76 std::cout << __func__ << std::endl;
78 DualQuaternionf a{ Quaternionf::make_rotation( 45.0_deg_f, 1.0f, 0.0f, 0.0f ),
81 DualQuaternionf a_times_conjugate{ a * a.conjugate() };
82 Dualf mag_a = a.magnitude();
83 Dualf mag_a_times_conjugate = a_times_conjugate.magnitude();
90 std::cout << __func__ << std::endl;
92 Quaternionf q_rotation{ Quaternionf::make_rotation( 45.0_deg_f, 1.0f, 0.0f, 0.0f ) };
93 DualQuaternionf a{ DualQuaternionf::make_coordinate_system( q_rotation, 10.0f, 10.0f, 10.0f ) };
94 Quaternionf conjugate_real{ a.real().conjugate() * a.dual()};
95 Quaternionf conjugate_dual{ a.dual().conjugate() * a.real()};
96 Quaternionf sum = conjugate_real + conjugate_dual;
100 assert( a.is_unit() );
106 Quaternionf q_rotation{ Quaternionf::make_rotation( 45.0_deg_f, 1.0f, 0.0f, 0.0f ) };
107 Vector3Df translation{ 10.0f, 0.0f, 0.0f };
108 DualQuaternionf pure_rotation{ DualQuaternionf::make_rotation( q_rotation ) };
109 DualQuaternionf pure_translation{ DualQuaternionf::make_translation( translation ) };
110 DualQuaternionf combination = pure_translation * pure_rotation;
118 float half_angle = degrees_of_rotation / 2.0f;
119 DualQuaternionf rotation = DualQuaternionf::make_rotation( Quaternionf::make_rotation( Degreef(degrees_of_rotation), Vector3Df::unit_x() ) );
128 assert( rotation.dual().isZero() );
133 float half_angle = degrees_of_rotation / 2.0f;
134 DualQuaternionf rotation = DualQuaternionf::make_rotation( Quaternionf::make_rotation( Degreef(degrees_of_rotation), Vector3Df::unit_y() ) );
143 assert( rotation.dual().isZero() );
148 float half_angle = degrees_of_rotation / 2.0f;
149 DualQuaternionf rotation = DualQuaternionf::make_rotation( Quaternionf::make_rotation( Degreef(degrees_of_rotation), Vector3Df::unit_z() ) );
158 assert( rotation.dual().isZero() );
163 std::cout << __func__ << std::endl;
165 DualQuaternionf origin;
175 assert( origin.dual().isZero() );
180 std::cout << __func__ << std::endl;
183 DualQuaternionf no_rotation = DualQuaternionf::make_rotation( Quaternionf::make_rotation(0.0_deg_f, Vector3Df::unit_x()) );
193 assert( no_rotation.dual().isZero() );
196 no_rotation = DualQuaternionf::make_rotation( Quaternionf::make_rotation(0.0_deg_f, Vector3Df::unit_y()) );
206 assert( no_rotation.dual().isZero() );
209 no_rotation = DualQuaternionf::make_rotation( Quaternionf::make_rotation(0.0_deg_f, Vector3Df::unit_z()) );
219 assert( no_rotation.dual().isZero() );
224 std::cout << __func__ << std::endl;
226 Vector3Df x_translation{ 5.0f, 0.0f, 0.0f };
227 DualQuaternionf origin;
228 Quaternionf encoded_translation = 0.5f * Quaternionf{0.0f, x_translation.x, x_translation.y, x_translation.z} * Quaternionf::identity();
230 DualQuaternionf result = origin * DualQuaternionf::make_translation(x_translation);
231 Vector3Df output_translation = result.translation();
234 assert( result.real().isUnit() );
251 std::cout << __func__ << std::endl;
253 Vector3Df y_translation{ 0.0f, 17.2f, 0.0f };
254 DualQuaternionf origin;
255 Quaternionf encoded_translation = 0.5f * Quaternionf{0.0f, y_translation.x, y_translation.y, y_translation.z} * Quaternionf::identity();
257 DualQuaternionf result = origin * DualQuaternionf::make_translation(y_translation);
258 Vector3Df output_translation = result.translation();
261 assert( result.real().isUnit() );
278 std::cout << __func__ << std::endl;
280 Vector3Df z_translation{ 0.0f, 0.0f, -32.0f };
281 DualQuaternionf origin;
282 Quaternionf encoded_translation = 0.5f * Quaternionf{0.0f, z_translation.x, z_translation.y, z_translation.z} * Quaternionf::identity();
284 DualQuaternionf result = origin * DualQuaternionf::make_translation(z_translation);
285 Vector3Df output_translation = result.translation();
288 assert( result.real().isUnit());
305 std::cout << __func__ << std::endl;
307 float input_rotations[] = { 90.0f, 60.0f, 45.0f, 30.0f, -90.0f, -60.0f, -45.0f, -30.0f };
310 for (
float degrees : input_rotations)
314 for (
float degrees : input_rotations)
318 for (
float degrees : input_rotations)