前提・実現したいこと
2020/07/10 追記 修正したコードを反映しました
OpenGLを使って、クリックで四点を入力しベジェ曲線を描画するプログラムを作ろうとしています。
発生している問題・エラーメッセージ
クリックした座標を配列に格納することはできたのですが曲線に関して画面への反映がされません。
どこを修正したらよいか教えていただけると幸いです。
エラーメッセージ
該当のソースコード
c
1#include <GL/glut.h> 2#include <stdlib.h> 3#include<stdio.h> 4 5 6GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 }; 7GLfloat yellow[] = { 1.0, 1.0, 0.0, 1.0 }; 8 9GLfloat ctrlpoints[4][3]; 10int i = 0; 11 12void mouse(int button, int state, int x, int y) 13{ 14 if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) 15 { 16 float a = 30, b = 5, c = (float)x / a - b, d = (float)y / a - b; 17 if (i < 4) { 18 ctrlpoints[i][0] = { c }; 19 ctrlpoints[i][1] = { -d }; 20 ctrlpoints[i][2] = { 0.0 }; 21 printf("ctrlpoints[%d]:%lf %lf %lf\n", i, ctrlpoints[i][0], ctrlpoints[i][1], ctrlpoints[i][2]); 22 } 23 printf("(%d, %d)で左ボタンが押されました\n", x, y); 24 i++; 25 } 26 glutPostRedisplay(); 27} 28 29void display(void) 30{ 31 int i; 32 33 glClear(GL_COLOR_BUFFER_BIT); 34 35 glColor4fv(&white[0]); 36 glBegin(GL_LINE_STRIP); 37 for (i = 0; i <= 30; i++) 38 glEvalCoord1f((GLfloat)i / 30.0); 39 glEnd(); 40 41 /* 制御点を描く */ 42 glPointSize(5.0); 43 glColor4fv(&yellow[0]); 44 glBegin(GL_POINTS); 45 for (i = 0; i < 4; i++) 46 glVertex3fv(&ctrlpoints[i][0]); 47 glEnd(); 48 49 glFinish(); 50} 51 52void resize(int w, int h) 53{ 54 glViewport(0, 0, (GLsizei)w, (GLsizei)h); 55 glMatrixMode(GL_PROJECTION); 56 glLoadIdentity(); 57 if (w <= h) 58 glOrtho(-5.0, 5.0, -5.0 * (GLfloat)h / (GLfloat)w, 59 5.0 * (GLfloat)h / (GLfloat)w, -5.0, 5.0); 60 else 61 glOrtho(-5.0 * (GLfloat)w / (GLfloat)h, 62 5.0 * (GLfloat)w / (GLfloat)h, -5.0, 5.0, -5.0, 5.0); 63 glMatrixMode(GL_MODELVIEW); 64 glLoadIdentity(); 65} 66 67void keyboard(unsigned char key, int x, int y) 68{ 69 switch (key) { 70 case '\33': 71 case 'q': 72 case 'Q': 73 exit(0); 74 break; 75 default: 76 break; 77 } 78} 79 80void init(void) 81{ 82 glClearColor(0.0, 0.0, 0.0, 0.0); 83 if (ctrlpoints[3][0] != NULL) { 84 glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]); 85 glEnable(GL_MAP1_VERTEX_3); 86 } 87} 88 89int main(int argc, char** argv) 90{ 91 /* 初期化 */ 92 glutInit(&argc, argv); 93 94 /* ウィンドウの生成 */ 95 glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE | GLUT_DEPTH); 96 glutInitWindowPosition(200, 50); 97 glutInitWindowSize(300, 300); 98 glutCreateWindow(argv[0]); 99 100 /* OpenGL 初期化ルーチンの呼出し */ 101 init(); 102 103 /* 描画ルーチンの設定 */ 104 glutDisplayFunc(display); 105 glutReshapeFunc(resize); 106 107 /* 入力処理ルーチンの設定 */ 108 glutKeyboardFunc(keyboard); 109 glutMouseFunc(mouse); //コールバック関数の登録 110 111 /* 無限ループ */ 112 glutMainLoop(); 113 114 return 0; 115}
##試したこと
あらかじめ配列の中身を宣言しておくとうまくいくのですが入力を受け付けると出力されません。
補足情報(FW/ツールのバージョンなど)
Windows10 最新のOSにアップデートしています
VScode2019 デバッグなしで実行でビルドしています
回答1件
あなたの回答
tips
プレビュー