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

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;
}
};
}
}