今回はopenFrameworksで、数学の関数を利用した曲線を色々と描いてみたいと思います。
まずはsinとcosを使った円の描写
//--------------------------------------------------------------
void testApp::setup(){
ofBackground(0, 0, 0);
}
//--------------------------------------------------------------
void testApp::update(){
}
//--------------------------------------------------------------
void testApp::draw(){
ofTranslate(ofGetWidth()/2, ofGetHeight()/2);//原点を画面の中心に
//方眼紙
int lines=ofGetWidth()/2/20+1;
ofSetColor(70, 70, 70);
for (int i=0; i < lines; i++) {
ofLine(20*i, -1*ofGetHeight()/2, 20*i, ofGetHeight()/2);
ofLine(-20*i, -1*ofGetHeight()/2, -20*i, ofGetHeight()/2);
ofLine(-1*ofGetWidth()/2, 20*i, ofGetWidth()/2, 20*i);
ofLine(-1*ofGetWidth()/2, -20*i, ofGetWidth()/2, -20*i);
}
ofSetColor(100, 100, 100);
ofLine(0, -1*ofGetHeight()/2, 0, ofGetHeight()/2);//中心線
ofLine(-1*ofGetWidth()/2, 0, ofGetWidth()/2, 0);
//式
ofSetColor(124, 181, 255);
float radius=200;
for (int i=0; i < 1000; i++) {
float x=cos(i)*radius;
float y=sin(i)*radius;
ofCircle(x, y, 1);
}
}
螺旋
#include "testApp.h"
//--------------------------------------------------------------
void testApp::setup(){
ofBackground(0, 0, 0);
}
//--------------------------------------------------------------
void testApp::update(){
}
//--------------------------------------------------------------
void testApp::draw(){
ofTranslate(ofGetWidth()/2, ofGetHeight()/2);//原点を画面の中心に
//方眼紙
int lines=ofGetWidth()/2/20+1;
ofSetColor(70, 70, 70);
for (int i=0; i < lines; i++) {
ofLine(20*i, -1*ofGetHeight()/2, 20*i, ofGetHeight()/2);
ofLine(-20*i, -1*ofGetHeight()/2, -20*i, ofGetHeight()/2);
ofLine(-1*ofGetWidth()/2, 20*i, ofGetWidth()/2, 20*i);
ofLine(-1*ofGetWidth()/2, -20*i, ofGetWidth()/2, -20*i);
}
ofSetColor(100, 100, 100);
ofLine(0, -1*ofGetHeight()/2, 0, ofGetHeight()/2);//中心線
ofLine(-1*ofGetWidth()/2, 0, ofGetWidth()/2, 0);
//式
ofSetColor(124, 181, 255);
for (int i=0; i < 10000; i++) {
float radius=10+0.02*i;//螺旋の間隔調整
float x=cos(i*0.01)*radius;
float y=sin(i*0.01)*radius;
ofCircle(x, y, 1);
}
}
インボリュート曲線
#include "testApp.h"
//--------------------------------------------------------------
void testApp::setup(){
ofBackground(0, 0, 0);
}
//--------------------------------------------------------------
void testApp::update(){
}
//--------------------------------------------------------------
void testApp::draw(){
ofTranslate(ofGetWidth()/2, ofGetHeight()/2);//原点を画面の中心に
//方眼紙
int lines=ofGetWidth()/2/20+1;
ofSetColor(70, 70, 70);
for (int i=0; i < lines; i++) {
ofLine(20*i, -1*ofGetHeight()/2, 20*i, ofGetHeight()/2);
ofLine(-20*i, -1*ofGetHeight()/2, -20*i, ofGetHeight()/2);
ofLine(-1*ofGetWidth()/2, 20*i, ofGetWidth()/2, 20*i);
ofLine(-1*ofGetWidth()/2, -20*i, ofGetWidth()/2, -20*i);
}
ofSetColor(100, 100, 100);
ofLine(0, -1*ofGetHeight()/2, 0, ofGetHeight()/2);//中心線
ofLine(-1*ofGetWidth()/2, 0, ofGetWidth()/2, 0);
//式
float x=0;
float y=0;
ofSetColor(124, 181, 255);
for (int i=0; i < 10000; i++) {
float sita=fmodf(i,360);
float size=1;
x=size*(sita*cos(sita));
y=size*(sita*sin(sita));
ofCircle(x, y, 5);
}
}
バラ曲線
void testApp::draw(){
ofTranslate(ofGetWidth()/2, ofGetHeight()/2);//原点を画面の中心に
//方眼紙
int lines=ofGetWidth()/2/20+1;
ofSetColor(70, 70, 70);
for (int i=0; i < lines; i++) {
ofLine(20*i, -1*ofGetHeight()/2, 20*i, ofGetHeight()/2);
ofLine(-20*i, -1*ofGetHeight()/2, -20*i, ofGetHeight()/2);
ofLine(-1*ofGetWidth()/2, 20*i, ofGetWidth()/2, 20*i);
ofLine(-1*ofGetWidth()/2, -20*i, ofGetWidth()/2, -20*i);
}
ofSetColor(100, 100, 100);
ofLine(0, -1*ofGetHeight()/2, 0, ofGetHeight()/2);//中心線
ofLine(-1*ofGetWidth()/2, 0, ofGetWidth()/2, 0);
//式
float x=0;
float y=0;
ofSetColor(124, 181, 255, 100);
for (int i=0; i < 36000; i++) {
float sita=fmodf(i*0.01,360);//点の数
int d=7;
int n=8;
float size=300*sin(n*sita);
x=size*sin(d*sita);
y=size*cos(d*sita);
ofCircle(x, y, 1);
}
//float sita=fmodf(i,360);
}
dとnに入れる値を変更する事で、花びらの形を変える事が出来ます
参考:
http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%A9%E6%9B%B2%E7%B7%9A