Download presentation

Presentation is loading. Please wait.

Published byAshley Grant Modified over 2 years ago

1
Circle Drawing Asst. Prof. Dr. Ahmet Sayar Kocaeli University Computer Engineering Advanced Computer Graphics Spring 2012

2
A circle is a set of points that are all at a given distance r from a center position ( x c, y c ). For any circle point ( x, y ), this distance relationship is expressed by the Pythagorean theorem in Cartesian coordinates as We could use this equation to calculate the position of points on a circle circumference by stepping along the x axis in unit steps from x c - r to x c + r and calculating the corresponding y values at each position as Properties of Circle

3
A Simple Circle Drawing Algorithm The equation for a circle is: where r is the radius of the circle So, we can write a simple circle drawing algorithm by solving the equation for y at unit x intervals using:

4
Brute Force Method Computational cost: floating point multiplications, subtraction, square-root, rounding

5
Issues on Brute Force Method Problems in the brute force method –Involves considerable computations at each steps. Lots of float- point calculations –Spacing between plotted pixel positions is not uniform Eliminating unequal spacing –Expressing the circle equation in parametric polar form x= x c + r cos(alpha), y= y c + r sin(alpha) for 0 o < alpha < 360 o –For a more continuous boundary, set the step size at 1/r Reducing computation cost –Considering the symmetry of circles –Still require a good deal of computation time for a octant

6
Common approach However, unsurprisingly this is not a brilliant solution! Firstly, the resulting circle has large gaps where the slope approaches the vertical Secondly, the calculations are not very efficient –The square (multiply) operations –The square root operation – try really hard to avoid these! We need a more efficient, more accurate solution

7
Midpoint Circle Algorithm (1/4) Only need to draw the arc between (0, r) and (r/sqrt(2),r/sqrt(2)) The coordinates of the other pixels can be implied from the 8- way symmetry rule. 45 o

8
Eight-Way Symmetry The first thing we can notice to make our circle drawing algorithm more efficient is that circles centred at (0, 0) have eight-way symmetry (x, y) (y, x) (y, -x) (x, -y)(-x, -y) (-y, -x) (y, -x) (-x, y)

9
Mid-Point Circle Algorithm Similarly to the case with lines, there is an incremental algorithm for drawing circles – the mid-point circle algorithm In the mid-point circle algorithm we use eight-way symmetry so only ever calculate the points for the top right eighth of a circle, and then use symmetry to get the rest of the points

10
Midpoint Circle Algorithm E SE M Choose E as the next pixel if M lies inside the circle, and SE otherwise. d = d<0:Select E d new = d + (2x p +3) d>0:Select SE d new = d + (2x p –2y p +5) xpxp x p +1 y-1/2 d r 2 = x 2 +y 2 d= F(x,y) = x 2 +y 2 -r 2

11
Choosing the Next Pixel M (x, y)(x+1, y) (x+1, y-1) E SE choose SE choose E decision variable d

12
Change of d when E is chosen M old (x, y)(x+1, y) (x+1, y-1) E SE (x+2, y) (x+2, y-1) M new

13
Change of d when SE is chosen M old (x, y)(x+1, y) E SE (x+1, y-2)(x+2, y-2) M new

14
Initial value of d (0,R) M0M0 (1,R) (1,R-1) Remember f(x+1,y+1/2) when we talked about midpoint line drawing

15
Midpoint Circle Algorithm (3/4) Start with P (x = 0, y = R). x = 0; y = R; d = 5/4 – R; /* real */ While (x < y) { If (d >= 0) // SE is chosen y = y – 1 d = d + 2 * (x – y) + 5 else // E is chosen d = d + 2 * x + 3 x = x+1; WritePixel(x, y) } Where is the arch drawn?

16
New Decision Variable Our circle algorithm requires arithmetic with real numbers. Lets create a new decision variable kd kd=d-1/4 Substitute kd+1/4 for d in the code. Note kd > -1/4 can be replaced with h > 0 since kd will always have an integer value.

17
Midpoint Circle Algorithm Start with P (x = 0, y = R). x = 0; y = R; kd = 1 – R; While (x < y) { If (kd >= 0) // SE is chosen y = y – 1 kd = kd + 2 * (x – y) + 5 else // E is chosen kd = kd + 2 * x + 3 x = x+1; WritePixel(x, y) }

18
LINE DRAWING with Midpoint Algorithm x=x L y=y L d=x H - x L c=y L - y H sum=2c+d //initial value // decision param sum is multiplied with 2, act val (c+d/2) draw(x,y) while ( x < x H ) // iterate until reaching the end point if ( sum < 0 ) // below the line and choose NE sum += 2d y++ x++ sum += 2c draw(x,y) Compare this with the algorithm presented in the previous slide EXPLAIN !

19
Initial value of decision param: sum What about starting value? (xL+1,yL+1/2) is on the line! Sum = 2c + d

20
Drawing circle in OpenGL OpenGL does not have any primitives for drawing curves or circles. However we can approximate a circle using a triangle fan like this: glBegin(GL_TRIANGLE_FAN) glVertex2f(x1, y1) for angle# = 0 to 360 step 5 glVertex2f(x1 + sind(angle#) * radius#, y1 + cosd(angle#) * radius#) next glEnd()

21
If you want to use mid-point to draw circle If you calculate the points on circle through the given mid-point algorithm, then use glBegin(GL_POINTS) glVertex2f(x1, y1) glEnd()

Similar presentations

© 2016 SlidePlayer.com Inc.

All rights reserved.

Ads by Google