OscillatorConstraint.inl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef SOFA_COMPONENT_CONSTRAINT_OSCILLATORCONSTRAINT_INL
00026 #define SOFA_COMPONENT_CONSTRAINT_OSCILLATORCONSTRAINT_INL
00027
00028 #include <sofa/component/constraint/FixedConstraint.inl>
00029 #include <sofa/component/constraint/OscillatorConstraint.h>
00030 #include <math.h>
00031
00032 namespace sofa
00033 {
00034
00035 namespace component
00036 {
00037
00038 namespace constraint
00039 {
00040
00041 using namespace sofa::defaulttype;
00042
00043 template <class DataTypes>
00044 OscillatorConstraint<DataTypes>::OscillatorConstraint()
00045 : core::componentmodel::behavior::Constraint<DataTypes>(NULL)
00046 , constraints(initData(&constraints,"oscillators","Define a sequence of oscillating particules: \n[index, mean, amplitude, pulsation, phase]"))
00047 {
00048 }
00049
00050
00051 template <class DataTypes>
00052 OscillatorConstraint<DataTypes>::OscillatorConstraint(core::componentmodel::behavior::MechanicalState<DataTypes>* mstate)
00053 : core::componentmodel::behavior::Constraint<DataTypes>(mstate)
00054 , constraints(initData(&constraints,"oscillators","Define a sequence of oscillating particules: \n[index, Mean(x,y,z), amplitude(x,y,z), pulsation, phase]"))
00055 {
00056 }
00057
00058 template <class DataTypes>
00059 OscillatorConstraint<DataTypes>::~OscillatorConstraint()
00060 {
00061 }
00062
00063 template <class DataTypes>
00064 OscillatorConstraint<DataTypes>* OscillatorConstraint<DataTypes>::addConstraint(unsigned index, const Coord& mean, const Deriv& amplitude, Real pulsation, Real phase)
00065 {
00066 this->constraints.beginEdit()->push_back( Oscillator(index,mean,amplitude,pulsation,phase) );
00067 return this;
00068 }
00069
00070
00071 template <class DataTypes>
00072 void OscillatorConstraint<DataTypes>::projectResponse(VecDeriv& res)
00073 {
00074 const helper::vector< Oscillator > &oscillators = constraints.getValue();
00075
00076 for( unsigned i=0; i<oscillators.size(); ++i )
00077 {
00078 const unsigned& index = oscillators[i].index;
00079
00080
00081
00082
00083
00084 res[index] = Deriv();
00085 }
00086 }
00087
00088 template <class DataTypes>
00089 void OscillatorConstraint<DataTypes>::projectVelocity(VecDeriv& res)
00090 {
00091 const helper::vector< Oscillator > &oscillators = constraints.getValue();
00092 Real t = (Real) getContext()->getTime();
00093 for( unsigned i=0; i<oscillators.size(); ++i )
00094 {
00095 const unsigned& index = oscillators[i].index;
00096 const Deriv& a = oscillators[i].amplitude;
00097 const Real& w = oscillators[i].pulsation;
00098 const Real& p = oscillators[i].phase;
00099
00100 res[index] = a*w*cos(w*t+p);
00101 }
00102 }
00103
00104 template <class DataTypes>
00105 void OscillatorConstraint<DataTypes>::projectPosition(VecCoord& res)
00106 {
00107 const helper::vector< Oscillator > &oscillators = constraints.getValue();
00108 Real t = (Real) getContext()->getTime();
00109
00110 for( unsigned i=0; i<oscillators.size(); ++i )
00111 {
00112 const unsigned& index = oscillators[i].index;
00113 const Coord& m = oscillators[i].mean;
00114 const Deriv& a = oscillators[i].amplitude;
00115 const Real& w = oscillators[i].pulsation;
00116 const Real& p = oscillators[i].phase;
00117
00118 res[index] = m + a*sin(w*t+p);
00119 }
00120 }
00121
00122
00124
00125
00126
00127
00128
00129 }
00130
00131 }
00132
00133 }
00134
00135 #endif