2
$\begingroup$


    Four Cuboids
I have a number of cuboids intersecting as illustrated. I would like to see their intersection, almost the view from inside. Setting the ViewPoint to {0,0,0} does not reveal much of the structure. Is there some way to visualize this with clever Graphics[] options, or must I compute the convex polyhedron that is the intersection of the cuboids (which is really what I want to see)?

Solved by Jens:
Cuboids4

$\endgroup$
3
$\begingroup$

It can in principle be done using RegionPlot3D. But to get sharp edges, one needs to crank up the number of PlotPoints. Here is an example with four cubes that doesn't take too long to plot:

n = 4;

insideCube[pt_, l_] := And @@ Thread[Abs[pt] < l]

rotations = 
 MapThread[
  RotationMatrix[{{0, 0, 1}, {Cos[#1] Sin[#2], Sin[#1] Sin[#2], 
      Cos[#2]}}] &, RandomReal[{0, Pi}, {2, 4}]]

(*
==> {{{0.701529, 0.148251, -0.69705}, {0.148251, 0.926364, 
   0.346226}, {0.69705, -0.346226, 0.627892}}, {{0.989833, 
   0.065586, -0.12621}, {0.065586, 0.576913, 
   0.814168}, {0.12621, -0.814168, 0.566746}}, {{0.999495, -0.0316019,
    0.00319107}, {-0.0316019, -0.979314, 
   0.199866}, {-0.00319107, -0.199866, -0.979818}}, {{0.18502, 
   0.225404, -0.956536}, {0.225404, 0.937659, 
   0.264555}, {0.956536, -0.264555, 0.122679}}}
*)

rotatedCubes = 
 Or @@ MapThread[
   insideCube[#1.{x, y, z}, #2] &, {rotations, 
    RandomReal[{1, 1.1}, n]}]

(*
==> (Abs[0.701529 x + 0.148251 y - 0.69705 z] < 1.02814 && 
   Abs[0.148251 x + 0.926364 y + 0.346226 z] < 1.02814 && 
   Abs[0.69705 x - 0.346226 y + 0.627892 z] < 
    1.02814) || (Abs[0.989833 x + 0.065586 y - 0.12621 z] < 1.04828 &&
    Abs[0.065586 x + 0.576913 y + 0.814168 z] < 1.04828 && 
   Abs[0.12621 x - 0.814168 y + 0.566746 z] < 
    1.04828) || (Abs[0.999495 x - 0.0316019 y + 0.00319107 z] < 
    1.0917 && Abs[-0.0316019 x - 0.979314 y + 0.199866 z] < 1.0917 && 
   Abs[-0.00319107 x - 0.199866 y - 0.979818 z] < 
    1.0917) || (Abs[0.18502 x + 0.225404 y - 0.956536 z] < 1.02296 && 
   Abs[0.225404 x + 0.937659 y + 0.264555 z] < 1.02296 && 
   Abs[0.956536 x - 0.264555 y + 0.122679 z] < 1.02296)
*)

RegionPlot3D[rotatedCubes, {x, -2, 2}, {y, -2, 2}, {z, -2, 
  2}, PlotPoints -> 120, Mesh -> False]

cubes

To cut through the shape and see the inside, you'd have to add another condition to RegionPlot3D or you can restrict the PlotRange as in this example:

Show[%, PlotRange -> {{-1.5, 1.5}, {-1.5, 1.5}, {-1.5, 0}}]

cut plot

$\endgroup$
  • 1
    $\begingroup$ To plot "the convex polyhedron that is the intersection of the cuboids", you should define rotatedCubes as the And of all of them, no? $\endgroup$ – Rahul Jul 4 '13 at 0:45
  • $\begingroup$ @RahulNarain Yes, but I looked at the picture in the question and drew my conclusions from that! $\endgroup$ – Jens Jul 4 '13 at 2:17
  • $\begingroup$ Thanks, Jens! I learned a lot from your solution! $\endgroup$ – Joseph O'Rourke Jul 4 '13 at 13:09

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.