Skip to content

Instantly share code, notes, and snippets.

@pixelrevision
Last active January 23, 2018 19:28
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pixelrevision/d685a38128047139aee0 to your computer and use it in GitHub Desktop.
Save pixelrevision/d685a38128047139aee0 to your computer and use it in GitHub Desktop.
PixelLevelCollision.js
/*
Works with the alpha channel of an image to determine if there is collision with alpha
@parameter image - the image to check coordinate with.
@parameter sampling - (0.1-1.0) The percentage to downsample the image. Helps with performance and memory. Default 0.5
@parameter threshhold - (0.0-1.0) the threshhold to set the alpha for a hit. default 0.2
*/
var PixelLevelCollision = function(image, sampling, threshhold){
var self = this;
if(sampling === undefined){
sampling = 0.5;
}
if(sampling > 1.0){
sampling = 1.0;
}
if(sampling < 0.01){
sampling = 0.1;
}
if(threshhold === undefined){
threshhold = 0.2;
}
this.image = image;
this.sampling = sampling;
this.threshhold = threshhold;
this.canCreateMap = true;
this.image.onload = function(){
self.setupCanvas();
}
this.setupCanvas();
}
PixelLevelCollision.prototype.setupCanvas = function(){
this.canCreateMap = true;
this.baseWidth = Math.floor(this.image.width * this.sampling);
this.baseHeight = Math.floor(this.image.height * this.sampling);
var canvas = document.createElement("canvas");
canvas.width = this.baseWidth;
canvas.height = this.baseHeight;
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, this.baseWidth, this.baseHeight);
try{
ctx.drawImage(this.image, 0, 0, this.baseWidth, this.baseHeight);
var pixelData = ctx.getImageData(0, 0, this.baseWidth, this.baseHeight);
}catch(e){
if(typeof console !== "undefined"){
console.log("!Warning could not get image data defaulting to always hit");
}
this.canCreateMap = false;
return;
}
this.alphaData = [];
var total = pixelData.data.length/4;
var inc = 255.0/total;
var start = 0.0;
for(var i=0; i<pixelData.data.length; i+=4){
this.alphaData.push(pixelData.data[i + 3]);
start += inc;
}
ctx.putImageData(pixelData, 0, 0);
}
/**
Checks if there is a collision with pixel at pointX and pointY from top left corner of the original image
@parameter pointX - (0-image width) The x point from the top left of the image to check.
@parameter pointY - (0-image height) The y point from the top left of the image to check.
*/
PixelLevelCollision.prototype.isCollided = function(pointX, pointY) {
if(!this.canCreateMap){
return true;
}
pointX = Math.floor(pointX * this.sampling);
pointY = Math.floor(pointY * this.sampling);
var pixel = (pointY * this.baseWidth) + pointX;
return this.alphaData[pixel] > this.threshhold;
};
<!DOCTYPE html>
<html>
<head>
<title></title>
<script src="http://code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="PixelLevelCollision.js" type="text/javascript"></script>
<script type="text/javascript">
var plc;
$(document).ready(function(){
plc = new PixelLevelCollision(document.getElementById("sample_image"), 0.5);
$("#sample_image").mousemove(function(e){
var posX = e.pageX - $(this).offset().left;
var posY = e.pageY - $(this).offset().top;
if(plc.isCollided(posX, posY)){
$(".output").html("collided");
}else{
$(".output").html("not collided");
}
});
});
</script>
</head>
<body>
<div id="container">
<div class="output">info</div>
<img id="sample_image" width="150" height="187" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAC7CAMAAACw7Zc4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyNpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIyQkQ4QUY5QjE5NDExRTRCMEJCQzhBNDk5RkQwQ0ZBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIyQkQ4QUZBQjE5NDExRTRCMEJCQzhBNDk5RkQwQ0ZBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QjJCRDhBRjdCMTk0MTFFNEIwQkJDOEE0OTlGRDBDRkEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QjJCRDhBRjhCMTk0MTFFNEIwQkJDOEE0OTlGRDBDRkEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4lSOU0AAABgFBMVEXXmYe4Zk+uSzHsuKX9/PwvCQWxWEPNemLXsafapZZMDwX81slwMieOKQ33vKWPNiK1c2PnqZR0IxCUU0XRzs35xKgpKDUCAQVoFQKURjT4zcbbi3LsxbX85dhta3G0sLDZhmjIc1fmm4VVLib67ObclHj83dKyhHdMSlayk4zqs5qPjJB4TkbnponmknbIa1LKh3bGZUeWc23qvLL1xLBWIBXq5uZvQTYSFiQVAgL4vbAyM0P69e9VVGTty8P2zLuYY1fLgWqlOiPoraH+zbzm3dnWeFbyt5sEBxDvwKn1x7r908D+xrHo08qiMhATEhqHGgBDPEYcIDDCXkP9xrv1y7Lawrrzq5R1dIAJDxubf3rNkn7+y7D5q4o4HBY8QFSdm5wjGiG/WDL36/PVg158Xlb4saOCgYX23uEUCRPQdEe5ZTqyRBjbkGjRa1kcDgrx1L3gfWNJHRvSaURgX2HAw74LDA6fQhq6oZ7YxI9eXHHBu7v/067FxsUAAAD////rW/1BAAAAgHRSTlP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////ADgFS2cAACa/SURBVHja7J2LW9pa9vcJkAAhGC6VEMAWiKClICBECKBy8QLYiqJWKT1YPGprrWI5HXTaX+m//q61g5eemc7RnhnOPM87Odbq1MuHtdb+rsveyWi+/Vdemv9h/Q/rf1j/w/r/F0uv/6b/r8LS5/N6fX7y3eSLF8sv5vT6/wos/dzLq6dPp6ZMSdOrSCRy9NS48PLFuzn9X4qVf/G0MFuIpLk0FzmKyDRcvchsXFeb/Cux5l5FHIUjSZIljqPbnNyjlS7NpuPxqeTkX4f14kjixHQbL+lIUtoyK7UVhabT1kihNflXYb2ISJG0JPW6gNLuRTha7slcG+xFR+KOdGsh/5dgTc4WXqV77W67q3QVmqWlNM3KbLqt0ApbCDocs6Z3fwFW/mVkKqK0lXa7i+aS2sDF9mQZA78nU6uiVLia0I8ca/LpUZomxup2O21a6fVoqUenJS7So2XJPlXk2LQxpB8tln7OOEWCHcAUpU4+ACv1ehzEvdRL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"/>
</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment