[Math] Minimal distance to a cube in 2D and 3D from a point lying outside

geometryoptimization

This is kind of a geometrical question. For my program I want to compute the minimal distance $r$ from a given point to the cube. Here is a drawing which shows what I mean:

enter image description here

I have two vectors $\vec{p}$ and $\vec{q}$ which indicate the position of my two points. Point $p$ can be anywhere outside the cube. Point $q$ is exactly in the middle of the cube. The distance from point $q$ to the cubes surface is always $d$. I can easily compute $R$ which is the distance from point $q$ to point $p$. But what I need is the minimal distance $r$ from point $p$ to the cube. I am sure that I have to distinguish several cases depending on where point $p$ is located. I think there are three cases:

1) The minimal distance $r$ from point $p$ is to the edge of the cube (as drawn in the picture)

2) The minimal distance $r$ from point $p$ is to the corner of the cube

3) The minimal distance $r$ from point $p$ is to the surface of the cube

After hours of trying to find a nice solution I hope someone can give me a hint.

Best Answer

For an axis aligned cube, there are nice tricks. Consider, for example, the axis aligned cube with corners $(\pm 1,\pm 1,\pm 1)$ (after a scaling and a shift, everything reduces to this case).

For a point $(x,y,z)$:

  • If $|x|\leq 1$, $|y|\leq 1$ and $|z|>1$, then the distance is $|z|-1$ (the face is closest).

  • If $|x|\leq 1$, $|y|>1$, and $|z|>1$, then the distance is $\sqrt{(|y|-1)^2+(|z|-1)^2}$ (the edge is closest).

  • If $|x|>1$, $|y|>1$, and $|z|>1$, then the distance is $\sqrt{(|x|-1)^2+(|y|-1)^2+(|z|-1)^2}$ (the vertex is closest).

All other cases are similar. To visualize what is going on, draw a square, but extend the edges into (infinite) lines. This breaks up the space outside the box into $8$ regions, all points in each region are closest to the same edge or point. Now, doing the same thing in three dimensions results in $26$ regions and you need to figure out which region you're in.

Pseudocode:

 if |x|<=1
 {
      if |y|<=1
           d=|z|-1
      else
      {
           if |z|<=1
                 d=|y|-1
           else
                 d=sqrt((|y|-1)^2+(|z|-1)^2)
      }
 }
 else
 {
      if |y|<=1
      {
           if |z|<=1
                d=|x|-1
           else
                d=sqrt((|x|-1)^2+(|z|-1)^2)
      }
      else
           if |z|<=1
                d=sqrt((|x|-1)^2+(|y|-1)^2)
           else
                d=sqrt((|x|-1)^2+(|y|-1)^2+(|z|-1)^2)
      }
 }

Also as @YvesDaoust mentions in the comments, this can be rewritten as $$ \sqrt{\max\{0,|x|-1\}^2+\max\{0,|y|-1\}^2+\max\{0,|z|-1\}^2} $$ although, after unpacking the maximums, you get, essentially, the series of inequalities above.