robot

Dependencies:   FastPWM3 mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MathHelpers.cpp Source File

MathHelpers.cpp

00001 #include "MathHelpers.h"
00002 #include "math.h"
00003 
00004 float map(float x, float in_min, float in_max, float out_min, float out_max)
00005 {
00006     return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
00007 }
00008 
00009 float constrain(float in, float min, float max)
00010 {
00011     if(in > max) return max;
00012     if(in < min) return min;
00013     return in;
00014 }
00015 
00016 float constrain_norm(float *x, float *y, float coeffx, float coeffy, float max) {
00017     float norm = sqrtf(coeffx * *x * *x + coeffy * *y * *y);
00018     if (norm > max) {
00019         *x /= (norm / max);
00020         *y /= (norm / max);
00021     }
00022     return norm;
00023 }
00024 
00025 float fminf(float a, float b) {
00026     if(a < b) return a;
00027     return b;
00028 }
00029 
00030 float fmaxf(float a, float b) {
00031     if(a > b) return a;
00032     return b;
00033 }
00034 
00035 float update_filter(float old, float x, float str) {
00036     return str * old + (1.0f - str) * x;
00037 }
00038 
00039 float acbrt(float x0) {
00040     union { int ix; float x; };
00041 
00042     x = x0;
00043     ix = 0x2a5137a0 + ix / 3;
00044     x = 0.33333333f*(2.0f*x + x0 / (x * x));
00045 
00046     return x;
00047 }
00048 
00049 float aatan2(float q, float d) {
00050     if (q > 0.f && d < 0.f && -d < q) {
00051         return d * q / (q * q + 0.28125f * d * d);;
00052     }
00053     else if (q > 0.f && d < 0.f && -d > q) {
00054         return -M_PI / 2.f - d * q / (d * d + 0.28125f * q * q);;
00055     }
00056     else if (q < 0.f && d < 0.f && -d > -q) {
00057         return M_PI / 2.f - d * q / (d * d + 0.28125f * q * q);
00058     }
00059     else if (q < 0.f && d < 0.f && -d < -q) {
00060         return d * q / (q * q + 0.28125f * d * d);;
00061     }
00062     else if (q < 0.f && d > 0.f && d < -q) {
00063         return d * q / (q * q + 0.28125f * d * d);;
00064     }
00065     else if (q < 0.f && d > 0.f && d > -q) {
00066         return -M_PI / 2.f - d * q / (d * d + 0.28125f * q * q);;
00067     }
00068     else if (q > 0.f && d > 0.f && d > q) {
00069         return M_PI / 2.f - d * q / (d * d + 0.28125f * q * q);;
00070     }
00071     else {
00072         return d * q / (q * q + 0.28125f * d * d);;
00073     }
00074 }