Computer Science 252
Problem Solving with Java
Spring 2014, The College of Saint Rose
BroccoliBetter Demo
A working demo of BroccoliBetter will appear below. Click inside the applet to interact with it.
BroccoliBetter BlueJ Project
Click here to download a BlueJ project for BroccoliBetter.
BroccoliBetter Source Code
The Java source code for BroccoliBetter is below. Click on a file name to download it.
/** * Program to create a recursive graphics which looks like broccoli. * Written 11/4/99 by Kim Bruce * Modified 3/12/02 by Andrea Danyluk * * Updated by Jim Teresco for CSC 252, The College of Saint Rose, Fall 2013 * * $Id: BroccoliBetter.java 2244 2013-11-06 04:54:22Z terescoj $ */ import objectdraw.*; import java.awt.*; public class BroccoliBetter extends WindowController { private Location lastCoords; // Where mouse was before last move private BroccoliBranch plant; // Broccoli object to be drawn & moved private boolean broccoliPressed; // whether the brocolli has been pressed /* * Create the broccoli */ public void begin() { plant = new BroccoliBranch(new Location(200,350), 80.0, Math.PI/2.0, canvas); } // Get ready to move broccoli public void onMousePress(Location pt) { lastCoords = pt; broccoliPressed = plant.contains(pt); } // Drag the broccoli around public void onMouseDrag(Location pt) { if (broccoliPressed) { plant.move(pt.getX()-lastCoords.getX(), pt.getY()-lastCoords.getY()); lastCoords = pt; } } }
/* * AngLine.java Jonathan Kallay 7/14/99 * (c) 1999 Williams College */ import java.awt.*; import objectdraw.*; /** * AngLine is an implementation of a drawable line object. * * @author Jonathan Kallay * @version 1.0 last update 8/25/99 * * Updated by Jim Teresco for CSC 252, The College of Saint Rose, Fall 2013 * * $Id: AngLine.java 2244 2013-11-06 04:54:22Z terescoj $ */ public class AngLine extends Line implements LineInterface { private double length; private double angle; /** * Creates a new AngLine object. * @param start the starting point of the line. * @param dest the destination point of the line. * @param c the canvas in which the line is created. */ public AngLine(Location start, double length, double radianAngle, DrawingCanvas canvas){ super(start,new Location(start.getX() + length*Math.cos(radianAngle), start.getY() - length*Math.sin(radianAngle)),canvas); this.length = length; angle = radianAngle; } public Location getDest() { return new Location(start.getX() + length*Math.cos(angle), start.getY() - length*Math.sin(angle)); } }
/** * Class to recursively draw broccoli * * Williams College CSC 134 * Updated by Jim Teresco for CSC 252, The College of Saint Rose, Fall 2013 * * $Id: BroccoliBranch.java 2244 2013-11-06 04:54:22Z terescoj $ */ import objectdraw.*; import java.awt.*; public class BroccoliBranch implements BroccoliPart { // dark green color for broccoli private static final Color BROCCOLI_COLOR = new Color(0,135,0); // Below this size draw flower private static final double MINSIZE = 25.0; // How much broccoli shrinks each call private final static double TOP_FRACT = 0.8; // stem of broccoli private AngLine stem; // branches of broccoli private BroccoliPart left, center, right; /** * Draw broccoli by recursively drawing branches (and flower) */ public BroccoliBranch(Location startCoords, double size, double direction, DrawingCanvas canvas) { // Draw stem and color green stem = new AngLine(startCoords, size, direction, canvas); stem.setColor(BROCCOLI_COLOR); Location destCoords = stem.getEnd(); // end of stem if (size > MINSIZE) { left = new BroccoliBranch(destCoords, size * TOP_FRACT, direction + Math.PI/9.0, canvas); center = new BroccoliBranch(destCoords, size * TOP_FRACT, direction, canvas); right = new BroccoliBranch(destCoords, size * TOP_FRACT, direction - Math.PI/9.0, canvas); } else { left = new Flower(destCoords, size * TOP_FRACT, direction + Math.PI/9.0, canvas); center = new Flower(destCoords, size * TOP_FRACT, direction, canvas); right = new Flower(destCoords, size * TOP_FRACT, direction - Math.PI/9.0, canvas); } } /** * @param x,y amount to move broccoli */ public void move(double x, double y) { stem.move(x,y); // move stem left.move(x,y); // move other parts center.move(x,y); right.move(x,y); } /** * @param point location to be checked for containment in broccoli */ public boolean contains(Location point) { return (stem.contains(point) || left.contains(point) || center.contains(point) || right.contains(point)); } }
import java.awt.*; import objectdraw.*; /* * BrocolliPart is an interface for pieces of broccoli. * * Williams College CSC 134 * Updated by Jim Teresco for CSC 252, The College of Saint Rose, Fall 2013 * * $Id: BroccoliPart.java 2244 2013-11-06 04:54:22Z terescoj $ */ public interface BroccoliPart { // amount to move the broccoli part public void move(double x, double y); // whether a point is contained in the broccoli part public boolean contains(Location point); }
/** * Class to draw a broccoli flower * * Williams College CSC 134 * * Updated by Jim Teresco for CSC 252, The College of Saint Rose, Fall 2013 * * $Id: Flower.java 2244 2013-11-06 04:54:22Z terescoj $ */ import objectdraw.*; import java.awt.*; public class Flower implements BroccoliPart { private static final Color BROCCOLI_COLOR = new Color(0,135,0); private static final int BUD_SIZE = 3; // diameter of bud private AngLine stem; // stem of broccoli private FilledOval bud; // flower of broccoli plant /** * Draw flower */ public Flower(Location startCoords, double size, double direction, DrawingCanvas canvas) { // Draw stem and color green stem = new AngLine(startCoords, size, direction, canvas); stem.setColor(BROCCOLI_COLOR); Location destCoords = stem.getEnd(); // end of stem bud = new FilledOval(destCoords,BUD_SIZE,BUD_SIZE,canvas); bud.setColor(Color.yellow); } /** * @param x,y amount to move flower */ public void move(double x, double y) { // move stem stem.move(x,y); // move bud bud.move(x,y); } /** * @param point location to be checked for containment in flower */ public boolean contains (Location point) { return stem.contains(point) || bud.contains(point); } }
import objectdraw.*; /* * Interface for objects that have an endpoint * * Updated by Jim Teresco for CSC 252, The College of Saint Rose, Fall 2013 * * $Id: LineInterface.java 2244 2013-11-06 04:54:22Z terescoj $ */ public interface LineInterface { // Return endpoin t public Location getDest(); }