import processing.core.*; import static processing.core.PApplet.*; public class Translate { float corner1x, corner1y, corner2x, corner2y, endpointx, endpointy, speed; int timeElapsed, millisInit; PImage translateRegion = null; 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) -> { if (translateRegion == null) { millisInit = p.millis(); saveTranslateRegion(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; p.commandQueue.add(makeProjectorCommand()); return true; } }; } }