加治/日誌/2010-10-17
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[加治/日誌]]
*CG論 [#jda74153]
**問2. 画面に多角形を描け。なお、キーボード入力に応じて描画する図形を変化させよ。T:三角形、R:四角形、P:六角形、ESC:終了 [#e19219c6]
***グローバル変数の値が関数間で共有されない・・・だと・・・!? [#g7980a49]
-何をしようとしたか
+実行直後、画面を表示し、特定のキー入力があった場合にkeyboard関数に飛び、そのキーによって描画する多角形を決めるためのフラグ変数であるshapeの値を変えようとした。関数keyboardはvoid型なので、返り値を持たないためグローバル変数としてshapeを宣言し、他関数と共有しようとした。
+その後display関数に飛んだ際に、shapeの値が関数keyboardによって変化したため多角形を描く処理へ入る・・・はずなのだが、なぜかこの時点でshapeの値は0のままだった。( (1)の部分を入れても終了しなかったため)つまり、グローバル変数shapeの値の変更が、反映されていないか、もしくは共有されていないことになる。なぜ。
+(2)の部分のコメントを外せば、関数displayで3角形が描かれる。この1行の間に何があったのか。。。
+初めてデバッガを使おうかと思ったが、なぜか-gオプションつけるとエラーが出る。。。
-結局のところ・・・
--今のままだと、初期画面からESCで終了する以外何も変化しない(ように見える。プログラム内ではなんか変わってるのかも。)
#include <GL/glut.h>
#include <math.h>
#define PI 3.1415926535898
int shape=0; //キーボードの入力に応じて値を変え、図形の形を決める変数。グローバルとして宣言。
void display(void) //表示する関数。shapeが初期値0以外になったらshapeの値にあった図形が描画される。なお、shapeによる多角形描画自体は問題無し。
{
int i, angle=0;
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1.0, 1.0, 1.0);
if(shape!=0)
{
//exit(0); //---------(1)
glBegin(GL_LINE_LOOP);
for(i=0 ; i<shape ; i++)
{
angle = 2*PI*i/shape;
glVertex2d(cos(angle), sin(angle));
}
glEnd();
}
glFlush();
}
void keyboard(unsigned char key, int x, int y) //キーボードイベント発生時にする処理。ASCIIコード認識、ESCで終了することは出来たが、ここで変えたshapeの値を関数displayに渡すことが出来ない。
{
switch(key)
{
case 116: // T 3角形
shape = 3;
// glutDisplayFunc(display);
break;
case 114: // R 4角形
shape = 4;
// glutDisplayFunc(display);
break;
case 112: // P 6角形
shape = 6;
// glutDisplayFunc(display);
break;
case 27: // Escape 終了
exit(0);
break;
default:
break;
}
}
int main(int argc, char *argv[]) //実行すると、黒い画面が出て、キーボードの入力を受け付ける状態になるが、ESCで終了することは出来たがキー入力に応じて多角形を描くことは出来なかった。
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutCreateWindow(argv[0]);
glutKeyboardFunc(keyboard);
// if(shape == 3) exit(0); //---------------(2)
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
----
#comment
終了行:
[[加治/日誌]]
*CG論 [#jda74153]
**問2. 画面に多角形を描け。なお、キーボード入力に応じて描画する図形を変化させよ。T:三角形、R:四角形、P:六角形、ESC:終了 [#e19219c6]
***グローバル変数の値が関数間で共有されない・・・だと・・・!? [#g7980a49]
-何をしようとしたか
+実行直後、画面を表示し、特定のキー入力があった場合にkeyboard関数に飛び、そのキーによって描画する多角形を決めるためのフラグ変数であるshapeの値を変えようとした。関数keyboardはvoid型なので、返り値を持たないためグローバル変数としてshapeを宣言し、他関数と共有しようとした。
+その後display関数に飛んだ際に、shapeの値が関数keyboardによって変化したため多角形を描く処理へ入る・・・はずなのだが、なぜかこの時点でshapeの値は0のままだった。( (1)の部分を入れても終了しなかったため)つまり、グローバル変数shapeの値の変更が、反映されていないか、もしくは共有されていないことになる。なぜ。
+(2)の部分のコメントを外せば、関数displayで3角形が描かれる。この1行の間に何があったのか。。。
+初めてデバッガを使おうかと思ったが、なぜか-gオプションつけるとエラーが出る。。。
-結局のところ・・・
--今のままだと、初期画面からESCで終了する以外何も変化しない(ように見える。プログラム内ではなんか変わってるのかも。)
#include <GL/glut.h>
#include <math.h>
#define PI 3.1415926535898
int shape=0; //キーボードの入力に応じて値を変え、図形の形を決める変数。グローバルとして宣言。
void display(void) //表示する関数。shapeが初期値0以外になったらshapeの値にあった図形が描画される。なお、shapeによる多角形描画自体は問題無し。
{
int i, angle=0;
glClear(GL_COLOR_BUFFER_BIT);
glColor3d(1.0, 1.0, 1.0);
if(shape!=0)
{
//exit(0); //---------(1)
glBegin(GL_LINE_LOOP);
for(i=0 ; i<shape ; i++)
{
angle = 2*PI*i/shape;
glVertex2d(cos(angle), sin(angle));
}
glEnd();
}
glFlush();
}
void keyboard(unsigned char key, int x, int y) //キーボードイベント発生時にする処理。ASCIIコード認識、ESCで終了することは出来たが、ここで変えたshapeの値を関数displayに渡すことが出来ない。
{
switch(key)
{
case 116: // T 3角形
shape = 3;
// glutDisplayFunc(display);
break;
case 114: // R 4角形
shape = 4;
// glutDisplayFunc(display);
break;
case 112: // P 6角形
shape = 6;
// glutDisplayFunc(display);
break;
case 27: // Escape 終了
exit(0);
break;
default:
break;
}
}
int main(int argc, char *argv[]) //実行すると、黒い画面が出て、キーボードの入力を受け付ける状態になるが、ESCで終了することは出来たがキー入力に応じて多角形を描くことは出来なかった。
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutCreateWindow(argv[0]);
glutKeyboardFunc(keyboard);
// if(shape == 3) exit(0); //---------------(2)
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
----
#comment
ページ名: