//clickpoly.c //James Vanderhyde, 18 August 2004 //Adapted from Llamas's unproject.c #ifdef _WIN32 #include #endif #include #include #include #include struct Point2D { int x,y; }; struct Point2D vertices[100]; int numVertices=0; int tol=3; int movingVertex=-1; void insert_vertex_at(int p, int x, int y) { int i; if (numVertices<100) { for (i=numVertices; i>p; i--) { vertices[i].x=vertices[i-1].x; vertices[i].y=vertices[i-1].y; } vertices[p].x=x; vertices[p].y=y; numVertices++; } } void remove_vertex_at(int p) { int i; numVertices--; for (i=p; idist) && (dot1>=0) && (dot2>=0)) { min=dist; mini=i; } } return mini; } void mouse_click(int button, int state, int x, int y) { GLint viewport[4]; /* viewport[3] is height of window in pixels */ GLint flippedy; /* OpenGL y coordinate position */ int p,clickedVertex; switch (button) { case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) { glGetIntegerv (GL_VIEWPORT, viewport); flippedy = viewport[3] - (GLint) y - 1; clickedVertex=vertex_near_point(x,flippedy); if (clickedVertex>=0) { movingVertex=clickedVertex; } else { p=edge_near_point(x,flippedy)+1; if (p>0) { insert_vertex_at(p,x,flippedy); movingVertex=p; } } glutPostRedisplay(); } if (state == GLUT_UP) { movingVertex=-1; glutPostRedisplay(); } break; case GLUT_RIGHT_BUTTON: if (state == GLUT_DOWN) { if (numVertices>3) { glGetIntegerv (GL_VIEWPORT, viewport); flippedy = viewport[3] - (GLint) y - 1; clickedVertex=vertex_near_point(x,flippedy); if (clickedVertex>=0) { remove_vertex_at(clickedVertex); } glutPostRedisplay(); } } if (state == GLUT_UP) { } break; default: break; } } void mouse_drag(int x, int y) { GLint viewport[4]; GLint flippedy; if (movingVertex >= 0) { glGetIntegerv (GL_VIEWPORT, viewport); flippedy = viewport[3] - (GLint) y - 1; vertices[movingVertex].x=x; vertices[movingVertex].y=flippedy; glutPostRedisplay(); } } void keyboard(unsigned char key, int x, int y) { switch(key) { case 27: /* ESC */ exit(0); default: break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); /* turn on double buffering */ glutInitWindowSize (500, 500); numVertices=3; vertices[0].x=250; vertices[0].y=420; vertices[1].x=50; vertices[1].y=80; vertices[2].x=450; vertices[2].y=80; glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse_click); glutMotionFunc(mouse_drag); glutKeyboardFunc(keyboard); glutMainLoop(); return EXIT_SUCCESS; }