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));
        }
示例#2
0
        /// <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);
        }
示例#3
0
        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);
        }
示例#5
0
    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);
    }
示例#6
0
    // 円との当たり判定
    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);
    }
示例#7
0
        /// <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);
        }
示例#8
0
 abstract public bool HitTest(ShapeCircle other);
示例#9
0
 override public bool HitTest(ShapeCircle other)
 {
     return(other.HitTest(this));
 }
示例#10
0
 /// <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));
 }
示例#11
0
 /// <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));
 }
示例#12
0
 /// <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));
 }
示例#13
0
 /// <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));
 }
示例#14
0
 /// <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));
 }