This article draws the first example by referring to computer graphics using OpenGL.
1. House defined by the Parameter
2. a flurry of filled rectangles
3. Sierpinski Curve
Contains the mouse and keyboard response functions onmouse and onkeyboard.
/************************************************************************//* CreateTime:2013-2-18**Author:@Rachel Zhang**Discription: Draw Parameter House, Flurry and Sierpinski**3rd-party:OpenGL*//************************************************************************/#include "GL/glut.h"#include "stdlib.h"#include <iostream>using namespace std;#define screenHeight 480class GLintPoint{public: GLint x, y;};// Create a number between 0 and m(a number which will be given)// the input m must be less than 32767 according to P49 in <Computer Graphics Using OpenGL>int random(int m){return rand()%m;}void drawDot (GLint x, GLint y){glPointSize(3);glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}typedef struct{GLfloat r, g, b;} GLfloatRGBColour;GLfloatRGBColour colour[8] = { {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 1.0f},{0.0f, 1.0f, 0.0f}, {1.0f, 0.0f, 0.0f},{0.0f, 1.0f, 1.0f}, {1.0f, 0.0f, 1.0f},{1.0f, 1.0f, 0.0f}, {1.0f, 1.0f, 1.0f}};void setPenColour(GLfloatRGBColour newColour){glColor3f(newColour.r, newColour.g, newColour.b);}/************************************************************************//* Draw Functions *//************************************************************************/void parameterizedHouse(GLintPoint peak, GLint width, GLint height)// the top of house is at the peak; the size of house is given// by height and width{glBegin(GL_LINE_LOOP);glVertex2i(peak.x, peak.y); // draw shell of house glVertex2i(peak.x + width / 2, peak.y - 3 * height /8);glVertex2i(peak.x + width / 2, peak.y - height);glVertex2i(peak.x - width / 2, peak.y - height);glVertex2i(peak.x - width / 2, peak.y - 3 * height /8);glEnd();}void drawFlurry(int num, int Width, int Height)// draw num random rectangles in a Width by Height rectangle {for (int i = 0; i < num; i++) {GLint x1 = random(Width);// place corner randomly GLint y1 = random(Height);GLint x2 = random(Width); // pick the size so it fits GLint y2 = random(Height);GLfloat lev = random(10)/10.0;// random value, in range 0 to 1 glColor3f(lev,lev,lev);// set the gray level glRecti(x1, y1, x2, y2);// draw the rectangle}glFlush();} void drawSierpinski(GLintPoint corner[3]){ int i, index, tcolour=0;GLintPoint point;point = corner[random(3)];drawDot(point.x, point.y);for (i = 0; i < 1000; i++){index = random(3);point.x = (point.x + corner[index].x)/2;point.y = (point.y + corner[index].y)/2; tcolour = (++tcolour)%7; // col = (col + 1) mod 7;setPenColour(colour[tcolour]);drawDot(point.x, point.y);}}/************************************************************************//* Mouse Listener and keyboard Listener *//************************************************************************/void myMouse(int button, int state, int x, int y){static GLintPoint corners[3];static int numCorners;if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){corners[numCorners].x = x;corners[numCorners].y = screenHeight - y - 1;if (++numCorners == 3){drawSierpinski(corners);numCorners = 0;}}else if (button==GLUT_RIGHT_BUTTON)glClear(GL_COLOR_BUFFER_BIT);glFlush();}void onKeyBoard(unsigned char key,int mousex, int mousey){switch (key){case 'q':exit(0);case 'r':static GLintPoint corners[3];for (int i=0;i<3;i++){corners[i].x = random(640);corners[i].y = random(screenHeight);}drawSierpinski(corners);default:break;}}// Initialization void Init(void) {glClearColor(1.0,1.0,1.0,0.0); // Set white background colorglColor3f(0.0f,0.0f,0.0f); // Set the drawing colorglMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,640.0,0.0,480.0);}void myDisplay(){glClear(GL_COLOR_BUFFER_BIT); //clear the screenGLintPoint Mypoint = {200,100};parameterizedHouse(Mypoint,100,100);drawFlurry(4,100,100);glFlush();}void main(int argc,char *argv[]){glutInit(&argc, argv); // Initialize the toolkitglutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); // Set display modeglutInitWindowPosition(100, 150); // Set window pozition on screenglutInitWindowSize(640, 480); // Set window sizeglutCreateWindow("parameterizedHouse, Flurry and drawSierpinski"); // Open the screen windowglutDisplayFunc(myDisplay); // Register redraw function glutMouseFunc(myMouse);glutKeyboardFunc(onKeyBoard);Init();glutMainLoop(); // Go into a perpetual loop}
:
The second example draws a series of images:
The spatial projection transformation mainly applies three functions:
Projection transform function glviewport (), matrix translation function gltranslated (), and normal Projection Function glortho ()
For implementation code, refer to "Computer Graphics-use OpenGL to implement version 2nd":
# Include <windows. h> // suitable when using Windows 95/98/NT # include <Gl/GL. h> # include <Gl/Glu. h> # include <Gl/glut. h> // <axis >>>>>>>>>>> void axis (double length) {// draw a z-axis, with cone at endglpushmatrix (); glbegin (gl_lines); glvertex3d (0, 0, 0); glvertex3d (0, 0, length ); // along the Z-axisglend (); gltranslated (0, 0, length-0.2); glwirecone (0.04, 0.2, 12, 9); glpopmatrix ();} // <displaywire> >>>>>>>>>>>>>> void displaywire (void) {glmatrixmode (gl_projection); // set the view volume shapeglloadidentity (); glortho (-2.0*64/48 .0, 2.0*64/48 .0,-2.0, 2.0, 0.1, 100 ); // glmatrixmode (gl_modelview); // position and aim the cameraglloadidentity (); glulookat (2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // define viewpoint transformation // draw axisglclear (gl_color_buffer_bit); // clear the screengcolor3d (0.5, 0); // draw black linesaxis ); // Z-axisglpushmatrix (); glrotated (90, 0, 1.0, 0); axis (0.5); // y-axisglrotated (-90.0, 1, 0, 0 ); axis (0.5); // Z-axisglpopmatrix (); // draw cubeglpushmatrix (); gltranslated (0.5, 0.5, 0.5); // multiply by a translation matrix, define Center (0.5, 0.5, 0.5) gluwirecube (1.0); glpopmatrix (); // draw sphereglpushmatrix (); gltranslated (1.0, 1.0, 0 ); // sphere at (0.25, 0) gluwiresphere (1.0, 10, 8); glpopmatrix (); // draw coneglpushmatrix (); gltranslated (1.0, 0 ); // cone at (0.2, 1) maid (0.5, 10, 8); glpopmatrix (); // draw teapotglpushmatrix (); gltranslated (, 1 ); gluwireteapot (0.2); // teapot at (1.0, 1) glpopmatrix (); // draw torusglpushmatrix (); gltranslated (0, 0 ); // torus at (90.0, 0) glrotated (0.1, 0.3, 0); fig (,); glpopmatrix (); // 12- glpushmatrix (); gltranslated (1.0, 0, 0); // dodecahedron at (0.15, 0) glscaled (0.15, 0.15,); fig (); glpopmatrix (); glpushmatrix (); gltranslated (0, 1.0, 1.0); // small cube at (0.25, 1) glwirecube (); glpopmatrix (); glpushmatrix (); gltranslated (0, 0, 1.0); // cylinder at (0.2, 1) gluquadricobj * qobj; qobj = glunewquadric (); gluquadricdrawstyle (qobj, glu_line); glucylinder (qobj, 0.2, 0.4, 8, 8); glpopmatrix (); glflush ();} // <main >>>>>>>>>>>> >>>>>>>>>>>>>>>> void main (INT argc, char ** argv) {gluinit (& argc, argv); gluinitdisplaymode (glu_single | glu_rgb); gluinitwindowsize (640,480); gluinitwindowposition (100,100 ); valley createwindow ("transformation Testbed-wireframes"); maid (displaywire); glclearcolor (1.0f, 1.0f, 1.0f, 0.0f); // background is whiteglviewport (0, 0,640,480 ); // projection transform function: FIG ();}
Reference:
Http://www.oocities.org/uniq_friq/c_files/openGL/1lab/dots.htm