private bool CircleRectangleCollision(ShapeCircle circle, ShapeRectangle rectangle) { var circleDistanceX = Math.Abs(circle.Position.X - rectangle.Position.X); var circleDistanceY = Math.Abs(circle.Position.Y - rectangle.Position.Y); if (circleDistanceX > (rectangle.Width / 2 + circle.Radius)) { return(false); } if (circleDistanceY > (rectangle.Height / 2 + circle.Radius)) { return(false); } if (circleDistanceX <= (rectangle.Width / 2)) { return(true); } if (circleDistanceY <= (rectangle.Height / 2)) { return(true); } var cornerDistanceSQ = Math.Pow((circleDistanceX - rectangle.Width / 2), 2) + Math.Pow((circleDistanceY - rectangle.Height / 2), 2); return(cornerDistanceSQ <= Math.Pow(circle.Radius, 2)); }
/// <summary> /// 円と矩形が交差、又はそれぞれ内包していたらtrue /// </summary> /// <param name="circle"></param> /// <param name="rect"></param> /// <returns></returns> public static bool Overlaps(ShapeCircle circle, Vector2[] verts) { // 矩形の中に円が含まれていればtrue if (IsInRect(circle.Position, verts)) { // 矩形の中に円の中心がある return(true); } for (int i = 0; i < verts.Length; i++) { int next = i + 1; if (next == verts.Length) { next = 0; } if (circle.Contains(verts[i])) { // 頂点が1個でも入ってれば、円の中に矩形があるか交差している。 return(true); } if (Overlaps(circle, verts[i], verts[next])) { // 交差している。 return(true); } } return(false); }
public void Circle_Rectangle_Collision_Success() { var collisionManager = new ShapeCollisionManager(); var circle = new ShapeCircle(10, new Point(0, 0)); var rectangle = new ShapeRectangle(10, 10, new Point(14, 0)); Assert.IsTrue(collisionManager.CheckCollision(circle, rectangle)); }
private bool CircleCollision(ShapeCircle shape1, ShapeCircle shape2) { var positionDistance = Math.Pow(shape1.Position.X - shape2.Position.X, 2) + Math.Pow(shape1.Position.Y - shape2.Position.Y, 2); var radiusDistance = Math.Pow(shape1.Radius, 2) + Math.Pow(shape2.Radius, 2); return(radiusDistance >= positionDistance); }
override public bool HitTest(ShapeCircle other) { // 距離を求める float nx = transform.position.x - other.transform.position.x; float ny = transform.position.y - other.transform.position.y; Vector2 n = new Vector2(nx, ny); var d = Mathf.Sqrt(Vector2.Dot(n, n)); return(d < radius + other.radius); }
// 円との当たり判定 public bool HitTest(ShapeCircle other) { // 2つの円の半径の合計値 float sum_radius = radius + other.radius; // 2つの円の距離 float distance = Mathf.Sqrt(Mathf.Pow(other.transform.position.x - transform.position.x, 2) + Mathf.Pow(other.transform.position.y - transform.position.y, 2)); // 2つの円の距離が、半径の合計値より小さい場合、当たっている if (distance <= sum_radius) { return(true); } return(false); }
/// <summary> /// 線が円に交差していればtrueを返す /// </summary> /// <param name="circle"></param> /// <param name="lineStartPos"></param> /// <param name="lineEndPos"></param> /// <returns></returns> private static bool Overlaps(ShapeCircle circle, Vector2 lineStartPos, Vector2 lineEndPos) { Vector2 lineVec = lineEndPos - lineStartPos; Vector2 normalisedLine = lineVec.normalized; Vector2 startCenterVec = circle.Position - lineStartPos; // 始点から円の中心までの距離を内積で求める float startToTargetLength = Vector2.Dot(normalisedLine, startCenterVec); // 線と円の中心の最短距離を割り出す float shortestDistance; if (startToTargetLength < 0) { // 中心から線の始点が最短距離 shortestDistance = Vector2.Distance(circle.Position, lineStartPos); } else if (startToTargetLength > Vector2.Distance(lineEndPos, lineStartPos)) { // 中心から線の終点が最短距離 shortestDistance = Vector2.Distance(circle.Position, lineEndPos); } else { // 中心から線への最短距離を割り出す shortestDistance = Mathf.Abs(normalisedLine.x * startCenterVec.y - startCenterVec.x * normalisedLine.y); } if (shortestDistance < circle.Radius) { // 最短距離が円の半径よりも小さい場合は、交差している return(true); } return(false); }
abstract public bool HitTest(ShapeCircle other);
override public bool HitTest(ShapeCircle other) { return(other.HitTest(this)); }
/// <summary> /// 形状同士がぶつかっていればtrue /// </summary> /// <param name="rect"></param> /// <param name="circle"></param> /// <returns></returns> public static bool Overlaps(ShapeUnityRect rect, ShapeCircle circle) { return(Overlaps(circle, rect.Rect)); }
/// <summary> /// 形状同士がぶつかっていればtrue /// </summary> /// <param name="anyRect"></param> /// <param name="circle"></param> /// <returns></returns> public static bool Overlaps(ShapeAnyRect anyRect, ShapeCircle circle) { return(Overlaps(circle, anyRect.Vertexes)); }
/// <summary> /// 形状同士がぶつかっていればtrue /// </summary> /// <param name="halfCircle"></param> /// <param name="circle"></param> /// <returns></returns> public static bool Overlaps(ShapeCircle circle, ShapeHalfCircle halfCircle) { return(halfCircle.Overlaps(circle)); }
/// <summary> /// 形状同士がぶつかっていればtrue /// </summary> /// <param name="circle1"></param> /// <param name="circle2"></param> /// <returns></returns> public static bool Overlaps(ShapeCircle circle1, ShapeCircle circle2) { return(CommonFunc.CollisionCircle(circle1.X, circle1.Y, circle1.Radius, circle2.X, circle2.Y, circle2.Radius)); }
/// <summary> /// 円と矩形が交差、又はそれぞれ内包していたらtrue /// </summary> /// <param name="circle"></param> /// <param name="rect"></param> /// <returns> bool </returns> public static bool Overlaps(ShapeCircle circle, Rect rect) { Vector2[] verts = CalcRectVertexs(rect.width, rect.height, rect.position.x, rect.position.y); return(Overlaps(circle, verts)); }