line drawing and generalization. outline overview line drawing circle drawing curve drawing
Post on 03-Jan-2016
365 Views
Preview:
TRANSCRIPT
Line Drawing Line Drawing and Generalizationand Generalization
Outline
overview line drawing circle drawing curve drawing
1. Overview
application data structures/models
application programs
graphics systems
display devices
graphics primitives OpenGL
pixel information
Geometric Primitives
Building blocks for a 3D object
Application programs must describe their service requests to a graphics system using geometric primitives !!!
points, lines, polygons
Why not providing data structures directly to the graphics system?
display lists evaluators per-vertex operations & primitive assembly pixel operations rasterizationrasterization texture assembly per-fragment operations
per-vertex operations &primitive assembly
rasterization frame buffer
texture assembly
display lists
evaluators
pixel operations
per-fragmentoperations
geometricdata
pixeldata
OpenGL Rendering Pipeline
Continuity
8-connectivity(king – continuity)
4-connectivity(rook – continuity)
|L|
} 0cbyax
,yyy,xxx|y){(x,L
1
21211
|L|
}n 1,2,...,i|)y,{(xL
2
ii2
f
f : L1 => L2 quality degradation!!
Line drawing is at the heart of many graphics programs.
Smooth, even, and continuous as much as possible !!!
Simple and fast !!!
2. Line Drawing
(x1, y1)
(x2, y2)
Bresenham’s Line Drawing Algorithm via
Pragram Transformation
additions / subtractions only integer arithmetic not programmers’ point of view but system developers’ point of view
var yt : real; x, y, xi, yi : integer;
for xi := 0 to x do begin
yt := [y/x]*xi;
yi := trunc(yt+[1/2]);
display(xi,yi);
end;
var yt : real; x, y, xi, yi : integer;
yt := 0;
for xi := 0 to x do begin
yi := trunc(yt + [1/2]);
display(xi,yi);
yt := yt+[y/x]
end;
Eliminate multiplication !!!
x
y
y = mx, m = [y/x]
*
** x ≥ y ∴m ≤ 1x, y: positive integers
(0,0)
(∆x, ∆y)
var ys : real; x, y, xi, yi : integer;
ys := 1/2;
for xi := 0 to dx do begin
yi := trunc(ys);
display(xi,yi);
ys := ys+[y/x]
end;
var ysf : real; x, y, xi, ysi : integer;
ysi := 0;
ysf := 1/2;
for xi := 0 to x do begin
display(xi,ysi);
if ysf+[y/x] < 1 then begin
ysf := ysf + [y/x];
end else begin
ysi := ysi + 1;
ysf := ysf + [y/x-1];
end;
end;
sfsis yyy
integer part fractional part
***
****
01x
yysf
0ysf
Motivation(Cont’)
2
1
x
y1
x
y
2
1ysf
Motivation(Cont’)
xy2yx2 sf
var x, y, xi, ysi, r : integer;
ysi := 0;
for xi := 0 to x do begin
display(xi,ysi);
if then begin
end else begin
ysi := ysi + 1;
end;
end;
2
1
x
yysf
0ysf
1x
yyy sfsf
x
yyy sfsf
ryx2 sf
0yx2 sf
x]2y[2yx2yx2 sfsf
y2yx2yx2 sfsf
Motivation(Cont’)var x, y, xi, ysi, r : integer;
ysi := 0;
r := 2*y - x;
for xi := 0 to x do begin
display(xi,ysi);
if r < 0 then begin
r := r + [2*y];
end else begin
ysi := ysi + 1;
r := r + [2*y -2*x ];
end;
end;
Bresenham’s Algorithm !!!
No multiplication/ division.
No floating point operations.
ryx2 sf
Line-Drawing Algorithms
1x 2x
2y
1y
x
y
x
y
xx
yym
mxyb
bmxy
12
12
11
xmy
Assumptions
0m
xx 21
1 1(x ,y )
2 2(x ,y )
( x>0)
DDA(Digital Differential Analyzer) Algorithm
basic ideay
m
1x
0mx my
Take unit steps with one coordinate and
calculate values for the other coordinate
i.e.1m0 my:y
1x:x
i1i
i1i
or
m1 m
1x:x
1y:y
i1i
i1i
discontinuity !!
Why?
DDA(Cont’)procedure dda (x1, y1, x2, y2 : integer);
var
x, y, k : integer;
x, y : real
begin
x := x2 - x1;
y := y2 - y1;
x := x1; y := y1;
display(x,y);
for k := 1 to x do begin
x := x + 1;
y := y + [y/x];
display(round(x),round(y));
end { for k }
end; { dda }
expensive !!
no
*’s
Assumption : 0 m <1, x1<x2
Bresenham’s Line Algorithm
basic idea− Find the closest integer coordinates to the actual line path using only
integer arithmetic
− Candidates for the next pixel position
Specified
Line Path
1m0 Specified
Line Path
1)y1,(xthen0pif
)y1,(xthen0pif
cxy2yx2p
ccxy2yx2
1))x(2by(2xy2yx2
1)x(2bxy21)y(x2)dx(dp
x)y/m (where12b2y1)2m(xddd
b1)m(x1yy-1yd
y-b1)m(xy-yd
bmxy
iii
iii
iii
ii
ii
ii21i
ii21
iii2
iii1
ii
Bresenham’s Line algorithm(Cont’)
bmxy
ix 1xi 2xi
2yi
1yi
iy
1xi
iy
1yi y
2d
1d
i i+1
0 m 1
x x
ix
Bresenham’s Line algorithm(Cont’)i i i
i 1 i 1 i 1
i 1 i i 1 i i 1 i
i 1 i i 1 i
i ii 1
i
ii 1
p x 2 xy c2 y
p 2 yx 2 xy c
p p 2 y(x x ) 2 x(y y )
p p 2 y 2 x(y y )
y if p 0 y
y 1 otherwise
p 2 y p
i
i
1 1 1
1 1
1
if p 0
p 2 y 2 x otherwise
Now,
p 2 yx 2 xy c
2 y x 2 y x(2b 1)
y -( y/ x)x
p 2 y x
=1
Bresenham’s Line algorithm(Cont’)procedure bres_line (x1, y1, x2, y2 : integer);
var
x, y, x,y,p,incrE,incrNE : integer;
begin
x := x2 – x1;
y := y2 – y1;
p := 2*y - x;
incrE := 2*y;
incrNE := 2*(y - x);
x := x1; y := y1; display(x,y);
while x < x2 do begin
if p<0 then begin
p := p + incrE;
x := x + 1;
end; { then begin }
else begin
p := p + incrNE;
y := y + 1;
x := x + 1;
end; { else begin }
display (x, y);
end { while x < x2 }
end; { bres_line}
Homework #2 Extend this algorithm for general cases.
Midpoint Line Algorithm
)y1,(x ii
1/2)y1,(x ii
1)y1,(x ii
0y)F(x,
Van Aken, “An Efficient Ellipse - Drawing Algorithm”
IEEE CG & A, 4(9), 24-35, 1984.
)y,(x ii
Q
M
E
NE
Current pixel
Choices for next pixel
0)2
1y1,F(x ifNE
0)2
1y1,F(x if E
closer to is Q
line on the is y)(x, if 0y)F(x,
cbyaxy)F(x,
B,xc and x,b y,a Letting
Bxyxxyy)F(x,
0BxyxxyBxx
yy
ii
ii
xy2xy2)cxyyx(2)2
1y1,2F(xP
otherwisex2-y2P
0P ify 2P P
otherwise1y
0P if yy
1x x
)yx(y2)xy(x2PP
2c1)x(2y1)y(x2P
2c1)x(2y1)y(x2P
x,b andy a Since
c)1b(2y1)a(x2)2
1y1,2F(xPLet
c)2
1b(y1)a(x)
2
1y1,F(x
11111
i
ii1i
i
ii1i
i1i
i1ii1ii1i
1i1i1i
iii
iiiii
iiii
Midpoint Line Algorithm (Cont’)
xy
y2)(x2,
y1)(x1,
x
y
Midpoint Line Alg. (Cont’)
otherwise1)y1,(x
0P if )y1,(x)y,(x
x-y2P
otherwisex2y2P
0P if y 2PP
ii
iii1i1i
1
i
ii1i
Midpoint Line Alg. (Cont’)Midpoint Line Algorithm(Cont’)
procedure mid_point (x1, y1, x2, y2,value : integer);
var
x, y,incrE,incrNE,p,x,y : integer;
begin
x := x2 – x1;
y := y2 – y1;
p := 2*y - x;
incrE := 2*y;
incrNE := 2*(y-x);
x := x1; y := y1;
display(x,y);
while x x2 do begin
if p < 0 then begin
p := p + incrE;
x := x + 1;
end; { then begin }
else begin
p := p + incrNE;
y := y + 1;
x := x + 1;
end; { else begin }
display(x,y);
end; { while x x2 }
end; { mid_point }
Geometric Interpretation
yx : slope yx : slope
any slope
Bresenhams’s algorithm
x
y
Geometric Interpretation(Cont’)
Aliasing Effects
staircases (or jaggies)
intensity variation
line drawing
animation
texturing
popping-up
Anti-aliasing Lines
Removing the staircase appearance of a line
Why staircases?raster effect !!!
need some compensation in line-drawing algorithms for this raster effect?
How to anti-alias?well, …
increasing resolution.However, ...
Increasing resolution
memory costmemory bandwidthscan conversion timedisplay device cost
super sampling
(postfiltering)
area sampling
(prefiltering)
stochastic sampling
Cook, ACM Trans. CG, 5(1),
307-316, 1986.
Anti-aliasing Line (Cont’)Anti-aliasing Techniques
Area Sampling (Prefiltering)
box filter cone filter
Filters
unweighted area sampling weighted area sampling
Table look-up for f(D, t)
The table is invariant of the slope of line! Why?
The search key for the table is D! Why?
D
22 dydx
vdx vD
cos
Intensity Functions f(D, t)(assumption : t=1)
2 2
dx
dx dycos
0v
How to compute D (assumption : t=1)
otherwise.1)(yy
0P ifyyyy vwhere
,dydx
vdxcosvD
i
ii1i
22
i i i
1P =2F(M)=2F(x +1,y + ),
2where F(x,y)=ax+by+c
i i
i
2 2 2 2 2 2
i i
2 2 2 2 2 2
i i
2 2
(x 1,y )
(P x)v x 2v x D ,
x y 2 x y 2 x y
(x 1,y 1):
2(1 v) x 2 x 2v x
2 x-2v x 2 x 2v x D
2 x y 2 x y 2 x y
(x 1,y 1):
2(1 v) x 2 x 2v x
2 x 2 D
2 x y
2 2
v x
2 x y
How to compute D, incrementally
cbyaxy)F(x,
0cbyax
0BxxyyxBxx
yy
i
ii i
i i
i i
i i
i i
i i
i i
i
i
P 0:
a(x 1) c v y y y
bbv a(x 1) by c
vdx = F(x +1,y )
2v x 2F(x 1,y )
2a(x 1) 2by 2c
12a(x 1) 2b(y ) 2c b
21
2F(x 1,y ) x2
P x
1v x (P x)
2
. and Let ydyxdx
i i i
i
2 2
i i
2 2 2 2
i i
2 2 2 2
P 0: (x 1,y 1)
2v x P x
2v xD
2 x y
(x 1,y 2):
2 x 2v x
2 x 2v xD
2 x y 2 x y
(x 1,y ):
2 x 2v x
2 x 2v xD
2 x y 2 x y
IF (Cont’)Similarly,
M
D
1 - v
1 + v
)y,(xP pp
0v
v
IF (Cont’)x := x2 - x1;y := y2 - y1;p := 2 *y - x; {Initial value p1 as before}incrE := 2 * y; {Increment used for move to E}incrNE := 2 * (y - x); {Increment used for move to NE}
• two_v_x := 0; {Numerator; v = 0 for start pixel}• invDenom := 1 / (2 * Sqrt(x * x + y * y)); {Precomputed inverse denominator}• two_x_invDenom := 2 * x * invDenom; {Precomputed constant}
x := x1;y := y1;
• IntensifyPixel (x, y, 0); {Start pixel}• IntensifyPixel(x, y + 1, two_x_invDenom); {Neighbor}• IntensifyPixel(x, y - 1, two_x_invDenom); {Neighbor}
while x < x2 do begin if p < 0 then begin {Choose E}
• two_v_x := p + x; p := p + incrE; x := x + 1 end else begin {Choose NE}
• two_v_x := p - x; p := p + incrNE; x := x + 1; y := y + 1; end; {Now set chosen pixel and its neighbors}
• IntensifyPixel (x, y, two_v_x * invDenom);• IntensifyPixel (x, y + 1, two_x_invDenom - two_v_x * invDenom);• IntensifyPixel (x, y - 1, two_x_invDenom + two_v_x * invDenom)
end {while}
222
1
yx
x2vD
0x2v
0v
initially,
xc
ycr
22
222
xc)(xrycy
ryc)(yxc)(x
xc
ycr
rsinθycy
rcosθxcx
θ
3. Circle Drawing
y)(x,o45
y)(x,
x)(y,x)y,(
y)x,(
y)x,(
x)y,( x)(y,
using symmetry
(0,r)
r
symmetry
Midpoint Circle Algorithm
1)y1,(x ii
)2
1y1,(x ii
EMM
E
SE
Current pixel
Choices for next pixel
)y,(x ii )y1,(x ii
SEM
otherwise 1)y1,(x
0F(M) if )y1,(x)y,(x
Ryxy)F(x,Let
Ryx
ii
ii1i1i
222
222
2 2 2i i i i i
2 2 2i 1 i 1 i 1 i i 1
i 1 i
i ii 1
i
i ii 1
1 1Let P F(x 1,y ) (x 1) (y ) R
2 21 1
P F(x 1,y ) (x 2) (y ) R , where2 2
x x 1
y if P 0 y
y 1 otherwise
P 2x 3 P
i
i i i
2 2 21 1 1 1 1
if P 0
P 2(x y ) 5 otherwise
1 1 5 P F(x 1,y ) (0 1) (R ) R R since (x ,y ) (0,R)
2 2 4
(0, R)
MCA (Cont’)
i i ii 1 i 1
i i
i i ii 1
i i i
1
In summary,
(x 1,y ) if P 0 (x ,y )
(x 1,y 1) otherwise
P (2x 3) if P 0P
P (2x 2y 5) otherwise
5 P -R
4
MCA (Cont’)
procedure MidpointCircle (radius,value : integer);
var
x,y : integer; P: real;
begin
x := 0; { initialization }
y := radius;
P := 5/4 - radius;
CirclePoints(x,y,value);
while y > x do begin
if P < 0 then { select E }
P : = P + 2*x + 3;
x := x + 1;
end
else begin { select SE }
P := P + 2*(x - y) + 5;
x := x + 1;
y := y - 1;
end
CirclePoints(x,y,value)
end { while }
end; { MidpointCircle }
*
**
d = P - 1/4
P = d + 1/4
* d = 1 - radius
** d < -1/4 d < 0
why?
*** d := d + 2*x + 3
**** d := d + 2(x-y) + 5
***
****
(0, R)
MCA (Cont’) y=x
procedure MidpointCircle (radius,value : integer);
{ Assumes center of circle is at origin. Integer arithmetic only }
var
x,y,d : integer;
begin
x := 0; { initialization }
y := radius;
d := 1 - radius;
CirclePoints(x,y,value);
while y > x do begin
if d < 0 then { select E }
d := d + 2*x + 3;
x := x + 1;
end
else begin { select SE }
d := d+2*(x - y) + 5;
x := x + 1;
y := y - 1;
end
CirclePoints(x,y,value)
end { while }
end; { MidpointCircle }
Can you go further?
MCA (Cont’)
i 1 i i
Ei i i
i i 1 i SEi i i
i i i i
E Ei 1 i i
SE SEi 1 i i i
i i i i
P P P
2x 3 if P 0 ( P )P P P
2(x y ) 5 otherwise ( P )
(x ,y ) (x 1,y )
P 2(x 1) 3 P 2
P 2(x 1 y ) 5 P 2
(x ,y ) (x 1,y 1)
E Ei 1 i i
SE SEi 1 i i i
1 1
E1 1
1 SE1
P 2(x 1) 3 P 2
P 2(x 1 y 1) 5 P 4
At (x ,y )
3 if P 0 ( P ) P
2R 5 otherwise ( P )
MCA (Cont’)
MCA (Cont’)procedure MidpointCircle (radius,value : integer);
{ This procedure uses second-order partial differences to compute increments in the decision variable. Assumes center of circle is origin. }
var
x,y,d,deltaE,deltaSE : integer;
begin
x := 0; { initialization }
y := radius;
d := 1 - radius;
deltaE := 3;
deltaSE := -2*radius + 5;
CirclePoints(x,y,value);
while y > x do begin
if d < 0 then { select E }
d := d + deltaE;
deltaE := deltaE + 2;
deltaSE := deltaSE + 2;
x := x + 1;
end
else begin { select SE }
d := d + deltaSE;
deltaE := deltaE + 2;
deltaSE := deltaSE + 4;
x := x + 1;
y := y - 1
end
CirclePoints(x,y,value)
end { while }
end; { MidpointCircle }
Drawing Ellipse
xc
yc
2r 1r
y
r
x22
2
21
2
1r
)r
x(1ry
21
222
2
Homework #3
Modify the midpoint circle drawing algorithm to draw ellipses.
4. Curve Drawing
parametric equation
discrete data set
− curve fitting
− piecewise linear
f(x)y
h(t)x
g(t)y
top related