1
\$\begingroup\$

I have a sphere with values center,radius and I need to convert the sphere to a bounding box with values min,max.

How do I convert a sphere into a bounding box?

\$\endgroup\$
  • \$\begingroup\$ Downvoter, please can you explain \$\endgroup\$ – user116458 Jun 12 '18 at 10:41
  • 2
    \$\begingroup\$ Doesn't seem very useful to me. \$\endgroup\$ – Tyyppi_77 Jun 12 '18 at 10:43
  • \$\begingroup\$ @Tyyppi_77 I found it hard at first and when I found out I wanted to share my knowlege with someone else \$\endgroup\$ – user116458 Jun 12 '18 at 10:49
  • 2
    \$\begingroup\$ @TheMaskedRebel Upvoted for you:), people should appreciate even small things.. \$\endgroup\$ – isammour Jun 12 '18 at 11:12
3
\$\begingroup\$

Calculating the bounding box of a sphere is pretty trivial given the simplicity of sphere geometry.

Let's assume we have the radius of the sphere defined as a scalar (float or integer) value \$r\$, and the centre of the sphere defined as a vector \$\overrightarrow c\$ like this:

$$ \overrightarrow c = \begin{pmatrix}x \\ y \\ z\end{pmatrix} $$

We can calculate the outer bound coordinate vectors \$\overrightarrow{min}\$ and \$\overrightarrow{max}\$ by doing the following:

$$ \begin{align} \overrightarrow{min} &= \begin{pmatrix} c_x - r \\ c_y - r \\ c_z - r \end{pmatrix} \\ \\ \overrightarrow{max} &= \begin{pmatrix} c_x + r \\ c_y + r \\ c_z + r \end{pmatrix} \end{align} $$

In code, that means:

// given
Vector3 center = new Vector3(10, 20, 30);
int radius = 5;

// then
Vector3 boundingBoxMin = new Vector3(
    center.x - radius,
    center.y - radius,
    center.z - radius
);
Vector3 boundingBoxMax = new Vector3(
    center.x + radius,
    center.y + radius,
    center.z + radius
);

If we'd prefer, another way to calculate this same thing is to define a vector \$\overrightarrow {r_{offset}}\$ for doing that addition, which simply represents the offset from the center to a corner of the bounding box:

$$ \text{given} \; \overrightarrow c = \begin{pmatrix}x \\ y \\ z\end{pmatrix} \; \text{and} \; \overrightarrow {r_{offset}} = \begin{pmatrix} r \\ r \\ r \end{pmatrix}, \\ \begin{align} \overrightarrow {min} &= \overrightarrow c - \overrightarrow {r_{offset}} \\ \overrightarrow {max} &= \overrightarrow c + \overrightarrow {r_{offset}} \end{align} $$

// given
Vector3 center = new Vector3(10, 20, 30);
int radius = 5;
Vector3 radiusOffset = new Vector3(radius, radius, radius);

// then
Vector3 boundingBoxMin = center - radiusOffset;
Vector3 boundingBoxMax = center + radiusOffset;

Handling the 2D case

For the 2D case, calculating the rectangular bounding box of a circle, we omit the Z values like normal: \$\overrightarrow c\$, \$\overrightarrow{r_{offset}}\$ (if you're using that), \$\overrightarrow{max}\$, and \$\overrightarrow{min}\$ will just be 2D vectors and we'll just do only the x and y calculations.

Diagram!

The following diagram of the 2D scenario might help visualise what's going on here:

enter image description here


One's first instinct might be to calculate a hypotenuse using the Pythagorean theorem (\$\sqrt{x^2 + y^2}\$) and use that as the magnitude of a vector \$\vec h\$, but that's more computationally expensive than necessary: \$\overrightarrow{r_{offset}}\$ will give us the same result.

\$\endgroup\$
0
\$\begingroup\$

Here is something that helped me.

min = (center.x - radius,center.y - radius,center.z - radius); max = (center.x + radius,center.y + radius,center.z + radius)

Hope it helps someone else.

\$\endgroup\$
  • \$\begingroup\$ What does vector - scalar mean? \$\endgroup\$ – Tyyppi_77 Jun 12 '18 at 10:43
  • \$\begingroup\$ @Tyyppi_77 Sorry for the confusion. I edited the post \$\endgroup\$ – user116458 Jun 12 '18 at 10:49
  • \$\begingroup\$ You box is contained within the sphere. If you want the bounding box that contains the sphere you need to multiply your radius by 1 / .707 or basically use Pythagoras theorem to get the correct sized bounding box. Hope that helps. Sin of 45 degrees basically. \$\endgroup\$ – ErnieDingo Jun 12 '18 at 11:19
  • \$\begingroup\$ @ErnieDingo so I create a variable which contains 1 / .7071 and then multiply it by the radius before performing the code above \$\endgroup\$ – user116458 Jun 12 '18 at 11:25
  • 1
    \$\begingroup\$ first point: center - (radius, radius, radius) * sqrt(1/3), last point: center + (radius, radius, radius) * sqrt(1/3). \$\endgroup\$ – Luis Masuelli Jun 12 '18 at 14:35

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.