The Quadratic Curves, Circles and Ellipses FAQ
============================================== 

Version 1.3  17th March 1998
----------------------------

This FAQ is maintained by "hexapod@netcom.com". Any additional suggestions
or related questions are welcome. Just send E-mail to the above address.

Feel free to distribute or copy this FAQ as you please.

Questions
---------


QUADRATIC CURVES
================

Q1.  What is a quadratic curve?
Q2.  How do I solve a quadratic equation?
Q3.  What is the "discriminant" of a quadratic curve?
Q4.  How do I calculate the value of X for a know value of Y?
Q5.  How do I calculate the coefficients of a rotated quadratic curve?
Q6.  How do I determine the gradient of a quadratic curve?
Q7.  How do I determine the outward normal of a quadratic curve?


CIRCLES
=======

Q8.  What is a circle?
Q9.  How do I define a circle mathematically?
Q10. What is the general equation of the circle?
Q11. How do I derive the general equation of the circle?
Q12. How do I determine the limits of a circle?
Q13. How do I determine the gradient at a point on a circle?
Q14. How do I determine the outward normal of a circle?
Q15. How do I determine the octant of a point on a circle?


ELLIPSES
========

Q16. What is an ellipse?
Q17. How do I calculate the Y coordinate if only the X coordinate is known?
Q18. How do I calculate the gradient of a point on a ellipse?
Q19. How do I calculate the outward normal of a point on an ellipse?
Q20. How do I calculate the coefficients of an axis-orientated ellipse?
Q21. How do I calculate the coefficients of an arbitary rotated ellipse?
Q22. How do I determine the limits for an arbitary rotated ellipse?
Q23. How do I render a filled rotated ellipse?
Q24. How do I render the outline of a rotated ellipse?


ANSWERS
=======


QUADRATIC CURVES
================

Q1. What is a quadratic curve?
------------------------------

  A quadratic curve is a curve defined by the equation:

        2
  y = At + Bt + C

  x = t

  The most common uses for this equation are to calculate the path of a
  projectile in a constant gravitational field ie. football being kicked
  into the air or an artillery shell being fired from a tank.

  The value of x defines the horizontal position of the object. The
  value of  y defines the vertical position.

  The value of t defines the current time. t=0 defines the position of
  x and y at the initial position of the projectile.


Q2. How do I solve a quadratic equation?
----------------------------------------

  To calculate the values of x that make y equal to zero, use the equation:

                   ____________
                  /
                 /   2
        -B +/- \/   B  - 4AC          provided A != 0
    x = -----------------------
                 2A


  The values of x are known as "roots".


Q3. What is the discriminant of a quadratic curve?
--------------------------------------------------

  The "discriminant" is defined as the value of

     2
    B  - 4AC

  If this value is negative, no roots exist and no value of X can be found.

  If this value is zero, only one root exist and one value of X exists.

  If this value is positive, then two roots exist, and two value of X exist.


Q4. How do I calculate the value of X for a know value of Y?
------------------------------------------------------------

  For a given value of Y, the value X that generates this value can be
  determined by the equation:


                   _____________
                  /
                 /   2
        -B +/- \/   B  - 4A(C-y)          provided A != 0
    x = ------------------------
                 2A

  The discriminant in this case is thus:

         2
    D = B  - 4A(C-y)


  The values of D determine the number of roots as above.


Q5. How do I calculate the coefficients of a rotated quadratic curve?
---------------------------------------------------------------------

  For a quadratic curve with a vertical axis of symmetry:

                 2
    [1]    y = Px  + Qx + R

            2
    <=>   Px  + Qx + R - y = 0

  Rotating a pair of X and Y coordinates can be performed by the following
  expression:

             |  M  N |   | Mx - Ny |
   | x y | x |       | = |         |
             | -N  M |   | Nx + My |

  where

    M = cos (angle)
    N = sin (angle)

  Substituting the resulting matrix elements into equation [1] gives:

                  2
        P(Mx - Ny)  + Q(Mx - Ny) + R - (Nx + My) = 0


           2 2            2 2
    <=> P(M x  - 2MNxy + N y ) + QMx - QNy + R - Nx - My = 0


          2 2              2 2
    <=> PM x  - 2MNPxy + PN y  + QMx - QNy + R - Nx - My = 0


          2  2     2  2
    <=> PM  x  + PN  y  + QMx - Nx - QNy - My - 2MNPxy + R = 0


  Expressing in terms of the standard equation of the circle:

          2     2
        Ax  + By  + Cx + Dy + Exy + F = 0


  Then the values of the coefficients are:

            2
    A  =  PM

            2
    B  =  PN


    C  =  QM - N


    D  = -QN - M


    E  = -2MNP


    F  =  R


Q6. How do I determine the gradient of a quadratic curve?
---------------------------------------------------------

  The gradient of a quadratic curve is calculated by calculating the
  derivative:

  For any polynomial equation term of the form:

      n                  n-1          2                 3            2
    Ax      becomes   nAx      eg.   x   becomes 2x,  4x  becomes 12x

  Constant terms are discarded.

  Thus, the gradient of a quadratic curve:

      2
    Ax  + Bx + C = 0

  becomes

    dy   = 2Ax + B

    dx   = 1

           dy
     M   = -- = 2Ax + B
           dx

  For a rotated quadratic curve, the values of dx and dy are as follows:

    dx = 2Ax + C + Ey

    dy = 2By + D + Ex

  Then the gradient is calculated from:

        dy   2By + D + Ex
    M = -- = ------------
        dx   2Ax + C + Ey


Q7. How do I determine the outward normal of a quadratic curve?
---------------------------------------------------------------

  The outward normal of a quadratic curve is the direction perpendicular
  to the tangent vector of the curve at a select point:

  The tangent vector can be calculated by converting the gradient into a
  rotation angle. Using the C programming language, this can be achieved
  using the "atan" function, and then using this angle as input to the
  "sine" and "cosine" functions.

    ---------------------------------

    angle      = atan( gradient );

    tangent.vx = cos( angle );
    tangent.vy = sin( angle );

    ---------------------------------

  Since the outward normal is perpendicular to the tangent vector, it can
  be considered to be a rotation of 90 degrees ie:

      O = M . T

  This can be expanded out:

    | Ox |   | cos A  -sin A |   | Tx |
    |    | = |               | . |    |
    | Oy |   | sin A   cos A |   | Ty |

  If the gradient is zero, then T = (1,0) and O = (0,1)

        | C.Tx - S.Ty |  | 1 |   | 0 |
    O = |             | .|   | = |   |
        | S.Tx + C.Ty |  | 0 |   | 1 |

        | 0*1  + -1*0 |
    O = |             |
        | 1*1  +  0*0 |

  This can be solved for M:

        | 0  -1 |
    M = |       |
        | 1   0 |

  This can be simplified down to:

        | -sin A |
    O = |        |
        |  cos A |



CIRCLES
=======


Q8. What is a circle?
---------------------

  A circle is a type of curve such that every point is a constant distance
  away from a single fixed centre point eg. the origin

  The distance between each point on the circle and the centre point is
  known as the "radius".


Q9. How do I define a circle mathematically?
--------------------------------------------

  A circle centred at the origin, and with radius r can be represented
  as the equation:

      2    2
     x    y
     -- + -- - 1 = 0
      2    2
     r    r

  where:

    (x,y) defines a two-dimensional coordinate and
    r is the radius of the circle.

  If the circle is not at the origin then the circle will have centre-point
  at some coordinate [c,d]. This modifies the equation to be:

         2        2
    (x-c)    (y-d)
    ------ + ------ - 1 = 0
       2        2
      r        r


Q10. What is the general equation of the circle?
------------------------------------------------

  If the previous equation is expanded out and constants assigned to
  each power of x and y, then the following equation is derived:

      2     2
    Ax  + By  + Cx + Dy + Exy + F = 0

  where A, B, C, D, E, F are constant terms.

  This is referred to as the general equation of the circle

  Each constant has the following effect:

    A - Radius of the ellipse in the X-axis
    B - Radius of the ellipse in the Y-axis

    C - Determines centre point X coordinate
    D - Determines centre point Y coordinate

    E - Determines rotation of the ellipse (always zero if axis-aligned)
    F - Determines average radius of the ellipse

  The derivation of this equation is presented below.


Q11. How do I derive the general equation of the circle?
--------------------------------------------------------

  The general equation of the circle can be derived by multiplying out
  the equation:

         2        2
    (x-c)    (y-d)
    ------ + ------ - 1 = 0
       2        2
      r        r

  Multiplying out the denominator gives:

         2        2    2
    (x-c)  + (y-d)  - r  = 0

  This expands into:

      2         2      2         2     2
    (x - 2xc + c ) + (y  -2yd + d ) - r  = 0

  Fully expanding into single terms:

     2          2    2          2    2
    x  - 2cx + c  + y  - 2dy + d  - r  = 0

  Rearranging these parameters to conform to the general equation:

      2     2
    Ax  + By  + Cx + Dy + Exy + F = 0


  gives:

     2    2              2    2    2
    x  + y  -2cx -2dy + c  + d  - r  = 0

  Assigning values to each constant term in the general equation gives:

    A =  1

    B =  1

    C = -2c

    D = -2d

    E =  0

          2    2    2
    F =  c  + d  - r

  For a circle, A and B are always set to one.

  If the circle is at the origin then C and D are both set to zero.

  For a circle E is always zero.

  If F is zero, then the circle defines a single point.

  If F is negative, then no point or circle exists.


Q12. How do I determine the limits of a circle?
-----------------------------------------------

  These are simply calculated using:

    xmin = c-r    xmax = c+r

    ymin = d-r    ymax = d+r


  Or if the coefficients of the circle is known, then they can be solved
  using the equations:


  For the X-axis:

                2
      2        D     2
    Ax  + Cx - -- - r  = 0
               4

  For the Y-axis:

                2
      2        C     2
    By  + Dy - -- - r  = 0
               4


Q13. How do I determine the gradient at a point on a circle?
------------------------------------------------------------

  The general equation of a circle is:

     2    2
    x  + y  + Cx + Dy + Exy + F = 0

  The derivative for X is:

    dx = 2x + C + Ey

  The derivative for Y is:

    dy = 2y + D + Ex

  Then the gradient M is given by:

        dy   2y + D + Ex
    M = -- = -----------
        dx   2x + C + Ey

  But E = 0 for a circle, so:


        2y + D
    M = ------
        2x + C


  This can be converted to an angle using the tan function ie.

    dx = sin( angle ) = 2x + C

    dy = cos( angle ) = 2y + D

  Then the angle is determined from

    angle = atan2( dy, dx )

  or

    angle = atan( dy / dx )


Q14. How do I determine the outward normal of a circle?
-------------------------------------------------------

  Since the derivatives of the circle are:

    dx = 2x + C

    dy = 2y + D

  and the gradient of the outward normal is perpendicular to the gradient
  of the tangent, then:

          1         1
    N = - -  = - ---------
          M        |dy|
                   |--|
                   |dx|

  Then

    Nx = 2x + C = sin( angle )

    Ny = 2y + D = cos( angle )


