[work 23] Rotate Grid

[work 23] Rotate Grid

Movie

Source code

about

  • 10×10のグリッドを作成
  • ランダムに選択したグリッドを回転させる
  • ランダムに回転軸(0度、45度、90度)を選択

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);

	// 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 "Grid.hpp"


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::unique_ptr<Grid> grid;
};
#include "ofApp.h"


ofApp::ofApp(){
    
}

ofApp::~ofApp(){
}

//--------------------------------------------------------------
void ofApp::setup(){
    double fps = 30;
    
    ofSetFrameRate(fps);
    ofBackground(217,229,240);
    ofSetBackgroundAuto(true);
    
    grid = make_unique<Grid>();
}

//--------------------------------------------------------------
void ofApp::update(){
    grid->update();
}

//--------------------------------------------------------------
void ofApp::draw(){
    ofPushMatrix();
    ofTranslate(340,110);
    grid->display();
    ofPopMatrix();
}
#ifndef Grid_hpp
#define Grid_hpp

#define USE_MYCOLOR (0)


#include <stdio.h>
#include "ofMain.h"

#if USE_MYCOLOR
#include "myColorLib.hpp"
#endif


struct RotateGrid {
    ofVec2f idx;
    ofVec3f axis;
    float angle;
    ofColor color;
};


class Grid {
public:
    Grid();
    ~Grid();
    void update();
    void display();
private:
    void delRotateGrid();
    
    int rowSize;
    int colSize;
    int gridSize;
    int angle;
    std::list<RotateGrid> rGrid;
#if USE_MYCOLOR
    std::unique_ptr<myColorLib> myCol;
#endif
};
#endif /* Grid_hpp */
#include "Grid.hpp"


Grid::Grid()
{
    rowSize = 10;
    colSize = 10;
    gridSize = 50;
    angle = 0;
#if USE_MYCOLOR
    myCol = make_unique<myColorLib>(MYCOL_SELECT);
#endif
}


Grid::~Grid()
{
    
}


void Grid::update()
{
    bool push = true;
    RotateGrid r;
    r.idx = ofVec2f((int)ofRandom(0, colSize), (int)ofRandom(0, rowSize));
    int x = ofRandom(1) < 0.5 ? 0 : 1;
    int y = ofRandom(1) < 0.5 ? 0 : 1;
    int z = 0;
    r.axis = ofVec3f(x, y, z);
    r.angle = 0;
#if USE_MYCOLOR
    r.color = myCol->getColor(ofRandom(1));
#else
    ofColor c;
    c.setHsb(ofRandom(255), ofRandom(255), ofRandom(255));
    r.color = c;
#endif
    
    if (!rGrid.empty()) {
        auto itr = rGrid.begin();
        while(itr != rGrid.end()) {
            if (((*itr).idx.x == r.idx.x) && ((*itr).idx.y) == r.idx.y) {
                push = false;
                break;
            }
            ++itr;
        }
    }
    
    if ((ofGetFrameNum() % 5 == 0) && push && (rGrid.size() < 30)) {
        rGrid.push_back(r);
    }
    
    for (RotateGrid &r : rGrid) {
        r.angle += 1;
    }
    
    delRotateGrid();
}


void Grid::display()
{
    for (int y = 0; y < rowSize; y++) {
        for (int x = 0; x < colSize; x++) {
            ofPushMatrix();
            ofTranslate(gridSize/2 + (x * gridSize), gridSize/2 + (y * gridSize), 0);
            ofNoFill();
            ofSetColor(91, 96, 104);
            for (RotateGrid r : rGrid) {
                if (((int)r.idx.x == x) && ((int)r.idx.y == y)) {
                    ofRotateDeg(r.angle, r.axis.x, r.axis.y, r.axis.z);
                    ofFill();
                    ofSetColor(r.color);
                }
            }
            ofSetRectMode(OF_RECTMODE_CENTER);
            ofDrawRectangle(0, 0, 0, gridSize, gridSize);
            ofPopMatrix();
        }
    }
}


void Grid::delRotateGrid()
{
    auto itr = rGrid.begin();
    while(itr != rGrid.end()) {
        if ((*itr).angle > 180) {
            itr = rGrid.erase(itr);
        } else {
            ++itr;
        }
        
        if (rGrid.empty()) {
            break;
        }
    }
}

Link to the reference page

ソースコードで使用したAPIの中から要点になりそうなものをいくつか選んでリストアップしました。

categoryAPI/Lib
openframeworksofAppRunner ofGetFrameNum
openframeworksofGraphics ofRotateDeg

Development environment

  • openframeworks 0.10.1
  • c++
  • macOS
  • Xcode