1 #include "../include/animorph/PoseTranslation.h"
2 #include <cstdio>
3 #ifdef DEBUG
4 #include <StopClock/StopClock.h>
5 #endif
6 
7 #define FF_VERTEX_N 10
8 
9 using namespace std;
10 using namespace Animorph;
11 
PoseTranslation()12 PoseTranslation::PoseTranslation()
13 : target(new Target()),
14   formFactor(1.0,1.0,1.0),
15   minAngle(0.0f),
16   maxAngle(0.0f),
17   normalize(false),
18   //inFilename(),
19   cat()
20 {
21 }
22 
load(const std::string & filename)23 bool PoseTranslation::load (const std::string& filename)
24 {
25   char tmp[MAX_LINE_BUFFER];
26   vector<int> tmpVector();
27   int ret = 0;
28 
29   bool rc = true; // assume "success" by default
30 
31   // get the current locale
32   char *locale = ::setlocale (LC_NUMERIC, NULL);
33 
34   // set it to "C"-Style ( the . (dot) means the decimal marker for floats)
35   ::setlocale (LC_NUMERIC, "C");
36 
37   // info file
38   FILE *fd = fopen ((filename+".info").c_str(), "r");
39 
40   if (fd == NULL)
41     return false;
42 
43   // form factor
44   fgets(tmp, MAX_LINE_BUFFER,fd);
45   if (tmp == NULL) // end of file reached?
46       return false;
47 
48   ret = sscanf (tmp, "%f,%f,%f", &originalSize[0], &originalSize[1], &originalSize[2]);
49 
50   if (ret == EOF) // end of file reached?
51       return false;
52 
53   fgets(tmp, MAX_LINE_BUFFER,fd);
54   if (tmp == NULL) // end of file reached?
55       return false;
56 
57   ret = sscanf (tmp, "%f,%f", &minAngle, &maxAngle);
58 
59   if (ret == EOF) // end of file reached?
60     return false;
61 
62   fclose(fd);
63 
64   // reset locale after file was written
65   ::setlocale (LC_NUMERIC, locale);
66 
67   if(!target->load(filename))
68       return false;
69 
70   return rc;
71 }
72 
calcFormFactor(const VertexVector & vertexvector)73 void PoseTranslation::calcFormFactor(const VertexVector& vertexvector)
74 {
75   multiset<float> minXSet, maxXSet;
76   multiset<float> minYSet, maxYSet;
77   multiset<float> minZSet, maxZSet;
78 
79   int counter = 0;
80   int n_vertex = FF_VERTEX_N;
81   float minX = 0, maxX = 0;
82   float minY = 0, maxY = 0;
83   float minZ = 0, maxZ = 0;
84   pair< set<float>::iterator, bool > pr;
85 
86   Target &tmpTarget = getTarget();
87 
88   if(tmpTarget.size() < (FF_VERTEX_N * 2))
89   {
90     n_vertex = (int)(tmpTarget.size() / 2);
91   }
92 
93   for (Target::const_iterator target_it = tmpTarget.begin ();
94        target_it != tmpTarget.end ();
95        target_it++)
96   {
97     const TargetData &td(*target_it);
98     if(counter < n_vertex)
99     {
100       minXSet.insert(vertexvector[td.vertex_number].co.x);
101       maxXSet.insert(vertexvector[td.vertex_number].co.x);
102 
103       minYSet.insert(vertexvector[td.vertex_number].co.y);
104       maxYSet.insert(vertexvector[td.vertex_number].co.y);
105 
106       minZSet.insert(vertexvector[td.vertex_number].co.z);
107       maxZSet.insert(vertexvector[td.vertex_number].co.z);
108 
109       counter++;
110     }
111     else
112     {
113       if(vertexvector[td.vertex_number].co.x < *(--minXSet.end()))
114       {
115         minXSet.insert(vertexvector[td.vertex_number].co.x);
116         minXSet.erase( -- (minXSet.end()) );
117       }
118       if(vertexvector[td.vertex_number].co.x > *(maxXSet.begin()))
119       {
120         maxXSet.insert(vertexvector[td.vertex_number].co.x);
121         maxXSet.erase(maxXSet.begin());
122       }
123 
124       if(vertexvector[td.vertex_number].co.y < *(--minYSet.end()))
125       {
126         minYSet.insert(vertexvector[td.vertex_number].co.y);
127         minYSet.erase( -- (minYSet.end()) );
128       }
129       if(vertexvector[td.vertex_number].co.y > *(maxYSet.begin()))
130       {
131         maxYSet.insert(vertexvector[td.vertex_number].co.y);
132         maxYSet.erase(maxYSet.begin());
133       }
134 
135       if(vertexvector[td.vertex_number].co.z < *(--minZSet.end()))
136       {
137         minZSet.insert(vertexvector[td.vertex_number].co.z);
138         minZSet.erase( -- (minZSet.end()) );
139       }
140       if(vertexvector[td.vertex_number].co.z > *(maxZSet.begin()))
141       {
142         maxZSet.insert(vertexvector[td.vertex_number].co.z);
143         maxZSet.erase(maxZSet.begin());
144       }
145     }
146   }
147 
148   for(multiset<float>::const_iterator it = minXSet.begin();
149       it != minXSet.end();
150       it++)
151   {
152     minX += (*it);
153   }
154   for(multiset<float>::const_iterator it = maxXSet.begin();
155       it != maxXSet.end();
156       it++)
157   {
158     maxX += (*it);
159   }
160 
161   for(multiset<float>::const_iterator it = minYSet.begin();
162       it != minYSet.end();
163       it++)
164   {
165     minY += (*it);
166   }
167   for(multiset<float>::const_iterator it = maxYSet.begin();
168       it != maxYSet.end();
169       it++)
170   {
171     maxY += (*it);
172   }
173 
174   for(multiset<float>::const_iterator it = minZSet.begin();
175       it != minZSet.end();
176       it++)
177   {
178     minZ += (*it);
179   }
180   for(multiset<float>::const_iterator it = maxZSet.begin();
181       it != maxZSet.end();
182       it++)
183   {
184     maxZ += (*it);
185   }
186 
187   int xsize = maxXSet.size();
188   int ysize = maxYSet.size();
189   int zsize = maxZSet.size();
190 
191   formFactor = Vector3f(
192     (maxX/xsize - minX/xsize)/originalSize[0],
193     (maxY/ysize - minY/ysize)/originalSize[1],
194     (maxZ/zsize - minZ/zsize)/originalSize[2]
195     );
196 }
197 
198