/* samplex.c */ #include #include #include #define XMIN 32 #define YMIN 24 #define XMAX 640 #define YMAX 480 float param = 0.0; int flag = 0; float xx = 0., yy = 0.; float xx0 = 0., yy0 = 0.; float xx1 = 0., yy1 = 0.; void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glPopMatrix(); glPointSize(10.0); glBegin( GL_POINTS ); glColor3f( 1.0, 0.0, 0.0 ); glVertex2f( xx, yy ); glEnd(); glColor3f( 1.0, 1.0, 1.0 ); glBegin( GL_LINES ); glVertex2f( xx0, yy0 ); glVertex2f( xx1, yy1 ); glEnd(); glutSwapBuffers(); } void idle(void) { glutPostRedisplay(); } void mouse(int button, int state, int x, int y) { if(state == GLUT_DOWN){ /* マウスがクリックされて */ switch(button){ case GLUT_LEFT_BUTTON: /*クリックされたのが左ボタンだったら */ xx0 = x + XMIN; yy0 = YMAX - y; xx1 = xx0; yy1 = yy0; break; case GLUT_RIGHT_BUTTON: /*クリックされたのが右ボタンだったら */ break; } } } void keyboard(unsigned char key, int x, int y) { static float col[4][4] = {{1.0, 0.0, 0.0, 1.0}, {0.0, 1.0, 0.0, 1.0}, {0.0, 0.0, 1.0, 1.0}, {1.0, 1.0, 1.0, 1.0}}; static int index = 0; static int smooth = 0; switch (key) { case 'q': /* qが入力されたら,プログラムを終了する */ exit(0); case 'r': param += 30.; break; case 'c': index++; index %= 4; glMaterialfv(GL_FRONT, GL_DIFFUSE, col[index] ); break; case 's': if( smooth ) glShadeModel(GL_SMOOTH); else glShadeModel(GL_FLAT); smooth = !smooth; break; default: break; } } void mousemotion( int x, int y ) { xx = x + XMIN; yy = YMAX - y; } void mousedrag( int x, int y ) { xx1 = x + XMIN; yy1 = YMAX - y; } void init(char *winname) { glutInitWindowPosition( XMIN, YMIN); glutInitWindowSize( XMAX-XMIN, YMAX-YMIN); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutCreateWindow(winname); glClearColor(0.2, 0.4, 0.4, 1.0); glLoadIdentity(); glOrtho( (float)XMIN, (float)XMAX, (float)YMIN, (float)YMAX, -1.0, 1.0 ); } int main(int argc, char *argv[]) { glutInit(&argc, argv); init(argv[0]); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutMouseFunc(mouse); glutMotionFunc(mousedrag); /* マウス左ボタンを押しながらドラッグする場合 */ glutPassiveMotionFunc(mousemotion); /*マウスを(ボタンを押さずに)動かした場合 */ glutIdleFunc(idle); glutMainLoop(); return 0; }