今回は媒介変数を用いた曲線の描画をやってみました!
まずはcycloid曲線
void Cld(){
float a = 0.5 / en;
glBegin(GL_POINTS);
glColor3d(0.0, 0.0, 1.0);
for(int i = 0; i < 360; ++i){
glVertex2d(a * (rad(i) - sin(rad(i))), a * (1 - cos(rad(i))));
}
glEnd();
}
asteroid曲線
void ast(){
float a = 0.5;
glBegin(GL_POINTS);
glColor3d(1.0, 0.0, 0.0);
for(int i = 0; i < 360; ++i){
glVertex2d(a * (cos(i) * cos(i) * cos(i)), a * (sin(i) * sin(i) * sin(i)));
}
glEnd();
}
Cardioid曲線
void Crd(){
float a = 0.5;
glBegin(GL_POINTS);
glColor3d(0.0, 1.0, 1.0);
for(int i = 0; i < 360; ++i){
glVertex2d(a * (1 + cos(i)) * cos(i), a * (1 + cos(i)) * sin(i));
}
glEnd();
}
Involute曲線
void Ivl(){
float a = 0.05;
glBegin(GL_POINTS);
glColor3d(1.0, 0.0, 1.0);
for(int i = 0; i < 1460; ++i){
glVertex2d(a * (cos(rad(i)) + (rad(i) * sin(rad(i)))), a * (sin(rad(i)) - (rad(i) * cos(rad(i)))));
}
glEnd();
}
Lissajous曲線
void Lsj(){
float A = 1.0;
float B = 1.0;
float a = 3.0;
float b = 4.0;
float v = 0.0;
// A , B は振り幅 a,b は各周波数 v は位相差
glBegin(GL_POINTS);
glColor3d(1.0, 1.0, 0.0);
for(int i = 0; i < 1080; ++i){
glVertex2f(A * sin(a * i + v), B * sin(b * i));
}
glEnd();
}
とこのようになっています。
今回書いたコード内容はこちらです。
# include <GLUT/glut.h>
# include <cmath>
# include <iostream>
using namespace std;
# define en 3.141592 // 円周率
float r = 0.5; // 半径
float rad(int i){ // ラジアン
return (i * en / 180);
}
// サイクロイド曲線
void Cld(){
float a = 0.5 / en;
glBegin(GL_POINTS);
glColor3d(0.0, 0.0, 1.0);
for(int i = 0; i < 360; ++i){
glVertex2d(a * (rad(i) - sin(rad(i))), a * (1 - cos(rad(i))));
}
glEnd();
}
// アステロイド曲線(星芒形)
void ast(){
float a = 0.5;
glBegin(GL_POINTS);
glColor3d(1.0, 0.0, 0.0);
for(int i = 0; i < 360; ++i){
glVertex2d(a * (cos(i) * cos(i) * cos(i)), a * (sin(i) * sin(i) * sin(i)));
}
glEnd();
}
// カージオイド曲線(心臓型)
void Crd(){
float a = 0.5;
glBegin(GL_POINTS);
glColor3d(0.0, 1.0, 1.0);
for(int i = 0; i < 360; ++i){
glVertex2d(a * (1 + cos(i)) * cos(i), a * (1 + cos(i)) * sin(i));
}
glEnd();
}
// インボリュード曲線
void Ivl(){
float a = 0.05;
glBegin(GL_POINTS);
glColor3d(1.0, 0.0, 1.0);
for(int i = 0; i < 1460; ++i){
glVertex2d(a * (cos(rad(i)) + (rad(i) * sin(rad(i)))), a * (sin(rad(i)) - (rad(i) * cos(rad(i)))));
}
glEnd();
}
//リサージュ曲線
void Lsj(){
float A = 1.0;
float B = 1.0;
float a = 3.0;
float b = 4.0;
float v = 0.0;
// A , B は振り幅 a,b は各周波数 v は位相差
glBegin(GL_POINTS);
glColor3d(1.0, 1.0, 0.0);
for(int i = 0; i < 1080; ++i){
glVertex2f(A * sin(a * i + v), B * sin(b * i));
}
glEnd();
}
void display(){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
glColor3d(1.0, 1.0, 1.0); // 基準線の描画
glVertex2d(-1.0, 0.0);
glVertex2d(1.0, 0.0);
glVertex2d(0.0, 1.0);
glVertex2d(0.0, -1.0);
glEnd();
Cld(); // サイクロイド
ast(); // アステロイド
Crd(); // カージオイド
Ivl(); // インボリュード
Lsj(); // リサージュ
glFlush();
}
void init(){
glClearColor(0.0, 0.0, 0.0, 1.0); // 背景色 黒
}
int main(int argc, char *argv[]){
glutInitWindowPosition(100, 200); // ウィンドウ作成時の座標指定
glutInitWindowSize(500,500); // ウィンドウサイズ
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA); // Red Green Brue +α(透明度)= RGBA
glutCreateWindow(argv[0]); // ウィンドウを生成。 argv[0]だとファイル名がそのままウィンドウ名になる
glutDisplayFunc(display); // display関数内を表示
init();
glutMainLoop();
return 0;
}
綺麗ですね!
現在のMac_os version 10.10.3
ターミナルコマンドは
g++ -o parameter.out parameter.cpp -mmacosx-version-min=10.8 -framework GLUT -framework OpenGL
となってます!
今回参考にさせてもらったサイトはココです。
http://mathtrain.jp/sevencurve