Presentation is loading. Please wait.

Presentation is loading. Please wait.

C O M P U T E R G R A P H I C S Guoying Zhao 1 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 1 / 45 Computer Graphics Implementation I.

Similar presentations


Presentation on theme: "C O M P U T E R G R A P H I C S Guoying Zhao 1 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 1 / 45 Computer Graphics Implementation I."— Presentation transcript:

1 C O M P U T E R G R A P H I C S Guoying Zhao 1 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 1 / 45 Computer Graphics Implementation I

2 C O M P U T E R G R A P H I C S Guoying Zhao 2 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 2 / 45 Algorithms for Drawing 2D Primitives Line Drawing Algorithms –DDA algorithm –Midpoint algorithm –Bresenham’s line algorithm Circle Generating Algorithms –Bresenham’s circle algorithm –Extension to Ellipse drawing

3 C O M P U T E R G R A P H I C S Guoying Zhao 3 / 50 Line Drawing

4 C O M P U T E R G R A P H I C S Guoying Zhao 4 / 50 Line Drawing Draw a line on a raster screen between two points What’s wrong with statement of problem? –doesn’t say anything about which points are allowed as endpoints –doesn’t give a clear meaning of “draw” –doesn’t say what constitutes a “line” in raster world –doesn’t say how to measure success of proposed algorithms Problem Statement Given two points P and Q in XY plane, both with integer coordinates, determine which pixels on raster screen should be on in order to make picture of a unit-width line segment starting at P and ending at Q Scan Converting Lines

5 C O M P U T E R G R A P H I C S Guoying Zhao 5 / 50 Special case: Horizontal Line: Draw pixel P and increment x coordinate value by 1 to get next pixel. Vertical Line: Draw pixel P and increment y coordinate value by 1 to get next pixel. Diagonal Line: Draw pixel P and increment both x and y coordinate by 1 to get next pixel. What should we do in general case? => Fast - Digital differential analyzer (DDA) algorithm - Mid-point algorithm - Bresenham algorithm Finding next pixel:

6 C O M P U T E R G R A P H I C S Guoying Zhao 6 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 6 / 45 6 Scan Conversion of Line Segments Start with line segment in window coordinates with integer values for endpoints Assume implementation has a write_pixel function y = mx + h

7 C O M P U T E R G R A P H I C S Guoying Zhao 7 / 50 Basic Algorithm Find equation of line that connects two points P(x1,y1) and Q(x2,y2) Starting with leftmost point P, increment x i by 1 to calculate y i = m*x i + h where m = slope, h = y intercept Draw pixel at (x i, Round(y i )) where Round (y i ) = Floor (0.5 + y i )

8 C O M P U T E R G R A P H I C S Guoying Zhao 8 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 8 / 45 8 Strategy 1 – DDA Algorithm Digital Differential Analyzer –DDA was a mechanical device for numerical solution of differential equations –Line y=mx+ h satisfies differential equation dy/dx = m =  y/  x = (y 2 -y 1 )/(x 2 -x 1 ) Along scan line  x = 1 For(x=x1; x<=x2,x++) { y+=m; write_pixel(x, round(y), line_color) }

9 C O M P U T E R G R A P H I C S Guoying Zhao 9 / 50 Example Code // Incremental Line Algorithm // Assume x0 < x1 void Line(int x0, int y0, int x1, int y1) { intx, y; floatdy = y1 – y0; floatdx = x1 – x0; floatm = dy / dx; y = y0; for (x = x0; x < x1; x++) { WritePixel(x, Round(y)); y = y + m; }

10 C O M P U T E R G R A P H I C S Guoying Zhao 10 / 50

11 C O M P U T E R G R A P H I C S Guoying Zhao 11 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 11 / 45 11 Problem DDA = for each x plot pixel at closest y –Problems for steep lines

12 C O M P U T E R G R A P H I C S Guoying Zhao 12 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 12 / 45 12 Using Symmetry Use for 1  m  0 For m > 1, swap role of x and y –For each y, plot closest x

