4
$\begingroup$

also I guess that the topic was tackled in Combining Image3D and Graphics3D. My question is quite similar: How do I match the coordinate Systems of Graphics3D and Image3D?

Here some code:

z = 1;
p = RandomInteger[100, {z, 3}];
r = RandomInteger[10, {z}];
spheres = MapThread[RotateLeft[DiskMatrix[#1, {100, 100, 100}], #2] &, {r, p}];
i = Image3D[Plus @@ spheres, Axes -> True, AxesLabel -> {"x", "y", "z"}]
obj = GraphicsComplex[p, Sphere[Range[z], r]];
gr = Graphics3D[obj,
                Axes -> True,
                AxesLabel -> {"x", "y", "z"},
                PlotRange -> {{0, 100}, {0, 100}, {0, 100}}]
Show[i, gr, Axes -> True]

Can anyone explain to me how to match the coordinate systems, that the spheres match?

Thanks in advance!

$\endgroup$
3
  • $\begingroup$ seems related to this mathematica.stackexchange.com/questions/23766/… $\endgroup$ Sep 26, 2013 at 15:55
  • $\begingroup$ @xslittlegrass: yes, i know. but i cant solve it with that. $\endgroup$
    – Bimmel
    Sep 26, 2013 at 16:00
  • $\begingroup$ i guess you need to elaborate on whats different. Looks like a duplicate question. $\endgroup$
    – george2079
    Sep 26, 2013 at 16:41

3 Answers 3

6
$\begingroup$

Firstly, you need to apply {50,50,50} shift to DiskMatrix. It is because DiskMatrix produces sphere with the center at {50,50,50}.

Image3D has different axes directions than Graphics3D so you need to search through numerous variants of transpositions and reflections. I found the following combination:

z = 10;
p = RandomInteger[100, {z, 3}];
r = RandomInteger[10, {z}];

spheres = 
  MapThread[
   Transpose[#, {3, 2, 1}] &@Reverse@RotateLeft[
       DiskMatrix[#1, {100, 100, 100}], #2 - {50, 50, 50}] &, {r, p}];
i = Image3D[Plus @@ spheres, Axes -> True, 
   AxesLabel -> {"x", "y", "z"}];
obj = GraphicsComplex[p, Sphere[Range[z], r]];
gr = Graphics3D[obj, Axes -> True, AxesLabel -> {"x", "y", "z"}, 
   PlotRange -> {{0, 100}, {0, 100}, {0, 100}}];
Show[i, gr, Axes -> True]

enter image description here

$\endgroup$
1
  • $\begingroup$ +1 Much nicer way to do the geometric transformations than what I proposed with GeometricTransformation. $\endgroup$ Sep 26, 2013 at 17:35
1
$\begingroup$

This still may be considered a duplicate, but it's also possible that there is something odd happening with the formation of spheres. A set of geometric transformations (rotations, reflections and finally a scaling) gives close to overlap. Note I got rid of the randomness to make this problem a bit easier to navigate and did not nest the GeometricTransformations so that each one could be visualized if desired.

z = 5;
p = {{50, 50, 50}, {10, 10, 10}, {90, 90, 10}, {90, 10, 90}, {10, 90, 
    90}};
r = {2, 4, 6, 8, 10};
spheres = 
  MapThread[RotateLeft[DiskMatrix[#1, {100, 100, 100}], #2] &, {r, p}];
i = Image3D[Plus @@ spheres, Axes -> True, 
   AxesLabel -> {"x", "y", "z"}];
obj = GraphicsComplex[p, Sphere[Range[z], r]];
gr = Graphics3D[obj, Axes -> True, AxesLabel -> {"x", "y", "z"}, 
   PlotRange -> {{0, 100}, {0, 100}, {0, 100}}];
objreflected = 
  GeometricTransformation[obj, 
   ReflectionTransform[{0, 0, 1}, {50, 50, 50}]];
objrotated = GeometricTransformation[
   GeometricTransformation[objreflected, 
    RotationTransform[180 Degree, {1, 0, 0}, {50, 50, 50}]],
   RotationTransform[100 Degree, {0, 1, 0}, {50, 50, 50}]];
objscaled = 
  GeometricTransformation[objrotated, 
   ScalingTransform[{0.4, 0.4, 0.4}, {50, 50, 50}]];
Show[i, Graphics3D@objscaled]

Mathematica graphics

Why the central sphere gets blown up in the image3d portion of the graphic is beyond me.

$\endgroup$
1
$\begingroup$

This may not answer your question.

I don't quite understand how you built the Image3D object. I notice that the sphere doesn't seem to go where you put the points. For example, if I put the point right in the middle of the coordinate system, they end up out at the corners

p = {{50, 50, 50}};
r = {10};
spheres = 
  MapThread[RotateLeft[DiskMatrix[#1, {100, 100, 100}], #2] &, {r, p}];
i = Image3D[Plus @@ spheres, Axes -> True, 
   AxesLabel -> {"x", "y", "z"}, ImageSize -> 300];
obj = GraphicsComplex[p, Sphere[Range[z], r]];
gr = Graphics3D[obj, Axes -> True, AxesLabel -> {"x", "y", "z"}, 
   PlotRange -> {{0, 100}, {0, 100}, {0, 100}}, ImageSize -> 300];
Grid[{{i, 
   gr}, {Show[i, gr, Axes -> True, ImageSize -> 300, 
    AxesLabel -> {"x", "y", "z"}], SpanFromLeft}}]

enter image description here

So if I try to recreate what I think you are going for, I do the following

p1 = N[p[[1]]];
r1 = N[r[[1]]];
table = Table[
   If[EuclideanDistance[{x, y, z}, p1] <= r1, 1, 0], {z, 100}, {y, 
    100}, {x, 100}];
i2 = Image3D[table, Axes -> True, AxesLabel -> {"x", "y", "z"}]

enter image description here

Looks good, but if you try to use a less symmetric point as the center of the sphere, it gets all wonky (that's a technical term).

p1 = {10.0, 20.0, 30.0};
r1 = N[r[[1]]];
table = Table[
   If[EuclideanDistance[{x, y, z}, p1] <= r1, 1, 0], {z, 100}, {y, 
    100}, {x, 100}];

i2 = Image3D[table, Axes -> True, AxesLabel -> {"x", "y", "z"}]

enter image description here

I don't understand why, but the only way I can get Image3D to work is to apply Reverse to two of the axes. The following works:

z = 1;
p = RandomInteger[100, {z, 3}];
r = RandomInteger[10, {z}];
i = Module[{p1, r1, table},
   p1 = N[p[[1]]];
   r1 = N[r[[1]]];
   table = 
    Table[If[EuclideanDistance[{x, y, z}, p1] <= r1, 1, 0], {z, 
      100}, {y, 100}, {x, 100}];
   Image3D[Reverse[table, {1, 2}], Axes -> True, 
    AxesLabel -> {"x", "y", "z"}]];
obj = GraphicsComplex[p, Sphere[Range[z], r]];
gr = Graphics3D[obj, Axes -> True, AxesLabel -> {"x", "y", "z"}, 
   PlotRange -> {{0, 100}, {0, 100}, {0, 100}}];
Show[i, gr, Axes -> True]

enter image description here

To me, Image3D is too buggy to use. Half the time I try to do something with it, it crashes my kernel. I want there to be a cool ListDensityPlot3D function, but I'll have to wait I think.

$\endgroup$

Your Answer

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

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