diff --git a/dvd_bounce_paths/dvd_bounce_paths.pde b/dvd_bounce_paths/dvd_bounce_paths.pde index 0da38d1..4aa44b1 100644 --- a/dvd_bounce_paths/dvd_bounce_paths.pde +++ b/dvd_bounce_paths/dvd_bounce_paths.pde @@ -1,8 +1,20 @@ import static javax.swing.JOptionPane.*; +JSONObject json; 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; @@ -12,20 +24,25 @@ float ymax = 145.75; float xscale = 1080.0 / (xmax * 2.0); float yscale = 1920.0 / (ymax * 2.0); -float startx = 0;//566.0, 893.0 -float starty = 0; +float startx = 74.2428944942589; +float starty = 995.9830098644366; +float startangle = 225; +int startframes = 1645; //30 * 7; +int endframes = 30 * 30; + +int frames = startframes; float x = 0.0; float y = 0.0; +float angle = 225; float lastx = 1.0; float lasty = 1.0; -int frames = 500; -int angle = 45; -int startangle = 45; +int searchInc = 200; +int searchHit = 1000; -float distance = 20.0; +float distance = 15.0; int colorNumber = 0; boolean changed = false; @@ -33,29 +50,96 @@ boolean changed = false; PGraphics pg; boolean ranOnce = false; +boolean searching = false; + +int endD = 8; void setup () { + json = loadJSONObject("../candidate.json"); size(540, 960); pg = createGraphics(1080, 1920); - + readJson(); //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(map(x, 0.0, 1080.0, xmin, xmax)); output.print(','); output.print(map(y, 0.0, 1920.0, ymin, ymax)); output.print('}'); - output.println(','); + if ( !last ) { + output.println(','); + } else { + output.println(""); + } } -void logChange(){ - changes.print('{'); +void logChange(boolean last){ changes.print(colorNumber); - changes.print('}'); - changes.println(','); + if (!last) { + 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 () { @@ -63,18 +147,28 @@ void draw () { x = startx; y = starty; angle = startangle; - print(x); - print(", "); - print(y); - print(" - "); - println(frames); + colorNumber = 0; + if (!searching) { + print(x); + print(", "); + print(y); + print(" - "); + println(frames); + } pg.beginDraw(); + pg.ellipseMode(CENTER); pg.background(0); pg.fill(255); pg.stroke(255); - //output = createWriter("log.txt"); - //changes = createWriter("changes.txt"); + if (!searching) { + 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++) { changed = false; @@ -84,15 +178,15 @@ void draw () { pg.line(lastx, lasty, x, y); pg.stroke(255, 255, 255); } 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; lasty = y; - //logPath(); + if (!searching) logPath(i == frames - 1); x = x + distance * cos((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 <= 0.0) y = 0.0; - //logChange(); + if (!searching) logChange(i == frames - 1); if (changed) { colorNumber++; } } - pg.ellipse(x, y, 4, 4); + pg.ellipse(x, y, endD, endD); pg.endDraw(); 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(); + } + + if (!searching) ranOnce = true; + //println(x); + //println(y); + //exit(); } - startx++; - if (startx >= 1079.0) { - startx = 0; - starty+=100; - } - if (starty >= 1920.0) { - starty = 0; - frames+=100; - } - if (angle == startangle && abs(x - startx) < 100 && abs(y - starty ) < 100 ) { - ranOnce = true; + 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; + starty += searchInc; + } + if (starty >= 1920.0) { + starty = 0; + searchInc = floor(searchInc / 2.0); + if (searchInc == 0) searchInc = 1; + } + } else if (frames >= endframes) { + + } + frames += searchInc < 100 ? searchInc : 100; + } } }