(GLUT)三角形を描く


アニメ『ゆるキャン△』

こんなキャンプの楽しみ方もあったんですね。オフシーズンに一人でテント張って、たき火して読書、インスタントラーメン。素敵です。機会があればやってみようかと思うんですが、ひと気が少ないと危険な気もします。セキュリティが行き届いている屋内キャンプ場みたいなものないですかねえ。タイトルの△は読み方がずっと分からなかったので、「マクロスΔ」みたいに、「ゆるきゃんデルタ」なんて、間違って読んでたのですが、どうやら△はテントの意味らしく、読まなくてもよい記号のようです。
ということで、今回はGLUT(freeglut)で三角形を描きます。

中心の座標を指定して、三角形を描画するのは、半径を決めて、120°ずつ回転させるだけなので簡単です。

takk@deb9:~$ cat -n triangle1.c
     1  #include <GL/glut.h>
     2  #include <math.h>
     3
     4  #define DEG2RAD(deg) deg * M_PI / 180.0
     5  #define WHITE 1.0, 1.0, 1.0, 0.0
     6  #define RED   1.0, 0.0, 0.0, 0.0
     7

三角関数はラジアンで指定する必要があるのでRAD2DEG変換マクロを定義しました。M_PIは円周率です。math.hをM_PIで検索するとこのような定義が出てきます。精度が欲しい場合は、M_PIlを使えばよいですね。

takk@deb9:~$ grep M_PI /usr/include/math.h
# define M_PI           3.14159265358979323846  /* pi */
# define M_PI_2         1.57079632679489661923  /* pi/2 */
# define M_PI_4         0.78539816339744830962  /* pi/4 */
# define M_PIl          3.141592653589793238462643383279502884L /* pi */
# define M_PI_2l        1.570796326794896619231321691639751442L /* pi/2 */
# define M_PI_4l        0.785398163397448309615660845819875721L /* pi/4 */
takk@deb9:~$

三角形を描画する関数本体です。120°ずつずらして、線を引くだけです。

     8  void triangle()
     9  {
    10          GLdouble xx, yy;
    11          GLdouble x = 0.0;
    12          GLdouble y = 0.0;
    13          GLdouble r = 0.5;
    14
    15          glBegin(GL_POLYGON);
    16          glColor4f(RED);
    17
    18          xx = x + r * cos(DEG2RAD(120.0));
    19          yy = y + r * sin(DEG2RAD(120.0));
    20          glVertex2d(xx, yy);
    21
    22          xx = x + r * cos(DEG2RAD(240.0));
    23          yy = y + r * sin(DEG2RAD(240.0));
    24          glVertex2d(xx, yy);
    25
    26          xx = x + r * cos(DEG2RAD(360.0));
    27          yy = y + r * sin(DEG2RAD(360.0));
    28          glVertex2d(xx, yy);
    29
    30          glEnd();
    31  }
    32

呼び出し元はGLUTを使う時の定型文ですね。

    33  void callback_display()
    34  {
    35          glClearColor(WHITE);
    36          glClear(GL_COLOR_BUFFER_BIT);
    37
    38          triangle();
    39
    40          glFlush();
    41  }
    42
    43  int main(int argc, char *argv[])
    44  {
    45          glutInit(&argc, argv);
    46          glutInitDisplayMode(GLUT_RGBA);
    47          glutCreateWindow("Triangle");
    48
    49          glutDisplayFunc(callback_display);
    50
    51          glutMainLoop();
    52
    53          return 0;
    54  }
    55
takk@deb9:~$

実行してみます。

takk@deb9:~$ gcc -lglut -lGLU -lGL -lm triangle1.c
takk@deb9:~$ ./a.out

どこかで見たことがある形ですね。これを90°回せばテントになりますね。

     8  void triangle()
     9  {
    10          GLdouble xx, yy;
    11          GLdouble x = 0.0;
    12          GLdouble y = 0.0;
    13          GLdouble r = 0.5;
    14          double deg = 120.0 + 90.0;
    15
    16          glBegin(GL_POLYGON);
    17          glColor4f(RED);
    18
    19          xx = x + r * cos(DEG2RAD(deg));
    20          yy = y + r * sin(DEG2RAD(deg));
    21          glVertex2d(xx, yy);
    22          deg += 120.0;
    23
    24          xx = x + r * cos(DEG2RAD(deg));
    25          yy = y + r * sin(DEG2RAD(deg));
    26          glVertex2d(xx, yy);
    27          deg += 120.0;
    28
    29          xx = x + r * cos(DEG2RAD(deg));
    30          yy = y + r * sin(DEG2RAD(deg));
    31          glVertex2d(xx, yy);
    32          deg += 120.0;
    33
    34          glEnd();
    35  }
    36


テントマークになりました。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA