270 likes | 354 Views
CAP4730: Computational Structures in Computer Graphics. 2D Basics, Line Drawing, and Clipping. Chapter 3 Hearn & Baker Portions obtained from Leonard McMillan’s COMP136 Notes: www.cs.unc.edu/~mcmillan/comp136/Lecture 6. Definitions.
E N D
CAP4730: Computational Structures in Computer Graphics 2D Basics, Line Drawing, and Clipping Chapter 3 Hearn & Baker Portions obtained from Leonard McMillan’s COMP136 Notes: www.cs.unc.edu/~mcmillan/comp136/Lecture 6
Definitions • CG API – Computer Graphics Application Programming Interface (OpenGL, DirectX) • Graphics primitives – functions in the API that describe picture components • How could we describe an object? • Typically focus on object shape • Define an object’s shape with geometric primitives • Span of primitives are defined by the API • What are some types? • Lines, Triangles, Quadrics, Conic sections, Curved surfaces
Two Dimensional Images +Y • Use Cartesian coordinates • We label the two axes as • X (horizontal) • Y (vertical) • Origin is in the lower left • How big is the space? • So what is the image we see on a screen? • We call this space the world coordinate system Y Axis (0,0) X Axis +X
Partition the space into pixels 1. Define a set of points (vertices) in 2D space. 2. Given a set of vertices, draw lines between consecutive vertices. 3. If you were writing OpenGL yourself, let’s talk about low level calls 4. What about 2D vs 3D? +Y (2,7) (9,7) (2,1) (9,1) +X Screen Coordinates – references to frame buffer locations Q: True or Flase: Screen Coordinates == World Coordinates
Pixels • ?=glSetPixel(?) • ?=glGetPixel(?) • Scan line number – y • Column number – x
Absolute and Relative Coordinate Specifications +Y • Absolute coordinates – location specified as a relationship to the origin • Relative coordinates – location specified as a relationship to other points • Good for pen/plotters • Publishing/layout • Allows for a very object oriented approach • For this class we will always use absolute coordinates (0,6) (7,0) (2,1) (0,-6)
Specifying a World Coordinate System in OpenGL +Y +X gluOrtho2D (xmin, xmax, ymin, ymax) What should our xmin, xmax, ymin, ymax values be? Equivalent to the size of the framebuffer
From a geometry point of view, a pixel is a point. Q: Where is (2,1)? Q: What is a pixel? A square or a point? What is a “pixel” 3 2 1 1 2 3 4 5 0
But when we think about images, a pixel is a rectangle. Q: Where is (2,1)? A. The center of a pixel 2 1 0 0 1 2 3 4
Basic OpenGL Point Structure • In OpenGL, to specify a point: • glVertex*(); • In OpenGL, some functions require both a dimensionality and a data type • glVertex2i(80,100), glVertex2f(58.9, 90.3) • glVertex3i(20,20,-5), glVertex3f(-2.2,20.9,20) • Must put within a ‘glBegin/glEnd’ pair • glBegin(GL_POINTS); • glVertex2i(50,50); • glVertex2i(60,60); • glVertex2i(60,50); • glEnd(); • Let’s draw points in our assignment #1 • Next up? Lines
Draw a line from 0,0 to 4,2 How do we choose between 1,0 and 1,1? What would be a good heuristic? (4,2) 2 1 (0,0) 0 0 1 2 3 4
What are lines composed of?Write glBegin(GL_LINES) (4,2) 2 1 (0,0) 0 0 1 2 3 4
What we are working with V1: (6,8) V2: (13,8) • We are still dealing with vertices • Draws a line between every pair of vertices • glBegin(GL_LINES); • glVertex2i(6,2); • glVertex2i(6,8); • glEnd(); V0: (6,2) V3: (13,2)
Let’s draw a triangle (0,2) (4,2) 2 1 (2,0) 0 0 1 2 3 4
Consider a translation (-0.2,2) (3.8,2) 2 1 (1.8,0) 0 0 1 2 3 4
The Ideal Line (17,8) What do we want? • Continuous appearance • Uniform thickness and brightness • Pixels near the ideal line are “on” • Speed (2,2) Discretization - converting a continuous signal into discrete elements. Scan Conversion - converting vertex/edges information into pixel data for display
Slope-Intercept Method • From algebra: y = mx + b • m = slope b = y intercept Let’s write some code class Point { public: int x, y; int r,g,b; }; unsigned byte framebuffer[IMAGE_WIDTH*IMAGE_HEIGHT*3]; DrawLine (Point point1, Point point2) { }
Slope-Intercept Method • From algebra: y = mx + b • m = slope b = y intercept Let’s write some code DrawLine (Point point1, Point point2){ m=(point2.y-point1.y) / (point2.x-point2.x); b=point1.y + (-point1.x) * m; for i=point1.x to point2.x SetPixel(i , round(m*i+b)), pixel1.r, pixel1.g, pixel1.b;} SetPixel(int x, int y, int r, int g, int b){ framebuffer[(y * IMAGE_WIDTH+x) * 3 + 0]=r; framebuffer[(y * IMAGE_WIDTH+x) * 3 + 1]=g; framebuffer[(y * IMAGE_WIDTH+x) * 3 + 2]=b;}
Example 1: Point1 V:(2,2) C:(255,102,0) Point2 V:(17,8) C:(255,102,0) What if colors were different? (0,9) (17,8) (2,2) (0,0) (18,0)
(0,9) (17,8) (2,2) (0,0) (18,0) How do we change the framebuffer? What’s the index into GLubyte framebuffer[]? Point is 9,5
(7,9) Example 2: Point1 V:(7,9 ) C:( 0,255,0) Point2 V:(12,0) C:(0,255,0) (12,0) Example: (0,9) (0,0) (18,0) What are the problems with this method? Slope>1
Revised Slope Intercept DrawLine (Point point1, Point point2){ m=(point2.y-point1.y) / (point2.x-point2.x); b=point1.y + (-point1.x) * m; if (m>1) { for i=point1.x to point2.x SetPixel(i , round(i*m+b));} } else { for i=point1.y to point2.y SetPixel(i , round(i-b/m));} } Which one should we use if m=1? What is the cost per pixel?
Optimization (DDA Algorithm) • Since we increment y by the same amount, we can also inline rounding: • New cost: one floating point addition, one integer addition, one cast. DrawLine (Point point1, Point point2){ m=(point2.y-point1.y) / (point2.x-point2.x); j=point1.y + (-point1.x) * m + 0.5; for i=point1.x to point2.x SetPixel(i , (int)j+=m));}
Bresenham’s Line Drawing • In general: • Addition and Subtraction are faster than Multiplication which is faster than Division • Integer calculations are faster than Floating point • Made all math just integers (Section 3.5) • How?
What you need to know about Bresenham LDA • Why we use it • Major idea of integer-izing a decision point • How this reduces things to just integer form. (0,9) (17,8) (2,2) (0,0) (18,0)
Recap • DDA/Line Intercept Algorithm • Slope Intercept y = mx + b • Easy to implement • Slow • Bresenham • No floating point math • Fast • Why do we spend so much time optimizing this?
Other Primitive Drawing Solutions • What other shapes might we want to draw quickly? • Circles (and thus) Ovals • Curves • Fill?