50
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

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

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

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

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

C O M P U T E R G R A P H I C S

Guoying Zhao 3 / 50

Line Drawing

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

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:

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 / 456

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

x

ym

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 xi by 1 to

calculate yi = m*xi + hwhere m = slope, h = y intercept

• Draw pixel at (xi, Round(yi)) where

Round (yi) = Floor (0.5 + yi)

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 / 458

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 = (y2-y1)/(x2-x1)

• Along scan line x = 1For(x=x1; x<=x2,x++) { y+=m; write_pixel(x, round(y), line_color)}

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) {

int x, y;

float dy = y1 – y0;

float dx = x1 – x0;

float m = dy / dx;

y = y0;

for (x = x0; x < x1; x++) {

WritePixel(x, Round(y));

y = y + m;

}

}

C O M P U T E R G R A P H I C S

Guoying Zhao 10 / 50

),( ii yx ))(,1( myRoundx ii

))(,( ii yRoundx ),1( myx ii

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 / 4511

Problem

• DDA = for each x plot pixel at closest y– Problems for steep lines

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 / 4512

Using Symmetry

• Use for 1 m 0• For m > 1, swap role of x and y

– For each y, plot closest x

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) {

int x, y;

float dy = y1 – y0;

float dx = x1 – x0;

float m = dy / dx;

y = y0;

for (x = x0; x < x1; x++) {

WritePixel(x, Round(y));

y = y + m;

}

}

Rounding takes time

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 (x0, y0) and upper right endpoint (x1, y1)

• Assume that we have just selected pixel P at (xp, yp)

• Next, we must choose between pixel to right (E pixel) (xp+1, yp), or one right and one up (NE pixel) (xp+1, yp+1)

• Let Q be intersection point of line being scan-converted and vertical line x=xp+1

Strategy 2 – Midpoint Line Algorithm (1/3)

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)

),( pp yxP 1 pxx

Previous pixel Choices for current pixel

Choices for next pixel

E pixel

NE pixel

Midpoint MQ

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

MQ

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(xm, ym) = 0 when any point M is on line• f(xm, ym) < 0 when any point M is above line• f(xm, ym) > 0 when any point M is below line• Our decision will be based on value of function at midpoint

M at (xp + 1, yp + ½)

Line

Bxdx

dyy

Bmxy

0),( cbyaxyxf

dxBcdxbdya

dxBdxyxdy

dxBxdydxy

,,

0

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) {

int dx = x1 - x0;

int dy = y1 - y0;

int x = x0;

int y = 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 */

}

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(xp + 1, yp + ½) to see where

line lies, and then pick nearest pixel

• d = f(xp + 1, yp + ½)

- 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

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

dnew = f(xp + 2, yp + ½)

= a(xp + 2) + b(yp + ½) + c

dold = a(xp + 1) + b(yp + ½) + c

• dnew - dold is the incremental difference E

dnew = dold + a E = a = dy

• We can compute value of decision variable at next step incrementally without computing F(M) directly

dnew = dold + E = dold + dy

E can be thought of as correction or update factor to take dold to dnew

• It is referred to as forward difference

If E was chosen:Strategy 3 – Bresenham algorithm

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

dnew = F(xp + 2, yp + 3/2)

= a(xp + 2) + b(yp + 3/2) + c

NE = dnew – dold

dnew = dold + a + b

NE = a + b = dy – dx

• Thus, incrementally,dnew = dold + NE = dold + dy – dx

If NE was chosen:

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 (x0, y0), so we can directly calculate initial value of d for choosing between E and NE.

Summary (1/2)

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 = dstart is at (x0 + 1, y0 + ½)

• f(x0 + 1, y0 + ½) = a(x0 + 1) + b(y0 + ½) + c = a * x0 + b * y0 + c + a + b/2 = f(x0, y0) + a + b/2

• But (x0, y0) is point on line and f(x0, y0) = 0

• Therefore, dstart = a + b/2 = dy – dx/2 – use dstart to choose second pixel, etc.

• To eliminate fraction in dstart : – 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)

C O M P U T E R G R A P H I C S

Guoying Zhao 24 / 50

