Help file for the Picture project.

Ralph Gonzalez, PO Box 54, Newark, DE 19711, USA.



INTRODUCTION:

Picture is a free class library for displaying and animating three-dimensional 
color wire-frame drawings, although it may also be used for displaying two-
dimensional drawings.  It supports (1) segmentation of graphical entities, (2) 
multiple viewpoints and multiple projection windows, and (3) animation with an 
independent frame of reference for each (nested) segment.  It was written with 
the object-oriented Think C 5.0 compiler by Symantec Corp., using Macintosh 
computers.  However, COMPLETE PORTABILITY of Picture-based applications is 
possible to those environments for which a Screen class has been written.  
Presently Screen classes for Macintosh/Think C, PC-compatible (EGA/VGA)/Borland 
Turbo C++, and Unix/X Window/gnu C++ combinations exist.  Few changes should be 
needed to use these classes with different C++ compilers.


DISTRIBUTION:

Picture may be distributed freely as long as this Help file is included.  It is 
intended for educational use only - permission is required for commercial use.  
Users are encouraged to add functionality to the existing Picture library, or to 
write new Screen classes for other computers.  Please send any such additions to 
me, including documentation, so I can include them for distribution.  I would 
also be interested in seeing well-documented copies of any Picture applications 
you come up with.

Note that an ealier version of the Picture library was released.  The earlier
version lacked C++ style constructors and destructors, and X Window portability.


DESCRIPTION:

Picture consists of the following major classes:  Camera, Frame, Projector, 
Generic_Screen, Segment, Transformation, and Generic_Pict.  The following 
illustrates the class hierarchy, showing the inheritance relationships:

Generic_Class
    Camera
    Coord2
    Coord3
    Error
    Frame
    Generic_Pict
        An_Ring_Pict
        Dy_Cube_Pict
        Ring_Pict
        Simple_Pict
    Generic_Screen
        Mac_Screen
        PC_Screen
        X_Screen
    Projector
        Backdrop_Projector
        Corner_Projector
    Segment
        Fast_Cube
        Lline
        Nested_Segment
            Animated_Segment
                Animated_Ring
                Atomic_Ring
                Dynamic_Segment
                    Dynamic_Cube
                    Fast_Dynamic_Cube
            Cube
            Ring
    Transformation
        Rotation_X
        Rotation_Y
        Rotation_Z
        Scaling
        Translation
        World_To_Camera


Three-dimensional figures are defined by creating new classes which are 
descendants of the Segment class.  An existing descendant of Segment is 
Nested_Segment.  Figures which are defined as descendants of Nested_Segments can 
easily be composed of combinations of existing figures.  (See the description of 
the file segment.h, below.)  An existing descendant of Nested_Segment is 
Animated_Segment.  Figures which derive from this class can define animate() 
methods which indicate how the nested segments are to be animated.  
Dynamic_Segment's are Animated_Segment's which maintain velocity and 
acceleration vectors for physics simulations.

Segments can be moved and animated using Transformations, including scaling, 
translation, and rotation about the coordinate axes.

Camera objects are positioned and oriented in three dimensions to serve as 
viewpoints.  (See the description of the file camera.h, below.)  A rectangular 
cropping region (or Frame) on the Camera's projection plane declares the size of 
the "photo" for use with a Projector, as mentioned below.

Each application should contain a single "screen" object (whose class is a 
descendant of Generic_Screen) which is appropriate for the environment (although 
it may be possible to allow multiple screen objects, for situations where 
multiple monitors are available).  Presently there exist Mac_Screen, PC_Screen, 
and X_Screen classes, and it is hoped that more will become available in the 
future.

The application may contain several Projector objects, each of which is 
associated with a rectangular window (or Frame) on the Screen.  (It is also 
possible to have a console window for text I/O, as mentioned in the description 
of the file pict.c, below.)  The application may also contain several Camera 
objects and Segments.  Segments are drawn by specifying which Camera and which 
Projector to use.  Segments may be drawn repeatedly in a loop to obtain 
animation.

A class called Generic_Pict serves as a generic Picture application, which 
defines Screen, Error, and Backdrop_Projector (black backdrop) objects.  The 
easiest way to create a new Picture application is to define a new class which 
inherits these properties from Generic_Pict and overrides the run() method (and 
defines a new constructor and destructor) to draw specialized figures.  These 
specialized figures should be defined elsewhere as subclasses of Segment.  Four 
sample descendants of Generic_Pict are included, and mentioned below.

Note that the Error object automatically reports errors to the file error.fil.  
Examine this file after running the application to aid debugging.


FILES:

