210 likes | 458 Views
Circle Drawing. Asst. Prof. Dr. Ahmet Sayar Kocaeli University Computer Engineering Advanced Computer Graphics Spring 2012. Properties of Circle. A circle is a set of points that are all at a given distance r from a center position ( x c , y c ).
E N D
Circle Drawing Asst. Prof. Dr. AhmetSayar Kocaeli University Computer Engineering Advanced Computer Graphics Spring 2012
Properties of Circle A circle is a set of points that are all at a given distance r from a center position ( xc, yc). 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 xc - r to xc+ r and calculating the corresponding y values at each position as
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:
Brute Force Method Computational cost: floating point multiplications, subtraction, square-root, rounding
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= xc+ r cos(alpha), y= yc+ r sin(alpha) for 0o < alpha < 360o • 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
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
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. 45o
Eight-Way Symmetry (-x, y) (x, y) (y, -x) (y, x) (-y, -x) (y, -x) (-x, -y) (x, -y) • 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
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
Midpoint Circle Algorithm E Choose E as the next pixel if M lies inside the circle, and SE otherwise. d = d<0: Select E dnew = d + (2xp+3) d>0: Select SE dnew = d + (2xp–2yp+5) y-1/2 M SE d xp xp+1 r2 = x2+y2 d= F(x,y) = x2+y2-r2
Choosing the Next Pixel (x, y) (x+1, y) E M SE (x+1, y-1) decision variable d choose SE choose E
Change of d when E is chosen (x, y) (x+1, y) (x+2, y) E Mnew Mold SE (x+1, y-1) (x+2, y-1)
Change of d when SE is chosen (x, y) (x+1, y) E Mold SE Mnew (x+1, y-2) (x+2, y-2)
Initial value of d (0,R) (1,R) Remember f(x+1,y+1/2) when we talked about midpoint line drawing M0 (1,R-1)
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?
New Decision Variable • Our circle algorithm requires arithmetic with real numbers. • Let’s 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.
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) }
LINE DRAWING with Midpoint Algorithm x=xLy=yL d=xH - xL c=yL - yH sum=2c+d //initial value // decision param sum is multiplied with 2, act val (c+d/2) draw(x,y) while ( x < xH) // 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 !
Initial value of decision param: sum What about starting value? (xL+1,yL+1/2) is on the line! Sum = 2c + d
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()
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()