C++ GLUT OpenGL 媒介変数の描画


今回は媒介変数を用いた曲線の描画をやってみました！

まずは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;
}
```
![スクリーンショット 2015-07-17 11.33.37.png](https://qiita-image-store.s3.amazonaws.com/0/85547/f0afc9d8-c1b0-76f9-8dc4-becd5ab11928.png "スクリーンショット 2015-07-17 11.33.37.png")

綺麗ですね！

現在の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