2 #define _USE_MATH_DEFINES 1
13 #include <QtCore/QList>
20 #define LINEAR_INTERPOLATE(A,B,mPCAlpha) A+mPCAlpha*(B-A)
21 #define CLAMP_LOWER(A,B) if(A<B) A=B;
22 #define CLAMP_UPPER(A,B) if(A>B) A=B;
23 #define CLAMP(A, Lo, Hi) A=(A<Lo)?Lo:(A>Hi)?Hi:A;
33 static inline float Linear(
float y1,
float y2,
unsigned int pos,
unsigned int steps)
35 register float mu = (float) pos / (
float) steps;
36 return y1*(1.0-mu) + y2*mu;
39 static inline float Linear(
float y1,
float y2,
float mu)
41 return y1*(1.0-mu) + y2*mu;
44 static inline float Cosine(
float y1,
float y2,
unsigned int pos,
unsigned int steps)
46 register float mu = (float) pos / (
float) steps;
47 register float mu2 = (1-cos(mu*M_PI))/2;
48 return (y1*(1-mu2)+y2*mu2);
51 static inline float Cosine(
float y1,
float y2,
float mu)
53 register float mu2 = (1-cos(mu*M_PI))/2;
54 return (y1*(1-mu2)+y2*mu2);
57 static inline float Cubic(
float y1,
float y2,
float y3,
float y4,
float pos)
59 register float p = (y4-y3) - (y1-y2);
60 register float q = (y1-y2) - p;
61 register float r = y3 - y1;
62 register float s = y2;
64 return p*pow(pos, 3.0f) + q*pow(pos, 2.0f) + r*pos + s;
67 static inline void InterpolTo(std::vector<float> &v,
unsigned int length)
69 unsigned int i_pos1, i_pos2;
70 register float scale, pos;
73 scale = (float) (v.size()-1) / (length-1);
74 std::vector<float> newdata(length);
75 for (
unsigned int i=0; i<length-1; ++i)
77 i_pos2 = ceil(i * scale);
78 if (i_pos2 == i_pos1+2)
80 pos = (i * scale) - (i_pos1);
83 newdata[newdata.size()-1] = v[v.size()-1];
92 static inline std::vector<T>
ComputeDistance(std::vector<T> &v1, std::vector<T> &v2)
95 register T pos, newdata, scale;
97 const unsigned int v1_size = v1.size();
98 const unsigned int v2_size = v2.size();
100 if (v1_size == v2_size)
102 std::vector<T> returnvalue(v1_size);
103 for (
unsigned int i = 0; i < v1_size; ++i)
105 returnvalue[i] = abs(v1[i] - v2[i]);
109 else if (v1_size > v2_size)
111 scale = ((T) v2_size-1) / (v1_size-1);
112 std::vector<T> returnvalue(v1_size);
113 for (
unsigned int i = 0; i < v1_size-1; ++i)
115 i_pos2 = ceil(i * scale);
116 if (i_pos2 == i_pos1+2)
118 pos = (i * scale) - i_pos1;
120 returnvalue[i] = abs(v1[i]-newdata);
122 returnvalue[returnvalue.size()-1] = abs(v1[v1_size-1] - v2[v2_size-1]);
127 scale = ((T) v1_size-1) / (v2_size-1);
128 std::vector<T> returnvalue(v2_size);
129 for (
unsigned int i = 0; i < v2_size-1; ++i)
131 i_pos2 = ceil(i * scale);
132 if (i_pos2 == i_pos1+2)
134 pos = (i * scale) - i_pos1;
136 returnvalue[i] = abs(v2[i]-newdata);
138 returnvalue[returnvalue.size()-1] = abs(v2[v2_size-1] - v1[v1_size-1]);
143 static inline std::vector<float>
SummVerctors(
const std::vector<float> &v1,
const std::vector<float> &v2,
float div = 1)
146 register float pos, newdata, scale;
148 const unsigned int v1_size = (
unsigned int) v1.size();
149 const unsigned int v2_size = (
unsigned int) v2.size();
154 if (v1_size == v2_size)
156 std::vector<float> returnvalue(v1_size);
157 for (
unsigned int i = 0; i < v1_size; ++i)
158 returnvalue[i] = (v1[i] + v2[i])/div;
161 else if (v1_size > v2_size)
163 scale = ((float) v2_size-1) / (v1_size-1);
164 std::vector<float> returnvalue(v1_size);
165 for (
unsigned int i = 0; i < v1_size-1; ++i)
167 i_pos2 = ceil(i * scale);
168 if (i_pos2 == i_pos1+2)
170 pos = (i * scale) - i_pos1;
172 returnvalue[i] = (v1[i] + newdata)/div;
174 returnvalue[returnvalue.size()-1] = (v1[v1_size-1] + v2[v2_size-1])/div;
179 scale = ((float) v1_size-1) / (v2_size-1);
180 std::vector<float> returnvalue(v2_size);
181 for (
unsigned int i = 0; i < v2_size-1; ++i)
183 i_pos2 = ceil(i * scale);
184 if (i_pos2 == i_pos1+2)
186 pos = (i * scale) - i_pos1;
188 returnvalue[i] = (v2[i] + newdata)/div;
190 returnvalue[returnvalue.size()-1] = (v2[v2_size-1] + v1[v1_size-1])/div;
199 ab = abs(*std::min_element(v.begin(), v.end()));
200 max = abs(*std::max_element(v.begin(), v.end()));
209 register float offset, max;
213 if (max == 0) max = 1;
215 for (
unsigned int i=1;i<v.size();++i)
217 v[i] = (v[i] - offset) / max;
223 register float offset;
226 if (max == 0) max = 1;
228 for (
unsigned int i=1;i<v.size();++i)
230 v[i] = (v[i] - offset) / max;
237 if (max == 0.0f) max = 1;
239 for (
unsigned int i=0;i<v.size();++i)
247 if (max == 0.0f) max = 1;
249 for (
unsigned int i=0;i<v.size();++i)
258 register float returnvalue = 0.0f;
259 for (
unsigned int i=1;i<v.size();++i)
260 returnvalue += pow((abs(v[i])-mean), 2.0f);
261 return sqrt(returnvalue/(v.size()-1));
264 static inline float DistVector(
const QList<float> &l1,
const QList<float> &l2,
const float &length = 1.0f)
266 register float returnvalue = 0.0f;
267 for (
int i=0; i<l1.size(); ++i) {
268 returnvalue += pow( l1[i] - l2[i] / length, 2);
270 return sqrt(returnvalue);
273 static inline float DistVector(
const QList<float> &l1,
const QList<float> &l2,
const QList<float> &s1)
275 register float returnvalue = 0.0f;
276 for (
int i=0; i<l1.size(); ++i) {
277 returnvalue += pow( (l1.at(i) - l2.at(i)) / s1.at(i) + 0.00001f, 2);
279 return sqrt(returnvalue);
282 static inline float DistVectorWin(
const QList<QList<float>> &l1,
const QList<QList<float>> &l2,
const QList<QList<float>> &s1)
284 const int l1Size = l1.size();
285 float returnvalue = 0.0f;
286 for (
int w=0; w<l1Size; ++w) {
287 register float value = 0.0f;
288 const QList<float> &l1w = l1.at(w);
289 const QList<float> &l2w = l2.at(w);
290 const QList<float> &s1w = s1.at(w);
291 for (
int i=0; i<l1w.size(); ++i) {
292 value += pow( (l1w.at(i) - l2w.at(i)) / s1w.at(i) + 0.00001f, 2);
294 returnvalue += sqrt(value);
296 return returnvalue / l1Size;
300 static inline float AngleVector(
const QList<Key *> *l1,
const QList<float> *l2,
const float &length = 1.0f)
302 register float returnvalue = 0.0f;
304 for (
int i=0; i<(*l1).size(); ++i)
305 returnvalue += (*l1)[i]->getValue().toDouble() * ((*l2)[i] / length);
307 return (returnvalue/2.0f) + 0.5f;
327 static inline float DiceCoefficient(
const QList<Key *> *l1,
const QList<float> *l2,
const float &length)
329 register float returnvalue, div;
330 returnvalue = div = 0.0f;
331 for (
int i=0; i<(*l1).size(); ++i) {
332 div += (*l1)[i]->getValue().toDouble() + (*l2)[i] / length;
333 returnvalue += (*l1)[i]->getValue().toDouble() * ((*l2)[i] / length);
335 return 2.0f*returnvalue/div;
340 register float returnvalue = 0.0f;
341 foreach (
float elem, *l)
342 returnvalue += pow(elem, 2.0f);
343 return sqrt(returnvalue);
352 for (
int i = 0; i < l->size(); ++i)
353 (*l)[i] = (*l)[i] / length;
360 for (
int i = 0; i < l->size(); ++i)
361 (*l)[i] = (*l)[i] / length;
366 register float returnvalue = 0.0f;
367 foreach (
Key *elem, *l)
368 returnvalue += pow(elem->
getValue().toDouble(), 2);
369 return sqrt(returnvalue);
378 foreach (
Key *key, *l)
384 foreach (
Key *key, *l)
390 register float returnvalue = v[0];
391 for (
unsigned int i=1;i<v.size();++i)
392 returnvalue += abs(v[i]);
393 return returnvalue/v.size();
399 return (a < 0) == (b < 0);
408 std::stringstream str;
414 static inline int Find_Chr(
const std::string &ref,
const std::string &search,
int nbr,
const int pos)
421 return Find_Chr(ref, search, nbr, (
int) ref.find(search, pos+1));
427 register int returnvalue = 0;
428 for (
unsigned int i=0; i<str.length(); ++i)
430 if (std::binary_search(
set.begin(),
set.end(), str[i]))
448 unsigned int RetVal = 1;
461 return d<0?d-.5:d+.5;
464 static inline double Round(
double Zahl,
int Stellen)
466 double v[] = { 1, 10, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8 };
467 return floor(Zahl * v[Stellen] + 0.5) / v[Stellen];
478 return ctime(&rawtime);