Skip to content

Instantly share code, notes, and snippets.

@lightjiao
Created March 27, 2022 15:53
Show Gist options
  • Save lightjiao/570827f0067ceb27cd148114f760bb1e to your computer and use it in GitHub Desktop.
Save lightjiao/570827f0067ceb27cd148114f760bb1e to your computer and use it in GitHub Desktop.
2D胶囊体与2D圆是否相交,算法来源于《游戏开发中的数学与物理》一书
/// <summary>
/// 2D胶囊体与2D圆是否相交
/// </summary>
/// <param name="capsulePoint">胶囊体的圆心</param>
/// <param name="capsuleDir">胶囊体的向量</param>
/// <param name="capsuleRadius">胶囊体的半径</param>
/// <param name="circlePoint">圆心的位置</param>
/// <param name="circleRadius">圆的半径</param>
/// <returns></returns>
private static bool CapsuleAndCircleCheckHit(Vector2 capsulePoint, Vector2 capsuleDir, float capsuleRadius, Vector2 circlePoint, float circleRadius)
{
var dx = circlePoint.x - capsulePoint.x;
var dy = circlePoint.y - capsulePoint.y;
var t = (capsuleDir.x * dx + capsuleDir.y * dy) /
(capsuleDir.x * capsuleDir.x + capsuleDir.y * capsuleDir.y);
t = Mathf.Clamp01(t);
var mx = capsuleDir.x * t + capsulePoint.x;
var my = capsuleDir.y * t + capsulePoint.y;
var disSqrt = (mx - circlePoint.x) * (mx - circlePoint.x) +
(my - circlePoint.y) * (my - circlePoint.y);
var radiusSum = capsuleRadius + circleRadius;
if (disSqrt <= radiusSum * radiusSum)
{
return true;
}
return false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment