2016-12-05 9 views
1

滑らかな動きで何か動きたい。エレベーターについて考えてみましょう。希望の階に達すると、完全なスピードとデッドストップはありません。可能な限り速く進み、希望のフロアに達するまで徐々に減速します。動きの容易さ関数(簡単に番号を付ける)C++

私はそう関数が理想的には、この機能は非常にPID loopのように行動しなければならない100

の目標値に到達するために10個のステップを取るだろう...

int steps = 10; 
int target = 100; 

を入力ループを必要としています。

本質的には、PIDループを作成するより簡単な方法があると思います。

+0

ソフトスタートも必要ですか?その場合、私はSカーブのようなものをお勧めしますhttps://en.wikipedia.org/wiki/S_Curve – Rama

答えて

2

あなたはいつも近くにあるかに基づいて速度を調整することで、PIDより簡単なことを行うことができます。もちろん、一定のステップ数で、最後のステップで残りの部分を実行しなければなりませんが、それが十分小さければ大きな問題ではありません。

これはちょうど各ステップを離れた距離の一定のパーセンテージになり、パーセンテージはどれくらい速く減速したいかによって決まります。あなたの例では、あなたが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 

0から開始し、目標値Nに行くためのコードは、その後、私はIluvatarの正確礼儀必要何

#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

これはまさに私が探しているものです、なぜ私の脳が好きではないのか分かりません私は今日、どのように方程式に書いていますか?数学はちょうど私に来ていません:/ – CTOverton

+0

基本的に 'N-N * frac^i'は' frac'が増加率です。 – Iluvatar

+1

これは完璧なおかげです! – CTOverton

1

だろう。 ..

#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; 
} 
関連する問題