Sunteți pe pagina 1din 55

COMPUTER

GRAPHICS
CHAPTER 3
2D GRAPHICS ALGORITHMS

1
2D Graphics Algorithms
 Output Primitives
 Line Drawing Algorithms
 DDA Algorithm
 Midpoint Algorithm
 Bersenhem’s Algorithm

 Circle Drawing Algorithms


 Midpoint Circle Algorithm
 Antialising
 Fill-Area Algorithms
2
Output Primitives

3
Output Primitives
 The basic objects out of which a
graphics display is created are
called.
 Describes the geometry of objects
and – typically referred to as
geometric primitives.
 Examples: point, line, text, filled
region, images, quadric surfaces,
spline curves
 Each of the output primitives has its
own set of attributes.

4
Output Primitives
 Points
 Attributes: Size, Color.

glPointSize(p);
glBegin(GL_POINTS);
glVertex2d(x1, y1);
glVertex2d(x2, y2);
glVertex2d(x3, y3);
glEnd()
Output Primitives
 Lines
 Attributes: Color, Thickness, Type

glLineWidth(p);
glBegin(GL_LINES);
glVertex2d(x1, y1);
glVertex2d(x2, y2);
glVertex2d(x3, y3);
glVertex2d(x4, y4);
glEnd()
Output Primitives
 Polylines (open)
 A set of line segments joined end to end.
 Attributes: Color, Thickness, Type

glLineWidth(p);
glBegin(GL_LINE_STRIP);
glVertex2d(x1, y1);
glVertex2d(x2, y2);
glVertex2d(x3, y3);
glVertex2d(x4, y4);
glEnd()
Output Primitives
 Polylines (closed)
 A polyline with the last point connected to
the first point .
 Attributes: Color, Thickness, Type

Note: A closed polyline cannot be filled.

glBegin(GL_LINE_LOOP);
glVertex2d(x1, y1);
glVertex2d(x2, y2);
glVertex2d(x3, y3);
glVertex2d(x4, y4);
glEnd()
Output Primitives
 Polygons
 A set of line segments joined end to end.
 Attributes: Fill color, Thickness, Fill pattern

Note: Polygons can be filled.


glBegin(GL_POLYGON);
glVertex2d(x1, y1);
glVertex2d(x2, y2);
glVertex2d(x3, y3);
glVertex2d(x4, y4);
glEnd()
Output Primitives
 Text
 Attributes: Font, Color, Size,
Spacing, Orientation.
 Font:
 Type (Helvetica, Times, Courier etc.)
 Size (10 pt, 14 pt etc.)
 Style (Bold, Italic, Underlined)

10
Output Primitives
 Images
 Attributes: Image Size, Image
Type, Color Depth.
 Image Type:
 Binary (only two levels)
 Monochrome
 Color.
 Color Depth:
Number of bits used to represent
color.
11
TCS2111
Output Primitives
Output Primitive Attributes
Point Size
Color
Line Thickness (1pt, 2pt …)
Type (Dashed, Dotted, Solid)
Color
Text Font (Arial, Courier, Times Roman…)
Size (12pt, 16pt ..)
Spacing
Orientation (Slant angle)
Style (Bold, Underlined, Double lined)
Color
Filled Region Fill Pattern
Fill Type (Solid Fill, Gradient Fill)
Fill Color
Images Color Depth (Number of bits/pixel) 12
Line Drawing Algorithms

13
Line Drawing
• Line drawing is fundamental to computer graphics.
• We must have fast and efficient line drawing functions.

Rasterization Problem: Given only the two end points, how


to compute the intermediate pixels, so that the set of pixels
closely approximate the ideal line.
Line Drawing - Analytical Method
by  a y
m
y bx  ax
c  a y  max B(bx,by)

y=mx+c

A(ax,ay)

ax bx x
Line Drawing - Analytical Method

