Shape - "Alignment"

4 篇文章 0 订阅
2 篇文章 0 订阅

 


 


  




#include "ofxSVG.h"

ofxSVG* currentShape;
vector<ofxSVG> shapes;

int     tileCount = 5;
float   tileWidth, tileHeight;

float   shapeSize = 50;
float   newShapeSize = shapeSize;
float   shapeAngle = 0;
ofColor shapeColor(0, 130, 164);

float   maxDist;

int fillMode = 0;
int sizeMode = 0;


//--------------------------------------------------------------
void testApp::setup(){
    
    ofBackground(255);
    ofEnableSmoothing();
    
    tileWidth   = ofGetWidth()/(float)tileCount;
    tileHeight  = ofGetHeight()/(float)tileCount;
    maxDist     = sqrt((float)ofGetWidth()*ofGetWidth()+ofGetHeight()*ofGetHeight());
    
    // load shapes
    ofDirectory dir;
    int n = dir.listDir("shapes");
    for (int i = 0; i < n; i++ ) {
        shapes.push_back(ofxSVG());
        shapes.back().load(dir.getPath(i));
        
        for (int i = 0; i < shapes.back().getNumPath(); i++ ) {
            shapes.back().getPathAt(i).setUseShapeColor(false);
        }
    }
    currentShape = &shapes[0];
}

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

}

//--------------------------------------------------------------
void testApp::draw(){
    
    ofEnableAlphaBlending();
    
    for (int gridY = 0; gridY < tileCount; gridY++ ) {
        for (int gridX = 0; gridX < tileCount; gridX++ ) {
            
            // calculate grid position
            float posX = tileWidth * gridX + tileWidth*0.5;
            float posY = tileHeight * gridY + tileHeight*0.5;
            
            float dist = ofDist(mouseX, mouseY, posX, posY);
            
            // calculate angle between mouse position and actual position of the shape
            float angle = atan2(mouseY-posY, mouseX-posX) + ofDegToRad(shapeAngle);
            
            // size mode
            if ( sizeMode == 0 ) newShapeSize = shapeSize;
            if ( sizeMode == 1 ) newShapeSize = shapeSize*1.5 - ofMap(dist, 0, 500/*Radius*/, 5, shapeSize);
            if ( sizeMode == 2 ) newShapeSize = ofMap(dist, 0, 500/*Radius*/, 5, shapeSize);
            
            // fill mode ( always use SVG style, seems SVGtiny don't have func to disable )
            if ( fillMode == 0 ) ofSetColor(0);
            if ( fillMode == 1 ) ofSetColor( shapeColor );
            if ( fillMode == 2 ) ofSetColor( shapeColor, ofMap(dist, 0, maxDist, 255, 0));
            if ( fillMode == 3 ) ofSetColor( shapeColor, ofMap(dist, 0, maxDist, 0, 255));
            
            // draw shape
            ofPushMatrix();
            ofTranslate(posX, posY);
            ofRotate(ofRadToDeg(angle));
            
            // there is no CENTER MODE and size setting in SVGtiny, so use scale
            ofScale(newShapeSize/shapeSize, newShapeSize/shapeSize);
            
            currentShape->draw();
            ofPopMatrix();
            
            
        }
    }
    
}

//--------------------------------------------------------------
void testApp::keyPressed(int key){
    if ( key == 'c' ) fillMode = (fillMode+1)%4;
    if ( key == 'd' ) sizeMode = (sizeMode+1)%3;
    
    if ( key == 'g' ) {
        tileCount = tileCount+5;
        if ( tileCount > 20 ) tileCount = 10;
        tileWidth   = ofGetWidth()/(float)tileCount;
        tileHeight  = ofGetHeight()/(float)tileCount;
    }
    
    if (key == '1') currentShape = &shapes[0];
    if (key == '2') currentShape = &shapes[1];
    if (key == '3') currentShape = &shapes[2];
    if (key == '4') currentShape = &shapes[3];
    if (key == '5') currentShape = &shapes[4];
    if (key == '6') currentShape = &shapes[5];
    if (key == '7') currentShape = &shapes[6];

    if (key == OF_KEY_UP    ) shapeSize +=5;
    if (key == OF_KEY_DOWN  ) shapeSize = max(shapeSize-5, 5);
    if (key == OF_KEY_LEFT  ) shapeAngle -=5;
    if (key == OF_KEY_RIGHT ) shapeAngle +=5;

	if ( key == ' ' )
	{
		shapeColor.r = ofRandom(0, 255);
		shapeColor.g = ofRandom(0, 255);
		shapeColor.b = ofRandom(0, 255);
	}

}

-GENERATIVE DESIGN-

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值