Ejemplo n.º 1
0
    private bool CheckCubeAndCube(HitableCube a, HitableCube b)
    {
        if (a.Right >= b.Left && a.Left <= b.Right)
        {
            if (a.Bottom <= b.Top && a.Top >= b.Bottom)
            {
                return(true);
            }
        }

        return(false);
    }
Ejemplo n.º 2
0
    private void InnerCheckCubes(HitableCube cube, Quadtree quadtree)
    {
        if (quadtree == null)
        {
            return;
        }

        foreach (var hitable in quadtree.Hitables)
        {
            // CheckCollision
        }

        InnerCheckCubes(cube, quadtree.LeftTop);
        InnerCheckCubes(cube, quadtree.RightTop);
        InnerCheckCubes(cube, quadtree.LeftBottom);
        InnerCheckCubes(cube, quadtree.RightBottom);
    }
Ejemplo n.º 3
0
 private bool CheckCapsuleAndCube(HitableCapsule capsule, HitableCube cube)
 {
     return(false);
 }
Ejemplo n.º 4
0
    private bool CheckSphereAndCube(HitableSphere sphere, HitableCube cube)
    {
        // 圆心在长方形很外面
        if ((sphere.Point.x < cube.Left - sphere.Radius) ||
            (sphere.Point.x > cube.Right + sphere.Radius) ||
            (sphere.Point.y > cube.Top + sphere.Radius) ||
            (sphere.Point.y < cube.Bottom - sphere.Radius)
            )
        {
            return(false);
        }


        var result     = true;
        var radiusSqrt = sphere.Radius * sphere.Radius;

        if (sphere.Point.x < cube.Left)
        {
            // 左上角
            if (sphere.Point.y > cube.Top)
            {
                var deltaX  = sphere.Point.x - cube.Left;
                var deltaY  = sphere.Point.y - cube.Top;
                var disSqrt = deltaX * deltaX + deltaY * deltaY;
                if (radiusSqrt < disSqrt)
                {
                    result = false;
                }
            }

            // 左下角
            else if (sphere.Point.y < cube.Bottom)
            {
                var deltaX  = sphere.Point.x - cube.Left;
                var deltaY  = sphere.Point.y - cube.Bottom;
                var disSqrt = deltaX * deltaX + deltaY * deltaY;
                if (radiusSqrt < disSqrt)
                {
                    result = false;
                }
            }
        }
        else if (sphere.Point.x > cube.Right)
        {
            // 右上角
            if (sphere.Point.y > cube.Top)
            {
                var deltaX  = sphere.Point.x - cube.Right;
                var deltaY  = sphere.Point.y - cube.Top;
                var disSqrt = deltaX * deltaX + deltaY * deltaY;
                if (radiusSqrt < disSqrt)
                {
                    result = false;
                }
            }

            // 右下角
            else if (sphere.Point.y < cube.Bottom)
            {
                var deltaX  = sphere.Point.x - cube.Right;
                var deltaY  = sphere.Point.y - cube.Bottom;
                var disSqrt = deltaX * deltaX + deltaY * deltaY;
                if (radiusSqrt < disSqrt)
                {
                    result = false;
                }
            }
        }

        return(result);
    }