double m = (double)(by-ay)/(bx-ax);
double c = ay - m*ax;
double y;
int iy;
for (int x=ax ; x <=bx ; x++) {
y = m*x + c;
iy = round(y);
setPixel (x, iy);
}

• Directly based on the analytical equation of a line.


• Involves floating point multiplication and addition
• Requires round-off function.
Incremental Algorithms
I have got a pixel on the line (Current Pixel).
How do I get the next pixel on the line?

Compute one point based on the previous point:


(x0, y0)…….…………..(xk, yk) (xk+1, yk+1) …….

Next pixel on next column Next pixel on next row


(when slope is small) (when slope is large)
Incrementing along x

Current (6,3)
Pixel To find (xk+1, yk+!):
(xk, yk) (5,2) (6,2)
xk+1 = xk+1
(6,1) yk+1 = ?

• Assumes that the next pixel to be set is on the next column of


pixels (Incrementing the value of x !)
• Not valid if slope of the line is large.
Line Drawing - DDA
Digital Differential Analyzer Algorithm is an incremental
algorithm.

Assumption: Slope is less than 1 (Increment along x).


Current Pixel = (xk, yk).
(xk, yk) lies on the given line. yk = m.xk + c
Next pixel is on next column. xk+1 = xk+1
Next point (xk+1, yk+1) on the line yk+1 = m.xk+1 + c
= m (xk+1) +c
= yk + m
Given a point (xk, yk) on a line, the next point is given by
xk+1 = xk+1
yk+1 = yk + m
Line Drawing - DDA
double m = (double) (by-ay)/(bx-ax);
double y = ay;
int iy;
for (int x=ax ; x <=bx ; x++) {
iy = round(y);
setPixel (x, iy);
y+ = m;
}

• Does not involve any floating point multiplication.


• Involves floating point addition.
• Requires round-off function
Midpoint Algorithm
Midpoint algorithm is an incremental algorithm

Assumption:
Slope < 1

Current
Pixel

xk+1 = xk+1
yk+1 = Either yk or yk+1
Midpoint Algorithm - Notations

Line
( xk+1, yk+1)
Candidate Pixels

Midpoint

Current Pixel
( xk, yk)
( xk+1, yk)

Coordinates of Midpoint = ( xk+1, yk+(1/2) )


Midpoint Algorithm:
Choice of the next pixel

Midpoint Below Line Midpoint Above Line

•If the midpoint is below the line, then the next pixel is (xk+1, yk+1).
•If the midpoint is above the line, then the next pixel is (xk+1, yk).
Equation of a line revisited.
y  ay x  ax
Equation of the line: 
by  a y bx  ax

Let w = bx  ax, and h = by  ay.


B(bx,by)
Then, h (x  ax)  w (y  ay) = 0.

(h, w , ax , ay are all integers).

In other words, every point (x, y) on the line A(ax,ay)


satisfies the equation F(x, y) =0, where
F(x, y) = h (x  ax)  w (y  ay).
Midpoint Algorithm:
Regions below and above the line.

F(x,y) < 0 F(x,y) = 0


(for any point above line)

F (x,y) > 0
(for any point below line)
Midpoint Algorithm
Decision Criteria

f ( x, y )  0 F(MP) < 0

F(MP) > 0

Midpoint below line Midpoint above line


Midpoint Algorithm
Decision Criteria
Decision Parameter

F(MP) = F(xk+1, yk+ ½) = Fk (Notation)

If Fk < 0 : The midpoint is above the line. So the next


pixel is (xk+1, yk).

If Fk  0 : The midpoint is below or on the line. So the


next pixel is (xk+1, yk+1).
Midpoint Algorithm – Story so far.

Midpoint Below Line Midpoint Above Line


Fk > 0 Fk < 0
yk+1 = yk+1 yk+1 = yk
Next pixel = (xk+1, yk+1) Next pixel = (xk+1, yk)
Midpoint Algorithm
Update Equation

Fk = F(xk+1, yk+ ½) = h (xk+1  ax)  w (yk+½  ay)

Update Equation

