| CSCI A201/A597Solutions Assignment Eight: Procedures |
// 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;
}
}