CSCI A201/A597

Solutions

Assignment Eight: Procedures


Here's an example of an assignment that got all the points.

// Assignment 8 by Trevor Snow 

import element.*;
import java.util.Random;

public class dgermanEight {
   public static void main(String[] args) {
      DrawingWindow d = new DrawingWindow(400, 350, "Sketchpad");
      ConsoleWindow c = new ConsoleWindow();
      Pt cm = new Pt();
      Pt m = new Pt();
      Pt p = new Pt();
      Pt q = new Pt();
      Pt r = new Pt();
      Circle mass = new Circle();
      Circle vp = new Circle();
      Circle vq = new Circle();
      Circle vr = new Circle();
      Rect rlast = new Rect();
      int triFlag = 0; int x;
      final int I_HIGH = 50;
      final int I_LOW  = 0;
      final double D_HIGH = 3.5;
      final double D_LOW  = 0.0;

      RoundRect r1, r2, r3, r4, r5, r6, r7, r8, r9, r10;

      String s1 = "Random Integer";                 Pt p1 = new Pt(55, 15);
      String s2 = "Random Floating point";          Pt p2 = new Pt(75, 45);
      String s3 = "Draw Triangle";                  Pt p3 = new Pt(55, 75);
      String s4 = "Reposition Triangle";            Pt p4 = new Pt(75, 105);
      String s5 = "Distance";                       Pt p5 = new Pt(40, 135);
      String s6 = "Circle overlap";                 Pt p6 = new Pt(55, 165);
      String s7 = "Rectangle overlap";              Pt p7 = new Pt(60, 195);
      String s8 = "Pause for double # of seconds";  Pt p8 = new Pt(105, 225);
      String s9 = "Clear window";                   Pt p9 = new Pt(45, 255);
      String s10 = "QUIT!";                         Pt p10 = new Pt(25, 285);

      r1 = Lib.strRect(d, s1, p1);
      r2 = Lib.strRect(d, s2, p2);
      r3 = Lib.strRect(d, s3, p3);
      r4 = Lib.strRect(d, s4, p4);
      r5 = Lib.strRect(d, s5, p5);
      r6 = Lib.strRect(d, s6, p6);
      r7 = Lib.strRect(d, s7, p7);
      r8 = Lib.strRect(d, s8, p8);
      r9 = Lib.strRect(d, s9, p9);
      r10 = Lib.strRect(d, s10, p10);
      d.invertMode();


      while(true) {
         d.awaitMousePress();
         m = d.getMouse();
         if(Lib.mClick(d, r1, m)) {
            c.out.println(s1 + ": " + Lib.iRand(I_HIGH, I_LOW));
         } else if(Lib.mClick(d, r2, m)) {
            d.fill(r2);
            c.out.println(s2 + ": " + Lib.dRand(D_HIGH, D_LOW));
         } else if(Lib.mClick(d, r3, m)) {
            c.out.println("Click three points on Sketchpad.");
            d.awaitMouseClick();
            p = d.getMouse();
            d.awaitMouseClick();
            q = d.getMouse();
            d.awaitMouseClick();
            r = d.getMouse();
            Lib.drawTri(d, p, q, r);
            cm = Lib.cM(p, q, r);
            vp = new Circle(p, 3);
            vq = new Circle(q, 3);
            vr = new Circle(r, 3);
            mass = new Circle(cm, 3);
            d.fill(mass);
            d.fill(vp);
            d.fill(vr);
            d.fill(vq);
            triFlag = 1;
         } else if(Lib.mClick(d, r4, m)) {
            if(triFlag==1) {
               c.out.println("Click and drag point of triangle to relocate it");
               d.awaitMousePress();
               m = d.getMouse();
               x = 0;
               if(vp.contains(m)) {
                  x=1;
               } else if(vq.contains(m)) {
                  x=2;
               } else if(vr.contains(m)) {
                  x=3;
               } else {
                  c.out.println("You didn't click on an endpoint!");
               }
               d.fill(mass);
               d.fill(vp);
               d.fill(vr);
               d.fill(vq);
               m = Lib.rubberTri(d, x, p, q, r);
               if(x==1) {
                  p = m;
                  vp = new Circle(p, 3);
               } else if(x==2) {
                  q = m;
                  vq = new Circle(q, 3);
               } else if(x==3) {
                  r = m;
                  vr = new Circle(r, 3);
               }
               cm = Lib.cM(p, q, r);
               c.out.println(x);
               mass = new Circle(cm, 3);
               d.fill(mass);
               d.fill(vp);
               d.fill(vr);
               d.fill(vq);
            } else { c.out.println("Create a triangle first"); }

         } else if(Lib.mClick(d, r5, m)) {
            c.out.println("Click 2 points on screen");
            d.awaitMouseClick();
            p = d.getMouse();
            d.awaitMouseClick();
            r = d.getMouse();
            d.draw(new Line(p, r));
            c.out.println("Distance: " + Lib.distance(p,r));
            q = Lib.midp(p, r);
            d.fill(new Circle(p, 2));
            d.draw(new Circle(q, 2));
            d.fill(new Circle(r, 2));

         } else if(Lib.mClick(d, r6, m)) {
             c.out.println("Click two points for center of circles");
             d.awaitMouseClick();
             m = d.getMouse();
             Circle c1 = new Circle(m, 25);
             d.draw(c1);
             d.awaitMouseClick();
             m = d.getMouse();
             Circle c2 = new Circle(m, 25);
             d.draw(c2);
             if(Lib.overlapC(c1, c2)) {
                c.out.println("Circles overlap");
             } else {
                c.out.println("Circles don't overlap");
             }
         } else if(Lib.mClick(d, r7, m)) {
             c.out.println("Click two points for upper-left rectangle corner");
             d.awaitMouseClick();
             m = d.getMouse();
             Rect rr1 = new Rect(m.x(), m.y(), 30, 15);
             d.draw(rr1);
             d.awaitMouseClick();
             m = d.getMouse();
             Rect rr2 = new Rect(m.x(), m.y(), 30, 15);
             d.draw(rr2);
             if(Lib.overlapR(rr2, rr1)) {
                c.out.println("Rectangles overlap");
             } else {
                c.out.println("Rectangles don't overlap");
             }
         } else if(Lib.mClick(d, r8, m)) {
             double wait = Lib.dRand(D_HIGH, D_LOW);
             c.out.println("Pausing for: " + wait + " seconds...");
             Lib.waitNsec(wait);
             c.out.println("DONE!");
         } else if(Lib.mClick(d, r9, m)) {
             d.clear(d.bounds());
             d.paintMode();
             r1 = Lib.strRect(d, s1, p1);
             r2 = Lib.strRect(d, s2, p2);
             r3 = Lib.strRect(d, s3, p3);
             r4 = Lib.strRect(d, s4, p4);
             r5 = Lib.strRect(d, s5, p5);
             r6 = Lib.strRect(d, s6, p6);
             r7 = Lib.strRect(d, s7, p7);
             r8 = Lib.strRect(d, s8, p8);
             r9 = Lib.strRect(d, s9, p9);
             r10 = Lib.strRect(d, s10, p10);
             d.invertMode();
         } else if(Lib.mClick(d, r10, m)) {
             System.exit(0);
         }
         d.fill(rlast);
      }

   }
}

