package lab.turtle;
import java.awt.Color;
import java.util.Random;
/**
* A class that supports turtle graphics inside a circular area. The turtle has a
* position, an angle representing the direction that the turtle is facing in,
* and a pen color. The turtle stays inside the circle centered at the point
* (0, 0) and having radius equal to 1.
* The angle of the turtle is measured relative to the positive x-axis, and
* the turtle ensures that the angle is always greater than -360 degrees and
* less than +360 degrees.
*
* @author EECS1030_W14_15
*
*/
public class Turtle {
// DO NOT ADD ANY OTHER NON-STATIC FIELDS TO THE CLASS
/**
* The position of this turtle.
*/
private Point2D position;
/**
* The direction of this turtle.
*/
private double angle;
/**
* The pen color of this turtle.
*/
private Color penColor;
// DO NOT ADD ANY OTHER NON-STATIC FIELDS TO THE CLASS
/**
* Create a turtle located at the exact middle of the circle with an angle of
* 0.0
degrees and a pen color of Color.BLACK
.
*/
public Turtle() {
this(new Point2D(), 0, Color.BLACK);
}
/**
* Create a turtle from another turtle. The created turtle has the same
* position, angle, and pen color as the other turtle.
*
* @param other
* the turtle to copy
*/
public Turtle(Turtle other) {
}
/**
* Create a turtle with the given starting position, angle, and pen color. The
* starting position must be inside or on the circle that the turtle
* is confined to, otherwise an IllegalArgumentException
will be thrown.
*
* @param position
* the starting position of the turtle
* @param angle
* the angle in degrees from the x axis that the turtle is facing in
* @param c
* the pen color
* @pre. c is not null
* @throws IllegalArgumentException
if the starting position is
* not inside or on the circle that the turtle is confined to
*/
public Turtle(Point2D position, double angle, Color c) {
}
/**
* Moves the turtle by a given distance in the direction the turtle is
* currently facing. A line is drawn as the turtle moves to the new position.
*
*
* The turtle will not move outside of the circle that it is confined to. If the
* specified distance would cause the turtle to move outside of the circle,
* then the turtle will move as far as possible in its current direction and
* then stop at the perimeter of the circle.
*
* @param distance
* the distance to move
* @throws IllegalArgumentException
* if the distance is less than zero
*/
public void move(double distance) {
}
/**
* Returns the maximum distance that the turtle can move from its current
* position until it hits the
* perimeter of the circle that the turtle is constrained to move on. The
* maximum distance is computed by considering the turtle's current position
* and direction, as well as the perimeter of the circle.
*
*
* @return the maximum distance that the turtle can move from its
* current position
*/
public double maxDistance() {
return 0;
}
/**
* Turns the turtle to the left, increasing its angle by 90.0 degrees. The
* angle of the turtle is always corrected to be greater than
* -360
degrees and less than +360
degrees.
*
*/
public void turnLeft() {
}
/**
* Turns the turtle to the right, decreasing its angle by 90.0 degrees. The
* angle of the turtle is always corrected to be greater than
* -360
degrees and less than +360
degrees.
*/
public void turnRight() {
}
/**
* Turns the turtle by the specified amount in degrees. A positive
* delta
turns the turtle to the left (counterclockwise) and the
* negative delta
turns the turtle to the right (clockwise). The
* angle of the turtle is always corrected to be greater than
* -360
degrees and less than +360
degrees.
*
* @param delta
* the amount by which to turn the turtle
*/
public void turn(double delta) {
}
/**
* Sets the pen color.
*
* @param c
* the new pen color
* @pre. c is not null
*/
public void setPenColor(Color c) {
}
/**
* Gets the current pen color.
*
* @return the current pen color
*/
public Color getPenColor() {
}
/**
* Gets the current position of the turtle. The client cannot change the
* position of the turtle using the point returned by this
* method. To move the turtle the client must use move
.
*
* @return the current position of the turtle
*/
public Point2D getPosition() {
}
/**
* Gets the direction that the turtle is facing in as an angle measured from
* the x axis. The angle of the turtle is always in the range of
* -360
degrees and +360
degrees.
*
* @return the angle measured in degrees from the x axis that the turtle is
* facing
*/
public double getAngle() {
}
/**
* Returns a string representation of this turtle. The string returned
* is simply the position of the turtle, followed by the angle
* of the turtle, followed by the pen color of the turtle. For example,
* the turtle made with the default constructor has the following
* string representation:
*
*
(0.5, 0.5), 0.0 degrees, java.awt.Color[r=0,g=0,b=0]* *
* The string for the pen color is identical to that produced by
* invoking toString
in java.awt.Color
*
* @return a string representation of this turtle
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return this.position + ", " + this.angle + " degrees, " + this.penColor;
}
/**
* This main method creates an infinite loop where a turtle
* moves changing direction whenever it encounters the perimeter
* of its enclosing circle. The pen color changes to a random
* color every time the turtle changes direction.
*
* @param args not used
*/
public static void main(String[] args) {
StdDraw.circle(0, 0, 1.01);
Random r = new Random(System.currentTimeMillis());
Turtle t = new Turtle();
// the distance that the turtle will try to move each step
final double step = 0.005;
while (true) {
double maxStep = t.maxDistance();
if (maxStep <= step) {
// move and then turn around
t.move(maxStep);
double newAngle = TurtleUtil.bounceDirection(t.getPosition(), t.getAngle());
t.turn(newAngle - t.getAngle() + (r.nextDouble() - 0.5) * 10);
t.setPenColor(TurtleUtil.nextColor());
t.move(step);
}
else {
t.move(step);
}
}
}
}