ftp.nice.ch/pub/next/graphics/3d/Rotation.1.0.s.tar.gz

3-d_Rotation.iconheader
 

3-d_Rotation.nib


 
3-d_Rotation_main.m
[View 3-d_Rotation_main.m] 
AzimuthMat.h
[View AzimuthMat.h] 
AzimuthMat.m
[View AzimuthMat.m] 
CubeFalling2.tiff
 
CubeView.h
[View CubeView.h] 
CubeView.m
[View CubeView.m] 
GNULicense.h
[View GNULicense.h] 
GNULicense.m
[View GNULicense.m] 

GNULicense.nib


 
IB.proj
 
Makefile
 
PerspMat.h
[View PerspMat.h] 
PerspMat.m
[View PerspMat.m] 
README
 
cubedot.tiff
 
dotAt.psw
 
sample.3d
 

README

			     3-d_Rotation
		Douglas M. Bates (bates@stat.wisc.edu)
	      Murray K. Clayton (clayton@stat.wisc.edu)
0. Summary

3-d_Rotation is an application for displaying and rotating
3-dimensional data.  It allows the user to plot lines, points, both,
or neither (see below).  This readme file explains: How to Work It,
How It Works, How We Wish It Would Work (things to add), and What
Doesn't Work (Bugs).

This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.

This package is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program (in file COPYING); if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  A
copy of the GNU General Public License is also available when running
the application by clicking on ``Info...'' in the main menu.

(Thanks for Jacob Gore (jacob@gore.com) for providing the GNU License
Panel.)

1.  How To Work It

Data must be arranged in an ascii file with extension .dat , .data ,
or .3d .  The data must be in 3 columns, each line of data
corresponding to a point in 3-space.  The first column corresponds to
the ``x'' coordinate, the second column corresponds to the ``y''
coordinate, and the third column corresponds to the ``z'' coordinate.

Data may be plotted as points, lines, both, or neither.  To plot data
as points, the word ``points'' (or, in fact, any word beginning with P
or p) must be on a separate line before the data to be plotted as
points.  (To be precise, the plotted points will appear as small
circles.) Using the word ``lines'' instead will result in a series of
connected line segments with endpoints given by the coordinates in the
data file.  Using ``both'' will put a small circle at the endpoints of
each line segment.

When ``neither'' is used, the data will not be plotted but will be
used to determine the scaling of the plot.  Each axis is scaled to
accomodate the range of all the data in that column from the file.
You can force an unusual scaling by adding points under ``neither''.

The data file can be opened in the usual way by selecting ``File'' from
the main menu and then ``Open'' from the submenu (or Command-o).

Clicking the ``Axes'' button will cause axes to be displayed.  Note
that when originally opened, the x axis lies horizontally, the z
axis lies vertically, and the y axis runs ``into'' the picture (a
right-hand system).  Clicking the ``Cube'' button causes a cube to
be displayed.  This is the default when the application starts up.
Both axes and the cube can be displayed, or neither.

The sliders allow rotating the data:  the phi slider changes the
elevation angle; the theta slider changes the azimuth.  The delta
slider changes the ``viewing distance.''  To show the current values
of phi, theta, and delta, click the ``Show Angles'' button.  The
``Reset Button'' will reset these values.  Specific values of phi,
theta, or delta may also be typed into the forms at the top of the
3-d Rotation window.

Opening a new data file will automatically release the current data
and reset the values of phi, theta, and delta.

The Print menu item prints the current contents of the view.  It can
also be used to save an encapsulated PostScript version of the view.
You can save the PostScript to the pasteboard instead using the Copy
item in the Edit submenu.   

2.  How It Works

3-d_Rotation relies on a PerspMat class of objects, an AzimuthMat
class of objects, and a custom view called CubeView.

PerspMat inherits from Object, and provides perspective projections of
3-d coordinates onto a 2-dimensional plane.  It includes methods for
translating, scaling, rotation around each of the coordinate axes (x,
y, and z) and providing perspective based on the viewer's distance
from the item being viewed.  The approach involves transforming
homogeneous coordinates through matrix manipulations as described, for
example, in chapters 7 and 8 of Foley and Van Dam (1982) Fundamentals
of Interactive Computer Graphics, Addison-Wesley, Reading, Mass.  For
the purposes of viewing the projected data, there are 2 methods:
render: and as_DPSpath:.  render fills a 3-dimensional array of arrays
of floats with the projected coordinates while as_DPSpath projects the
(x,y,z) values and stores the two projected coordinates in the order
(u1,v1,u2,v2,...).  This is the type of structure used in the system
function DPSDoUserPath.  as_DPSpath comes in two forms, the second
taking an additional argument to offset:.  We added that method so we
could plot points more conveniently.

