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