• 検索結果がありません。

次の内容のプログラムを 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 }

関連したドキュメント