Unformatted text preview:

Michener’s AlgorithmScan conversionGraphics AnimationsEight-fold symmetryCompute only one octantSubroutine: draw_octant_pointsThe “best” pixel to draw?Decision at n-th stageFormula: sum of error-termsDifference EquationAlgorithm initializationSlide 12ReferenceCircle ‘fill’ also exploits symmetrySubroutine: draw_segmentsdraw_horiz( int xlo, xhi, y, color );Demo-programIn-Class Exercise #1Animation with ‘image tearing’What can we do about it?SuperVGA’s hardwareVESA’s BIOS-ExtensionsUsing ‘off-screen’ video memoryVBE service 0x07In-class exercise #2Michener’s AlgorithmAn efficient scheme for drawing circles (and filling circular disks) on a raster graphics displayScan conversion•Geometric objects possess implicit parameters•Example: A circle has a ‘center’ and a ‘radius’•Its equation is: (x – xc)2 + (y - yc)2 = R2 •x and y are from the continuum of real numbers•CRT display is a discrete 2D array of ‘pixels’•So drawing a circle requires a conversion, from something continuous into something discrete•In computer graphics it’s called scan conversion•Imperfections: unavoidable, but to be minimizedGraphics Animations•Fast drawing is essential for animations•Some guidelines for speed: –eliminate all redundant computations–prefer integer arithmetic to floating-point –prefer add and subtract to multiply or divide•Famous example: ‘Michener Algorithm’ •We can use it later with our ‘pong’ gameEight-fold symmetry(x, y)(-x, y)(x, -y)(-x, -y)(y, x)(y, -x)(-y, -x)(-y, x)Compute only one octantSubroutine: draw_octant_pointsArguments: int x, y, xcent, ycent, color; draw_pixel( xcent + x, ycent + y, color );draw_pixel( xcent + y, ycent + x, color );draw_pixel( xcent - x, ycent + y, color );draw_pixel( xcent - y, ycent + x, color );draw_pixel( xcent + x, ycent - y, color );draw_pixel( xcent + y, ycent - x, color );draw_pixel( xcent - x, ycent - y, color );draw_pixel( xcent - y, ycent - x, color );The “best” pixel to draw?Blue pixel: too far from center ( E > 0 )Red pixel: too near the center ( E < 0 )Error-term: E = (x2 + y2) – R2Decision at n-th stageyn-1xn-1xnPn-1An ?Bn ?Algorithm: compute sum = error( An ) + error( Bn ); If ( sum < 0 ) choose A n; otherwise choose B n.Formula: sum of error-terms•Assume circle has radius R, center (0,0)•error( An) = (xn-1+1)2 + (yn-1)2 – R2•error( Bn) = (xn-1+1)2 + (yn-1 – 1)2 – R2•sumn = 2(xn-1+1)2 + 2(yn-1)2 –2(yn-1) + 1-2R2•Now, how is sumn different from sumn+1:–If An is chosen at the n-th step?–If Bn is chosen at the n-th step?Difference Equation•Observe that: sumn+1 – sumn =4xn-1 + 6 + 2(yn2 – yn-12) – 2(yn – yn-1)•When An is selected at n-th stage: –we will have yn = yn-1–thus: sumn+1 = sumn + 4xn-1 + 6 •When Bn is selected at n-th stage: –we will have yn = yn-1 - 1–thus: sumn+1 = sumn + 4(xn-1 – yn-1) + 10Algorithm initialization•We start with the point P0 = (x0,y0), wherex0 = 0 and y0 = R•In this case: A1 = (1, R) and B1 = (1, R-1)•So the initial ‘sum-of-errors’ term will be:sum1 = error(A1) + error(B1) = [(12 + R2) – R2] + [(12 + R2–2R+1) – R2] = 3 – 2RMichener’s Algorithmint x = 0, y = R, sum = 3 – 2*R;while ( x <= y ) {draw_octant_points( x, y, xc, yc, color );if ( sum < 0 ) sum += 4*x + 6;else { sum += 4*(x - y) + 10; --y; }++x;}Reference•Francis S. Hill, jr., “Computer Graphics,” Macmillan (1990), pp. 433-435.•NOTE: Michener’s circle-drawing method owes its inspiration to a famous algorithm for efficient line-drawing, devised in 1965 by J. E. Bresenham (see the IBM Systems Journal, vol 4, pp. 305-311).Circle ‘fill’ also exploits symmetry(x, y)(-x, y)(x, -y)(-x, -y)(y, x)(y, -x)(-y, -x)(-y, x)Subroutine: draw_segmentsArguments: int x, y, xc, yc, color; draw_horiz( xc – x, xc + x, yc + y, color );draw_horiz( xc – x, xc + x, yc - y, color );draw_horiz( xc – y, xc + y, yc + x, color );draw_horiz( xc – y, xc + y, yc - x, color );draw_horiz( int xlo, xhi, y, color );Clipping to screen boundaries:If (( y < ymin )||( y > ymax )) return;if ( xlo < xmin ) xlo = xmin;if ( xhi > xmax ) xhi = xmax;Drawing the horizontal segment:for (x = xlo; x <= xhi; x++) draw_pixel( x, y, color );Demo-program•Try the ‘michener.cpp’ demo•It uses VESA graphics-mode 0x0103•Screen resolution is 800x600•Color depth is 8 bits-per-pixel (8bpp)•SVGA’s Linear Frame Buffer is enabled by calling VESA’s Set Display Mode service with bit #14 of the mode ID-number setIn-Class Exercise #1•Modify the ‘michener.cpp’ demo:–Use the standard ‘rand()’ function–Draw lots of color-filled circles–Stop if user hits <ESCAPE> key•NOTE: For this latter feature, we need to recall how to set up the terminal keyboard so it uses a ‘non-canonical’ input-modeAnimation with ‘image tearing’•We used Michner’s Algorithm in a graphics animation demo (named ‘bouncing.cpp’)•But you will see undesirable ‘tearing’ of the bouncing ball’s image – because we drew a large number of pixels, and computed a large number of pixel-locations – twice for each displayed frame (erase, then redraw)•Not enough drawing time during ‘retrace’!What can we do about it?•One idea is to draw a smaller-sized ball•Another idea is to draw only once – i.e. include enough extra pixels around the new ball’s perimeter to hide the old one•Also we could ‘pre-compute’ coordinates•An important general technique is to use off-screen display memory to ‘prepare’ a new screen-image, and then do a ‘bitblit’SuperVGA’s hardware•The graphics processor has the capability to switch the CRTC’s ‘start_address’, so we see a new full-screen image displayed almost instantly (i.e., just one or two CPU instructions), instead of a copying a screen•But doing this for higher-resolution SVGA display-modes requires accessing one or more of the nonstandard VGA extensionsVESA’s BIOS-Extensions•Video Electronics Standards Association defines a ROM-BIOS service that can be invoked to reprogram CRT Start_Address in a standard way for compliant systems•For a particular vendor’s graphics card, we can discover how to directly reprogram the CRT’s Start-Address, by ‘trapping’ the I/O instructions used in the ROM-BIOS routineUsing ‘off-screen’ video memoryVisible screenAlternatescreenCRT Controller’s Start-Address (default=0)VRAMThe currently


View Full Document

USF CS 686 - Michener’s Algorithm

Documents in this Course
Load more
Download Michener’s Algorithm
Our administrator received your request to download this document. We will send you the file to your email shortly.
Loading Unlocking...
Login

Join to view Michener’s Algorithm and access 3M+ class-specific study document.

or
We will never post anything without your permission.
Don't have an account?
Sign Up

Join to view Michener’s Algorithm 2 2 and access 3M+ class-specific study document.

or

By creating an account you agree to our Privacy Policy and Terms Of Use

Already a member?