Q15. How do I determine the octant of a point on a circle?
----------------------------------------------------------

  The equation of a circle is:

      2     2
    Ax  + By  + Cx + Dy + Exy + F = 0


  Plotted in two dimensions, a circle can be divided into eight octants

  +-------------------------------------------+
  |                                           |
  |                   dy=0                    |
  |     dx=-dy  [7]   ^   [0]      dx=dy      |
  |                   |Y                      |
  |        \    dx>dy |  dx>dy   /            |
  |         \   dx>0  |  dx>0   /             |
  |          \  dy>0  |  dy<0  /              |
  |           \       |       /               |
  |      [6]   \    >-o->-   /    [1]         |
  |             \ /   |   \ /                 |
  |     dx < dy  x    |    x      dx > dy     |
  |     dx > 0  / \   |   / \     dx > 0      |
  |     dy > 0 |   \  |  /   |    dy < 0      |
  |            ^    \ | /    v                |
  |  dx=0      |     \|/     |                |
  |  ----------o------+------o-------->  dx=0 |
  |            |     /|\     |                |
  |            ^    / | \    v        X       |
  |      [5]   |   /  |  \   |    [2]         |
  |             \ /   |   \ /                 |
  |     dx < dy  x    |    x      dx > dy     |
  |     dx < 0  / \   |   / \     dx < 0      |
  |     dy > 0 /   -<-o-<-   \    dy < 0      |
  |           /       |       \               |
  |          /  [4]   |   [3]  \              |
  |         /         |         \             |
  |        / dx < dy  |  dx < dy \            |
  |   dx=dy  dx < 0   |  dx < 0    dx=-dy     |
  |          dy > 0   |  dy < 0               |
  |                 dy=0                      |
  |                                           |
  +-------------------------------------------+

  Expressing each line has the following equation:

    Ax + By + C = 0

  generates the following table:

    +--------+-------+----+----+-----+
    |Equation|       |  A |  B |  C  |
    +--------+-------+----+----+-----+
    | dx=dy  | X-Y=0 |  1 | -1 |  0  |
    | dx=0   | X=0   |  1 |  0 |  0  |
    | dx=-dy | X+Y=0 |  1 |  1 |  0  |
    | dy=0   | Y=0   |  0 |  1 |  0  |
    +--------+-------+----+----+-----+


  Each octant has the following attributes:

    +----------+------+------+----------+--------+--------+
    | Octant # |  dx  |  dy  | dx ?? dy | start  | end    |
    +----------+------+------+----------+--------+--------+
    |    0     | > 0  | < 0  | dx >  dy | dy=  0 | dx= dy |
    |    1     | > 0  | < 0  | dx >  dy | dx= dy | dx=  0 |
    |    2     | < 0  | < 0  | dx >  dy | dx=  0 | dx=-dy |
    |    3     | < 0  | < 0  | dx <  dy | dx=-dy | dy=  0 |
    |    4     | < 0  | > 0  | dx <  dy | dy=  0 | dx= dy |
    |    5     | < 0  | > 0  | dx <  dy | dx= dy | dx=  0 |
    |    6     | > 0  | > 0  | dx <  dy | dx=  0 | dx=-dy |
    |    7     | > 0  | > 0  | dx >  dy | dx=-dy | dy=  0 |
    +----------+------+------+----------+--------+--------+


ELLIPSES
========

Q16. What is an ellipse?
------------------------

  An ellipse is a closed curve similar to a circle. However, the radius
  varies between a minimum diameter and a maximum diameter.

  In effect, an ellipse can be considered to be a squashed or stretched
  circle.

  An axis-aligned ellipse can be specified as a centre (c,d)  and
  axis radii (r,s)

  These can be combined to give the equation:

              2         2
         (x-c)     (y-d)
         -----   + ------ - 1 = 0
           2          2
          r          s

  Expnding out this expression will generate an equation identical to that
  of a circle. However, the values of A and B are not guaranteed to be
  equal to one.

  The algebraic expression is:

          2     2
        Ax  + By  + Cx + Dy + Exy + F = 0

  where A,B,C,D,E and F are constant terms.


Q17. How do I calculate the Y coordinate if only the X coordinate is known?
---------------------------------------------------------------------------

  Given the equation:

          2     2
    [1] Ax  + By  + Cx + Dy + Exy + F = 0

  Then the known value of x or y is defined as:

    [2]  x = X

         y = Y

  Substituting [2] into [1] gives:

          2     2
    [3] AX  + By  + CX + Dy + EXy + F = 0

          2     2
        Ax  + BY  + Cx + DY + ExY + F = 0

  Moving all constant terms to the end of the equation gives:

          2                2
    [4] By  + Dy + EXy + AX  + CX + F = 0

          2                2
        Ax  + Cx + ExY + BY  + DY + F = 0

  Converting these into quadratic equations gives:

      2                          2
    Ry  + Sy + T = 0           Rx  + Sx + T = 0

  where:


    R = B                      R = A

    S = D +Ey                  S = C + EY

          2                          2
    T = AX  + CX + F           T = BY  + DY + F


  These values can be solved using quadratic equations.


