effort js
unknown
plain_text
3 years ago
5.1 kB
2
Indexable
/// <reference path="./lib/p5/types/global.d.ts" /> //localStorage.clear() let storedPointer = localStorage.getItem("pointer") let storedSeed = localStorage.getItem("seed") /** Lista dei punti casuali da mostrare*/ let list = [0] /** Risoluzione dell'immagine */ let res = {x:720, y:405} let imgName = "720x405.jpg" /** Indice dell'array di pixel */ let pointer = 0; let pointerTemp = storedPointer? JSON.parse(storedPointer) : 0; /** Immagine della cappella */ let imgMain; /** Rettangolo nero per coprire l'immagine */ let imgBlack; /** Se il disegno è completo*/ let complete = false; /** Contenitore dell'interval che tiene il loop principale */ let interval = -1; /** Valore di inizio operazioni */ let startTime = 0; let updateTime = 11.5226337449 let seed = storedSeed? JSON.parse(storedSeed) : Math.round(Math.random()*100000) if(storedSeed == undefined) localStorage.setItem("seed", seed.toString()) /** setInterval migliorato e con tempi precisi */ function intervalTimer(callback, interval = 500) { let counter = 1; let timeoutId; const startTime = Date.now(); function main() { const nowTime = Date.now(); const nextTime = startTime + counter * interval; timeoutId = setTimeout(main, interval - (nowTime - nextTime)); counter += 1; callback(); } timeoutId = setTimeout(main, interval); return () => { clearTimeout(timeoutId); }; } function preload() { imgMain = loadImage('res/'+imgName); imgBlack = createImage(res.x, res.y); } function setup() { let canvas = createCanvas(res.x, res.y); canvas.style(`width: ${res.x}px`) canvas.style(`height: ${res.y}px`) const c = document.querySelector("canvas"); const ctx = c.getContext("2d"); ctx.imageSmoothingEnabled = false; frameRate(120); //carica o crea la lista list = generate(); //creo una immagine (rettangolo nero) da mettere sopra alla foto della cappella sistina imgBlack.loadPixels() for(let i=0; i<res.x; i++) for(let j=0; j<res.y; j++) imgBlack.set(i, j, color(0, 0, 0, 255)); imgBlack.updatePixels() //ricolora i pixel gia disegnati precedentemente if(pointerTemp != 0) { makePixel(pointerTemp, false); console.log("loading "+pointerTemp+" pixels") } //disegna pixel apparse nel tempo in cui si era spenti let lastUpdate = localStorage.getItem("lastUpdate"); if(lastUpdate != undefined) { let currentTime = new Date() let lastTime = new Date(lastUpdate) // @ts-ignore let difference = currentTime-lastTime if(difference > 0) { let pixelToDraw = Math.round(difference/updateTime) console.log("drawing "+pixelToDraw+" pixels during offline") makePixel(pixelToDraw, false); } } //avvia il timer per gli aggiornamenti intervalTimer(()=> { makePixel(); }, updateTime) } function draw() { image(imgMain, 0, 0); image(imgBlack, 0, 0); if(complete) { fill(0); rect(0, 0, res.x, res.y); } } /** Genera e ritorna una lista casuale di numeri * @returns {number[]} */ function generate() { let max = res.x * res.y; let arrayContainer = []; for(let i = 0; i < max; i++) arrayContainer.push(i); let casuale = shuffleSeed(arrayContainer, seed); return casuale; } /** Rimuovi il nero dal pixel alla posizione indicata */ function makePixel(repeat = 1, save = true) { imgBlack.loadPixels(); for(let i=0; i<repeat; i++) { let num = list[pointer]; let posy = floor(num/res.x); let posx = num - posy * res.x; //rendi il pixel selezionato trasparente per far comparire l'immagine sotto imgBlack.set(posx, posy, color(0, 0, 0, 0)); if(pointer < list.length) { pointer += 1; } else { pointer=0; complete = true; clearInterval(interval) console.log("100% - "+((performance.now()-startTime)/1000)+"s") } if(pointer == 2916) { console.log("1% - "+((performance.now()-startTime)/1000)+"s") } if(save) { localStorage.setItem("lastUpdate", new Date().toString()) localStorage.setItem("pointer", pointer.toString()) } } imgBlack.updatePixels(); } function shuffleSeed(array, seed) { // <-- ADDED ARGUMENT var m = array.length, t, i; // While there remain elements to shuffle… while (m) { // Pick a remaining element… i = Math.floor(randomSeeded(seed) * m--); // <-- MODIFIED LINE // And swap it with the current element. t = array[m]; array[m] = array[i]; array[i] = t; ++seed // <-- ADDED LINE } return array; } function randomSeeded(seed) { var x = Math.sin(seed++) * 10000; return x - Math.floor(x); }
Editor is loading...