Salome HOME
This commit was generated by cvs2git to track changes on a CVS vendor
[modules/kernel.git] / src / VTKViewer / VTKViewer_NonIsometricTransform.cxx
1 using namespace std;
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
7 //  $Header:
8
9 #include "VTKViewer_NonIsometricTransform.h"
10
11 double ident(double in, double coeff) { return in; }
12 double dident(double in, double coeff) { return 1.0; }
13
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);}
18
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;}
23
24
25 AxisFunction::AxisFunction(Axis A)
26      : m_axis(A), fFun(&ident), dfFun(&dident), iFun(&ident), diFun(&dident)
27 {
28 }
29 AxisFunction::AxisFunction()
30      : m_axis(XAxis), fFun(&ident), dfFun(&dident), iFun(&ident), diFun(&dident)
31 {
32 }
33      
34 inline void AxisFunction::forward(const double in, const double coeff, double& out, double der[3]) const
35 {
36   init_der(der);
37   der[m_axis] = (*dfFun)( in, coeff);
38   forward(in, coeff, out);
39 }
40   
41 inline void AxisFunction::inverse(const double in, const double coeff, double& out, double der[3]) const
42 {
43   init_der(der);
44   der[m_axis] = (*diFun)( in, coeff );
45   inverse(in, coeff , out);
46 }
47
48 inline MFun AxisFunction::getfFun()
49 {
50   return fFun;
51 }  
52
53 VTKViewer_NonIsometricTransform::VTKViewer_NonIsometricTransform ()
54 {
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 );
59 }
60
61 void VTKViewer_NonIsometricTransform::ForwardTransformPoint(const float in[3], float out[3])
62 {
63   //TODO
64   //ForwardTransformPoint( in, out );
65 }
66 inline void VTKViewer_NonIsometricTransform::ForwardTransformPoint(const double in[3], double out[3])
67 {
68   for(int i = 0; i < 3; i++) 
69     m_axisFunctions[i].forward(in[i], m_coeff[i], out[i]);
70 }
71 inline void VTKViewer_NonIsometricTransform::ForwardTransformDerivative(const double in[3],
72                                                                         double out[3], double der[3][3])
73 {
74   for(int i = 0; i < 3; i++)
75     m_axisFunctions[i].forward(in[i], m_coeff[i], out[i], der[i]);
76 }
77 void VTKViewer_NonIsometricTransform::ForwardTransformDerivative(const float in[3], float out[3], float der[3][3])
78 {
79   //TODO
80   //ForwardTransformDerivative(in,out,der);
81 }
82 inline void VTKViewer_NonIsometricTransform::InverseTransformDerivative(const double in[3],
83                                                                         double out[3], double der[3][3])
84 {
85   for(int i = 0; i < 3; i++)
86     m_axisFunctions[i].inverse(in[i], m_coeff[i], out[i], der[i]);
87 }
88 inline void VTKViewer_NonIsometricTransform::InverseTransformPoint(const double in[3], double out[3])
89 {
90   for(int i = 0; i < 3; i++)
91     m_axisFunctions[i].inverse(in[i], m_coeff[i], out[i]);
92 }
93 void VTKViewer_NonIsometricTransform::InverseTransformPoint(const float in[3], float out[3])
94 {
95   //TODO
96   //InverseTransformPoint(in,out);
97 }
98
99
100 void VTKViewer_NonIsometricTransform::SetFunction(const AxisFunction::Axis axis,
101                                                   const Function aFunction, const double coeff)
102 {
103   m_coeff[axis] = coeff;
104   switch (aFunction)
105     {
106     case Identical:
107       m_axisFunctions[axis] = AxisFunction( axis );
108       break;
109     case Linear:
110       m_axisFunctions[axis] = AxisFunction( axis, &Scl,&dScl,&IScl,&dIScl);
111       break;
112     case Logarithmic:
113       m_axisFunctions[axis] = AxisFunction( axis, &Log, &dLog, &Exponent, &dExponent );
114       break;
115     }     
116 }
117
118 inline void VTKViewer_NonIsometricTransform::SetFunction(const AxisFunction AF)
119 {
120   m_axisFunctions[AF.getAxis()] = AF;
121 }
122
123 VTKViewer_NonIsometricTransform* VTKViewer_NonIsometricTransform::New()
124 {
125   // First try to create the object from the vtkObjectFactory
126   vtkObject* ret = vtkObjectFactory::CreateInstance("VTKViewer_NonIsometricTransform");
127   if(ret)
128     return (VTKViewer_NonIsometricTransform*)ret;
129   // If the factory was unable to create the object, then create it here.
130   return new VTKViewer_NonIsometricTransform;
131 }
132
133 VTKViewer_NonIsometricTransform::Function VTKViewer_NonIsometricTransform::GetFunctionType(const AxisFunction::Axis axis)
134 {
135   if ( m_axisFunctions[axis].getfFun() == &ident) {
136     return Identical;
137   }
138   if ( m_axisFunctions[axis].getfFun() == &Scl ) {
139     return Linear;
140   }
141   if ( m_axisFunctions[axis].getfFun() == &Log ) {
142     return Logarithmic;
143   }
144 }
145
146 double VTKViewer_NonIsometricTransform::GetCoeff  (const AxisFunction::Axis axis) 
147 {
148   return m_coeff[axis];
149 }