Q18. How do I determine the gradient of a point on a ellipse?
-------------------------------------------------------------

  The equation of the ellipse is:

      2     2
    Ax  + By  + Cx + Dy + Exy + F = 0

  The values of dx and dy are calculated from:

    dx = 2Ax + C + Ey

    dy = 2By + D + Ex

  The gradient is calculated from:

         dy   2By + D + Ex
    M  = -- = ------------
         dx   2Ax + C + Ey


Q19. How do I determine the outward normal of a point on the ellipse?
---------------------------------------------------------------------

  The equation of the ellipse is:

      2     2
    Ax  + By  + Cx + Dy + Exy + F = 0

  The values of dx and dy are calculated from:

    dx = 2Ax + C + Ey

    dy = 2By + D + Ex

  The outward normal is calculated from:

     N = ( dy, -dx )


Q20. How do I calculate the coefficients of an axis-aligned ellipse?
--------------------------------------------------------------------

  The algebraic exprssion of an ellipse is:

          2     2
        Ax  + By  + Cx + Dy + Exy + F = 0

  where A,B,C,D,E and F are constant terms.

  Multiplying out the denominators in [1] gives:

     2     2    2     2    2 2
    s (x-c)  + r (y-d)  - r s  = 0

  Multiplying out the numerators in [1] gives:

     2  2          2     2  2         2     2 2
    s (x  - 2cx + c ) + r (y - 2dy + d ) - r s  = 0

  Converting into single terms produces:

     2 2    2       2 2    2 2    2       2 2    2 2
    s x  - s 2cx + s c  + r y  - r 2dy + r d  - r s  = 0

  Multiplying every parameter by the denominator gives:

     2 2    2       2 2    2 2    2       2 2    2 2
    s x  - s 2cx + s c  + r y  - r 2dy + r d  - r s  = 0

  Rearranging into the algebraic expression gives:

     2 2    2 2     2        2        2 2    2 2    2 2
    s x  + r y   - s 2cx  - r 2dy  + r d  + s c  - r s  = 0

  The values of the constant terms are then as follows:

          2
    A =  s

          2
    B =  r

          2
    C = -s 2c

          2
    D = -r 2d


    E =  0

          2 2    2 2    2 2
    F =  r d  + s c  - r s

  For an axis-aligned ellipse, A and B are always positive.

  For an axis-aligned ellipse, E is always zero, and F is always negative.

  These constants can be used to render the ellipse using an incremental
  scan-line algorithm.


Q21. How do I calculate the coefficients of an arbitary rotated ellipse?
------------------------------------------------------------------------

  The parameters calculated previously are only correct for an ellipse
  which is aligned with the X and Y axii.

  The ellipse still has to be rotated by the desired angle. This is done
  as follows:

  Rotating a pair of X and Y coordinates can be performed by the following
  expression:

          |  M  N |   | Mx - Ny |
    [x y] |       | = |         |
          | -N  M |   | Nx + My |

  where

    M =  cos( angle )
    N =  sin( angle )

  Substituting the resulting matrix elements into equation [1] gives:

            2             2
    (Mx-Ny-c )    (Nx+My-d )
    ---------- +  ---------- - 1 = 0
         2               2
        r               s

  Multiplying out the denominators gives:

     2|                  |    2|                  |    2 2
    s |(Mx-Ny-c)(Mx-Ny-c)| + r |(Nx+My-d)(Nx+My-d)| - r s  = 0
      |                  |     |                  |

  Multiplying out the equations within the parenthesis gives:


     2|  2 2    2 2    2                       |
    s |(M x  + N y  + c  - 2MxNy - 2Nyc - 2Mxc)| +
      |                                        |

     2|  2 2    2 2    2                       |    2 2
    r |(N x  + M y  + d  + 2NxMy - 2Myd - 2Nxd)| - r s  = 0
      |                                        |

  Then rearranging into the order required by equation [2] gives:


     2 2 2    2 2 2    2         2        2        2 2
    s M x  + s N y  - s 2MxNy - s 2Mxc - s 2Nyc + s c  +


     2 2 2    2 2 2    2         2        2        2 2    2 2
    r N x  + r M y  + r 2MxMy - r 2Myd - r 2Nxd + r d  - r s  = 0


  The values of the constant terms are then as follows:


              2 2    2 2
    A =      s M  + r N

              2 2    2 2
    B =      s N  + r M

              2      2
    C = -2 ( s Mc + r Nd )

              2      2
    D = -2 ( s Nc + r Md )

              2      2
    E =  2 ( s MN - r MN )

              2 2    2 2    2 2
    F =      s c  + r d  - r s


  These values tend to get quite large, so 64-bit integers will be
  required.


