       Raising Contour Plot Graphics to 3D - II

• To: mathgroup at smc.vnet.net
• Subject: [mg37281] Raising Contour Plot Graphics to 3D - II
• From: "David Park" <djmp at earthlink.net>
• Date: Mon, 21 Oct 2002 02:30:47 -0400 (EDT)
• Sender: owner-wri-mathgroup at wolfram.com

MathGroup,

This provides additional information and examples for my earlier posting.

I am trying to use ContourPlot to generate colored planar Polygons
representing contour regions, and then map them into 3D planar Polygons.

There are two problems.

1) The output from converting ContourGraphics to Graphics is not separate
polygons for each contour region, but a series of overlapping polygons.
Mathematica takes advantage of the fact that in 2D you can lay one Polygon
on top of another. But when we convert the Polygons to 3D objects,
Mathematica has difficulties. Laying one polygon over another in 3D
generally confuses Mathematica's rendering, and perhaps is a difficult 3D
problem in general. There is a solution. We can just separate the Polygons
into layers with separations just large enough to unconfuse the rendering.
As long as we only look at the "top" side, this works. I illustrate a case
below.

2) Mathematica does not correctly render planar polygons that have a concave
edge. This despite the fact that the Polygon Help says: "In three
dimensions, planar polygons that do not intersect themselves will be drawn
exactly as you specify them." But how does Mathematica determine that a
Polygon is planar, once approximate numbers have been introduced? Somehow we
need a method to specify that a 3D Polygon is to be taken as planar,
regardless of round off errors.

Now for examples.

Needs["Graphics`Animation`"]

cplot = ContourPlot[x y, {x, -3, 3}, {y, -3, 3}, ColorFunction -> Hue];

We extract the colors and Polygons and throw away the Lines. (In 2D
Mathematica does not draw the edges of Polygons; in 3D it does.)

cgraphics2d =
Cases[First[Graphics[cplot]], a : {Hue[_], Polygon[_], ___} :> Take[a,
2],
Infinity];

Now we convert the Polygons to 3D objects, introduce an exaggerated spacing
between layers and plot it. It illustrates how Mathematica uses an overlay
technique on ContourPlots.

cgraphics3da =
Table[Part[cgraphics2d,
i] /. {x_?NumericQ, y_?NumericQ} -> {x, y, 0.1 i}, {i, 1,
Length[cgraphics2d]}];
Show[Graphics3D[
{cgraphics3da},
Lighting -> False,
ImageSize -> 450]];

Here is the same case with close spacing and an affine transformation to 3D
space.

cgraphics3da =
Table[Part[cgraphics2d,
i] /. {x_?NumericQ, y_?NumericQ} -> {x, y, 0.000001 i}, {i, 1,
Length[cgraphics2d]}];
cgraphics3db =
cgraphics3da /. {x_?NumericQ, y_?NumericQ,
z_?NumericQ} -> {2x + y, -x + 2y, -1.5x + y + z};
plot1 =
Show[Graphics3D[
{cgraphics3db},
Lighting -> False,
ImageSize -> 450]];
SpinShow[plot1, SpinOrigin -> {0, 0, 0}, SpinDistance -> 5]
SelectionMove[EvaluationNotebook[], All, GeneratedCell]
FrontEndTokenExecute["OpenCloseGroup"]
FrontEndTokenExecute["SelectionAnimate"]

That works well, but if our contour regions have concave edges, we run into
the second problem.

cplot = ContourPlot[x^2 + y^2, {x, -3, 3}, {y, -3, 3}, ColorFunction ->
Hue];
cgraphics2d =
Cases[First[Graphics[cplot]], a : {Hue[_], Polygon[_], ___} :> Take[a,
2],
Infinity];
cgraphics3da =
Table[Part[cgraphics2d,
i] /. {x_?NumericQ, y_?NumericQ} -> {x, y, 0.1 i}, {i, 1,
Length[cgraphics2d]}];
Show[Graphics3D[
{cgraphics3da},
Lighting -> False,
ImageSize -> 450]];

The 3D Polygons are rendered to extend outside the actual region, presumably
because Mathematica does not recognize them as planar. So, if we do a
closely spaced 3D plot as with the other function, we do not obtain properly
colored regions.

cgraphics3da =
Table[Part[cgraphics2d,
i] /. {x_?NumericQ, y_?NumericQ} -> {x, y, 0.00001 i}, {i, 1,
Length[cgraphics2d]}];
cgraphics3db =
cgraphics3da /. {x_?NumericQ, y_?NumericQ,
z_?NumericQ} -> {2x + y, -x + 2y, -1.5x + y + z};
plot1 =
Show[Graphics3D[
{cgraphics3db},
Lighting -> False,
ImageSize -> 450]];
SpinShow[plot1, SpinOrigin -> {0, 0, 0}, SpinDistance -> 5]
SelectionMove[EvaluationNotebook[], All, GeneratedCell]
FrontEndTokenExecute["OpenCloseGroup"]
FrontEndTokenExecute["SelectionAnimate"]

Does anyone have any ideas for solving this problem?

David Park