But, Fk+1 = Fk + h  w (yk+1­


­
yk). (Refer notes)
So,
Fk< 0 : yk+1 = yk.Hence, Fk+1 = Fk + h .
Fk  0 : yk+1 = yk+1. Hence, Fk+1 = Fk + h  w.

F0 = h  w/2.
Midpoint Algorithm
int h = by-ay;
int w = bx-ax;
float F=h-w/2;
int x=ax, y=ay;
for (x=ax; x<=bx; x++){
setPixel(x, y);

if(F < 0)
F+ = h;
else{
F+ = h-w;
y++;
}
} 30
Bresenham’s Algorithm
int h = by-ay;
int w = bx-ax;
int F=2*h-w;
int x=ax, y=ay;
for (x=ax; x<=bx; x++){
setPixel(x, y);

if(F < 0)
F+ = 2*h;
else{
F+ = 2*(h-w);
y++;
}
} 31
Circle Drawing
Algorithms

32
Midpoint Circle Drawing Algorithm
 To determine the closest pixel position to
the specified circle path at each step.
 For given radius r and screen center
position (xc, yc), calculate pixel positions
around a circle path centered at the
coodinate origin (0,0).
 Then, move each calculated position (x, y)
to its proper screen position by adding xc to
x and yc to y.
 Along the circle section from x=0 to x=y in
the first quadrant, the gradient varies from
0 to -1.
33
TCS2111

Midpoint Circle Drawing Algorithm


 8 segments of octants for a circle:

34
TCS2111

Midpoint Circle Drawing Algorithm


 Circle function: fcircle (x,y) = x2 + y2 –r2