Q22. How do I determine the limits for a rotated ellipse?
---------------------------------------------------------

  The equation of the ellipse is:

             2     2
    [1]    Ax  + By  + Cx + Dy + Exy + F = 0

  The derivative for the X-axis is:

    [2]    dx = 2Ax + C + Ey

  The derivative for the Y-axis is:

    [3]    dy = 2By + D + Ex

  When dx is zero, then the current location is at the left or right limit
  of the ellipse.

  When dy is zero, then the current location is at the bottom or top limit
  of the ellipse.

  Calculating the limits for Y gives:


  General equation of the circle:

          2     2
    [1] Ax  + By  + Cx + Dy + Exy + F = 0

  Derivative of Y:

    [2] 2By + D + Ex = 0


  Expressing y in terms of x gives:

        2By = -Ex - D

              -Ex - D
          y =  ------
                 2B

  Substituting into equation [1] gives:

                       2
       2    | -Ex - D |               | -Ex - D |      | -Ex - D |
     Ax  + B| ------- |       + Cx + D| ------- | + Ex | ------- | + F = 0
            |   2B    |               |   2B    |      |    2B   |

  Multiplying out last two brackets gives:

                                                  2     2 2
       2    | (-Ex-D)(-Ex-D)   |          -DEx - D    -E x  - DEx
     Ax  + B| --------------   |   + Cx + --------- + -----------  + F = 0
            |        2         |              2B          2B
                   4B

  Expanding out all brackets produces:

                2 2          2                      2     2
       2    |  E x  +2DEx + D  |          2DE     2D    2E  2   2DE
     Ax  + B| ---------------- |   + Cx - --- x - --- - -- x  - --- x + F = 0
            |          2       |          4B      4B    4B      4B
                     4B

  Cancelling out terms in first bracket and breaking up last two brackets:

                2 2           2                    2     2
       2       E x  + 2DEx + D            2DE    2D    2E   2   2DE
     Ax  +    -----------------    + Cx - ---x - --- - --- x  - ---x + F = 0
                     4B                   4B     4B    4B       4B

  Breaking up first bracket produces:

                2              2                   2     2
       2       E  2   2DE     D           2DE    2D    2E   2   2DE
     Ax  +     --x  + ---x  + --   + Cx - ---x - --- - --- x  - ---x + F = 0
               4B     4B      4B          4B     4B    4B       4B

  Some rearrangement produces:

                2       2                                 2       2
       2       E  2   2E   2        2DE    2DE    2DE    D      2D
     Ax  +     --x  - --- x  + Cx + ---x - ---x - ---x + --   - ---  + F = 0
               4B     4B            4B     4B     4B     4B     4B

  Cancelling out and combining some terms produces:

                2       2                          2     2
       2       E  2   2E  2         2DE - 4DE     D  - 2D
     Ax  +     --x  - -- x   + Cx + --------- x + -------- + F = 0
               4B     4B                4B           4B

  Further reduction produces:

                2     2                    2
       2       E  - 2E   2         2DE    D
     Ax  +     -------- x   + Cx - ---x - -- + F = 0
                  4B               4B     4B

  Final cancellation out produces:

                 2                         2
       2       -E   2              DE     D
     Ax  +     --- x        + Cx - -- x - -- + F = 0
               4B                  2B     4B

  Expressing as a quadratic equation with parameter t produces:

       2
     Pt  + Qt + R = 0


  The final equation for the Y-axis:



     |      2 |      |        |     |      2 |
     |     E  |  2   |     DE |     |     D  |
     | A - -- | t  + | C - -- | t + | F - -- | = 0
     |     4B |      |     2A |     |     4B |

  And for the X-axis:

     |      2 |      |        |     |      2 |
     |     E  |  2   |     CE |     |     C  |
     | B - -- | t  + | D - -- | t + | F - -- | = 0
     |     4A |      |     2B |     |     4A |

  This produces terms:

        Y-axis             X-axis

        |      2 |         |      2 |
        |     E  |         |     E  |
    P = | A - -- |     P = | B - -- |
        |     4B |         |     4A |

        |        |         |        |
        |     DE |         |     CE |
    Q = | C - -- |     Q = | D - -- |
        |     2A |         |     2B |

        |      2 |         |      2 |
        |     D  |         |     C  |
    R = | F - -- |     R = | F - -- |
        |     4B |         |     4A |

  Multiplying out by the common denominator produces:


  The terms for both the X-axis and Y-axis are as follows:

     X-axis                Y-axis
   -----------------     -----------------

                2                     2
     P = 4AB - E           P = 4AB - E


     Q = 4BC - 2DE         Q = 4AD - 2CE

                2                     2
     R = 4BF - D           R = 4AF - C

   -----------------     -----------------