Example Codevoid Bresenham(int x0, int y0, int x1, int y1) {

int dx = x1 - x0;

int dy = y1 - y0;

int d = 2 * dy - dx;

int incrE = 2 * dy;

int incrNE = 2 * (dy - dx);

int x = x0;

int y = 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 */

C O M P U T E R G R A P H I C S

Guoying Zhao 25 / 50

Drawing Circles

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-xc)2 + (y- yc)2 = R2

• Problem simplifying– Making the circle

origin (xc, yc) in the coordinate origin

– Symmetry points(y,x), (y,-x),(x,-y),(-x,-y),(-y,-x),(-y,x),(-x,y)

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

C O M P U T E R G R A P H I C S

Guoying Zhao 28 / 50

Suppose circle origin is (xc,yc), radius is R.

Let D(x, y) = (x-xc)2+(y-yc)

2–R2

• If point(x,y) is outside the circle, D(x,y)>0 。

• If point(x,y) is inside the circle, D(x,y)<0 。

(xc, yc)

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: (xi+1, yi) or (xi+1, yi-1)

(xi, yi) (xi+1, yi)

(xi+1, yi-1)

(xi, yi-1)

(xi+1, yi)

(xi+1, yi-1)

(xi, yi)

(xi, yi-1)

C O M P U T E R G R A P H I C S

Guoying Zhao 30 / 50

• Symmetry: If (x0 + a, y0 + b) is on circle

– also (x0 ± a, y0 ± b) and (x0 ± b, y0 ± a); hence 8-way symmetry.

• Reduce the problem to finding the pixels for 1/8 of the circle

R

(x0 + a, y0 + b)

(x-x0)2 + (y-y0)2 = R2

(x0, y0)

Use Symmetry

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 (x0, y0 + R)

• Let’s use another incremental algorithm with decision variable evaluated at midpoint

(x0, y0)

Using the Symmetry

C O M P U T E R G R A P H I C S

Guoying Zhao 32 / 50

E

SE

x = x0; y = y0 + R; Pixel(x, y);for (x = x0+1; (x – x0) < (y – y0); 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

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 circlef(x,y) = x2 + y2 – R2 = 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

C O M P U T E R G R A P H I C S

Guoying Zhao 34 / 50

P = (xp, yp)M ME

MSE

SE

Decision VariableE

• Evaluate f(x,y) = x2 + y2 – R2

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

22

2

21)1(

21,1 Ryxyxf

21,1 yx

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 dvert 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

RyxCircyxd

22

22

)1()1()),1,1((

)1()),,1((

2222 )1()1()1( yxoryx

The right decision variable?

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 + y2 or (x + 1)2 + (y – 1)2 closer to R2?”

• The two values in equation above differ by

12])1()1[(])1[( 2222 yyxyx

fE – fSE = 290 – 257 = 33

(0, 17) (1, 17)

(1, 16)

fE = 12 + 172 = 290E

SE

fSE = 12 + 162 = 257

2y – 1 = 2(17) – 1 = 33

Alternate Phrasing (1/3)

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 R2 is less than

i.e., ifthen

so

so

so

2 )12(1 y])1()1[( 222 yxR

)12(21

y

21)1(0 222 Ryyx

2112)1(0 222 Ryyyx

)1()1(210 222 Ryxy

22

2

41

21)1(0 Ryx

Alternate Phrasing (2/3)

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).

4

1

4

1

22

2

41

21)1(1 Ryxd

22

2

21)1(2 Ryxd

Alternate Phrasing (3/3)

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)

22

2

21)1(),( Ryxyxf

2232),(

),()1,1(

32),(

),(),1(

SE

E

yxyx

yxfyxf

xyx

yxfyxf

Incremental Computation, Again

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 1st degree polynomial are constants and those of a 2nd degree polynomial are 1st degree polynomials – this “first order forward difference,” like a partial derivative, is

one degree lower

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 yxyx

2),(),1( EE yxyx

4),()1,1( SESE yxyx2),(),1( SESE yxyx

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)

C O M P U T E R G R A P H I C S

Guoying Zhao 43 / 50

Bresenham’s Eighth Circle AlgorithmMEC (R) /* 1/8th 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);

}

}

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

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

12

2

2

2

by

ax

222222bayaxb

E SE

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)

),(),,( yxyfyx

xf

0),(),(

yx

yfyx

xf

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)

xayxx

f 22),(

ybyxy

f 22),(

022 22 ybxa

022 ybxa

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

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

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