## CS 101 (Spring 2000) Lab 5: Slices of PI (Design Solution)

Lab Assigned
Design Due
(In class)

10 AM
Implement
(In Lab)
Demo
(In Lab)
Lab Due
(In class)
Friday
10 AM
15 Feb 18 Feb 22-33 Feb 29-30 Feb 03 Mar

### Solution APIs for this lab

` PI.java`
This class allows one to draw a circle and throw darts at it.

Coordinates within this class are with respect to the origin of the circle, at (0,0). Thus, the square goes from (-S/2, -S/2) to (S/2, S/2). Translation from my coordinates to Java's is handled by the private method `drawLine`, as explained below.

Constructors
`PI(int S, int n)`
Draws an approximation of a circle. You must use recursion, but you cannot call the constructor recursively -- use a helper method. The diameter of the circle is `S`. The approximation uses (approximately) `n` line segments. No canvas is provided as a parameter so this class has to make its own. After the circle is drawn, a square of size SxS is drawn, so that the circle sits just inside the square.
Accessors
`int numThrown()`
returns the number of darts thrown at the circle.
`int numLandedIn()`
returns the number of darts thrown at the circle that actually landed inside.
`int numLandedOut()`
returns the number of darts thrown at the circle that landed outiside the circle (but of course inside the containing SxS square.

Representation invariant:
`numThrown() = numLandedIn() + numLandedOut()`

From outside this class, we can compute an approximate to PI by

```PI pi = new PI(100, 5);
pi.hurlDarts(1000);
double approx = 4.0 * pi.numLandedIn() / pi.numThrown();
```
Mutators
`void hurlDarts(int m)`
throws `m` (additional) darts at the circle. You must do this part iteratively. Each dart is shown with a dot on the screen.
Other (You needn't have turned these in; I provide these to help you.)
` private void cirrecur(int oldX, int inc) `
the recursive circle-drawer, as explained in class
` private int cirfunc(int x) `
returns the circle's positive `Y` coordinate for the supplied value of `x`.
`private boolean insideCircle(int x, int y)`
returns `true` if the coordinates supplied are inside the circle; otherwise, `false` is returned.
` private hurlDart()`
throws as single dart at the circle,
• If the dart lands inside the circle, the dot is shown in red
• otherwise, the dot is shown in black
The instance variables are updated to reflect the count of those darts landing in and the total number thrown.
`private void drawLine(myX1, myY1, myX2, myY2)` (parameters are all `int`).
I think of the center of the circle as (0,0). This method draws a line using my coordinate system, so it has to translate to Java's coordinate system where the upper, left-hand corner is (0,0).

### Suggested plan for implementation:

1. Type in your constructor for `PI`.
2. Type in some testing code in `Startup` to invoke your `PI` constructor.
3. Work on the throwing-darts part first, not the circle-drawing part
4. Get your accessors to work
5. Now get your recursive circle-drawer to work.