MathGroup Archive 1999

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Smarter 3D listplot clipping

  • To: mathgroup at smc.vnet.net
  • Subject: [mg15978] Re: Smarter 3D listplot clipping
  • From: Dan Truong <dtruong at irisa.fr>
  • Date: Fri, 19 Feb 1999 03:27:01 -0500
  • Organization: Irisa, Rennes (FR)
  • References: <7ag4ib$b0i@smc.vnet.net> <36CBDED3.739F1E5B@theorie3.physik.uni-erlangen.de>
  • Sender: owner-wri-mathgroup at wolfram.com

ListSurfacePlot3D is almost a nice idea, except it doesn't
work as is for my goal (I explain below how to call
ListSurfacePlot3D for those who don't know the function):

ListSurfacePlot3D[{{ {1,1,1},{2,1,1},{3,1,2},{4,1,2}},
		{{1,2,1},{2,2,1},{3,2,2},{4,2,2}},
		{{1,3,2},{2,3,2},{3,3,2},{4,3,2}},
		{{1,4,2},{2,4,2},{3,4,2},{4,4,2}}
	}
]

is OK, but

ListSurfacePlot3D[{{ {3,1,2},{4,1,2}},
		{{3,2,2},{4,2,2}},
		{{1,3,2},{2,3,2},{3,3,2},{4,3,2}},
		{{1,4,2},{2,4,2},{3,4,2},{4,4,2}}
	}
]
is not!

The difference between the 2 plots is that I removed
the points where z == 1 (our goal here).
This generates a matrix transposition error :(
when running.
We can cancel this error by leaving the unwanted
{} empty instead of removing them.

Therefore, we must move the points to make invisible
polygons (ie align the 4 points). My solution is to
do it systematically, by shifting the unwanted points
by x+1, y+1, zvalue in [[x+1,y+1]].

This is OK to hide z==1:

ListSurfacePlot3D[{
		{ {3,3,2},{3,2,2},{3,1,2},{4,1,2}},
		{{2,3,2},{3,3,2},{3,2,2},{4,2,2}},
		{{1,3,2},{2,3,2},{3,3,2},{4,3,2}},
		{{1,4,2},{2,4,2},{3,4,2},{4,4,2}}
	}
]


(* algorithm is something like
If[ Z == 1, ReplacePart[tab[[i,j]],tab[[i+1,j+1]], i+1, j+1 ]

or if I find a way to apply /; on arrays something similar to:

Bar = foo /; (foo[[i,j,3]] != 1)
Bar = foo[[i+1,j+1]] /; (foo[[i,j,3]] == 1)

I am missing the () ? : operator of C
A = (b>c) ? b : c;     // ie a is lowest between b and c
*)


How ListSurfacePlot3D[] works:
------------------------------
ListSurfacePlot3D[] needs a list made of rows of 
{x,y,z} points. 

	  A-B
	 / /
	C-D

would be done with a list like: {{C,D},{A,B}}
where C=={1,1,1} etc.
Therefore plotting the square with z=1 for all points,
ie plotting {{1,1},{1,1}} would go like:

ListSurfacePlot3D[{{{1,1,1},{2,1,1}},{{2,1,1},{2,2,1}}}];
or
ListPlot3D[{{1,1},{1,1}]; (*X,Y coodinates are implicit therefore
unalterable, note that point C == 1 only, X,Y unspecified *)


  • Prev by Date: Re: PlotVectorField Package (easy question?)
  • Next by Date: Re: Notebook -> Kernel
  • Previous by thread: Re: Smarter 3D listplot clipping
  • Next by thread: Figure legend & Overlapping text pb