class Lib {
    public static int iRand(int high, int low) {
       Random random = new Random();
       int range = high - low + 1;
       int val = random.nextInt();
       val = Math.abs(val) % range;
       return (val + low);
    }

    public static double dRand(double high, double low) {
       Random random = new Random();
       double val = random.nextDouble();
       double range = high - low + 1;
       return val * range + low;
    }

    public static void drawTri(DrawingWindow d, Pt p, Pt q, Pt r) {
       d.draw(new Line(p,q));
       d.draw(new Line(q,r));
       d.draw(new Line(r,p));
    }

    public static Pt rubberTri(DrawingWindow d, int c, Pt p, Pt q, Pt r) {
       Line lpq = new Line(p,q);
       Line lqr = new Line(q,r);
       Line lrp = new Line(r,p);
       Pt m = new Pt();
       while(d.mousePressed()) {
          m = d.getMouse();
          switch(c) {       // c is point moved; c = 1, p   c = 2, q   c = 3, r
            case 1:
               d.draw(lpq);
               d.draw(lrp);
               lpq = new Line(m, q);
               lrp = new Line(m, r);
               d.draw(lpq);
               d.draw(lrp);
               break;
            case 2:
               d.draw(lqr);
               d.draw(lpq);
               lqr = new Line(m, r);
               lpq = new Line(m, p);
               d.draw(lqr);
               d.draw(lpq);
               break;
            case 3:
               d.draw(lqr);
               d.draw(lrp);
               lrp = new Line(m, p);
               lqr = new Line(m, q);
               d.draw(lqr);
               d.draw(lrp);
               break;
          }
       }
       return m;
    }

    public static double distance(Pt a, Pt b) {
       double x = a.x() - b.x();
       double y = a.y() - b.y();
       return Math.sqrt(x * x + y * y);
    }

    public static Pt midp(Pt a, Pt b) {
       Pt m = new Pt((a.x() + b.x()) / 2, (a.y() + b.y()) / 2);
       return m;
    }

    public static Pt cM(Pt a, Pt b, Pt c) {
       Pt m = new Pt((a.x() + b.x()) / 2, (a.y() + b.y()) / 2);
       Pt cm = new Pt(m.x() + (c.x() - m.x())/3, m.y() + (c.y() - m.y())/3);
       return cm;
    }

    public static boolean overlapC(Circle p, Circle q) {
       return ((Lib.distance(p.center(), q.center())) <= (p.radius() + q.radius()));
    }

    public static boolean overlapR(Rect r1, Rect r2) {
       boolean a, b, c, d;
       a = r1.top() >= r2.top() && r1.top() <= r2.bottom();
       b = r1.bottom() <= r2.bottom() && r1.bottom() >= r1.top();
       c = r1.left() >= r2.left() && r1.left() <= r2.right();
       d = r1.right() <= r2.right() && r1.right() >= r2.left();
       return (a||b)&&(c||d);
    }

    public static RoundRect strRect(DrawingWindow d, String s, Pt p) {
       Text t = new Text(s, 10, 10);
       t.center(p);
       d.draw(t);
       RoundRect r = new RoundRect(t.left(), t.top(), t.width(), t.height(), 5, 5);
       d.draw(r);
       return r;
    }

    public static void waitNsec(double n) {
       int wait = (int)(n * 1000);
       long now = System.currentTimeMillis();
       while(System.currentTimeMillis() < (now + wait)) {}
    }

    public static boolean mClick(DrawingWindow d, RoundRect r, Pt m) {
       if(r.contains(m)) {
          d.awaitMouseRelease();
          m = d.getMouse();
          return r.contains(m);
       }
       return false;
    }

}