       Re: Raising Contour Plot Graphics to 3D - II

• To: mathgroup at smc.vnet.net
• Subject: [mg37289] Re: Raising Contour Plot Graphics to 3D - II
• From: Jens-Peer Kuska <kuska at informatik.uni-leipzig.de>
• Date: Tue, 22 Oct 2002 04:47:08 -0400 (EDT)
• Organization: Universitaet Leipzig
• References: <ap085r\$c77\$1@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```Hi,

a) Mathematica can't render non convex polygons in 3d
and you have to triangulate the polygons with
http://library.wolfram.com/packages/polygontriangulation/
b) at the end of the (in german) notebook:

http://phong.informatik.uni-leipzig.de/~kuska/signal/MathGraphIntro.zip
is a function that slice a 3d plot with contour lines and
it should be easy to shift the polygons to the height values

Regards
Jens

David Park wrote:
>
> 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