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)); }
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); }
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); }