/* mobile.c --- 移動体の表示 * * * cc mobile.c -g -O2 -Wall -Wno-unused-result -o mobile -I/usr/include/freetype2 -lftgl -lglfw -lGLU -lGL -lX11 -lXrandr -lm */ #include #include #include #include #include #define CROSSING_SIZE 100 /* 交差点数=100 */ #define MAX_NAME_SIZE 50 /* 最大文字数50文字(半角) */ /* 追加するマクロ定義 */ #define PATH_SIZE 100 /* 経路上の最大の交差点数 */ #define MARKER_RADIUS 0.2 /* マーカーの半径 */ /* 座標変換マクロの定義 */ #define ORIGIN_X 1.0 #define ORIGIN_Y -1.0 #define REAL_SIZE_X 10.0 #define REAL_SIZE_Y 8.0 #ifndef FONT_FILENAME /* 演習サーバに用意されているフォントのファイル名 */ #define FONT_FILENAME "/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf" #endif static FTGLfont *font; /* 読み込んだフォントを差すポインタ */ /* データ構造の定義 */ typedef struct { double x, y; /* 位置 x, y */ } Position; /* 位置を表す構造体 */ typedef struct { int id; /* 交差点番号 */ Position pos; /* 位置を表す構造体 */ double wait; /* 平均待ち時間 */ char jname[MAX_NAME_SIZE]; /* 交差点名(日本語) */ char ename[MAX_NAME_SIZE]; /* 交差点名(ローマ字) */ int points; /* 交差道路数 */ int next[5]; /* 隣接する交差点番号 */ } Crossing; /* データを格納する変数の定義 */ static Crossing cross[CROSSING_SIZE]; static int path[PATH_SIZE + 1]; /* 経路: 通過する交差点IDを順番に格納したもの */ /* 円を描画 */ void draw_circle(double x, double y, double r) { int const N = 12; /* 円周を 12分割して線分で描画することにする */ int i; glBegin(GL_LINE_LOOP); for (i = 0; i < N; i++) glVertex2d(x + cos(2 * M_PI * i / N) * r, y + sin(2 * M_PI * i / N) * r); glEnd(); } /* 文字列を描画 */ void draw_outtextxy(double x, double y, char const *text) { double const scale = 0.01; glPushMatrix(); glTranslated(x, y, 0.0); glScaled(scale, scale, scale); ftglRenderFont(font, text, FTGL_RENDER_ALL); glPopMatrix(); } /* 経路を通過する交差点IDの例として、配列pathに設定する */ void path_set(void) { /* * 上に書いた通り */ } /* ファイルの読み込み */ int map_read(char *filename) { FILE *fp; int i, j; int crossing_number; /* 交差点数 */ fp = fopen(filename, "r"); if (fp == NULL) { perror(filename); return -1; } /* はじめに交差点数を読み込む */ fscanf(fp, "%d", &crossing_number); for (i = 0; i < crossing_number; i++) { /* 関数fprintfを使って、構造体のデータを ファイルへ書き出すプログラムを記入しなさい */ fscanf(fp, "%d,%lf,%lf,%lf,%[^,],%[^,],%d", &(cross[i].id), &(cross[i].pos.x), &(cross[i].pos.y), &(cross[i].wait), cross[i].jname, cross[i].ename, &(cross[i].points)); for(j=0; j= steps) { /* 交差点に達したので次の道路へ入る */ } } /* 移動体を表示 */ glColor3d(1.0, 1.0, 1.0); draw_circle(vehicle_x, vehicle_y, MARKER_RADIUS); glfwSwapBuffers(); /* フロントバッファとバックバッファを入れ替える */ usleep(50 * 1000); /* 50ミリ秒くらい待つ */ } glfwTerminate(); return 0; }