You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.3 KiB
Java
115 lines
3.3 KiB
Java
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;
|
|
}
|
|
};
|
|
}
|
|
}
|