Last active
August 29, 2015 13:57
-
-
Save adrianseeley/9516453 to your computer and use it in GitHub Desktop.
Multi-Pass Color Sort Lamba X and Lambda Y
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<canvas id="canvas" width="256" height="256"></canvas> | |
<script type="text/javascript"> | |
var canvas = document.getElementById("canvas"); | |
var ctx = canvas.getContext("2d"); | |
var imgdata = ctx.createImageData(canvas.width, canvas.height); | |
function set_pixel (x, y, r, g, b) { var index = (x + y * imgdata.width) * 4; imgdata.data[index + 0] = r; imgdata.data[index + 1] = g; imgdata.data[index + 2] = b; imgdata.data[index + 3] = 255; }; | |
function swap_pixels (x1, y1, x2, y2) { var p1 = get_pixel(x1, y1); var p2 = get_pixel(x2, y2); set_pixel(x1, y1, p2[0], p2[1], p2[2]); set_pixel(x2, y2, p1[0], p1[1], p1[2]); }; | |
function get_pixel (x, y) { var index = (x + y * imgdata.width) * 4; return [imgdata.data[index + 0], imgdata.data[index + 1], imgdata.data[index + 2]]; }; | |
function draw () { ctx.putImageData(imgdata, 0, 0); }; | |
function prep () { | |
// meant for 4096x4096 canvas, slow as fuck | |
var r = 0; | |
var g = 0; | |
var b = 0; | |
for (var x = 0; x < canvas.width; x++) { | |
for (var y = 0; y < canvas.height; y++) { | |
set_pixel(x, y, r, g, b); | |
b++; | |
if (b > 255) { | |
b = 0; | |
g++; | |
if (g > 255) { | |
g = 0; | |
r++; | |
} | |
} | |
} | |
} | |
draw(); | |
}; | |
function preprandom () { | |
// way prettier | |
for (var x = 0; x < canvas.width; x++) for (var y = 0; y < canvas.height; y++) set_pixel(x, y, Math.floor(Math.random() * 255), Math.floor(Math.random() * 255), Math.floor(Math.random() * 255)); | |
draw(); | |
}; | |
function multi_pass_sort (lambda_x, lambda_y) { | |
var sorted = true; | |
for (var x = 1; x < canvas.width; x++) for (var y = 0; y < canvas.height; y++) if (lambda_x(get_pixel(x - 1, y), get_pixel(x, y))) { swap_pixels(x - 1, y, x, y); sorted = false; } | |
for (var x = 0; x < canvas.width; x++) for (var y = 1; y < canvas.height; y++) if (lambda_y(get_pixel(x, y - 1), get_pixel(x, y))) { swap_pixels(x, y - 1, x, y); sorted = false; } | |
draw(); | |
if (!sorted) setTimeout(function () { multi_pass_sort(lambda_x, lambda_y); }, 0); | |
else console.log('done!'); | |
}; | |
//prep(); | |
preprandom(); | |
setTimeout(function () { multi_pass_sort(function lambda_x (a, b) { return a[0] > b[0] || a[1] > b[1]; }, function lambda_y (a, b) { return a[1] > b[1] || a[2] > b[2]; }); | |
}, 1000); | |
</script> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment