2 * Copyright ( c ) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 ( the "License" );
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <dali/public-api/dali-core.h>
23 #include <dali-test-suite-utils.h>
28 void utc_dali_quaternion_startup(void)
30 test_return_value = TET_UNDEF;
33 void utc_dali_quaternion_cleanup(void)
35 test_return_value = TET_PASS;
39 int UtcDaliQuaternionCtorDefaultP(void)
42 DALI_TEST_EQUALS( q.AsVector().w, 1.0f, TEST_LOCATION );
43 DALI_TEST_EQUALS( q.AsVector().x, 0.0f, TEST_LOCATION );
44 DALI_TEST_EQUALS( q.AsVector().y, 0.0f, TEST_LOCATION );
45 DALI_TEST_EQUALS( q.AsVector().z, 0.0f, TEST_LOCATION );
49 int UtcDaliQuaternionCtorCosSinThetaP(void)
51 Quaternion q( 1.0f, 0.1f, 0.2f, 0.3f );
53 DALI_TEST_EQUALS( q.AsVector().w, 1.0f, TEST_LOCATION );
54 DALI_TEST_EQUALS( q.AsVector().x, 0.1f, TEST_LOCATION );
55 DALI_TEST_EQUALS( q.AsVector().y, 0.2f, TEST_LOCATION );
56 DALI_TEST_EQUALS( q.AsVector().z, 0.3f, TEST_LOCATION );
60 int UtcDaliQuaternionCtorVector4P(void)
62 Quaternion q( Vector4( 1.0f, 0.1f, 0.2f, 0.3f ) );
64 DALI_TEST_EQUALS( q.AsVector().x, 1.0f, TEST_LOCATION );
65 DALI_TEST_EQUALS( q.AsVector().y, 0.1f, TEST_LOCATION );
66 DALI_TEST_EQUALS( q.AsVector().z, 0.2f, TEST_LOCATION );
67 DALI_TEST_EQUALS( q.AsVector().w, 0.3f, TEST_LOCATION );
71 int UtcDaliQuaternionCtorAxisAngleVector3P(void)
73 Quaternion q( Dali::ANGLE_90, Vector3( 1.0f, 2.0f, 3.0f ) );
75 // This will be normalised:
76 DALI_TEST_EQUALS( q.AsVector().w, 0.707f, 0.001, TEST_LOCATION );
77 DALI_TEST_EQUALS( q.AsVector().x, 0.189f, 0.001, TEST_LOCATION );
78 DALI_TEST_EQUALS( q.AsVector().y, 0.378f, 0.001, TEST_LOCATION );
79 DALI_TEST_EQUALS( q.AsVector().z, 0.567f, 0.001, TEST_LOCATION );
83 int UtcDaliQuaternionCtorEulerAngleP(void)
85 Quaternion q1(0.924f, 0.383f, 0.0f, 0.0f);
86 Vector4 r1(Radian(Degree(45)), 0.0f, 0.0f, 0.0f);
88 Quaternion q2(0.793f, 0.0f, 0.609f, 0.0f);
89 Vector4 r2(0.0f, Radian(Degree(75)), 0.0f, 0.0f);
91 Quaternion q3(0.383f, 0.0f, 0.0f, 0.924f);
92 Vector4 r3(0.0f, 0.0f, Radian(Degree(135)), 0.0f);
94 Quaternion q4(0.795f, 0.478f, 0.374f, 0.006f);
95 Vector4 r4(Radian(Degree(71)), Radian(Degree(36)), Radian(Degree(27)), 0.0f);
97 Quaternion q5( -0.149f, -0.697f, 0.145f, -0.686f);
98 Vector4 r5(Radian(Degree(148.0)), Radian(Degree(-88.2)), Radian(Degree(8.0)), 0.0f);
100 DALI_TEST_EQUALS(q1.EulerAngles(), r1, 0.001, TEST_LOCATION);
101 DALI_TEST_EQUALS(q2.EulerAngles(), r2, 0.001, TEST_LOCATION);
102 DALI_TEST_EQUALS(q3.EulerAngles(), r3, 0.001, TEST_LOCATION);
103 DALI_TEST_EQUALS(q4.EulerAngles(), r4, 0.01, TEST_LOCATION);
104 DALI_TEST_EQUALS(q5.EulerAngles(), r5, 0.01, TEST_LOCATION);
108 int UtcDaliQuaternionCtorMatrixP01(void)
110 // angle: 60 deg, axis: [1,2,3]
111 float Mref_raw[16] = { 0.535714f, 0.765794f, -0.355767f, 0.0f,
112 -0.622936f, 0.642857f, 0.445741f, 0.0f,
113 0.570053f, -0.0171693f, 0.821429f, 0.0f,
114 0.0f, 0.0f, 0.0f, 1.0f};
115 Matrix Mref( Mref_raw );
117 Quaternion q1( Radian(M_PI/3.0f), Vector3( 1.0f, 2.0f, 3.0f ) );
118 Quaternion q2( Mref );
120 DALI_TEST_EQUALS( q1, q2, 0.001, TEST_LOCATION );
124 int UtcDaliQuaternionCtorMatrixP02(void)
129 Matrix m( q ); // Convert to matrix
131 Quaternion q2( m ); // and back to a quaternion
133 DALI_TEST_EQUALS( q, q2, 0.001, TEST_LOCATION );
134 DALI_TEST_EQUALS( m, Matrix::IDENTITY, 0.001f, TEST_LOCATION );
138 int UtcDaliQuaternionCtorMatrixP03(void)
140 // Create an arbitrary forward vector
141 for( float x=-1.0f; x<=1.0f; x+=0.1f )
143 for( float y=-1.0f; y<1.0f; y+=0.1f )
145 for( float z=-1.0f; z<1.0f; z+=0.1f )
147 Vector3 vForward( x, y, z );
148 vForward.Normalize();
150 // Construct an up vector from a sideways move
152 Vector3 vUp = vForward.Cross( Vector3( vForward.x+1.0f, vForward.y, vForward.z ) );
153 if( vUp.Length() > 0.01 )
156 vSide = vUp.Cross( vForward );
161 vSide = vForward.Cross( Vector3( vForward.x, vForward.y+1.0f, vForward.z ) );
163 vUp = vForward.Cross( vSide );
167 // Generate a matrix, and then a quaternion from it
168 Matrix rotMatrix( Matrix::IDENTITY );
169 rotMatrix.SetXAxis( vSide );
170 rotMatrix.SetYAxis( vUp );
171 rotMatrix.SetZAxis( vForward );
172 Quaternion q( rotMatrix );
174 // Generate a matrix from the quaternion, check they are the same
175 Matrix resultMatrix( q );
176 DALI_TEST_EQUALS( resultMatrix, rotMatrix, 0.001f, TEST_LOCATION );
178 // Rotate an arbitrary vector by both quaternion and rotation matrix,
179 // check the result is the same
181 Vector4 aVector( -2.983f, -3.213f, 8.2239f, 1.0f );
182 Vector3 aVectorRotatedByQ = q.Rotate( Vector3( aVector ) );
183 Vector4 aVectorRotatedByR = rotMatrix*aVector;
184 DALI_TEST_EQUALS( aVectorRotatedByQ, Vector3( aVectorRotatedByR ), 0.001f, TEST_LOCATION );
191 int UtcDaliQuaternionCopyConstructor(void)
193 Quaternion q0( 1.0f, 0.1f, 0.2f, 0.3f );
195 DALI_TEST_EQUALS( q1.AsVector().w, 1.0f, TEST_LOCATION );
196 DALI_TEST_EQUALS( q1.AsVector().x, 0.1f, TEST_LOCATION );
197 DALI_TEST_EQUALS( q1.AsVector().y, 0.2f, TEST_LOCATION );
198 DALI_TEST_EQUALS( q1.AsVector().z, 0.3f, TEST_LOCATION );
203 int UtcDaliQuaternionMoveConstructor(void)
205 Quaternion q0( 1.0f, 0.1f, 0.2f, 0.3f );
206 Quaternion q1 = std::move( q0 );
207 DALI_TEST_EQUALS( q1.AsVector().w, 1.0f, TEST_LOCATION );
208 DALI_TEST_EQUALS( q1.AsVector().x, 0.1f, TEST_LOCATION );
209 DALI_TEST_EQUALS( q1.AsVector().y, 0.2f, TEST_LOCATION );
210 DALI_TEST_EQUALS( q1.AsVector().z, 0.3f, TEST_LOCATION );
215 int UtcDaliQuaternionCopyAssignment(void)
217 Quaternion q0( 1.0f, 0.1f, 0.2f, 0.3f );
220 DALI_TEST_EQUALS( q1.AsVector().w, 1.0f, TEST_LOCATION );
221 DALI_TEST_EQUALS( q1.AsVector().x, 0.1f, TEST_LOCATION );
222 DALI_TEST_EQUALS( q1.AsVector().y, 0.2f, TEST_LOCATION );
223 DALI_TEST_EQUALS( q1.AsVector().z, 0.3f, TEST_LOCATION );
228 int UtcDaliQuaternionMoveAssignment(void)
230 Quaternion q0( 1.0f, 0.1f, 0.2f, 0.3f );
232 q1 = std::move( q0 );
233 DALI_TEST_EQUALS( q1.AsVector().w, 1.0f, TEST_LOCATION );
234 DALI_TEST_EQUALS( q1.AsVector().x, 0.1f, TEST_LOCATION );
235 DALI_TEST_EQUALS( q1.AsVector().y, 0.2f, TEST_LOCATION );
236 DALI_TEST_EQUALS( q1.AsVector().z, 0.3f, TEST_LOCATION );
241 int UtcDaliQuaternionCtorAxesP01(void)
243 // angle: 60 deg, axis: [1,2,3]
244 float Mref_raw[16] = { 0.535714f, 0.765794f, -0.355767f, 0.0f,
245 -0.622936f, 0.642857f, 0.445741f, 0.0f,
246 0.570053f, -0.0171693f, 0.821429f, 0.0f,
247 0.0f, 0.0f, 0.0f, 1.0f};
248 Matrix Mref( Mref_raw );
250 Quaternion q1( Radian(M_PI/3.0f), Vector3( 1.0f, 2.0f, 3.0f ) );
251 Quaternion q2( Mref.GetXAxis(), Mref.GetYAxis(), Mref.GetZAxis() );
253 DALI_TEST_EQUALS( q1, q2, 0.001, TEST_LOCATION );
257 int UtcDaliQuaternionCtorAxesP02(void)
259 Vector3 xAxis( Vector3::XAXIS );
260 Vector3 yAxis( Vector3::YAXIS );
261 Vector3 zAxis( Vector3::ZAXIS );
263 Quaternion q1( xAxis, yAxis, zAxis );
265 DALI_TEST_EQUALS( q1, Quaternion::IDENTITY, TEST_LOCATION );
267 xAxis = Vector3( 1.0f, 1.0f, 0.0f );
269 yAxis = Vector3( -1.0f, 1.0f, 0.0f ); // 45 degrees anticlockwise ( +ve ) around z
271 zAxis = xAxis.Cross( yAxis );
273 Quaternion q2( xAxis, yAxis, zAxis );
275 DALI_TEST_EQUALS( q2, Quaternion( Radian( Degree( 45 ) ), Vector3::ZAXIS ), 0.001f, TEST_LOCATION );
280 int UtcDaliQuaternionCtorAxesP03(void)
282 // Create an arbitrary forward vector
283 for( float x=-1.0f; x<=1.0f; x+=0.1f )
285 for( float y=-1.0f; y<1.0f; y+=0.1f )
287 for( float z=-1.0f; z<1.0f; z+=0.1f )
289 Vector3 vForward( x, y, z );
290 vForward.Normalize();
292 // Construct an up vector from a sideways move
294 Vector3 vUp = vForward.Cross( Vector3( vForward.x+1.0f, vForward.y, vForward.z ) );
295 if( vUp.Length() > 0.01 )
298 vSide = vUp.Cross( vForward );
303 vSide = vForward.Cross( Vector3( vForward.x, vForward.y+1.0f, vForward.z ) );
305 vUp = vForward.Cross( vSide );
309 // Generate a quaternion
310 Quaternion q( vSide, vUp, vForward );
313 rotMatrix.SetXAxis( vSide );
314 rotMatrix.SetYAxis( vUp );
315 rotMatrix.SetZAxis( vForward );
317 // Generate a matrix from the quaternion, check they are the same
319 DALI_TEST_EQUALS( m.GetXAxis(), vSide, 0.001f, TEST_LOCATION );
320 DALI_TEST_EQUALS( m.GetYAxis(), vUp, 0.001f, TEST_LOCATION );
321 DALI_TEST_EQUALS( m.GetZAxis(), vForward, 0.001f, TEST_LOCATION );
323 // Rotate an arbitrary vector by both quaternion and rotation matrix,
324 // check the result is the same
326 Vector4 aVector( 2.043f, 12.8f, -3.872f, 1.0f );
327 Vector3 aVectorRotatedByQ = q.Rotate( Vector3( aVector ) );
328 Vector4 aVectorRotatedByR = rotMatrix*aVector;
329 DALI_TEST_EQUALS( aVectorRotatedByQ, Vector3( aVectorRotatedByR ), 0.001f, TEST_LOCATION );
336 int UtcDaliQuaternionCtorTwoVectorsP(void)
338 Vector3 v0( 1.0f, 2.0f, 3.0f );
339 Vector3 v1( -2.0f, 10.0f, -1.0f );
342 Quaternion q( v0, v1 );
344 DALI_TEST_EQUALS( q*v0, v1, 0.001, TEST_LOCATION );
348 int UtcDaliQuaternionAsVectorP(void)
350 Vector4 v( 1.0f, 0.1f, 0.2f, 0.3f );
353 DALI_TEST_EQUALS( v, q.AsVector(), TEST_LOCATION );
357 int UtcDaliQuaternionToAxisAngleVector3P(void)
359 Quaternion q( 0.932f, 1.1f, 3.4f, 2.7f );
362 bool converted = q.ToAxisAngle( axis, angle );
363 DALI_TEST_EQUALS( converted, true, TEST_LOCATION );
364 DALI_TEST_EQUALS( angle.radian, 0.74f, 0.01f, TEST_LOCATION );
365 DALI_TEST_EQUALS( axis.x, 3.03f, 0.01f, TEST_LOCATION );
366 DALI_TEST_EQUALS( axis.y, 9.38f, 0.01f, TEST_LOCATION );
367 DALI_TEST_EQUALS( axis.z, 7.45f, 0.01f, TEST_LOCATION );
371 int UtcDaliQuaternionToAxisAngleVector3N(void)
373 Quaternion q( 1, 2, 3, 4 );
376 bool converted = q.ToAxisAngle( axis, angle );
377 DALI_TEST_EQUALS( converted, false, TEST_LOCATION );
378 DALI_TEST_EQUALS( angle.radian, 0.0f, 0.01f, TEST_LOCATION );
379 DALI_TEST_EQUALS( axis.x, 0.0f, 0.01f, TEST_LOCATION );
380 DALI_TEST_EQUALS( axis.y, 0.0f, 0.01f, TEST_LOCATION );
381 DALI_TEST_EQUALS( axis.z, 0.0f, 0.01f, TEST_LOCATION );
385 int UtcDaliQuaternionSetEulerP(void)
387 // Test from euler angles
389 e1.SetEuler( Dali::ANGLE_45, Dali::ANGLE_0, Dali::ANGLE_0 );
390 Vector4 r1( 0.383f, 0.0f, 0.0f, 0.924f );
393 e2.SetEuler( Dali::ANGLE_0, Radian( Degree( 75 ) ), Dali::ANGLE_0 );
394 Vector4 r2( 0.0f, 0.609f, 0.0f, 0.793f );
397 e3.SetEuler( Dali::ANGLE_0, Dali::ANGLE_0, Radian( Degree( 135 ) ) );
398 Vector4 r3( 0.0f, 0.0f, 0.924f, 0.383f );
401 e4.SetEuler( Radian( Degree( 71 ) ), Radian( Degree( 36 ) ), Radian( Degree( 27 ) ) );
402 Vector4 r4( 0.478f, 0.374f, 0.006f, 0.795f );
405 e5.SetEuler( Radian( Degree( -31 ) ), Radian( Degree( -91 ) ), Radian( Degree( -173 ) ) );
406 Vector4 r5( -0.697f, 0.145f, -0.686f, -0.149f );
408 DALI_TEST_EQUALS( e1.AsVector(), r1, 0.001, TEST_LOCATION );
409 DALI_TEST_EQUALS( e2.AsVector(), r2, 0.001, TEST_LOCATION );
410 DALI_TEST_EQUALS( e3.AsVector(), r3, 0.001, TEST_LOCATION );
411 DALI_TEST_EQUALS( e4.AsVector(), r4, 0.001, TEST_LOCATION );
412 DALI_TEST_EQUALS( e5.AsVector(), r5, 0.001, TEST_LOCATION );
416 int UtcDaliQuaternionEulerAnglesP(void)
418 Quaternion q1( 0.924f, 0.383f, 0.0f, 0.0f );
419 Vector4 r1( Radian( Degree( 45 ) ), 0.0f, 0.0f, 0.0f );
421 Quaternion q2( 0.793f, 0.0f, 0.609f, 0.0f );
422 Vector4 r2( 0.0f, Radian( Degree( 75 ) ), 0.0f, 0.0f );
424 Quaternion q3( 0.383f, 0.0f, 0.0f, 0.924f );
425 Vector4 r3( 0.0f, 0.0f, Radian( Degree( 135 ) ), 0.0f );
427 Quaternion q4( 0.795f, 0.478f, 0.374f, 0.006f );
428 Vector4 r4( Radian( Degree( 71 ) ), Radian( Degree( 36 ) ), Radian( Degree( 27 ) ), 0.0f );
430 Quaternion q5( -0.149f, -0.697f, 0.145f, -0.686f );
431 Vector4 r5( Radian( Degree( 148.0 ) ), Radian( Degree( -88.2 ) ), Radian( Degree( 8.0 ) ), 0.0f );
433 DALI_TEST_EQUALS( q1.EulerAngles(), r1, 0.001, TEST_LOCATION );
434 DALI_TEST_EQUALS( q2.EulerAngles(), r2, 0.001, TEST_LOCATION );
435 DALI_TEST_EQUALS( q3.EulerAngles(), r3, 0.001, TEST_LOCATION );
436 DALI_TEST_EQUALS( q4.EulerAngles(), r4, 0.01, TEST_LOCATION );
437 DALI_TEST_EQUALS( q5.EulerAngles(), r5, 0.01, TEST_LOCATION );
442 int UtcDaliQuaternionToMatrixP01(void)
444 Quaternion q( Radian( 0.69813 ), Vector3( 1.0f, 0.0f, 0.0f ) ); // 40 degree rotation around X axis
446 // Result calculated using a different maths library ( with appropriate row/col ordering )
448 float els[] = { 1.0f, 0.0f, 0.0f, 0.0f,
449 0.0f, 0.766f, 0.643f, 0.0f,
450 0.0f, -0.643f, 0.766f, 0.0f,
451 0.0f, 0.0f, 0.0f, 1.0f };
455 DALI_TEST_EQUALS( m, mRes, 0.01, TEST_LOCATION );
459 int UtcDaliQuaternionToMatrixP02(void)
461 // rotation around arbitrary axis
462 Quaternion q2( Radian( -1.23918f ), Vector3( 7.0f, -13.0f, 11.0f ) );
464 float els[] = { 0.423f, -0.746f, -0.514f, 0.00f,
465 0.384f, 0.662f, -0.644f, 0.00f,
466 0.821f, 0.075f, 0.566f, 0.00f,
467 0.000f, 0.000f, 0.000f, 1.00f };
472 DALI_TEST_EQUALS( m2, mRes2, 0.01, TEST_LOCATION );
477 int UtcDaliQuaternionOperatorAdditionP(void)
479 Quaternion q1( 0.383f, 0.0f, 0.0f, 0.924f );
480 Quaternion q2( 0.0f, 0.609f, 0.0f, 0.793f );
482 Quaternion r1( 0.383f, 0.609f, 0.0f, 1.717f );
484 DALI_TEST_EQUALS( q1+q2, r1, 0.001f, TEST_LOCATION );
488 int UtcDaliQuaternionOperatorSubtractionP(void)
490 Quaternion q1( 0.383f, 0.450f, 0.123f, 0.924f );
491 Quaternion q2( 0.383f, 0.690f, 0.234f, 1.917f );
493 Quaternion r1( 0.0f, 0.240f, 0.111f, 0.993f );
495 DALI_TEST_EQUALS( q2-q1, r1, 0.001f, TEST_LOCATION );
499 int UtcDaliQuaternionConjugateP(void)
501 float s1 = 0.784f; Vector3 v1( 0.045f, 0.443f, 0.432f );
502 float s2 = 0.697f; Vector3 v2( 0.612, 0.344, -0.144 );
504 Quaternion q1( s1, v1.x, v1.y, v1.z );
505 Quaternion q2( s2, v2.x, v2.y, v2.z );
509 Quaternion r1( s1, -v1.x, -v1.y, -v1.z );
510 Quaternion r2( s2, -v2.x, -v2.y, -v2.z );
512 DALI_TEST_EQUALS( q1, r1, 0.001f, TEST_LOCATION );
513 DALI_TEST_EQUALS( q2, r2, 0.001f, TEST_LOCATION );
517 int UtcDaliQuaternionOperatorMultiplicationQuaternionP(void)
519 float s1=0.784f; Vector3 v1( 0.045f, 0.443f, 0.432f );
520 float s2=0.697f; Vector3 v2( 0.612, 0.344, -0.144 );
522 Quaternion q1( s1, v1.x, v1.y, v1.z );
523 Quaternion q2( s2, v2.x, v2.y, v2.z );
525 Vector3 vp = v1.Cross( v2 ) + v2*s1 + v1*s2;
526 Quaternion r1( s1*s2-v1.Dot( v2 ), vp.x, vp.y, vp.z );
528 DALI_TEST_EQUALS( q1*q2, r1, 0.001f, TEST_LOCATION );
532 // Quaternion * vector == Vector rotation
533 int UtcDaliQuaternionOperatorMultiplicationVector3P(void)
535 // Rotation of vector p = ( x,y,z ) by Quaternion q == q [0,p] q^-1
536 Vector3 v( 2, 3, 4 );
537 Quaternion q( Radian( Degree( 72 ) ), Vector3::ZAXIS );
540 Quaternion qv( 0.0f, v.x, v.y, v.z );
541 Quaternion r1 = ( q * qv ) * qI;
545 DALI_TEST_EQUALS( r1.mVector.x, r2.x, 0.001, TEST_LOCATION );
546 DALI_TEST_EQUALS( r1.mVector.y, r2.y, 0.001, TEST_LOCATION );
547 DALI_TEST_EQUALS( r1.mVector.z, r2.z, 0.001, TEST_LOCATION );
551 int UtcDaliQuaternionOperatorMultiplicationFloatP01(void)
553 // Rotation of vector p = ( x,y,z ) by Quaternion q == q [0,p] q^-1
554 Quaternion q( Vector4( 0.1f, 0.2f, 0.3f, 1.0f ) );
555 Quaternion q2 = q * 2.f;
556 Vector4 v2( 0.2f, 0.4f, 0.6f, 2.0f );
558 DALI_TEST_EQUALS( q2.AsVector(), v2, 0.001, TEST_LOCATION );
562 int UtcDaliQuaternionOperatorMultiplicationFloatP02(void)
564 Quaternion q1( 0.383f, 0.0f, 0.0f, 0.924f );
565 Quaternion r1( 2.0f* 0.383f, 0.0f, 0.0f, 2.0f * 0.924f );
567 DALI_TEST_EQUALS( q1 * 2.0f, r1, 0.001f, TEST_LOCATION );
571 int UtcDaliQuaternionOperatorMultiplicationFloatP03(void)
573 Quaternion q1( 0.383f, 0.0f, 0.0f, 0.924f );
574 Quaternion r1( 0.5f* 0.383f, 0.0f, 0.0f, 0.5f * 0.924f );
576 DALI_TEST_EQUALS( q1 / 2.0f, r1, 0.001f, TEST_LOCATION );
580 int UtcDaliQuaternionOperatorDivisionQuaternionP(void)
582 Quaternion q1( 0.383f, 0.0f, 0.0f, 0.924f );
583 Quaternion q2( 0.0f, 0.609f, 0.0f, 0.793f );
585 // q1 / q2 = q1 * q2^-1
586 // q2^-1 = q2* / ||q2||^2
587 // = Conjugate of q2 / Square of Norm of q2
591 r1 *= 1.0f/q2.LengthSquared();
592 Quaternion r2 = q1 * r1;
594 DALI_TEST_EQUALS( q1 / q2, r2, 0.001f, TEST_LOCATION );
598 int UtcDaliQuaternionOperatorDivisionFloatP(void)
600 Quaternion q1( 0.383f, 0.0f, 0.0f, 0.924f );
601 Quaternion r1( 2.0f* 0.383f, 0.0f, 0.0f, 2.0f * 0.924f );
603 DALI_TEST_EQUALS( q1, r1/2.0f, 0.001f, TEST_LOCATION );
607 int UtcDaliQuaternionOperatorDivideAssignedFloatP(void)
609 Quaternion q1( 0.383f, 0.0f, 0.0f, 0.924f );
610 Quaternion r1( 2.0f* 0.383f, 0.0f, 0.0f, 2.0f * 0.924f );
613 DALI_TEST_EQUALS( q1, r1, 0.001f, TEST_LOCATION );
617 int UtcDaliQuaternionOperatorNegationP(void)
619 Quaternion q1( 0.383f, 0.0f, 0.0f, 0.924f );
620 Quaternion r1( -0.383f, -0.0f, -0.0f, -0.924f );
622 DALI_TEST_EQUALS( -q1, r1, 0.001f, TEST_LOCATION );
626 int UtcDaliQuaternionOperatorAddAssignP(void)
628 Quaternion q1( 0.383f, 0.0f, 0.0f, 0.924f );
629 Quaternion q2( 0.0f, 0.609f, 0.0f, 0.793f );
631 Quaternion r1( 0.383f, 0.609f, 0.0f, 1.717f );
634 DALI_TEST_EQUALS( q1, r1, 0.001f, TEST_LOCATION );
638 int UtcDaliQuaternionOperatorSubtractAssignP(void)
640 Quaternion q1( 0.383f, 0.450f, 0.123f, 0.924f );
641 Quaternion q2( 0.383f, 0.690f, 0.234f, 1.917f );
643 Quaternion r1( 0.0f, 0.240f, 0.111f, 0.993f );
645 DALI_TEST_EQUALS( q2, r1, 0.001f, TEST_LOCATION );
649 int UtcDaliQuaternionOperatorMultiplyAssignQuaternionP(void)
651 float s1=0.784f; Vector3 v1( 0.045f, 0.443f, 0.432f );
652 float s2=0.697f; Vector3 v2( 0.612, 0.344, -0.144 );
654 Quaternion q1( s1, v1.x, v1.y, v1.z );
655 Quaternion q2( s2, v2.x, v2.y, v2.z );
657 Quaternion r3 = q2 * q1;
659 DALI_TEST_EQUALS( q2, r3, 0.001f, TEST_LOCATION );
663 int UtcDaliQuaternionOperatorMultiplyAssignFloatP01(void)
665 Quaternion q1( 0.383f, 0.450f, 0.123f, 0.924f );
667 Quaternion r1( scale*0.383f, scale*0.450f, scale*0.123f, scale*0.924f );
669 DALI_TEST_EQUALS( q1, r1, 0.001f, TEST_LOCATION );
673 int UtcDaliQuaternionOperatorMultiplyAssignFloatP02(void)
675 Quaternion q1( 0.383f, 0.450f, 0.123f, 0.924f );
677 Quaternion r1( 0.383f/scale, 0.450f/scale, 0.123f/scale, 0.924f/scale );
679 DALI_TEST_EQUALS( q1, r1, 0.001f, TEST_LOCATION );
683 int UtcDaliQuaternionOperatorEqualityP(void)
685 Quaternion q1( 0.383f, 0.450f, 0.123f, 0.924f );
686 Quaternion q2( 0.383f, 0.450f, 0.123f, 0.924f );
687 Quaternion q3( 0.383f, 0.450f, 0.123f, 0.800f );
688 Quaternion q4( 0.383f, 0.450f, 0.100f, 0.800f );
689 Quaternion q5( 0.383f, 0.100f, 0.100f, 0.800f );
690 Quaternion q6( 0.100f, 0.100f, 0.100f, 0.800f );
692 Quaternion q7( -0.383f, -0.450f, -0.123f, -0.924f );
693 Quaternion q8( -0.383f, -0.450f, -0.123f, 0.924f );
694 Quaternion q9( -0.383f, -0.450f, 0.123f, 0.924f );
695 Quaternion q10( -0.383f, 0.450f, 0.123f, 0.924f );
697 DALI_TEST_CHECK( q1 == q2 );
698 DALI_TEST_CHECK( !( q1 == q3 ) );
699 DALI_TEST_CHECK( !( q1 == q4 ) );
700 DALI_TEST_CHECK( !( q1 == q5 ) );
701 DALI_TEST_CHECK( !( q1 == q6 ) );
702 DALI_TEST_CHECK( ( q1 == q7 ) );
703 DALI_TEST_CHECK( !( q1 == q8 ) );
704 DALI_TEST_CHECK( !( q1 == q9 ) );
705 DALI_TEST_CHECK( !( q1 == q10 ) );
709 int UtcDaliQuaternionOperatorInequalityP(void)
711 Quaternion q1( 0.383f, 0.450f, 0.123f, 0.924f );
712 Quaternion q2( 0.383f, 0.450f, 0.123f, 0.924f );
713 Quaternion q3( -0.383f, -0.0f, -0.0f, -0.924f );
714 DALI_TEST_CHECK( !( q1 != q2 ) );
715 DALI_TEST_CHECK( q1 != q3 );
719 int UtcDaliQuaternionLengthP(void)
721 Quaternion q1( 0.383f, 0.450f, 0.123f, 0.924f );
722 float length = sqrtf( 0.383f*0.383f + 0.450f*0.450f + 0.123f*0.123f + 0.924f*0.924f );
723 DALI_TEST_EQUALS( q1.Length(), length, 0.001f, TEST_LOCATION );
727 int UtcDaliQuaternionLengthSquaredP(void)
729 Quaternion q1( 0.383f, 0.450f, 0.123f, 0.924f );
730 float lengthSquared = 0.383f*0.383f + 0.450f*0.450f + 0.123f*0.123f + 0.924f*0.924f;
731 DALI_TEST_EQUALS( q1.LengthSquared(), lengthSquared, 0.01f, TEST_LOCATION );
735 int UtcDaliQuaternionNormalizeP(void)
737 Quaternion q1( 0.118f, 0.692f, -0.127f, 0.701f );
741 DALI_TEST_EQUALS( q1, q2, 0.001f, TEST_LOCATION );
745 int UtcDaliQuaternionNormalizedP(void)
747 Quaternion q1( 0.118f, 0.692f, -0.127f, 0.701f );
750 DALI_TEST_EQUALS( q1, q2.Normalized(), 0.001f, TEST_LOCATION );
754 int UtcDaliQuaternionIsIdentityP(void)
756 Quaternion q( 1.0f, 0.0f, 0.0f, 0.0f );
757 DALI_TEST_EQUALS( q.IsIdentity(), true, TEST_LOCATION );
761 int UtcDaliQuaternionIsIdentityN(void)
763 Quaternion q( 1.0f, 0.1f, 0.0f, 0.0f );
764 DALI_TEST_EQUALS( q.IsIdentity(), false, TEST_LOCATION );
768 int UtcDaliQuaternionInvertP(void)
770 Quaternion q1( 0.383f, 0.0f, 0.0f, 0.924f );
772 // q1^-1 = q1* / ||q1||^2
773 // = Conjugate of q1 / Square of Norm of q1
777 r1 *= 1.0f/q1.LengthSquared();
781 DALI_TEST_EQUALS( q2, r1, 0.001f, TEST_LOCATION );
786 int UtcDaliQuaternionDotP(void)
788 // q.q' = s*s' + v dot v'
789 float s1 = 0.784f; Vector3 v1( 0.045f, 0.443f, 0.432f );
790 float s2 = 0.697f; Vector3 v2( 0.612, 0.344, -0.144 );
792 Quaternion q1( s1, v1.x, v1.y, v1.z );
793 Quaternion q2( s2, v2.x, v2.y, v2.z );
795 float r1 = s1*s2 + v1.Dot( v2 );
797 DALI_TEST_EQUALS( Quaternion::Dot( q1, q2 ), r1, TEST_LOCATION );
802 int UtcDaliQuaternionRotateVector3P(void)
804 // Rotation of vector p = ( x,y,z ) by Quaternion q == q [0,p] q^-1
805 Vector3 v( 2, 3, 4 );
806 Quaternion q( Radian( Degree( 72 ) ), Vector3::ZAXIS );
809 Quaternion qv( 0.0f, v.x, v.y, v.z );
810 Quaternion r1 = q * qv * qI;
812 Vector3 r2 = q.Rotate( v );
814 DALI_TEST_EQUALS( r1.mVector.x, r2.x, 0.001f, TEST_LOCATION );
815 DALI_TEST_EQUALS( r1.mVector.y, r2.y, 0.001f, TEST_LOCATION );
816 DALI_TEST_EQUALS( r1.mVector.z, r2.z, 0.001f, TEST_LOCATION );
818 DALI_TEST_EQUALS( q.Rotate( v ), q*v, 0.001f, TEST_LOCATION );
823 int UtcDaliQuaternionRotateVector4P(void)
825 // Rotation of vector p = ( x,y,z ) by Quaternion q == q [0,p] q^-1
826 Vector4 v( 2, 3, 4, 5 );
827 Quaternion q( Radian( Degree( 72 ) ), Vector3::ZAXIS );
830 Quaternion qv( 0.0f, v.x, v.y, v.z );
831 Quaternion r1 = q * qv * qI;
833 Vector4 r2 = q.Rotate( v );
835 DALI_TEST_EQUALS( r1.mVector.x, r2.x, 0.001f, TEST_LOCATION );
836 DALI_TEST_EQUALS( r1.mVector.y, r2.y, 0.001f, TEST_LOCATION );
837 DALI_TEST_EQUALS( r1.mVector.z, r2.z, 0.001f, TEST_LOCATION );
838 DALI_TEST_EQUALS( r1.mVector.w, 0.0f, 0.001f, TEST_LOCATION );
843 int UtcDaliQuaternionExpP01(void)
845 Quaternion q1( 0.0f, 1.0f, 1.2f, 1.3f );
846 Quaternion q2 = q1.Exp();
847 Quaternion r2( -0.4452, 0.4406, 0.5287, 0.5728 );
849 DALI_TEST_EQUALS( q2.Length(), 1.0f, 0.01f, TEST_LOCATION );
851 DALI_TEST_EQUALS( q2, r2, 0.001f, TEST_LOCATION );
853 // Note, this trick only works when |v| < pi, which it is!
854 Quaternion q3 = q2.Log();
855 DALI_TEST_EQUALS( q1, q3, 0.01f, TEST_LOCATION );
860 int UtcDaliQuaternionExpP02(void)
862 Quaternion q1( 0.0f, 0.0f, 0.0f, 0.0f );
863 Quaternion q2 = q1.Exp();
864 Quaternion r2( 1.0f, 0.0f, 0.0f, 0.0f );
866 DALI_TEST_EQUALS( q2.Length(), 1.0f, 0.01f, TEST_LOCATION );
868 DALI_TEST_EQUALS( q2, r2, 0.001f, TEST_LOCATION );
870 // Note, this trick only works when |v| < pi, which it is!
871 Quaternion q3 = q2.Log();
872 DALI_TEST_EQUALS( q1, q3, 0.01f, TEST_LOCATION );
877 int UtcDaliQuaternionExpN(void)
879 Quaternion q( Radian( 0.0f ), Vector3(5.0f, 6.0f, 7.0f) );
881 // q.w is non-zero. Should assert.
885 DALI_TEST_CHECK( false );
887 catch( DaliException& e )
889 DALI_TEST_CHECK( true );
895 int UtcDaliQuaternionLogP01(void)
897 Quaternion q( Radian( Math::PI*0.73f ), Vector3(2,3,4) );
901 Quaternion r = q2.Log();
902 DALI_TEST_EQUALS( r.mVector.w, 0.0f, 0.01f, TEST_LOCATION );
904 Quaternion r2 = r.Exp();
905 DALI_TEST_EQUALS( r2, q2, 0.01f, TEST_LOCATION );
909 int UtcDaliQuaternionLogP02(void)
911 Quaternion q1( 1.0f, 0.0f, 0.0f, 0.0f );
912 Quaternion r1( 0.0f, 0.0f, 0.0f, 0.0f );
914 Quaternion q2 = q1.Log();
916 DALI_TEST_EQUALS( q2, r1, 0.01f, TEST_LOCATION );
918 Quaternion q3 = q2.Exp();
919 DALI_TEST_EQUALS( q1, q3, 0.01f, TEST_LOCATION );
923 int UtcDaliQuaternionLerpP(void)
925 Quaternion q1( Radian( Degree( -80 ) ), Vector3( 0.0f, 0.0f, 1.0f ) );
926 Quaternion q2( Radian( Degree( 80 ) ), Vector3( 0.0f, 0.0f, 1.0f ) );
928 Quaternion p = Quaternion::Lerp( q1, q2, 0.0f );
929 DALI_TEST_EQUALS( p, q1, 0.001f, TEST_LOCATION );
931 p = Quaternion::Lerp( q1, q2, 1.0f );
932 DALI_TEST_EQUALS( p, q2, 0.001f, TEST_LOCATION );
934 p = Quaternion::Lerp( q1, q2, 0.5f );
935 Quaternion r1 = ( q1 + q2 ) * 0.5f;
937 DALI_TEST_EQUALS( p, r1, 0.001f, TEST_LOCATION );
941 int UtcDaliQuaternionSlerpP01(void)
943 Quaternion q1(Radian(M_PI/4.0f), Vector3(0.0f, 0.0f, 1.0f));
944 Quaternion q2(Radian(-M_PI/4.0f), Vector3(0.0f, 0.0f, 1.0f));
946 Quaternion q = Quaternion::Slerp( q1, q2, 0.0f );
947 DALI_TEST_EQUALS( q, q1, 0.001, TEST_LOCATION );
949 q = Quaternion::Slerp( q1, q2, 1.0f );
950 DALI_TEST_EQUALS( q, q2, 0.001, TEST_LOCATION );
952 // @ 25%, will be at M_PI/8
953 q = Quaternion::Slerp( q1, q2, 0.25f );
956 bool converted = q.ToAxisAngle( axis, angle );
957 DALI_TEST_EQUALS( converted, true, TEST_LOCATION );
958 DALI_TEST_EQUALS( angle.radian, Math::PI/8.0f, 0.001, TEST_LOCATION );
959 DALI_TEST_EQUALS( axis.x, 0.0f, 0.001, TEST_LOCATION );
960 DALI_TEST_EQUALS( axis.y, 0.0f, 0.001, TEST_LOCATION );
961 DALI_TEST_EQUALS( axis.z, 1.0f, 0.001, TEST_LOCATION );
967 int UtcDaliQuaternionSlerpP02(void)
969 Quaternion q1( Dali::ANGLE_30, Vector3(0.0f, 0.0f, 1.0f));
970 Quaternion q2( Dali::ANGLE_90, Vector3(0.0f, 0.0f, 1.0f));
972 Quaternion q = Quaternion::Slerp( q1, q2, 0.0f );
974 DALI_TEST_EQUALS( q, q1, 0.001, TEST_LOCATION );
976 q = Quaternion::Slerp( q1, q2, 1.0f );
978 DALI_TEST_EQUALS( q, q2, 0.001, TEST_LOCATION );
980 // @ 50%, will be at M_PI/3 around z
981 q = Quaternion::Slerp( q1, q2, 0.5f );
983 Quaternion r( Dali::ANGLE_60, Vector3( 0.0f, 0.0f, 1.0f));
984 DALI_TEST_EQUALS( q, r, 0.001, TEST_LOCATION );
989 int UtcDaliQuaternionSlerpP03(void)
991 Quaternion q1( Radian( Degree( 125 ) ), Vector3( 0.0f, 0.0f, 1.0f ) );
992 Quaternion q2( Radian( Degree( -125 ) ), Vector3( 0.002f, 0.001f, 1.001f ) );
994 Quaternion q = Quaternion::Slerp( q1, q2, 0.0f );
995 DALI_TEST_EQUALS( q, q1, 0.001, TEST_LOCATION );
997 q = Quaternion::Slerp( q1, q2, 1.0f );
998 DALI_TEST_EQUALS( q, q2, 0.001, TEST_LOCATION );
1000 q = Quaternion::Slerp(q1, q2, 0.05f);
1003 bool converted = q.ToAxisAngle(axis, angle);
1004 DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
1006 DALI_TEST_EQUALS( axis.x, 0.0f, 0.01, TEST_LOCATION );
1007 DALI_TEST_EQUALS( axis.y, 0.0f, 0.01, TEST_LOCATION );
1008 DALI_TEST_EQUALS( axis.z, 1.0f, 0.01, TEST_LOCATION );
1014 int UtcDaliQuaternionSlerpP04(void)
1016 Quaternion q1( Radian( Degree( 120 ) ), Vector3( 0.0f, 0.0f, 1.0f ) );
1017 Quaternion q2( Radian( Degree( 130 ) ), Vector3( 0.0f, 0.0f, 1.0f ) );
1019 Quaternion q = Quaternion::Slerp( q1, q2, 0.0f );
1020 DALI_TEST_EQUALS( q, q1, 0.001, TEST_LOCATION );
1022 q = Quaternion::Slerp( q1, q2, 1.0f );
1023 DALI_TEST_EQUALS( q, q2, 0.001, TEST_LOCATION );
1025 q = Quaternion::Slerp(q1, q2, 0.5f);
1028 bool converted = q.ToAxisAngle(axis, angle);
1029 DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
1030 DALI_TEST_EQUALS(angle.radian, float(Radian(Degree(125))), 0.01f, TEST_LOCATION);
1031 DALI_TEST_EQUALS(axis.x, 0.0f, 0.01, TEST_LOCATION);
1032 DALI_TEST_EQUALS(axis.y, 0.0f, 0.01, TEST_LOCATION);
1033 DALI_TEST_EQUALS(axis.z, 1.0f, 0.01, TEST_LOCATION);
1039 int UtcDaliQuaternionSlerpNoInvertP01(void)
1041 Quaternion q1( Dali::ANGLE_45, Vector3(0.0f, 0.0f, 1.0f));
1042 Quaternion q2(-Dali::ANGLE_45, Vector3(0.0f, 0.0f, 1.0f));
1044 Quaternion q = Quaternion::SlerpNoInvert( q1, q2, 0.0f );
1045 DALI_TEST_EQUALS( q, q1, 0.001, TEST_LOCATION );
1047 q = Quaternion::SlerpNoInvert( q1, q2, 1.0f );
1048 DALI_TEST_EQUALS( q, q2, 0.001, TEST_LOCATION );
1050 // @ 25%, will be at M_PI/8
1051 q = Quaternion::SlerpNoInvert(q1, q2, 0.25f);
1054 bool converted = q.ToAxisAngle(axis, angle);
1055 DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
1056 DALI_TEST_EQUALS(angle.radian, Math::PI/8.0f, 0.001, TEST_LOCATION);
1057 DALI_TEST_EQUALS(axis.x, 0.0f, 0.001, TEST_LOCATION);
1058 DALI_TEST_EQUALS(axis.y, 0.0f, 0.001, TEST_LOCATION);
1059 DALI_TEST_EQUALS(axis.z, 1.0f, 0.001, TEST_LOCATION);
1064 int UtcDaliQuaternionSlerpNoInvertP02(void)
1066 Quaternion q1( Radian( Degree( 120 ) ), Vector3( 0.0f, 0.0f, 1.0f ) );
1067 Quaternion q2( Radian( Degree( 130 ) ), Vector3( 0.0f, 0.0f, 1.0f ) );
1069 Quaternion q = Quaternion::SlerpNoInvert( q1, q2, 0.0f );
1070 DALI_TEST_EQUALS( q, q1, 0.001, TEST_LOCATION );
1072 q = Quaternion::SlerpNoInvert( q1, q2, 1.0f );
1073 DALI_TEST_EQUALS( q, q2, 0.001, TEST_LOCATION );
1075 q = Quaternion::SlerpNoInvert(q1, q2, 0.5f);
1078 bool converted = q.ToAxisAngle(axis, angle);
1079 DALI_TEST_EQUALS(converted, true, TEST_LOCATION);
1080 DALI_TEST_EQUALS(angle.radian, float(Radian(Degree(125))), 0.01f, TEST_LOCATION);
1081 DALI_TEST_EQUALS(axis.x, 0.0f, 0.01, TEST_LOCATION);
1082 DALI_TEST_EQUALS(axis.y, 0.0f, 0.01, TEST_LOCATION);
1083 DALI_TEST_EQUALS(axis.z, 1.0f, 0.01, TEST_LOCATION);
1088 int UtcDaliQuaternionSquadP(void)
1090 Quaternion q1( Radian( Degree( 45 ) ), Vector3( 0.0f, 0.0f, 1.0f ) );
1091 Quaternion q1out( Radian( Degree( 40 ) ), Vector3( 0.0f, 1.0f, 2.0f ) );
1092 Quaternion q2in( Radian( Degree( 35 ) ), Vector3( 0.0f, 2.0f, 3.0f ) );
1093 Quaternion q2( Radian( Degree( 30 ) ), Vector3( 0.0f, 1.0f, 3.0f ) );
1095 Quaternion q = Quaternion::Squad( q1, q2, q1out, q2in, 0.0f );
1096 DALI_TEST_EQUALS( q, q1, 0.001f, TEST_LOCATION );
1098 q = Quaternion::Squad( q1, q2, q1out, q2in, 1.0f );
1099 DALI_TEST_EQUALS( q, q2, 0.001f, TEST_LOCATION );
1101 // Don't know what actual value should be, but can make some informed guesses.
1102 q = Quaternion::Squad(q1, q2, q1out, q2in, 0.5f);
1106 q.ToAxisAngle( axis, angle );
1110 q = -q; // Might get negative quat
1111 q.ToAxisAngle( axis, angle );
1113 float deg = Degree(angle).degree;
1114 DALI_TEST_CHECK(deg >= 0 && deg <= 90);
1115 DALI_TEST_CHECK(axis.y > 0);
1116 DALI_TEST_CHECK(axis.z > 0);
1120 int UtcDaliAngleBetweenP(void)
1122 Quaternion q1( ANGLE_45, ANGLE_0, ANGLE_0 );
1123 Quaternion q2(Radian(Degree(47)), ANGLE_0, ANGLE_0 );
1124 DALI_TEST_EQUALS(Quaternion::AngleBetween(q1, q2), fabsf(Radian(Degree(45)) - Radian(Degree(47))), 0.001f, TEST_LOCATION);
1126 Quaternion q3( Radian( Degree( 80 ) ), Vector3::YAXIS );
1127 Quaternion q4( Radian( Degree( 90 ) ), Vector3::YAXIS );
1128 DALI_TEST_EQUALS( Quaternion::AngleBetween( q3, q4 ), fabsf( Radian( Degree( 80 ) ) - Radian( Degree( 90 ) ) ), 0.001f, TEST_LOCATION );
1130 Quaternion q5( Radian( Degree( 0 ) ), Vector3::YAXIS );
1131 Quaternion q6( Radian( Degree( 90 ) ), Vector3::XAXIS );
1132 DALI_TEST_EQUALS( Quaternion::AngleBetween( q5, q6 ), fabsf( Radian( Degree( 0 ) ) - Radian( Degree( 90 ) ) ), 0.001f, TEST_LOCATION );
1134 Quaternion q7( Radian( Degree( 0 ) ), Vector3::YAXIS );
1135 Quaternion q8( Radian( Degree( 0 ) ), Vector3::XAXIS );
1136 DALI_TEST_EQUALS( Quaternion::AngleBetween( q7, q8 ), fabsf( Radian( Degree( 0 ) ) - Radian( Degree( 0 ) ) ), 0.001f, TEST_LOCATION );
1138 Quaternion q9( Radian( Degree( 0 ) ), Vector3::XAXIS );
1139 Quaternion q10( Radian( Degree( 180 ) ), Vector3::XAXIS );
1140 DALI_TEST_EQUALS( Quaternion::AngleBetween( q9, q10 ), fabsf( Radian( Degree( 0 ) ) - Radian( Degree( 180 ) ) ), 0.001f, TEST_LOCATION );
1142 Quaternion q11( Radian( Degree( 1 ) ), Vector3::YAXIS );
1143 Quaternion q12( Radian( Degree( 240 ) ), Vector3::YAXIS );
1144 DALI_TEST_EQUALS( Quaternion::AngleBetween( q11, q12 ), fabsf( Radian( Degree( 1 - 240 + 360 ) ) ), 0.001f, TEST_LOCATION );
1146 Quaternion q13( Radian( Degree( 240 ) ), Vector3::YAXIS );
1147 Quaternion q14( Radian( Degree( 1 ) ), Vector3::YAXIS );
1148 DALI_TEST_EQUALS( Quaternion::AngleBetween( q13, q14 ), fabsf( Radian( Degree( 240 - 1 - 360 ) ) ), 0.001f, TEST_LOCATION );
1150 Quaternion q15( Radian( Degree( 240 ) ), Vector3::YAXIS );
1151 Quaternion q16( Radian( Degree( 1 ) ), Vector3::ZAXIS );
1152 DALI_TEST_EQUALS( Quaternion::AngleBetween( q15, q16 ), Quaternion::AngleBetween( q16, q15 ), 0.001f, TEST_LOCATION );
1156 int UtcDaliQuaternionOStreamOperatorP(void)
1158 std::ostringstream oss;
1160 Quaternion quaternion( Dali::ANGLE_180, Vector3::YAXIS );
1164 std::string expectedOutput = "[ Axis: [0, 1, 0], Angle: 180 degrees ]";
1166 DALI_TEST_EQUALS( oss.str(), expectedOutput, TEST_LOCATION );