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); }
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); }
private bool CheckCapsuleAndCube(HitableCapsule capsule, HitableCube cube) { return(false); }
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); }