File indexing completed on 2025-01-18 10:03:45
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef _gp_QuaternionSLerp_HeaderFile
0015 #define _gp_QuaternionSLerp_HeaderFile
0016
0017 #include <gp_Quaternion.hxx>
0018
0019
0020
0021 class gp_QuaternionSLerp
0022 {
0023 public:
0024
0025
0026
0027
0028
0029
0030 static gp_Quaternion Interpolate (const gp_Quaternion& theQStart,
0031 const gp_Quaternion& theQEnd,
0032 Standard_Real theT)
0033 {
0034 gp_Quaternion aResult;
0035 gp_QuaternionSLerp aLerp (theQStart, theQEnd);
0036 aLerp.Interpolate (theT, aResult);
0037 return aResult;
0038 }
0039
0040 public:
0041
0042
0043 gp_QuaternionSLerp() {}
0044
0045
0046 gp_QuaternionSLerp (const gp_Quaternion& theQStart, const gp_Quaternion& theQEnd)
0047 {
0048 Init (theQStart, theQEnd);
0049 }
0050
0051
0052 void Init (const gp_Quaternion& theQStart, const gp_Quaternion& theQEnd)
0053 {
0054 InitFromUnit (theQStart.Normalized(), theQEnd.Normalized());
0055 }
0056
0057
0058 void InitFromUnit (const gp_Quaternion& theQStart, const gp_Quaternion& theQEnd)
0059 {
0060 myQStart = theQStart;
0061 myQEnd = theQEnd;
0062 Standard_Real cosOmega = myQStart.Dot (myQEnd);
0063 if (cosOmega < 0.0)
0064 {
0065 cosOmega = -cosOmega;
0066 myQEnd = -myQEnd;
0067 }
0068 if (cosOmega > 0.9999)
0069 {
0070 cosOmega = 0.9999;
0071 }
0072 myOmega = ACos (cosOmega);
0073 Standard_Real invSinOmega = (1.0 / Sin (myOmega));
0074 myQStart.Scale (invSinOmega);
0075 myQEnd.Scale (invSinOmega);
0076 }
0077
0078
0079 void Interpolate (Standard_Real theT, gp_Quaternion& theResultQ) const
0080 {
0081 theResultQ = myQStart * Sin((1.0 - theT) * myOmega) + myQEnd * Sin (theT * myOmega);
0082 }
0083
0084 private:
0085
0086 gp_Quaternion myQStart;
0087 gp_Quaternion myQEnd;
0088 Standard_Real myOmega;
0089
0090 };
0091
0092 #endif