/// <summary> /// Get collision data between two collliders. NOTE, this will not cause a physical collision, if you want to cause a collision use the function "collide()" in the object returned. /// </summary> /// <param name="a">Any circle collider.</param> /// <param name="b">Any line collider.</param> /// <returns>The collision data between the colliders, or null if no collision occured.</returns> public static Collision getCollision(CircleCollider a, LineCollider b) { //precalculate gradient for efficiancy. double gradient = b.globalGradient; //squere distance between circle center to possible contact point double sqrDistance = a.globalCenter.Y - b.globalCenter.Y + gradient * (b.globalCenter.X - a.globalCenter.X); sqrDistance *= sqrDistance / (gradient * gradient + 1); if (sqrDistance > a.radius * a.radius) { return(null); } if (a.globalCenter.sqrDistance(b.globalCenter) - sqrDistance > b.length * b.length / 4) { return(null); } Vector2d normal = b.globalNormalVector; //look here for 1 directional colliders. if ((a.globalCenter - b.globalCenter).cosineOfAngleBetween(normal) > 0) { normal *= -1; } return(new Collision(a, b, normal, a.globalCenter + Sqrt(sqrDistance) * normal, a.radius - Sqrt(sqrDistance))); }
/// <summary> /// Get collision data between two collliders. NOTE, this will not cause a physical collision, if you want to cause a collision use the function "collide()" in the object returned. /// </summary> /// <param name="a">Any circle collider.</param> /// <param name="b">Any Circle collider.</param> /// <returns>The collision data between the colliders, or null if no collision occured.</returns> public static Collision getCollision(CircleCollider a, CircleCollider b) { if ((a.globalCenter - b.globalCenter).LengthSquared <= (a.radius + b.radius) * (a.radius + b.radius)) { return(new Collision(a, b, -(a.globalCenter - b.globalCenter).Normalized(), //normal (a.globalCenter * a.radius + b.globalCenter * b.radius) / (a.radius + b.radius), //point(weighted average) a.radius + b.radius - a.globalCenter.distance(b.globalCenter))); } return(null); }
/// <summary> /// Get collision data between two collliders. NOTE, this will not cause a physical collision, if you want to cause a collision use the function "collide()" in the object returned. /// </summary> /// <param name="a">Any line collider.</param> /// <param name="b">Any Circle collider.</param> /// <returns>The collision data between the colliders, or null if no collision occured.</returns> public static Collision getCollision(LineCollider a, CircleCollider b) { return(getCollision(b, a)); }