FilterNode.cxx
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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00042
00043
00044
00045 #include "../tool/disable4786.h"
00046
00047 #include "FilterNode.h"
00048 #include <math.h>
00049
00050
00051
00052
00053
00054 namespace ot {
00055
00056 FilterNode::FilterNode( const std::vector<float> & weights_, const Type & type_ )
00057 : Node(), weights( weights_ ), type( type_ )
00058 {
00059 }
00060
00061 int FilterNode::isEventGenerator()
00062 {
00063 return 1;
00064 }
00065
00066
00067
00068 void FilterNode::onEventGenerated( Event& event, Node& generator)
00069 {
00070 Node * queue = getChild( 0 );
00071 if( queue != NULL && queue->getSize() == weights.size() )
00072 {
00073 double w,sum = 0;
00074 double pos[3] = {0, 0, 0 }, orient[3] = { 0, 0, 0 };
00075 double conf = 0;
00076
00077
00078
00079 std::vector<float> &referencerot = queue->getEvent(0).getOrientation();
00080
00081 std::vector<float>::iterator it;
00082 for( it = weights.begin(); it != weights.end(); it++ )
00083 {
00084 Event & event = queue->getEvent( it - weights.begin());
00085 w = (*it);
00086
00087 if( type != ORIENTATION )
00088 {
00089
00090
00091
00092 pos[0] += event.getPosition()[0] * w;
00093 pos[1] += event.getPosition()[1] * w;
00094 pos[2] += event.getPosition()[2] * w;
00095 }
00096
00097 if( type != POSITION )
00098 {
00099
00100
00101
00102
00103
00104 if( MathUtils::dot(referencerot, event.getOrientation(), 4) < 0 )
00105 {
00106 event.getOrientation()[0] = -event.getOrientation()[0];
00107 event.getOrientation()[1] = -event.getOrientation()[1];
00108 event.getOrientation()[2] = -event.getOrientation()[2];
00109 event.getOrientation()[3] = -event.getOrientation()[3];
00110 }
00111
00112 double angle = acos( event.getOrientation()[3] );
00113 double as = sin( angle );
00114 if( as != 0 )
00115 as = angle * w / as;
00116 else
00117 as = 0;
00118 orient[0] += event.getOrientation()[0] * as;
00119 orient[1] += event.getOrientation()[1] * as;
00120 orient[2] += event.getOrientation()[2] * as;
00121 }
00122
00123
00124 conf += event.getConfidence() * w;
00125
00126 sum += w;
00127
00128 }
00129 if( type != POSITION )
00130 {
00131
00132
00133 w = sqrt((orient[0]*orient[0] + orient[1]*orient[1] + orient[2]*orient[2])/(sum*sum));
00134 double as = 0;
00135 if( w != 0)
00136 as = sin( w ) / w;
00137 localEvent.getOrientation()[0] = (float)(orient[0] * as);
00138 localEvent.getOrientation()[1] = (float)(orient[1] * as);
00139 localEvent.getOrientation()[2] = (float)(orient[2] * as);
00140 localEvent.getOrientation()[3] = (float)cos( w );
00141 MathUtils::normalizeQuaternion( localEvent.getOrientation() );
00142 }
00143 else
00144 {
00145 localEvent.getOrientation()[0] = event.getOrientation()[0];
00146 localEvent.getOrientation()[1] = event.getOrientation()[1];
00147 localEvent.getOrientation()[2] = event.getOrientation()[2];
00148 localEvent.getOrientation()[3] = event.getOrientation()[3];
00149 }
00150
00151 if( type != ORIENTATION )
00152 {
00153
00154 localEvent.getPosition()[0] = (float)pos[0];
00155 localEvent.getPosition()[1] = (float)pos[1];
00156 localEvent.getPosition()[2] = (float)pos[2];
00157 }
00158 else
00159 {
00160 localEvent.getPosition()[0] = event.getPosition()[0];
00161 localEvent.getPosition()[1] = event.getPosition()[1];
00162 localEvent.getPosition()[2] = event.getPosition()[2];
00163 }
00164
00165 localEvent.getConfidence() = (float)conf;
00166
00167 localEvent.time = event.time;
00168 localEvent.getButton() = event.getButton();
00169 updateObservers( localEvent );
00170 }
00171 else
00172 {
00173 updateObservers( event );
00174 }
00175 }
00176
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194