13
$\begingroup$

I have an external data file (can be downloaded here: link 1 or link 2) which contains a dense grid of initial condition in the (x,y,z) space. I read it with Mathematica and plot these initial conditions with different colors according to some specific properties

m = Import["data_3d.out", "Table"];

getColor[m_List, i_Integer] := 
Module[{s = m[[i, 6]]}, 
Which[s == 0, Black, s == 1, Red, s == 2, Darker[Green], s == 3, 
Brown, s == 4, Blue, s == 5, Orange, s == 6, Cyan, s == 7, 
Magenta, s == 8, Yellow, True, White]];

data = Table[{PointSize[0.004], getColor[m, i], 
Point[{m[[i, 1]], m[[i, 2]], m[[i, 3]]}]}, {i, 1, Length[m]}];

P0 = Graphics3D[data, Axes -> True, BoxRatios -> {1, 1, 1}, 
PlotRange -> 6, ImageSize -> 550]

and here is the output

enter image description here

We observe, that several color patterns appear but we can see only the surface of the three-dimensional grid. So, the question:

Is there a way to penetrate inside the 3d surface and visualize how these color patterns are? Any suggestions?

Please, us the original data file for testing. I think, generating simpler but random 3d grids in this case, could be very illusive since all the story is about the color patterns that appear and obviously cannot be replicated randomly.

EDIT

A second working link for retrieving the data file is added.

$\endgroup$
7
  • 1
    $\begingroup$ Mediafire isn't a good choice for sharing info. Anyway, your request about using your datafile doesn't sound right. Since you're asking for " a way to penetrate inside the 3d surface", any 3D point set will do as an example $\endgroup$ Nov 14, 2013 at 13:10
  • $\begingroup$ @belisarius But any 3D point set does not have the properties of my datafile. The purpose is to find a way to visualize the color patterns inside the surface however these patterns are not random! $\endgroup$
    – Vaggelis_Z
    Nov 14, 2013 at 13:15
  • $\begingroup$ @belisarius Any particular reason why Mediafire is not a good choice?! So far, no problems encountered. $\endgroup$
    – Vaggelis_Z
    Nov 14, 2013 at 13:16
  • 1
    $\begingroup$ i.stack.imgur.com/p0adW.png $\endgroup$ Nov 14, 2013 at 13:20
  • $\begingroup$ @belisarius Oops! Probably maintenance ... Any alternatives? Does StackExchange have its own repository for files? $\endgroup$
    – Vaggelis_Z
    Nov 14, 2013 at 13:24

3 Answers 3

17
$\begingroup$

A tomographic approach:

m = Import["http://www.datafilehost.com/get.php?file=3c69e895", "Data"];

getColor[s_List] := 
  Replace[s, {0 -> Black, 1 -> Red, 2 -> Darker[Green], 3 -> Brown, 
    4 -> Blue, 5 -> Orange, 6 -> Cyan, 7 -> Magenta, 
    8 -> Yellow, _ -> White}, 1];

nfx = Nearest[m[[All, 1]] -> m];

Manipulate[
 Graphics3D[{PointSize[0.004], 
   Point[#[[All, 1 ;; 3]], VertexColors -> getColor[#[[All, 6]]]] &@ nfx[x0]},
  Axes -> True, BoxRatios -> {1, 1, 1}, PlotRange -> 6, ImageSize -> 350],
 {x0, Min[m[[All, 1]]], Max[m[[All, 1]]]}
 ]

Manipulate output

Other ways of slicing:

nfy = Nearest[m[[All, 2]] -> m];
nfz = Nearest[m[[All, 3]] -> m];

In response to a comment, here is a static approach:

xlist = Range[0, 5, 1]

Graphics3D[{PointSize[0.004], 
  Point[#[[All, 1 ;; 3]], VertexColors -> getColor[#[[All, 6]]]] &@
   Flatten[nfx /@ xlist, 1]}, Axes -> True, BoxRatios -> {1, 1, 1}, 
 PlotRange -> 6, ImageSize -> 350]

(* {0, 1, 2, 3, 4, 5} *)

Mathematica graphics

$\endgroup$
2
  • $\begingroup$ Amazing!!! Is it possible to include inside the 3d space several slices, let's say for x = {0,1,2,3,4,5}? No manipulation, just a static graphic for several slices. $\endgroup$
    – Vaggelis_Z
    Nov 15, 2013 at 7:30
  • $\begingroup$ Many many thanks! $\endgroup$
    – Vaggelis_Z
    Nov 15, 2013 at 12:40
11
$\begingroup$

One easy, although not beautiful way relies on the properties of 3D graphics. When you look how the simulated camera works, then you see that only the volume between near- and farplane is rendered. If you put your near plane in the distance, everything which is too close is cut.

In Mathematica this can be be adjusted using the ViewRange option of Graphics3D. Here is a small example:

data = ExampleData[{"Geometry3D", "Triceratops"}, "VertexData"];
With[{gr = 
   Graphics3D[{{Hue[#3], Sphere[{##}, .2]} & @@@ data}, 
    SphericalRegion -> True]},
 Manipulate[
  Show[gr, ViewPoint -> {0, -1, .5}, 
   ViewRange -> {nearPlane, farPlane}],
  {nearPlane, 4, 10},
  {{farPlane, 15}, 5, 15}
  ]
 ]

Full graphics

Mathematica graphics

Cut graphics

Mathematica graphics

$\endgroup$
5
  • $\begingroup$ Poor decapitated Triceratops! Well, apparently your 3d surface is haul inside, while mine is not! $\endgroup$
    – Vaggelis_Z
    Nov 14, 2013 at 15:25
  • $\begingroup$ Why don't you give a shot using my data? (use the second link) $\endgroup$
    – Vaggelis_Z
    Nov 14, 2013 at 15:31
  • 1
    $\begingroup$ No animal were harmed in the making of this answer $\endgroup$ Nov 14, 2013 at 15:37
  • $\begingroup$ @belisarius Hey, leave me out of this, ok? $\endgroup$
    – rm -rf
    Nov 14, 2013 at 15:53
  • 1
    $\begingroup$ @rm-rf A decapitated frog? That's quite an idea $\endgroup$ Nov 14, 2013 at 16:48
8
$\begingroup$

There are couple other ways to visualize 3D images, one of which is new in V10. (Note: The links to the original data are no longer valid.)

The new features, ClipPlanes and IntervalSlider, are useful here. Something like this was demonstrated at WTC 2014.

knee = Raster3D[
   RawArray["Byte", 
    ImageData[ExampleData[{"TestImage3D", "MRknee"}], "Byte"]],
    {{-1, 1, 1}, {1, -1, -1}}, {0, 255}, 
   ColorFunction -> "GrayLevelOpacity"];

Manipulate[
 Graphics3D[knee, 
  ClipPlanes -> {{0, 1, 0, -y[[1]]}, {0, -1, 0, y[[2]]}}, 
  Axes -> True],
 {{y, {-1, 1}}, -1, 1, IntervalSlider}]

Mathematica graphics

ClipRange was introduce in V9 for 3D images.

Image3D[ExampleData[{"TestImage3D", "MRknee"}], ClipRange -> {All, {0, 60}, All}]

Mathematica graphics

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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