2016-12-05 2 views
1

Я хочу, чтобы что-то двигалось с плавным движением. Подумайте о лифте, он не достигает полной скорости и мертвой остановки, когда достигает желаемого уровня. Он работает так быстро, как может, и постепенно замедляется, пока не достигнет желаемого уровня.Простота функции движения (легкость в цифре) C++

мне нужна петля, которая вводит ...

int steps = 10; 
int target = 100; 

Так функция будет принимать десять шагов, чтобы достичь целевого значения 100.

В идеале эта функция должна действовать очень похоже на PID loop.

В сущности, я надеюсь, что есть более простой способ сделать это, чем создавать петлю ПИД-регулятора.

+0

Должен также мягкий старт? В этом случае я буду рекомендовать вам что-то вроде S-кривой https://en.wikipedia.org/wiki/S_Curve – Rama

ответ

2

Вы всегда можете сделать что-то более простое, чем PID, отрегулировав скорость, исходя из того, насколько вы близки (петля P, если хотите). Конечно, с фиксированным количеством шагов вам придется просто пройти остаток на последнем, но если он достаточно мал, это не должно быть большой проблемой.

Это всего лишь фиксированный процент расстояния, оставленного на каждом шагу, и процент зависит от того, насколько быстро вы хотите замедлить работу. В вашем примере, вы могли бы сделать что-то вроде 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 затем будет

#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; 
} 
Смежные вопросы