//Program to create a recursive tree.
//This is the base program to be used to start the cs258 project on recursion.
import java.applet.Applet;
import java.awt.*;
import java.util.Random;
public class Tree extends Applet
{ /**
*
*/
private static final long serialVersionUID = -2796931303737879571L;
private final int APPLET_WIDTH = 320;
private final int APPLET_HEIGHT = 320;
private final double STARTSIZE = 110.0;
private final double STARTANGLE = 180.0;
private final double CHANGEANGLE = 30.0;
private final double FACTOR = 2.0;
private final double MINSIZE = 10.0;
Color skyblue = new Color(31, 200, 226);
Color grassgreen = new Color(9, 97, 47);
Color treebark = new Color(77, 49, 25);
int r;
int maxclouds = 30;
//Initialize the applet.
public void init()
{
setSize(APPLET_WIDTH, APPLET_HEIGHT);
setBackground(skyblue);
}
private void setColor(Color green)
{
// setColor(Color green);
}
public void paint(Graphics page)
{
Graphics2D ga = (Graphics2D) page;
ga.setColor(grassgreen);
ga.fillRect(0, APPLET_WIDTH-APPLET_WIDTH/4, APPLET_WIDTH, APPLET_HEIGHT/4 );
drawTree(page, APPLET_WIDTH/2, APPLET_HEIGHT, STARTSIZE, STARTANGLE);
//drawCloud(page, 20, 20, 20, 20, 1);
}
public void drawTree( Graphics page, int x, int y, double size, double angle )
{
page.setColor(treebark);
Point endPoint = calculatePoint(x, y, size, angle );
page.drawLine(x, y, endPoint.x, endPoint.y);
if (size > MINSIZE)
{
drawTree(page, endPoint.x, endPoint.y
, size/FACTOR, angle+CHANGEANGLE);
drawTree(page, endPoint.x, endPoint.y
, size/FACTOR, angle-CHANGEANGLE);
}
}
public void drawGrass(Graphics page, int x, int y, double height, double width)
{
page.setColor(grassgreen);
page.fillRect(APPLET_WIDTH, APPLET_HEIGHT, -320, -90);
}
public void drawCloud (Graphics page, int x, int y, int w, int h, int order)
{
page.setColor(Color.white);
page.fillOval(10, 10, 20, 30);
for(int i = 0; i <30; i++)
{
page.fillOval(pickRandom(0, 80),pickRandom(0, 10),pickRandom(1,3), pickRandom(1, 5));
}
}
public Point calculatePoint( int x, int y, double size, double degree )
{
Point point = new Point(x, y);
double radians = Math.PI/180. * degree;
point.x += (int)(size * Math.sin(radians));
point.y += (int)(size * Math.cos(radians));
return point;
}
public int pickRandom(int min, int max)
{
return (int)Math.random()*(min-max+1) + min;
}}