LoginSignup
6
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-07-17

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

まずは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

綺麗ですね!

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

6
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3