gotutiyan’s blog

競技プログラミングをやったりopenframeworksでお絵かきをしたりしています。

多重螺旋

螺旋階段が何重にもなっている印象を受けたのでこの題名に。
本当は別のイメージで作成していましたが、思いがけず良い感じになったので採用。


変数limitが四角の大きさを決めています。またtimeは四角が現れるタイミングを指定しています。limitもtimeも、10種類あり、合計100個の四角をうまく操作できるようにしています。
また、描画する様子をよく眺めると、それぞれ異なる大きさを持った10個の四角が同時に現れ、膨張する中で自分の大きさになれば離脱していくようになっています。

ソースは以下の通りです。

#include "ofApp.h"
#define rep(i,j,k) for(int i=j;i<k;i++)

ofEasyCam cam;
class BoxBox{
    public :
    float speed=10,limit=100,time,size=0;
    
    void init(float exlimit,float extime){
        time=extime;
        limit=exlimit;
    }
    
    void move(){
        //timeより累計フレーム数が大きい かつ limitよりも辺の長さ(size)が小さい間、四角のサイズが大きくなる。
        if (ofGetFrameNum()>time && size<limit) {
            size++;
        }
        ofPushMatrix();
        ofRotate(ofGetFrameNum()+time);
        ofDrawRectangle(-size/2,-size/2,size,size);
        ofPopMatrix();
    }
};

vector<BoxBox> v(100);
void ofApp::setup(){
    ofSetFrameRate(60);
    ofNoFill();
    ofSetBackgroundColor(0);
    ofSetColor(255);
    
    rep(i,0,10)rep(j,0,10)v[i*10+j].init(i*50+j*5,j*100);
}

void ofApp::update(){
    
}

void ofApp::draw(){
    cam.begin();
    rep(i,0,v.size())v[i].move();
    cam.end();
}

ちなみに完成形、ちょっとだけ錯覚になっていて、見ているとぐにゃんぐにゃんします。多分。
f:id:gotutiyan:20180324171631p:plain