Re: Transformation of 3D Objects to 2D Parallel-projection
- To: mathgroup at smc.vnet.net
- Subject: [mg108723] Re: Transformation of 3D Objects to 2D Parallel-projection
- From: Mark McClure <mcmcclur at unca.edu>
- Date: Mon, 29 Mar 2010 05:22:21 -0500 (EST)
On Sun, Mar 28, 2010 at 7:55 AM, Peter Breitfeld <phbrf at t-online.de> wrote:
> I wrote some routines to map 3D-coordinates to 2D using the
> transformation
> proj[{x_,y_,z_}]:={y-x/2,z-x/2}
>
> But this doesn't work for all kind of 3D-objects.
> ...
> So my question: Is it possible to have routines, which will work on any
> kind of 3D-primitives including Cuboid[], Cylinder[] etc, which will
> preserve Thickness, Color etc
I'd suggest that you use patterns to write a different version of proj
for each primitive that you want to work with. Thus, you might have
some lines like the following.
proj[{x_?NumericQ, y_?NumericQ, z_?NumericQ}] := {y - x/2, z - x/2};
proj[list_List] := proj /@ list;
proj[Point[pts_]] := Point[proj[pts]];
proj[Line[x_]] := Line[proj[x]];
proj[Arrow[x_]] := Arrow[proj[x]];
proj[Polygon[x_, pOpts___]] := Polygon[proj[x], pOpts];
To deal with something like Cylinder or Cuboid, you'll need to
translate it two an appropriate 2D primitive to represent the
projection. You might deal with a Cuboid like so
Needs["ComputationalGeometry`"];
proj[Cuboid[{xmin_, ymin_, zmin_}, {xmax_, ymax_, zmax_}]] :=
Module[{},
vv = Tuples[{{xmin, xmax}, {ymin, ymax}, {zmin, zmax}}];
projected = proj[vv];
Polygon[projected[[ConvexHull[projected]]]]];
proj[Cuboid[{xmin_, ymin_, zmin_}]] := proj[Cuboid[{xmin, ymin, zmin},
{xmin + 1, ymin + 1, zmin + 1}]];
At the end of it all, include
proj[x_] := x;
to ignore everything else, such as Graphics directives. Here's an
example that might or might not illustrate the idea.
pic3D = Graphics3D[primitives = {
{Thick, Line[{{{0, 0, 0}, {1, 1, 1}}, {{1, 0, 0}, {0, 1, 1}},
{{0, 1, 0}, {1, 0, 1}}, {{0, 0, 1}, {1, 1, 0}}}]},
{Opacity[0.5], Cuboid[{1/4, 1/4, 1/4}, {3/4, 3/4, 3/4}]}}];
pic2D = Graphics[proj[primitives]];
GraphicsRow[{pic3D, pic2D}]
Dealing with GraphicsComplex is easier in some ways. Since it has the form
GraphicsComplex[points, primitives]
you simply map proj onto the points. But you'll need to extract
Cuboids, Cylinders, Spheres and such (perhaps using Cases) to deal
with them separately.
Hope that helps,
Mark McClure