2 // File : VTKViewer_NonIsometricTransform.cxx
3 // Created : Thu Jan 30 15:21:07 2003
4 // Project : SALOME PRO
5 // Author : Vasily RUSYAEV (vrv)
6 // Copyright : Open CASCADE 2003
9 #include "VTKViewer_NonIsometricTransform.h"
11 double ident(double in, double coeff) { return in; }
12 double dident(double in, double coeff) { return 1.0; }
14 double Exponent(double in, double coeff){ return exp(in)-coeff;}
15 double dExponent(double in, double coeff){ return exp(in);}
16 double Log(double in, double coeff){ return log(in+coeff);}
17 double dLog(double in, double coeff){ return 1.0/(in+coeff);}
19 double Scl(double in, double coeff){ return coeff*in;}
20 double dScl(double in, double coeff){ return coeff;}
21 double IScl(double in, double coeff){ return in/coeff;}
22 double dIScl(double in, double coeff){ return 1.0/coeff;}
25 AxisFunction::AxisFunction(Axis A)
26 : m_axis(A), fFun(&ident), dfFun(&dident), iFun(&ident), diFun(&dident)
29 AxisFunction::AxisFunction()
30 : m_axis(XAxis), fFun(&ident), dfFun(&dident), iFun(&ident), diFun(&dident)
34 inline void AxisFunction::forward(const double in, const double coeff, double& out, double der[3]) const
37 der[m_axis] = (*dfFun)( in, coeff);
38 forward(in, coeff, out);
41 inline void AxisFunction::inverse(const double in, const double coeff, double& out, double der[3]) const
44 der[m_axis] = (*diFun)( in, coeff );
45 inverse(in, coeff , out);
48 inline MFun AxisFunction::getfFun()
53 VTKViewer_NonIsometricTransform::VTKViewer_NonIsometricTransform ()
55 m_coeff[0] = m_coeff[1] = m_coeff[2] = 1.0;
56 m_axisFunctions[0] = AxisFunction ( AxisFunction::XAxis );
57 m_axisFunctions[1] = AxisFunction ( AxisFunction::YAxis );
58 m_axisFunctions[2] = AxisFunction ( AxisFunction::ZAxis );
61 void VTKViewer_NonIsometricTransform::ForwardTransformPoint(const float in[3], float out[3])
64 //ForwardTransformPoint( in, out );
66 inline void VTKViewer_NonIsometricTransform::ForwardTransformPoint(const double in[3], double out[3])
68 for(int i = 0; i < 3; i++)
69 m_axisFunctions[i].forward(in[i], m_coeff[i], out[i]);
71 inline void VTKViewer_NonIsometricTransform::ForwardTransformDerivative(const double in[3],
72 double out[3], double der[3][3])
74 for(int i = 0; i < 3; i++)
75 m_axisFunctions[i].forward(in[i], m_coeff[i], out[i], der[i]);
77 void VTKViewer_NonIsometricTransform::ForwardTransformDerivative(const float in[3], float out[3], float der[3][3])
80 //ForwardTransformDerivative(in,out,der);
82 inline void VTKViewer_NonIsometricTransform::InverseTransformDerivative(const double in[3],
83 double out[3], double der[3][3])
85 for(int i = 0; i < 3; i++)
86 m_axisFunctions[i].inverse(in[i], m_coeff[i], out[i], der[i]);
88 inline void VTKViewer_NonIsometricTransform::InverseTransformPoint(const double in[3], double out[3])
90 for(int i = 0; i < 3; i++)
91 m_axisFunctions[i].inverse(in[i], m_coeff[i], out[i]);
93 void VTKViewer_NonIsometricTransform::InverseTransformPoint(const float in[3], float out[3])
96 //InverseTransformPoint(in,out);
100 void VTKViewer_NonIsometricTransform::SetFunction(const AxisFunction::Axis axis,
101 const Function aFunction, const double coeff)
103 m_coeff[axis] = coeff;
107 m_axisFunctions[axis] = AxisFunction( axis );
110 m_axisFunctions[axis] = AxisFunction( axis, &Scl,&dScl,&IScl,&dIScl);
113 m_axisFunctions[axis] = AxisFunction( axis, &Log, &dLog, &Exponent, &dExponent );
118 inline void VTKViewer_NonIsometricTransform::SetFunction(const AxisFunction AF)
120 m_axisFunctions[AF.getAxis()] = AF;
123 VTKViewer_NonIsometricTransform* VTKViewer_NonIsometricTransform::New()
125 // First try to create the object from the vtkObjectFactory
126 vtkObject* ret = vtkObjectFactory::CreateInstance("VTKViewer_NonIsometricTransform");
128 return (VTKViewer_NonIsometricTransform*)ret;
129 // If the factory was unable to create the object, then create it here.
130 return new VTKViewer_NonIsometricTransform;
133 VTKViewer_NonIsometricTransform::Function VTKViewer_NonIsometricTransform::GetFunctionType(const AxisFunction::Axis axis)
135 if ( m_axisFunctions[axis].getfFun() == &ident) {
138 if ( m_axisFunctions[axis].getfFun() == &Scl ) {
141 if ( m_axisFunctions[axis].getfFun() == &Log ) {
146 double VTKViewer_NonIsometricTransform::GetCoeff (const AxisFunction::Axis axis)
148 return m_coeff[axis];