[ Video ]
[ About ]
Twitterで行われている #dailycodingchallenge にチャレンジしました。4月6日のお題は「漢字」です。
オブジェクトはお互いに反発しながら、近づくと線を引きます。中央には線の数を”漢字”で書かれます。
I took part in the #dailycodingchallenge on Twitter, and the theme for April 6th was “Kanji”.
The objects repel each other, drawing lines as they approach. In the center, the number of lines is written in “Kanji”.
[ Source ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#pragma once #include "ofMain.h" #include "ofxBox2d.h" class ofApp : public ofBaseApp { public: 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 windowResized(int w, int h) {}; void dragEvent(ofDragInfo dragInfo) {}; void gotMessage(ofMessage msg) {}; ofTrueTypeFont font; vector<string> words; float radius; ofxBox2d box2d; vector<shared_ptr<ofxBox2dCircle>> circles; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
#include "ofApp.h" //-------------------------------------------------------------- void ofApp::setup() { ofSetFrameRate(60); ofSetWindowTitle("openFrameworks"); ofBackground(239); ofSetColor(39); ofSetLineWidth(2); ofTrueTypeFontSettings font_settings("fonts/msgothic.ttc", 20); font_settings.antialiased = true; font_settings.addRanges(ofAlphabet::Japanese); this->font.load(font_settings); this->words = { u8"零", u8"壱", u8"弐", u8"参", u8"肆", u8"伍", u8"陸", u8"漆", u8"捌", u8"玖", u8"多", }; this->radius = 20; this->box2d.init(); this->box2d.setGravity(0, 0); this->box2d.createBounds(); this->box2d.setFPS(60); this->box2d.registerGrabbing(); for (int i = 0; i < 80; i++) { auto circle = make_shared<ofxBox2dCircle>(); circle->setPhysics(0.5, 0.63, 0.1); circle->setup(this->box2d.getWorld(), ofRandom(0, ofGetWidth()), ofRandom(0, ofGetHeight()), this->radius); this->circles.push_back(circle); } } //-------------------------------------------------------------- void ofApp::update() { ofSeedRandom(39); for (int i = 0; i < this->circles.size(); i++) { for (int j = i + 1; j < this->circles.size(); j++) { float distance = this->circles[i]->getPosition().distance(this->circles[j]->getPosition()); if (distance < this->radius * 4) { this->circles[i]->addForce(this->circles[i]->getPosition() - this->circles[j]->getPosition(), ofMap(distance, this->radius, this->radius * 4, 1.2, 0.002)); this->circles[j]->addForce(this->circles[j]->getPosition() - this->circles[i]->getPosition(), ofMap(distance, this->radius, this->radius * 4, 1.2, 0.002)); } } } this->box2d.update(); } //-------------------------------------------------------------- void ofApp::draw() { auto threshold = 80; vector<glm::vec2> locations; for (int i = 0; i < this->circles.size(); i++) { glm::vec2 location = this->circles[i]->getPosition(); locations.push_back(location); } for (auto& location : locations) { int word_index = 0; for (auto& other : locations) { if (location == other) { continue; } auto distance = glm::distance(location, other); if (distance < threshold) { if (word_index < words.size() - 1) { word_index++; } auto direction_rad = std::atan2(other.y - location.y, other.x - location.x); auto direction = direction_rad * RAD_TO_DEG; auto width = ofMap(distance, 0, threshold, 360, 0); ofNoFill(); ofBeginShape(); for (auto deg = direction - width * 0.5; deg <= direction + width * 0.5; deg++) { ofVertex(location.x + radius * cos(deg * DEG_TO_RAD), location.y + radius * sin(deg * DEG_TO_RAD)); } ofEndShape(); ofDrawLine(location + glm::vec2(radius * cos(direction * DEG_TO_RAD), radius * sin(direction * DEG_TO_RAD)), other + glm::vec2(radius * cos((180 + direction) * DEG_TO_RAD), radius * sin((180 + direction) * DEG_TO_RAD))); } } this->font.drawString(this->words[word_index], location.x - 12, location.y + 10); } } //-------------------------------------------------------------- int main() { ofSetupOpenGL(720, 720, OF_WINDOW); ofRunApp(new ofApp()); } |