# Problems with Translation

Posted 8 years ago
4467 Views
|
3 Replies
|
0 Total Likes
|
 For a class project, I am trying to make a 3D object which includes a fleet of ships heading toward an island. I was planning to make one ship and translate it to many locations. However I've run into a dilemma. The method I am using to show the translation of the copied ship object has run into a snag and I'm wondering what I'm doing wrong. This is what I used without including the translation:  K1 = ParametricPlot3D[{(1 - 2 b) (7 + Cos[b]) Cos[ 8 Pi*a], (1 - a) (3 + Cos[4 b]) Sin[8*Pi*a], 4 a + (1 - a) Cos[12*Pi*b]}, {a, -1, 1}, {b, -1, 1}, PlotStyle -> Directive[Brown], MeshStyle -> {{Black, Thickness[0.001]}, {Black, Thickness[0.001]}}, Axes -> False, Boxed -> False]; K2 = {Blue, Polygon[{{-50, 50, -3}, {50, 50, -3}, {50, -50, -3}, {-50, -50, -3}}]}; K3 = {Black, Cylinder[{{15, 0, 0}, {15, 0, 15}}, .75]}; K4 = {Black, Cylinder[{{-15, 0, 0}, {-15, 0, 15}}, .75]}; K5 = {Black, Cylinder[{{0, 0, 0}, {0, 0, 30}}, .75]}; Show[{Graphics3D[{K2, K3, K4, K5}], K1}] This is what I used with the translation added:  K1 = ParametricPlot3D[{(1 - 2 b) (7 + Cos[b]) Cos[ 8 Pi*a], (1 - a) (3 + Cos[4 b]) Sin[8*Pi*a], 4 a + (1 - a) Cos[12*Pi*b]}, {a, -1, 1}, {b, -1, 1}, PlotStyle -> Directive[Brown], MeshStyle -> {{Black, Thickness[0.001]}, {Black, Thickness[0.001]}}, Axes -> False, Boxed -> False]; K2 = {Blue, Polygon[{{-50, 50, -3}, {50, 50, -3}, {50, -50, -3}, {-50, -50, -3}}]}; K3 = {Black, Cylinder[{{15, 0, 0}, {15, 0, 15}}, .75]}; K4 = {Black, Cylinder[{{-15, 0, 0}, {-15, 0, 15}}, .75]}; K5 = {Black, Cylinder[{{0, 0, 0}, {0, 0, 30}}, .75]}; Show[{Graphics3D[{K2, K3, K4, K5}], K1, Translate[{Graphics3D[{K2, K3, K4, K5}], K1}, {50, 0, 0}]}] If anyone could add any clarification as to what I'm doing wrong, that would be greatly appreciated.
3 Replies
Sort By:
Posted 8 years ago
 (I posted twice the answer, sorry.)
Posted 8 years ago
 Hi Michael,In case one of your graphics primitive is defined with more than two options, such as for instance K2 = {Blue, EdgeForm[], Polygon[{{-50, 50, -3}, {50, 50, -3}, {50, -50, -3}, {-50, -50, -3}}]}; (I added EdgeForm[] compared to your definition of K2  this removes the black edge of the sea), the code Graphics3D[Map[ {First[#], Translate[Last[#], {50, 0, 0}]} &, {K2, K3, K4, K5}] will not propagate the EdgeForm[] option. (EdgeForm[] is the second element of the list K2, and only its first and last element are considered.) In such a situation you can use directly Graphics3D[Translate[{K2}, {50, 0, 0}]] This way the graphics primitive is translated along with all its options. Using part of Craig's code, the alternative final code would read Show[{Graphics3D[{K2, K3, K4, K5}], K1, Graphics3D[Translate[{K2, K3, K4, K5}, {50, 0, 0}]], K1 /. GraphicsComplex[points_, a__] :> GraphicsComplex[Map[# + {50, 0, 0} &, points], a]}] which can be shorten into Show[{Graphics3D[{K2, K3, K4, K5, Translate[{K2, K3, K4, K5}, {50, 0, 0}]}], K1, K1 /. GraphicsComplex[points_, a__] :> GraphicsComplex[Map[# + {50, 0, 0} &, points], a]}] Cheers, Xavier
Posted 8 years ago
 Hello MIchael, You can Translate something that is not a graphics primitive. But, there is a way around this:Here, I use Map to only translate your primitives. Because your K1 is a GraphicsComplex, we can grab the points and then translate them the old-fashioned way: Show[ {Graphics3D[{K2, K3, K4, K5}], K1, Graphics3D[Map[ {First[#], Translate[Last[#], {50, 0, 0}]} &, {K2, K3, K4, K5}] ], K1 /. GraphicsComplex[points_, a__] :> GraphicsComplex[Map[# + {50, 0, 0} &, points], a]}]