home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Desktop Works 1995 - 1996
/
desktopworks1995-1996.iso
/
scrnsave
/
win_maze
/
plot3d.h
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-01
|
9KB
|
213 lines
#ifndef PLOT3D_H
#define PLOT3D_H
// Objects instantiated from this class may be used to plot z=f(x,y) in
// in three dimensions.
typedef struct
{
unsigned char base_z; // '1' - normal, '2' -- highlight, or
// '3' -- don't display; external to plot.
unsigned char color; // shade of gray for this quadrilateral.
float x; // coordinates of corner of this
float y; // quadrilateral.
float z;
int x_division_index;
int y_division_index;
} corner_rec, *corner_rec_ptr;
// One of the many vertices of quadrilaterals composing the plot.
typedef struct
{
double x;
double y;
double z;
} vertex_rec;
// A point or vector.
typedef struct sort_bound
{
int lower_x;
int lower_y;
int upper_x;
int upper_y;
} sort_bound_rec;
typedef struct sort_stack
{
sort_bound_rec bound;
struct sort_stack *previous;
} sort_stack_rec;
class plot3d
{
private:
void adjust_perspective(void);
// Make parallel lines running away from the viewer
// appear to converge at the horizon.
double aspect_ratio;
unsigned char color_max;
// Maximum shade of gray for a quadrilateral
// (before adjusted between darkest_gray and
// lightest_gray).
unsigned char color_min;
// Minimum shade of gray for a quadrilateral
// (before adjusted between darkest_gray and
// lightest_gray).
corner_rec **corner;
// Vertices of quadrilaterals composing the plot.
int corner_allocated;
// TRUE if "corner" is allocated.
double cos_rotation;
double cos_tilt;
int darkest_gray;
// This is the darkest shade of gray that will
// actually be displayed (for parts that can be seen).
void evaluate_and_transform(double (*f)(double,double),
double x_min,double x_max,double y_min,double y_max,
int num_x_divisions,int num_y_divisions,
double rotation,double tilt,
int (*external_to_plot)(double,double),
int (*red)(double,double));
// Computes the vertices, etc. for each quadrilateral
// composing the plot.
vertex_rec light;
// Vector pointing to the source of light.
int lightest_gray;
// This is the lightest shade of gray that will
// actually be displayed.
int num_colors;
// Colors 0 through num_colors-2 represent shades of
// gray from black to white. num_colors-1 represents
// red and is (optionally) used to highlight areas.
int num_x_divisions;
// Number of divisions of the x-axis used to define
// the quadrilaterals composing the plot.
int num_y_divisions;
// Number of divisions of the y-axis used to define
// the quadrilaterals composing the plot.
TPalette *palette;
PALETTEENTRY palette_entry [256];
double pixels_per_unit;
char prepare_plot_state;
// Internal state of "prepare_plot".
int plot_prepared;
// TRUE if the last call to "prepare_plot" was
// successful.
char plot_state;
// Internal state of "plot".
double radians;
void rearrange(int,int,int,int,int *,int *);
// Called by "sort_back_to_front".
double rotation;
// Degrees the plot is rotated about the z-axis.
void shade(void);
// Computes the shade of gray for each quadrilateral
// composing the plot.
double sin_rotation;
double sin_tilt;
void sort_back_to_front();
// The painter's algorithm is used; items farther
// from the viewer are drawn earlier.
sort_stack_rec *stacked_bound_head;
double tilt;
// Degrees the plot is tilted after it is rotated.
int use_palette;
TFrameWindow *window_ptr;
double x;
double y_center;
double x_delta;
int x_division_num;
double x_eye;
double x_corner_max;
double y;
double y_delta;
int y_division_num;
double y_offset;
double y_corner_max;
double y_corner_min;
double z_center;
double z_offset;
double z_out_max;
double z_corner_max;
double z_corner_min;
public:
plot3d(TFrameWindow *);
~plot3d(void);
char plot(TRect ®ion_to_paint,int show_red,int only_plot_red,
double bias=1.0);
// This function returns 'S' if it is successful in generating the 3D plot.
// It returns 'C' if it should be called again (because more work must be done
// on the plot). Otherwise, it returns 'F' indicating a failure. Its
// parameters are as follow:
//
// region_to_paint -- only points in this rectangle will be plotted.
//
// show_red -- highlight quadrilaterals having each vertex flagged
// to be highlighted.
//
// only_plot_red -- only plot the quadrilaterals having each vertex
// flagged to be highlighted.
//
// bias -- a positive number used to adjust the contrast.
//
// "prepare_plot" must be called before "plot", after which "plot" may be called
// as many times as desired.
char prepare_plot(double (*f)(double,double),double x_min,
double x_max,double y_min,double y_max,
int (*external_to_plot)(double,double),
int (*red)(double,double),int x_division_count,
int y_division_count,double rotation_in_degrees,
double tilt_in_degrees,double light_x,double light_y,
double light_z);
// This function returns 'S' if it is successful in preparing the plot for
// generation. It returns 'C' if it should be called again (because more work
// must be done). Otherwise, it returns 'F' indicating a failure. Its
// parameters are as follow:
//
// f -- z=f(x,y), the function to be plotted. Before the plot is
// tilted or rotated, the z-axis runs from the bottom to the top of the
// display, the y-axis runs from the left to the right of the display,
// and the x-axis runs out of the display.
//
// x_min -- the minimum value of x to be plotted.
//
// x_max -- the maximum value of x to be plotted.
//
// y_min -- the minimum value of y to be plotted.
//
// y_max -- the maximum value of y to be pl