Compare commits

..

No commits in common. "d29d32e5db0a9177011b19bde631024ea10ac559" and "7f6488cad68a4a28db99722de7b68dc76feda545" have entirely different histories.

16 changed files with 1895 additions and 17702 deletions

3
.gitignore vendored
View File

@ -1,4 +1,3 @@
*.png
*.mkv
*.DS_Store
*.pov-state
*.DS_Store

View File

@ -15,6 +15,6 @@ Width=1080
Height=1920
Initial_Frame=1
Final_Frame=2880
Final_Frame=900
Initial_Clock=0
Final_Clock=1

View File

@ -8,7 +8,7 @@
#include "./path.inc"
#include "./changes.inc"
#declare TOTAL_FRAMES = 2880.0;
#declare TOTAL_FRAMES = 900.0;
#declare X = 50;
#declare Y = 50;
@ -20,7 +20,7 @@
#declare CAM_Z = -200;
#declare FRAME = floor(clock * TOTAL_FRAMES);
#declare colorChoice = Changes[FRAME];
#declare colorChoice = Changes[FRAME][0];
#declare color1 = <LogoColors[colorChoice][0], LogoColors[colorChoice][1], LogoColors[colorChoice][2]>;
@ -52,7 +52,7 @@ global_settings {
look_at <0, 0, 0>
angle 50
right -x*(image_width/image_height)
aperture 5.6
aperture 2.4
blur_samples 200
variance 1/10000
focal_point <0, 0, 0>

View File

@ -1 +0,0 @@
{"startx":96.18733752154176,"starty":1322.3104960990138,"startangle":45,"startframes":2880,"distance":17}

View File

@ -1 +0,0 @@
{"startx":903,"starty":585,"startangle":45,"startframes":1351,"distance":16}

View File

@ -1 +0,0 @@
{"startx":96.18733752154176,"starty":1322.3104960990138,"startangle":45,"startframes":2880,"distance":17}

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,15 @@
const { writeFileSync } = require('fs');
function generateRandomIntegerInRange(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
const xMax = 1080.0;
const yMax = 1920.0;
const framesMin = 30 * 5;
const framesMax = 30 * 60 * 3;
const framesMin = 30 * 7;
const framesMax = 30 * 60;
const distanceMax = 30.0;
const buffer = 50;
const xRandStart = generateRandomIntegerInRange(buffer, xMax - buffer);
const yRandStart = generateRandomIntegerInRange(buffer, yMax - buffer);
let xStart = 0;
let yStart = 0;
let frames = framesMin;
@ -25,110 +18,43 @@ let angle = 45;
let angles = [ 45, 45 + 90, 45 + 180, 45 + 270];
let searchHit = 100;
let iterator = 10;
function addCommas (num) {
let nums = (num + '').split('');
let output = '';
nums.reverse();
output += nums[0];
for (let i = 1; i < nums.length; i++) {
if (i % 3 === 0) output += ',';
output += nums[i];
}
return output.split('').reverse().join('');
}
function millisecondsToStr (milliseconds) {
// TIP: to find current time in milliseconds, use:
// var current_time_milliseconds = new Date().getTime();
function numberEnding (number) {
return (number > 1) ? 's' : '';
}
var temp = Math.floor(milliseconds / 1000);
var years = Math.floor(temp / 31536000);
if (years) {
return years + ' year' + numberEnding(years);
}
//TODO: Months! Maybe weeks?
var days = Math.floor((temp %= 31536000) / 86400);
if (days) {
return days + ' day' + numberEnding(days);
}
var hours = Math.floor((temp %= 86400) / 3600);
if (hours) {
return hours + ' hour' + numberEnding(hours);
}
var minutes = Math.floor((temp %= 3600) / 60);
if (minutes) {
return minutes + ' minute' + numberEnding(minutes);
}
var seconds = temp % 60;
if (seconds) {
return seconds + ' second' + numberEnding(seconds);
}
return 'less than a second'; //'just now' //or other string you like;
}
let currentDisplay = '';
let currentUpdate = 0;
function displayTimeLeft (msLeft, percent) {
const timeStr = `Time Left: ~${millisecondsToStr(msLeft)}`;
const now = +new Date();
const rateLimit = msLeft < 60 * 1000 ? (now - currentUpdate > 1000) : (now - currentUpdate > 60 * 1000) ;
if (timeStr != currentDisplay && !rateLimit) {
currentDisplay = timeStr;
currentUpdate = now;
console.log(timeStr + ` @ ${Math.round(percent * 10) / 10}%`);
}
}
let searchHit = 1;
function simulate (x, y, frames, angle, distance) {
for (let i = 0; i < frames; i++) {
x = x + distance * Math.cos(angle * Math.PI / 180.0);
y = y + distance * Math.sin(angle * Math.PI / 180.0);
if (x >= 1080.0 || x <= 0.0) {
angle = 180 - angle;
}
if (x >= 1080.0) x = 1080.0;
if (x < 0.0) x = 0.0;
if (x <= 0.0) x = 0.0;
if (y >= 1920.0 || y <= 0.0) {
angle = 360 - angle;
}
if (y >= 1920.0) y = 1920.0;
if (y < 0.0) y = 0.0;
if (y <= 0.0) y = 0.0;
}
return { x, y, angle }
}
function simulateAll (xStart, yStart, xLimit, yLimit) {
function simulateAll () {
let res;
let attempts = 0;
let startTime;
let duration;
let secondsLeft;
let pointsTotal = Math.ceil((xLimit - xStart) / iterator) * Math.ceil((yLimit - yStart) / iterator);
let searchesTotal = (pointsTotal * angles.length * 10 * Math.ceil( (framesMax - framesMin) / iterator) );
let pointsCounter = 0;
let rollingAvgDuration = null;
console.log(`Simulating ${addCommas(searchesTotal)} possible candidates...`);
console.log(``)
for (let x = xStart; x < xLimit; x+=iterator ) {
for (let y = yStart; y < yLimit; y+=iterator) {
for (let x = buffer; x < xMax-buffer; x++ ) {
for (let y = buffer; y < yMax-buffer; y++) {
startTime = +new Date();
//console.time(`${x},${y}`)
for (let a = 0; a < angles.length; a++) {
console.time(`${x},${y}`)
for (let a = 0; a < 4; a++) {
for (let d = 0; d < 10; d++) {
for (let frames = framesMin; frames < framesMax + 1; frames+=iterator) {
for (let frames = framesMin; frames < framesMax + 1; frames++) {
angle = angles[a];
res = simulate(x, y, frames, angle, distance + d);
attempts++;
if (Math.abs(res.x - x) < searchHit && Math.abs(res.y - y) < searchHit && ((res.angle == angle) ) ) {
if (Math.abs(res.x - x) < searchHit && Math.abs(res.y - y) < searchHit && res.angle == angle) {
console.log(`#${attempts}`);
console.log(`startx = ${x} endx = ${res.x}`);
console.log(`starty = ${y} endy = ${res.y}`);
@ -137,47 +63,24 @@ function simulateAll (xStart, yStart, xLimit, yLimit) {
console.log(`distance = ${distance + d}`);
console.log(`searchHit = ${searchHit}`);
console.log("++++++++++++++++++++++++++++++++++++++++");
writeFileSync('candidate.json', JSON.stringify({
startx : x,
starty : y,
startangle : angle,
startframes : frames,
distance : distance + d
}) , 'utf-8')
return res;
}
}
}
}
//console.timeEnd(`${x},${y}`)
console.timeEnd(`${x},${y}`)
duration = ((+new Date()) - startTime);
if (rollingAvgDuration === null) {
rollingAvgDuration = duration;
} else {
rollingAvgDuration = (rollingAvgDuration + duration) / 2;
}
msLeft = duration * (pointsTotal - pointsCounter);
displayTimeLeft(msLeft, attempts / searchesTotal);
pointsCounter++;
secondsLeft = (duration / 1000) * (x - (xMax - buffer)) * (y - (yMax - buffer));
console.log(`Minutes Left: ${Math.round(secondsLeft / 60)}`);
}
}
}
function main () {
let res;
let xLimit = xMax - buffer;
let yLimit = yMax - buffer;
xStart = xRandStart;
yStart = yRandStart;
for (let i = 0; i < 7; i++) {
res = simulateAll(xStart, yStart, xLimit, yLimit);
xStart = res.x - searchHit;
yStart = res.y - searchHit;
xLimit = res.x + searchHit;
yLimit = res.y + searchHit;
res = simulateAll();
searchHit = Math.floor(searchHit / 2.0);
iterator = Math.floor(iterator / 2.0);
if (iterator === 0) iterator = 1;
if (searchHit === 0) process.exit()
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +1,8 @@
import static javax.swing.JOptionPane.*;
JSONObject json;
float xmin = -57.0;
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}"
};
PrintWriter output, changes;
float xmax = 57.0;
@ -24,25 +12,20 @@ float ymax = 145.75;
float xscale = 1080.0 / (xmax * 2.0);
float yscale = 1920.0 / (ymax * 2.0);
float startx = 74.2428944942589;
float starty = 995.9830098644366;
float startangle = 225;
float startx = 0;//566.0, 893.0
float starty = 0;
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 searchInc = 200;
int searchHit = 1000;
int frames = 500;
int angle = 45;
int startangle = 45;
float distance = 15.0;
float distance = 20.0;
int colorNumber = 0;
boolean changed = false;
@ -50,96 +33,29 @@ 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 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) {
void logPath () {
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('}');
if ( !last ) {
output.println(',');
} else {
output.println("");
}
output.println(',');
}
void logChange(boolean last){
void logChange(){
changes.print('{');
changes.print(colorNumber);
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(',');
changes.print('}');
changes.println(',');
}
void draw () {
@ -147,28 +63,18 @@ void draw () {
x = startx;
y = starty;
angle = startangle;
colorNumber = 0;
if (!searching) {
print(x);
print(", ");
print(y);
print(" - ");
println(frames);
}
print(x);
print(", ");
print(y);
print(" - ");
println(frames);
pg.beginDraw();
pg.ellipseMode(CENTER);
pg.background(0);
pg.fill(255);
pg.stroke(255);
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");
//output = createWriter("log.txt");
//changes = createWriter("changes.txt");
for (int i = 0; i < frames; i++) {
changed = false;
@ -178,15 +84,15 @@ void draw () {
pg.line(lastx, lasty, x, y);
pg.stroke(255, 255, 255);
} else {
pg.ellipse(x, y, endD, endD);
pg.ellipse(x, y, 4, 4);
}
pg.ellipse(x, y, 2, 2);
pg.point(x, y);
lastx = x;
lasty = y;
if (!searching) logPath(i == frames - 1);
//logPath();
x = x + distance * cos((float) angle * PI / 180.0);
y = y + distance * sin((float) angle * PI / 180.0);
@ -204,80 +110,34 @@ void draw () {
if (y >= 1920.0) y = 1920.0;
if (y <= 0.0) y = 0.0;
if (!searching) logChange(i == frames - 1);
//logChange();
if (changed) {
colorNumber++;
}
}
pg.ellipse(x, y, endD, endD);
pg.ellipse(x, y, 4, 4);
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();*/
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();
//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;
}
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;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

3786
path.inc

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,6 @@
povray bounce.ini
ffmpeg -f image2 -i bounce%04d.png -r 30 -vf "crop=ih*(9/16):ih" -b:a 64k -ar 44.1k -movflags faststart -c:v libx264 -strict -2 -preset veryslow -tune psnr -tune ssim -crf 28 dvdbounce_canidate.mkv
ffmpeg -f image2 -i bounce%04d.png -r 30 -c:v prores_ks -shortest -profile:v 4 dvdbounce_candidate.mov
ffmpeg -f image2 -i bounce%03d.png -r 30 -vf "crop=ih*(9/16):ih" -b:a 64k -ar 44.1k -movflags faststart -c:v libx264 -strict -2 -preset veryslow -tune psnr -tune ssim -crf 28 dvdbounce.mkv
#rm bounce*.png
rm bounce*.png