355 lines
7.7 KiB
Plaintext
355 lines
7.7 KiB
Plaintext
|
String SCANS = "/Users/matthewmcwilliams9/Desktop/running/shot1-scans";
|
||
|
|
||
|
int dotSize = 16;
|
||
|
File someFolder;
|
||
|
File[] someFolderList;
|
||
|
ArrayList<String> files = new ArrayList<String>();
|
||
|
String currentFile;
|
||
|
int filesCount;
|
||
|
int current = -1;
|
||
|
PImage img;
|
||
|
PImage copy;
|
||
|
int left = 0;
|
||
|
int top = 0;
|
||
|
ArrayList<Point> points = new ArrayList<Point>();
|
||
|
ArrayList<Line> lines = new ArrayList<Line>();
|
||
|
|
||
|
Frame A;
|
||
|
Frame B;
|
||
|
Frame C;
|
||
|
Frame D;
|
||
|
|
||
|
class Point {
|
||
|
int x = 0;
|
||
|
int y = 0;
|
||
|
int xPerc;
|
||
|
int yPerc;
|
||
|
int xScaled;
|
||
|
int yScaled;
|
||
|
|
||
|
Point(int a, int b, int w, int h) {
|
||
|
x = a;
|
||
|
y = b;
|
||
|
xPerc = round(map(x, 0, w, 0, 1000));
|
||
|
yPerc = round(map(y, 0, h, 0, 1000));
|
||
|
}
|
||
|
void scale (int xMin, int xMax, int yMin, int yMax) {
|
||
|
xScaled = round(map(xPerc, xMin, xMax, 0, 100));
|
||
|
yScaled = round(map(yPerc, yMin, yMax, 0, 100));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Line {
|
||
|
int x1;
|
||
|
int y1;
|
||
|
int x2;
|
||
|
int y2;
|
||
|
Line (int a, int b, int c, int d) {
|
||
|
x1 = a;
|
||
|
y1 = b;
|
||
|
x2 = c;
|
||
|
y2 = d;
|
||
|
}
|
||
|
void draw () {
|
||
|
line(x1 + left, y1 + top, x2 + left, y2 + top);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Frame {
|
||
|
PImage im;
|
||
|
String which;
|
||
|
|
||
|
Point leftTop;
|
||
|
Point rightTop;
|
||
|
Point leftBottom;
|
||
|
Point rightBottom;
|
||
|
|
||
|
int W;
|
||
|
int H;
|
||
|
|
||
|
Frame (String w, PImage a) {
|
||
|
im = a;
|
||
|
which = w;
|
||
|
}
|
||
|
|
||
|
public void try_all (ArrayList<Point> pointsEval) {
|
||
|
Point p;
|
||
|
int xMin = 1000000;
|
||
|
int xMax = 0;
|
||
|
int yMin = 1000000;
|
||
|
int yMax = 0;
|
||
|
|
||
|
float closest = im.width * im.height;
|
||
|
float dists[] = new float[pointsEval.size()];
|
||
|
|
||
|
int corner = -1;
|
||
|
Point cornerP;
|
||
|
|
||
|
int cornerShort = -1;
|
||
|
Point cornerShortP;
|
||
|
|
||
|
int cornerLong = -1;
|
||
|
Point cornerLongP;
|
||
|
|
||
|
int cornerDiag = -1;
|
||
|
Point cornerDiagP;
|
||
|
|
||
|
for (int i = 0; i < pointsEval.size(); i++) {
|
||
|
p = pointsEval.get(i);
|
||
|
if (p.xPerc > xMax) {
|
||
|
xMax = p.xPerc;
|
||
|
}
|
||
|
if (p.xPerc < xMin) {
|
||
|
xMin = p.xPerc;
|
||
|
}
|
||
|
if (p.yPerc > yMax) {
|
||
|
yMax = p.yPerc;
|
||
|
}
|
||
|
if (p.yPerc < yMin) {
|
||
|
yMin = p.yPerc;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (int i = 0; i < pointsEval.size(); i++) {
|
||
|
p = pointsEval.get(i);
|
||
|
p.scale(xMin, xMax, yMin, yMax);
|
||
|
|
||
|
if (which.equals("A")) {
|
||
|
//bottom left
|
||
|
if (p.xScaled < 2 && p.xScaled > -1 && p.yScaled > 98 && p.yScaled < 101) {
|
||
|
corner = i;
|
||
|
}
|
||
|
} else if (which.equals("B")) {
|
||
|
//top left
|
||
|
if (p.xScaled < 2 && p.xScaled > -1 && p.yScaled > -1 && p.yScaled < 2) {
|
||
|
corner = i;
|
||
|
}
|
||
|
} else if (which.equals("C")) {
|
||
|
//top right
|
||
|
if (p.xScaled < 101 && p.xScaled > 98 && p.yScaled > -1 && p.yScaled < 2) {
|
||
|
corner = i;
|
||
|
}
|
||
|
} else if (which.equals("D")) {
|
||
|
//bottom right
|
||
|
if (p.xScaled < 101 && p.xScaled > 98 && p.yScaled > 98 && p.yScaled < 101) {
|
||
|
corner = i;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (corner == -1) {
|
||
|
println("Could not find corner");
|
||
|
exit();
|
||
|
}
|
||
|
|
||
|
cornerP = pointsEval.get(corner);
|
||
|
|
||
|
for (int i = 0; i < pointsEval.size(); i++) {
|
||
|
p = pointsEval.get(i);
|
||
|
if (i == corner) {
|
||
|
dists[i] = im.width * im.height;
|
||
|
} else {
|
||
|
dists[i] = dist(cornerP.x, cornerP.y, p.x, p.y);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (int i = 0; i < pointsEval.size(); i++) {
|
||
|
p = pointsEval.get(i);
|
||
|
if (i != corner
|
||
|
&& abs(cornerP.xScaled - p.xScaled) > 10
|
||
|
&& dists[i] < closest) {
|
||
|
closest = dists[i];
|
||
|
cornerShort = i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
closest = im.width * im.height;
|
||
|
|
||
|
for (int i = 0; i < pointsEval.size(); i++) {
|
||
|
p = pointsEval.get(i);
|
||
|
if (i != corner
|
||
|
&& i != cornerShort
|
||
|
&& abs(cornerP.xScaled - p.xScaled) < 10
|
||
|
&& dists[i] < closest) {
|
||
|
closest = dists[i];
|
||
|
cornerLong = i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
closest = im.width * im.height;
|
||
|
|
||
|
for (int i = 0; i < pointsEval.size(); i++) {
|
||
|
p = pointsEval.get(i);
|
||
|
if (i != corner
|
||
|
&& i != cornerShort
|
||
|
&& i != cornerLong
|
||
|
&& abs(cornerP.xScaled - p.xScaled) > 10
|
||
|
&& abs(cornerP.yScaled - p.yScaled) > 10
|
||
|
&& dists[i] < closest) {
|
||
|
closest = dists[i];
|
||
|
cornerDiag = i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cornerShortP = pointsEval.get(cornerShort);
|
||
|
cornerLongP = pointsEval.get(cornerLong);
|
||
|
cornerDiagP = pointsEval.get(cornerDiag);
|
||
|
|
||
|
lines.add(new Line(cornerP.x, cornerP.y, cornerShortP.x, cornerShortP.y));
|
||
|
lines.add(new Line(cornerP.x, cornerP.y, cornerLongP.x, cornerLongP.y));
|
||
|
lines.add(new Line(cornerDiagP.x, cornerDiagP.y, cornerShortP.x, cornerShortP.y));
|
||
|
lines.add(new Line(cornerDiagP.x, cornerDiagP.y, cornerLongP.x, cornerLongP.y));
|
||
|
|
||
|
println(which);
|
||
|
print(cornerP.xScaled);
|
||
|
print(",");
|
||
|
println(cornerP.yScaled);
|
||
|
|
||
|
print(cornerShortP.xScaled);
|
||
|
print(",");
|
||
|
println(cornerShortP.yScaled);
|
||
|
|
||
|
print(cornerLongP.xScaled);
|
||
|
print(",");
|
||
|
println(cornerDiagP.yScaled);
|
||
|
|
||
|
print(cornerDiagP.xScaled);
|
||
|
print(",");
|
||
|
println(cornerDiagP.yScaled);
|
||
|
|
||
|
W = round( ( abs(cornerP.y - cornerLongP.y) + abs(cornerShortP.y - cornerDiagP.y) ) / 2);
|
||
|
H = round( ( abs(cornerP.x - cornerShortP.x) + abs(cornerLongP.x - cornerDiagP.x) ) / 2);
|
||
|
print(W);
|
||
|
print("x");
|
||
|
println(H);
|
||
|
|
||
|
delay(5000);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void listFiles () {
|
||
|
someFolder = new File(SCANS);
|
||
|
someFolderList = someFolder.listFiles();
|
||
|
for (File someFile : someFolderList) {
|
||
|
if (someFile.isFile()) {
|
||
|
if (someFile.getName().endsWith(".png")) {
|
||
|
files.add(someFile.getPath());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void updateFile () {
|
||
|
current++;
|
||
|
if (current == filesCount) {
|
||
|
println("files completed");
|
||
|
exit();
|
||
|
} else {
|
||
|
left = 0;
|
||
|
top = 0;
|
||
|
currentFile = files.get(current);
|
||
|
print("using ");
|
||
|
println(currentFile);
|
||
|
img = loadImage(currentFile);
|
||
|
copy = createImage(img.width, img.height, RGB);
|
||
|
copy.copy(img, 0, 0, img.width, img.height, 0, 0, img.width, img.height);
|
||
|
copy.resize(0, height);
|
||
|
println("loaded");
|
||
|
println(img.width);
|
||
|
println(img.height);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void processFile () {
|
||
|
clear();
|
||
|
image(copy, 0, 0);
|
||
|
delay(2000);
|
||
|
A = new Frame("A", img);
|
||
|
B = new Frame("B", img);
|
||
|
C = new Frame("C", img);
|
||
|
D = new Frame("D", img);
|
||
|
A.try_all(points);
|
||
|
B.try_all(points);
|
||
|
C.try_all(points);
|
||
|
D.try_all(points);
|
||
|
}
|
||
|
|
||
|
void keyPressed () {
|
||
|
int step = 100;
|
||
|
if (key == 'w') {
|
||
|
if (top < 0) {
|
||
|
top += step;
|
||
|
}
|
||
|
} else if (key == 's') {
|
||
|
if (abs(top) < img.height - height) {
|
||
|
top -= step;
|
||
|
}
|
||
|
} else if (key == 'a') {
|
||
|
if (left < 0) {
|
||
|
left += step;
|
||
|
}
|
||
|
} else if (key == 'd') {
|
||
|
if (abs(left) < img.width - width) {
|
||
|
left -= step;
|
||
|
}
|
||
|
} else if (key == 'x') {
|
||
|
if (points.size() > 0) {
|
||
|
points.remove(points.size() - 1);
|
||
|
}
|
||
|
} else if (keyCode == ENTER) {
|
||
|
if (points.size() == 16) {
|
||
|
points = new ArrayList<Point>();
|
||
|
lines = new ArrayList<Line>();
|
||
|
updateFile();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void mousePressed () {
|
||
|
int x = mouseX - left;
|
||
|
int y = mouseY - top;
|
||
|
print("added ");
|
||
|
print(x);
|
||
|
print(",");
|
||
|
println(y);
|
||
|
points.add(new Point(x, y, img.width, img.height));
|
||
|
if (points.size() == 16) {
|
||
|
println("file marked");
|
||
|
processFile();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void setup () {
|
||
|
size(800, 600);
|
||
|
listFiles();
|
||
|
if (files.size() > 0) {
|
||
|
filesCount = files.size();
|
||
|
updateFile();
|
||
|
} else {
|
||
|
println("No files");
|
||
|
exit();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void draw () {
|
||
|
Point p;
|
||
|
Line l;
|
||
|
fill(255,100,100);
|
||
|
noStroke();
|
||
|
|
||
|
image(img, left, top);
|
||
|
ellipse(mouseX, mouseY, dotSize, dotSize);
|
||
|
|
||
|
fill(255,0,0);
|
||
|
for (int i = 0; i < points.size(); i++) {
|
||
|
p = points.get(i);
|
||
|
ellipse(p.x + left, p.y + top, dotSize, dotSize);
|
||
|
}
|
||
|
strokeWeight(2);
|
||
|
stroke(255, 0, 0);
|
||
|
for (int i = 0; i < lines.size(); i++) {
|
||
|
l = lines.get(i);
|
||
|
l.draw();
|
||
|
}
|
||
|
}
|