Par passion je créé actuellement un framework pour les microcontrôleurs de la gamme avr Atmel, dans un premier temps pour le très connu atmega 328p, et j'ai besoin de votre aide pour simplifier une fonction d'interpolation que j'avais fait il y a quelques années déjà et que je traîne de langages de programmation en langages de programmation...
C'est une fonction qui permet d'interpoler des déplacements d'objets, des valeurs quelconques, ...
La voici:
- Code: Tout sélectionner
int32_t Math::curve (const double POSITION_START, const double POSITION_CURRENT, const double POSITION_END, const double INTERPOLATION_START, const double INTERPOLATION_END, const uint8_t CURVE)
{
double value = 0;
if (POSITION_CURRENT POSITION_START && POSITION_CURRENT INTERPOLATION_START)
{
if (CURVE == 0)
{
value = INTERPOLATION_START + ((INTERPOLATION_END - INTERPOLATION_START) / ((POSITION_END - POSITION_START) / (POSITION_CURRENT - POSITION_START)));
}
else if (CURVE == 1)
{
value = INTERPOLATION_START + (((INTERPOLATION_END - INTERPOLATION_START) / ((POSITION_END - POSITION_START) / (POSITION_CURRENT - POSITION_START))) / ((POSITION_END - POSITION_START) / (POSITION_CURRENT - POSITION_START)));
}
else if (CURVE == 2)
{
value = (INTERPOLATION_START + ((INTERPOLATION_END - INTERPOLATION_START) / ((POSITION_END - POSITION_START) / (POSITION_CURRENT - POSITION_START)))) + ((INTERPOLATION_END - (INTERPOLATION_START + ((INTERPOLATION_END - INTERPOLATION_START) / ((POSITION_END - POSITION_START) / (POSITION_CURRENT - POSITION_START))))) / ((POSITION_END - POSITION_START) / (POSITION_CURRENT - POSITION_START)));
}
else if (CURVE == 3)
{
if (POSITION_CURRENT - POSITION_START A1 && B1 A2)
{
if (CURVE == 0)
{
B2 = A2 + ((C2 - A2) / ((C1 - A1) / (B1 - A1)));
}
else if (CURVE == 1)
{
B2 = A2 + (((C2 - A2) / ((C1 - A1) / (B1 - A1))) / ((C1 - A1) / (B1 - A1)));
}
else if (CURVE == 2)
{
B2 = (A2 + ((C2 - A2) / ((C1 - A1) / (B1 - A1)))) + ((C2 - (A2 + ((C2 - A2) / ((C1 - A1) / (B1 - A1))))) / ((C1 - A1) / (B1 - A1)));
}
else if (CURVE == 3)
{
if (B1 - A1 < ((C1 - A1) / 2) + 0.5)
{
B2 = (A2 + (((C2 - ((C2 - A2) / 2)) - A2) / (((C1 - A1) / 2) / (B1 - A1)))) + (((C2 - ((C2 - A2) / 2)) - (A2 + (((C2 - ((C2 - A2) / 2)) - A2) / (((C1 - A1) / 2) / (B1 - A1))))) / (((C1 - A1) / 2) / (B1 - A1)));
}
else if (B1 - A1 == ((C1 - A1) / 2) + 0.5)
{
B2 = A2 + ((C2 - A2) / 2);
}
else
{
B2 = (A2 + ((C2 - A2) / 2)) + (((C2 - (A2 + ((C2 - A2) / 2))) / (((C1 - A1) / 2) / ((B1 - A1) - ((C1 - A1) / 2)))) / (((C1 - A1) / 2) / ((B1 - A1) - ((C1 - A1) / 2))));
}
}
else if (CURVE == 4)
{
if (B1 - A1 < ((C1 - A1) / 2) + 0.5)
{
B2 = A2 + (((C2 - A2) / (((C1 - A1) / 2) / (B1 - A1))) / ((C1 - A1) / (B1 - A1)));
}
else if (B1 - A1 == ((C1 - A1) / 2) + 0.5)
{
B2 = A2 + ((C2 - A2) / 2);
}
else
{
B2 = (A2 + ((C2 - A2) / (((C1 - A1) / 2) / ((B1 - A1) - ((C1 - A1) / 2))))) + ((C2 - (A2 + ((C2 - A2) / (((C1 - A1) / 2) / ((B1 - A1) - ((C1 - A1) / 2)))))) / ((C1 - A1) / (B1 - A1)));
}
}
}
else
{
if (CURVE == 0)
{
B2 = A2 - ((A2 - C2) / ((C1 - A1) / (B1 - A1)));
}
else if (CURVE == 1)
{
B2 = A2 - (((A2 - C2) / ((C1 - A1) / (B1 - A1))) / ((C1 - A1) / (B1 - A1)));
}
else if (CURVE == 2)
{
B2 = (A2 - ((A2 - C2) / ((C1 - A1) / (B1 - A1)))) - (((A2 - ((A2 - C2) / ((C1 - A1) / (B1 - A1)))) - C2) / ((C1 - A1) / (B1 - A1)));
}
else if (CURVE == 3)
{
if (B1 - A1 < ((C1 - A1) / 2) + 0.5)
{
B2 = (A2 - ((A2 - (C2 + ((A2 - C2) / 2))) / (((C1 - A1) / 2) / (B1 - A1)))) - (((A2 - ((A2 - (C2 + ((A2 - C2) / 2))) / (((C1 - A1) / 2) / (B1 - A1)))) - (C2 + ((A2 - C2) / 2))) / (((C1 - A1) / 2) / (B1 - A1)));
}
else if (B1 - A1 == ((C1 - A1) / 2) + 0.5)
{
B2 = A2 - ((A2 - C2) / 2);
}
else
{
B2 = (A2 - ((A2 - C2) / 2)) - ((((A2 - ((A2 - C2) / 2)) - C2) / (((C1 - A1) / 2) / ((B1 - A1) - ((C1 - A1) / 2)))) / (((C1 - A1) / 2) / ((B1 - A1) - ((C1 - A1) / 2))));
}
}
else if (CURVE == 4)
{
if (B1 - A1 < ((C1 - A1) / 2) + 0.5)
{
B2 = A2 - (((A2 - C2) / (((C1 - A1) / 2) / (B1 - A1))) / ((C1 - A1) / (B1 - A1)));
}
else if (B1 - A1 == ((C1 - A1) / 2) + 0.5)
{
B2 = A2 - ((A2 - C2) / 2);
}
else
{
B2 = (A2 - ((A2 - C2) / (((C1 - A1) / 2) / ((B1 - A1) - ((C1 - A1) / 2))))) - (((A2 - ((A2 - C2) / (((C1 - A1) / 2) / ((B1 - A1) - ((C1 - A1) / 2))))) - C2) / ((C1 - A1) / (B1 - A1)));
}
}
}
}
else
{
B2 = C2;
}
return B2 + 0.5;
}
