#  Four ways to plot a circle
# Plotting a circle is quite straightforward, and also unexciting. 
# However, since it is so familiar an object, it is probably useful to
# use it to compare four different methods for doing the same thing.
# 
# First, let's recall that a circle can be expressed as the set of
# points ((x,y))  which are distance R from the center (a,b).  That is,
> sqrt((x-a)^2+(y-b)^2) = R#  
# or, since r is always positive, we can square both sides to obtain the
# usual equation 
> circleEqn:= (x-a)^2+(y-b)^2=R^2;

                                    2          2    2
                circleEqn := (x - a)  + (y - b)  = R

# 1. As a pair of functions
# To plot the circle as a pair of functions, we need to solve for y.  We
# can do this easily in our heads, (at least I hope you can) or ask
# maple:
> circfuncs:= {solve(circleEqn,y)};
# 

circfuncs :=

            2            2    2 1/2         2            2    2 1/2
    {b + (-x  + 2 x a - a  + R )   , b - (-x  + 2 x a - a  + R )   }

# Since we need a specific choice for the center and radius for this to
# work, let's substitute in a=2,b=1,R=3:
> mycircfuncs:= subs(a=2,b=1,R=3,circfuncs);

                          2           1/2         2           1/2
   mycircfuncs := {1 + (-x  + 4 x + 5)   , 1 - (-x  + 4 x + 5)   }

> plot(mycircfuncs,x=-1..5,scaling=constrained);

# 2. In polar coordinates
# If the circle is centered at the origin, it is, in some sense, most
# naturally expressed in polar coordinates, as r=R.  If the center is
# not at the origin, things are a bit messier, but not too bad.  Recall
# that polar coordinates represent a point in the plane in terms of its
# distance from the origin (usually represented as r) and the angle
# theta it makes with the positive x-axis (measured counterclockwise). 
# Thus, from elementary trigonometry, we have x=r*cos(theta and
# y=r*sin(theta.
# 
# Making this change gives us the following:
> subs(x=r*cos(theta),y=r*sin(theta),circleEqn);

                              2                     2    2
            (r cos(theta) - a)  + (r sin(theta) - b)  = R

# which isn't too bad...   Since we usually try to represent a polar
# function as r=f(theta), we can solve for r to obtain the following.
> polarcirc:=solve(",r);

                                                      2  2
polarcirc := cos(theta) a + sin(theta) b + (cos(theta)  a

                                               2  2    2    2    2
     + 2 cos(theta) a sin(theta) b + sin(theta)  b  - b  + R  - a )^

    1/2                                           2  2
       , cos(theta) a + sin(theta) b - (cos(theta)  a

                                               2  2    2    2    2
     + 2 cos(theta) a sin(theta) b + sin(theta)  b  - b  + R  - a )^

    1/2

# This is really rather dreadful looking, but notice that if a and b are
# both zero, the first simplifies to r=R and the second becomes   r=-R. 
# On closer examination, you can see that if  the circle surrounds the
# origin, (that is a^2+b^2<R^2), then the second always corresponds to
# negative values of the radius, and can be ignored for our purposes. 
# Again, since we want to use  a=2,b=1,R=3, we substitute into the first
# one. 
> mypolarcirc:= subs(a=2,b=1,R=3,polarcirc[1]);

mypolarcirc := 2 cos(theta) + sin(theta)

                    2                                       2     1/2
     + (4 cos(theta)  + 4 cos(theta) sin(theta) + sin(theta)  + 4)

# To plot it, we just tell maple that we are using polar coordinates. 
# We need to allow theta to range over the whole circle, of course.
> plot(mypolarcirc,theta=0..2*Pi,coords=polar);

# I should point out that maple can also do parametric polar plots,
# where both the radius and angle are functions of a parameter t, for
# example, we can make a "butterfly" with something like
> plot([cos(3*t),sin(4*t),t=0..2*Pi], coords=polar,
> axes=boxed,scaling=constrained);

# This, of course, has nothing to do with plotting a circle, but is fun
# anyway.

# 3. In parametric form
# Representing the circle parametrically is quite simple.  Recall that
# for a circle centered at the origin, the pair of  equations 
# {x=R*cos(theta), y=R*sin(theta)}  describe a circle of radius R as
# theta varies from 0 to 2*Pi.  If we want to move the center from the
# origin, all we have to do is add the appropriate constant to the x and
# y coordinates.
> plot([2+3*cos(theta),1+3*sin(theta),theta=0..2*Pi],
> scaling=constrained);

# 4. Described implicitly
# Maple can also plot the relation describing the circle implicitly.  It
# has to work much harder in this case, and the results aren't always as
# nice.  But the call is quite easy, although first we must load in the
# plots library.
> with(plots):
> implicitplot( (x-2)^2 + (y-1)^2= 3^2, x=-10..10, y=-10..10);

# It is worth pointing out a few things here.  First, notice that the
# circle looks a bit ragged.  Also, note that I specified a rather large
# range for x and y (-10 to 10) but maple chose to only show a much
# smaller range.  This is because of the way implicitplot works.  The
# range we specify specifies not the desired plotting region, but where
# to search for solutions.
# Maple chops up the region given into a number of subregions (50 by 50,
# unless you say otherwise) and searches for a solution in each of them.
#  It then plots whatever it found, assuming it is connected "in a nice
# way".  Sometimes it makes mistakes, of course.
# We can greatly improve our picture by specifying a better search area.
> implicitplot( (x-2)^2 + (y-1)^2= 3^2, x=-1..5, y=-2..4);

# Also, we can specify the number of points to search using the "grid"
# option.  Rather than the circle, let's use a more complicated example
# to better show what goes wrong.  
# A trickier example of implicitplot.
#  A deltiod has 3 cusps, making it trickier to get right.  The equation
# (at least in Cartesian cordinates) is also nastier.
> implicitplot( (x^2+y^2)^2 + 8*x*(3*y^2-x^2) + 18*(x^2+y^2) = 27,
> x=-10..10,y=-10..10,scaling=constrained,axes=boxed);

# Certainly some refining is in order.  Note the strange little island
# down in the lower left corner.  Reducing the area of search will help
# a bit.
> implicitplot( (x^2+y^2)^2 + 8*x*(3*y^2-x^2) + 18*(x^2+y^2) = 27,
> x=-1.5..3,y=-2.5..2.5,scaling=constrained,axes=boxed);

# Better, but not perfect.  One obvious problem is that the "nose" at
# the right is being cut off, because we aren't testing points on the
# x-axis.  This can be remedied by specifying a finer grid, but with an
# odd number of points.
> implicitplot( (x^2+y^2)^2 + 8*x*(3*y^2-x^2) + 18*(x^2+y^2) = 27,
> x=-1.5..3,y=-2.5..2.5,grid=[75,75],scaling=constrained,axes=boxed);

# Much, much better.
#
# 5. By cheating
# Maple has a built-in circle drawing function, in the plottools
# package.
> with(plots):
> with(plottools):
> display(circle([2,1],3));

# That is certainly the easiest of all.  But you didn't learn much by
# doing it.  Besides, I said I would show 4 ways, and this is the fifth.