Processing script now generates the .inc files that povray needs to render the movement path and color changing.

This commit is contained in:
Matt McWilliams 2021-07-26 10:58:49 -04:00
parent f9c3a09ed7
commit 24a7b463ef
1 changed files with 182 additions and 42 deletions

View File

@ -1,8 +1,20 @@
import static javax.swing.JOptionPane.*; import static javax.swing.JOptionPane.*;
JSONObject json;
float xmin = -57.0; float xmin = -57.0;
PrintWriter output, changes; PrintWriter output, changes, hits;
String[] colors = {
"{190, 0, 255}",
"{0, 254, 255}",
"{255, 131, 0}",
"{0, 38, 255}",
"{255, 250, 1}",
"{255, 38, 0}",
"{255, 0, 139}",
"{37, 255, 1}"
};
float xmax = 57.0; float xmax = 57.0;
@ -12,20 +24,25 @@ float ymax = 145.75;
float xscale = 1080.0 / (xmax * 2.0); float xscale = 1080.0 / (xmax * 2.0);
float yscale = 1920.0 / (ymax * 2.0); float yscale = 1920.0 / (ymax * 2.0);
float startx = 0;//566.0, 893.0 float startx = 74.2428944942589;
float starty = 0; float starty = 995.9830098644366;
float startangle = 225;
int startframes = 1645; //30 * 7;
int endframes = 30 * 30;
int frames = startframes;
float x = 0.0; float x = 0.0;
float y = 0.0; float y = 0.0;
float angle = 225;
float lastx = 1.0; float lastx = 1.0;
float lasty = 1.0; float lasty = 1.0;
int frames = 500; int searchInc = 200;
int angle = 45; int searchHit = 1000;
int startangle = 45;
float distance = 20.0; float distance = 15.0;
int colorNumber = 0; int colorNumber = 0;
boolean changed = false; boolean changed = false;
@ -33,29 +50,96 @@ boolean changed = false;
PGraphics pg; PGraphics pg;
boolean ranOnce = false; boolean ranOnce = false;
boolean searching = false;
int endD = 8;
void setup () { void setup () {
json = loadJSONObject("../candidate.json");
size(540, 960); size(540, 960);
pg = createGraphics(1080, 1920); pg = createGraphics(1080, 1920);
readJson();
//frameRate(30); //frameRate(30);
} }
void logPath () { void readJson () {
if (json == null) return;
if (!json.isNull("startx")) {
startx = json.getFloat("startx");
println("startx = " + startx);
}
if (!json.isNull("starty")) {
starty = json.getFloat("starty");
println("starty = " + starty);
}
if (!json.isNull("startangle")) {
startangle = json.getFloat("startangle");
angle = startangle;
println("startangle = " + startangle);
}
if (!json.isNull("startframes")) {
startframes = json.getInt("startframes");
frames = startframes;
println("startframes = " + startframes);
}
if (!json.isNull("distance")) {
distance = json.getFloat("distance");
println("distance = " + distance);
}
searchHit = 10;
searchInc = 1;
}
void logPath (boolean last) {
output.print('{'); output.print('{');
output.print(map(x, 0.0, 1080.0, xmin, xmax)); output.print(map(x, 0.0, 1080.0, xmin, xmax));
output.print(','); output.print(',');
output.print(map(y, 0.0, 1920.0, ymin, ymax)); output.print(map(y, 0.0, 1920.0, ymin, ymax));
output.print('}'); output.print('}');
if ( !last ) {
output.println(','); output.println(',');
} else {
output.println("");
}
} }
void logChange(){ void logChange(boolean last){
changes.print('{');
changes.print(colorNumber); changes.print(colorNumber);
changes.print('}'); if (!last) {
changes.println(','); changes.print(',');
}
changes.println("");
}
void generateColors () {
String firstColor = colors[floor(random(0, colors.length))];
int totalColors = colorNumber + 1;
changes.println(" ");
changes.println("#declare LogoColors = array[" + totalColors + "][3]{");
changes.println(firstColor + ",");
for (int i = 1; i < totalColors - 1; i++) {
changes.println( colors[floor(random(0, colors.length))] + "," );
}
changes.println(firstColor);
changes.println("}");
}
void logHit(){
hits.print("{ \"startx\" : ");
hits.print(startx);
hits.print(", \"starty\" : ");
hits.print(starty);
hits.print(", \"startangle\" : ");
hits.print(startangle);
hits.print(", \"frames\" : ");
hits.print(frames);
hits.print(", \"searchInc\" : ");
hits.print(searchInc);
hits.print(", \"searchHit\" : ");
hits.print(searchHit);
hits.print('}');
hits.println(',');
} }
void draw () { void draw () {
@ -63,18 +147,28 @@ void draw () {
x = startx; x = startx;
y = starty; y = starty;
angle = startangle; angle = startangle;
colorNumber = 0;
if (!searching) {
print(x); print(x);
print(", "); print(", ");
print(y); print(y);
print(" - "); print(" - ");
println(frames); println(frames);
}
pg.beginDraw(); pg.beginDraw();
pg.ellipseMode(CENTER);
pg.background(0); pg.background(0);
pg.fill(255); pg.fill(255);
pg.stroke(255); pg.stroke(255);
//output = createWriter("log.txt"); if (!searching) {
//changes = createWriter("changes.txt"); output = createWriter("path.inc");
changes = createWriter("changes.inc");
changes.println("#declare Changes = array[" + frames + "] {");
output.println("#declare Path = array[" + frames + "][2]{");
}
hits = createWriter("hits.txt");
for (int i = 0; i < frames; i++) { for (int i = 0; i < frames; i++) {
changed = false; changed = false;
@ -84,15 +178,15 @@ void draw () {
pg.line(lastx, lasty, x, y); pg.line(lastx, lasty, x, y);
pg.stroke(255, 255, 255); pg.stroke(255, 255, 255);
} else { } else {
pg.ellipse(x, y, 4, 4); pg.ellipse(x, y, endD, endD);
} }
pg.point(x, y); pg.ellipse(x, y, 2, 2);
lastx = x; lastx = x;
lasty = y; lasty = y;
//logPath(); if (!searching) logPath(i == frames - 1);
x = x + distance * cos((float) angle * PI / 180.0); x = x + distance * cos((float) angle * PI / 180.0);
y = y + distance * sin((float) angle * PI / 180.0); y = y + distance * sin((float) angle * PI / 180.0);
@ -110,34 +204,80 @@ void draw () {
if (y >= 1920.0) y = 1920.0; if (y >= 1920.0) y = 1920.0;
if (y <= 0.0) y = 0.0; if (y <= 0.0) y = 0.0;
//logChange(); if (!searching) logChange(i == frames - 1);
if (changed) { if (changed) {
colorNumber++; colorNumber++;
} }
} }
pg.ellipse(x, y, 4, 4); pg.ellipse(x, y, endD, endD);
pg.endDraw(); pg.endDraw();
image(pg, 0, 0, width, height); image(pg, 0, 0, width, height);
/*output.flush(); // Writes the remaining data to the file
output.close(); // Finishes the file
changes.flush();
changes.close();*/
//ranOnce = true; if (!searching) {
changes.println("}");
output.println("}");
generateColors();
output.flush(); // Writes the remaining data to the file
output.close(); // Finishes the file
changes.flush();
changes.close();
} }
startx++; if (!searching) ranOnce = true;
if (startx >= 1079.0) { //println(x);
//println(y);
//exit();
}
if (searching) {
if (!ranOnce && angle == startangle && abs(x - startx) < searchHit && abs(y - starty ) < searchHit ) {
println(x + " vs " + startx);
println(y + " vs " + starty);
println("xdiff = " + abs(x-startx) + " ydiff = " + abs(y-starty));
println("startangle = " + startangle);
println("startframes = " + startframes);
//delay(10000);
if (searchInc > 1) {
logHit();
startx = floor(x - (searchHit * 2));
starty = floor(y - (searchHit * 2));
startframes = frames - searchHit;
if (startx < 0) startx = 0;
if (starty < 0) starty = 0;
if (startframes < 30*7) startframes = 30 * 7;
searchHit = floor(searchHit / 2.0);
searchInc = floor(searchInc / 2.0);
if (searchInc == 0) searchInc = 1;
} else {
searching = false;
hits.flush();
hits.close();
}
} else {
if (frames >= endframes && startangle == 45) {
frames = startframes;
startx += searchInc;
if (startx >= 1080.0) {
startx = 0; startx = 0;
starty+=100; starty += searchInc;
} }
if (starty >= 1920.0) { if (starty >= 1920.0) {
starty = 0; starty = 0;
frames+=100; searchInc = floor(searchInc / 2.0);
if (searchInc == 0) searchInc = 1;
}
} else if (frames >= endframes) {
}
frames += searchInc < 100 ? searchInc : 100;
} }
if (angle == startangle && abs(x - startx) < 100 && abs(y - starty ) < 100 ) {
ranOnce = true;
} }
} }