Title: Chapter 2 Graphics Programming
1Chapter 2Graphics Programming
2Sierpinski Gasket 1/2
- Pick an initial point at random inside the
triangle - Select one of the three vertices at random
- Find the point halfway between the initial point
and the randomly selected vertex - Display the new point
- Replace the initial point with this new point
- Return to step 2
3Sierpinski Gasket 2/2
- main()
-
- initialize_the_system()
- for(some_number_of_points)
-
- pt generate_a_point()
- display_the_point(pt)
-
- cleanup()
4Code of Sierpinski Gasket 1/3
- typedef GLfloat point22
- void display(void)
-
- point2 vertices30,0,250,500,500,0
- / an arbitrary triangle /
- static point2 p 75,50
- / any desired initial point /
- int j, k
- int rand() / standard random-number generator
/
5Code of Sierpinski Gasket 2/3
- for(k0klt5000k)
-
- jrand()3 / pick a random vertex from 0, 1,
2 / - p0(p0verticesj0)/2 / compute new
point / - p1(p1verticesj1)/2
- glBegin(GL_POINTS)
- glVertex2fv(p) / display new point /
- glEnd()
-
- glFlush()
6Code of Sierpinski Gasket 3/3
7Questions
- In what colors are we drawing
- Where on the screen does our image appear
- How large will the image be
- How do we create an area of the screen a window
for our image? - How long will the image remain on the screen?
8Coordinate Systems
9Graphics Functions 1/3
10Graphics Functions 2/3
- Primitive functions points, line segments,
polygons, pixels, text, curves, surfaces - Attributes functionscolor, pattern, typeface
- Viewing functionsposition, orientation, clipping
11Graphics Functions 3/3
- Transformation functionsrotation, translation,
scaling - Input functionskeyboards, mice, data tablets
- Control functionscommunicate with windows,
initialization, error handling - Inquiry functions number of colors, camera
parameters/values
12Points and Line Segments
13Polygon Basics 1/3
Filled objects
Methods of displaying a polygon
14Polygon Basics 2/3
Simple
Nonsimple
15Polygon Basics 3/3
Convexity
Convex objects
16Polygon Types in OpenGL 1/2
17Polygon Types in OpenGL 2/2
Use triangles if possible because of efficiency!
18Drawing a Sphere 1/5
19Drawing a Sphere 2/5
z
x
?
y
?
20Drawing a Sphere 3/5
- cM_PI/180.0 // degrees to radians,
M_PI3.14159 - for(phi-80.0 philt80.0 phi20.0)
- glBegin(GL_QUAD_STRIP)
- for(theta-180.0 thetalt180.0 theta20.0)
- xsin(ctheta)cos(cphi)
- ycos(ctheta)cos(cphi)
- zsin(cphi)
- glVertex3d(x, y, z)
- xsin(ctheta)cos(c(phi20.0))
- ycos(ctheta)sin(c(phi20.0))
- zsin(c(phi20.0))
- glVertex3d(x, y, z)
-
- glEnd()
Drawing the portion of lower latitudes
21Drawing a Sphere 4/5
- xy0
- z1
- glBegin(GL_TRIANGLE_FAN)
- glVertex3d(x, y, z)
- cM_PI/180.0
- zsin(c80.0)
- for(theta-180.0 thetalt180.0 theta20.0)
- xsin(ctheta)cos(c80.0)
- ycos(ctheta)sin(c80.0)
- glVertex3d(x, y, z)
-
- glEnd()
Drawing the portion around the north pole
22Drawing a Sphere 5/5
- xy0
- z-1
- glBegin(GL_TRIANGLE_FAN)
- glVertex3d(x, y, z)
- z-sin(c80.0)
- for(theta-180.0 thetalt180.0 theta20.0)
- xsin(ctheta)cos(c80.0)
- ycos(ctheta)sin(c80.0)
- glVertex3d(x, y, z)
-
- glEnd()
Drawing the portion around the south pole
23Text Stroke or Raster
24Attributes for Lines, Texts
25Color 1/4
CT1RT2GT3B, T1, T2, T3 are the tristimulus
values
Additive color matching
26Color 2/4
- Basic tenet of three-color theoryIf two colors
produce the same tristimulus values, then they
are visually indistinguishable - The range of colors that we can produce on a
given system is called that systems color gamut
27Color 3/4
Color Solid
28Color 4/4
Subtractive Color
Additive Color
29Indexed Color
Color-lookup table
Example km8 pick 256 out of 16M colors
30Two-dimensional Viewing
Objects before clipping
Image after clipping
31Viewing Volume
32Orthographic View
33Aspect Ratio
Viewing rectangle
Display window
34Viewports
35Sample main program
- void main(int argc, char argv)
-
- glutInit(argc,argv)
- glutInitDisplayMode(GLUT_SINGLE
GLUT_RGB)glutInitWindowSize(500, 500) - glutInitWindowPosition(0, 0)glutCreateWindow(S
imple OpenGL example) - glutDisplayFunc(display)
- myinit()
- glutMainLoop()
For most non-interactive applications
36Gasket Program 1/3
- void myinit(void)
-
- / attributes /
- glClearColor(1.0, 1.0, 1.0, 1.0) / white
background / - glColor3f(1.0, 0.0, 0.0) / draw in red /
- / set up viewing /glMatrixMode(GL_PROJECTION)
glLoadIdentity()gluOrtho2D(0.0, 500.0, 0.0,
500.0)glMatrixMode(GL_MODELVIEW)
37Gasket Program 2/3
- void display(void)
-
- typedef GLfloat point22 / define a point
data type /point2 vertices30.0,0.0,250.0,
500.0,500.0,0.0 / triangle / - int i, j, kint rand()
- point2 p75.0, 50.0 / arbitrary point
inside triangle / - glClear(GL_COLOR_BUFFER_BIT) / clear the
window /
38Gasket Program 3/3
- / compute and output 5000 new points /
- for(k0 klt5000 k)
- jrand()3 / compute point halfway between
vertex and old point / p0(p0vertexj0)/
2.0 p1(p1vertexj1)/2.0 - glBegin(GL_POINTS) / plot point /
glVertex2fv(p) glEnd() -
- glFlush()
39Using Recursion 1/3
- void triangle(point2 a, point2 b, point2 c)
-
- glBegin(GL_TRIANGLES)
- glVertex2fv(a)
- glVertex2fv(b)
- glVertex2fv(c)
- glEnd()
40Using Recursion 2/3
- void divide_triangle(point2 a, point2 b, point2
c, int k) -
- point2 ab, ac, bc
- int j
- if(kgt0)
- for(j0 jlt2 j) abj(ajbj)/2
- for(j0 jlt2 j) acj(ajcj)/2
- for(j0 jlt2 j) bcj(bjcj)/2
- divide_triangle(a, ab, ac, k-1)
- divide_triangle(c, ac, bc, k-1)
- divide_triangle(b, bc, ab, k-1)
-
- else triangle(a, b, c) / draw triangle at end
of of recursion /
a
ab
ac
b
c
bc
41Using Recursion 3/3
- Void display(void)
-
- glClear(GL_COLOR_BUFFER_BIT)
- divide_triangle(v0, v1, v2, n)
- glFlush()
42Three-Dimensional Gasket 1/2
- typedef Glfloat point33
- point3 vertices4 0,0,0,0,250,500,100,500
,250,250,250,100,250 - Point3 new,old250, 100, 250
- jrand()4
- new0(old0verticesj0)/2
- new1(old1verticesj1)/2
- new2(old2verticesj2)/2
tetrahedron
43Three-Dimensional Gasket 2/2
- / plot point /
- glBegin(GL_POINTS)
- glVertex3fv(new)
- glEnd()
- / replace old point by new /
- old0new0
- old1new1
- old2new2
443D Recursive Gasket 1/3
- void triangle(point3 a, point3 b, point3 c)
-
- glBegin(GL_POLYGON)
- glVertex3fv(a)
- glVertex3fv(b)
- glVertex3fv(c)
- glEnd()
453D Recursive Gasket 2/3
- void divide_triangle(point3 a, point3 b, point3
c, int k) -
- point3 ab, ac, bc
- int j
- if(kgt0)
- for(j0 jlt3 j) abj(ajbj)/2
- for(j0 jlt3 j) acj(ajcj)/2
- for(j0 jlt3 j) bcj(bjcj)/2
- divide_triangle(a, ab, ac, k-1)
- divide_triangle(c, ac, bc, k-1)
- divide_triangle(b, ab, ab, k-1)
-
- else triangle(a, b, c) / draw triangle at end
of recursion/
463D Recursive Gasket 3/3
- void tetrahedron(int n)
-
- glColor3f(1.0, 0.0, 0.0)
- divide_triangle(v0, v1, v2, k)
- glColor3f(0.0, 1.0, 0.0)
- divide_triangle(v3, v2, v1, k)
- glColor3f(0.0, 0.0, 1.0)
- divide_triangle(v0, v3, v1, k)
- glColor3f(0.0, 0.0, 0.0)
- divide_triangle(v0, v2, v3, k)
47Hidden-Surface Removal 1/3
48Hidden-Surface Removal 2/3
- Sorting?
- Z-Buffer algorithm
49Hidden-Surface Removal 3/3
- void display()
-
- glClear(GL_COLOR_BUFFER_BIT
GL_DEPTH_BUFFER_BIT) - tetrahedron(n)
- glFlush()
50Summary and Notes
- Graphics (primitives, attributes), viewing,
control, communications with windows - Sample codes