Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Display multiple 2D plots in 3D using Graphics in Mathematica?

Considering the following :

lalist = {{{{1, 1}, 1}, {{3, 3}, 1}, {{5, 5}, 1}},
          {{{1, 5}, 1}, {{3, 3}, 1}, {{5, 1}, 1}}}

enter image description here

Row[{
  Graphics[{
            Opacity[0.5],Red, 
            Disk @@@ lalist[[1]]}, 
            Frame -> True],
  Graphics[{
            Opacity[0.5],Blue, 
            Disk @@@ lalist[[2]]}, 
            Frame -> True]}
    ]

enter image description here

  • Is it possible that I plot the Blues Disks "behind" the red ones in a 3 D plot ?

Below is not what I need :

enter image description here

like image 681
500 Avatar asked Jun 26 '11 21:06

500


3 Answers

Like this?

Graphics3D[{{Texture[
 Graphics[{Opacity[0.5], Blue, Disk @@@ lalist[[2]]}, 
  Frame -> True]], 
 Polygon[{{-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}}, 
 VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
    1}}]}, {Texture[
 Graphics[{Opacity[0.5], Red, Disk @@@ lalist[[1]]}, 
  Frame -> True]], 
Polygon[{{-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1}}, 
 VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
    1}}]}}, Lighting \[Rule] "Neutral"]

enter image description here

Lots of them with opacity .2:

tab = Table[{Opacity \[Rule] .2, 
Texture[Graphics[{Opacity[0.5], Blue, Disk @@@ lalist[[2]]}, 
  Frame -> True]], 
Polygon[{{-1, -1, z}, {1, -1, z}, {1, 1, z}, {-1, 1, z}}, 
 VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
    1}}]}, {z, -2, 2, 1}];
plt = Graphics3D[{tab}, Lighting \[Rule] "Neutral"]

enter image description here

and 400 don't seem to be much of a problem in terms of speed (you can easily modify the code above to see it).

EDIT: OK, just to be silly, try this

Dynamic[Graphics3D[{{Texture[#], 
  Polygon[{{-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}}, 
   VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
      1}}]}, {Texture[Rotate[#, \[Pi]/2]], 
  Polygon[{{-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1}}, 
   VertexTextureCoordinates \[Rule] {{0, 0}, {1, 0}, {1, 1}, {0, 
      1}}]}}, Lighting \[Rule] "Neutral"] &@Binarize[CurrentImage[]]]

which gives

enter image description here

(or something like that), rotatable, updated in real time etc.

like image 66
acl Avatar answered Oct 09 '22 00:10

acl


See the solution presented on "Lunchtime Playground: Fun with Mathematica" here: http://mathgis.blogspot.com/2009/02/howto-display-2d-plot-in-3d.html

like image 21
Eli Lansey Avatar answered Oct 08 '22 23:10

Eli Lansey


Using transparent textures to render these circles in layers as ACL does is a nice solution, unless one wants to interact with the resulting 3D object. Rendering of 3D objects that contain transparent elements is done in software whereas otherwise it would have been done in hardware:

The 3D renderer uses two different methods of sorting polygons. For graphics scenes that include no transparency, a hardware-accelerated depth buffer is used. Otherwise, the renderer uses a binary space partition tree to split and sort polygons from any viewpoint. The BSP tree is slower to create and is not hardware accelerated, but it provides the most general ability to support polygons.

On my laptop, interaction with 3D graphics is incredibly slow as soon as transparent objects start to appear.

The solution would be to use 3D disks instead of semi transparent planes with 2D disks in them. Since MMA doesn't have 3D Disks or Circles if you want to do something like that, you have to roll your own. A bare-bones version would be something like:

myDisk[{x_, y_, z_}, r_] := 
 Polygon@Table[
               {x, y, z} + r {Cos[\[Phi]], Sin[\[Phi]], 0} // N,
               {\[Phi], 0, 2 \[Pi], 2 \[Pi]/200}
              ]

Your layers would then be generated as follows:

Graphics3D[
 {
   EdgeForm[],
  {
   Red, 
   myDisk[{1, 1, 0.5}, 0.5],  
   myDisk[{0, 0, 0.5}, 0.5],   
   myDisk[{-1, -1, 0.5}, 0.5]
  },
  {
   Blue,  
   myDisk[{1, -1, -0.5}, 0.5],
   myDisk[{0, 0, -0.5}, -0.5], 
   myDisk[{-1, 1, -0.5}, 0.5]}
  }
 ]

enter image description here

like image 38
Sjoerd C. de Vries Avatar answered Oct 09 '22 00:10

Sjoerd C. de Vries