Q23. How do I render a filled rotated ellipse?
----------------------------------------------

  Given an ellipse specified as a pair of centre point coordinates [c,d]
  radii [r,s], and a rotation angle, the steps are as follows:

    1. Convert the radii and centre point into an ellipse equation.

         This converts [c,d] and [r,s] into [A,B,C,D,E,F]

    2. Determine the minimum and maximum X and Y limits for the ellipse.

         This generates [xmin,xmax,ymin,ymax] from [A,B,C,D,E,F]

           width  = xmax - xmin + 1

           height = ymax - ymin + 1

    3. Determine the starting X and Y coordinates from [xmin,ymin]

         This generates [xp,yp] from [A,B,C,D,E,F] and [ymin]

    4. Determine the value of the ellipse equation at [xmin,ymin]
       and the derivatives for the X and Y axii:

                    2     2
         d      = Ax  + By  + Cx + Dy + Exy + F

         dx     = 2Ax + C + Ey

         ddxx   = 2A

         dy     = 2By + D + Ey

         ddyy   = 2B

         ddxy   = 2E

         ddyx   = 2E

    5. Calculate the linear screen address of the first pixel:

         ptr    = screen_address( xmin, ymin )

         dpitch = screen_width

    6. Render the ellipse using the algorithm:

         while ( height-- )      // For every scan-line
           {
           td     = d;           // Temporary copies for horizontal scanning
           tdx    = dx;
           tdy    = dy;
           twidth = width;

           while ( twidth-- )    // For every pixel on scan-line
             {
             if ( td <= 0 )      // Test pixel value
               *ptr = color;

             ptr += 1;           // Horizontal increment
             td  += tdx;
             tdx += ddxx;
             tdy += ddyx;
             }

           ptr += dpitch;        // Vertical increment
           dy  += ddyy;
           dx  += ddxy;
           d   += dy;
           }

    7. Finish

  Note - to avoid overflow errors with 32-bit integers, it may be
         convenient to translate the ellipse to the origin and adjust
         the initial linear screen address accordingly.

         The consequence of this is to set C and D to zero.


