Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function triangleTest(rect, vertex0, vertex1, vertex2)
- {
- /*
- This function borrowed faithfully from a wonderfl (:3) discussion on
- calculating triangle collision with AABBs on the following blog:
- http://sebleedelisle.com/2009/05/super-fast-trianglerectangle-intersection-test/
- This particular optimization best suits my purposes and was contributed
- to the discussion by someone from http://lab9.fr/
- */
- var l = rect.x;
- var r = rect.w;
- var t = rect.y;
- var b = rect.h;
- var x0 = vertex0.x;
- var y0 = vertex0.y;
- var x1 = vertex1.x;
- var y1 = vertex1.y;
- var x2 = vertex2.x;
- var y2 = vertex2.y;
- var c, m, s;
- var b0 = ((x0 > l) ? 1 : 0) | (((y0 > t) ? 1 : 0) << 1) |
- (((x0 > r) ? 1 : 0) << 2) | (((y0 > b) ? 1 : 0) << 3);
- if (b0 == 3) return true;
- var b1 = ((x1 > l) ? 1 : 0) | (((y1 > t) ? 1 : 0) << 1) |
- (((x1 > r) ? 1 : 0) << 2) | (((y1 > b) ? 1 : 0) << 3);
- if (b1 == 3) return true;
- var b2 = ((x2 > l) ? 1 : 0) | (((y2 > t) ? 1 : 0) << 1) |
- (((x2 > r) ? 1 : 0) << 2) | (((y2 > b) ? 1 : 0) << 3);
- if (b2 == 3) return true;
- var i0 = b0 ^ b1;
- if (i0 != 0)
- {
- m = (y1-y0) / (x1-x0);
- c = y0 -(m * x0);
- if (i0 & 1) { s = m * l + c; if ( s > t && s < b) return true; }
- if (i0 & 2) { s = (t - c) / m; if ( s > l && s < r) return true; }
- if (i0 & 4) { s = m * r + c; if ( s > t && s < b) return true; }
- if (i0 & 8) { s = (b - c) / m; if ( s > l && s < r) return true; }
- }
- var i1 = b1 ^ b2;
- if (i1 != 0)
- {
- m = (y2-y1) / (x2-x1);
- c = y1 -(m * x1);
- if (i1 & 1) { s = m * l + c; if ( s > t && s < b) return true; }
- if (i1 & 2) { s = (t - c) / m; if ( s > l && s < r) return true; }
- if (i1 & 4) { s = m * r + c; if ( s > t && s < b) return true; }
- if (i1 & 8) { s = (b - c) / m; if ( s > l && s < r) return true; }
- }
- var i2 = b0 ^ b2;
- if (i2 != 0)
- {
- m = (y2-y0) / (x2-x0);
- c = y0 -(m * x0);
- if (i2 & 1) { s = m * l + c; if ( s > t && s < b) return true; }
- if (i2 & 2) { s = (t - c) / m; if ( s > l && s < r) return true; }
- if (i2 & 4) { s = m * r + c; if ( s > t && s < b) return true; }
- if (i2 & 8) { s = (b - c) / m; if ( s > l && s < r) return true; }
- }
- return false;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement