次の内容のプログラムを main2D.cとして作成し,コンパイルおよび実 行せよ. ~/nrpsに,main2D.c を作り,その後, ASTEC-X の端末上で,
$ cd ~/nrps
$ ./c main2D にてコンパイルし,
$ ./main2D.out
にて実行する.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <GL/glut.h>
4
5 #define WIDTH 300 6 #define HIGHT 300 7
8 void display(void);
9 void reshape(int w, int h);
10 void keyboard(unsigned char key, int x, int y);
11 void ginit(int* pargc, char** argv);
12
13 void display(void) 14 {
15 int i, j;
16
17 glClear(GL_COLOR_BUFFER_BIT);
18 glPointSize(1);
19 glBegin(GL_POINTS);
20 glColor3f(1.0,0.0,0.0); /* red */
21 glVertex2f(1,1);
22 glColor3f(0.0,1.0,0.0); /* green */
23 glVertex2f(2,2);
24 glColor3f(0.0,0.0,1.0); /* blue */
25 glVertex2f(3,3);
26
27 glEnd();
28 glutSwapBuffers();
29 } 30
31 void reshape(int w, int h) 32 {
33 glViewport(0, 0, (GLsizei)w, (GLsizei)h );
34 glMatrixMode(GL_PROJECTION);
35 glLoadIdentity();
36 gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble) h);
37 } 38
39 void keyboard(unsigned char key, int x, int y) 40 {
41 switch(key) { 42 case 'q':
43 case 'Q':
44 exit(0);
45 break;
46 case ' ':
47 glutIdleFunc(0);
48 break;
49 default:
50 break;
51 } 52 } 53
54 void ginit(int* pargc, char** argv) 55 {
56 glutInit(pargc,argv);
57 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
58 glutInitWindowSize(WIDTH,HIGHT);
59 glutInitWindowPosition(100,50);
60 glutCreateWindow("Numerical Recipes for Polymer Science");
61 glClearColor(0.0,0.0,0.0,0.0); /* background color */
62 glShadeModel(GL_FLAT);
63 glutDisplayFunc(display);
64 glutReshapeFunc(reshape);
65 glutKeyboardFunc(keyboard);
66 } 67
68 int main(int argc, char* argv[]) 69 {
70 ginit(&argc,argv);
71 glutMainLoop();
72 return 0;
73 }
main2D.cについて
1‒3 行目:
このプログラムで使用する関数,定数の情報を含むファイルを指定する.
5,6 行目:
WIDTHと HIGHTのマクロ定義. 文中のWIDTHは,300に置き換えられてからコンパイルされる.
8‒11 行目:
プログラム中で定義されている関数の宣言.例えば, reshapeという関数の戻り値が voidで, 引数は int型 (整数) 変数 2つであることが分かる.
13‒29行目:
関数 displayの定義. 63行目の, glutDisplayFunc(display)との組み合わせで, この displayにて OpenGL が画面に描画するものが決まる. OpenGL の詳細は講義しないが,知りたい場合はインターネッ トなどで調べるこ とが可能.
15 行目では, 整数型の変数 i, jを宣言しているが,実際には display()の中で用いていないので, この 部分は削除する.
17 行目:
ウインドウを塗りつぶすOpenGLの関数.
18 行目:
点のサイズを 1とする.
19 ‒ 27 行目:
glBegin() ‒ glEnd()による描画.
glBegin(GL_POINTS)の場合, 点が描画される.
glBegin(GL_LINES)の場合,2点を対にして,その間が直線で結ばれる.
glBegin(GL_LINE_STRIP)の場合,点間が直線で結ばれる.
glBegin(GL_LINE_LOOP)の場合,点間が直線で結ばれ,さらに終点と始 点も結ばれる.
glBegin(GL_TRIANGLES / GL_QUADS)の場合,3/4 点を組にして,三角形 /四角形が描画される.
glBegin(GL_TRIANBLE_STRIP / GL_QUAD_STRIPE) の場合,一辺を共有し ながら,帯状に三角形/四角 形を描く.
glBegin(GL_TRIANGLE_FAN)の場合,一辺を共有しながら扇状に三角形を 描く.
glBegin(GL_POLYGON)の場合,凸多角形を描く.
22 ‒ 25 行目:
glColor3f()で色を決め,
glVertex2f(float x, float y)にて, 座標 (x, y)に点を打つ.
28 行目:
glutSwapBuffers()にて,描いた画面を,表示する.
31 ‒ 37 行目:
ウインドウの大きさが変化させられた時に,画面のサイズを調整するための関数 reshape(int w, int h) の定義.64 行目の glutReshapeFunc()との組み合わせで有効となる.
39 ‒ 52 行目:
キーボードが押されたときに何をするかを決める関数.65行目の glutKeyboardFunc()との組み合わせ で有効となる.
54 ‒ 66 行目:
OpenGL の初期化のための手続きを一つの関数, ginit(int* pargc, char** argv)にまとめたもの.
68 ‒ 73 行目:
メイン関数. C言語のプログラムは main()から実行される.
70 行目:
OpenGL の初期化手続き.
71 行目:
OpenGL による描画プロセスを起動する.
72 行目:
main()の戻り値として 0 を返す. 次のソースファイルを作成しコンパイルせよ.ソースファイルの名前
は各人で考えること. ただし,C言語のソースファイルの名前は末尾を .cとしなければならないことに注 意.
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 double f2bai(double x);
5 double tasu(double x, double y);
6
7 double f2bai(double x) 8 {
9 printf("f2bai works.\n");
10
11 return(2.0*x);
12 } 13
14 double tasu(double x, double y) 15 {
16 return(x+y);
17 } 18
19 int main() 20 {
21 double a,b;
22
23 a = (rand()%1000)/1000.0;
24 b = (rand()%1000)/1000.0;
25
26 printf("2*%lf = %lf\n", a, f2bai(a));
27 printf("%lf + %lf = %lf\n", a, b, tasu(a,b));
28
29 return(0);
30 }