picthelp.txt   this file.
Pict Help (MacWrite)   same as this file, but with text formatting and graphics.
picture.pi     sample Think C project file.
Makefile       sample Unix Makefile.  You may need to change the ".c" extension
               to ".cc" for all the source files.

(The following files comprise the Picture library.  Please read the comments in 
the source and header files of any classes you will override, especially 
Generic_Pict.)

class.h         defines Generic_Class, from which all classes derive.
class.c         methods for Generic_Class, enables reporting when a constructor
                fails, though this isn't used in the Picture code.
error.h         defines Error class, for reporting certain errors to error.fil.
error.c         Error methods.
screen.h        defines Generic_Screen class encapsulating low-level graphics
                instructions.
screen.c        methods for Generic_Screen.
macscrn.h       Mac_Screen for Macintosh/Think C environment.
macscrn.c       methods for Mac_Screen.
pcscrn.h        PC_Screen for PC/Borland Turbo C++.
pcscrn.c        methods for PC_Screen.
xscrn.h         X_Screen for Unix/X Window/gnu C++.
xscrn.c         methods for X_Screen.
color.h         defines mapping of color values, for color or B&W displays.
camera.h        defines Camera class representing the viewpoint for 3D
                perspective projection.  Describes coordinate system used.
camera.c        Camera methods.
project.h       defines Projector class representing the mapping from the
                Camera's projection plane to a screen window
project.c       Projector methods
backdrop.h      defines Backdrop_Projector, which simply fills the entire screen
                with a single color to hide the operating system desktop.
backdrop.c      Backdrop_Projector methods.
coord.h         defines Coord2 and Coord3 classes for 2D and 3D coordinates.
coord.c         defines operations on Coord2 and Coord3 objects.
trans.h         defines Transformation class and descendants: Translation,
                Scaling, Rotation_X, Rotation_Y, and Rotation_Z.  Also a
                composite transformation for 3D perspective transformation.
trans.c         methods for these transformation classes.
frame.h         defines the Frame class, for 2D mappings.
frame.c         methods for Frame.
segment.h       defines Segment and Nested_Segment for defining figures.  Each
                Nested_Segment maintains an instance variable representing the
                cascaded transformations which have been applied to it.  Thus
                the segments which are contained within it may be transformed
                with reference to a local coordinate system, without regard to
                transformations which are applied to the entire Nested_Segment.
segment.c       Segment methods.
line.h          defines Line class, a simple Segment descendant.
line.c          Line methods.
cube.h          defines Cube, a descendant of Nested_Segment consisting of
                several Lines.  Also defines Fast_Cube, a direct descendant of
                Segment which draws faster.
cube.c          Cube methods.
ring.h          defines Ring, a Nested_Segment descendant for ring-shaped
                collections of Cubes.
ring.c          Ring methods.
animate.h       defines Animated_Segment class, a Nested_Segment descendant for
                defining animations of nested segments.
animate.c       Animated_Segment methods.
atring.h        defines Atomic_Ring, an Animated_Segment descendant very similar
                to Ring.
atring.c        Atomic_Ring methods.
anring.h        defines Animated_Ring, an Animated_Segment whose nested segments
                may also be animated.
anring.c        Animated_Ring methods.
dynamic.h       defines Dynamic_Segment class, an Animated_Segment descendant
                supporting dynamics.
dynamic.c       Dynamic_Segment methods.
dycube.h        defines Dynamic_Cube and Fast_Dynamic_Cube classes.
dycube.c        Dynamic_Cube and Fast_Dynamic_Cube methods.
pict.h          defines Generic_Pict, a generic class from which the main
                application class should be derived.
pict.c          Generic_Pict methods.  Also contains comments on how to use
                a window for stdio-type text input and output.
main.c          main() function allocating a descendant of Generic_Pict.

(The following files are used to demonstrate how to use the Picture library.  
Simple_Pict, Ring_Pict, An_Ring_Pict, and Dy_Cube_Pict are sample pictures 
derived from Generic_Pict.  Comments in main.c indicate how to compile the 
applications.)

simpict.h       defines Simple_Pict, a sample 2D picture.
simpict.c       Simple_Pict methods.
ringpict.h      defines Ring_Pict, a sample 3D picture.
ringpict.c      Ring_Pict methods.
anringpi.h      defines An_Ring_Pict, a sample animated 3D picture.
anringpi.c      An_Ring_Pict methods.
dycubpic.h      defines Dy_Cube_Pict, a sample dynamic animated 3D picture.
dycubpic.c      Dy_Cube_Pict methods.


REFERENCES:

Hearn & Baker, "Computer Graphics", Prentice-Hall, 1986
