「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

Oscillation Amplitude and Period | Nature of Code


  • Amplitude: The distance from the center of motion to either extreme
  • Period: The amount of time it takes for one complete cycle of motion

単純なサイン波で当てはめてみると

  • Amplitude|-1〜1
    ※コンピュータ内での単位はpixel
  • Period|1回に要する時間。realtimeな世界では2*PI[rad]と示すが、コンピュータの世界ではフレームレートで表現する。

    例)30フレーム、50フレームなど。

float amplitude = 100; //100ピクセル
float period = 120; //oscillating motion should repeat every 120 frames.

ここまででamplitudeとframe rateが必要な事がわかったので、基本となる式を定義していこう。

float x = amplitude * cos(TWO_PI * frameCount / period);

この中でamplitudeとcosについては特に理解に問題はない。TWO_PI * frameCount / periodについて注視してみる。cosは0からスタートして2PI radian毎にリピートする。2PI, 4PI, 6PI… periodが120という事は、oscillating motion を120, 240, 360フレーム毎にリピートしたいという事を示している。frameCountは毎フレーム毎にインクリメントされるものとすると、frameCount / periodはが意味する事は、ある瞬間において途中なのか?あるいは2周期目なのでcompleteしているのか?というように、何周期で1つのoscllationが終了するのか?を示している。別の単位として良く使われる周波数Frequencyがある。1秒間に何周期かを示すもの。Frequency = 1 / period. なので、1/120分の処理もしくは値(1/120)が毎フレームで作用する。

#include 'testApp.h'


float amplitude = 100;
float period = 120;
float freq = 1 / period;

//--------------------------------------------------------------
void testApp::setup(){
    
    ofSetFrameRate(60);
    ofEnableSmoothing();
    ofSetVerticalSync(true);
    ofBackground(0);
}

//--------------------------------------------------------------
void testApp::update(){
    
}

//--------------------------------------------------------------
void testApp::draw(){
    
    float frameCount = ofGetFrameNum();
    
    ofPushMatrix();
    
    float x = amplitude * cos(TWO_PI * frameCount / period);
  
    //using Frequency
    //    float x = amplitude * cos(TWO_PI * freq * frameCount);
    
    ofTranslate(ofGetWidth()*0.5, ofGetHeight()*0.5);
    ofLine(0, 0, x, 0);
    ofPopMatrix();
}