Advertisement
Guest User

Untitled

a guest
Apr 14th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function (images){
  2. //
  3.  
  4.   function randomInteger(min, max) {
  5.     var rand = min - 0.5 + Math.random() * (max - min + 1)
  6.     rand = Math.round(rand);
  7.     return rand;
  8.   }
  9.  
  10.   function shuffle(array) {
  11.     var currentIndex = array.length, temporaryValue, randomIndex;
  12.  
  13.     // While there remain elements to shuffle...
  14.     while (0 !== currentIndex) {
  15.  
  16.       // Pick a remaining element...
  17.       randomIndex = Math.floor(Math.random() * currentIndex);
  18.       currentIndex -= 1;
  19.  
  20.       // And swap it with the current element.
  21.       temporaryValue = array[currentIndex];
  22.       array[currentIndex] = array[randomIndex];
  23.       array[randomIndex] = temporaryValue;
  24.     }
  25.  
  26.     return array;
  27.   }
  28.  
  29.   images = shuffle(images);
  30.  
  31.   var Painter = function(config) {
  32.     var board = document.getElementById("board").getContext('2d');
  33.     var title = config.title || "unnamed";
  34.  
  35.     var img = new Image();
  36.     img.crossOrigin = "anonymous";
  37.     img.src = config.image;
  38.     var x = config.x;
  39.     var y = config.y;
  40.  
  41.     var canvas = document.createElement('canvas');
  42.     var image;
  43.  
  44.     var image_loaded_flag = false;
  45.  
  46.     var tryToDraw = function(){};    
  47.  
  48.     switch(config.drawConfig.algo) {
  49.       case 'mixin':
  50.  
  51.         (function(){
  52.           var _pixelCount = 0;
  53.           var _tryToDrawCooldown = config.drawConfig.tryToDrawCooldown;
  54.  
  55.           if(config.drawConfig.algoThreshold >= 0) {
  56.             _pixelCount = config.drawConfig.algoThreshold|0;
  57.           } else {
  58.             _pixelCount = (canvas.width * canvas.height * config.drawConfig.algoThreshold * -1)|0;
  59.           }
  60.          
  61.           tryToDraw = function() {
  62.             var counter = 0;
  63.             while(true) {
  64.               var _x = randomInteger(0, canvas.width);
  65.               var _y = randomInteger(0, canvas.height);
  66.               var coords = {x: _x, y: _y};
  67.  
  68.               if(counter > _pixelCount) {
  69.                 for(var _y = 0; _y < canvas.height; _y++){
  70.                   for(var _x = 0; _x < canvas.width; _x++){
  71.                     var coords = {x: _x, y: _y};
  72.  
  73.                     if(isSamePixelColor(coords)){
  74.                       //console.log("same color, skip");
  75.                     }
  76.                     else{
  77.                       var color_id = getColorId(coords);
  78.                       if(color_id < 0) continue;
  79.                       console.clear();    
  80.                       console.log("drawing not random: " + title + " coords " + " x:" + (parseInt(x) + parseInt(coords["x"])) + " y:" + (parseInt(y) + parseInt(coords["y"])) + " color: " + color_id);
  81.          
  82.                       App.switchColor(color_id);
  83.                       //Ставит в произвольный момент времени
  84.                       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));
  85.                       return _tryToDrawCooldown;
  86.                     }
  87.                   }
  88.                 }
  89.                 console.log(title + " is correct");
  90.                 return -1;
  91.               }
  92.          
  93.               if(isSamePixelColor(coords)){
  94.                   //console.log("same color, skip");
  95.                   counter++;
  96.               }
  97.               else{
  98.                 var color_id = getColorId(coords);
  99.                 if(color_id < 0) continue;
  100.                 console.clear();
  101.                 console.log("drawing random: " + title + " coords " + " x:" + (parseInt(x) + parseInt(coords["x"])) + " y:" + (parseInt(y) + parseInt(coords["y"])) + " color: " + color_id);
  102.  
  103.                 App.switchColor(color_id);
  104.                 //Ставит в произвольный момент времени
  105.                 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));
  106.                 return _tryToDrawCooldown;
  107.               }
  108.             }
  109.           }
  110.         })();
  111.  
  112.       break;
  113.       case 'random':
  114.         (function(){
  115.           var pixelCount = config.drawConfig.algoThreshold;
  116.           var _tryToDrawCooldown = config.drawConfig.tryToDrawCooldown;
  117.           tryToDraw = function() {
  118.             var counter = 0;
  119.             while(counter < pixelCount) {
  120.               var _x = randomInteger(0, canvas.width);
  121.               var _y = randomInteger(0, canvas.height);
  122.               var coords = {x: _x, y: _y};
  123.               counter++;
  124.               if(isSamePixelColor(coords)){
  125.                   //console.log("same color, skip");
  126.               }
  127.               else{
  128.                 var color_id = getColorId(coords);
  129.                 if(color_id < 0) continue;
  130.                 console.clear();
  131.                 console.log("drawing only random: " + title + " coords " + " x:" + (parseInt(x) + parseInt(coords["x"])) + " y:" + (parseInt(y) + parseInt(coords["y"])) + " color: " + color_id);
  132.  
  133.                 App.switchColor(color_id);
  134.                 //Ставит в произвольный момент времени
  135.                 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));
  136.                 return _tryToDrawCooldown;
  137.               }
  138.             }
  139.           }
  140.         })();
  141.       break;
  142.       case 'linear':
  143.         (function(){
  144.           var _tryToDrawCooldown = config.drawConfig.tryToDrawCooldown;
  145.           tryToDraw = function() {
  146.             for(var _y = 0; _y < canvas.height; _y++){
  147.               for(var _x = 0; _x < canvas.width; _x++){
  148.                 var coords = {x: _x, y: _y};
  149.  
  150.                 if(isSamePixelColor(coords)){
  151.                   //console.log("same color, skip");
  152.                 }
  153.                 else{
  154.                   var color_id = getColorId(coords);
  155.                   if(color_id < 0) continue;
  156.                   console.clear();
  157.                   console.log("drawing not random: " + title + " coords " + " x:" + (parseInt(x) + parseInt(coords["x"])) + " y:" + (parseInt(y) + parseInt(coords["y"])) + " color: " + color_id);
  158.            
  159.                   App.switchColor(color_id);
  160.                   //Ставит в произвольный момент времени
  161.                   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));
  162.                   return _tryToDrawCooldown;
  163.                 }
  164.               }
  165.             }
  166.             console.log(title + " is correct");
  167.             return -1;
  168.           }
  169.         })();
  170.       break;
  171.       default:
  172.         console.log("For " + title + " algo not specefied!");
  173.       break;
  174.     }
  175.  
  176.     function isSamePixelColor(coords){
  177.       var board_pixel = board.getImageData((parseInt(x) + parseInt(coords["x"])), (parseInt(y) + parseInt(coords["y"])), 1, 1).data;
  178.       var image_pixel = image.getImageData(coords["x"], coords["y"], 1, 1).data;
  179.  
  180.       if(image_pixel[3] <= 127) return true;
  181.  
  182.       for(var i = 0; i < 3; i++){
  183.         if(board_pixel[i] != image_pixel[i]) return false;
  184.       }
  185.       return true;
  186.     }
  187.  
  188.     function getColorId(coords){
  189.       var pixel = image.getImageData(coords["x"], coords["y"], 1, 1).data;
  190.       var colors = [
  191.         [255,255,255],
  192.         [228,228,228],
  193.         [136,136,136],
  194.         [34,34,34],
  195.         [255,167,209],
  196.         [229,0,0],
  197.         [229,149,0],
  198.         [160,106,66],
  199.         [229,217,0],
  200.         [148,224,68],
  201.         [2,190,1],
  202.         [0,211,221],
  203.         [0,131,199],
  204.         [0,0,234],
  205.         [207,110,228],
  206.         [130,0,128]
  207.       ];
  208.  
  209.       var color_id = -1;
  210.       var flag = false;
  211.       for(var i = 0; i < colors.length; i++){
  212.         flag = true;
  213.         for(var j = 0; j < 3; j++){
  214.           if(pixel[j] != colors[i][j]){
  215.             flag = false;
  216.             break;
  217.           }
  218.         }
  219.         if(flag){
  220.           color_id = i;
  221.           break;
  222.         }
  223.       }
  224.       if(color_id < 0)
  225.         console.log("pixel at x:" + coords.x + " y: " + coords.y + " has incorrect color.");
  226.      
  227.       return color_id;
  228.     }
  229.  
  230.     function drawImage(){
  231.       if(image_loaded_flag){
  232.         return tryToDraw();
  233.       }
  234.       return -1;
  235.     }
  236.  
  237.     function isReady(){
  238.       return image_loaded_flag;
  239.     }
  240.  
  241.     img.onload = function(){
  242.       canvas.width = img.width;
  243.       canvas.height = img.height;
  244.       image = canvas.getContext('2d');
  245.       image.drawImage(img, 0, 0, img.width, img.height);
  246.  
  247.       image_loaded_flag = true;
  248.     };
  249.  
  250.     return {
  251.       drawImage: drawImage,
  252.       isReady: isReady
  253.     };
  254.  
  255.   };
  256.  
  257.  
  258.   var painters = [];
  259.   for(var i = 0; i < images.length; i++){
  260.     painters[i] = Painter(images[i]);
  261.   }
  262.  
  263.   function draw(){
  264.     var timer = (App.cooldown-(new Date).getTime())/1E3;
  265.     if(0<timer){
  266.       console.log("timer: " + timer);
  267.       setTimeout(draw, 1000);
  268.     }
  269.     else{
  270.       for(var i = 0; i < painters.length; i++){
  271.         if(painters[i].isReady()){
  272.           var result = painters[i].drawImage();
  273.  
  274.           if(result > 0){
  275.             setTimeout(draw, result*1000);
  276.             return;
  277.           }
  278.           else{
  279.             continue;
  280.           }
  281.         }
  282.         else{
  283.           continue;
  284.         }
  285.       }
  286.       setTimeout(draw, 3000);
  287.     }
  288.  
  289.     return;
  290.   }
  291.  
  292.   draw();
  293. })(
  294.     [{
  295.       title: "Bloom",
  296.       x: 465,    
  297.       y: 560,    
  298.       image: "http://i.imgur.com/OP5NoKc.png",
  299.  
  300.       drawConfig: {
  301.         algo: 'mixin', //random, linear, mixin
  302.         algoThreshold: -1, // -n: width*height*n or float > 0 for mixin algo, int > 0 for random
  303.         tryToDrawCooldown: 20 //secs >0
  304.       }
  305.     }]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement