2016-12-05 1 views
1

Je veux faire bouger quelque chose avec un mouvement fluide. Pensez à un ascenseur, il ne va pas à pleine vitesse et arrêt mort quand il atteint le plancher désiré. Il va aussi vite que possible et ralentit progressivement jusqu'à ce qu'il atteigne le plancher désiré.Facilité de la fonction de mouvement (Facilité à numéroter) C++

je besoin d'une boucle entrées ...

int steps = 10; 
int target = 100; 

Ainsi la fonction prendra dix étapes pour atteindre la valeur cible de 100.

Idéalement, cette fonction doit agir très semblable à un PID loop.

Essentiellement, j'espère qu'il y a un moyen plus facile d'accomplir cela que de créer une boucle PID.

+0

Il devrait également démarrer en douceur? Dans ce cas, je vais vous recommander quelque chose comme la courbe en S https://en.wikipedia.org/wiki/S_Curve – Rama

Répondre

2

Vous pouvez toujours faire quelque chose de plus simple que PID en ajustant votre vitesse en fonction de votre proximité (une boucle P, si vous voulez). Bien sûr, avec un nombre fixe d'étapes, vous devrez simplement faire le reste sur le dernier, mais si c'est assez petit, cela ne devrait pas être un gros problème.

Cela équivaut juste à un pourcentage fixe de la distance restante à chaque étape, et le pourcentage dépend de la vitesse à laquelle vous voulez ralentir. Dans votre exemple, vous pouvez faire quelque chose comme 40%:

{0., 40., 64., 78.4, 87.04, 92.224, 95.3344, 97.2006, 98.3204, 98.9922} 
{0, 40, 64, 78, 87, 92, 95, 97, 98, 100} after rounding 

Le code pour commencer à 0 et aller à une valeur cible N serait alors

#include <math.h> 
... 
int steps[NUM_STEPS]; 
for (int i = 0; i < NUM_STEPS - 1; i++) { 
    steps[i] = N - N * pow(.6, i); 
} 
steps[NUM_STEPS - 1] = N; 
+0

C'est exactement ce que je cherche, je ne sais pas pourquoi mon cerveau ne favorise pas moi aujourd'hui, mais comment écririez-vous cela dans une équation? Le calcul ne vient tout simplement pas à moi:/ – CTOverton

+0

Fondamentalement juste 'N-N * frac^i' où' frac' est le taux d'augmentation. – Iluvatar

+1

C'est parfait merci beaucoup! – CTOverton

1

Ce que je avais besoin exactement avec la permission de Iluvatar. ..

#include <math.h> 
using namespace std; 

int main() 
{ 
    void smooth(int, int, float); 

    smooth(10, 100, 0.6); 

    return 0; 
} 

void smooth(int steps, int target, float increment) { 
    for (int i = 0; i < steps - 1; i++) { 
     int num = target - target * pow(increment, i); 
     cout << num << endl; 
    } 
    cout << target << endl; 
}