{
> 0, (x,y) outside the circle

fcircle (x,y) = < 0, (x,y) inside the circle

= 0, (x,y) is on the circle


boundary

35
TCS2111

Midpoint Circle Drawing Algorithm


yk yk
midpoint midpoint

yk-1 yk-1

Fk < 0 Fk >= 0
yk+1 = yk yk+1 = yk - 1
Next pixel = (xk+1, yk) Next pixel = (xk+1, yk-1)

36
TCS2111

Midpoint Circle Drawing Algorithm


We know xk+1 = xk+1,
Fk = F(xk+1, yk- ½)
Fk = (xk +1)2 + (yk - ½)2 - r2 -------- (1)
Fk+1 = F(xk+1, yk- ½)
Fk+1 = (xk +2)2 + (yk+1 - ½)2 - r2 -------- (2)
(2) – (1)
Fk+1 = Fk + 2(xk+1) + (y2k+1 – y2k) - (yk+1 – yk) + 1

If Fk < 0, Fk+1 = Fk + 2xk+1+1


If Fk >= 0, Fk+1 = Fk + 2xk+1+1 – 2yk+1
37
TCS2111

Midpoint Circle Drawing Algorithm


For the initial point, (x0 , y0) = (0, r)

f0 = fcircle (1, r-½ )


= 1 + (r-½ )2 – r2
= 5–r
4
≈ 1–r

38
TCS2111

Midpoint Circle Drawing Algorithm


Example:
Given a circle radius = 10, determine the circle octant
in the first quadrant from x=0 to x=y.

Solution:
f0 = 5 – r
4
= 5 – 10
4
= -8.75
≈ –9
39
TCS2111

Midpoint Circle Drawing Algorithm


Initial (x0, y0) = (1,10)
Decision parameters are: 2x0 = 2, 2y0 = 20
k Fk x y 2xk+1 2yk+1
0 -9 1 10 2 20
1 -9+2+1=-6 2 10 4 20
2 -6+4+1=-1 3 10 6 20
3 -1+6+1=6 4 9 8 18
4 6+8+1-18=-3 5 9 10 18
5 -3+10+1=8 6 8 12 16
6 8+12+1-16=5 7 7 14 14

40
TCS2111

Midpoint Circle Drawing Algorithm


void circleMidpoint (int xCenter, int yCenter, int radius)
{
int x = 0;
Int y = radius;
int f = 1 – radius;

circlePlotPoints(xCenter, yCenter, x, y);


while (x < y) {
x++;
if (f < 0)
f += 2*x+1;
else {
y--;
f += 2*(x-y)+1; }
}
circlePlotPoints(xCenter, yCenter, x, y);
41
}
TCS2111

Midpoint Circle Drawing Algorithm


void circlePlotPoints (int xCenter, int yCenter,
int x, int y)
{
setPixel (xCenter + x, yCenter + y);
setPixel (xCenter – x, yCenter + y);
setPixel (xCenter + x, yCenter – y);
setPixel (xCenter – x, yCenter – y);
setPixel (xCenter + y, yCenter + x);
setPixel (xCenter – y, yCenter + x);
setPixel (xCenter + y, yCenter – x);
setPixel (xCenter – y, yCenter – x);
}

42
Antialiasing

43
Antialiasing
Antialiasing is a technique used to diminish
the jagged edges of an image or a line, so
that the line appears to be smoother; by
changing the pixels around the edges to
intermediate colors or gray scales.
Eg. Antialiasing disabled:

Eg. Antialiasing enabled:

44
Antialiasing (OpenGL)

Antialiasing disabled Antialiasing enabled

Setting antialiasing option for lines:


glEnable (GL_LINE_SMOOTH);
Fill Area Algorithms

46
Fill Area Algorithms
 Fill-Area algorithms are used to fill the
interior of a polygonal shape.
 Many algorithms perform fill operations
by first identifying the interior points,
given the polygon boundary.

47
Basic Filling Algorithm
The basic filling algorithm is commonly used
in interactive graphics packages, where the
user specifies an interior point of the region to
be filled.

4-connected pixels

48
Basic Filling Algorithm
[1] Set the user specified point.
[2] Store the four neighboring pixels in a
stack.
[3] Remove a pixel from the stack.
[4] If the pixel is not set,
Set the pixel
Push its four neighboring pixels into
the stack
[5] Go to step 3
[6] Repeat till the stack is empty.

49
Basic Filling Algorithm (Code)

void fill(int x, int y) {


if(getPixel(x,y)==0){
setPixel(x,y);
fill(x+1,y);
fill(x-1,y);
fill(x,y+1);
fill(x,y-1);
}
}

50
Basic Filling Algorithm

 Requires an interior point.


 Involves considerable amount of
stack operations.
 The boundary has to be closed.
 Not suitable for self-intersecting
polygons

51
Types of Basic Filling Algorithms
 Boundary Fill Algorithm
 For filling a region with a single
boundary color.
 Condition for setting pixels:
 Color is not the same as border color
 Color is not the same as fill color

 Flood Fill Algorithm


 For filling a region with multiple
boundary colors.
 Condition for setting pixels:
 Color is same as the old interior color
52
TCS2111

Boundary Fill Algorithm (Code)


void boundaryFill(int x, int y,
int fillColor, int borderColor)
{
getPixel(x, y, color);
if ((color != borderColor)
&& (color != fillColor)) {
setPixel(x,y);
boundaryFill(x+1,y,fillColor,borderColor);
boundaryFill(x-1,y,fillColor,borderColor);
boundaryFill(x,y+1,fillColor,borderColor);
boundaryFill(x,y-1,fillColor,borderColor);
}
} 53
TCS2111

Flood Fill Algorithm (Code)


void floodFill(int x, int y,
int fillColor, int oldColor)
{
getPixel(x, y, color);
if (color != oldColor)
{
setPixel(x,y);
floodFill(x+1, y, fillColor, oldColor);
floodFill(x-1, y, fillColor, oldColor);
floodFill(x, y+1, fillColor, oldColor);
floodFill(x, y-1, fillColor, oldColor);
}
} 54
Filling Polygons (OpenGL)

Enabling polygon fill (Default):


glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

Disabling polygon fill:


glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

S-ar putea să vă placă și