0027764: Visualization - add functionality for animation of 3D camera and interactive...
[occt.git] / src / gp / gp_TrsfNLerp.hxx
1 // Copyright (c) 2016 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #ifndef _gp_TrsfNLerp_HeaderFile
15 #define _gp_TrsfNLerp_HeaderFile
16
17 #include <gp_Trsf.hxx>
18 #include <gp_QuaternionNLerp.hxx>
19 #include <NCollection_Lerp.hxx>
20 #include <Precision.hxx>
21
22 //! Linear interpolation tool for transformation defined by gp_Trsf.
23 //!
24 //! In general case, there is a no well-defined interpolation between arbitrary transformations,
25 //! because desired transient values might vary depending on application needs.
26 //!
27 //! This tool performs independent interpolation of three logical
28 //! transformation parts - rotation (using gp_QuaternionNLerp), translation and scale factor.
29 //! Result of such interpolation might be not what application expects,
30 //! thus this tool might be considered for simple cases or for interpolating between small intervals.
31 template<> class NCollection_Lerp<gp_Trsf>
32 {
33 public:
34
35   //! Empty constructor
36   NCollection_Lerp() {}
37
38   //! Main constructor.
39   NCollection_Lerp (const gp_Trsf& theStart, const gp_Trsf& theEnd)
40   {
41     Init (theStart, theEnd);
42   }
43
44   //! Initialize values.
45   void Init (const gp_Trsf& theStart, const gp_Trsf& theEnd)
46   {
47     myTrsfStart = theStart;
48     myTrsfEnd   = theEnd;
49     myLocLerp  .Init (theStart.TranslationPart(), theEnd.TranslationPart());
50     myRotLerp  .Init (theStart.GetRotation(),     theEnd.GetRotation());
51     myScaleLerp.Init (theStart.ScaleFactor(),     theEnd.ScaleFactor());
52   }
53
54   //! Compute interpolated value between two values.
55   //! @param theT normalized interpolation coefficient within [0, 1] range,
56   //!             with 0 pointing to first value and 1 to the second value.
57   //! @param theResult [out] interpolated value
58   void Interpolate (double theT, gp_Trsf& theResult) const
59   {
60     if (Abs (theT - 0.0) < Precision::Confusion())
61     {
62       theResult = myTrsfStart;
63       return;
64     }
65     else if (Abs (theT - 1.0) < Precision::Confusion())
66     {
67       theResult = myTrsfEnd;
68       return;
69     }
70
71     gp_XYZ aLoc;
72     gp_Quaternion aRot;
73     Standard_Real aScale = 1.0;
74     myLocLerp  .Interpolate (theT, aLoc);
75     myRotLerp  .Interpolate (theT, aRot);
76     myScaleLerp.Interpolate (theT, aScale);
77     theResult = gp_Trsf();
78     theResult.SetRotation (aRot);
79     theResult.SetTranslationPart (aLoc);
80     theResult.SetScaleFactor (aScale);
81   }
82
83 private:
84   NCollection_Lerp<gp_XYZ>        myLocLerp;
85   NCollection_Lerp<Standard_Real> myScaleLerp;
86   gp_QuaternionNLerp              myRotLerp;
87   gp_Trsf                         myTrsfStart;
88   gp_Trsf                         myTrsfEnd;
89 };
90
91 typedef NCollection_Lerp<gp_Trsf> gp_TrsfNLerp;
92
93 #endif // _gp_TrsfNLerp_HeaderFile