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