Created
March 21, 2012 12:41
-
-
Save hkulekci/2146651 to your computer and use it in GitHub Desktop.
This program draws points&lines placed with mouse clicks.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * This program draws points placed with mouse clicks. | |
| * Maximum number of points allowed is currently set at 16. | |
| * | |
| * Usage: | |
| * Left click to place a control point. | |
| * Press escape to exit. | |
| */ | |
| #include <stdlib.h> | |
| #include <GL/glut.h> | |
| #include <stdio.h> | |
| #include <math.h> | |
| #define MaxNumPts 16 | |
| float PointArray[MaxNumPts][2]; | |
| int NumPts = 0; | |
| // Function prototypes | |
| void myKeyboardFunc( unsigned char key, int x, int y ); | |
| void myMouseFunc( int button, int state, int x, int y ); | |
| void displayPoints(void); | |
| void addNewPoint( float x, float y ); | |
| void initRendering(); | |
| void resizeWindow(int w, int h); | |
| // Window size in pixels | |
| int WindowHeight; | |
| int WindowWidth; | |
| // Remove the first point in the list if too many points. | |
| void removeFirstPoint() | |
| { | |
| int i; | |
| if ( NumPts>0 ) | |
| { | |
| // Remove the first point, slide the rest down | |
| NumPts--; | |
| for ( i=0; i<NumPts; i++ ) | |
| { | |
| PointArray[i][0] = PointArray[i+1][0]; | |
| PointArray[i][1] = PointArray[i+1][1]; | |
| } | |
| } | |
| } | |
| void removeLastPoint() | |
| { | |
| if ( NumPts>0 ) | |
| { | |
| // Remove the first point, slide the rest down | |
| NumPts--; | |
| } | |
| } | |
| void myKeyboardFunc (unsigned char key, int x, int y) | |
| { | |
| switch (key) { | |
| case 27: // Escape key | |
| exit(0); | |
| break; | |
| case 70: | |
| case 102: | |
| removeFirstPoint(); | |
| glutPostRedisplay(); | |
| break; | |
| case 76: | |
| case 108: | |
| removeLastPoint(); | |
| glutPostRedisplay(); | |
| break; | |
| } | |
| } | |
| // Left button presses place a control point. | |
| void myMouseFunc( int button, int state, int x, int y ) | |
| { | |
| if ( button==GLUT_LEFT_BUTTON && state==GLUT_DOWN ) | |
| { | |
| float xPos = ((float)x)/((float)(WindowWidth-1)); | |
| float yPos = ((float)y)/((float)(WindowHeight-1)); | |
| yPos = 1.0f-yPos; // Flip value since y position is from top row. | |
| addNewPoint( xPos, yPos ); | |
| glutPostRedisplay(); | |
| } | |
| } | |
| // Add a new point to the end of the list. | |
| // Remove the first point in the list if too many points. | |
| void addNewPoint( float x, float y ) | |
| { | |
| if ( NumPts>=MaxNumPts ) | |
| { | |
| removeFirstPoint(); | |
| } | |
| PointArray[NumPts][0] = x; | |
| PointArray[NumPts][1] = y; | |
| NumPts++; | |
| } | |
| void displayPoints(void) | |
| { | |
| int i; | |
| glClear(GL_COLOR_BUFFER_BIT); | |
| glColor4f( 1.0f, 0.0f, 0.0f, 1.0f ); | |
| // Draw the points | |
| if ( NumPts>0 ) | |
| { | |
| glBegin( GL_POINTS); | |
| for ( i=0; i<NumPts; i++ ) | |
| { | |
| glVertex2f( PointArray[i][0], PointArray[i][1] ); | |
| } | |
| glEnd(); | |
| glBegin( GL_LINES); | |
| glColor3f(0,0,1); | |
| for ( i=0; i<NumPts-1; i++ ) | |
| { | |
| glVertex2f( PointArray[i][0], PointArray[i][1] ); | |
| glVertex2f( PointArray[i+1][0], PointArray[i+1][1] ); | |
| } | |
| glEnd(); | |
| } | |
| glFlush(); | |
| } | |
| void initRendering() { | |
| glClearColor( 1.0f, 1.0f, 1.0f, 1.0f ); | |
| // Make big points and wide lines. (Can comment out if desired.) | |
| glPointSize(8); | |
| //glLineWidth(5); | |
| // The following commands should make OpenGL create round points and | |
| // antialias points and lines. (This is implementation dependent | |
| // unfortunately, and | |
| // may slow down rendering considerably.) | |
| // You may comment these out if you wish. | |
| glEnable(GL_POINT_SMOOTH); // Make round points, not square points | |
| glEnable(GL_LINE_SMOOTH); | |
| glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); | |
| glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Antialias the lines | |
| glEnable(GL_BLEND); | |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |
| } | |
| void resizeWindow(int w, int h) | |
| { | |
| WindowHeight = (h>1) ? h : 2; | |
| WindowWidth = (w>1) ? w : 2; | |
| glViewport(0, 0, (GLsizei) w, (GLsizei) h); | |
| glMatrixMode(GL_PROJECTION); | |
| glLoadIdentity(); | |
| gluOrtho2D(0.0f, 1.0f, 0.0f, 1.0f); // Always view [0,1]x[0,1]. | |
| glMatrixMode(GL_MODELVIEW); | |
| glLoadIdentity(); | |
| } | |
| int main(int argc, char** argv) | |
| { | |
| glutInit(&argc, argv); | |
| glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB ); | |
| glutInitWindowSize(500, 500); | |
| glutInitWindowPosition(100, 100); | |
| glutCreateWindow(argv[0]); | |
| initRendering(); | |
| glutDisplayFunc(displayPoints); | |
| glutReshapeFunc(resizeWindow); | |
| glutKeyboardFunc(myKeyboardFunc); | |
| glutMouseFunc(myMouseFunc); | |
| glutMainLoop(); | |
| return 0; // This line is never reached | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment