예제 #1
0
    private bool CheckSphereAndSphere(HitableSphere sphereA, HitableSphere sphereB)
    {
        var deltaX  = sphereA.Point.x - sphereB.Point.x;
        var deltaY  = sphereA.Point.y - sphereB.Point.y;
        var disSqrt = deltaX * deltaX + deltaY * deltaY;

        var radiusSum = sphereA.Radius + sphereB.Radius;

        return(disSqrt <= (radiusSum * radiusSum));
    }
예제 #2
0
    private bool CheckCapsuleAndSphere(HitableCapsule capsule, HitableSphere sphere)
    {
        var dx = sphere.Point.x - capsule.Point.x;
        var dy = sphere.Point.y - capsule.Point.y;
        var t  = (capsule.Vec.x * dx + capsule.Vec.y * dy) /
                 (capsule.Vec.x * capsule.Vec.x + capsule.Vec.y * capsule.Vec.y);

        t = Mathf.Clamp01(t);

        var mx = capsule.Vec.x * t + capsule.Point.x;
        var my = capsule.Vec.y * t + capsule.Point.y;

        var disSqrt = (mx - sphere.Point.x) * (mx - sphere.Point.x) +
                      (my - sphere.Point.y) * (my - sphere.Point.y);

        var radiusSum = capsule.Radius + sphere.Radius;

        if (disSqrt <= radiusSum * radiusSum)
        {
            return(true);
        }

        return(false);
    }
예제 #3
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);
    }