AzimuthMat inherits from PerspMat, and is a class of pespective
matrices where the viewpoint is determined by the azimuth angle
(theta), the elevation angle (phi), and a distance to the viewpoint.
It sets limits to correspond to the range of the three coordinates,
and rescales them to lie in the interval [-1, 1].

Of course, PerspMat and AzimuthMat could be useful beyond the current
purposes.  Since we need to change the transformation and recalculate
the projected positions of the data very quickly to get the appearance
of smooth rotations, the code in these classes favors efficiency over
readability.

Finally, CubeView inherits from View, and imports AzimuthMat.
CubeView contains the methods for actually getting the projected image
onto the screen.  The factory methods and the methods for
communicating with the sliders and buttons of the interface are fairly
straightforward.  The setlimits: method uses the setlimits: method of
AzimuthMat to rescale the data, and also constructs the axes and cube
displays.  The drawSelf method puts the image onto the screen.  Two
approaches are used.  For displaying the cube, the axes, or sets of
connected line segments, the DPSDoUserPath function is used.  The
as_DPSpath method of AzimuthMat is used to create the array needed by
DPSDoUserPath as described above.  This seems to work very quickly.
We had more problems in finding a way to put up a set of unconnected
points quickly.  The approach we finally settled on is this: first, a
tiff image was created using Icon (which, incidentally, seems to have
a lot of bugs in it).  The image consists of a ``circle'' in a 5
pixels by 5 pixels rectangle.  Some shading was used to produce an
image that looks ``rounder'' than simply using the arc command of
PostScript.  The tiff image is stored as a bitmap object ``dot'' in
CubeView.  Next, the second version of as_DPSpath: in AzimuthMat is
used to create an array consisting of the centers of the circles as
they are to appear on the screen, again in the form u1, v1, u2, v2,
etc.  However, the centers are offset by the offset method by the
amount 2.5*2/384.  The 384 is the width, in pixels, of the customview
in the 3-d_Rotation window, 2 is the width in the local coordinate
system, and 2.5 is half the width of the rectangle containing the
bitmap.  Finally, the pswrap dotAt pushes this array onto the
PostScript stack and composits the bitmap.  (Thanks to Carl Sutter at
USC for information on using Bitmap objects.)

We experimented with some other methods for getting the points up
quickly, but none seems to be as fast as the above.  Even still,
things start to slow down appreciably if the number of points to
be plotted is large.  (To seem this, change all occurrences of
``lines'' to ``points'' in sample.3d and try dragging the theta or
phi slider quickly.)

To add Print and Edit/Copy menu items, as suggested by Dan McCreary
from NeXT, we had to create a PostScript-only version of dotAt that
drew the points as PostScript circles.


3.  How We Wish It Would Work

Things to do:

a.  Allow automatic rocking or rolling of the image using a
    DPSTimedEntry.  (Similar to the Motor button of the Molecule demo
    application.) 

b.  Add an edit window for viewing and editing the raw data.

c.  Allow the use of many different plotting symbols (and
    thus highlighting of points).

d.  Allow data files to have k>3 columns, and allow interactive
    assignment of x, y, and z axes to any three given columns.

e.  Use the DSP for rendering the data points.  That is, scale the data
    values so they are in the range -1 to 1 and convert them to the 24
    bit DSP format.  When a new transformation matrix is determined,
    use the DSP to do the linear algebra in a DSPrender: method.  We
    imagine this will be faster than using floating point operations
    as we do now.  For lines this may produce smoother rotations.  It
    seems that for points, though, actually drawing the points in the
    window is slower than calculating where to draw them.

f.  Allow the window to be resized.


4.  Things That Don't Work

a.  A data file with line 1 containing 'points' line 2 blank, and
    line 3 with some data produces the error message ``First line of ...
    does not contain numeric data,'' which is misleading, since, although it
    does identify an error in the data file, it's the wrong error.

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.