Q24. How do I render the outline of a rotated ellipse?
------------------------------------------------------

  This algorithm was first developed by Bresenham during the 1960's.
  Given an ellipse specified as a pair of centre point coordinates [c,d]
  radii [r,s], and a rotation angle, the steps are as follows:

    1. Convert the radii and centre point into an ellipse equation.

         This converts [c,d] and [r,s] into [A,B,C,D,E,F]

    2. Determine the minimum and maximum X and Y limits for the ellipse.

         This generates [xmin,xmax,ymin,ymax] from [A,B,C,D,E,F]

    3. Determine the starting X coordinate from the minimum Y coordinate

         This generates [xp,yp] from [A,B,C,D,E,F] and [ymin]

    4. Determine the value of the ellipse equation at [xmin,ymin]
       and the derivatives for the X and Y axis:

                    2     2
         d      = Ax  + By  + Cx + Dy + Exy + F

         dx     = 2Ax + C + Ey

         ddxx   = 2A

         dy     = 2By + D + Ey

         ddyy   = 2B

         ddxy   = 2E

         ddyx   = 2E

    5. Calculate the linear screen address of the first pixel:

         ptr    = screen_address( xmin, ymin )

         dpitch = screen_width

    6. Render the ellipse using the algorithm:

         --------------------------------------

         #define INCREMENT_X()\
           {\
           ptr += 1;\
           xp  += 1,\
           d   += dx;\
           dx  += ddxx;\
           dy  += ddxy;\
           }

         #define INCREMENT_Y()\
           {\
           ptr += dpitch;\
           yp  += 1;\
           d   += du;\
           dx  += ddyx;\
           dy  += ddyy;\
           }

         #define DECREMENT_X()\
           {\
           ptr -= 1;\
           xp  -= 1;\
           dx  -= ddxx;\
           dy  -= ddxy;\
           d   -= dx;\
           }

         #define DECREMENT_Y()\
           {\
           ptr -= dpitch;\
           yp  -= 1;\
           dx  -= ddyx;\
           dy  -= ddyy;\
           d   -= dy;\
           }

         while ( dx < -dy )                  // Octant 0 (12:00 - 01:30)
           {
           PUTPIXEL( xp, yp, color );

           INCREMENT_X();

           if ( d > 0 )
             INCREMENT_Y();
           }

         while ( dy < 0 )                    // Octant 1 (01:30 - 03:00)
           {
           PUTPIXEL( xp, yp, color );

           INCREMENT_Y();

           if ( d < 0 )
             INCREMENT_X();
           }

         while ( dy < dx )                   // Octant 2 (03:00 - 04:30)
           {
           PUTPIXEL( xp, yp, color );

           INCREMENT_Y();

           if ( d > 0 )
             DECREMENT_X();
           }

         while ( dx > 0 )                    // Octant 3 (04:30 - 06:00)
           {
           PUTPIXEL( xp, yp, color );

           DECREMENT_X();

           if ( d < 0 )
             INCREMENT_Y();
           }

         while ( -dx < dy )                  // Octant 4 (06:00 - 07:30
           {
           PUTPIXEL( xp, yp, color );

           DECREMENT_X();

           if ( d > 0 )
             DECREMENT_Y();
           }

         while ( dy > 0 )                    // Octant 5 (07:30 - 09:00)
           {
           PUTPIXEL( xp, yp, color );

           DECREMENT_Y();

           if ( d < 0 )
             DECREMENT_X();
           }

         while ( dx < dy )                   // Octant 6 (09:00 - 10:30)
           {
           PUTPIXEL( xp, yp, color );

           DECREMENT_Y();

           if ( d > 0 )
             INCREMENT_X();
           }

         while ( dx < 0 )                    // Octant 7 (10:30 - 12:00)
           {
           PUTPIXEL( xp, yp, color );

           INCREMENT_X();

           if ( d < 0 )
             DECREMENT_Y();
           }
         }

       ----------------------------------------

    7. Finish

  Note - to avoid overflow errors with 32-bit integers, it may be
         convenient to translate the ellipse to the origin and recalculate
         the initial starting pixel.

         Thus the values of C are D are only used to calculate the offset
         of the first pixel and are set to zero for all other calculations.