13 C O M P U T E R G R A P H I C S Guoying Zhao 13 / 50 Problem void Line(int x0, int y0, int x1, int y1) { intx, y; floatdy = y1 – y0; floatdx = x1 – x0; floatm = dy / dx; y = y0; for (x = x0; x < x1; x++) { WritePixel(x, Round(y)); y = y + m; } Rounding takes time

14 C O M P U T E R G R A P H I C S Guoying Zhao 14 / 50 Assume that line’s slope is shallow and positive (0 < slope < 1); other slopes can be handled by suitable reflections about principle axes Call lower left endpoint (x 0, y 0 ) and upper right endpoint (x 1, y 1 ) Assume that we have just selected pixel P at (x p, y p ) Next, we must choose between pixel to right (E pixel) (x p +1, y p ), or one right and one up (NE pixel) (x p +1, y p +1) Let Q be intersection point of line being scan-converted and vertical line x=x p +1 Strategy 2 – Midpoint Line Algorithm (1/3)

15 C O M P U T E R G R A P H I C S Guoying Zhao 15 / 50 Strategy 2 – Midpoint Line Algorithm (2/3) Previous pixelChoices for current pixel Choices for next pixel E pixel NE pixel Midpoint M Q

16 C O M P U T E R G R A P H I C S Guoying Zhao 16 / 50 Line passes between E and NE Point that is closer to intersection point Q must be chosen Observe on which side of line midpoint M lies: –E is closer to line if midpoint M lies above line, i.e., line crosses bottom half –NE is closer to line if midpoint M lies below line, i.e., line crosses top half Error (vertical distance between chosen pixel and actual line) is always <= ½ Strategy 2 – Midpoint Line Algorithm (3/3) Algorithm chooses NE as next pixel for line shown Now, need to find a way to calculate on which side of line midpoint lies E pixel NE pixel M Q

17 C O M P U T E R G R A P H I C S Guoying Zhao 17 / 50 Line equation as function f(x): Line equation as implicit function: for coefficients a, b, c, where a, b ≠ 0 from above, Properties (proof by case analysis): f(x m, y m ) = 0 when any point M is on line f(x m, y m ) < 0 when any point M is above line f(x m, y m ) > 0 when any point M is below line Our decision will be based on value of function at midpoint M at (x p + 1, y p + ½) Line

18 C O M P U T E R G R A P H I C S Guoying Zhao 18 / 50 void MidpointLine(int x0, int y0, int x1, int y1) { intdx = x1 - x0; intdy = y1 - y0; intx = x0; inty = y0; float c = y0 * dx – dy * x0; writePixel(x, y); x++; while (x < x1) { d = dy * x – (y + 0.5) * dx + c; if (d > 0) { // Northeast Case y++; } writePixel(x, y); x++; }/* while */ }

19 C O M P U T E R G R A P H I C S Guoying Zhao 19 / 50 Decision Variable d: We only need sign of f(x p + 1, y p + ½) to see where line lies, and then pick nearest pixel d = f(x p + 1, y p + ½) - if d > 0 choose pixel NE - if d < 0 choose pixel E - if d = 0 choose either one consistently How do we incrementally update d? On basis of picking E or NE, figure out location of M for that pixel, and corresponding value d for next grid line We can derive d for the next pixel based on our current decision Decision Variable

20 C O M P U T E R G R A P H I C S Guoying Zhao 20 / 50 Increment M by one in x direction d new = f(x p + 2, y p + ½) = a(x p + 2) + b(y p + ½) + c d old = a(x p + 1) + b(y p + ½) + c d new - d old is the incremental difference  E d new = d old + a  E = a = dy We can compute value of decision variable at next step incrementally without computing F(M) directly d new = d old +  E = d old + dy  E can be thought of as correction or update factor to take d old to d new It is referred to as forward difference If E was chosen: Strategy 3 – Bresenham algorithm

21 C O M P U T E R G R A P H I C S Guoying Zhao 21 / 50 Increment M by one in both x and y directions d new = F(x p + 2, y p + 3/2) = a(x p + 2) + b(y p + 3/2) + c  NE = d new – d old d new = d old + a + b  NE = a + b = dy – dx Thus, incrementally, d new = d old +  NE = d old + dy – dx If NE was chosen:

22 C O M P U T E R G R A P H I C S Guoying Zhao 22 / 50 At each step, algorithm chooses between 2 pixels based on sign of decision variable calculated in previous iteration. It then updates decision variable by adding either  E or  NE to old value depending on choice of pixel. Simple additions only! First pixel is first endpoint (x 0, y 0 ), so we can directly calculate initial value of d for choosing between E and NE. Summary (1/2)

23 C O M P U T E R G R A P H I C S Guoying Zhao 23 / 50 First midpoint for first d = d start is at (x 0 + 1, y 0 + ½) f(x 0 + 1, y 0 + ½) = a(x 0 + 1) + b(y 0 + ½) + c = a * x 0 + b * y 0 + c + a + b/2 = f(x 0, y 0 ) + a + b/2 But (x 0, y 0 ) is point on line and f(x 0, y 0 ) = 0 Therefore, d start = a + b/2 = dy – dx/2 –use d start to choose second pixel, etc. To eliminate fraction in d start : –redefine f by multiplying it by 2; f(x,y) = 2(ax + by + c) –this multiplies each constant and decision variable by 2, but does not change sign Summary (2/2)

24 C O M P U T E R G R A P H I C S Guoying Zhao 24 / 50 Example Code void Bresenham (int x0, int y0, int x1, int y1) { intdx = x1 - x0; intdy = y1 - y0; intd = 2 * dy - dx; intincrE = 2 * dy; intincrNE = 2 * (dy - dx); intx = x0; inty = y0; writePixel(x, y); while (x < x1) { if (d <= 0) {// East Case d = d + incrE; } else {// Northeast Case d = d + incrNE; y++; } x++; writePixel(x, y); }/* while */ }/* MidpointLine */

25 C O M P U T E R G R A P H I C S Guoying Zhao 25 / 50 Drawing Circles

26 C O M P U T E R G R A P H I C S Guoying Zhao 26 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 26 / 45 Bresenham’s Circle Algorithm Circle Equation –(x-x c ) 2 + (y- y c ) 2 = R 2 Problem simplifying –Making the circle origin (x c, y c ) in the coordinate origin –Symmetry points (y,x), (y,-x),(x,-y),(-x,- y),(-y,-x),(-y,x),(-x,y)

27 C O M P U T E R G R A P H I C S Guoying Zhao 27 / 50 Version 1: really bad For x = – R to R y = sqrt(R * R – x * x); Pixel (round(x), round(y)); Pixel (round(x), round(-y)); Version 2: slightly less bad For x = 0 to 360 Pixel (round (R cos(x)), round(R sin(x))); (17, 0) (0, 17) (17, 0) (0, 17) Scan Converting Circles

28 C O M P U T E R G R A P H I C S Guoying Zhao 28 / 50 Suppose circle origin is (x c,y c ), radius is R. Let D(x, y) = (x-x c ) 2 +(y-y c ) 2 –R 2 If point(x,y) is outside the circle, D(x,y)>0 。 If point(x,y) is inside the circle, D(x,y)<0 。 (x c, y c )

29 C O M P U T E R G R A P H I C S Guoying Zhao 29 / 50 Bresenham’s Circle Algorithm Two choice: (x i +1, y i ) or (x i +1, y i -1) (x i, y i )(x i +1, y i ) (x i +1, y i -1) (x i, y i -1) (x i +1, y i ) (x i +1, y i -1) (x i, y i ) (x i, y i -1)

30 C O M P U T E R G R A P H I C S Guoying Zhao 30 / 50 Symmetry: If (x 0 + a, y 0 + b) is on circle –also (x 0 ± a, y 0 ± b) and (x 0 ± b, y 0 ± a); hence 8-way symmetry. Reduce the problem to finding the pixels for 1/8 of the circle R (x 0 + a, y 0 + b) (x-x 0 ) 2 + (y-y 0 ) 2 = R 2 (x 0, y 0 ) Use Symmetry

31 C O M P U T E R G R A P H I C S Guoying Zhao 31 / 50 Scan top right 1/8 of circle of radius R Circle starts at (x 0, y 0 + R) Let’s use another incremental algorithm with decision variable evaluated at midpoint (x 0, y 0 ) Using the Symmetry

32 C O M P U T E R G R A P H I C S Guoying Zhao 32 / 50 E SESE x = x 0 ; y = y 0 + R; Pixel(x, y); for (x = x 0 +1; (x – x 0 ) < (y – y 0 ); x++) { if (decision_var < 0) { /* move east */ update decision_var; } else { /* move south east */ update decision_var; y--; } Pixel(x, y); } Sketch of Incremental Algorithm

33 C O M P U T E R G R A P H I C S Guoying Zhao 33 / 50 Decision variable –negative if we move E, positive if we move SE (or vice versa). Follow line strategy: Use implicit equation of circle f(x,y) = x 2 + y 2 – R 2 = 0 f(x,y) is zero on circle, negative inside, positive outside If we are at pixel (x, y) – examine (x + 1, y) and (x + 1, y – 1) Compute f at the midpoint What we need for Incremental Algorithm

34 C O M P U T E R G R A P H I C S Guoying Zhao 34 / 50 P = (x p, y p ) MMEME M SE SE Decision Variable E Evaluate f(x,y) = x 2 + y 2 – R 2 at the point We are asking: “Is positive or negative?” (it is zero on circle) If negative, midpoint inside circle, choose E –vertical distance to the circle is less at (x + 1, y) than at (x + 1, y–1). If positive, opposite is true, choose SE 2 2 2 2 1 )1( 2 1,1Ryxyxf                       2 1,1yx

35 C O M P U T E R G R A P H I C S Guoying Zhao 35 / 50 Decision based on vertical distance Ok for lines, since d and d vert are proportional For circles, not true: Which d is closer to zero? (i.e. which of the two values below is closer to R): RyxCircyxd Ryx yxd   22 22 )1()1()),1,1(( )1()),,1(( 2222 )1()1()1(  yxoryx The right decision variable?

36 C O M P U T E R G R A P H I C S Guoying Zhao 36 / 50 We could ask instead: “Is (x + 1) 2 + y 2 or (x + 1) 2 + (y – 1) 2 closer to R 2 ?” The two values in equation above differ by 12])1()1[(])1 2222  yyxyx f E – f SE = 290 – 257 = 33 (0, 17) (1, 17) (1, 16) f E = 1 2 + 17 2 = 290 E SE f SE = 1 2 + 16 2 = 257 2y – 1 = 2(17) – 1 = 33 Alternate Phrasing (1/3)

37 C O M P U T E R G R A P H I C S Guoying Zhao 37 / 50 The second value, which is always less, is closer if its difference from R 2 is less than i.e., if then so  2 )12( 1  y ])1()1[( 222  yx R )12( 2 1        y 2 1 )1(0 222 Ryyx  2 1 12)1(0 222 Ryyyx  )1()1( 2 1 0 222 Ryxy  2 2 2 4 1 2 1 )1(0Ryx         Alternate Phrasing (2/3)

38 C O M P U T E R G R A P H I C S Guoying Zhao 38 / 50 The radial distance decision is whether is positive or negative And the vertical distance decision is whether is positive or negative; d1 and d2 are apart. The integer d1 is positive only if d2 + is positive (except special case where d2 = 0). 2 2 2 4 1 2 1 )1(1Ryxd         2 2 2 2 1 )1(2Ryxd         Alternate Phrasing (3/3)

39 C O M P U T E R G R A P H I C S Guoying Zhao 39 / 50 How to compute the value of at successive points? Answer: Note that is just and that is just (1/2) 2 2 2 2 1 )1(),(Ryxyxf         2232),( ),()1,1( 32),( ),(),1( SE E     yxyx yxfyxf xyx yxfyxf Incremental Computation, Again

40 C O M P U T E R G R A P H I C S Guoying Zhao 40 / 50 F F’ F’’ Incremental Computation (2/2) If we move E, update by adding 2x + 3 If we move SE, update by adding 2x + 3 – 2y + 2. Forward differences of a 1 st degree polynomial are constants and those of a 2 nd degree polynomial are 1 st degree polynomials –this “first order forward difference,” like a partial derivative, is one degree lower

41 C O M P U T E R G R A P H I C S Guoying Zhao 41 / 50 The function is linear, hence amenable to incremental computation, viz: Similarly Second Differences (1/2) 32),( E  xyx 2),()1,1( EE  yxyx2),(),1( EE  yxyx 4),()1,1( SE  yxyx2),(),1(  yxyx

42 C O M P U T E R G R A P H I C S Guoying Zhao 42 / 50 For any step, can compute new Δ E (x, y) from old Δ E (x, y) by adding appropriate second constant increment – update delta terms as we move. –This is also true of Δ SE (x, y) Having drawn pixel (a,b), decide location of new pixel at (a + 1, b) or (a + 1, b – 1), using previously computed d(a, b). Having drawn new pixel, must update d(a, b) for next iteration; need to find either d(a + 1, b) or d(a + 1, b – 1) depending on pixel choice Must add Δ E (a, b) or Δ SE (a, b) to d(a, b) So we… –Look at d(i) to decide which to draw next, update x and y –Update d using Δ E (a,b) or Δ SE (a,b) –Update each of Δ E (a,b) and Δ SE (a,b) for future use –Draw pixel Second Differences (2/2)

43 C O M P U T E R G R A P H I C S Guoying Zhao 43 / 50 Bresenham’s Eighth Circle Algorithm MEC (R) /* 1/8 th of a circle w/ radius R */ {int x = 0, y = R; int delta_E, delta_SE; float decision; delta_E = 2*x + 3; delta_SE = 2(x-y) + 5; decision = (x+1)*(x+1) + (y - 0.5)*(y - 0.5) –R*R; Pixel(x, y); while( y > x ) { if (decision < 0) {/* Move east */ decision += delta_E; delta_E += 2; delta_SE += 2; /*Update delta*/ } else {/* Move SE */ y--; decision += delta_SE; delta_E += 2; delta_SE += 4; /*Update delta*/} x++; Pixel(x, y); } }

44 C O M P U T E R G R A P H I C S Guoying Zhao 44 / 50 Uses floats! 1 test, 3 or 4 additions per pixel Initialization can be improved Multiply everything by 4 No Floats! –Makes the components even, but sign of decision variable remains same Questions Are we getting all pixels whose distance from the circle is less than ½? Why is y > x the right stopping criterion? What if it were an ellipse? Analysis

45 C O M P U T E R G R A P H I C S Guoying Zhao 45 / 50 Equation is i.e, Computation of and is similar Only 4-fold symmetry When do we stop stepping horizontally and switch to vertical? Aligned Ellipses 1 2 2 2 2  b y a x 222222 bayaxb  E  SE 

46 C O M P U T E R G R A P H I C S Guoying Zhao 46 / 50 When absolute value of slope of ellipse is more than 1, viz: How do you check this? At a point (x,y) for which f(x,y) = 0, a vector perpendicular to the level set is f(x,y) which is This vector points more right than up when Direction Changing Criterion (1/2)           ),(),,(yx y f yx x f 0),(),(       yx y f yx x f 

47 C O M P U T E R G R A P H I C S Guoying Zhao 47 / 50 In our case, and so we check for i.e. This, too, can be computed incrementally Direction Changing Criterion (2/2) xayx x f 2 2),(    ybyx y f 2 2),(    022 22  ybxa0 22  ybxa

48 C O M P U T E R G R A P H I C S Guoying Zhao 48 / 50 Patterned primitives Non-integer primitives General conics Other Scan Conversion Problems

49 C O M P U T E R G R A P H I C S Guoying Zhao 49 / 50 Patterned line from P to Q is not same as patterned line from Q to P. Patterns can be geometric or cosmetic –Cosmetic: Texture applied after transformations –Geometric: Pattern subject to transformations Cosmetic patterned line Geometric patterned line Patterned Lines P Q P Q

50 C O M P U T E R G R A P H I C S Guoying Zhao 50 / 50 Geometric Pattern vs. Cosmetic Pattern + Geometric (Perspectivized/Filtered)Cosmetic


Download ppt "C O M P U T E R G R A P H I C S Guoying Zhao 1 / 50 C O M P U T E R G R A P H I C S Guoying Zhao 1 / 45 Computer Graphics Implementation I."

Similar presentations


Ads by Google