diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 75e81d8..2201cd8 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,18 +2,24 @@ - - - - - - + + + + + + + + - + + + + + @@ -37,8 +43,8 @@ - - + + @@ -57,60 +63,49 @@ - - - - - - - - - - - - - - - - - - + + - - - - - - - - + + + + - - + + - - + + - - - + + + + + + + + + + + + - + @@ -118,11 +113,61 @@ - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -135,8 +180,8 @@ @@ -161,29 +206,33 @@ - @@ -196,7 +245,7 @@ - + @@ -209,7 +258,45 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -243,62 +330,14 @@ - - - - - - - - - - - - + + + - - - - - - + - + - + + + + @@ -536,34 +519,16 @@ - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -626,10 +591,10 @@ - - - - + + + + @@ -665,10 +630,10 @@ - - - - + + + + @@ -679,10 +644,10 @@ - - - - + + + + @@ -693,10 +658,10 @@ - - - - + + + + @@ -707,10 +672,10 @@ - - - - + + + + @@ -721,10 +686,10 @@ - - - - + + + + @@ -735,10 +700,10 @@ - - - - + + + + @@ -793,22 +758,6 @@ - - - - - - - - - - - - - - - - @@ -817,101 +766,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -919,9 +793,19 @@ + + + + + + + + + + - + @@ -930,38 +814,199 @@ - + - - + + + + + + + + + + - - - - - - - - - - + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ClickGetter.java b/src/ClickGetter.java index db9589e..57871d2 100644 --- a/src/ClickGetter.java +++ b/src/ClickGetter.java @@ -1,3 +1,43 @@ public interface ClickGetter { boolean click(int mouseX, int mouseY); } + + +//public interface Shape { +// public int numVertices(); +//} +// +// +//class Circle2 implements Shape { +// Circle2() { +// blah; +// } +// +// int numVertices() { +// return 0; +// } +// +// void expand() { +// blah2; +// } +//} +// +//class Square implements Shape { +// int numVertices() { +// return 4; +// } +//} +// +// +//Shape g = new Circle2(); +////g.expand(); // bad +//println(g.numVertices()); //good +//g = new Square(); +//println(g.numVertices()); +// +//void printNumberOfVertices(Shape s) { +// println(s.numVertices()); +//} +// +//printNumberOfVertices(new Circle2()); +//printNumberOfVertices(new Square()); diff --git a/src/Ellipse.java b/src/Ellipse.java index b19a6ca..ccdd118 100644 --- a/src/Ellipse.java +++ b/src/Ellipse.java @@ -32,7 +32,7 @@ class Ellipse { this.widthComplete = true; } - ProjectorCommand drawCommand() { + ProjectorCommand makeProjectorCommand() { return (ProjectorApplet p) -> { if (!visible) { //done drawing already @@ -49,13 +49,14 @@ class Ellipse { p.ellipse(p.convertXCoord(centerX), p.convertYCoord(centerY), p.convertXDistance(width), p.convertYDistance(height)); + p.strokeWeight(old_strokeWeight); p.stroke(old_strokeColor); return true; }; } - ClickGetter makeClickGetter(ProjectorApplet p) { + ClickGetter makeClickGetter(ProjectorApplet p){ return (int x, int y) -> { if (!centerPointComplete){ centerX = x; @@ -72,7 +73,7 @@ class Ellipse { height = abs(centerY - y) * 2; visible = true; - p.commandQueue.add(drawCommand()); + p.commandQueue.add(makeProjectorCommand()); return true; } }; diff --git a/src/EuglenaApplet.java b/src/EuglenaApplet.java index f072f61..f044de9 100644 --- a/src/EuglenaApplet.java +++ b/src/EuglenaApplet.java @@ -60,8 +60,15 @@ public class EuglenaApplet extends PApplet { @Override public void mouseClicked(){ + // Ignore mouse clicks in menu area + if (mouseX > width - menu.width) { + return; + } + + // If we have a clickGetter, use that to handle the mouse click if (clickGetter != null) { - if (clickGetter.click(mouseX, mouseY)) { + boolean done = clickGetter.click(mouseX, mouseY); + if (done) { clickGetter = null; } } @@ -69,17 +76,12 @@ public class EuglenaApplet extends PApplet { @Override public void keyPressed() { + ledControl.keyPressed(key); if (key == CODED) { projectorApplet.calibrator.buttonPressed(keyCode); } else { switch(key) { - case 'd': - case 'w': - case 'a': - case 's': - ledControl.keyPressed(key); - break; case ENTER: //TODO: snapshot //snapshot(); @@ -93,14 +95,7 @@ public class EuglenaApplet extends PApplet { @Override public void keyReleased() { - switch(key) { - case 'd': - case 'w': - case 'a': - case 's': - ledControl.keyReleased(key); - break; - } + ledControl.keyReleased(key); } public void controlEvent(ControlEvent theEvent) { diff --git a/src/Expand.java b/src/Expand.java new file mode 100644 index 0000000..74fb314 --- /dev/null +++ b/src/Expand.java @@ -0,0 +1,96 @@ +import processing.core.*; +import static processing.core.PApplet.*; + + +public class Expand { + float corner1x, corner1y, corner2x, corner2y, speed; + int timeElapsed, millisInit; + PImage expandRegion; + + private boolean corner1complete; + + Expand(float speed) { + this.speed = speed; + this.corner1complete = false; + } + + + Expand(float corner1x, float corner1y, float corner2x, float corner2y, float speed) { + this.corner1x = corner1x; + this.corner1y = corner1y; + this.corner2x = corner2x; + this.corner2y = corner2y; + this.speed = speed; + + this.corner1complete = true; + } + + float aspectRatio() { + return abs((corner2x - corner1x) / (corner2y - corner1y)); + } + + float centerx() { + return (corner1x + corner2x) / 2; + } + + float centery() { + return (corner1y + corner2y) / 2; + } + + void saveExpandRegion(ProjectorApplet p) { + this.expandRegion = p.get( + (int) p.convertXCoord(corner1x), + (int) p.convertYCoord(corner1y), + (int) abs(p.convertXDistance(corner2x - corner1x)), + (int) abs(p.convertYDistance(corner2y - corner1y))); + } + + + ProjectorCommand makeProjectorCommand() { + return (ProjectorApplet p) -> { + timeElapsed = p.millis() - millisInit; + + float spaceElapsed = speed * (timeElapsed / 1000f); + + if (p.convertYDistance(corner2y - corner1y) + spaceElapsed >= p.convertYDistance(p.height)) { + return true; + } + + p.noFill(); + p.noStroke(); + p.rectMode(CORNER); + p.rect(p.convertXCoord(corner1x), p.convertYCoord(corner1y), + p.convertXDistance(corner2x - corner1x), p.convertYDistance(corner2y - corner1y)); + + p.imageMode(CENTER); + p.image(expandRegion, + p.convertXCoord(this.centerx()), + p.convertYCoord(this.centery()), + p.convertXDistance(corner2x - corner1x) + spaceElapsed * aspectRatio(), + p.convertYDistance(corner2y - corner1y) + spaceElapsed); + + return false; + }; + } + + + ClickGetter makeClickGetter(ProjectorApplet p) { + return (int x, int y) -> { + if (!corner1complete) { + corner1x = x; + corner1y = y; + corner1complete = true; + return false; + + } else { + corner2x = x; + corner2y = y; + millisInit = p.millis(); + saveExpandRegion(p); + + p.commandQueue.add(makeProjectorCommand()); + return true; + } + }; + } +} diff --git a/src/ExpandClass.java b/src/ExpandClass.java deleted file mode 100644 index 3bd8389..0000000 --- a/src/ExpandClass.java +++ /dev/null @@ -1,84 +0,0 @@ -class Expand { - ExpandWindow expandinprogress; - - boolean corner1complete; - - void reset() { - expandinprogress = new ExpandWindow(-1,-1,0,0,0); - corner1complete = false; - } - - Expand(){ - corner1complete = false; - } - - void mouseClicked(float x, float y){ - if (!corner1complete){ - expandinprogress.corner1x = x; - expandinprogress.corner1y = y; - corner1complete = true; - } else { - expandinprogress.corner2x = x; - expandinprogress.corner2y = y; - expandinprogress.speed = speed; - expandinprogress.millisInit = millis(); - expandinprogress.saveExpandRegion(); - expandwindows.add(expandinprogress); - this.reset(); - } - } -} - -class ExpandWindow { - float corner1x, corner1y, corner2x, corner2y, speed; - int timeElapsed, millisInit; - PImage expandRegion; - - ExpandWindow(float corner1x, float corner1y, float corner2x, float corner2y, float speed) { - this.corner1x = corner1x; - this.corner1y = corner1y; - this.corner2x = corner2x; - this.corner2y = corner2y; - this.speed = speed; - } - - float aspectRatio() { - return abs((corner2x - corner1x) / (corner2y - corner1y)); - } - - float centerx() { - return (corner1x + corner2x) / 2; - } - - float centery() { - return (corner1y + corner2y) / 2; - } - - void saveExpandRegion() { - this.expandRegion = get(int(convertXCoord(corner1x)), int(convertYCoord(corner1y)), - int(convertXDistance(corner2x - corner1x)),int(convertYDistance(corner2y - corner1y))); - } - - void draw() { - - timeElapsed = millis() - millisInit; - - if (convertYDistance(corner2y - corner1y) + speed * (timeElapsed / 1000) < convertYDistance(screenHeight)) { - - noFill(); - noStroke(); - rectMode(CORNER); - rect(convertXCoord(corner1x), convertYCoord(corner1y), - convertXDistance(corner2x - corner1x), convertYDistance(corner2y - corner1y)); - - - imageMode(CENTER); - image(expandRegion, convertXCoord(this.centerx()), convertYCoord(this.centery()), - convertXDistance(corner2x - corner1x) + speed * this.aspectRatio() * (timeElapsed / 1000), - convertYDistance(corner2y - corner1y) + speed * (timeElapsed / 1000)); - - - - } - } -} diff --git a/src/Line.java b/src/Line.java index 665ef6d..106d0f2 100644 --- a/src/Line.java +++ b/src/Line.java @@ -30,7 +30,7 @@ class Line { } - ProjectorCommand drawCommand() { + ProjectorCommand makeProjectorCommand() { return (ProjectorApplet p) -> { if (!visible) { //done drawing already @@ -66,7 +66,7 @@ class Line { y2 = y; visible = true; - p.commandQueue.add(drawCommand()); + p.commandQueue.add(makeProjectorCommand()); return true; } }; diff --git a/src/Menu.java b/src/Menu.java index 4fff1d3..6359bad 100644 --- a/src/Menu.java +++ b/src/Menu.java @@ -189,9 +189,7 @@ class Menu { } void controlEvent(ControlEvent theEvent) { - println(theEvent); - println(theEvent.getName()); - println(theEvent.getLabel()); + //println(theEvent); if (theEvent.isFrom(shapesList)) { switch((int) shapesList.getValue()) { case 0: @@ -211,19 +209,15 @@ class Menu { switch((int) animateList.getValue()) { case 0: // shrink.reset(); -// drawtype = 's'; break; case 1: // expand.reset(); -// drawtype = 'x'; break; case 2: // translate.reset(); -// drawtype = 'm'; break; case 3: // rotate.reset(); -// drawtype = 'c'; break; } } else if (theEvent.isFrom(presetsList)){ @@ -231,13 +225,26 @@ class Menu { } else { switch (theEvent.getLabel()) { case "Commit": - int rVal = Integer.parseInt(redField.getText()); - int gVal = Integer.parseInt(greenField.getText()); - int bVal = Integer.parseInt(blueField.getText()); - parent.penColor = parent.color(rVal, gVal, bVal); + try { + int rVal = Integer.parseInt(redField.getText()); + int gVal = Integer.parseInt(greenField.getText()); + int bVal = Integer.parseInt(blueField.getText()); + parent.penColor = parent.color(rVal, gVal, bVal); + } catch (NumberFormatException e) { + println("Ignored non-numeric color."); + } - parent.penWidth = Integer.parseInt(penwidthField.getText()); - parent.projectorApplet.setBgColor(Integer.parseInt(backgroundField.getText())); + try { + parent.penWidth = Integer.parseInt(penwidthField.getText()); + } catch (NumberFormatException e) { + println("Ignored bad pen width"); + } + + try { + parent.projectorApplet.setBgColor(Integer.parseInt(backgroundField.getText())); + } catch (NumberFormatException e) { + println("Ignored bad background color."); + } // parent.lagTime = Integer.parseInt(lagField.getText()); // parent.totalTime = Integer.parseInt(totaltimeField.getText()); // parent.speed = Integer.parseInt(speedField.getText()); diff --git a/src/ProjectorApplet.java b/src/ProjectorApplet.java index 4b151d8..da6f77f 100644 --- a/src/ProjectorApplet.java +++ b/src/ProjectorApplet.java @@ -1,6 +1,5 @@ import processing.core.PApplet; - -import java.util.ArrayDeque; +import java.util.ArrayList; class ProjectorApplet extends PApplet { final int projectorScreenNumber = 2; @@ -13,12 +12,12 @@ class ProjectorApplet extends PApplet { EuglenaApplet parent; Calibrator calibrator; - ArrayDeque commandQueue; + ArrayList commandQueue; ProjectorApplet(EuglenaApplet parent) { this.parent = parent; calibrator = new Calibrator(this); - commandQueue = new ArrayDeque<>(); + commandQueue = new ArrayList<>(); } public void settings() { @@ -36,14 +35,29 @@ class ProjectorApplet extends PApplet { public void draw() { calibrator.draw(parent); - while (!commandQueue.isEmpty()) { - ProjectorCommand command = commandQueue.getFirst(); - if (command.run(this)) { - commandQueue.removeFirst(); - } else { - break; + ArrayList entriesToRemove = new ArrayList<>(); + try { + for (int i = 0; i < commandQueue.size(); i++) { + + boolean done = commandQueue.get(i).run(this); + if (done) { + entriesToRemove.add(i); + } + } + } catch (ProjectorCommandException e) { + // Do nothing } + + // Remove entries (have to do it in reverse order to preserve indices) + for (int i = entriesToRemove.size() - 1; i >= 0; i--) { + commandQueue.remove(i); + } + } + + public void reset() { + commandQueue.clear(); + this.clear(); } public void clear() { diff --git a/src/ProjectorCommand.java b/src/ProjectorCommand.java index a90dd0d..37fbd87 100644 --- a/src/ProjectorCommand.java +++ b/src/ProjectorCommand.java @@ -1,3 +1,9 @@ public interface ProjectorCommand { - boolean run(ProjectorApplet p); + boolean run(ProjectorApplet p) throws ProjectorCommandException; +} + +class ProjectorCommandException extends Exception { + ProjectorCommandException(String message) { + super(message); + } } diff --git a/src/Rectangle.java b/src/Rectangle.java index c27b502..b7d3e33 100644 --- a/src/Rectangle.java +++ b/src/Rectangle.java @@ -30,7 +30,7 @@ class Rectangle { this.corner1complete = true; } - ProjectorCommand drawCommand() { + ProjectorCommand makeProjectorCommand() { return (ProjectorApplet p) -> { if (!visible) { //done drawing already @@ -66,7 +66,7 @@ class Rectangle { corner2y = y; visible = true; - p.commandQueue.add(drawCommand()); + p.commandQueue.add(makeProjectorCommand()); return true; } }; diff --git a/src/Rotate.java b/src/Rotate.java new file mode 100644 index 0000000..a03040c --- /dev/null +++ b/src/Rotate.java @@ -0,0 +1,76 @@ +import processing.core.*; +import static processing.core.PApplet.*; + + +public class Rotate { + float centerx, centery, radius, speed; + int timeElapsed, millisInit; + PImage rotateRegion; + + private boolean centercomplete; + + Rotate(float speed) { + this.speed = speed; + this.centercomplete = false; + } + + Rotate(float centerx, float centery, float radius, float speed) { + this.centerx = centerx; + this.centery = centery; + this.radius = radius; + this.speed = speed; + + this.centercomplete = true; + } + + void saveRotateRegion(ProjectorApplet p) { + this.rotateRegion = p.get( + (int) p.convertXCoord(centerx - radius), + (int) p.convertYCoord(centery - radius), + (int) p.convertXDistance(2*radius), + (int) p.convertYDistance(2*radius)); + } + + ProjectorCommand makeProjectorCommand() { + return (ProjectorApplet p) -> { + timeElapsed = p.millis() - millisInit; + + p.noFill(); + p.noStroke(); + p.rectMode(CENTER); + p.rect(p.convertXCoord(centerx), p.convertYCoord(centery), + p.convertXDistance(radius), p.convertYDistance(radius)); + + p.pushMatrix(); + p.translate(p.convertXCoord(centerx), p.convertYCoord(centery)); + + p.rotate(radians(speed * timeElapsed/1000f)); + + p.imageMode(CENTER); + p.image(rotateRegion, 0, 0, p.convertXDistance(2*radius), p.convertYDistance(2*radius)); + + p.popMatrix(); + + return false; + }; + } + + ClickGetter makeClickGetter(ProjectorApplet p){ + return (int x, int y) -> { + if (!centercomplete){ + centerx = x; + centery = y; + centercomplete = true; + return false; + + } else { + radius = sqrt(pow(x - centerx, 2) + pow(y - centery, 2)); + millisInit = p.millis(); + saveRotateRegion(p); + + p.commandQueue.add(makeProjectorCommand()); + return true; + } + }; + } +} diff --git a/src/RotateClass.java b/src/RotateClass.java deleted file mode 100644 index 1e009f4..0000000 --- a/src/RotateClass.java +++ /dev/null @@ -1,68 +0,0 @@ -class Rotate { - RotateWindow rotateinprogress; - - boolean centercomplete; - - void reset() { - rotateinprogress = new RotateWindow(-1,-1,0,0); - centercomplete = false; - } - - Rotate(){ - centercomplete = false; - } - - void mouseClicked(float x, float y){ - if (!centercomplete){ - rotateinprogress.centerx = x; - rotateinprogress.centery = y; - centercomplete = true; - } else { - rotateinprogress.radius = sqrt(pow(x - rotateinprogress.centerx, 2) + pow(y - rotateinprogress.centery, 2)); - rotateinprogress.speed = speed; - rotateinprogress.millisInit = millis(); - rotateinprogress.saveRotateRegion(); - rotatewindows.add(rotateinprogress); - this.reset(); - } - } -} - -class RotateWindow { - float centerx, centery, radius, speed; - int timeElapsed, millisInit; - PImage rotateRegion; - - RotateWindow(float centerx, float centery, float radius, float speed) { - this.centerx = centerx; - this.centery = centery; - this.radius = radius; - this.speed = speed; - } - - void saveRotateRegion() { - this.rotateRegion = get(int(convertXCoord(centerx - radius)), int(convertYCoord(centery - radius)), - int(convertXDistance(2*radius)),int(convertYDistance(2*radius))); - } - - void draw() { - - timeElapsed = millis() - millisInit; - - noFill(); - noStroke(); - rectMode(CENTER); - rect(convertXCoord(centerx), convertYCoord(centery), - convertXDistance(radius), convertYDistance(radius)); - - pushMatrix(); - translate(convertXCoord(centerx), convertYCoord(centery)); - - rotate(radians(speed*timeElapsed/1000)); - - imageMode(CENTER); - image(rotateRegion, 0, 0, convertXDistance(2*radius), convertYDistance(2*radius)); - - popMatrix(); - } -} diff --git a/src/Shrink.java b/src/Shrink.java new file mode 100644 index 0000000..341a8a9 --- /dev/null +++ b/src/Shrink.java @@ -0,0 +1,90 @@ +import processing.core.*; +import static processing.core.PApplet.*; + + +class Shrink { + float corner1x, corner1y, corner2x, corner2y, speed; + int timeElapsed, millisInit; + PImage shrinkRegion; + + private boolean corner1complete; + + Shrink(float speed) { + this.speed = speed; + this.corner1complete = false; + } + + Shrink(float corner1x, float corner1y, float corner2x, float corner2y, float speed) { + this.corner1x = corner1x; + this.corner1y = corner1y; + this.corner2x = corner2x; + this.corner2y = corner2y; + this.speed = speed; + + this.corner1complete = true; + } + + float aspectRatio() { + return abs((corner2x-corner1x)/(corner2y-corner1y)); + } + + float centerx() { + return (corner1x + corner2x) / 2; + } + + float centery() { + return (corner1y + corner2y) / 2; + } + + void saveShrinkRegion(ProjectorApplet p) { + this.shrinkRegion = p.get( + (int) p.convertXCoord(corner1x), + (int) p.convertYCoord(corner1y), + (int) abs(p.convertXDistance(corner2x-corner1x)), + (int) abs(p.convertYDistance(corner2y-corner1y))); + } + + ProjectorCommand makeProjectorCommand() { + return (ProjectorApplet p) -> { + timeElapsed = p.millis() - millisInit; + + if (p.convertXDistance(corner2x-corner1x) - speed * aspectRatio() * (timeElapsed/1000f) < 25) { + return true; + } + + p.noFill(); + p.noStroke(); + p.rectMode(CORNER); + p.rect(p.convertXCoord(corner1x), p.convertYCoord(corner1y), + p.convertXDistance(corner2x - corner1x), p.convertYDistance(corner2y - corner1y)); + + p.imageMode(CENTER); + p.image(shrinkRegion, p.convertXCoord(this.centerx()), p.convertYCoord(this.centery()), + p.convertXDistance(corner2x - corner1x) - speed * aspectRatio() * (timeElapsed / 1000f), + p.convertYDistance(corner2y - corner1y) - speed * (timeElapsed / 1000f)); + + return false; + }; + } + + + ClickGetter makeClickGetter(ProjectorApplet p){ + return (int x, int y) -> { + if (!corner1complete){ + corner1x = x; + corner1y = y; + corner1complete = true; + return false; + + } else { + corner2x = x; + corner2y = y; + millisInit = p.millis(); + saveShrinkRegion(p); + + p.commandQueue.add(makeProjectorCommand()); + return true; + } + }; + } +} diff --git a/src/ShrinkClass.java b/src/ShrinkClass.java deleted file mode 100644 index 5c58063..0000000 --- a/src/ShrinkClass.java +++ /dev/null @@ -1,93 +0,0 @@ -class Shrink { - ShrinkWindow shrinkinprogress; - - boolean corner1complete; - - void reset() { - shrinkinprogress = new ShrinkWindow(-1,-1,0,0,0); - corner1complete = false; - } - - Shrink(){ - corner1complete = false; - } - - void mouseClicked(float x, float y){ - if (!corner1complete){ - shrinkinprogress.corner1x = x; - shrinkinprogress.corner1y = y; - corner1complete = true; - } else { - shrinkinprogress.corner2x = x; - shrinkinprogress.corner2y = y; - shrinkinprogress.speed = speed; - shrinkinprogress.millisInit = millis(); - shrinkinprogress.saveShrinkRegion(); - shrinkwindows.add(shrinkinprogress); - this.reset(); - } - } -} - -class ShrinkWindow { - float corner1x, corner1y, corner2x, corner2y, speed; - int timeElapsed, millisInit; - PImage shrinkRegion; - - ShrinkWindow(float corner1x, float corner1y, float corner2x, float corner2y, float speed) { - this.corner1x = corner1x; - this.corner1y = corner1y; - this.corner2x = corner2x; - this.corner2y = corner2y; - this.speed = speed; - } - - float aspectRatio() { - return abs((corner2x-corner1x)/(corner2y-corner1y)); - } - - float centerx() { - return (corner1x + corner2x) / 2; - } - - float centery() { - return (corner1y + corner2y) / 2; - } - - void saveShrinkRegion() { - this.shrinkRegion = get(int(convertXCoord(corner1x)), int(convertYCoord(corner1y)), - abs(int(convertXDistance(corner2x-corner1x))), abs(int(convertYDistance(corner2y-corner1y)))); - } - - void draw(){ - - timeElapsed = millis()-millisInit; - if(convertXDistance(corner2x-corner1x) - speed * aspectRatio() * (timeElapsed/1000) > 25) { - - noFill(); - noStroke(); - rectMode(CORNER); - rect(convertXCoord(corner1x), convertYCoord(corner1y), - convertXDistance(corner2x - corner1x), convertYDistance(corner2y - corner1y)); - - - imageMode(CENTER); - image(shrinkRegion, convertXCoord(this.centerx()), convertYCoord(this.centery()), - convertXDistance(corner2x - corner1x) - speed * aspectRatio() * (timeElapsed / 1000), - convertYDistance(corner2y - corner1y) - speed * (timeElapsed / 1000)); - - } - -// -// print(convertXDistance(corner2x-corner1x) - speed * aspectRatio() * (timeElapsed/1000)); -// print("\n"); -// print(timeElapsed); -// print("\n"); -// print(aspectRatio); -// print("\n"); - - } - - - -} diff --git a/src/Translate.java b/src/Translate.java new file mode 100644 index 0000000..50915fa --- /dev/null +++ b/src/Translate.java @@ -0,0 +1,111 @@ +import processing.core.*; +import static processing.core.PApplet.*; + + +public class Translate { + float corner1x, corner1y, corner2x, corner2y, endpointx, endpointy, speed; + int timeElapsed, millisInit; + PImage translateRegion; + + private boolean corner1complete, corner2complete; + + Translate(float speed) { + this.speed = speed; + + this.corner1complete = false; + this.corner2complete = false; + } + + Translate(float corner1x, float corner1y, float corner2x, float corner2y, + float endpointx, float endpointy, float speed) { + this.corner1x = corner1x; + this.corner1y = corner1y; + this.corner2x = corner2x; + this.corner2y = corner2y; + this.endpointx = endpointx; + this.endpointy = endpointy; + this.speed = speed; + + this.corner1complete = true; + this.corner2complete = true; + } + + + float centerx() { + return (corner1x + corner2x) / 2; + } + + float centery() { + return (corner1y + corner2y) / 2; + } + + float theta() { + return (atan((endpointy-centery())/(endpointx-centerx()))); + } + + void saveTranslateRegion(ProjectorApplet p) { + this.translateRegion = p.get( + (int) p.convertXCoord(corner1x), + (int) p.convertYCoord(corner1y), + (int) abs(p.convertXDistance(corner2x-corner1x)), + (int) abs(p.convertYDistance(corner2y-corner1y))); + } + + + ProjectorCommand makeProjectorCommand() { + return (ProjectorApplet p) -> { + timeElapsed = p.millis() - millisInit; + + float spaceElapsed = timeElapsed * speed / 1000f; + + if (spaceElapsed * cos(theta()) * p.calibrator.magx > endpointx - centerx()) { + return true; + } + + p.noFill(); + p.noStroke(); + p.rectMode(CORNERS); + p.rect(p.convertXCoord(corner1x) + spaceElapsed * cos(theta()), + p.convertYCoord(corner1y) + spaceElapsed * sin(theta()), + p.convertXCoord(corner2x) + spaceElapsed * cos(theta()), + p.convertYCoord(corner2y) + spaceElapsed * sin(theta())); + + + p.imageMode(CENTER); + p.image(translateRegion, + p.convertXCoord(this.centerx()) + spaceElapsed * cos(theta()), + p.convertYCoord(this.centery()) + spaceElapsed * sin(theta()), + p.convertXDistance(corner2x - corner1x), + p.convertYDistance(corner2y - corner1y)); + + return false; + }; + } + + + ClickGetter makeClickGetter(ProjectorApplet p){ + return (int x, int y) -> { + if (!corner1complete){ + corner1x = x; + corner1y = y; + corner1complete = true; + return false; + + } else if (!corner2complete) { + corner2x = x; + corner2y = y; + corner2complete = true; + return false; + + } else{ + endpointx = x; + endpointy = y; + millisInit = p.millis(); + saveTranslateRegion(p); + + p.commandQueue.add(makeProjectorCommand()); + return true; + } + }; + } +} diff --git a/src/TranslateClass.java b/src/TranslateClass.java deleted file mode 100644 index 67280ee..0000000 --- a/src/TranslateClass.java +++ /dev/null @@ -1,99 +0,0 @@ -class Translate { - TranslateWindow translateWindowinprogress; - - boolean corner1complete, corner2complete; - - void reset() { - translateWindowinprogress = new TranslateWindow(-1,-1,0,0,0,0,0); - corner1complete = false; - corner2complete = false; - } - - Translate(){ - corner1complete = false; - corner2complete = false; - } - - void mouseClicked(float x, float y){ - if (!corner1complete){ - translateWindowinprogress.corner1x = x; - translateWindowinprogress.corner1y = y; - corner1complete = true; - } else if (!corner2complete) { - translateWindowinprogress.corner2x = x; - translateWindowinprogress.corner2y = y; - corner2complete = true; - } else{ - translateWindowinprogress.endpointx = x; - translateWindowinprogress.endpointy = y; - translateWindowinprogress.speed = speed; - translateWindowinprogress.millisInit = millis(); - translateWindowinprogress.saveTranslateRegion(); - translatewindows.add(translateWindowinprogress); - this.reset(); - } - } -} - -class TranslateWindow { - float corner1x, corner1y, corner2x, corner2y, endpointx, endpointy, speed; - int timeElapsed, millisInit; - PImage translateRegion; - - TranslateWindow(float corner1x, float corner1y, float corner2x, float corner2y, - float endpointx, float endpointy, float speed) { - this.corner1x = corner1x; - this.corner1y = corner1y; - this.corner2x = corner2x; - this.corner2y = corner2y; - this.endpointx = endpointx; - this.endpointy = endpointy; - this.speed = speed; - } - - -// float aspectRatio() { -// return abs((corner2x - corner1x) / (corner2y - corner1y)); -// } - - float centerx() { - return (corner1x + corner2x) / 2; - } - - float centery() { - return (corner1y + corner2y) / 2; - } - - float theta() { - return (atan((endpointy-centery())/(endpointx-centerx()))); - } - - void saveTranslateRegion() { - this.translateRegion = get(int(convertXCoord(corner1x)), int(convertYCoord(corner1y)), - int(abs(convertXDistance(corner2x - corner1x))),int(abs(convertYDistance(corner2y - corner1y)))); - } - - void draw() { - - timeElapsed = millis() - millisInit; - - if (timeElapsed*speed/1000*cos(theta())*calibrator.magx <= endpointx - centerx()) { - - noFill(); - noStroke(); - rectMode(CORNERS); - rect(convertXCoord(corner1x) + timeElapsed*speed/1000*cos(theta()), - convertYCoord(corner1y) + timeElapsed*speed/1000*sin(theta()), - convertXCoord(corner2x) + timeElapsed*speed/1000*cos(theta()), - convertYCoord(corner2y) + timeElapsed*speed/1000*sin(theta())); - - - imageMode(CENTER); - image(translateRegion, convertXCoord(this.centerx()) + timeElapsed*speed/1000*cos(theta()), - convertYCoord(this.centery()) + timeElapsed*speed/1000*sin(theta()), - convertXDistance(corner2x - corner1x), convertYDistance(corner2y - corner1y)); - - - } - } -} diff --git a/src/Triangle.java b/src/Triangle.java index 201958e..0ff87b7 100644 --- a/src/Triangle.java +++ b/src/Triangle.java @@ -35,7 +35,7 @@ class Triangle { this.point2complete = true; } - ProjectorCommand drawCommand() { + ProjectorCommand makeProjectorCommand() { return (ProjectorApplet p) -> { if (!visible) { //done drawing already @@ -78,7 +78,7 @@ class Triangle { point3y = y; visible = true; - p.commandQueue.add(drawCommand()); + p.commandQueue.add(makeProjectorCommand()); return true; } };