[work 37] Ripple
Movie
Source code
about
- 波紋
- 標準偏差を用いてウィンドウ中心付近で波紋が現れるようにする
file
- 上部にあるファイル名が表示されているボタンを押すと、表示されるファイルが切り替わります
- 別ウィンドウ表示したい時や行番号などが無いRawMode表示したい時は、コード内右上のボタンを押してください(ボタンはマウスオーバーすると表示されます)
#include "ofMain.h" #include "ofApp.h" //================================ int main( ){ // 4K:4096x2160 // 2K:2048x1080 // FullHD:1920x1080 // HD:1440x1080 // HD720p:1280x720 // DVD:720x480 // setup the GL context // ofSetupOpenGL(1280,720, OF_WINDOW); ofSetupOpenGL(1024,1024, OF_WINDOW); // this kicks off the running of my app // can be OF_WINDOW or OF_FULLSCREEN // pass in width and height too: ofRunApp( new ofApp()); }
#pragma once #include "ofMain.h" #include "Ripple.hpp" #include <random> class ofApp : public ofBaseApp{ public: ofApp(); ~ofApp(); void setup(); void update(); void draw(); void keyPressed(int key); void keyReleased(int key); void mouseMoved(int x, int y); void mouseDragged(int x, int y, int button); void mousePressed(int x, int y, int button); void mouseReleased(int x, int y, int button); void mouseEntered(int x, int y); void mouseExited(int x, int y); void windowResized(int w, int h); void dragEvent(ofDragInfo dragInfo); void gotMessage(ofMessage msg); private: std::vector<shared_ptr<Ripple>> ripples; };
#include "ofApp.h" ofApp::ofApp(){ } ofApp::~ofApp(){ } //-------------------------------------------------------------- void ofApp::setup(){ double fps = 30; ofSetFrameRate(fps); ofBackground(0); ofSetBackgroundAuto(true); ofSetVerticalSync(true); } //-------------------------------------------------------------- void ofApp::update(){ if ((int)ofRandom(0, 9) == 0) { std::random_device seed_gen; std::default_random_engine engine(seed_gen()); std::normal_distribution<> dist(0.0, 1.0); float x = ofMap((float)dist(engine), -5, 5, 0, ofGetWidth(), true); float y = ofMap((float)dist(engine), -5, 5, 0, ofGetHeight(), true); ripples.push_back(make_shared<Ripple>(ofVec2f(x, y))); ripples.back()->setup(); } for (shared_ptr<Ripple> &r : ripples) { r->update(); } ofRemove(ripples, Ripple::shouldRemoveRipple); } //-------------------------------------------------------------- void ofApp::draw(){ for (shared_ptr<Ripple> &r : ripples) { r->display(); } }
#ifndef Ripple_hpp #define Ripple_hpp #include <stdio.h> #include "ofMain.h" class Ripple { public: Ripple(ofVec2f c); ~Ripple(); void setup(); void update(); void display(); bool isFinish(); static bool shouldRemoveRipple(shared_ptr<Ripple> &r); private: int time; ofVec2f center; int rippleMax; int radiusMax; std::vector<int> radius; bool finish; }; #endif /* Ripple_hpp */
#include "Ripple.hpp" bool Ripple::shouldRemoveRipple(shared_ptr<Ripple> &r) { return r->isFinish(); } Ripple::Ripple(ofVec2f c) { std::cout << "Ripple:start" << std::endl; center = c; } Ripple::~Ripple() { std::cout << "Ripple:end" << std::endl; } void Ripple::setup() { time = 0; rippleMax = 10; radiusMax = 100; radius.push_back(0); finish = false; } void Ripple::update() { if ((time % 10 == 0) && (radius.size() < rippleMax)) { radius.push_back(0); } time++; for (int &r : radius) { r += 1; } if (radius.size() == rippleMax) { if (radius.at(rippleMax-1) >= radiusMax) { finish = true; } } } void Ripple::display() { for (int r : radius) { ofPushMatrix(); ofTranslate(center.x, center.y); ofNoFill(); ofSetColor(ofColor(255), ofMap(radiusMax - r, 0, radiusMax, 0, 255, true)); ofDrawCircle(0, 0, r); ofPopMatrix(); } } bool Ripple::isFinish() { return finish; }
Link to the reference page
ソースコードで使用したAPIの中から要点になりそうなものをいくつか選んでリストアップしました。
category | API/Lib |
openframeworks | ofRemove |
c++ | std::default_random_engine |
Development environment
- openframeworks 0.10.1
- c++
- macOS
- Xcode