ulfben icon

Intersection tests (AABB, SAT, lineCircle, distance)

ulfben | PRO | 11/22/16 11:31:41 PM UTC | 0 ⭐ | 11424 👁️ | Never ⏰ | []
ActionScript 3 |

0 B

|

None

|

0 👍

/

0 👎

/*Math from "Making Thing Move!" by Keith Peters*/
public static function lineCircleIntersection(lineStart:Point, lineEnd:Point, entity:Entity):Boolean {
    var angle:Number = Math.atan2((lineEnd.y-lineStart.y), (lineEnd.x-lineStart.x));
    var dx:Number = entity.centerX-((lineStart.x+lineEnd.x) * 0.5);
    var dy:Number = entity.centerY-((lineStart.y+lineEnd.y) * 0.5);
    return (Math.abs(Math.cos(angle)*dy - Math.sin(angle)*dx) < entity.radius);
}
 
public static function distanceSq(lhs:Entity, rhs:Entity):Number{
    var dx:Number = lhs.centerX - rhs.centerX;
    var dy:Number = lhs.centerY - rhs.centerY;
    return (dx * dx + dy * dy);
}
 
public static function distance(lhs:Entity, rhs:Entity):Number{
    var dx:Number = lhs.centerX - rhs.centerX;
    var dy:Number = lhs.centerY - rhs.centerY;
    return Math.sqrt(dx * dx + dy * dy);
}
 
public static function intersectsAABB(lhs:core.Entity, rhs:core.Entity):Boolean {
    return !(lhs.right < rhs.left
            || rhs.right < lhs.left
            || lhs.bottom < rhs.top
            || rhs.bottom < lhs.top);
}
 
//SAT intersection test. http://www.metanetsoftware.com/technique/tutorialA.html
//returns true on intersection, and sets the least intersecting axis in overlap
public static function getOverlap(lhs:Entity, rhs:Entity, overlap:Point):Boolean {
    overlap.setTo(0, 0);
    var centerDeltaX:Number = lhs.centerX - rhs.centerX;
    var halfWidths:Number = (lhs.width + rhs.width) * 0.5;
 
    if (Math.abs(centerDeltaX) > halfWidths) return false; //no overlap on x == no collision
 
    var centerDeltaY:Number = lhs.centerY - rhs.centerY;
    var halfHeights:Number = (lhs.height + rhs.height) * 0.5;
 
    if (Math.abs(centerDeltaY) > halfHeights) return false; //no overlap on y == no collision
 
    var dx:Number = halfWidths - Math.abs(centerDeltaX); //overlap on x
    var dy:Number = halfHeights - Math.abs(centerDeltaY); //overlap on y
    if (dy < dx) {
        overlap.y = (centerDeltaY < 0) ? -dy : dy;
    } else if (dy > dx) {
        overlap.x = (centerDeltaX < 0) ? -dx : dx;
    } else {
        overlap.x = (centerDeltaX < 0) ? -dx : dx;
        overlap.y = (centerDeltaY < 0) ? -dy : dy;
    }
    return true;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  • Rteuixl icon
    04/02/26 04:50:35 PM UTC
    text |

    0 B

    |

    0 👍

    /

    0 👎

    Best t33n active cpx link daily updates!
     Copy and paste the link in a new browser tab and then hit enter!
     https://crazyporn.@xxx/members/157354/?asgtbndr=1&play=true&spon=adworld&zone=400
     Remove the @ 
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