Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (function (images){
- //
- function randomInteger(min, max) {
- var rand = min - 0.5 + Math.random() * (max - min + 1)
- rand = Math.round(rand);
- return rand;
- }
- function shuffle(array) {
- var currentIndex = array.length, temporaryValue, randomIndex;
- // While there remain elements to shuffle...
- while (0 !== currentIndex) {
- // Pick a remaining element...
- randomIndex = Math.floor(Math.random() * currentIndex);
- currentIndex -= 1;
- // And swap it with the current element.
- temporaryValue = array[currentIndex];
- array[currentIndex] = array[randomIndex];
- array[randomIndex] = temporaryValue;
- }
- return array;
- }
- images = shuffle(images);
- var Painter = function(config) {
- var board = document.getElementById("board").getContext('2d');
- var title = config.title || "unnamed";
- var img = new Image();
- img.crossOrigin = "anonymous";
- img.src = config.image;
- var x = config.x;
- var y = config.y;
- var canvas = document.createElement('canvas');
- var image;
- var image_loaded_flag = false;
- var tryToDraw = function(){};
- switch(config.drawConfig.algo) {
- case 'mixin':
- (function(){
- var _pixelCount = 0;
- var _tryToDrawCooldown = config.drawConfig.tryToDrawCooldown;
- if(config.drawConfig.algoThreshold >= 0) {
- _pixelCount = config.drawConfig.algoThreshold|0;
- } else {
- _pixelCount = (canvas.width * canvas.height * config.drawConfig.algoThreshold * -1)|0;
- }
- tryToDraw = function() {
- var counter = 0;
- while(true) {
- var _x = randomInteger(0, canvas.width);
- var _y = randomInteger(0, canvas.height);
- var coords = {x: _x, y: _y};
- if(counter > _pixelCount) {
- for(var _y = 0; _y < canvas.height; _y++){
- for(var _x = 0; _x < canvas.width; _x++){
- var coords = {x: _x, y: _y};
- if(isSamePixelColor(coords)){
- //console.log("same color, skip");
- }
- else{
- var color_id = getColorId(coords);
- if(color_id < 0) continue;
- console.clear();
- console.log("drawing not random: " + title + " coords " + " x:" + (parseInt(x) + parseInt(coords["x"])) + " y:" + (parseInt(y) + parseInt(coords["y"])) + " color: " + color_id);
- App.switchColor(color_id);
- //Ставит в произвольный момент времени
- setTimeout(App.attemptPlace ( (parseInt(x) + parseInt(coords["x"])), (parseInt(y) + parseInt(coords["y"])) ), (randomInteger(1, 9) * 1000 + randomInteger(0, 9) * 100 + randomInteger(0, 9) * 10 + randomInteger(0, 9) * 1));
- return _tryToDrawCooldown;
- }
- }
- }
- console.log(title + " is correct");
- return -1;
- }
- if(isSamePixelColor(coords)){
- //console.log("same color, skip");
- counter++;
- }
- else{
- var color_id = getColorId(coords);
- if(color_id < 0) continue;
- console.clear();
- console.log("drawing random: " + title + " coords " + " x:" + (parseInt(x) + parseInt(coords["x"])) + " y:" + (parseInt(y) + parseInt(coords["y"])) + " color: " + color_id);
- App.switchColor(color_id);
- //Ставит в произвольный момент времени
- setTimeout(App.attemptPlace ( (parseInt(x) + parseInt(coords["x"])), (parseInt(y) + parseInt(coords["y"])) ), (randomInteger(1, 9) * 1000 + randomInteger(0, 9) * 100 + randomInteger(0, 9) * 10 + randomInteger(0, 9) * 1));
- return _tryToDrawCooldown;
- }
- }
- }
- })();
- break;
- case 'random':
- (function(){
- var pixelCount = config.drawConfig.algoThreshold;
- var _tryToDrawCooldown = config.drawConfig.tryToDrawCooldown;
- tryToDraw = function() {
- var counter = 0;
- while(counter < pixelCount) {
- var _x = randomInteger(0, canvas.width);
- var _y = randomInteger(0, canvas.height);
- var coords = {x: _x, y: _y};
- counter++;
- if(isSamePixelColor(coords)){
- //console.log("same color, skip");
- }
- else{
- var color_id = getColorId(coords);
- if(color_id < 0) continue;
- console.clear();
- console.log("drawing only random: " + title + " coords " + " x:" + (parseInt(x) + parseInt(coords["x"])) + " y:" + (parseInt(y) + parseInt(coords["y"])) + " color: " + color_id);
- App.switchColor(color_id);
- //Ставит в произвольный момент времени
- setTimeout(App.attemptPlace ( (parseInt(x) + parseInt(coords["x"])), (parseInt(y) + parseInt(coords["y"])) ), (randomInteger(1, 9) * 1000 + randomInteger(0, 9) * 100 + randomInteger(0, 9) * 10 + randomInteger(0, 9) * 1));
- return _tryToDrawCooldown;
- }
- }
- }
- })();
- break;
- case 'linear':
- (function(){
- var _tryToDrawCooldown = config.drawConfig.tryToDrawCooldown;
- tryToDraw = function() {
- for(var _y = 0; _y < canvas.height; _y++){
- for(var _x = 0; _x < canvas.width; _x++){
- var coords = {x: _x, y: _y};
- if(isSamePixelColor(coords)){
- //console.log("same color, skip");
- }
- else{
- var color_id = getColorId(coords);
- if(color_id < 0) continue;
- console.clear();
- console.log("drawing not random: " + title + " coords " + " x:" + (parseInt(x) + parseInt(coords["x"])) + " y:" + (parseInt(y) + parseInt(coords["y"])) + " color: " + color_id);
- App.switchColor(color_id);
- //Ставит в произвольный момент времени
- setTimeout(App.attemptPlace ( (parseInt(x) + parseInt(coords["x"])), (parseInt(y) + parseInt(coords["y"])) ), (randomInteger(1, 9) * 1000 + randomInteger(0, 9) * 100 + randomInteger(0, 9) * 10 + randomInteger(0, 9) * 1));
- return _tryToDrawCooldown;
- }
- }
- }
- console.log(title + " is correct");
- return -1;
- }
- })();
- break;
- default:
- console.log("For " + title + " algo not specefied!");
- break;
- }
- function isSamePixelColor(coords){
- var board_pixel = board.getImageData((parseInt(x) + parseInt(coords["x"])), (parseInt(y) + parseInt(coords["y"])), 1, 1).data;
- var image_pixel = image.getImageData(coords["x"], coords["y"], 1, 1).data;
- if(image_pixel[3] <= 127) return true;
- for(var i = 0; i < 3; i++){
- if(board_pixel[i] != image_pixel[i]) return false;
- }
- return true;
- }
- function getColorId(coords){
- var pixel = image.getImageData(coords["x"], coords["y"], 1, 1).data;
- var colors = [
- [255,255,255],
- [228,228,228],
- [136,136,136],
- [34,34,34],
- [255,167,209],
- [229,0,0],
- [229,149,0],
- [160,106,66],
- [229,217,0],
- [148,224,68],
- [2,190,1],
- [0,211,221],
- [0,131,199],
- [0,0,234],
- [207,110,228],
- [130,0,128]
- ];
- var color_id = -1;
- var flag = false;
- for(var i = 0; i < colors.length; i++){
- flag = true;
- for(var j = 0; j < 3; j++){
- if(pixel[j] != colors[i][j]){
- flag = false;
- break;
- }
- }
- if(flag){
- color_id = i;
- break;
- }
- }
- if(color_id < 0)
- console.log("pixel at x:" + coords.x + " y: " + coords.y + " has incorrect color.");
- return color_id;
- }
- function drawImage(){
- if(image_loaded_flag){
- return tryToDraw();
- }
- return -1;
- }
- function isReady(){
- return image_loaded_flag;
- }
- img.onload = function(){
- canvas.width = img.width;
- canvas.height = img.height;
- image = canvas.getContext('2d');
- image.drawImage(img, 0, 0, img.width, img.height);
- image_loaded_flag = true;
- };
- return {
- drawImage: drawImage,
- isReady: isReady
- };
- };
- var painters = [];
- for(var i = 0; i < images.length; i++){
- painters[i] = Painter(images[i]);
- }
- function draw(){
- var timer = (App.cooldown-(new Date).getTime())/1E3;
- if(0<timer){
- console.log("timer: " + timer);
- setTimeout(draw, 1000);
- }
- else{
- for(var i = 0; i < painters.length; i++){
- if(painters[i].isReady()){
- var result = painters[i].drawImage();
- if(result > 0){
- setTimeout(draw, result*1000);
- return;
- }
- else{
- continue;
- }
- }
- else{
- continue;
- }
- }
- setTimeout(draw, 3000);
- }
- return;
- }
- draw();
- })(
- [{
- title: "Bloom",
- x: 465,
- y: 560,
- image: "http://i.imgur.com/OP5NoKc.png",
- drawConfig: {
- algo: 'mixin', //random, linear, mixin
- algoThreshold: -1, // -n: width*height*n or float > 0 for mixin algo, int > 0 for random
- tryToDrawCooldown: 20 //secs >0
- }
- }]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement