hit-test
Version:
5 lines • 1.42 kB
JavaScript
/*!
* 2D碰撞检测
* <anderpang@foxmail.com>
*/
;!function(e,t){"object"==typeof module&&"object"==typeof module.exports?(Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=t()):"function"==typeof define&&define.amd?define([],t):e.hitTest=t()}(this,function(){function n(e,t){for(var n,r,i,u,c=Object.create(null),h=0,o=e.length;h<o;h+=2)if(i=e[(h-2+o)%o],u=e[(h-1+o)%o],c.x=u-e[h+1],c.y=e[h]-i,n=y(c,e),r=y(c,t),n[0]>r[1]||n[1]<r[0])return!0;return!1}function o(e,t){return e.x*t.x+e.y*t.y}function y(e,t){var n,r,i,u=Object.create(null),c=2,h=t.length;for(u.x=t[0],u.y=t[1],n=r=o(u,e);c<h;c+=2)u.x=t[c],u.y=t[c+1],(i=o(u,e))<n?n=i:r<i&&(r=i);return[n,r]}return{Rectangle:function(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y},Circle:function(e,t){var n=t.radius+e.radius,r=t.x-e.x,i=t.y-e.y;return r*r+i*i<n*n},RectangleCircle:function(e,t){var n,r,i=t.radius;return n=t.x<e.x?e.x:t.x>e.x+e.width?e.x+e.width:t.x,r=t.y<e.y?e.y:t.y>e.y+e.height?e.y+e.height:t.y,(n-=t.x)*n+(r-=t.y)*r<i*i},RectangleCircleAngle:function(e,t,n){var r=Object.create(null),i=Object.create(null),u=.5*e.width,c=.5*e.height,h=e.x,o=e.y,y=t.x,x=t.y,l=Math.sin(n),a=Math.cos(n),f=a*h+l*o,d=a*o-l*h;return r.x=f-u,r.y=d-c,r.width=e.width,r.height=e.height,i.x=a*y+l*x,i.y=a*x-l*y,i.radius=t.radius,this.RectangleCircle(r,i)},Polygon:function(e,t){return!n(e,t)&&!n(t,e)}}});