ulfben

Intersection tests (AABB, SAT, lineCircle, distance)

Nov 22nd, 2016
222
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*Math from "Making Thing Move!" by Keith Peters*/
  2. public static function lineCircleIntersection(lineStart:Point, lineEnd:Point, entity:Entity):Boolean {
  3.     var angle:Number = Math.atan2((lineEnd.y-lineStart.y), (lineEnd.x-lineStart.x));
  4.     var dx:Number = entity.centerX-((lineStart.x+lineEnd.x) * 0.5);
  5.     var dy:Number = entity.centerY-((lineStart.y+lineEnd.y) * 0.5);
  6.     return (Math.abs(Math.cos(angle)*dy - Math.sin(angle)*dx) < entity.radius);
  7. }
  8.  
  9. public static function distanceSq(lhs:Entity, rhs:Entity):Number{
  10.     var dx:Number = lhs.centerX - rhs.centerX;
  11.     var dy:Number = lhs.centerY - rhs.centerY;
  12.     return (dx * dx + dy * dy);
  13. }
  14.  
  15. public static function distance(lhs:Entity, rhs:Entity):Number{
  16.     var dx:Number = lhs.centerX - rhs.centerX;
  17.     var dy:Number = lhs.centerY - rhs.centerY;
  18.     return Math.sqrt(dx * dx + dy * dy);
  19. }
  20.  
  21. public static function intersectsAABB(lhs:core.Entity, rhs:core.Entity):Boolean {
  22.     return !(lhs.right < rhs.left
  23.             || rhs.right < lhs.left
  24.             || lhs.bottom < rhs.top
  25.             || rhs.bottom < lhs.top);
  26. }
  27.  
  28. //SAT intersection test. http://www.metanetsoftware.com/technique/tutorialA.html
  29. //returns true on intersection, and sets the least intersecting axis in overlap
  30. public static function getOverlap(lhs:Entity, rhs:Entity, overlap:Point):Boolean {
  31.     overlap.setTo(0, 0);
  32.     var centerDeltaX:Number = lhs.centerX - rhs.centerX;
  33.     var halfWidths:Number = (lhs.width + rhs.width) * 0.5;
  34.  
  35.     if (Math.abs(centerDeltaX) > halfWidths) return false; //no overlap on x == no collision
  36.  
  37.     var centerDeltaY:Number = lhs.centerY - rhs.centerY;
  38.     var halfHeights:Number = (lhs.height + rhs.height) * 0.5;
  39.  
  40.     if (Math.abs(centerDeltaY) > halfHeights) return false; //no overlap on y == no collision
  41.  
  42.     var dx:Number = halfWidths - Math.abs(centerDeltaX); //overlap on x
  43.     var dy:Number = halfHeights - Math.abs(centerDeltaY); //overlap on y
  44.     if (dy < dx) {
  45.         overlap.y = (centerDeltaY < 0) ? -dy : dy;
  46.     } else if (dy > dx) {
  47.         overlap.x = (centerDeltaX < 0) ? -dx : dx;
  48.     } else {
  49.         overlap.x = (centerDeltaX < 0) ? -dx : dx;
  50.         overlap.y = (centerDeltaY < 0) ? -dy : dy;
  51.     }
  52.     return true;
  53. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×