2003-11-12  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 3DLDFcpl.web:
	LDF 2003.11.12.  Put changes from my distribution version into this file.

	Added section ``Configuration file'', that includes \filename{config.h}.

	Added |@[#define@]| |LDF_PUBLIC| in order to be
	able to conditionally include \filename{plfmvar.h}.  The latter is not
	included in the version for distribution.  Instead, the preprocessor
	variables are defined or undefined here.

	Added conditional code using preprocessor variables defined in \filename{config.h}.

	Changed name of the executable that results from the linking command performed in this
	program from ``3dldf'' to ``LDF3D''.

	* 3DLDF.web:
	LDF 2003.11.12.  Put changes from my distribution version into this file.

	Changed version number from 1.0 to 1.1 in one place.

	Added bibliography entry for the book by Josef Stoer.

	* triangle.web:
	LDF 2003.11.12.  Working on the constructor taking arguments for the sides
	and/or angles.

	* run_mp: LDF 2003.11.12.  Now running ps2pdf.

	* main.web, 3DLDFtex.tex: LDF 2003.11.12.  No significant changes.

2003-11-07  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 3DLDFcpl.web:
	LDF 2003.11.07.  Added code for processing \filename{ellpsoid.web},
	which contains |class Ellipsoid|.

	* subex1.web, parser.web, main.web, utility.web:
	LDF 2003.11.07.  Added #include |"ellpsoid.h"|.

	* ellpsoid.web: New file.

2003-10-22  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* sub_purge:
	LDF 2003.10.22.  Made changes accounting for the change of filenames
	from ``persp...'' to ``3DLDF...''.

	* 3DLDFtex.tex: LDF 2003.10.22.  Added code for DIN A3 landscape.

	* 3DLDF.web:
	LDF 2003.10.22.  Added code for including \filename{triangle.web}.

	* triangle.web:
	LDF 2003.10.06.  Added the |static const short| data members
	|SSS|, |SAS|, |SAA|, |ASA|, and |SSA| to the definition of |Triangle|.
	Added the section |@<Initialize |static const Triangle| data members@>|.

	LDF 2003.10.21.  Added |real area| to the definition of |Triangle|.
	Replaced |SSA| with |SSA_A|, |SSA_B|, |SSA_L|, and |SSA_S|,
	for handling the various cases.

	LDF 2003.10.22.  |SSS|, |SAS|, |SAA|, |ASA|, |SSA_A|, |SSA_B|,
	|SSA_L|, and |SSA_S| are passed as arguments to the non-default
	constructor and are used for triangle solutions.

	LDF 2003.10.06.  Added the default constructor.  The data members for the
	sides, angles, and area are all set to 0.

	LDF 2003.10.06.  Added the non-default constructor.  It takes three |real|
	arguments and a |short| for indicating which triangle solution should be
	used.  One of the |static const short| data members mentioned above should
	be passed as this argument.

	LDF 2003.10.21.  Worked on the non-default constructor.  Added routines for
	all of the triangle solutions, but I haven't tested them yet.

2003-09-30  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: LDF 2003.09.30.  Added an item.

	* triangle.web: LDF 2003.09.30.
	Started defining |struct Triangle|.

	* 3DLDFtex.tex: LDF 2003.09.30.
	Minor changes.

	* 3DLDFcpl.web: LDF 2003.09.30.
	Added code for processing \filename{triangle.web}.

	* utility.web, subex1.web, solids.web, solfaced.web, rectangs.web, polyhed.web, polygons.web, patterns.web, parser.web, main.web, layers.web, ellipses.web, curves.web, cuboid.web, circles.web:
	LDF 2003.09.30.
	Now including \filename{triangle.h}.

	* triangle.web: LDF 2003.09.30.
	Initial version of this file.  It doesn't yet contain a |struct| or |class|
	definition of |Triangle|, nor does it contain any function declarations or
	definitions.

	* triangle.web: New file.

2003-09-05  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web:
	LDF 2003.09.05.  Added |reflect()|, and note to myself to test
	and describe it.

	* arch_3DLDF: LDF 2003.09.05.  Updated.

	* Makefile: LDF 2003.09.05.
	Updated.

	* planes.web:
	LDF 2003.09.05.  Added the definition of |Points::reflect(const Plane& a)|.
	It is declared in \filename{points.web}.  It must be defined
	here, because it has a |Plane| argument, and |Plane| is an
	incompletely defined type there.

	* points.web:
	LDF 2003.09.05.  Added the declaration of |reflect(const Plane&)|.
	It must be defined in \filename{planes.web}, because it
	has a |Plane| argument, and |Plane| is an incompletely defined type
	in this file.

	* main.web: LDF 2003.09.05.  No significant changes.

	* loader.web:
	LDF 2003.09.05.  Undefined |LDF_PUBLIC|, so that \filename{plfmvar.h}
	is loaded.  This is for my private versions, not the public one.

2003-09-03  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* pspglb.web: LDF 2003.09.03.  Edited to improve cweave output.

	* loader.web:
	LDF 2003.09.03.  Added |#define LDF_PUBLIC| in order to be
	able to conditionally include \filename{plfmvar.h}.  The latter is not
	included in the version for distribution.  Instead, the preprocessor
	variables are defined or undefined here.

	* 3DLDFprc.web: LDF 2003.09.03.  Edited to improve cweave output.

	* 3DLDF.web:
	LDF 2003.09.03.  Edited.  Nothing especially worth mentioning.

	* 3DLDF.macs:
	LDF 2003.09.03.  Changed the definitions of \LOG, \ENDLOG, and
	\SUBLOG.

	* shapes.web:
	LDF 2003.09.03.  Put ``\initials{}'' around my initials and the date.

	* 3DLDFcpl.web:
	LDF 2003.09.03.  Put ``\initials{}'' around my initials and the date.
	Removed ``@<Main@>+='' in one place.

	* 3DLDF.web: LDF 2003.09.03.  Now including licenses.

2003-09-02  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* solids.web, rectangs.web:
	LDF 2003.09.02.  Added \newlines, in order to get rid of overfull boxes
	in the cweave output.

	* polyhed.web:
	LDF 2003.09.02.  Added a period after the title of a starred section.  This
	corrected an error that confused cweave.

	* polygons.web:
	LDF 2003.09.02.  Added \newlines, in order to get rid of overfull boxes
	in the cweave output.

	* points.web:
	LDF 2003.09.02.  Now using \initials.  Added \newlines and edited some text,
	in order to get rid of overfull boxes.

	I inadvertantly checked out revision 1.181.1.2, and checked in two new revisions
	on that branch, before I discovered my mistake.  Then I had to check
	out revision 2.60, and make the changes in it.  This revision is the result.

	* patterns.web, paths.web:
	LDF 2003.09.02.  Added \newlines, in order to get rid of overfull boxes
	in the cweave output.

	* main.web: LDF 2003.09.02.
	Removed some code that wasn't supposed to go in the print-out.
	Changed some of the headings, so they weren't printed to the
	Table of Contents.

	* ellipses.web:
	LDF 2003.09.02.  Added \newlines, in order to get rid of overfull boxes
	in the cweave output.

	* cwebmac.tex:
	LDF 2003.09.02.  Added ``\contentstrue''.  I don't know why it was missing.
	It's needed for getting lowercase roman numerals for the page numbers
	in the Table of Contents.

	* curves.web:
	LDF 2003.09.02.  Added \newlines, in order to get rid of overfull boxes
	in the cweave output.

	* colors.web:
	LDF 2003.09.02.  Changed ``|external|'' to ``|extern|'' in a section
	title.

	* circles.web:
	LDF 2003.09.02.  Added \newlines, in order to get rid of overfull boxes
	in the cweave output.

	* 3DLDF.web: LDF 2003.09.02.  No significant changes.

	* 3DLDF.macs:
	LDF 2003.09.02.  Edited the code for formatting my initials, and
	redefined \LOG and \ENDLOG.

	* 00TODO: LDF 2003.09.02.  Added an item.

	* points.web: LDF 2003.09.02.
	Put my initials inside ``\initials{}''.

	* cwebmac.tex: LDF 2003.09.02.
	Added "\font\sevenrm=cmr7".  It's used in \initials.

	Changed "August" to "September" on the title page.

	Commented-out the definition of \contentspagenumber, which is no longer used.

	Added \newcount\conmodulo and \newcount\conpage.  They're used in the
	code for the Table of Contents and the headers.
	This makes it possible to get the correct page numbers printed on the
	Table of Contents, while letting \pageno advance normally.  This
	way, I can put the Table of Contents at the front of the dvi file by
	using dviselect and dviconcat.

	* utility.web, transfor.web, solids.web, solfaced.web, shapes.web, rectangs.web, pspglb.web, polyhed.web, polygons.web:
	LDF 2003.09.02.  Put my initials and the date inside ``\initials''.

	* points.web:
	LDF 2003.09.02.  Put some TeX text between \LOG and \ENDLOG.  Put one
	comment into TeX text.  There are a lot of others which should also be
	put into TeX text, in this and other files.

	* points.web, planes.web, pictures.web, patterns.web, paths.web, parser.web, main.web, loader.web, lines.web, layers.web, io.web, ellipses.web, curves.web, cuboid.web, colors.web, colall.web:
	LDF 2003.09.02.  Put my initials and the date inside ``\initials''.

	* circles.web:
	LDF 2003.09.02.  Removed parentheses around ``\initials{...}''
	in one place.

	* paths.web: LDF 2003.09.02.
	Added \newlines, to get rid of overfull boxes.

	* curves.web: LDF 2003.09.02.
	Added a ``START HERE'' note to myself, to get rid of overfull boxes.

	* circles.web, 3DLDF.web:
	LDF 2003.09.02.  Put my initials and the date into
	``\initials{}''.

	* 3DLDF.macs: LDF 2003.09.02.
	Added code for conditionally including my initials and the date:

	\newif\ifdoinitials
	\doinitialsfalse
	\doinitialstrue
	and
	\def\initials ...

	* 3DLDF.macs: LDF 2003.09.02.
	Redefined \LOG and \ENDLOG.  Succeeded in getting conditional definitions
	to work, so that log entries can be suppressed, if \dologfalse.

	Added \newlinechar=`^^J.

2003-09-01  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: LDF 2003.09.01.
	Added \newline commands, in order to get rid of overfull boxes in the
	cweave output.

	* colors.web: LDF 2003.09.01.  Fixed overfull box.

	* Makefile: LDF 2003.09.01.
	Changed the variable |PERSPS| to |TEXMPS|, and changed the names of the files
	that it contains.  This isn't actually used, though.

	* arch_3DLDF: LDF 2003.09.01.
	Changed the names of the {\TeX} and Metapost files that need to be archived.
	Now using the ``p'' option to tar, so that the permissions are retained.

	* run_mp:
	LDF 2003.09.01.  Made changes, to account for the fact that I've changed the names
	of the Metapost and {\TeX} files that I'm using with 3DLDF.

	* points.web:
	LDF 2003.09.01.  Currently trying to get rid of overfull boxes.

	* main.web: LDF 2003.09.01.  Minor correction.

	* colors.web:
	LDF 2003.09.01.  Editing for publication.  Made some changes, in order to try to
	get rid of some overfull boxes.

	* 3DLDF.web:
	LDF 2003.09.01.  Edited.  Preparing _3DLDF: The Program_, for which this is the
	driver file, for publication.  Redid the ``References'' section, by copying the
	{\TeX} code from \filename{biblio.texi}, and making a few changes.

	* 00TODO: LDF 2003.09.01.  Added items.

	* cwebmac.tex:
	LDF 2003.09.01.  Made various changes and additions, in order to get small
	roman numerals for the table of contents.

	* 3DLDFtex.tex, 3DLDFmp.mp, 3DLDFtex.base: New file.

2003-08-31  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web:
	LDF 2003.08.29.  Moved \filename{getopt.h} from \filename{loader.web}
	to here, because it's only used here.

	Changed the string that's passed to |initialize_io()| as the name of
	the input file.  It's a dummy name, since I've changed
	|initialize_io()| today, so that no |in_stream| isn't opened.
	Also, commented-out the line where |in_stream| is closed.

	* loader.web:
	LDF 2003.08.29.  Removed \filename{getopt.h} to \filename{main.web},
	because it's only used there.

	* io.web: LDF 2003.08.31.  Changed, so that |in_stream| isn't opened.

	* Makefile: LDF 2003.08.31.
	Replaced calls to cmplLIN and cmplDEC with one to 3DLDFcpl.

	* 3DLDFprc.web: LDF 2003.08.31.
	Added a comment.

	* 3DLDFcpl.web: LDF 2003.08.31.  Formatting changes.

	* 3DLDF.web: LDF 2003.08.31.  No significant changes.

	* 3DLDF.macs: LDF 2003.08.31.
	Changed |\docname| from ``3DLDF---The Program'' to
	``3DLDF: The Program'' to correspond with {\TeX} and Metafont.

	* curves.web: LDF 2003.08.31.
	Removed |show()| command from |segment()|.  It was needed while debugging, and
	I forgot to delete it.

	* 3DLDFcpl.web, 3DLDFprc.web:
	LDF 2003.08.31.  Changed ``up to date'' to ``up-to-date'' in comments,
	and in the strings written to stdout.

2003-08-27  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 3DLDFcpl.web: LDF 2003.08.27.
	In |file_age()|:
	Commented-out unused variable declarations:
	|struct tm *td|, |int MAX_STRING|, |char* file1|, and |char* file2|.

	* 00TODO:
	LDF 2003.08.27.  Moved some entries to \filename{00TO_DO_NOW} and deleted
	outdated ones.

	* points.web: LDF 2003.08.27.  Changed |focus| to |default_focus|.

	* pspglb.web: LDF 2003.08.27.
	Changed the string that prints the URL of my web site to standard output
	when 3dldf is called.

	* solids.web:
	LDF 2003.08.27.  Added a |virtual| destructor with an empty
	definition, because GCC with the ``{\tt -Wall}'' option issued the following
	warning:
	``{}`class Solid' has virtual functions but non-virtual destructor''.

	* shapes.web: LDF 2003.08.27.
	In the declaration of |class Shape|:
	Changed ``|const static|'' to ``|static const|'' in the declarations of
	|DRAWDOT|, |DRAW|, |FILL|, |FILLDRAW|, |UNDRAWDOT|, |UNDRAW|,
	|UNFILL|, and |UNFILLDRAW|.

	* polyhed.web: LDF 2003.08.27.
	In |Icosahedron::get_net()|:
	Added |size_t triangles_size| and added |size_t i| to
	a |for| loop, where it's compared to |triangles_size|.  This occurs in
	debugging code.

	* polygons.web: LDF 2003.08.27.
	In the non-default constructor:
	Reversed the order of the initializations following
	``|:|'', because GCC with the ``{\tt --Wall}'' option issued the
	following warning:\newline
	``{}`|Reg_Polygon::sides|' will be initialized after
	`|real Reg_Polygon::radius|'{}''.

	* points.web:
	LDF 2003.08.27.  Added a |virtual| destructor with an empty
	definition, because GCC with the ``{\tt -Wall}'' option issued the
	following warning:
	``{}`class Point' has virtual functions but non-virtual destructor''.

	* patterns.web: LDF 2003.08.27.
	In |epicycloid_pattern_1()|:
	Removed the declaration |const Color* curr_color|, since |curr_color|
	was never used.   Changed |int i| to |unsigned int i| in a |for| loop,
	because the value it was compared with, |offsets|, is an
	|unsigned int|.

	In |epicycloid_pattern_3()|:
	Removed the declaration
	|real radius_ratio = radius_outer / radius_inner|,
	since |radius_ratio| was never used.

	* paths.web: LDF 2003.08.27.  Made the destructor |~Path()| |virtual|,
	because GCC with the ``{\tt -Wall}'' option issued the following
	warning:
	``{}`class Path' has virtual functions but non-virtual destructor''.

	In |subpath()|:
	Changed |int i| to |size_t i| in the |for| loops that
	compare |i| to |start| and |end|.  The way it was before caused GCC
	with the ``{\tt -Wall}'' option to issue a warning.

	* lines.web: LDF 2003.08.27.
	In |get_distance(const Line& l)|:
	Commented-out the declarations of |v_x|, |v_y|, and
	|v_z|, since they are not used.  I haven't deleted them, in case I need
	them someday.

	* ellipses.web: LDF 2003.08.27.
	In |intersection_points(Ellipse e, bool verbose = false) const|:
	Commented-out the declaration of |OTHER|, because
	it's never used.  I haven't deleted it, just in case.

	* curves.web: LDF 2003.08.27.
	In |intersection_points(Point ref_pt, Point pt0, Point pt1) const|:
	Added a comment about an unused variable.

	* circles.web: LDF 2003.08.27.
	In |intersection_points(const Circle& c, bool verbose = false) const|:
	Removed the declaration |real c_radius = c.radius|,
	since |c_radius| was never used.

2003-08-25  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: LDF 2003.08.25.
	Added items.

	* shapes.web, points.web: LDF 2003.08.25.
	Removed code referring to sections that I had removed.  They contained code
	for the |Shape| wrapper functions, which I have removed.

	* main.web: LDF 2003.08.25.
	Made some changes to the command line option handling code.

	* main.web, points.web, shapes.web: LDF 2003.08.25.
	Removed the code for |shape_func_map| and the |Shape| wrapper functions.
	I won't be using them, since I now plan to use Flex and Bison for generating the
	scanner and parser.

	* parser.web: LDF 2003.08.25.
	Removed the code from this file.  I plan to use Bison for making the
	parser.

	* pspglb.web:
	LDF 2003.08.25.  Added a note about the fact, that GCC 2.95 doesn't have the
	|numeric_limits| template, and GCC 3.3 doesn't seem to either.

	* points.web:
	LDF 2003.08.25.  Now writing ``3DLDF'' explicitly, instead of using
	\title.

	* loader.web:
	LDF 2003.08.25.  Now writing ``3DLDF'' explicitly, instead of using
	\title.

	Added {\TeX} text.

	* io.web, 3DLDFcpl.web:
	LDF 2003.08.25.  Now writing ``3DLDF'' explicitly, instead of using
	\title.

	* 3DLDF.macs: LDF 2003.08.25.
	Removed the redefinition of \title.  Added definition of \docname, which is used
	on the page with the table of contents.

	Added \narrowskip, \beginnarrow, and \endnarrow.  These are used
	for the GNU GENERAL PUBLIC LICENSE (in file gpl.tex),
	and the GNU Free Documentation License (in file fdl.tex).

	* cwebmac.tex: LDF 2003.08.25.
	Replaced the old version of this file with
	Version 3.64 from February 2002, and made a few modifications.

	* 3DLDF.web: LDF 2003.08.25.
	Now including the GNU General Public License from \filename{gpl.tex}.
	Not dating the contents page anymore.
	URLs are no longer printed using \tt.
	Added references to the ``References'' section.
	Changed the level of some sections.
	Minor editing of the text in the Introduction section.

2003-08-21  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web:
	LDF 2003.08.21.  A message is now printed to |stdout| when |main()| exits, unless
	|SILENT_GLOBAL| is |true|.

	* loader.web:
	LDF 2003.08.21.  Now including \filename{plfmvar.h} using ``#include'' rather
	than \filename{3DLDFvar.web} using ``@i''.

2003-08-20  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.08.20.
	Now outputting Metapost code to \filename{3DLDFput.mp} instead of \filename{subpersp.mp}.

	* persp.mp: LDF 2003.08.20.
	Now inputting \filename{3DLDFput.mp} instead of \filename{subpersp.mp}.

	* subex1.web, subex2.web, transfor.web, utility.web, solfaced.web, solids.web, rectangs.web, shapes.web, polyhed.web, pspglb.web, points.web, polygons.web, pictures.web, planes.web, paths.web, patterns.web, parser.web, loader.web, lines.web, layers.web, io.web, ellipses.web:
	LDF 2003.08.20.  Changed ``Göttingen'' to ``Goettingen'' in comment at
	beginning of file.

	* curves.web, main.web:
	LDF 2003.08.20.  Changed ``Göttingen'' to ``Goettingen'' in comment at
	beginning of file.

	Changed |@<Input loop@>| to |@<Get input@>|, and deleted the code that was in it.
	Added a note, that I plan to use Flex and Bison to handle scanning and parsing input,
	but that I haven't started work on this yet.

	* colors.web, colall.web, circles.web:
	LDF 2003.08.20.  Changed ``Göttingen'' to ``Goettingen'' in comment at
	beginning of file.

	* 3DLDFprc.web: LDF 2003.08.20.
	Added copyright and license information to the beginning of the
	file.

	No longer changing the extensions of the \filename{.c} files to
	\filename{.cxx} for GCC 2.95, because I'm now calling g++ with
	the ``-x cxx'' option.

	Now calling ``rm'' with the ``-f'' option.  This suppresses warning messages,
	when files don't exist.

	* persp.tex: LDF 2003.08.20.
	Added copyright and license information to the beginning of the
	file.

	* persp.base:
	LDF 2003.08.20.  Fixed the copyright and licensing information.  It used
	CWEB comments and double at-signs.

	* persp.base: LDF 2003.08.20.
	Added copyright and license information to the beginning of the
	file.

	* 3DLDFcpl.web: LDF 2003.08.20.
	Added copyright and license information to the beginning of the
	file.

	Now calling the shell function ``rm'' with the ``-f'' option.  This
	suppresses warning messages, when the files don't exist.

	* 3DLDF.web, cuboid.web:
	LDF 2003.08.20.  Changed ``Göttingen'' to ``Goettingen'' in comment at
	beginning of file.

	* persp.mp: LDF 2003.08.20.  Removed some commented-out code.  Removed
	the declaration |picture v[]|.

	* curves.web: LDF 2003.08.19.  In |segment()|:
	BUG FIX.
	Added |unsigned short subpath_size|.  Changed the way the subpath is
	created, when |closed| is |true|.  Now concatenating the curved
	subpath with the straight line segment from the last to the first
	|Points| of the subpath using |"&"|.

	* paths.web: LDF 2003.08.20.  In |show()|:
	Now printing |points.size()| and |connectors.size()|
	to |stdout|.  If the latter is 0, a message is printed, that |"--"| will
	be used as the connector.

2003-08-18  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.08.18.
	Changed, so that |main()| now returns an |int| explicitly.
	0 is returned at the end of |main()|.

	* 3DLDFcpl.web: LDF 2003.08.18.
	Removed a CWEB heading, that had no code in it.

	* 3DLDF.web: LDF 2003.08.18.
	Now including \filename{3DLDFcpl.web}, rather than \filename{cmplprsp.web},
	which is the old name of the former.

	* 3DLDFprc.web: LDF 2003.08.18.
	Combined \filename{procLIN.web} and
	\filename{procDEC.web} into this file, and renamed it
	\filename{3DLDFprc.web}.  It contains conditionally compiled code, so
	that it can be used for compiling with the DEC \CPLUSPLUS/ compiler
	under Compaq Tru64, and with both GCC 2.95 and GCC 3.3 under Linux.

	Added note to myself, to clean up the conditionally compiled code.  I
	think it could be neater.

	* 3DLDFcpl.web: LDF 2003.08.18.
	Combined \filename{cmplLIN.web} and
	\filename{cmplDEC.web} into this file, and renamed it
	\filename{3DLDFcpl.web}.  It contains conditionally compiled code, so
	that it can be used for compiling with the DEC \CPLUSPLUS/ compiler
	under Compaq Tru64, and with both GCC 2.95 and GCC 3.3 under Linux.

	Added note to myself, to clean up the conditionally compiled code.  I
	think it could be neater.

2003-08-17  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 3DLDFcpl.web: LDF 2003.08.17.  Added notes to myself.

	* 3DLDFcpl.web, 3DLDFprc.web, 3DLDFvar.web: New file.

	* io.web:
	LDF 2003.08.17.  Made |silent| non-|const| in |beginfig()| and
	|endfig()|.  It needs to be non-|const|, because it will be set
	to |true|, if |SILENT_GLOBAL| is |true|.

	* 00TODO: LDF 2003.08.17.  Added items.

	* 3DLDF.web:
	LDF 2003.08.17.  Edited copyright information and added information
	about contacting the author.

	* main.web:
	LDF 2003.08.17.  Edited copyright information and added information
	about contacting the author.

	Also, changed the way copyright and version information is printed
	to standard output when 3DLDF is run.  Information about the
	GNU Public License is now printed, too.

	* utility.web, subex1.web, subex2.web, transfor.web, shapes.web, solfaced.web, solids.web, rectangs.web, polyhed.web, pspglb.web, points.web, polygons.web, patterns.web, pictures.web, planes.web, paths.web, parser.web, lines.web, loader.web, io.web, layers.web, ellipses.web, curves.web, cuboid.web, colors.web, colall.web, circles.web:
	LDF 2003.08.17.  Edited copyright information and added information
	about contacting the author.

	* utility.web, transfor.web, subex2.web, subex1.web, solids.web, solfaced.web, shapes.web, rectangs.web, pspglb.web, polyhed.web, polygons.web, points.web, planes.web, pictures.web, patterns.web, paths.web, parser.web, main.web, loader.web, lines.web, layers.web, io.web, ellipses.web, curves.web, cuboid.web, colors.web, colall.web, circles.web:
	LDF 2003.08.17.  Added copyright and license notices, followed by ``Control-L'',
	to end a page.  Put ``Control-L'' before the Emacs Local-Variables list.

	* 3DLDF.web: LDF 2003.08.17.  Added {\TeX} text.

	Added copyright and license notices, followed by ``Control-L'', to end a page.
	Put ``Control-L'' before the Emacs Local-Variables list.

	* utility.web, transfor.web: LDF 2003.08.17.
	Changed value of the Emacs local variable |run-cweave-on-file| from
	"cwdriver.web" to "3DLDF.web".

	* solids.web: LDF 2003.08.17.  Formatting change.
	Also, changed value of the Emacs local variable |run-cweave-on-file| from
	"cwdriver.web" to "3DLDF.web".

	* solfaced.web, shapes.web, rectangs.web, polyhed.web: LDF 2003.08.17.
	Changed value of the Emacs local variable |run-cweave-on-file| from
	"cwdriver.web" to "3DLDF.web".

	* polygons.web, points.web: LDF 2003.08.17.  Formatting changes.
	Also, changed value of the Emacs local variable |run-cweave-on-file| from
	"cwdriver.web" to "3DLDF.web".

	* pictures.web, patterns.web, parser.web: LDF 2003.08.17.
	Changed value of the Emacs local variable |run-cweave-on-file| from
	"cwdriver.web" to "3DLDF.web".

	* main.web: LDF 2003.08.17.  Formatting change.

	* loader.web:
	LDF 2003.08.17.  Removed ``@i 3DLDFvar.web''.  The latter file doesn't exist.

	* lines.web, layers.web, io.web: LDF 2003.08.17.
	Changed value of the Emacs local variable |run-cweave-on-file| from
	"cwdriver.web" to "3DLDF.web".

	* curves.web: LDF 2003.08.17.  Formatting change.
	Also, changed value of the Emacs local variable |run-cweave-on-file| from
	"cwdriver.web" to "3DLDF.web".

	* cuboid.web, colors.web, colall.web: LDF 2003.08.17.
	Changed value of the Emacs local variable |run-cweave-on-file| from
	"cwdriver.web" to "3DLDF.web".

	* circles.web: LDF 2003.08.17.  Formatting change.

2003-08-15  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: LDF 2003.08.15.  Added an item.

	* utility.web:
	LDF 2003.08.15.  Changed |dotlabel()| to |label()| in one place in
	|make_perspective_frame()|.

	* utility.web:
	LDF 2003.08.15.  In |persp_0()|:  Added code for explanations of the
	abbreviations.

	* polyhed.web: LDF 2003.08.15.  Added ``TO DO'' note to myself.

	* polyhed.web: LDF 2003.08.15.  Formatting changes.

2003-08-14  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.08.14.  No significant changes.

	* 00TODO: LDF 2003.08.14.  Added items.

	* circles.web: LDF 2003.08.14.  In |operator=(const Ellipse& e)|:
	Added code for handling the case that |e.axis_v| and
	|e.axis_h| differ by a small amount, possible due to imprecision.

	* pspglb.web:
	LDF 2003.08.14.  Added |SILENT_GLOBAL|, |VERSION_3DLDF|, and
	|COPYRIGHT_3DLDF|.

	* polygons.web, paths.web:
	LDF 2003.08.14.  Changed ``C++'' to ``\CPLUSPLUS/'' in {\TeX} text.

	* main.web:
	LDF 2003.08.14.  Added code for handling the ``--silent'' option
	to |@<GCC command line option processing@>|,
	including the constant |SILENT_INDEX|.

	Added the sections |@<Print version and copyright information@>|,
	|@<GCC 2.95 print version and copyright information@>|, and
	|@<GCC 3.3 and DEC print version and copyright information@>|.
	The first one includes
	one of the others, according to whether the preprocessor
	variable |LDF_GCC_2_95| is defined.  In other words, the way
	the version and copyright information is printed to standard output is
	determined by conditional compilation.

	Added CWEB commands for section headings and Emacs outline-minor-mode
	heading comments for the new sections.

	* loader.web: LDF 2003.08.14.  Now including \filename{streambuf.h}, if
	|LDF_GCC_2_95| is defined, otherwise \filename{ios}.  This is for
	stream formatting.

	* pspglb.web: LDF 2003.08.14.
	Now declaring and defining my own version of |trunc()| if the
	preprocessor variable |LDF_GCC_2_95| is defined, and not if
	|__GNUC__| is defined.  This is because the library version of |trunc()|
	is found when compiling with GCC 3.3 under Linux.

	Edited the {\TeX} text for the declaration of my version of
	|trunc()|.

	* paths.web: LDF 2003.08.14.
	In |is_planar()|, |is_linear()|, and |is_in_triangle()|:
	Setting |verbose| to |true| if
	|VERBOSE_GLOBAL| is |true|.
	In |is_planar()| and |is_linear()| I made |verbose| non-|const|.  It wasn't
	|const| before in |is_in_triangle()|.

	Added |VERBOSE_GLOBAL| to
	\filename{pspglb.web} today.

	* main.web: LDF 2003.08.14.
	Added the section |@<Process command line options@>|.
	It conditionally includes one of the likewise new sections
	|@<GCC command line option processing@>| or
	|@<DEC command line option processing@>|. Which of them is included is
	controlled by conditional preprocessor code.

	So far, I've only started to implemented command line option processing
	for the GCC/Linux versions.  Valid options are currently:
	--help, --verbose, and --version.

	* ellipses.web: LDF 2003.08.14.  Made |verbose| argument to
	|intersection_points(Ellipse e, bool verbose)| non-|const|.
	It's now set to |true|, if |VERBOSE_GLOBAL| is |true|, and I didn't
	notice that it was |const| before checking in the last version.

	* circles.web: LDF 2003.08.14.  Made |verbose| argument to
	|intersection_points(const Circle& c, bool verbose)| non-|const|.
	It's now set to |true|, if |VERBOSE_GLOBAL| is |true|, and I didn't
	notice that it was |const| before checking in the last version.

	* loader.web:
	LDF 2003.08.14.  Now including \filename{getopt.h} for the GCC
	versions under Linux.  It's for processing the command line options.

	* ellipses.web:
	LDF 2003.08.14.  In |intersection_points(Ellipse e, const bool verbose)|:
	Setting |verbose| to |true| if |VERBOSE_GLOBAL| is
	|true|.  Added |VERBOSE_GLOBAL| to \filename{pspglb.web} today.

	* circles.web:
	LDF 2003.08.14.  In |intersection_points(const Circle& c, const bool verbose)|:
	Setting |verbose| to |true| if |VERBOSE_GLOBAL| is
	|true|.  Added |VERBOSE_GLOBAL| to \filename{pspglb.web} today.

	* pspglb.web:
	LDF 2003.08.14.  Moved the declaration and definition of |trunc()|.
	They are only compiled for the Linux versions using GCC, because the
	library function isn't available for some reason.  I've already written
	a note to myself to find out why not.  It is available when using
	the DEC compiler.

	Added the global variable |bool VERBOSE_GLOBAL|.  It is |false| by default,
	and can be set to |true| by using the "--verbose" command line argument
	(in the GCC versions for LINUX).  If it's |true|, the local |verbose| variables
	in functions are set to |true|.

2003-08-12  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* Makefile:
	LDF 2002.08.12.  Changed the ``3dldf'' target to ``compile''.  It is the
	default target.  It no longer changes the directory, since
	the directories for the different platforms and/or compilers should contain
	symbolic links to this file.
	The code for DEC is commented-out.

	* polyhed.web:
	LDF 2002.08.12.  Changed |Icosahedron::draw_net()|, so that the net is
	drawn in the x-z plane.  Also, it returns before the code for making the tabs
	is executed, since it doesn't work yet.  Added ``TO DO'' note to myself, to
	get the tabs to work.

	* polyhed.web:
	LDF 2002.08.12.  Removed the |center_0| argument from the |Tetrahedron|,
	|Dodecahedron|, |Icosahedron|, and |Trunc_Octahedron| versions
	of |get_net()|.

	* polyhed.web: LDF 2002.08.12.  Removed |center_0| argument from
	|Tetrahedron::get_net()|.

	* polyhed.web:
	LDF 2002.08.12.  Rewrote the non-default |Tetrahedron| constructor.
	It now works properly.

2003-08-10  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* cuboid.web:
	LDF 2003.08.10.  Removed the data member |dihedral_angle| from |class Cuboid|.

	* polyhed.web:
	LDF 2003.08.10.  Started to fix the non-default |Tetrahedron| constructor.

	* solids.web: LDF 2003.08.10.  Made |get_center()| |const|.

	Removed the pen argument for |fill()| and |unfill()|, and
	changed |@<Process vectors for |fill()|@>| and
	|@<Process vectors for |unfill()|@>|, so that pen is set to |""|.

	* polyhed.web: LDF 2003.08.10.  Minor correction.

	* polyhed.web:
	LDF 2003.08.10.  Commented-out some debugging code in the non-default
	|Dodecahedron| constructor.

	* polyhed.web:
	LDF 2003.08.10.  Rewrote the non-default |Dodecahedron| constructor.
	It had suddenly stopped
	working properly, probably because of changes I made to
	|Transform::align_with_axis()|.  I'm still not entirely happy with the
	way I've had to specify the rotations.  I've added a ``TO DO'' note to do something
	about this.

	* circles.web:
	LDF 2003.08.10.  Removed redefinition of the default argument
	from the definition of |create_new_circle(const Circle* p = 0)|.
	The DEC compiler complained, but GCC didn't.

	* patterns.web:
	LDF 2003.08.10.  Added ``TO DO'' note to |hex_pattern_1()|:
	Change it, so that it's possible to put the pattern into a
	rectangular area.

2003-07-27  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex, main.web: LDF 2003.07.27.  No significant changes.

	* curves.web:
	LDF 2003.07.27.  Made |segment()|, |half()|, and |quarter()| |const|.  Added
	``TO DO'' note to myself, to make arguments |const|, where possible.

	* 00TODO: LDF 2003.07.27.  Added items.

	* circles.web:
	LDF 2003.07.27.  Made both versions of |create_new_circle()| non-inline.
	In the version with a |Circle*| argument, I've made it a |const Circle*|.

	* ellipses.web: LDF 2003.07.27.
	In |intersection_points(const Point&, const Point&)|:
	Made the arguments |const Point&|.

	In |intersection_points(const Path&)|:
	Made the argument a |const Path&|.  Changed, so that
	|is_linear()| is used, and |get_last_point()| rather than
	|get_point(1)|.

	* ellipses.web:
	LDF 2003.07.27.  Made |angle_point()| and its |real angle| argument |const|.  Now
	using |get_center()| instead of |center|.  Added ``TO DO'' note, to get rotation to
	always be in the direction I want.

	* points.web:
	LDF 2003.07.27.  In |angle()|:  Made the argument |p| a |const Point&|.
	No longer copying |*this|.  Now using |dot_product()| instead of
	calculating the angle ``by hand''.
	Simplified the code of the function.

	* ellipses.web:
	LDF 2003.07.27.  Corrected a typo in the math mode material showing the
	coefficients in the {\TeX} section describing |get_coefficients()|.

	* ellipses.web: LDF 2003.07.27.
	Declaring |axis_h_half| and |axis_v_half| as |real| in the non-default
	constructor.  I forgot to do this when I added them.

	Made |is_cubic()| and |is_quartic()| |virtual| and non-inline.

	* ellipses.web:
	LDF 2003.07.27.  Added |numerical_eccentricity|, and code for calculating and
	recalculating it.

	* ellipses.web:
	LDF 2003.07.27.  Changes to debugging code in |location()|.

	Changed name of |eccentricity| to |linear_eccentricity|.

	In |do_transform()|:  Now setting |linear_eccentricity| to |INVALID_REAL|,
	if |*this| has become non-elliptical.

2003-07-26  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* sub_purge:
	LDF 2003.07.26.  Changed the conditional testing the subdirectories,
	to account for the fact
	that I now have two LINUX directories, one for compiling with
	GCC 2.95, and one for compiling with GCC 3.3.

	* arch_3DLDF:
	LDF 2003.07.26.  Changed ``CWEBS'' variable, to account for the fact
	that I now have two LINUX directories, one for compiling with
	GCC 2.95, and one for compiling with GCC 3.3.

	* Makefile:
	LDF 2003.07.26.  Changed ``purge'' target, to account for the fact
	that I now have two LINUX directories, one for compiling with
	GCC 2.95, and one for compiling with GCC 3.3.

2003-07-25  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* curves.web:
	LDF 2003.07.25.  Minor changes to debugging code in |location()|.

	* circles.web: LDF 2003.07.25.  Added |is_circular()|.

	* ellipses.web:
	LDF 2003.07.25.  Added |focus0|, |focus1|, and |eccentricity| to
	|class Ellipse| and added code for setting them in the non-default
	constructor.

	In |is_elliptical()|: Now checking |normal == INVALID_POINT|.  If it is,
	|is_elliptical()| returns |false|.

	Removed some commented-out code, and an explanatory comment from
	|solve()|.

	Added |const| and non-|const| versions of |get_focus()|.

	Added |get_eccentricity()|.

	Bug fixes in all versions of |get_axis_h()| and |get_axis_v()|:
	|axis_h| and |axis_v| were too small by half.
	Now multiplying them by 2.

	Added |location()|.  It overloads |Reg_Cl_Plane_Curve::location()|.
	It's simpler, because it doesn't need to copy the |Ellipse| and transform
	the copy into a major plane.  Nor does it require the use of
	|solve()|.

	In |do_transform()|:  Added code for recalculating |eccentricity|, |focus0|
	and |focus1|.  Bug fix: When |axis_h| and |axis_v| were recalculated, they
	were too small by half.  Now multiplying them by 2.

	Changed |rotate()| and |shift()|, so that |do_transform()| is called with
	|check == false|.  Rotating and shifting shifting can neither change the
	lengths of |axis_h| or |axis_v| nor make an |Ellipse| non-elliptical,
	so there's no need to check |*this| after rotation or shifting.

	In |shift_times()|:  |Point::shift_times()| is now performed |focus0| and
	|focus1|.

	* ellipses.web:
	LDF 2003.07.25.  In |is_elliptical()|:  Now checking |normal == INVALID_POINT|.
	If it is, |is_elliptical()| returns |false|.

	* ellipses.web:
	LDF 2003.07.25.  Changed |rotate()| and |shift()|, so that |do_transform()|
	is called with |check == false|.  Rotation and shifting can neither change the
	lengths of |axis_h| or |axis_v|, nor make an |Ellipse| non-elliptical,
	so there's no need to check the |Ellipse| after rotation or shifting.

	* run_mp:
	LDF 2003.07.25.  Made changes accounting for the fact that I now
	have two directories for compiling under Linux, one using
	GCC 2.95, and one using GCC 3.3.

	* loader.web: LDF 2003.07.25.  Now including \filename{3DLDFvar.web}.
	It contains
	|#define| and |#undef| preprocessor commands for conditional compilation.
	There's a different version of this file in each of the subdirectories
	used for compiling with a different combination of operating system,
	compiler, and compiler version.

	LDF 2003.07.25.  Modified the conditional constructions governing
	compilation slightly.

2003-07-20  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* ellipses.web:
	LDF 2003.07.20.  Rewrote |get_axis_h()| and |get_axis_v()| and added non-|const|
	versions.  They now recalculate the value |axis_h| or |axis_v| should have,
	and return |INVALID_REAL|, if the |Ellipse| is no longer elliptical.  The non-|const|
	versions reset the value of |axis_v| or |axis_h| appropriately.

	Added |do_transform()|.  It makes it possible to perform a transformation on
	an |Ellipse| without calling |is_elliptical()|.  It is called inside
	|is_elliptical()|, which prevents |operator*=()| and |is_elliptical()| from
	calling each other {\it ad infinitum}.

	Changed |operator*=()| so that it calls |do_transform()| with |check == true|.

	Now calling |get_axis_h()| and |get_axis_v()| in
	|solve()|, |get_coefficients()|, |angle_point()|,
	and |intersection_points(Ellipse e)|, instead of accessing |axis_h| and
	|axis_v| directly.

	* ellipses.web: LDF 2003.07.20.  Added |is_elliptical()|.

	Added ``TO DO'' note regarding |intersection_points(Ellipse)|.
	This function failed to find one of the two intersections, when called
	with a |Circle| argument.

	Formatting changes.

	* 00TODO: LDF 2003.07.20.  Added an item.

	* circles.web: LDF 2003.07.20.  Wrote the definition of
	|intersection_points(const Circle&, const bool)|.
	Tested all cases.  It should probably be tested more thoroughly.

	* 3DLDF.web: LDF 2003.07.20.  No significant changes.

2003-07-18  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* circles.web: LDF 2003.07.18.
	Working on
	|intersection_points(const Circle& c, const bool verbose = false)|.

	* rectangs.web:
	LDF 2003.07.18.  Bug fix in the non-default |Rectangle| constructor:
	Now, |axis_h| and |axis_v| are no longer divided by 2, when I initialize
	|axis_h_half| and |axis_v_half|.
	I mistakenly used |/=| instead of |/|.

	Made |get_mid_point()| |const|.

	Added |get_axis_h()| and |get_axis_v()|.

	Added the declarations of |out_ellipse()|, |in_ellipse()|,
	|draw_out_ellipse()|, and |draw_in_ellipse()|.  They must be defined
	in \filename{ellipses.web}, because |Ellipse| is an incomplete type in
	this file.

	* ellipses.web:
	LDF 2003.07.18.  Made |out_rectangle()|, |in_rectangle()|,
	|draw_out_rectangle()|, and |draw_in_rectangle()| |const|.

	Added the definitions for |Rectangle::out_ellipse()|,
	|Rectangle::in_ellipse()|, |Rectangle::draw_out_ellipse()|,
	and |Rectangle::draw_in_ellipse()|.  These functions are declared
	in \filename{rectangs.web}, but must be defined here, because
	|Ellipse| is an incomplete type in that file.

	* polygons.web: LDF 2003.07.18.  Moved the transformation functions,
	|operator*=(const Transform&)|, and |get_center()| from |Reg_Polygon|
	to |Polygon|.  Also removed the |Rectangle| versions in
	\filename{rectangs.web}.  Since |Reg_Polygon| and |Rectangle| are derived
	from |Polygon|, they inherit the |Polygon| versions of these functions.

	* rectangs.web: LDF 2003.07.18.  Removed the transformation functions,
	|operator*=(const Transform&)|, and |get_center()|.
	Also moved the |Reg_Polygon| versions to |Polygon| in
	\filename{polygons.web}.  Since |Reg_Polygon| and |Rectangle| are derived
	from |Polygon|, they inherit the |Polygon| versions of these functions.

	* loader.web:
	LDF 2003.07.18.  Moved a comment into {\TeX} text.  Set |LDF_GCC_3_3| to 0, in
	order to compile using GCC 2.95.3.  This speeds linking.

	* polyhed.web: LDF 2003.07.18.
	This version is the first after porting to GCC 3.3.

	In the declaration and initialization of
	|Dodecahedron::dihedral_angle|:  Now passing ``2.0'' instead
	of ``2.0'' as the argument to |atan()|.
	GCC 3.3 couldn't compile this file, the way it
	was before.

	* paths.web: LDF 2003.07.18.
	This version is the first after porting to GCC 3.3.

	Changed |align_with_axis(bool, const char axis)|,
	so that |is_linear()| is used, rather than
	|get_line_switch()|.  Also, changed the way |Transform t| is set.

	The latter change was necessary, because GCC 3.3 couldn't compile this
	file the way it was before.

	* loader.web:
	LDF 2003.07.18.  Changed |TEST_PORT| to |LDF_GCC_3_3|, since I've
	succeeded in porting 3DLDF from GCC 2.95.3 to GCC 3.3.

	* loader.web:
	LDF 2003.07.18.  Forgot to mention at last check-in, that I've added
	``|using namespace std|''.  This is needed with GCC 3.3, but not with
	GCC 2.95 or the DEC C++ compiler.

	* points.web: LDF 2003.07.18.
	Porting to
	gcc version 3.3 20030226 (prerelease) (SuSE Linux)
	from
	gcc version 2.95.3 20010315 (SuSE).

	Replaced |dynamic_cast<Shape*>| with |static_cast<Shape*>| in
	|get_copy()|, |drawdot()|, and |undrawdot()|.  This file failed to
	compile, the way it was before.  Somewhat to my surprize, this
	change worked with the old gcc version 2.95.3.  This being the case,
	I'm not sure why I used |dynamic_cast| in the first place, since I prefer
	|static_cast|, when it can be used.  The change also works with the DEC compiler.

	Changed |factor| in |operator==()| from |real| to |unsigned short|.  It's
	passed to |clean()|, which takes an |int|.  Neither the old GCC nor the
	DEC compiler considered this an error, but the new GCC did.

	* pictures.web: LDF 2003.07.18.
	Porting to
	gcc version 3.3 20030226 (prerelease) (SuSE Linux)
	from
	gcc version 2.95.3 20010315 (SuSE).

	In the declaration of |class Label|:  Replaced
	``|friend Point; friend Picture;|''
	with ``|friend class Point; friend class Picture;|''.
	This file failed to compile before I made this change.

	* loader.web:
	LDF 2003.07.18.  Added |#define TEST_PORT| for conditional code needed
	for my port to gcc version 3.3 20030226 (prerelease) (SuSE Linux).
	I set it to 1 for testing the port, 0 for the old compiler version:
	gcc version 2.95.3 20010315 (SuSE).

	I've started testing porting already.  Currently, all files up to and including
	\filename{points.web} is compiled correctly.  Will freeze a configuration
	before continuing.

2003-07-16  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.07.16.  No significant changes.

	* polygons.web: LDF 2003.07.16.  Added a ``TO DO'' comment.

	* io.web:
	LDF 2003.07.16.  Minor changes in messages printed by |beginfig()| and
	|endfig()| to |stdout|.

	* io.web: LDF 2003.07.16.  Made |beginfig()| and |endfig()| non-inline.

	* io.web:
	LDF 2003.07.16.  The global variable |fig_num|, for keeping track of what figure
	3DLDF is processing.

	Added |silent| argument to |beginfig()| and |endfig()|, and messages printed
	conditionally to |stdout| by these functions, saying which figure is being
	begun or ended.
	This should help in finding where errors occur.

	* curves.web:
	LDF 2003.07.16.  Minor correction:  Added a ``@'', which CWEB needed.

	* curves.web: LDF 2003.07.16.
	Changed name of |center| argument to |ref_pt| in |location()| and
	|intersection_points()|, because I've made |center| a
	data member of |Reg_Cl_Plane_Curve|.

	* curves.web, circles.web:
	LDF 2003.07.16.  Removed ``segment'' functions, i.e., |segment()|,
	|half()|, and |quarter()| from |Circle| and put them in
	|Reg_Cl_Plane_Curve|.

	* curves.web: LDF 2003.07.16.  Added |center| to declaration of
	|class Reg_Cl_Plane_Curve|.
	It was formerly a member of |Ellipse|.

	* ellipses.web:
	LDF 2003.07.16.  Removed |center| from declaration of |class Ellipse|.
	|center| is now a member of |Reg_Cl_Plane_Curve|.

	* paths.web:
	LDF 2003.07.16.  Removed |friend Circle| declaration from declaration of
	|class Path|.

	I'm about to make some changes, in order to move the
	``segment'' functions from |Circle| to |Reg_Cl_Plane_Curve|.  I'm going to
	check all the files back in, and freeze a configuration, because I had some
	problems the first time I tried to do this.

	* circles.web:
	LDF 2003.07.16.  In |segment()|:  No longer accessing |Path::connectors| directly,
	but using |Path::operator+=(const string)| instead.  This will make it possible
	to removed the ``|friend Circle|'' declaration from |class Path|.

	I'm about to do that, and make some other changes, in order to move the
	``segment'' functions from |Circle| to |Reg_Cl_Plane_Curve|.  I'm going to
	check all the files back in, and freeze a configuration, because I had some
	problems the first time I tried to do this.

	* pspglb.web:
	LDF 2003.07.16.  Added forward declaration of |Ellipse|.  It's needed,
	because I've declared |Ellipse| to be a |friend| of |Path|.  Formerly,
	|Circle| was a |friend| of |Path|, but now it must be |Ellipse|,
	because I've made the ``segment'' functions |segment()|, |half()|, and
	|quarter()| members of |Ellipse| instead of |Circle|.

	* paths.web:
	LDF 2003.07.16.  In |subpath()|:  Changed the arguments |start| and |end| back
	to non-|const|.  Their values are set when certain conditions apply, so they
	couldn't be |const|.

	* paths.web:
	LDF 2003.07.16.  Added a |const| version of |reverse()|, and simplified the
	original version, that now should only be used when |*this| itself should be
	reversed.

	* paths.web: LDF 2003.07.16.  Made both versions of |filldraw() const|.

	Made the |size_t| arguments |start| and |end| of |subpath()| |const|.

	* points.web: LDF 2003.07.16.  Added a ``TO DO'' comment.

2003-07-13  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.07.13.
	Added |test_curve_intersections()|, and sections for it.

	* paths.web:
	LDF 2003.07.13.  Made |ddashed| and |ppen const| in both versions of
	|draw_axes()|.

	* paths.web: LDF 2003.07.13.  Made all versions of |draw_help() const|.

	* points.web: LDF 2003.07.13.  Made |draw_help() const|.

	* paths.web:
	LDF 2003.07.13.  Changed |rotate(const Path&, const real)|,
	so that |is_linear()| is used instead of checking the return
	value of |get_line_switch()|.  Also,
	|get_last_point()| passed as the second argument to |rotate()|,
	instead of |get_point(1)|.

	* paths.web:
	LDF 2003.07.13.  Put ``Rotation around an arbitrary axis'' after
	``Rotation around the main axes'', and put both of them under the heading
	``Rotation''.

	* paths.web: LDF 2003.07.13.  Removed outdated comment.

	* paths.web:
	LDF 2003.07.13.  In |show()|:  Commented-out the line that prints
	|fill_draw_value| to |stdout|.

2003-07-11  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web: LDF 2003.07.11.
	Added the definition of |Point::get_normal(const Point&, const Point&)|.
	It is declared in \filename{points.web}, but it must be defined here,
	because it calls |Path::get_normal()|.

	* points.web: LDF 2003.07.11.
	Added the declaration of |Point::get_normal(const Point&, const Point&)|.
	It must be defined in \filename{paths.web}, because it
	uses a |Path| in its definition, which is an incompletely defined type
	in this file.

	* points.web: LDF 2003.07.11.  Changed |dot_product()|, so that if the
	dot product is less than |Point::epsilon()|, 0 will be returned.

	* points.web: LDF 2003.07.11.
	In |project(const Focus& f, const unsigned short proj, real factor)|:
	Added defaults for |proj| and |factor|.

	Made |drawdot()| |const|, and also made its |ppen| argument |const|.

2003-07-09  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* circles.web:
	LDF 2003.07.09.  Added versions of |intersection_points()| with
	|Point| and |Path| arguments.  The merely call the |Ellipse| versions.
	They are needed, because without them, neither GCC nor the DEC compiler can
	resolve a call to the |Ellipse| versions through a |Circle| object, after I've
	declared a |Circle| version with a |Circle| argument.

	* ellipses.web:
	LDF 2003.07.09.  Made |intersection_points(Path p)| |virtual|.

	* paths.web:
	LDF 2003.07.09.  Made arguments to one version each of |label()|
	and |dotlabel()| |const| in the definitions.  I had already made them |const| in
	the declarations, but forgot to do so in the definitions.  GCC didn't catch the
	errors, but the DEC compiler issued warninigs.

	* points.web:
	LDF 2003.07.09.  Made the arguments |const| in |Focus::show()|.

	* points.web: LDF 2003.07.09.  Added |Focus::get_direction()|.

	In |Focus::get_transform_element()| and |Focus::get_persp_element()|:
	Changed the |const unsigned int| arguments to |const unsigned short|.

	* paths.web: LDF 2003.07.09.  Corrected minor typographical error.

	* paths.web: LDF 2003.07.09.  Made |text_short|, |position_string|, and
	|dot| arguments |const|, where possible, in the various versions of |label()| and
	|dotlabel()|.

	Minor formatting changes.

	* ellipses.web, points.web: LDF 2003.07.09.  Minor formatting changes.

	* points.web:
	LDF 2003.07.09.  Made |text_str|, |text_short|, |position_str|, and
	|dot| arguments |const| in the various versions of |label()| and
	|dotlabel()|.

	* points.web:
	LDF 2003.07.09.  Made |operator==()| non-|const| and added a new |const| version,
	that calls the non-|const| one.

2003-07-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: LDF 2003.07.06.  Added items.

	* paths.web: LDF 2003.07.06.  Minor formatting change.

	* paths.web:
	LDF 2003.07.06.  Changed |Transform::rotate(const Path&, const real)|,
	so that |is_linear()| is used, instead of |get_line_switch()|.

	* points.web:
	LDF 2003.07.04.  Now calling |persp.set_element()| instead of
	accessing the elements of |persp| directly in
	the |Focus| constructor taking seven |real| arguments and |reset_angle()|.

	Made |get_transform_element()| and |get_persp_element()|
	non-inline.  They now call
	|Transform::get_element()| instead of accessing |transform.matrix|
	directly.

	It is no longer possible to access |Transform| elements directly,
	because |Focus| is no longer a |friend| of |Transform|.

	* circles.web: LDF 2003.07.06.  Added
	|intersection_points(const Circle&, const bool)|
	and started writing the
	definition.  It is commented-out, because when it's not, GCC fails to
	resolve a call to the |Point| version of
	|Ellipse::intersection_points()|, when |*this| is a |Circle|.  I don't
	think this should happen.  I haven't checked whether it does with the
	DEC compiler yet.

	* ellipses.web:
	LDF 2003.07.06.  In |intersection_points(Ellipse, const bool)|:
	Made a minor change to the conditional that
	determines whether the |Ellipses| are coplanar or not.

2003-07-04  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transfor.web:
	LDF 2003.07.04.  Removed |friend| declaration for |Focus|.  Added
	|set_element()| and |get_element()|, which are used in the |Focus|
	functions, so the latter need no longer be a |friend| of |Transform|.

	* curves.web: LDF 2003.07.04.
	Removed unreachable statement at end of
	|intersection_points(Point, Point, Point)|:  |return bpp|.
	GCC didn't complain, but the DEC compiler issued a
	warning.

	* polygons.web:
	LDF 2003.07.04.  In |draw_out_circle()| and |draw_in_circle()|:
	Removed default argument for |picture|.  Having one
	made it impossible for the compiler to resove calls to
	these functions with no arguments.

	* paths.web: LDF 2003.07.04.  In |intersection_point()|:
	Added |trace| argument.  Added conditional using
	|trace| to choose which version of |Point::intersection_point()|
	should be called.  Changed so that
	|is_linear()| is used instead of |get_line_switch()|.  Now using
	|get_last_point()| instead of |*points[1]|.

2003-07-01  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* ellipses.web:
	LDF 2003.07.01.  Changed the return values of |draw_in_rectangle()| and
	|draw_out_rectangle()| from |void| to |Rectangle|.

	* curves.web: LDF 2003.07.01.
	Added argument |suppress_warnings| to |location()|.

	In |intersection_points()|:
	Added |true| as |silent| argument to |unit_vector()|
	when I call it on |cross|.  This prevents |unit_vector()| from issuing
	a warning message, when |cross| has magnitude 0, which occurs when
	|surface_vector| and |pt_vector| are colinear.  Since this case is
	handled correctly, the warning messages are unnecessary and distracting.

	Bug fix in |intersection_points(Point center, Point p0, Point p1)|:
	Made changes to the way |on_segment| is used in the coplanar case.
	The way it was before handled certain cases wrong.

	* ellipses.web:
	LDF 2003.07.01.  Bug fix in |angle_point()|:  Now returning |bpp.first.pt|
	if it's not equal to |INVALID_POINT|.  Otherwise, |bpp.second.pt| is
	returned.  The latter may be a valid |Point|, or |INVALID_POINT|.
	Before, |INVALID_POINT| was returned if |bpp.first.b| and
	|bpp.second.b| were |false|, but this is the case, if the intersection
	points didn't lie on the line segment between |center| and |pt0|.

	Bug fix in |angle_point()|:  Now checking to make sure that the intersection
	point lies in the proper direction.  Now that the intersection point
	doesn't have to be on the line segment, it's necessary to check this.

	Added argument |suppress_warnings| to |location()|, to correspond
	to the change I've made to |Reg_Cl_Plane_Curve::location()|.

	In |intersection_points(Ellipse e, const bool verbose = false)|:
	Added |verbose| argument.
	Changed ``perpendicular and skew case''.
	Debugged coplanar case, where the |Ellipses| don't have the same
	centers and/or axis orientation.

	Added section |@<Check intersection point locations@>| for use in
	|intersection_points(Ellipse e, const bool verbose = false)|.

	* points.web: LDF 2003.07.01.  Formatting changes in error messages.

	* curves.web:
	LDF 2003.07.01.  In |intersection_points()|:  Added |true| as |silent|
	argument to |unit_vector()| when I call it on |cross|.
	This prevents |unit_vector()| from issuing
	a warning message, when |cross| has magnitude 0, which occurs when
	|surface_vector| and |pt_vector| are colinear.  Since this case is
	handled correctly, the warning messages are unnecessary and distracting.

	* points.web:
	LDF 2003.07.01.  Added a |const bool| argument called ``|silent|'' to
	the non-const version of |unit_vector()|,
	to suppress warning messages.  It isn't possible to add one to the |const|
	version, because this would cause calls to |unit_vector()| with one argument
	to be ambiguous.

2003-06-29  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	LDF 2003.06.29.  Added a |bool| argument called ``|trace|'' to the version of
	|intersection_points()| that finds the intersection point of two lines by finding
	the intersection points of the traces of the lines on the major axes.  Also, commented
	the declaration and definition back in.  So now this function is overloaded.

	I discovered that the vector version now works, probably because of bug fixes involving
	|struct Line|.  However, both versions failed under LINUX in certain cases.
	They did not fail in those cases under Tru64 on the DEC ALPHA computer.  I believe
	the problem is connected with rotation, and has to do with the library routines
	for sine and cosine.  I've accidentally overwritten the code I was using to
	test |intersection_points()| with various rotations, but it wouldn't be hard to
	write it again.  I haven't tested the same cases on the DEC ALPHA, I just discovered that
	the two cases that failed under Linux did not fail under Tru64.

	Formatting changes.

	* paths.web, lines.web: LDF 2003.06.29.  No significant changes.

	* circles.web:
	LDF 2003.06.29.  Removed the default arguments from the definitions of
	|draw_in_circle()| and |draw_out_circle()|:  They should only have been in
	the declarations.  It didn't cause an error when I compiled with GNU CC, but
	it did when I compiled with the DEC C++ compiler.

	* polygons.web: LDF 2003.06.29.  Minor changes to
	|intersection_points(const Point& pt0, const Point& pt1)|.

	Replaced the dummy definition of |intersection_points(const Polygon& r)| with a
	real one.

2003-06-24  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* lines.web:
	LDF 2003.06.24.  Commented the definition |intersection_point()| back in.  This
	is the version using |Lines|.  Debugging it, because it fails sometimes.

	* points.web:
	LDF 2003.06.24.  Debugging |intersection_point()|.  I've started using the
	version using |Lines|, because of problems with the old version, that uses
	traces of the lines on the major planes.

	* polygons.web:
	LDF 2003.06.24.  Working on debugging |intersection_points()|.
	Problems have arisen in |Point::intersection_point()|.

	* points.web:
	LDF 2003.06.24.  Removed the argument |test_points| from |is_in_triangle()|.

	* polygons.web:
	LDF 2003.06.24.  Debugged the non-coplanar case in |Polygon::intersection_points()|.
	Added debugging code.  It now checks whether the intersection point with the plane
	is equal to |center| or one of the vertices before calling
	|Point::is_in_triangle()|.

	About to test the coplanar case.

	* planes.web:
	LDF 2003.06.24.  Fixed bug in |Plane()|:  Formerly, |INVALID_PLANE| was
	returned, if |point == normal|.  This has been changed, so that
	|INVALID_PLANE| is returned, if |normal == origin|.  There is, of
	course, no reason why |point| shouldn't be equal to |normal|.

	* paths.web: LDF 2003.06.24.  Debugged |is_in_triangle()|.

2003-06-20  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polygons.web:
	LDF 2003.06.20.  Minor change to debugging code in |intersection_points()|.

	* curves.web:
	LDF 2003.06.20.  Added version of |intersection_points()| with |Path|
	argument, which must be linear.  It simply takes the first and last |Points|
	on the |Path|, and passes them as arguments to the version of
	|intersection_points()| that takes |Point| arguments.

	* curves.web:
	LDF 2003.06.20.  Finished rewriting |intersection_points()|.  Tested it
	for coplanar lines for planes with various orientations.  I hope that it
	works properly for all planes now!

	* polygons.web:
	LDF 2003.06.20.  In |intersection_points()|:  Now checking |surface_vector|
	against |pt_vector| in the conditional that checks for the case that the
	line and the |Polygon| are coplanar, or lie in parallel planes.

2003-06-17  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* curves.web:
	LDF 2003.06.17.  Working on new version of |intersection_points()|.  The
	non-coplanar section works.  Working on coplanar section.

	* polygons.web: LDF 2003.06.17.  Added ``START HERE'' note to myself.

	* polygons.web:
	LDF 2003.06.17.  Minor change.  Now using |get_point(0)| and |center|
	instead of |get_point(0)| and |get_last_point()| to generate
	|surface_vector| in |intersection_points()|.

2003-06-16  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.06.16.  No significant changes.

	* points.web:
	LDF 2003.06.16.  Minor change in |Transform::align_with_axis()|.

	* curves.web:
	LDF 2003.06.16.  Started debugging |intersection_points()|.  Checking
	in this version, and am about to remove large sections of it in order
	to rewrite it.  Will freeze this configuration.

2003-06-15  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* curves.web:
	LDF 2003.06.15.  Added a bit of error handling code.  Formatting changes.

2003-06-13  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.06.13.  No significant changes.

	* points.web:
	LDF 2003.06.13.  Bug fix in |Transform::align_with_axis()|.

	* curves.web:
	LDF 2003.06.13.  Changed |pt0.epsilon()| to |Point::epsilon()|
	in |location()|.  Minor formatting changes.

	* circles.web: LDF 2003.06.13.  Added the definitions of
	|Polygon::in_circle()|, |Polygon::out_circle()|, |Polygon::draw_in_circle()|,
	and |Polygon::draw_out_circle()|.  Declared in \filename{polygons.web},
	but they must be defined here, because |Circle| is an incomplete type there.

	* polygons.web:
	LDF 2003.06.13.  Defined the version of |Polygon::intersection_points()|
	with |Point| arguments.  The version with a |Path| argument should also work,
	because it simply calls this function.

	Put in a note to myself, to write a real definition for the version
	with a |Polygon| argument.

	* polygons.web:
	LDF 2003.06.13.  Added |get_radius()|, |in_circle()|, |out_circle()|,
	|draw_in_circle()|, and |draw_out_circle()|.

2003-06-11  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* rectangs.web:
	LDF 2003.06.11.  Removed |center| from |Rectangle|, because I've
	made it a member of |Polygon|.

	* polygons.web:
	LDF 2003.06.11.  Made |center| a member of |Polygon|, and removed it from
	|Reg_Polygon|.

	* points.web:
	LDF 2003.06.11.  Added declaration of |Point::is_in_triangle()|.  It's defined
	in \filename{paths.web}.

	* paths.web:
	LDF 2003.06.11.  Added definition of |Point::is_in_triangle()|.

	* lines.web:
	LDF 2003.06.11.  Working on |get_distance()|.  It may work now,
	due to changes I've made to |Line| elsewhere.  Must reread the
	definition and test.

2003-06-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transfor.web: LDF 2003.06.06.  Changed ``|friend struct Focus|'' to
	``|friend class Focus|'' in the declaration of |class Transform|.
	It never caused a problem, because
	|struct| and |class| are interchangeable terms in this context, but
	|Focus| is declared as a |class|, so I thought it best to be consistent.

	* 3DLDF.web: LDF 2003.06.06.  No significant changes.

	* points.web: LDF 2003.06.06.  Changed the case in |label()|, where
	|text_short == WORLD_VALUES| or |text_short == WORLD_VALUES_X_Y|:
	The coordinates surrounded by
	parentheses are now printed out using {\TeX}'s math mode, i.e.,
	``$(x, y, z)$'' instead of ``($x$, $y$, $z$)''.

	* paths.web:
	LDF 2003.06.06.  Added the heading ``|Paths| and |Lines|''.

	Added |get_line()|.

	Added |Line::get_path()|.  It is declared in \filename{lines.web},
	but must be defined in this file, because |Path| is an incomplete type
	there.

	* lines.web: LDF 2003.06.06.  BUG FIX in |get_line()|:
	Changed the call to |Line()|,
	so that the argument for |direction| is |pt - *this| instead
	of |pt|.

	Added declaration of |get_path()|.  It must be defined in \filename{paths.web},
	because |Path| is an incomplete type in this file.

	Removed |magnitude()|.  It doesn't make sense for |Lines|, because
	|direction| is a direction vector, and not a |Point| on a line.  |Lines|
	are conceived of as having infinite extension.

	* planes.web: LDF 2003.06.06.  Added default and copy constructors.

	Modified the constructor
	taking two |Point| arguments, so that arguments are no longer optional.
	I've made this change, because I've added a default constructor.
	Also added conditional to test for case that
	|point| is equal to |normal|.  In this case, a warning message is printed
	to standard error, they are both set to
	|INVALID_POINT|, and |distance| is set to |INVALID_REAL|.

	Added check for self-assignment to |operator=()|.

	* planes.web:
	LDF 2003.06.06.  Changed the constructor, so that if |point| or |normal|
	is equal to |INVALID_POINT|, the other one is also set to
	|INVALID_POINT|, and |distance| is set to |INVALID_REAL|.

	Added |operator=()|, |operator==()|, and |operator!=()|.

	Made |show() const|, and made a minor change to the conditional
	that handles |text|.

	* polygons.web: LDF 2003.06.06.  Added ``START HERE'' note to myself.

	* polygons.web:
	LDF 2003.06.06.  Replaced the definitions of all of the functions in
	the ``|Polygon| Intersections'' section with dummy definitions.
	I will add new definitions, that also handle non-coplanar cases.
	In order to do this, I must add a function for finding whether a
	|Point| is within a triangle.

	* polygons.web:
	LDF 2003.06.06.  Added |class Polygon|.  Changed |class Reg_Polygon|,
	so that it is now derived from |Polygon|, rather than from |Path|.
	Moved the intersections functions from |Reg_Polygon| to |Polygon|.
	I've also changed |Rectangle| so that it too is derived from |Polygon|.
	These changes make it possible to have intersection functions that work for
	both |Reg_Polygon| and |Rectangle|, and for any other classes I may derive
	from |Polygon|.  However, the intersection functions must be changed, so that
	they account for non-coplanar cases!

	* rectangs.web:
	LDF 2003.06.06.  Changed |class Rectangle|, so that it is no longer derived
	from |Path|, but rather from |class Polygon|, which I've added
	today.  I've done so, in order to be able to define intersection functions
	that will work for both |Reg_Polygon| and |Rectangle|.

2003-06-04  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* planes.web:
	LDF 2003.06.04.  Changed |intersection_line(const Plane& pl)| to |const|.

	* paths.web:
	LDF 2003.06.04.  In |get_normal()|:  Changed sign of the normal,
	when it's returned, in the cases where a proper normal is found
	(not |INVALID_POINT| or |origin|).
	Reversing the sign of the normal ensures that it will
	point in the direction of the positive y-axis, when a
	plane figure is created in the x-z plane, using one of the
	constructors taking a |Point| argument for the center, |real|
	arguments for the dimensions, and three |real| arguments for the
	rotation about the major axes.  If non-zero arguments are used for
	rotation, the normal will be
	rotated accordingly.  This direction considered to be ``outside''.  In
	3DLDF, the constructors generally generate |Points| moving about the
	figure in the counter-clockwise direction (as seen from a |Point| with
	a positive y-coordinate).  However, according to Huw
	Jones, {\it Computer Graphics Through Key Mathematics}, p.~197,
	``outside'' is considered to be the side of a plane, where the
	|Points| are meant to be traversed in the clockwise direction.
	I must watch out for problems that may arise from this discrepancy!

	* planes.web:
	LDF 2003.06.04.  BUG FIX in |get_distance()|:  In the case that
	|r_fabs < Point::epsilon()|, now |r_fabs| is set to 0.  Previously,
	|r| was, which was wrong, because |r_fabs| is returned, not |r|.
	Also, I now set |r_fabs| and |s| to 0 separately, because they are of
	different types.  I don't believe any compiler would have trouble with
	this, but I think it's cleaner if they are assigned to separately.

	* planes.web:
	LDF 2003.06.04.  Added definition of |Point::is_on_plane()|.
	It is defined in here, because |Plane| is an incomplete type
	in \filename{points.web}.

	Removed some debugging output from
	|intersection_point(const Point& p0, const Point& p1)|.

	* points.web: LDF 2003.06.04.  Added declaration of |is_on_plane()|.
	It is defined in \filename{planes.web}, because |Plane| is an incomplete type
	here.

2003-06-03  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* pspglb.web: LDF 2003.06.03.  Added |typedef| of |real_short| and
	declaration of |INVALID_REAL_SHORT|.

	* points.web: LDF 2003.06.03.  Made |drawarrow() const|.

	Minor change to error message in |magnitude()|.

	* planes.web: LDF 2003.06.03.  Added {\TeX} text.

	* paths.web: LDF 2003.06.03.  Made |drawarrow() const|.

	Changed |get_plane()| to account for the fact that I've removed the
	argument for |distance| from |Plane()|.

	Added definition of |Plane::intersection_point(const Path&)|.  It must be
	defined here, because |Path| is an incomplete type in
	\filename{planes.web}.
	Added section |@<Define |Plane| functions@>| for this definition.

	* planes.web: LDF 2003.06.03.  Added error handling to |Plane()|:  Now,
	if |fabs(distance) < Points::epsilon()|, |distance| is set to 0.

	Added |get_distance(void)|.  This version of the function
	returns the data member |distance| and its sign, i.e., the
	distance of |origin| to the |Plane|, and which side of the
	|Plane| it lies on.

	* planes.web:
	LDF 2003.06.03.  Minor change:: Changed name of argument to |get_distance()|
	from ``|pt0|'' to ''|p|''.

	* planes.web: LDF 2003.06.03.  Changed |Plane()|.
	BUG FIX:  |distance| is now calculated, instead of being passed as an argument.
	|normal| is now made a unit vector.

	Fixed |get_distance()|.  It now returns a |real_short|.

	Added two versions of |intersection_point()|:  one with two |const Point&|
	arguments, and one with a |const Path&| argument.

	Changed declaration of |INVALID_PLANE| to account for the fact that
	|Plane()| no longer takes an argument for  |distance|.

	* lines.web: LDF 2003.06.03.  Added |Line::magnitude()|.

	* 3DLDF.web: LDF 2003.06.03.  No significant changes.

	* curves.web: LDF 2003.06.03.  In |location()|:  Changed the line where
	|Plane::get_distance()| is called.  The latter now returns a |real_short|,
	so ``|.first|'' has to be added, in order to get the |real| value.

	* lines.web: LDF 2003.06.03.  Formatting changes.  Note to myself.

	* lines.web: LDF 2003.06.03.  Minor formatting change.

2003-06-01  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.06.1.  No significant changes.

	* persp.mp: LDF 2003.06.1.  Changed name of \filename{sub_persp.mp} to
	\filename{subpersp.mp}.  Now inputting the latter file.

	* io.web:
	LDF 2003.06.1.  Changed argument of |endfig()| from |unsigned int| to
	|unsigned short|.

	* pspglb.web:
	LDF 2003.06.1.  Changed return type of |solve_quadratic()| from
	|pair<real, real>| to |real_pair|, which is equivalent.

	* points.web:
	LDF 2003.06.1.  Added the section |@<Define |bool_real_point| functions@>|.
	Redefined the default constructor |bool_real_point(void)|, so that
	|b| is set to |false|, |r| is set to |INVALID_REAL|, and |pt| is set
	to |INVALID_POINT|.
	In order to do this, it was necessary to remove the definition from the
	declaration of |bool_real_point|, because when the compiler sees it,
	|INVALID_POINT| isn't defined yet.

	* points.web:
	LDF 2003.06.1.  Added the section |@<Define |bool_point_quadruple| functions@>|.
	Redefined the default constructor |bool_point_quadruple(void)|, so that
	|first|, |second|, |third|, and |fourth| are set to |INVALID_BOOL_POINT|.
	In order to do this, it was necessary to remove the definition from the
	declaration of |bool_point_quadruple|, because when the compiler sees it,
	|INVALID_BOOL_POINT| isn't defined yet.

2003-05-30  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	LDF 2003.05.30.  Added |@<Define |bool_point| functions@>=|.  It contains the
	the definition of the default constructor for |bool_point|.  Previously,
	|b| and |pt| were not set, so their
	values were unpredictable.  I had to remove the definition from the
	declaration of |bool_point|, because |INVALID_POINT| isn't defined,
	when the declaration is read by the compiler.

	* pspglb.web: LDF 2003.05.30.  One formatting change.

	* solids.web:
	LDF 2003.05.30.  Changed return value of |get_shape_ptr()| from |const Shape*|
	to |Shape*| .  The way it was before caused ``Memory fault'' errors at
	run-time.

	* points.web: LDF 2003.05.30.  Added ``TO DO'' note to myself.

2003-05-28  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* colors.web: LDF 2003.05.28.  Minor formatting change.

	* paths.web: LDF 2003.05.28.  Changed ``Perspective coordinates'' to
	``Projective coordinates'' in the message written to standard output
	by |show()|.

2003-05-22  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: LDF 2003.05.22.  BUG FIX:  Changed initialization of
	|WORLD_VALUES_Z| so that it's one less than |VIEW_VALUES_X_Y|.
	Previously, it had the same value.

	BUG FIX:  In the version of |label()| taking a |short| argument:
	The ``|WORLD_VALUES_Z|'' case
	started with |if| instead of |else if|.  This caused |s.str()| to have
	an erroneous five-digit integer following the closing parenthesis,
	when |WORLD_VALUES| or |WORLD_VALUES_X_Y| was used.  I don't know why
	this should have been the case, but changing |if| to |else if| fixed
	the problem.  It probably had something to do with the fact that
	|WORLD_VALUES_Z| had the same value as |VIEW_VALUES_X_Y|.  I've fixed
	this today, too.

2003-05-20  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* subex1.web:
	LDF 2003.05.20.  Added ``|using namespace Sorting|'' to the definition of
	|examples()|.

	* points.web:
	LDF 2003.05.20.  Added |WORLD_VALUES_Z|.  Changed |label()|, so that it uses
	the z-coordinate from |world_coordinates| as the label, when
	|WORLD_VALUES_Z| is passed as the |text_short| argument.

	* paths.web: LDF 2003.05.20.  Added debugging code to |subpath()|.

	* circles.web:
	LDF 2003.05.20.  In |segment()|:  Changed the way the last connector is set when
	|closed == true|.

	Minor correction to the {\TeX} text for |half()|.

2003-05-16  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* pictures.web:
	LDF 2003.05.16.  Added |namespace Sorting|.  Replaced the |const bool do_sort|
	argument to |output()| with |const unsigned short sort_value|.  It should be one
	of the constants defined in |namespace Sorting|.

	Minor formatting changes.

	* persp.mp:
	LDF 2003.05.16.  Changed the |defaultdx| and |defaultdy| values for putting boxes
	around my figures.  Now, the boxes are larger.

	* shapes.web:
	LDF 2003.05.16.  Added declarations of |get_minimum_z()| and
	|get_mean_z()|.

	* solids.web, paths.web:
	LDF 2003.05.16.  Added the functions |get_minimum_z()| and |get_mean_z()| for
	sorting the |Shapes| on a |Picture|, when the latter is output.

	* points.web:
	LDF 2003.05.16.  Added code for sorting the |Shapes| on a |Picture|, when the latter is
	output:

	Added the functions |get_minimum_z()| and |get_mean_z()|, and the function classes
	|Compare_minimum_z| and |Compare_mean_z|.

	Replaced the argument |const bool do_sort| in |Picture::output()| with
	|const unsigned short sort_value|, and changed the definition accordingly.
	|sort_value| should be one of the constants defined in
	|namespace Sorting|, declared in \filename{pictures.web}.

	* io.web:
	LDF 2003.05.16.  Removed commented-out inline definition of |beginfig()|,
	with |unsigned int| argument.

2003-05-14  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.05.14.  No significant changes.

	* utility.web:
	LDF 2003.05.13.  Changed return value of |make_perspective_frame()| from
	|void| to |vector<Point*>|.  Finished writing this function.

	Commented-out some terminal output in |make_perspective_frame()| and
	|persp_0()|.

	Added note to myself, to put perspective functions into a namespace.

	* points.web:
	LDF 2003.05.14.  Changed return value of |operator*=(const real)|
	from |void| to |real|.  It now returns the argument |r|.  This makes it
	possible to chain invocations of this function.

2003-05-13  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web:
	LDF 2003.05.13.  No significant changes.  Working on examples for the
	{\it 3DLDF User and Reference Manual} using perspective constructions with
	vanishing points.

	* utility.web:
	LDF 2003.05.13.  Started work on |make_perspective_frame()|.

	* utility.web:
	LDF 2003.05.13.  Commented-out some |show()| commands in |persp_0()|.

	* solids.web:
	LDF 2003.05.13.  Changed |get_shape()|, |get_circle()|, |get_ellipse()|, |get_path()|,
	|get_rectangle()|, and |get_reg_polygon()| to
	|get_shape_ptr()|, |get_circle_ptr()|, |get_ellipse_ptr()|, |get_path_ptr()|,
	|get_rectangle_ptr()|, and |get_reg_polygon_ptr()|, respectively, in {\TeX} text.
	I'd forgotten to do so, when I changed the names of the functions.

	* utility.web:
	LDF 2003.05.13.  Initial version.  This file will contain miscellaneous
	functions that don't seem to belong anywhere else.

	The only function it currently contains
	is |persp_0()|, which puts a rectangle in the x-z plane into
	perspective using the traditional perspective construction with
	vanishing points, focus, horizon line, etc.
	I use it in the {\it 3DLDF User and Reference Manual\/}
	(\filename{3DLDFman.texi}).

	* subex1.web: LDF 2003.05.13.  Now including \filename{utility.h}.

	* points.web:
	LDF 2003.05.13.  Added headings for Emacs' outline-minor-mode.

	* main.web, parser.web:
	LDF 2003.05.13.  Now including \filename{utility.h}.

	* utility.web: New file.

2003-05-11  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* pictures.web:
	LDF 2003.05.11.  Added the constant |AXON| to the namespace |Projections|.

	* points.web: LDF 2003.05.11.  Added debugging code to |project()|.

2003-05-09  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex, main.web: LDF 2003.05.09.  No significant changes.

	* rectangs.web:
	LDF 2003.05.09.  Changed name of |mid_point()| to |get_mid_point()|.

	* ellipses.web, rectangs.web, polygons.web:
	LDF 2003.05.09.  Changed return value of the non-|const| version
	of |get_center()| from |Point&| to |const Point&|.

	* points.web: LDF 2003.05.09.  Minor formatting change.

	* solids.web:
	LDF 2003.05.09.  Changed the names of |get_shape()|, |get_circle()|,
	|get_ellipse()|, |get_path()|, |get_rectangle()|, and
	|get_reg_polygon()| to
	|get_shape_ptr()|, |get_circle_ptr()|,
	|get_ellipse_ptr()|, |get_path_ptr()|, |get_rectangle_ptr()|, and
	|get_reg_polygon_ptr()|.  The names without ``|_ptr|'' were confusing,
	because they didn't make clear that the functions returned pointers.

	* paths.web: LDF 2003.05.09.  Rewrote |extract()|.  It now calls
	|Point::extract()| instead of calling |apply_transform()| and
	|project()| on the |Points| directly.  This makes much more sense,
	since any changes to |Point::extract()| would otherwise not have been
	applied to |Points| on |Paths|.

	* points.web:
	LDF 2003.05.09.  BUG FIX:  Added loop in |project()|, setting
	all elements of |projective_coordinates| to 0.  This was done in the
	conditionally compiled code for the DEC compiler, but I forgot to do
	it for GCC when added the declaration of |temp_coordinates| and
	resized it.  It took me about 6--7 hours to find this bug!

	Added some debugging code to |extract()|.

	Minor changes to {\TeX} text.

2003-05-07  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: LDF 2003.05.07.  Added text to my ``START HERE'' note.

	* points.web: LDF 2003.05.07.  Made |draw()| |const|.

	Added ``START HERE'' note to myself to try to find the
	bug in |Picture::output()| that causes |Pictures| to not be
	transformed properly.

	* pictures.web: LDF 2003.05.07.  Added |kill_labels()|.

	* paths.web: LDF 2003.05.07.  Made |Point::draw()| |const|.

2003-05-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* solids.web:
	LDF 2003.05.06.  Added ``TO DO'' note to myself, to add an optional |Solid*|
	argument to |create_new_solid()|, and to add a version of this function with a
	required |const Solid&| argument.

	LDF 2003.05.06.  Fixed a bug in |get_copy()|.  The local variable |s| was of type
	|Shape*| instead of |Solid*|.  I noticed this bug when I tried to copy a |Picture|
	containing a |Cuboid|, and the copy contained a single empty |Shape*|
	on |shapes|.

	* solids.web: LDF 2003.05.06.  Added |get_center()|.

	* points.web:
	LDF 2003.05.06.  Changed the |Point| data members |WORLD_VALUE|, |PROJ_VALUE|,
	|USER_VALUE|, and |VIEW_VALUE| to |WORLD_VALUES|, |PROJ_VALUES|,
	|USER_VALUES|, and |VIEW_VALUES|.  Added |WORLD_VALUES_X_Y|,
	|PROJ_VALUES_X_Y|, |USER_VALUES_X_Y|, and |VIEW_VALUES_X_Y|
	for suppressing the z-coordinate.  The latter are also initialized.

	Changed the version of |label()| whose first argument
	is a |short|, so that it now tests whether
	|text_short| is greater than or equal to |VIEW_VALUES_X_Y| and
	less than or equal to |WORLD_VALUES|.  If one of the variables whose names
	end in ``|X_Y|'' is used, the z-coordinate is not output.  Also, |*this| is
	no longer copied in |label()|, since since |get_x()|, |get_y()|,
	and |get_z()| are |const| anyway.

	* paths.web:
	LDF 2003.05.06.  In the version of |label()|, whose first argument is
	a |short|:  Changed the conditional, where |text_short| is
	compared with |WORLD_VALUES|, |PROJ_VALUES|, etc.  I had to
	change it, because I've added |WORLD_VALUES_X_Y|, etc.  Now, the conditional
	tests for |VIEW_VALUES_X_Y@t$\le$@>text_short@t$\le$@>WORLD_VALUES|.
	Of course, this makes an assumption about the values that are used to
	signal that coordinate values should be used for the label, but I
	think it's worth it, to avoid testing |text_short| against each
	value individually.

	Minor formatting changes.

	* main.web, 3DLDF.web: LDF 2003.05.06.  No significant changes.

	* circles.web:
	LDF 2003.05.06.  Added the argument |nnumber_of_points| to one of the
	setting functions.  Without it, it didn't match the constructor it was supposed
	to match.

2003-05-04  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex: LDF 2003.05.04.  No significant changes.

	* points.web:
	LDF 2003.05.04.  Added note to myself to check |Transform::align_with_axis()|.
	I sometimes get erroneous results with |Point::rotate(Point, Point, real)|
	(formerly |rotate_around()|), and I think the problem may be in
	|Transform::align_with_axis()|.

2003-05-02  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web:
	LDF 2003.05.02.  Added |draw_axes()| with required |Color| argument first.

	* solids.web, shapes.web, rectangs.web, polyhed.web, polygons.web, points.web, pictures.web, patterns.web, paths.web, ellipses.web, circles.web, transfor.web:
	LDF 2003.05.02.  Changed name of |rotate_around()| to |rotate()|.
	It now overloads |rotate()| with three |real| arguments.

2003-04-30  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* solids.web:
	LDF 2003.04.30.  In |get_shape()|:  Now using |get_copy()| instead of
	|static_cast<const Shape*>()|.  The way it was caused compilation
	errors under Tru64 (DEC ALPHA).

	Changed the functions |get_circle()|, |get_ellipse()|,
	|get_path()|, |get_rectangle()|, and |get_reg_polygon()|, so that they no
	longer use |get_shape()|.  There's no good reason for casting pointers
	from one type to another.  I rather doubt that |get_shape()| is
	needed, anyway.

	* points.web:
	LDF 2003.04.30.  Changed |show()|, so that a newline is not output following
	|text|.

	* Makefile:
	LDF 2003.04.30.  Now removing the executables in \filename{sub_purge}.

	* sub_purge:
	LDF 2003.04.30.  Made a few changes.  Some of the instructions in
	this shell script were out-of-date.  Also, not all of the EPS
	files that were generated (persp.1, persp.2, etc.) were deleted.
	Note that this shell script will delete all files named ``persp''
	with an extension consisting only of integers, e.g., persp.1,
	persp.20, persp.101.

	LDF 2003.04.30.  Now using a shell script variable "OUTFILE"
	instead of the literal string "persp".  This will make it easier
	to use a different name, if I decide to sometime.

2003-04-27  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex: LDF 2003.04.27.  No significant changes.

	* paths.web: LDF 2003.04.27.  Rearranged some {\TeX} text.

	* main.web: LDF 2003.04.27.  No significant changes.

	* 00TODO: LDF 2003.04.27.  Added items.

	* polyhed.web:
	LDF 2003.04.27.  Fixed the |Tetrahedron| constructor with arguments for
	center, triangle diameter, and angles of rotation.  It now works, at least in
	a rudimentary way.

	* arch_3DLDF:
	LDF 2003.04.27.  Now archiving LINUX/cmplLIN.web, LINUX/procLIN.web,
	DEC/cmplDEC.web, and  DEC/procDEC.web.

	* rectangs.web:
	LDF 2003.04.27.  Copied the transformation functions from
	\filename{polygons.web} and made the appropriate changes.
	It was also necessary to copy |operator*=(const Transform&)|, because
	it didn't exist, up until now.  Previously, |Rectangle| was derived from
	|Reg_Polygon|, but I changed this a little while ago.

	* polygons.web:
	LDF 2003.04.27.  Copied the transformation functions that I didn't have from
	\filename{ellipses.web} and made the appropriate changes.

	* ellipses.web:
	LDF 2003.04.27.  Finished adding the transformation functions.  I
	already had |shift()|, now I have the rest of them.

	* polygons.web:
	LDF 2003.04.27.  Changed |protected| data members of |Rectangle| to |private|.
	They no longer need to be |protected|, because |Rectangle| is no longer
	derived from |Reg_Polygon|.

2003-04-15  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* subex2.web: LDF 2003.04.15.  One formatting change.

	* rectangs.web, polygons.web:
	LDF 2003.04.15.  Formatting changes and corrections to messages output
	in |get_center()|.

	* persp.tex, main.web: LDF 2003.04.15.  No significant changes.

	* 3DLDF.web: LDF 2003.04.15.  Minor changes.

	* 00TODO: LDF 2003.04.15.  Added an entry.

	* rectangs.web:
	LDF 2003.04.15.  Added two versions of |get_center()|, |const| one and a
	non-|const| one.  Copied them from
	\filename{polygons.web}, and made the necessary changes.

	* polyhed.web:
	LDF 2003.04.15.  Commented-out the constructors for |Trunc_Octahedron| and
	|Trunc_Octahedron::get_net()|.  They
	made use of the fact, which is no longer true, that |Rectangle| was
	formerly derived from |Reg_Polygon|.  Now that |Rectangle| is derived
	from |Path|, some of the code in these functions doesn't work.
	Added ``TO DO'' note to myself to fix these functions.

	* polyhed.web:
	LDF 2003.04.15.  Commented-out |intersection_points()|, since I need to get
	|Reg_Polygon::intersection_points()| working first.

	Minor formatting changes.

	* polygons.web:
	LDF 2003.04.15.  Added a ``TO DO'' note to myself about adding the functions
	|in_circle()| and |out_circle()|.

	* polygons.web:
	LDF 2003.04.15.  Added a ``TO DO'' note to myself:  It will be necessary to supply
	|Reg_Polygon| with a complete set of transformation functions, so that |center| will
	be transformed along with the |Points| pointed to by the pointers on
	|points|.  Some are present already, but not all.

	* rectangs.web:
	LDF 2003.04.15.  Added ``TO DO'' note to myself, about adding transformation functions.

	* rectangs.web:
	LDF 2003.04.15.  Changed the declaration of |class Rectangle|, so that it
	is derived from |Path|.  Previously, it was derived from |Reg_Polygon|.
	Added the data members |Point center| and |bool on_free_store|, to replace the
	ones it formerly inherited from |Reg_Polygon|.  It will be necessary to supply
	|Rectangle| with a complete set of transformation functions, so that |center| will
	be transformed along with the |Points| pointed to by the pointers on |points|.

	* polygons.web: LDF 2003.04.15.  Minor formatting changes.

	* polygons.web:
	LDF 2003.04.15.  Changed the declaration of |class Reg_Polygon|, so that it
	is derived from |Path|.  Previously, it was derived from |Reg_Cl_Plane_Curve|.

	* polygons.web: LDF 2003.04.15.  Corrected minor formatting error.

	* transfor.web:
	LDF 2003.04.15.  Changed, so that RCS identifier is no longer in a comment,
	but is now in a |static string|.  This is so that it is written to the object file,
	when this file is compiled.

	* subex2.web, subex1.web: New file.

	* solids.web, solfaced.web, shapes.web, rectangs.web, pspglb.web, polyhed.web, polygons.web, points.web, planes.web, pictures.web, patterns.web, paths.web, parser.web, main.web, lines.web, layers.web, io.web, ellipses.web:
	LDF 2003.04.15.  Changed, so that RCS identifier is no longer in a comment,
	but is now in a |static string|.  This is so that it is written to the object file,
	when this file is compiled.

	* curves.web, cuboid.web:
	LDF 2003.04.15.  Changed, so that RCS identifier is no longer in a comment,
	but is now in a |static string|.  This is so that it is written to the object file,
	when this file is compiled.

	Formatting changes.

	* colors.web:
	LDF 2003.04.15.  Changed, so that RCS identifier is no longer in a comment,
	but is now in a |static string|.  This is so that it is written to the object file,
	when this file is compiled.

	* circles.web: LDF 2003.04.15.  Minor change.

	* colall.web: LDF 2003.04.15.  Put in comment.

	* circles.web:
	LDF 2003.04.15.  Changed, so that RCS identifier is no longer in a comment,
	but is now in a |static string|.  This is so that it is written to the object file,
	when this file is compiled.

	* 3DLDF.web: LDF 2003.04.15.  Added comment.

2003-04-14  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* ellipses.web: LDF 2003.04.14.  Put in ``START HERE'' note to myself.

2003-04-12  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polygons.web:
	LDF 2003.04.12.  Started implementing the non-coplanar case
	in the version of |intersection_points()| with |Point| arguments.

	* curves.web:
	LDF 2003.04.12.  Formatting changes.  Corrected nesting of outline headings
	in |intersection_points()|.

2003-04-11  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* solids.web: LDF 2003.04.11.
	Apparently, I've added |get_circle_center()|,
	|get_ellipse_center()|, |get_rectangle_center()|, and
	|get_reg_polygon_center()| in this version.  I thought I'd done so in the
	last version.  Some changes to the {\TeX} text and formatting changes.

	* main.web: LDF 2003.04.11.  No significant changes.

	* Makefile: LDF 2003.04.11.  Added ``archive'' target.

	* arch_3DLDF: LDF 2003.04.11.
	Initial version.  \filename{arch_3DLDF} is a shell script which takes care
	of archiving my files for the 3DLDF project. It's called in Makefile,
	when "make archive" is called.
	I'm using this shell script, because I find it more convenient to
	write shell scripts than makefiles.

	* arch_3DLDF: New file.

	* polygons.web: LDF 2003.04.11.
	Added ``TO DO'' note to myself.

	* paths.web: LDF 2003.04.11.
	Now resizing |projective_extremes| in |operator=()|, if after setting it to
	|p.projective_extremes|, |projective_extremes.size() == 0|.  This
	prevents a Memory Fault error at run-time.  I don't know why it should
	be necessary, though, since all of the constructors of |Path| and its
	derived classes resize |projective_extremes|;  at least, I thought
	they did.

	* polyhed.web: LDF 2003.04.11.
	Changed |polygons| to |reg_polygons| to reflect
	change in \filename{solids.web}.

	* solids.web: LDF 2003.04.11.
	Added the |static const| data members |PATH|,
	|CIRCLE|, |ELLIPSE|, |REG_POLYGON|, and |RECTANGLE|
	in the section |@<Define |static const Solid| data members@>@|.
	Currently, their only use is as arguments to |get_shape()|
	and |get_shape_center()|.

	Added the functions |get_shape()|, |get_circle()|,
	|get_ellipse()|, |get_path()|, |get_rectangle()|,
	|get_reg_polygon()|, and |get_shape_center()|.

	Renamed |polygons| |reg_polygons|.  This is in case I decide to make
	it possible to have irregular polygons.  In this case, I may define a
	|class Polygon| and derived |Reg_Polygon| from it.

2003-04-09  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: LDF 2003.04.09.
	No significant changes.

	* polygons.web: LDF 2003.04.09.
	Tested |intersection_points(const Reg_Polygon&)| and
	|intersection_points(const Point&, const Point&)|, and they
	seem to work properly.

	* solids.web: LDF 2003.04.09.
	Removed |get_polygon()| and |get_polygon_center()|
	from \filename{polyhed.web} to this file.

	* polyhed.web: LDF 2003.04.09.
	Removed |get_polygon()| and |get_polygon_center()|
	from this file to \filename{solids.web}.

	Added |intersection_points()| with
	a |Reg_Polygon| argument.  Must debug, because it doesn't yet work.
	Currently working on debugging the |Reg_Polygon| versions,
	because they don't work properly yet.

	* polygons.web:
	LDF 2003.04.09.  Resizing |projective_extremes()| in the constructors and
	|create_new_reg_polygon()|.

	Added three versions of |intersection_points()| with |Point|, (linear) |Path|,
	and |Reg_Polygon| arguments respectively.  Currently working on debugging them,
	because they don't work properly.

	* points.web:
	LDF 2003.04.09.  Working on debugging |intersection_point()|.
	I'm trying to implement |Reg_Polygon::intersection_points()|,
	and a problem cropped up, which seems to in
	|Point::intersection_point()|.

	* paths.web:
	LDF 2003.04.09.  Changed |is_linear()|, so that it now checks
	whether |line_switch| is |true| before calling |get_normal()|.

	* polygons.web:
	LDF 2003.04.09.  Made minor modifications to the version of
	|intersection_points()| with |Point| arguments.  Added a version with a
	|Path| argument, and one with a |Reg_Polygon| argument.

	* polygons.web:
	LDF 2003.04.09.  Added proper definition of |intersection_points()|.

2003-04-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web: LDF 2003.04.06.
	BUG FIX:
	Now setting |dashed = ""|, |pen = ""|, and |arrow = false| in all
	constructors and setting functions.  This fixed a problem I was having
	with |Icosahedron|:  One of the |Reg_Polygons| was drawn with an
	arrow.

2003-04-01  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web, points.web:
	LDF 2003.04.01.  Corrected incorrect dating of changes.

	* main.web: LDF 2003.03.01.  No significant changes.

	* ellipses.web:
	LDF 2003.03.01.  Adding setting function to correspond to the constructor
	that takes arguments for the center, lengths of the axes, and angles of
	rotation.

	* points.web: LDF 2003.03.01.  Minor change.

	* paths.web: LDF 2003.03.01.  BUG FIX:  Got rid of the first argument
	|unsigned int i| of the normal version of |label()|,
	and made the third argument |short text_short|
	the first argument.  Formerly, the |Points| in |Paths| were
	always numbered starting from 0, because the argument |text_short| was
	passed to |Point::label()|, not |i|.  Also changed the other
	versions of |label()| and |dotlabel()|, that call this function.

	* points.web:
	LDF 2003.03.01.  Added the |static const| |WORLD_VALUE|, |PROJ_VALUE|,
	|USER_VALUE|, and |VIEW_VALUE|.  They are used in |label()| for
	labeling |Points| using the values in |world_coordinates|,
	|projective_coordinates|, etc.
	Using the macro |SHRT_MAX| to initialize |WORLD_VALUE|, |PROJ_VALUE|,
	|USER_VALUE|, and |VIEW_VALUE|,
	because the |numeric_limits| template doesn't seem to be available
	under GNU/Linux using GCC, at least not on the computer I'm using.
	This is a kludge!

	* paths.web:
	LDF 2003.03.01.  Made changes to |draw_axes()|.  It now takes arguments for
	a dash pattern and a pen.  The arguments |pos_x|, |pos_y|, and |pos_z| are
	use for determining whether to suppress drawing any of the axes.  The
	arguments |suppress_x|, |suppress_y|, and |suppress_z| have been eliminated.
	I've also added |const Point&| arguments |shift_x|, |shift_y|, and |shift_z| for
	adjusting the positions of the axis labels.  I've also added error handling
	code and code for using the defaults, even when placeholder arguments are
	needed.

2003-03-25  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web: LDF 2003.03.25.  Fixed minor error in |draw_axes()|.

	* transfor.web:
	LDF 2003.03.25.  Fixed a bug in |scale()|.  The conditional that tested
	whether all three arguments were equal to 1 was faulty.

	* points.web:
	LDF 2003.03.25.  Changed the return values of |set()| with three |real|
	arguments and |operator=(const Point&)| from |void| to |const Point&|.
	This makes it possible to chain invocations of these functions.

	* paths.web:
	LDF 2003.03.25.  Changed the way the ``unfilldraw'' case is handled in
	|output()|.  Now, if |draw_color != Colors::background_color|, an
	unfill command and a draw command are written to |out_stream|.  Otherwise,
	an unfilldraw command is written to |out_stream|.

	* persp.tex, main.web: LDF 2003.03.25.  No significant changes.

2003-03-16  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* patterns.web:
	LDF 2003.03.16.  Removed the ``pen'' arguments from the calls to |Path::fill()|,
	since this function no longer takes a ``pen'' argument.

	* paths.web:
	LDF 2003.03.16.  Removed ``pen'' argument from |fill()| and |unfill()|.
	Metafont's |fill| and |unfill| commands don't use pens, so it was a mistake
	on my part to include them.  Also removed one of the versions of |unfill()|:
	since the basic version now only has a |Picture| argument, there's no need for one
	with the |Picture| argument first.  Having it caused a compiler error.

2003-02-13  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.02.13.  No significant changes.
	Tested |epicycloid_pattern_3()|.

	* patterns.web:
	LDF 2003.02.13.  Fixed |epicycloid_pattern_3()|, so that it breaks
	off if the |Point| used for tracing the epicycloid returns to its
	starting point.  Also, now using a |vector<const Color*>| for
	the |Colors|.  The function cycles through the vector again, if
	it reaches the end.  Put in ``START HERE'' and ``TO DO'' notes to do
	the same for |epicycloid_pattern_1()|.

2003-02-11  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* patterns.web: LDF 2003.02.11.  Added |epicycloid_pattern_3()|.

	* main.web: LDF 2003.02.11.  No significant changes.

2003-02-09  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex: LDF 2003.02.09.  No significant changes.

	* patterns.web: LDF 2003.02.09.  Added |epicycloid_pattern_1()|.

	* paths.web:
	LDF 2003.02.09.  Added |set_connectors()| and |operator+=(const string)| for
	adding connectors.

	* main.web: LDF 2003.02.09.  No significant changes.

2003-02-08  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* pictures.web: LDF 2003.02.08.  Minor change in |show()|.

2003-02-05  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web:
	LDF 2003.02.05.  Moved the function |draw_axes()| from this file to \filename{paths.web},
	in order to be able to use it in my examples for the Texinfo documentation.

	* paths.web:
	LDF 2003.02.05.  Moved the function |draw_axes()| from \filename{main.web} to
	this file, in order to be able to use it in my examples for the Texinfo
	documentation.

2003-02-02  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web, persp.tex: LDF 2003.02.02.  No significant changes.

	* polyhed.web:
	LDF 2003.02.02.  Changed |in_radius| to |face_radius|, |out_radius| to
	|edge_radius|, and |circum_radius| to |vertex_radius|.

	* patterns.web: LDF 2003.02.02.  Minor change to debugging code.

	* paths.web:
	LDF 2003.02.02.  Put in note to myself to get rid of |pen| argument to |fill()|
	everywhere.  Filling doesn't use a pen.

	* Makefile:
	LDF 2003.02.02.  Changed, so that this directory is purged, too (using
	sub_purge).

	* sub_purge: LDF 2003.02.02.  Changed, so that \filename{3DLDF.idx},
	\filename{3DLDF.scn}, \filename{3DLDF.tex}, and \filename{3DLDF.toc}
	are deleted.  These files used to be named \filename{cwdriver.*}, but
	I've changed the name of \filename{cwdriver.web} to \filename{3DLDF.web},
	so the names of the generated files have changed, too.

2003-01-31  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polygons.web: LDF 2003.01.31.  Minor formatting change.

	* points.web:
	LDF 2003.01.31.  Removed default for |Picture| argument in the versions of
	|drawdot()| and |undrawdot()| with the |Picture| argument first.
	It caused calls to these functions to be ambiguous.

	* paths.web:
	LDF 2003.01.31.  Added note to myself to look up whether |Point::project()| really needs to be
	called in both |Path::project()| and |Path::extract()|.

	* curves.web: LDF 2003.01.31.  Minor change in {\TeX} text.

	* paths.web:
	LDF 2003.01.31.  Minor change in a string output to standard output.

2003-01-29  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2003.01.29.  Minor changes.  Working on examples for
	\filename{DOCUMENTATION/3DLDFman.texi}.

	* paths.web: LDF 2003.01.29.  Minor changes.

	* Makefile:
	LDF 2003.01.29.  Minor changes reflecting the fact that I've changed the name of the
	file \filename{DOCUMENTATION/3DLDF.texi} to \filename{DOCUMENTATION/3DLDFman.texi}.

	* 3DLDF.web:
	LDF 2003.01.29.  Renamed this file \filename{3DLDF.web} from
	\filename{cwdriver.web}.

	* 3DLDF.web: New file.

2003-01-24  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	LDF 2002.01.24.  Added versions of |drawdot()| and |undrawdot()| with
	the |Picture&| argument first.  Updated a bit of the {\TeX} text.

2003-01-22  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	LDF 2003.01.22.  Changed |rotate()|, |scale()|, |shear()|, and |shift()|.
	They now return the return value of |transform|.<function>, rather than
	creating a |Transform| locally, applying the transformation to it,
	multiplying |transform| by it, and returning the locally declared
	|Transform|.  The effect is the same.

2003-01-19  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex, main.web: LDF 2002.01.19.  Minor changes.

	* transfor.web:
	LDF 2002.01.19.  Added debugging code to |shift_times()|.

	* rectangs.web: LDF 2002.01.19.  Corrected error in {\TeX} text.

	* points.web: LDF 2002.01.19.  Added |shift_times()|.

	* paths.web:
	LDF 2002.01.19.  Added |shift_times()|.  Corrected error in the
	argument list of the _definition_ of |drawarrow()|:  I had included a default
	argument.  GCC compiled it, but the DEC compiler issued an error message
	and exited.

2003-01-17  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex, main.web: LDF 2002.01.17.  No significant changes.

	* Makefile:
	LDF 2002.01.17.  Added target ``purge_doc'', which is also called by the target
	``purge''.

	* pictures.web:
	LDF 2003.01.17.  Made |set_transform()| non-inline and changed the argument
	|t| from plain |Transform| to |const Transform&|.

	* points.web:
	LDF 2003.01.17.  Removed one outdated comment and added a note to
	make |drawarrow()| |const|, if possible.

	* pictures.web:
	LDF 2003.01.17.  Changed the argument |t| in |operator*=()| from
	plain |Transform| to |const Transform&|.

2003-01-15  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: LDF 2003.01.15.  Added declarations for |drawarrow()|.

	* persp.tex:
	LDF 2003.01.15.  Now using the file \filename{extext.tex} for printing my examples
	separately from 3DLDF.texi.

	* persp.mp:
	LDF 2003.01.15.  Commented-out unneeded code.  Changed default values of
	|defaultdx| and |defaultdy| from 3 to 8 for the boxes in my examples for
	the Texinfo documentation in 3DLDF.texi.

	* paths.web:
	LDF 2003.01.15.  Added |bool arrow| to |class Path|.  It's used for
	the |drawarrow()| functions, which I've also added (for |Path| and |Point|).

	Modified |output()|, so that ``drawarrow'' is output, when needed.

	* Makefile, sub_purge: New file.

2003-01-12  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex: LDF 2002.01.12.
	No significant changes.

	* paths.web:
	LDF 2002.01.12.  Removed the preprocessor macros for conditional compilation
	in @<Output |Path|@>, because I'm now using
	|out_stream.setf()| to ensure that fixed point notation is used rather than
	scientific, when code is output to |out_stream|.

	* io.web: LDF 2002.01.12.  Now using
	|out_stream.setf()| to ensure that fixed point notation is used rather than
	scientific, when code is output to |out_stream|.  I've had to use
	preprocessor macros for conditional compilation, because the class
	``|fixed|'' is a member of is called ``|ios_base|'' in the DEC library, and
	``|ios|'' in the GNU library.

2003-01-10  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex: LDF 2003.01.10.  No significant changes.

	* solids.web:
	LDF 2003.01.10.  Added the keyword ``|inline|'' to the declaration of |get_extremes()|.
	It must have been inlined anyway, since the definition followed, but I've made it explicit.

	Made |unfill()| and |unfilldraw()| |virtual|.  It was merely an oversight, that they weren't
	|virtual| already.

	* main.web:
	LDF 2003.01.10.  Now including \filename{examples.h}.  Started working on
	|examples()|, which is for for doing the examples for the
	_3DLDF User and Reference Manual_.  It is called in |main()|.

	* ellipses.web: LDF 2003.01.10.  Minor change.

2003-01-05  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* curves.web:
	LDF 2003.01.05.  Added a ``TO DO'' comment.  Not that important.

	* points.web: LDF 2003.01.05.
	Removed debugging code.

	* solids.web: LDF 2003.01.05.
	Added |apply_transform()| to |Solid|.  This was necessary, because
	I've added |Solid::apply_transform()|, which is a pure |virtual| function.

	* shapes.web: LDF 2003.01.05.
	Added |apply_transform()| to |Shape|.  This was necessary, in order to fix a
	bug in |Picture::output()|.

	* points.web: LDF 2003.01.05.
	Fixed bug in |Picture::output()|.  Now, if
	|Picture::transform.is_identity == false|, the |Shapes| are
	transformed {\it before\/} |extract()| is called, which sets the extremes
	in order to decide whether a |Shape| is projectable or not.

	Made changes to {\TeX} text.

2002-12-20  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web: LDF 2002.12.20.
	Now using the manipulator ``|fixed|'' in |@<Output |Path|@>|.  It solves
	the problem of |Points| being output in scientific format, which
	Metapost doesn't understand.

	I had to
	add preprocessor code for conditional compilation, because ``|fixed|''
	is unknown to the GNU C++ Compiler.  However, it doesn't need it in
	this case, since the problem only occurred when using the DEC C++
	compiler on a DEC Alpha computer under Compaq Tru64.

	* points.web: LDF 2002.12.20.
	Minor formatting change.

	* pictures.web: LDF 2002.12.20.
	Added |Picture::unsuppress_labels()|.

	* paths.web: LDF 2002.12.20.
	Put in notes to myself.

	* main.web, cwdriver.web: LDF 2002.12.20.
	No significant changes.

	* polyhed.web: LDF 2002.12.20.
	Fixed the non-default constructor for |Icosahedron|.  The old versionIt didn't work
	after porting to GNU/Linux.  Still having problems with surface hiding, but I don't think
	that the problem lies with the constructor.

2002-12-18  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* main.web: LDF 2002.12.18.
	Testing whether using RCS on different computers causes
	problems.

	* polyhed.web: LDF 2002.12.18.
	Put in a note to myself to fix the
	|Icosahedron| constructor.

	* main.web: LDF 2002.12.18.
	No significant changes.  Fixed the |Dodecahedron| constructor.  Must fix the
	|Icosahedron| constructor, too!

	* run_mp: LDF 2002.12.18.
	Now this shell script runs in the appropriate subdirectory:
	/DEC, /LINUX, or /FREEBSD.

	Adjusted the way this shell script works.  Some files are genuine files,
	others are symbolic links.

	* pspglb.web: LDF 2002.12.18.
	Changed |#if TRUE| to |#if 1| and |if FALSE| to |#if 0|.
	|TRUE| and |FALSE| are not predefined by the preprocessor used
	by the GNU compiler GCC under GNU/Linux on the Intel i686 computers.
	It also seemed not to work when I tried to define them using
	``@d TRUE 1'' and ``@d FALSE 0'' in \filename{pspglb.web}.  They
	seemed not to be defined in the other CWEB files.  I don't like preprocessor
	macros anyway, so it's just as well to be rid of them.

	* polyhed.web: LDF 2002.12.18.
	Changed |#if TRUE| to |#if 1| and |if FALSE| to |#if 0|.
	|TRUE| and |FALSE| are not predefined by the preprocessor used
	by the GNU compiler GCC under GNU/Linux on the Intel i686 computers.
	It also seemed not to work when I tried to define them using
	``@d TRUE 1'' and ``@d FALSE 0'' in \filename{pspglb.web}.  They
	seemed not to be defined in the other CWEB files.  I don't like preprocessor
	macros anyway, so it's just as well to be rid of them.

	Rewrote the non-default |Dodecahedron| constructor.  There was a problem with
	rotating two of the pentagons after I ported 3DLDF to GNU/Linux.  I haven't been
	able to find the cause of the problem, but it was possible to make the
	constructor work by rotating the other way using the same points.

	Must fix the |Icosahedron| constructor, too!

	* polygons.web: LDF 2002.12.18.

	Moved the definition of the assignment operator before the definition of the
	constructors.  See \filename{paths.web} for an explanation of why this was
	necessary.

	* points.web: LDF 2002.12.18.
	Changed |#if TRUE| to |#if 1| and |if FALSE| to |#if 0|.
	|TRUE| and |FALSE| are not predefined by the preprocessor used
	by the GNU compiler GCC under GNU/Linux on the Intel i686 computers.
	It also seemed not to work when I tried to define them using
	``@d TRUE 1'' and ``@d FALSE 0'' in \filename{pspglb.web}.  They
	seemed not to be defined in the other CWEB files.  I don't like preprocessor
	macros anyway, so it's just as well to be rid of them.

	Commented code involving ``|pen|'' back in.  It seems to work okay.  Apparently
	the problem that occurred wasn't caused by |pen|.

	Now calling |apply_transform()| on the |Point| arguments in
	|Transform::rotate_around()|.  It didn't fix the problem I'm having with rotations,
	though.

	Added code for parallel projection onto all three major planes to
	|project()|.

	* pictures.web: LDF 2002.12.18.
	Replaced |Projections::PARALLEL| with |Projections::PARALLEL_X_Y|,
	|Projections::PARALLEL_X_Z|, and |Projections::PARALLEL_Z_Y|.  Using
	these, it is now possible to project drawings onto the x-z and x-y planes.
	I've only tested projection onto the x-y and x-z planes, so far.

	* persp.tex: LDF 2002.12.18.
	No significant changes.

	* paths.web: LDF 2002.12.18.
	Changed |#if TRUE| to |#if 1| and |if FALSE| to |#if 0|.
	|TRUE| and |FALSE| are not predefined by the preprocessor used
	by the GNU compiler GCC under GNU/Linux on the Intel i686 computers.
	It also seemed not to work when I tried to define them using
	``@d TRUE 1'' and ``@d FALSE 0'' in \filename{pspglb.web}.  They
	seemed not to be defined in the other CWEB files.  I don't like preprocessor
	macros anyway, so it's just as well to be rid of them.

	Moved the definition of the assignment operator before the definition of the
	constructors.  Explained why in the {\TeX} text.  Before I did, the default
	assignment operator was used in the copy constructor instead of the version
	I defined.  This didn't matter with the DEC compiler, but it did with the
	GNU C++ compiler.

	* lines.web, io.web, ellipses.web, colors.web: LDF 2002.12.18.
	Changed |#if TRUE| to |#if 1| and |if FALSE| to |#if 0|.
	|TRUE| and |FALSE| are not predefined by the preprocessor used
	by the GNU compiler GCC under GNU/Linux on the Intel i686 computers.
	It also seemed not to work when I tried to define them using
	``@d TRUE 1'' and ``@d FALSE 0'' in \filename{pspglb.web}.  They
	seemed not to be defined in the other CWEB files.  I don't like preprocessor
	macros anyway, so it's just as well to be rid of them.

2002-12-13  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* run_mp: New file.

	* persp.tex: LDF 2002.12.13.
	Now loading \filename{persp.base} using the complete path name.
	This makes it possible to include this file in {\TeX} files that
	are in subdirectories of this directory.

	* points.web: LDF 2002.12.13.
	Corrected declarations of |INVALID_BOOL_REAL_POINT| and
	|INVALID_BOOL_POINT_QUADRUPLE| for the header file:  they weren't
	declared |extern|, but should have been.

	Put in a ``START HERE'' note to myself to comment |string pen| back in.
	I should see if it works, and if it doesn't, should try to find and fix
	the problem.

	* transfor.web: LDF 2002.12.13.
	Minor changes involving debugging code.

	* solids.web: LDF 2002.12.13.
	Resizing a |valarray| in |set_extremes()| in order to be able to
	compile under GNU/Linux using GCC on the Intel i686
	computer gwdu101.gwdg.de.

	* pspglb.web: LDF 2002.12.13.
	Added preprocessor conditionals for compiling for the DEC ALPHA computer
	gwdu70 using the DEC compiler under Tru64 Unix or the Intel i686 computer
	using GCC under GNU/Linux.

	The |numeric_limits| template doesn't seem to be available using GCC, so I
	use the macros |FLT_MAX| and |DBL_MAX| in order to set |INVALID_REAL| and
	|MAX_REAL| for the Linux version.

	Discovered that |(max() - |epsilon()) == max()|| for |float| and |double|,
	and that the same is true when the macros |FLT_MAX|, |DBL_MAX|, |FLT_EPSILON|,
	and |DBL_EPSILON| are used.  Fixed the problem, but not in an elegant way.  I've
	written a ``TO DO'' note to myself to take care of the problem.

	* points.web: LDF 2002.12.13.
	Numerous changes involving porting to
	the Intel i686 computer gwdu101 under GNU/Linux.
	This version has been copied from the last version of
	\filename{points.web} that I was using for porting in a separate directory.
	I will be making a couple of changes, but I will put them in the next version.

	Declared |Transform::align_with_axis(Point, Point, char)|
	a |friend| of |class Point|.  Made various changes to it.

	Commented-out the declaration |string pen| in |class Point| and all code
	using |Point::pen|.  Will try uncommenting these things in the next version.

	|INVALID_BOOL_REAL_POINT| and |INVALID_BOOL_POINT_QUADRUPLE| are
	not declared |extern| here.  This is an error, and will be corrected in
	the next version.

	Added preprocessor conditionals for setting the original values of
	|world_coordinates|, |user_coordinates|, |view_coordinates|, and
	|projective_coordinates|:  Using the DEC compiler, they are simply set to
	|null_coordinates|, while using GCC, they are resized and the elements are
	set to 0.

	Added section |@<Define |Point| constructors@>| so that |Points| can be declared
	as global constants and/or variables before the the |Point| member functions are
	defined.  This wasn't necessary for DEC, but it is for Linux.

	Added debugging code to |@<Normalize point@>|.  Now using |world_coordinates|
	directly instead of |get_x()|, |get_y()|, etc.

	Resizing |valarrays| because this is necessary with GCC on the Linux computer.

	In |angle()|:  Note to check whether |Points| are colinear first.  This caused
	a problem in the Linux version which I didn't have using the DEC computer.
	Fixed the problem, but using a kludge.  Put in a note to myself to fix it.

	Moved |Picture::operator=()| and the copy constructor for |Pictures|
	from \filename{pictures.web} to here.

	 from \filename{pictures.web} to here.

	* pictures.web: LDF 2002.12.13.
	Moved copy constructor and assignment operator to \filename{points.web}.
	This was necessary in order to be
	able to port to the Intel i686 computer gwdu101 under GNU/Linux.

	* paths.web: LDF 2002.12.13.
	Resizing a |valarray| in |show()|.  This is necessary in order to be
	able to port to the Intel i686 computer gwdu101 under GNU/Linux.

	* main.web: LDF 2002.12.13.
	Added test for whether |INVALID_REAL| is equal to |MAX_REAL|.
	They shouldn't be.

	* loader.web: LDF 2002.12.13.
	Added preprocessor commands for conditional compilation so that
	3DLDF will compile on the DEC ALPHA computer gwdu70 under TRU64 Unix
	and on the Intel computer gwdu101 under Linux.

	* lines.web: LDF 2002.12.13.
	This version contains changes made in order to port to GNU/Linux.

	Added section |@<Declare |Line| constructors@>|.  This was necessary, in order
	to be able to declare |INVALID_LINE| using a constructor before declaring
	and defining |Line| functions thatuse |INVALID_LINE|.  This was not necessary
	on the DEC ALPHA computer gwdu70 under Compaq Tru64 UNIX V5.1, but was on
	the Intel computer gwdu101 under GNU/Linux.

	Added debugging code.

	* cmplprsp.web: LDF 2002.12.13.
	No changes.  This file is now obsolete.  Using ./DEC/cmplDEC.web and
	./LINUX/cmplLIN.web for compiling for the different platforms instead.
	May add ./FREEBSD/cmplBSD.web, too.

	I plan on trying to control recompilation with Autoconf and Automake
	instead of using cmpl<platform>.web and proc<platform>.web, but as of
	this date, I'm still using the latter.

	* procfile.web: LDF 2002.12.13.
	No changes.  This file is now obsolete.  Using ./DEC/procDEC.web and
	./LINUX/procLIN.web for compiling for the different platforms instead.
	May add ./FREEBSD/procBSD.web, too.

	I plan on trying to control recompilation with Autoconf and Automake
	instead of using cmpl<platform>.web and proc<platform>.web, but as of
	this date, I'm still using the latter.

	* transfor.web: LDF 2002.12.13.
	Added debugging code to |inverse()|.

	* points.web: LDF 2002.12.13.
	Added debugging code to |align_with_axis()|.

	* persp.tex: LDF 2002.12.13.
	Removed ``\input persp.macs'', since I've gotten rid of the latter.

	* paths.web: LDF 2002.12.13.
	Added ``START HERE'' comment.

	* main.web: LDF 2002.12.13.
	No significant changes.

	* loader.web: LDF 2002.12.13.
	Added an ``#ifdef __DECCXX'' conditional.

	* lines.web: LDF 2002.12.13.
	Added debugging code.

2002-12-04  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: LDF 2002.12.04.
	Added {\TeX} comment.
	Formatting changes.

2002-12-01  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transfor.web: LDF 2002.12.01.
	In |inverse()|:  Changed |hi| from |real| to |int| because of a warning, when I tried
	to compile under GNU/Linux.  I think |hi| can be an |int|, but I put in a note to myself,
	to test to be sure.

	* points.web: LDF 2002.12.01.
	Made all of the arguments |const| in the constructor and setting function
	taking 3 |real| arguments.

	* points.web: LDF 2002.12.01.
	Minor formatting changes.

2002-11-19  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transfor.web: LDF 2002.11.19.
	Formatting changes.
	Changed return value of |operator*=(real)| from |Transform| to |real|.  Now the
	argument is returned to facilitate chaining invocations of this function.

	* shapes.web: LDF 2002.11.19.
	Copied revision 1.50.1.2 into revision 1.50.
	See log entry for the former for the changes.

	* cmplprsp.web: LDF 2002.11.19.
	Copied revision 1.47.1.3 into revision 1.47.

	Name changes to the files that had names longer than 8 letters, so that
	they can be used under DOS:
	\filename{transform.c} $\longrightarrow$ \filename{transfor.c}.
	\filename{rectangles.c} $\longrightarrow$ \filename{rectangs.c}
	\filename{solids_faced.c} $\longrightarrow$ \filename{solfaced.c}.
	\filename{polyhedra.c} $\longrightarrow$ \filename{polyhed.c}.
	\filename{cweavedriver.web} $\longrightarrow$ \filename{cwdriver.web}.

	Changed \filename{persp.c} to \filename{main.c}.

	\filename{parser.web} is now compiled and linked.  This has to do with the
	input routine, which I've started to experiment with.

	* points.web: LDF 2002.11.19.
	Merged revision 1.181.1.2 into revision 1.181.  This is the result.  There were no changes
	to revision 1.181 in the meantime, so I've really just put revision 1.181.1.2 onto the
	main branch.

	Some changes involve the input routine, which I've just begun to experiment with.
	I've put this version onto the main branch, because I'm going to start putting in the
	changes from the last print-out (2002.11.12), and I don't want to have to merge
	rev.~1.181.1.2 into the main branch after I've done that:
	1. Added the sections |@<Declare Shape wrapper functions@>| and
	   |@<Define Shape wrapper functions@>|.

	2.  Added ``wrapper functions'' for |Point()| and |set()|, namely
	|swf_0()| and |swf_1()|.  I plan to change the numbering, once I start adding wrapper
	functions in the files compiled before \filename{points.web}.

	3.  Added |Point::update_shape_func_map()|.  There will have to be versions for the other
	    classes as well.

	Other changes have to do with the name changes I've performed so that all source file names
	have 8 letters or less.
	\filename{cweavedriver.web} $\longrightarrow$ \filename{cwdriver.web}
	\filename{transform.web} $\longrightarrow$ \filename{transfor.web}.

2002-11-18  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* solids.web, shapes.web, pspglb.web, procfile.web, polyhed.web, polygons.web, points.web, planes.web, pictures.web, patterns.web, paths.web, parser.web:
	LDF 2002.11.18.

	Made changes to correspond to the following changes in \CWEB/ filenames:
	\filename{transform.web} to \filename{transfor.web}
	\filename{rectangles.web} to \filename{rectangs.web}
	\filename{solids_faced.web} to \filename{solfaced.web}
	\filename{polyhedra.web} to \filename{polyhed.web}
	\filename{cweavedriver.web} to \filename{cwdriver.web}.

	* main.web: LDF 2002.11.18.
	This file was formerly \filename{persp.web}.  Changed the
	name because I think \filename{main.web} makes more sense.

	Made changes to correspond to the following changes in \CWEB/ filenames:
	\filename{transform.web} to \filename{transfor.web}
	\filename{rectangles.web} to \filename{rectangs.web}
	\filename{solids_faced.web} to \filename{solfaced.web}
	\filename{polyhedra.web} to \filename{polyhed.web}
	\filename{cweavedriver.web} to \filename{cwdriver.web}.

	* loader.web, lines.web, layers.web, io.web, ellipses.web:
	LDF 2002.11.18.

	Made changes to correspond to the following changes in \CWEB/ filenames:
	\filename{transform.web} to \filename{transfor.web}
	\filename{rectangles.web} to \filename{rectangs.web}
	\filename{solids_faced.web} to \filename{solfaced.web}
	\filename{polyhedra.web} to \filename{polyhed.web}
	\filename{cweavedriver.web} to \filename{cwdriver.web}.

	* cwdriver.web: LDF 2002.11.18.
	This file was formerly \filename{cweavedriver.web}.  Changed the
	name so that it has 8 or fewer letters in the name, so it can be used
	under DOS.

	Made changes to correspond to the following changes in \CWEB/ filenames:
	\filename{transform.web} to \filename{transfor.web}
	\filename{rectangles.web} to \filename{rectangs.web}
	\filename{solids_faced.web} to \filename{solfaced.web}
	\filename{polyhedra.web} to \filename{polyhed.web}
	\filename{cweavedriver.web} to \filename{cwdriver.web}.

	* curves.web, cuboid.web: LDF 2002.11.18.

	Made changes to correspond to the following changes in \CWEB/ filenames:
	\filename{transform.web} to \filename{transfor.web}
	\filename{rectangles.web} to \filename{rectangs.web}
	\filename{solids_faced.web} to \filename{solfaced.web}
	\filename{polyhedra.web} to \filename{polyhed.web}
	\filename{cweavedriver.web} to \filename{cwdriver.web}.

	* colors.web: LDF 2002.11.18.

	Made changes to correspond to the following changes in \CWEB/ filenames:
	\filename{colors_all.web} to \filename{colall.web}.
	\filename{transform.web} to \filename{transfor.web}
	\filename{rectangles.web} to \filename{rectangs.web}
	\filename{solids_faced.web} to \filename{solfaced.web}
	\filename{polyhedra.web} to \filename{polyhed.web}
	\filename{cweavedriver.web} to \filename{cwdriver.web}.

	* colall.web: LDF 2002.11.18.
	This file was formerly \filename{colors_all.web}.  Changed the
	name so that it has 8 or fewer letters in the name, so it can be used
	under DOS.

	Made changes to correspond to the following changes in \CWEB/ filenames:
	\filename{transform.web} to \filename{transfor.web}
	\filename{rectangles.web} to \filename{rectangs.web}
	\filename{solids_faced.web} to \filename{solfaced.web}
	\filename{polyhedra.web} to \filename{polyhed.web}
	\filename{cweavedriver.web} to \filename{cwdriver.web}.

	* circles.web: LDF 2002.11.18.
	Made changes to correspond to the following changes in \CWEB/ filenames:
	\filename{transform.web} to \filename{transfor.web}
	\filename{rectangles.web} to \filename{rectangs.web}
	\filename{solids_faced.web} to \filename{solfaced.web}
	\filename{polyhedra.web} to \filename{polyhed.web}
	\filename{cweavedriver.web} to \filename{cwdriver.web}.

	* cmplprsp.web: LDF 2002.11.18.
	Made changes to correspond to the following changes in \CWEB/ filenames:
	\filename{transform.web} to \filename{transfor.web}
	\filename{rectangles.web} to \filename{rectangs.web}
	\filename{solids_faced.web} to \filename{solfaced.web}
	\filename{polyhedra.web} to \filename{polyhed.web}.

	* rectangs.web, solfaced.web, transfor.web: New file.

	* transform.web: LDF 2002.11.18.
	Minor changes in Emacs local variables list.

	About to copy this file to \filename{transfor.web} and stop using this file.
	The name of \filename{transfor.web} has 8 letters, so I can
	use it under DOS.

	* solids_faced.web: LDF 2002.11.18.
	Minor changes in Emacs local variables list.

	Changes in ``|#include|'' commands to reflect changes in the names of
	some of the \CWEB/ files.

	About to copy this file to \filename{solfaced.web} and stop using this file.
	The name of \filename{solfaced.web} has 8 letters, so I can
	use it under DOS.

	* polyhed.web: New file.

	* rectangles.web: LDF 2002.11.18.
	Minor changes in Emacs local variables list.

	About to copy this file to \filename{rectangs.web} and stop using this file.
	The name of \filename{rectangs.web} has 8 letters, so I can
	use it under DOS.

	* polyhedra.web: LDF 2002.11.18.
	Minor changes in Emacs local variables list.

	About to copy this file to \filename{polyhed.web} and stop using this file.
	The name of \filename{polyhed.web} has fewer than 8 letters, so I can
	use it under DOS.

	* main.web, cwdriver.web: New file.

	* colors.web: LDF 2002.11.18.
	I've changed all references to \filename{colors_all.web} in this file
	to \filename{colall.web}.  This is so the name of \filename{colall.web}
	has fewer than 8 letters,
	and can be used under DOS.

	* colall.web: LDF 2002.11.18.
	This file was formerly called \filename{colors_all.web}.
	I've changed its name, so that it has fewer than 8 letters,
	and can be used under DOS.  I've changed all references to it
	in \filename{colors.web}, too.

	* colall.web: New file.

2002-11-17  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* parser.web: LDF 2002.11.17.
	Now using this file.  I've started to experiment with implementing
	the input routine.  The other files that I've started to modify for this purpose
	are on branches, but I don't think it's necessary to make a branch for this file,
	because it wasn't being used before.

	Updated the ``|#include|'' commands to reflect changes since the last time
	I worked on this file.

	Added |parse()| with a dummy definition.

	* cweavedriver.web: LDF 2002.11.17.
	Now including \filename{parser.web}.  Added a few formatting commands.

	* persp.web: LDF 2002.11.17.
	First version on branch for testing the input routine.

	Now including \filename{parser.h} and calling |Point::update_shape_func_map()|.

	I will have to call other versions of |update_shape_func_map()| once I've defined
	them for the other classes.

	* shapes.web: LDF 2002.11.17.
	First version on branch for testing the input routine.

	Added |typedef void (*Shape_Func_Ptr)(Shape*, string)| and
	|map<string, Shape_Func_Ptr> shape_func_map|.  Pointers to
	``Wrapper functions'' are pushed onto |shape_func_map| with the names of
	other functions as their keys.  When the input routine routine reads a
	|string|, it looks it up in |shape_func_map| and calls the wrapper function.
	The latter is responsible for calling the appropriate function and passing it
	its arguments, which the wrapper function will have extracted from
	the |string| which is passed to the wrapper function.  If the wrapper function's
	|Shape*| argument is non-zero, it may call a class function on the object pointed
	to by the |Shape*|.  Alternatively, it may pass the |Shape*| as an argument to the
	function, or deference the pointer and pass the object itself.

	About to add |shape_map|, which will contain |Shape| pointers for objects created
	dynamically by the input routine.

	* points.web: LDF 2002.11.17.
	First version on branch for testing the input routine.

	Added the sections |@<Declare Shape wrapper functions@>|,
	|@<Define Shape wrapper functions@>|, and the |static| function
	|Point::update_shape_func_map()|.

	Added the ``Shape wrapper functions'' |swf_0()| for the |Point| constructors
	and |swf_1()| for the |Point| setting functions.  They currently contain dummy
	definitions.  Pointers to these functions are pushed onto |shape_func_map|,
	which is declared in \filename{shapes.web}.

	* cweavedriver.web: LDF 2002.11.17.
	First version on branch where \filename{parser.web} is included.
	About to start experimenting with implementing an input routine.

	* cweavedriver.web: LDF 2002.11.17.
	Various changes and additions.
	About to branch off from this version in order to include
	\filename{parser.web}.

	* cmplprsp.web: LDF 2002.11.17.
	Minor formatting change.

	* cmplprsp.web: LDF 2002.11.17.
	First version on branch for testing the input routine.

	It compiles \filename{parser.web}
	and links it with the rest of 3DLDF.

	* persp.web: LDF 2002.11.17.
	No significant changes.

	About to make a branch for implementing the input routine.

2002-11-16  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transform.web: LDF 2002.11.16.
	Added a remark in the \TeX/ code.

	* points.web: LDF 2002.11.16.
	No significant changes.

	* curves.web: LDF 2002.11.16.
	Added a remark in the \TeX/ code.

2002-11-15  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polyhedra.web: LDF 2002.11.15.
	Started redoing |Dodecahedron::draw_net()|.

2002-11-12  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polyhedra.web: LDF 2002.11.12.
	Minor change.

	* polyhedra.web: LDF 2002.11.12.
	Added |Tetrahedron::set()|, and it works, but it fails to assign to the
	data members of |Tetrahedron| that are defined in its own |class|
	declaration.  That's because neither |Tetrahedron| nor |Polyhedron|
	has an assignment operator yet.  Put in note to myself to take care of this.

	* polyhedra.web: LDF 2002.11.12.
	Finished the |Tetrahedron| constructor with arguments for |center|,
	|triangle_diameter|, and angles of rotation.  I don't know how to derive the
	center of a tetrahedron, and a couple of attempts to do so have failed.  I'm
	using the center of the bottom triangle (the one that lies in the x-z plane
	if the |Tetrahedron| isn't rotated) as the center.

	* solids.web: LDF 2002.11.12.
	Added \TEX/ text.

	* polyhedra.web: LDF 2002.11.12.
	Added |class Tetrahedron|.  Finished |Tetrahedron::draw_net()|.
	|Tetrahedron::draw_net()| draws the net in the x-y plane and has traces of
	the tabs on the triangles that do not have a tab attached.  Both the tabs and
	the traces of the tabs have dots for holes.  I want to try stitching the cardboard
	models together, and/or using thread to pull the faces together when gluing them.

	About to start working on the |Tetrahedron| constructor with arguments for the
	center, the diameter of the triangles, and the angles of rotation.

	* solids.web: LDF 2002.11.12.
	Changed |create_new_Reg_Polygon()| to |create_new_reg_polygon()|.
	The former was an error that occured when I called the Emacs function
	{\bf query-replace}.

	* points.web: LDF 2002.11.12.
	Discovered bug in |Point::intersection_point()|:  It failed when I tried to
	find an intersection point in lines that were already in the x-z plane.  Will read
	through code and see if I can fix it.  It may be possible to get rid of this
	function if I succeed in getting a version to work that uses vector arithmetic
	instead of finding traces on the major planes.

	* polygons.web: LDF 2002.11.12.
	Changed |create_new_Reg_Polygon()| to |create_new_reg_polygon()|.
	The former was an error that occured when I called the Emacs function
	{\bf query-replace}.

	* persp.web: LDF 2002.11.12.
	No significant changes.

	* cweavedriver.web: LDF 2002.11.12.
	Formatting changes.

	* solids.web, rectangles.web: LDF 2002.11.12.
	Changed |Regular_Polygon| to |Reg_Polygon|,
	because the old name caused too many ``Overfull boxes''
	when \cweave/ was run.

	* pspglb.web: LDF 2002.11.12.
	Formatting change.

	* procfile.web: LDF 2002.11.12.
	Formatting changes.

	* polyhedra.web: LDF 2002.11.12.
	Changed |Regular_Polygon| to |Reg_Polygon|, |Regular_Closed_Plane_Curve| to
	|Reg_Cl_Plane_Curve|, and |Truncated_Octahedron| to |Trunc_Octahedron|, because
	the old names caused too many ``Overfull boxes'' when \cweave/ was run.

	* polygons.web: LDF 2002.11.12.
	Changed |Regular_Polygon| to |Reg_Polygon| and |Regular_Closed_Plane_Curve| to
	|Reg_Cl_Plane_Curve|, because
	the old names caused too many ``Overfull boxes'' when \cweave/ was run.

	* points.web: LDF 2002.11.12.
	Formatting changes.

	Changed |Regular_Polygon| to |Reg_Polygon|, |Regular_Closed_Plane_Curve| to
	|Reg_Cl_Plane_Curve|, and |Truncated_Octahedron| to |Trunc_Octahedron|, because
	the old names caused too many ``Overfull boxes'' when \cweave/ was run.  These names
	only occur in \TEX/ text in this file.

	* patterns.web: LDF 2002.11.12.
	Changed the name ``|Regular_Polygon|'' to
	``|Reg_Polygon|'', because the former caused too many
	``Overfull boxes'' when running \cweave/.

	* paths.web, lines.web, io.web: LDF 2002.11.12.
	Formatting changes.

	* ellipses.web: LDF 2002.11.12.
	Changed the name ``|Regular_Closed_Plane_Curve|'' to
	``|Reg_Cl_Plane_Curve|'', because the former caused too many
	``Overfull boxes'' when running \cweave/.

	* curves.web: LDF 2002.11.12.
	Formatting changes.

	Changed the name ``|Regular_Closed_Plane_Curve|'' to
	``|Reg_Cl_Plane_Curve|'', because the former caused too many
	``Overfull boxes'' when running \cweave/.

	* cmplprsp.web: LDF 2002.11.12.
	Formatting changes.

	* 3DLDF.macs: LDF 2002.11.12.
	Added comment:
	The argument to \ARG should be followed by \relax
	in order to suppress a space at the beginning of the first line of
	the following indented paragraph.  I couldn't figure out a way of
	suppressing the space within the definition of \ARG.

	* circles.web: LDF 2002.11.12.
	In the {\TeX} code for |Circle::segment()|:
	Added ``\.{\char`\\relax}'' after the arguments to
	``\.{\char`\\ARG}'' in order to suppress a
	space at the beginning of the first line of the following indented
	paragraph.  I couldn't figure out a way of suppressing the space
	within the definition of \.{\char`\\ARG}.

	* points.web: LDF 2002.11.12.
	In the {\TeX} code for |Point::show()| and |Point::label()|:
	Added ``\.{\char`\\relax}'' after the arguments to
	``\.{\char`\\ARG}'' in order to suppress a
	space at the beginning of the first line of the following indented
	paragraph.  I couldn't figure out a way of suppressing the space
	within the definition of \.{\char`\\ARG}.

2002-11-10  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* ellipses.web: LDF 2002.11.10.
	Changed return value of |operator=()| to |Ellipse&|.

	Made |const| and non-|const| versions of |get_center()| |virtual| and non-|inline|.

	* circles.web: LDF 2002.11.10.
	Changed and simplified the version of |operator=()| with
	a |const Circle&| argument and the version with a |const Ellipse&| argument.
	They now use |Ellipse::operator=()|.

	removed |get_center()|.  The |Ellipse| version takes care of it.

	* polyhedra.web:
	LDF 2002.11.10.  Added |Icosahedron::draw_net()|.  It works to output the net
	in portrait format

	Tried to get |Dodecahedron::draw_net()| to output in portrait format, too, but
	it doesn't work yet.  Put in note to myself to work on this.

	* polyhedra.web: LDF 2002.11.10.  Finished |Dodecahedron::draw_net()|.

2002-11-09  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polyhedra.web: LDF 2002.11.09.
	Working on |Dodecahedron::draw_net()|.  Working on drawing the
	tabs.

2002-11-08  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polyhedra.web: LDF 2002.11.08.
	Started working on |Dodecahedron::draw_net()|.

	Got rid of pure |virtual| function
	|Polyhedron::get_net()|.  I've made it |static| in the classes derived
	from |Polyhedron|, which makes more sense.  |virtual| functions must
	be non-|static|.

	* paths.web, points.web, ellipses.web: LDF 2002.11.08.
	Formatting changes.

	* circles.web: LDF 2002.11.08.
	Added optional |Circle*| argument to |create_new_circle()|.

	Added version of |create_new_circle()| with required |const Circle&|
	argument.

	* rectangles.web, polygons.web: LDF 2002.11.08.
	Formatting changes.

	* persp.tex: LDF 2002.11.08.
	No significant changes.

	* points.web: LDF 2002.11.08.
	Added a kludge in |Picture::output()|:  If the magnitude of the numbers in
	|projective_coordinates| are too small, they're output in exponential format,
	which \MP/ doesn't understand.  So they're now set to 0.  I put in
	a note to myself to make sure that they're only output in decimal notation.

	* polyhedra.web: LDF 2002.11.08.
	Finished the constructor of |Truncated_Octahedron| with arguments for
	center, diameter of hexagon, and angles of rotation.

	Finished |Truncated_Octahedron::get_net()|.

2002-11-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: LDF 2002.11.06.
	Changes in \TeX/ code.

	* polyhedra.web: LDF 2002.11.06.
	Working on |Truncated_Octahedron::get_net()|.

	* persp.web, cweavedriver.web: LDF 2002.11.06.
	Minor changes.

	* cwebmac.tex: LDF 2002.11.06.
	Changed definitions of \lheader and \rheader, so that \bf works in them properly.

	* points.web: LDF 2002.11.06.
	Added note to myself.

	* rectangles.web: LDF 2002.11.06.
	Minor correction.

	* pspglb.web: LDF 2002.11.06.
	Added |extern const real_pair INVALID_REAL_PAIR|.

	* ellipses.web: LDF 2002.11.06.

	Typed in changes from print-out from 2002.09.03.

	Formatting changes.

	Made |real| arguments |const| in constructor with arguments for center, lengths
	of the axes, and angles of rotation.  There is no corresponding |set()|.  Also modified
	some code in this function.

	Added optional |const Ellipse*| argument to |create_new_ellipse()| and added
	a version with an explicit |const Ellipse&| argument.

	Added error handling code prevent self-assignment in |operator=()|.

	Changed |dotlabel()| so that it just calls
	|Ellipse::label()| with |dot = true|.  Made it |inline|.

	Must read through |intersection_points()| and then make changes!  I don't understand
	how it works anymore.

	* points.web: LDF 2002.11.06.
	Got rid of superfluous \CWEB/ indexing command.

	* polygons.web: LDF 2002.11.06.

	Minor formatting changes.

	* rectangles.web: LDF 2002.11.06.
	Made |real| arguments |const| in the constructor and setting function
	with arguments for the centter, lengths, and angles.

	Changed return value from |void| to
	|const Regular_Polygon&| in |operator=()|.

	Got rid of |get_center()|.  It's not needed, since
	|Regular_Polygon::get_center()| does the trick.

	Changed |mid_point()| so that it uses |mediate()|.

	* transform.web:
	LDF 2002.11.06.  Changed |operator*=()|.  The argument |t| is
	now a |const Transform&| instead of a |const Transform|.  If |t|
	is the identity |Transform|, it is returned right away.
	If |*this| is, it is set to |t| using
	|operator=()|.  BUG FIX:  Now |t| is always returned,
	instead of |*this|.  This makes it possible to chain expressions
	using this function.

	* solids.web, rectangles.web, polyhedra.web: LDF 2002.11.06.
	Changed |Polygon| to |Regular_Polygon|.

	* points.web: LDF 2002.11.06.
	Added version of |create_new_point()| with |real| arguments.

	BUG FIX:  |operator*=()| now returns the |const Transform&| argument |t|
	(actually, a temporary, not a constant reference) rather than
	|this->transform|.

	Formatting changes.

	Changed default value of |focus|.

	* patterns.web: LDF 2002.11.06.
	Changed |Polygon| to |Regular_Polygon|.

	* paths.web: LDF 2002.11.06.
	Added optional |const bool verbose| and |string text|
	arguments to |is_planar()| and |is_linear()| for writing a message
	to the standard output.

	Minor change in the way |return| is called in the affine transformation
	functions and |operator*=()|.

	* ellipses.web: LDF 2002.11.06.
	Changed |Plane_Curve| to |Regular_Closed_Plane_Curve|.

	* curves.web: LDF 2002.11.06.
	Changed |Plane_Curve| to |Regular_Closed_Plane_Curve|.

	Working on typing in corrections from print-out from 2002.09.03.  However, I must
	reread |intersection_points()| and |location()|, because I don't know how they work
	anymore.

	* polygons.web: LDF 2002.11.06.
	Changed |Polygon| to |Regular_Polygon|.

	Typed in corrections from print-out from 2002.09.03.

	Changed |Regular_Polygon::sides| from |unsigned int| to |unsigned short|.  Changed
	argument for setting it in the constructors and setting functions to
	|const unsigned short|.

	Added optional |const| pointer to |Regular_Polygon| argument to
	|create_new_regular_polygon()|.
	Added version of |create_new_regular_polygon()| with explicit
	|const Regular_Polygon&| argument.

	Got rid of unneeded, commented-out code in |operator=(const Regular_Polygon&)|.

	In |operator*=(const Transform&)|:  Now calling |Path::operator*=()| instead
	of looping through |points|.  This way, if I change |Path::operator*=()|, the
	change will automatically be reflected in the |Regular_Polygon| version.

2002-11-05  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web: LDF 2002.11.05.
	No significant changes.

	* persp.tex, points.web, cweavedriver.web: LDF 2002.11.05.

	No significant changes.

	* 3DLDF.macs: LDF 2002.11.05.
	Added \BRVS (begin return values),
	\ERVS (end return values), and \RV (return value) for typesetting
	explanations of the return values of functions.

	* curves.web: LDF 2002.11.05.
	Formatting changes.

	* polygons.web: LDF 2002.11.05.  Added note to self.

	* curves.web: LDF 2002.11.05.
	Typing in corrections from print-out from 2002.09.03.

	Formatting changes.

	Made changes to |location()| and |intersection_points()|.  I hope I
	haven't ruined anything.  I don't understand how these functions work
	anymore, so I will read through the print-out from 2002.09.03 again.

	* paths.web: LDF 2002.11.05.
	Finished typing in corrections from print-out from 2002.09.03.

	Formatting changes.

	Made |bool c| argument |const| in |set_cycle()|.

	Made |get_point()| and |get_last_point()| non-|inline| and
	changed their return values to |const Point&|.  Added error messages.

	Changed name of section
	|@<Define |static| |class Path| member variables@>| to
	|@<Define |static| |class Path| data members@>|.

	* paths.web: LDF 2002.11.05.
	Rewrote slope() and commented it back in.

	Rewrote |subpath()|.

	* cmplprsp.web: LDF 2002.11.05.
	Added a ``TO DO'' note.

	* paths.web: LDF 2002.11.05.
	Rewrote |get_normal()|.  It now tries to calculate a normal to the
	plane of the |Path|.  If the |Path| is non-planar, it returns
	|INVALID_POINT|.  If it is linear, it returns |origin|.  Otherwise,
	it returns a unit vector representing the normal to the plane of the
	|Path|.

	Rewrote |is_planar()| and |get_plane()| to use the new version of
	|get_normal()|.

	Added |is_linear()| and renamed |is_line()| to |get_line_switch()|.

2002-11-03  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web, ellipses.web: LDF 2002.11.03.
	Changed name of |Path::is_line()| to |Path::get_line_switch()|.

	* paths.web: LDF 2002.11.03.
	Changed |is_line()| to |get_line_switch()| and added |is_linear()| for |Paths|.
	The latter actually tests the |Points| in the |Path| for colinearity.

	* paths.web: LDF 2002.11.03.
	Typing in corrections from print-out from 2002.09.03.

	Got rid of section |@<Apply |Transform| to |points|@>|.

	Added version of |align_with_axis()| with assignment.

	Changed |Point| arguments to |const Point&| in non-line version of |align_with_axis()|.

	Made |operator&=()| non-|inline| and now using |*(points.back())| instead of
	|get_point(points.size() - 1)| in it.

	In the drawing and filling commands:  changed |dynamic_cast()| to |static_cast()|.

	Got rid of |stringstream| in |label()|.

	Rewrote |is_planar()|.  It now actually checks whether a |Path| is planar
	or not.

	* pspglb.web: LDF 2002.11.03.
	Moved |CURR_Y| and |CURR_Z| from \filename{pspglb.web} to \filename{points.web}
	and made them |static| data members of |class Point|.

	* points.web: LDF 2002.11.03.
	Minor formatting changes.

	Changed |Point::undraw()| so that it returns a |Path|, like |Point::draw()|.

	Changed |int| argument of |label()| and |dotlabel()| to |short|.

	Moved |CURR_Y| and |CURR_Z| from \filename{pspglb.web} to \filename{points.web}
	and made them |static| data members of |class Point|.

	* transform.web: LDF 2002.11.03.
	Minor formatting changes.

	* polygons.web:
	LDF 2002.11.03.  Removed |Polygon::is_planar()|.  A |Polygon| can be
	manipulated into a non-planar state, so it's safer to use the |Path|
	version, which tests whether it's really planar or not.

	* curves.web: LDF 2002.11.03.
	Removed |Plane_Curve::is_planar()|.  A |Plane_Curve|
	can be manipulated into a non-planar state, so it's safer to use the |Path|
	version, which tests whether it's really planar or not.

2002-10-31  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polyhedra.web: LDF 2002.10.31.
	Started adding Archimedean polyhedra.
	Added |class Truncated_Octahedron|.  Copied the code for |Icosahedron|
	and started modifying it.  Haven't programmed |get_net()| yet.

	Made |Dodecahedron::dihedral_angle|,
	|Icosahedron::dihedral_angle|, |Truncated_Octahedron::angle_hex_hex|,
	and |Truncated_Octahedron::angle_hex_square| |static const| data members
	and added sections for defining them.

2002-10-29  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web: LDF 2002.10.29.
	Changed |create_new_path()| so that there are two versions.  One takes an
	optional |const Point*| and the other takes a |const Path&|.  The new |Path|
	is assigned to using the argument, if any.

	* pspglb.web:
	LDF 2002.10.29.  Added forward declaration of |class Circle|.  Removed it from
	\filename{paths.web}.

	* paths.web: LDF 2002.10.29.

	Typing in corrections from print-out from 2002.09.03.

	Changed calls to |create_new_point()| to use the versions that take
	|const Point*| or |const Point&| arguments.  Got rid of pointers to
	|Point| that were now now longer needed.

	Bug fix in |Path(Point* first_point_ptr ...)| and
	|set(Point* first_point_ptr ...)|:  No longer pushing
	|first_point_ptr| onto |points|.  Copying it instead.

	* points.web:
	LDF 2002.10.29.  Added |create_new_point()| with required |const Point&| argument.

	* points.web: LDF 2002.10.29.  Made |create_new_point()| non-|inline|.
	Added argument |const Point* p|.  If |p != 0|, the new |Point| is
	assigned to using the values from |p|.

	* planes.web: LDF 2002.10.29.  Minor formatting change.

	* planes.web:
	LDF 2002.10.29.  Finished typing in corrections from print-out from
	2002.09.03.

	Formatting changes.

	Put in notes to myself to look up how functions work and then explain them.

	* lines.web:
	LDF 2002.10.29.  Finished typing in corrections from print-out from
	2002.09.03.

	Formatting changes.

	Made changes to |get_distance()|.  This function doesn't work!  Put in a note to
	myself to fix it.

	* pictures.web: LDF 2002.10.29.
	Made |Label::get_copy()| |const|.

	Made argument |Picture& p| in declaration of |Picture::operator+=()|
	|const|.  Also fixed bugs in the definition, which is in
	\filename{points.web}.

	* points.web:
	LDF 2002.10.29.  Finished typing in corrections from print-out from
	2002.09.03.

	Formatting changes.


	Fixed bug in |is_on_segment()|.  It now checks that the unit vectors
	|*this - p0| and |p1 - *this| are equal or that |*this - p0| and
	-|p1 - *this| are equal in order to see if |*this| is on the line
	passing through the two |Point| arguments.

	Now using |world_coordinates| directly instead of
	|get_x()|, |get_y()|, and |get_z()| in |is_on_segment()|.

	Added |const| version of |is_on_segment()|.

	Added |is_on_line()|.


	In |Picture::operator+=()|:  Made argument |Picture& p| |const| and fixed
	bugs that changed |p|.

2002-10-27  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web, cweavedriver.web: LDF 2002.10.27.
	No significant changes.

	* points.web: LDF 2002.10.27.
	Typing in corrections from print-out from 2002.09.03.
	Formatting changes.

	Changed a lot of |const Point&| arguments to |Point| because I was having
	to copy them anyway, in order to call |apply_transform()| on them.  They can't
	be |Point&|, because the arguments might be |const|.

	* transform.web: LDF 2002.10.27.
	Changed the only footnote in this file so that it uses \\fnote instead of
	\\footnote.

	Broke up |@<Global variables and constants@>| into
	|@<Global variables@>| and |@<Global constants@>|, because it caused
	problems in \cweave/.

	* solids.web, shapes.web, paths.web: LDF 2002.10.27.
	Made |get_copy()| |const|.

	* 3DLDF.macs: LDF 2002.10.27.
	Commented out \\newif\\ifdolog.  Changed definition of \\LOG and \\ENDLOG.

	Added \\BARGS, \\EARGS, and \\ARG for typesetting explanations of the arguments
	to functions.

	Added \\fntctr and \\fnote for typesetting footnotes.

	* points.web: LDF 2002.10.27.
	Typing in corrections from print-out from 2002.09.03.  Lots of
	formatting changes.

	Replaced explicit code for typesetting arguments with \VRB\BARGS§EVRB
	(begin arguments), \VRB\EARGS§EVRB (end arguments), and \VRB\ARG§EVRB
	(argument).

	Redefined |clear()|.  Formerly, it was inline and
	did nothing (empty function definition).  Now it sets all of the x, y,
	and z coordinates to 0, and resets
	|transform|.  It doesn't seem worthwhile to set |drawdot_value|,
	|drawdot_color|, or |pen| to any particular values.

	Made |get_transform()| |const|.

	Made |get_copy()| |const| for |Shape|, |Point|, |Path|, and |Solid|.

	In the functions |operator+()|,|operator+=()|, |operator-()|, and
	|operator-=()|:
	All of the |Point&| arguments are now |const|.  It doesn't seem worth
	it to write non-|const| versions, although I could.
	Now using the elements of |p0.world_coordinates|
	directly instead of using |get_x()|, |get_y()|, and |get_z()|.
	This is safe, as is calling |apply_transform()| on |p|, and saves the
	cost of three function calls.

	Made |operator*()| |const| and the |real| argument to it,
	|operator*=()|, and the non-member version |const|.

	Changed |dot_product()| and |cross_product()| and their |Point| arguments to |const|.
	Now using |world_coordinates| directly instead of |get_x()|,
	|get_y()|, and |get_z()|.

	Made |magnitude()| |const|. Now using
	|world_coordinates| directly in |magnitude()| instead of
	|get_x()|, |get_y()|, and |get_z()|.

	Made |angle()| |const| and its |Point&| argument |const|.
	Now using
	|world_coordinates| directly in |angle()| instead of |get_x()|,
	|get_y()|, and |get_z()|.

	Revised |operator==()|.  Now using |Point a| and
	|Point q|.  Added |factor| and am using it as the argument to |clean()|,
	and for calculating |eps|.  Since this function is an operator, it's
	not possible to pass |factor| as an argument, unfortunately.  Using
	|clean(factor)| makes it possible to compare the coordinates with 0
	directly rather than using |fabs()| and |eps|.  Also, |operator==()|
	now uses |world_coordinates| directly rather than |get_x()|,
	|get_y()|, and |get_z()|.

	|intersection_points()| now uses |world_coordinates| instead of
	``|get|'' functions.

2002-10-26  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transform.web: LDF 2002.10.26.
	Changed |set_to_identity()| to |reset()|.

	* solids.web, shapes.web: LDF 2002.10.26.
	Changed |extract_elements()| to |extract()|.

	Changed |real factor| in |show()| to |const real factor|.

	* pictures.web:
	LDF 2002.10.26.  Changed |clear_transform()| to |reset_transform()|.

	* paths.web: LDF 2002.10.26.
	Changed |draw_help()| so that it uses |help_color|.

	Changed |extract_elements()| to |extract()|.

	Changed |real factor| in |show()| to |const real factor|.

	* colors.web:
	Added |help_color| and |help_color_vector|.  Rearranged the |Color| declarations
	a bit.

	* 3DLDF.macs:
	Added \\VRB and \\EVRB for verbatim text (for {\TeX} code).

2002-10-23  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* pictures.web, transform.web, paths.web:
	LDF 2002.10.23.  Formatting changes.

	* points.web: LDF 2002.10.23.
	Typing in corrections from print-out from 2002.09.03.

	Added |set(const Point&)|.  Changed |Transform::rotate_around()| so that
	it tests the direction of the vector between the |Points| that are used for
	alignment, and if it's parallel to the x or y-axis, that axis is used for alignment.
	Haven't tested this yet, but put in a note to myself to do so.

	* solids.web: LDF 2002.10.23.
	Made changes in order to implement parallel projection.

	Added arguments |const unsigned short proj| and |real factor| to
	|show()| and |extract_elements()| and
	changed invocations of these functions accordingly.

	Removed argument from |output()| and changed the way it works.  It no longer calls
	|extract_elements()| to get the |Paths|, |Polygons|, etc., out of their vectors.
	Since |output()| has no arguments anymore, I can't pass the arguments
	|extract_elements()| would need.  Also, there's no need to call it,
	because it's been called already.  Now |output()| copies the |Paths|,
	etc., on the vectors, puts pointers to them all onto a vector of
	|Shapes*|, and sorts this vector before calling |Path::output()| on
	them.  Then, the memory allocated for the copies is deallocated.  It
	didn't work to cast the pointers on the original vectors to |Shape*|
	and put them onto the new vector.

	* paths.web: LDF 2002.10.23.
	Made changes in order to implement parallel projection.

	Added arguments |const unsigned short proj| and |real factor| to
	|project()|, |show()| and |extract_elements()| and
	changed invocations of these functions accordingly.

	Removed argument from |output()|.

	Removed calls to |Point::apply_transform()| and |Point::project()| in
	|output()|.  They are not needed, since |extract_elements()| will have
	already taken care of invoking them.

	Changed assignment operator so that all data elements are assigned to,
	except for |on_free_store|.

	* points.web: LDF 2002.10.23.
	Made numerous changes in order to implement parallel projection.

	Added arguments |const unsigned short proj| and |real factor| to
	|get_all_coords()|, |get_coord()|, |get_x()|, |get_y()|, |get_z()|,
	|get_w()|, |project()|, |show()|, |extract_elements()|,
	|Label::output()|, and |Picture::output()| and
	changed invocations of these functions accordingly.

	Removed argument from |Point::output()|.

	Now checking that |transform.is_identity() == true| in |project()|.
	If it isn't, |apply_transform()| is called.

	Changed |project()| so that it can set |projective_coordinates| for
	parallel projection.  |world_coordinates[0]| and
	|world_coordinates[1]| (x and y) are multiplied by the |real factor|
	argument (1 by default) and assigned to |projective_coordinates[0]|
	and |projective_coordinates[1]|.  |projective_coordinates[2]| (z) is
	set to 0 and |projective_coordinates[3]| (w) to 1.

	Changed |operator<<()| so |get_x()| and |get_y()| are called with
	|false| arguments for |do_persp| and |do_apply|.  This suppresses
	invocation of |apply_transform()| and |project()|.  |operator<<()| is
	currently only used in |Path::output()|, where we can assume that
	|apply_transform()| and |project()| have already been invoked.

	* shapes.web: LDF 2002.10.23.
	Made changes in order to implement parallel projection.

	Added arguments |const unsigned short proj| and |real factor| to
	|show()| and |extract_elements()|, and removed argument from |output()|.

	* pictures.web: LDF 2002.10.23.
	Made changes in order to implement parallel projection.

	Added arguments |const unsigned short proj| and |real factor| to
	|Label::output()|, and |Picture::output()|.

2002-10-20  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 3DLDF.macs: Redefined \ENDLOG.

	* points.web: LDF 2002.10.20.
	Started typing in corrections from the print-out from 2002.09.03.

	* solids.web, pictures.web, paths.web, cuboid.web:
	Changed |perspective_extremes| to |projective_extremes|.

	* transform.web: LDF 2002.10.20.
	Formatting changes.

	* shapes.web: Formatting changes.

	* rectangles.web: Minor formatting change.

	* pspglb.web: LDF 2002.10.20.
	Got rid of |DO_LABELS|.  I've replaced it with a |public static| data member
	|DO_LABELS| in |Label|.

	Added comments.  Formatting changes.

	* procfile.web, polyhedra.web: Minor formatting changes.

	* polygons.web: Minor formatting change.

	* points.web: Formatting changes.

	* paths.web, ellipses.web: Minor changes.

	* curves.web: Minor formatting changes.

	* cuboid.web, colors.web, cmplprsp.web, circles.web:
	Minor formatting change.

	* 3DLDF.macs:
	Replaced \WEB, \weave, \cweave, \tangle, and \ctangle with
	\WEB/, \weave/, \cweave/, \tangle/, and \ctangle/.

	Added \par\noindent to \rcslog and redefined \endrcslog so that it also calls
	\par.

	* pictures.web: LDF 2002.10.20.
	Typed in corrections from the print-out from 2002.09.03.  Formatting changes and
	changes and additions to comments.

	Added |public static bool DO_LABELS| to |Label|.  It replaces the global variable
	|DO_LABELS| that was previously defined in \filename{pspglb.web}.

	Removed |null_picture| and the section |@<Global constants@>|.

	* shapes.web: LDF 2002.10.20.
	Typed in corrections from the print-out from 2002.09.03.  Formatting changes and
	changes and additions to comments.

	* transform.web: Minor formatting change.

	* transform.web: LDF 2002.10.20.
	Typed in corrections from the print-out from 2002.09.03.
	Revised |operator*=()|.
	Added a non-|const| version of |inverse()| for inversion with assignment.

2002-10-18  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: LDF 2002.10.18.
	Changed |Picture::output()| so that it takes a
	|const unsigned short| argument with |Projections::PERSP| as the default.
	So far, this argument has no effect, but I'm about to start working on it.

	* pictures.web: LDF 2002.10.18.
	Added |namespace Projections|.  It contains |const unsigned shorts| that
	can be used as arguments to |output()|, |extract_elements()|,
	|project()|, etc.  Changed |output()| so that it takes a
	|const unsigned short| argument with |Projections::PERSP| as the default.
	So far, this argument has no effect, but I've put a ``START HERE'' note in
	this file to remind me to work on this.

	* patterns.web, solids.web: Changed |persp_transform()| to |project()|.

	* paths.web:
	Changed |perspective_coordinates| to |projective_coordinates|.
	Changed |persp_transform()| to |project()|.

	* points.web:
	Changed |perspective_coordinates| to |projective_coordinates|.
	Changed |persp_transform()| to |project()|.
	Changed heading ``Perspective transformation'' to ``Projection''.
	Formatting changes.

	* transform.web:
	Changed |@<Global variables@>| to |@<Global variables and constants@>|.
	Added |const Transform IDENTITY_TRANSFORM|.

2002-10-16  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transform.web: LDF 2002.10.16.
	Typing in corrections from last print-out.

	* persp.web: Tested |Dodecahedron| and |Icosahedron()|.

	* persp.tex: No significant changes.

	* io.web: LDF 2002.10.16.
	Typed in corrections from last print-out.

	* io.web: LDF 2002.10.16.
	Typing in corrections from last print-out.

	* 00TODO: Added an item.

	* solids.web, points.web, paths.web, ellipses.web, colors.web, 3DLDF.macs:
	LDF 2002.10.16.
	Formatting changes.

	* pspglb.web: LDF 2002.10.16.
	Typed in corrections from last print-out.

	* colors.web: Added |gray| and |light_gray| to the Major Colors.

	* points.web:
	Added |clean()| in two places to |Transform::rotate_around()|.

	* polyhedra.web: LDF 2002.10.16.

	Added |Polyhedron::get_polygon_center()|.

	Added shift to |center| and rotation to
	the non-default |Dodecahedron| constructor (center, diameter of
	pentagons, and angles as arguments).

	Defined the non-default |Icosahedron| constructor (center, diameter of
	pentagons, and angles as arguments).

	Added |Icosahedron::get_net()|.

	* polyhedra.web:
	Added |Icosahedron|.  Working on the constructor with center, diameter
	of triangles, and angles, and |get_net()|.

2002-10-15  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* cmplprsp.web: Formatting changes.

	* cweavedriver.web: Started adding text for documentation.

	* shapes.web: Formatting changes.

	* pspglb.web: Formatting changes.

	Started adding text for documentation.

	* procfile.web, points.web, pictures.web: Formatting changes.

	* loader.web: Formatting changes.

	Started adding text for documentation.

	* lines.web, ellipses.web, curves.web, cmplprsp.web:
	Formatting changes.

	* 3DLDF.macs:
	Put in a definition of \LOG and \ENDLOG that works.  I've tried doing
	it with conditional definitions, but I haven't been able to get it to work.

	Got rid of \persp and \uscore.

	Replaced \CWEB with \CWEB/.

	* cweavedriver.web: Formatting changes.

	* 00TODO: Added items.

	* solids_faced.web, pspglb.web, procfile.web, pictures.web, persp.web:
	Formatting changes.

	* persp.tex: No significant changes.

	* loader.web, io.web, ellipses.web, cuboid.web, transform.web, solids_faced.web, solids.web, shapes.web, rectangles.web, pspglb.web, procfile.web, polyhedra.web, polygons.web, points.web, planes.web, pictures.web, patterns.web, paths.web, parser.web, lines.web, layers.web, curves.web, colors.web, cmplprsp.web, circles.web:
	Formatting changes.

	* 3DLDF.macs: LDF 2002.10.15.
	Added \PERIOD.  I need it using periods in headings that appear
	in the table of contents.  A normal period is interpreted by cweave as
	ending the title of the section.  However, I need the periods for the
	filenames, which I want to appear in the table of contents.

	* solids.web:
	Changed the defaults for the arguments to |shear()|.  They were 1, but
	should be 0.

	* paths.web:
	Rewrote copy constructor.  The old version caused a memory fault
	when I tried to use it.

	Replaced the dummy definition of |shear()| with a
	proper one.

	* points.web: Replaced the dummy definition of |shear()| with a
	proper one.

	* transform.web: Added filename to top heading.

	Replaced the dummy definition of |shear()| with a
	proper one.

	Fixed a bug in |scale()|:  If the absolute value of an
	argument is |< epsilon()|, the argument is now set to 0 instead of 1.

	* solids_faced.web: Added filename to top heading.

	* shapes.web:
	Added filename to top heading.  Changed arguments to |shear()|.

	* rectangles.web: Added filename to top heading.

	* pspglb.web: Added filename to top heading.  Formatting changes.

	* procfile.web, polyhedra.web, polygons.web, planes.web, pictures.web, patterns.web, parser.web, loader.web, lines.web, layers.web:
	Added filename to top heading.

	* io.web: Added filename to top heading.  Formatting changes.

	* ellipses.web, curves.web, cuboid.web: Added filename to top heading.

	* colors.web: Added filename to top heading.

	Formatting changes.

	* cmplprsp.web: Added filename to top heading.

	* solids.web: Added filename to top heading.  Redefined |shear()|.

	* circles.web: Added filename to top heading.

	* points.web: Added filename to top heading.  Redefined |shear()|.

	* paths.web:
	Added filename to top heading.  Changed arguments to |shear()|.

	About to try getting rid of |@<Apply |Transform| to |points|@>|.
	|operator*=(const Transform&)| does the same thing, except that it
	returns its argument.

2002-10-14  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* cweavedriver.web: No significant changes.

	* cmplprsp.web, procfile.web, persp.web, polyhedra.web, cuboid.web:
	Redid headings.

	* polygons.web: Change in a heading.

	* solids_faced.web, solids.web, patterns.web, circles.web, ellipses.web, rectangles.web, polygons.web, curves.web:
	Redid headings.

2002-10-13  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* cweavedriver.web: Working on redoing headings.

	* loader.web: Formatting changes.

	* points.web:
	Redid headings and moved some function definitions around.

	* 3DLDF.macs:
	Redefined \\MP and added a definition for \\MF.  These are temporary and
	must be replaced using the correct fonts.

	* curves.web: Redoing headings.

	* paths.web, planes.web, lines.web, points.web: Redid headings.

	* points.web: LDF 2002.10.13.
	Started redoing the headings.  Saving this version because I'm going to
	move some function definitions around, and I want to make sure I can get
	back to a working version, in case something goes wrong.

	* pictures.web: Minor formatting change.

	* transform.web, colors.web: Changes to the headings.

	* cmplprsp.web, procfile.web: Formatting changes.

	* pspglb.web, io.web: Changes to the headings.

	* pictures.web, shapes.web: Redid headings.

	* points.web:
	Added |Focus::operator=()| and changed the constructors and
	setting functions for |Focus|, except for the default version (which does
	nothing) and the first non-default constructor.  Now, all the others
	use the latter to create a |Focus| locally and the assignment operator
	to assign to |*this|.

	Added |up| and |angle| to |Focus| and code to the first non-default
	constructor for setting them and modifying |transform| accordingly.
	Added |reset_angle()|.

	These changes now make it possible to simulate the effect of a camera
	rotating about an axis through its aperture and perpendicular to the
	surface of the lens.

2002-10-12  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transform.web:
	Added note to add either |invert()| or an argument to |inverse()| for
	inverting |matrix| in a |Transform|.

	* points.web:
	Added code for |Focus::up| to the first non-default |Focus| constructor.
	About to add it to the other constructors and setting functions and
	|reset_angle()|.

	* points.web:
	Added |angle| to |Focus| and started working on getting |up| to work.
	Not done with this.

2002-10-11  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* cweavedriver.web: Working on redoing headings.

	* transform.web, io.web, colors.web: Redid headings.

	* pspglb.web: Formatting changes.

	* loader.web: Added a heading comment.

	* cweavedriver.web: No significant changes.

	* 3DLDF.macs: \\rcslog now sets \\catcode`\_=12.

	* polyhedra.web: Added index entries.  Formatting changes.

	* paths.web: Formatting changes.

	* ellipses.web: Added index entries.  Formatting changes.

	* rectangles.web: Added index entries.

	* solids_faced.web, solids.web:
	Added index entries.  Minor formatting changes.

	* polygons.web: Added index entries.

	* paths.web:
	Added index entries.  Moved some code around.  Some formatting changes.

	* curves.web:
	Removed unnecessary CWEB headings.  Minor formatting changes.

	* planes.web: Added index entries.

	* lines.web: Added index entries.  Minor formatting changes.

	* points.web:
	Added index entries.  Removed some outdated comments.  Minor formatting changes.

	* cuboid.web, pictures.web: Minor formatting change.

	* pictures.web, transform.web: Added index entries.

2002-10-09  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 3DLDF.macs:
	Added \\cfunc, \\cofunc, and \\ofunc for formatting index entries for
	class member functions, operators that are class members, and non-class
	operators, respectively.

	* 00TODO: Added items.

	* curves.web:
	Commented out some CWEB code that wasn't needed and empty function
	definitions.

	Added index entries.

	* cuboid.web: Added index entries.

	* transform.web: Minor formatting change.

	* pictures.web: No significant changes.

	* patterns.web, paths.web: Minor formatting change.

	* circles.web, colors.web: Added index entries.

	* pspglb.web: Minor formatting change.

	* pictures.web: No significant changes.

	* layers.web: Added a comment.

	* transform.web, shapes.web, rectangles.web, polygons.web, points.web, planes.web, pictures.web, paths.web, lines.web, ellipses.web, curves.web, colors.web:
	Formatting changes.

	* loader.web: No significant changes.

	* persp.web: This version tests the use of |vector<Color*>| arguments
	to the drawing and filling functions of |Solid|.  It seems to work.

	* rectangles.web: Removed |~Rectangle()|.

	* polygons.web: Removed |~Polygon()|.

	* points.web: No significant changes.

	* paths.web:
	In the section |@<Discard |points| and |connectors|@>|, I now check the
	size of |points| before cycling through it.  |Path::clear()| is called
	very often, and I thought that |points.clear()| was being called when
	there no |Points|.  I don't think this is really possible, though.  It
	would be worthwhile checking when |Path::clear()| or |Path::~Path()|
	is called using a debugger, when I've ported 3DLDF to Linux or when I've
	learned to use the DEC debugger.

	Added code for handling |draw_color| and |fill_color| to the drawing
	and filling functions.  If a unnamed |Color| is passed as an argument,
	memory is allocated, the |Color| is copied, and |draw_color| or
	|fill_color| is pointed at the copy.

	Added code to |Path::clear()| and |~Path()| for handling |draw_color|
	and |fill_color|.
	If memory has been allocated for an unnamed |Color|, it is deallocated and
	|draw_color| and/or |fill_color| is pointed at 0.

	Added versions of |set_draw_color()| and |set_fill_color()| that
	take a |const Color*| as their argument.

	Changed |undraw()|, |unfill()|, and |unfilldraw()| so that |draw_color|
	and/or |fill_color| is set to 0 instead of |*Color::background_color|.

	Added |show_colors()|.

	* colors.web:
	Added a constructor and a setting function with three |real| arguments.

	* ellipses.web: Removed |~Ellipse()|.

	* circles.web: Removed |~Circle()|.

	* solids.web:
	In |operator=()| and |clear()|, I now call the virtual function |clear()| on the |Paths|, |Ellipses|, |Circles|, |Polygons|, and |Rectangles| in the
	vectors |paths|, |ellipses|, |circles|, |polygons|, and |rectangles|
	instead of the destructors for each type.  I have also removed the
	destructors, except for |~Path()|.  I had only defined them for use in
	these functions, anyway.  It's too confusing and error-prone to have
	different destructors for the types derived from |Path| that all do the
	same thing.  None of them allocate memory dynamically except for data
	members from |Path|.
	Since none of the derived types has its own |clear()| at the present time,
	the invocation always resolves to |Path::clear()|.

	Added the named sections |@<Process vectors for |draw()|@>|,
	|@<Process vectors for |fill()|@>|, |@<Process vectors for |filldraw()|@>|,
	|@<Process vectors for |undraw()|@>|, |@<Process vectors for |unfill()|@>|,
	and |@<Process vectors for |unfilldraw()|@>|.  These sections include
	new code for handling the |Color| pointers |draw_color| and |fill_color|.
	Depending on the value of |use_name| in the |Color| passed in the
	|vector<Color*>|, memory is allocated, the |Color| is copied, and |draw_color|
	or |fill_color| is pointed at it.

2002-10-07  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* solids.web: Replaced dummy definition of |clear()| with a real one.

	* rectangles.web: Added |get_center()|.

	* polyhedra.web: No significant changes.

	* polygons.web: Added debugging code and comments.

	* points.web: Added debugging code.

	* paths.web: Made quite a few changes all having to do with the way
	|const Color* draw_color| and |const Color* fill_color|
	are handled.  If the |use_name| of the |Color| passed to the
	drawing and filling functions is |false|, then memory is allocated
	for a new |Color|, the argument is copied to the new |Color|,
	and |draw_color| or |fill_color| is pointed at it.  In |~Path()| and
	|Path::clear()|, |draw_color| and |fill_color| are checked, and if
	necessary, the memory is deallocated.  I haven't commented the places
	where I've added code, because I didn't have time, but I've put
	a ``START HERE'' note in \\filename{paths.web} to remind me to do this.

	* paths.web:
	I had added code for allocating memory for unnamed |Colors|, then ran
	into difficulties and removed it.  This version {\it doesn't\/} have it.
	I'm about to try it again.

2002-10-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* solids.web: Added ``START HERE'' note to myself.

	* colors.web:
	Added |create_new_color()|, |bool on_free_store| and |is_on_free_store()|.
	Fixed a bug involving |use_name|.

	* circles.web: Minor change.

	* persp.web: Tested |Cuboid|.

	* solids.web:
	Added data member |vector <Rectangle*> rectangles| to |Solid| and added code
	to the various functions that use it: |operator=()|, |operator*=(const Transform&)|,
	and the drawing and filling functions.

	* rectangles.web:
	Added code to |~Rectangle()|.  It now deallocates and clears |points|.  It is
	used in |Solid::operator=()| because I've added a vector of |Rectangle| pointers
	to |Solid|.

	* polyhedra.web:
	Moved |Point center| from |Polyhedron| to |Solid|. Most |Solids| will
	have a |center|, and by making |center| a data member of |Solid|, I can
	access it in the assignment operator and transformation functions of |Solid|,
	which is convenient, because I won't have to overload them in the derived
	classes (at least, not for this reason).

	Fixed bug in default constructor for |Dodecahedron|:  |dihedral_angle| was
	set to |INVALID_REAL|, but |dihedral_angle| is always the same for |Dodecahedra|,
	so I can set it to its correct value, namely $\\pi - atan(2)$.

	Added a couple of comments and got rid of |@<Define |Polyhedron| functions@>|,
	because it's never used.  There is no need for an explicit default constructor,
	and the only function declared is a pure virtual function (|get_net()|).

	* cuboid.web: Rewrote |Cuboid|.  Now, it's derived from |Solid_Faced|.

	* solids.web: Changed |operator=()| so that |~Circle()|, |~Ellipse()|,
	and |~Polygon()| are called on the elements of |circles|,
	|ellipses|, and |polygons| explicitly, without casting them to |Paths|
	first.  Removed the superfluous cast of the elements of |Path| to
	|Paths|.

	Added |unfill()| and |unfilldraw()| and changed the |string| arguments
	and |vector <const Color*>| arguments to all of the drawing and filling
	functions to |const|.

	* polygons.web, circles.web, ellipses.web:
	Changed destructor so that it deallocates and clears |points|.
	It is used in |Solid::operator=()|.

	* transform.web: Added dummy definition for |shear()|.

	* points.web: Added debugging code.

	* pictures.web:
	Added code to |show()|.  Now, |show()| is called for the |Shapes|
	in |shapes|.

	* persp.web: No significant changes.  Testing |Dodecahedron|.

	* persp.tex: No significant changes.

	* paths.web:
	Added |Path::apply_transform()| and |Path::persp_transform()|.
	It's become necessary because |Solid|
	doesn't (and shouldn't) have access to |points|.  Until now, most |Shapes|
	have been planar and derived from |Path|, so that I've been able to access
	the elements of |Path| directly.  |Cuboid| was the exception, but it will
	be revised anyway, and derived from |Solid_Faced|.

	* colors.web:
	Fixed bug in constructor and assignment operator having to do with the
	handling of |use_name|.  Also, |define_color_mp()| is no longer invoked
	in the constructor, because |Colors| may be declared before |out_stream|
	is open.

	Added the constant vectors |default_color_vector| and
	|background_color_vector| for use in the drawing and filling functions
	for |Solid|, which take vectors of |Colors| as arguments.

	* solids.web:
	Fixed bug in |operator=()|.  Now, |paths|, |circles|, |ellipses|, and
	|polygons| are cleared after |~Path()| is called.

	About to change so that |~Circle()|, |~Ellipse()|, |~Polygon()|, are
	called instead of casting the objects to |Paths| and calling |~Path()|.
	This requires having the other destructors either call |~Path()|, or
	redefining them to deallocate |points| themselves.  I'm fairly sure this
	will work, but I will freeze the current versions in case I have problems.

2002-10-02  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* solids.web:
	Got drawing and filling to work.  Must add |unfill()| and |unfilldraw()|.
	Working on bug in assignment operator.

	* solids.web:
	Got |draw()| and |fill()| to work.  Now, |Solids| are treated as |Shapes| for
	the purposes of output, i.e., |Picture::output()| treats a |Solid| as a single
	|Shape| and enables or suppresses output based on the values in
	|perspective_extremes| for that |Solid|.  This means that a |Solid| that lies partially
	outside the limits defined for a particular invocation of |Picture::output()| will
	not be output at all.

	In order to make this possible, I've replaced the dummy definitions with real definitions
	for |extract_elements()|, |set_extremes()|, |get_extremes()|, |suppress_output()|,
	|unsuppress_output()|, (these last two are trivial) and |output()|.

	About to add |filldraw()|, |undraw()|, and |unfill()|.

	About to test a change to |operator=()|.

	* solids.web:
	Working on |class Solid|.  Added default constructor, copy constructor, pseudo-constructor,
	assignment operator, and replaced the dummy definition of |show()| with a real one.
	Started working on getting |draw()| to put a |Shape*| onto a |Picture|.

	Changed |string text| argument of |show()| from |const| to non-|const| so that I can
	use ``|""|'' as the default and reset |text| in the body of |show()|.

	* pspglb.web:
	Commented out the template function |create_new()| because I couldn't get it to work.
	Added a ``TO DO'' comment about this.

	* polyhedra.web:
	Now setting |do_output()| to |true| in the constructors of |Dodecahedron|.

	* shapes.web, points.web:
	Changed |string text| argument of |show()| from |const| to non-|const| so that I can
	use ``|""|'' as the default and reset |text| in the body of |show()|.

	* paths.web:
	Added |set_fill_draw_value()|, |set_draw_color()|, |set_fill_color()|,
	|set_dash_pattern()|, and |set_pen()|.  They're meant to be used in the
	drawing and filling functions for |Solid| and other classes that contain |Paths|,
	because those classes don't have direct access to the |protected| data elements of
	|Path| |draw_color|, |fill_color|, etc.

	Changed |string text| argument of |show()| from |const| to non-|const| so that I can
	use ``|""|'' as the default and reset |text| in the body of |show()|.

2002-09-30  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.setup: Initial version.

	Currently not being used, because of problems that \\.{ghostview}
	has with |\\special| commands.  Otherwise, it would be loaded
	by \filename{persp.tex}.

	* persp.setup: New file.

	* persp.base: Initial version.

	This file currently contains only |\newif| definitions.  It's loaded
	by \filename{persp.tex}.

	* persp.base: New file.

	* persp.web: Testing dodecahedra.

	* persp.tex: No significant changes.

	* polyhedra.web:
	Got rid of |Dodecahedron::pentagons|.  Now using |vectors| of pointers
	to |Polygons|, |Circles|, |Ellipses|, and |Paths| in |Solid| instead.
	This makes it possible to have the drawing and filling functions be
	members of |Solid|.  Also moved |Dodecahedron::fill()|, which is only
	for testing, to \filename{solids.web} and made it a member of |Solid|.

	* solids.web: Added the data members |vector <Circle*> circles|,
	|vector <Ellipse*> ellipses|,
	|vector <Polygon*> polygons|, and |vector <Paths*> paths|.
	On the one hand, this is wasteful, since
	most if not all |Solids| will contain only one kind of |Path|; on the
	other hand, it's an advantage to be able to have the drawing and
	filling functions be members of |Solid|, since they don't have to know
	what kind of a |Path| a |Path| is, in order to draw or fill it.  This
	way, I don't have to define the drawing and filling functions for
	|Sphere|, |Ellipsoid|, |Polyhedron|, etc.

	Moved |Polyhedron::fill()|, (which used to be |Dodecahedron::fill()|)
	to this file and renamed it |Solid::fill()|.  It's only for testing.  The
	next thing to do is to define proper drawing and filling functions,
	|extract_elements()|, and |output()| for |Solids|.

	* solids_faced.web:
	Made |faces|, |vertices|, and |edges| data members of |Solid_Faced|.
	Now deriving |Solid_Faced| from |Solid| and |Polyhedron| from
	|Solid_Faced|.

	* solids.web:
	Now deriving |Solid| from |Shape|.  Added dummy versions of all of the
	pure virtual functions in |Shape| to |Solid|.  |Solid_Faced| is derived
	from |Solid|, and |Solid_Curved| will be, too, once I've defined it.

	Made |bool on_free_store| and |vector <Path*> paths| data members of
	|Solid|.

	* shapes.web: Added |set_on_free_store()|.

	* polyhedra.web:
	Numerous changes, involving putting as many data members and as much
	functionality as possible into the base classes, namely, |Solid|,
	|Solid_Faced|, and |Polyhedron|.  |Solid| is a |Shape|.

	About to get rid of |Dodecahedron::fill()|.  I was just using it for
	testing.  The next step is to define drawing and filling functions,
	|extract_elements()| and |output()| for |Solid|.

	* polygons.web: Changed |operator=()| so that it returns |*this|.

	* points.web: Added |set_on_free_store()|.

	Maded |operator!=()| |const|.

	* paths.web: Added |set_on_free_store()|.

2002-09-29  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* solids_faced.web: No significant changes, I think.

	* solids.web:
	Added dummy definitions for all of the pure virtual functions declared
	in |Shape|.  This way, I can derive other classes (such as |Solids_Faced|
	and |Solids_Curved|) from |Solids|, and they'll be |Shapes|.

	About to start adding sensible definitions to the functions, as far as
	possible.

	* shapes.web: Changed the return value of |get_extremes()| from
	|const valarray <real>&| to |const valarray <real>|, i.e., it's now
	no longer a reference.  This is because |get_extremes()| is a
	pure virtual function in |Shape|, and I'm not sure I want to declare
	a |const valarray <real>| to be a data member in every class derived
	from |Shape|.

	* polyhedra.web:
	Got rid of all of the content of this file while keeping the structure.
	I'm going to put it back together again, but I want to put as much of
	the functionality as I can into |class Solid| and |class Solid_Faced|.

	* points.web, paths.web:
	Changed the return value of |get_extremes()| from
	|const valarray <real>&| to |const valarray <real>|, i.e., it's now
	no longer a reference.  This is because |get_extremes()| is a
	pure virtual function in |Shape|, and I'm not sure I want to declare
	a |const valarray <real>| to be a data member in every class derived
	from |Shape|.

	* transform.web:
	Made the |real| arguments to |rotate_around()| |const|.
	This cannot be done for |rotate()| because they are converted from
	HMS (hours, minutes, seconds) to radians there in order to pass them
	to |sin()| and |cos()|.

	* shapes.web:
	Made the |real| arguments to |rotate()| and |rotate_around()| |const|.

	* pspglb.web:
	Made some changes to the |template| function |create_new()|.

	* polygons.web:
	Made the |real| arguments to |rotate()| and |rotate_around()| |const|.

	Added some debugging code.

	* points.web:
	Made the |real| arguments to |rotate()| and |rotate_around()| |const|.

	Put in note and index entries for a possible bug in |rotate_around()|.
	Probably, the problem had to do with the direction of rotation.  I put
	in a note to test this sometime, but it's not urgent.

	* pictures.web:
	Made the |real| arguments to |rotate()| and |rotate_around()| |const|.

	* paths.web: Added some debugging code.

	Made |operator=()| |virtual|.

	Made the |real| arguments to |rotate()| and |rotate_around()| |const|.

	Made the |string| arguments to |fill()| |const|.

	Fixed bug in |output()|: ``|" withcolor "|'' was not always written to
	|out_stream| where it ought to have been.

	* cuboid.web: Added |#include solids.h|.

	* colors.web:
	Rearranged the |Colors| in |namespace Colors| and added a number of
	colors from \filename{colors_all.web}.

	* cmplprsp.web: Added \filename{solids.web}.

	* polyhedra.web:
	Defined the |classes| |Polyhedron| and |Dodecahedron| and various basic
	functions.  Today, 2002.09.29, I've changed |vector<Polygon> polygons| to
	|vector<Polygon*> polygons| and made the corresponding changes in the
	functions that have already been defined.  |shift()|, |rotate()|, and
	|rotate_around()| have been defined for |Polyhedron|; I plan to define
	them for |Solid|, which is a base class of |Solid_Faced|, which is,
	in turn, a base class of |Polyhedron|.  I want to make |Solid| a |Shape|,
	which requires defining all the pure virtual functions in |Shape|.

	* polyhedra.web: Checking in to see if the header is reset correctly.

	* solids.web:
	Initial version.  About to make |Solid| a derived |class| of |Shape|,
	and then derive |Solids_Faced| from |Solid| and |Polyhedron| from
	|Solids_Faced|.

	* solids.web: New file.

2002-09-27  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polygons.web:
	In constructor with center, sides, diameter, and angle arguments:
	Changed |Point&| argument for center to |const Point&|.  Did the
	same for the corresponding setting function.

	* paths.web:
	Made |rotate_around()| |virtual|.  Added ``TO DO'' comment, that I should
	use |operator*=()| in the transformation functions.

	* polygons.web:
	Added error handling code to |get_center()|.  Now, if the |Polygon|
	doesn't contain any |Points|, |get_center()| issues a warning and returns
	|INVALID_POINT|.  It's not an error, because we might want to call
	|get_center()| on a |Polygon| without knowing whether it's |center| has
	been set or not, for instance, in a loop through an array of |Polygons|.

	Added |rotate_around()|.  It's needed, because |Path::rotate_around()|
	doesn't rotate |center|.

	* paths.web:
	Added error handling code to the drawing and filling functions and to
	|output()|.  It catches the case that a |Path| doesn't contain any |Points|
	and issues a warning or an error message.

	Changed |draw_help()| so that it just calls |draw()| with appropriate
	default arguments.

	Made a couple of formatting changes.

2002-09-26  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Now including \filename{solids_faced.h} and \filename{polyhedra.h}.
	Moved \filename{patterns.h} to after \filename{circle.h} and
	before \filename{solids_faced.h} in |@<Include files@>|.

	Testing |Ellipse| intersections.  About to program the case that
	two |Ellipses| are coplanar but don't have the same center.

	* cmplprsp.web: Changed so that the bit in |dependencies| for
	\filename{cuboids.web} is not set for \filename{polyhedra.web}.

	* cuboid.web: Added |#include "solids_faced.h"|.

	* paths.web: Made |output()| |virtual|.

	* ellipses.web:
	Made a minor change in |intersection_points(Ellipse)|.  See the
	comment; I believe it was a bug fix.
	Set |DEBUG| to true in this function.
	Put in ``START HERE'' comments.  I should
	work on the coplanar case where the centers are not the same.
	This shouldn't be too difficult.

	* cmplprsp.web:
	Added \filename{solids_faced.web} and \filename{polyhedra.web}.
	Moved \filename{patterns.web} to after \filename{circles.web}
	and before \filename{solids_faced.web}.  \filename{cuboid.web} and
	\filename{polyhedra.web} follow \filename{solids_faced.web}.

	The bit in |dependencies| for \filename{patterns.web} is not set, because
	none of the files that follow, except for \filename{persp.web}, depend on
	it.

	* polyhedra.web: Initial version.  Nothing in it, yet.

	* polyhedra.web: New file.

	* solids_faced.web: Initial version.  Nothing in it, yet.

	* solids_faced.web: New file.

	* patterns.web:
	Removed ``|#include "cuboid.h"|''.  \filename{patterns.web} is now
	compiled before \filename{cuboid.web}.

	* pspglb.web:
	Removed indexing commands from comments in C++ code to {\TeX} sections.
	{\tt cweave} can't handle them in the comments.

	* points.web: Fixed formatting errors in {\tt CWEB} headings.

	* patterns.web, paths.web:
	Removed indexing commands from comments in C++ code to {\TeX} sections.
	{\tt cweave} can't handle them in the comments.

	* cweavedriver.web: Added ``|@i colors_all.web|''.

	* colors_all.web, colors.web: Added comments.

	* colors_all.web:
	Initial version.  This file contains code removed from
	\filename{colors.web} and which should be conditionally compiled
	and cweaved.  It's not separately compiled, but included in
	\filename{colors.web}, if needed, using ``|@i colors_all.web|''.

	It contains the declarations for ``all'' the |Colors|, i.e., lots of them,
	and not just the major ones.

	* colors_all.web: New file.

	* colors.web:
	Moved the code for ``all'' colors to \filename{colors_all.web} and
	added a line where I either include it with |@i colors_all.web| or not.
	Added  ``/* |@<All |Colors|@>| */|'' in |@<Declare |namespace Colors|@>|
	so that it's visible in the {\tt cweave} output.

	Removed indexing commands from comments in C++ code to {\TeX} sections.
	{\tt cweave} can't handle them in the comments.

	* 3DLDF.macs:
	Redefined |\filename| so that I can use it with filenames containing
	underscore characters.

2002-09-25  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web: Testing colors.

	* cuboid.web, circles.web, ellipses.web, rectangles.web, curves.web, polygons.web:
	Minor change.

	* planes.web: Added the section |@<Declarations for the header file@>|
	and put the |extern| declaration of |INVALID_PLANE| there.

	|INVALID_PLANE| is
	now declared and initialized |extern const| in
	|@<|PLANE| global constants@>|.

	* lines.web: Added the section |@<Declarations for the header file@>|
	and put the |extern| declaration of |INVALID_LINE| there.

	|INVALID_LINE| is
	now declared and initialized |extern const| in
	|@<|Line| global constants@>|.

	* pictures.web:
	Added the sections |@<Declarations for the header file@>|
	and |@<Global constants@>| and moved the |extern| declarations of
	|current_picture| and |null_picture| into the former.  |null_picture| is
	now declared and initialized |extern const| in the latter.

	* io.web: Minor change.

	* transform.web:
	Added section |@<Declarations for the header file@>| and put the
	|extern| declarations for |user_transform| and |INVALID_TRANSFORM|
	there.  Made |INVALID_TRANSFORM| |const|.

	* points.web: I now declare the global constants with
	external linkage and put a second |extern| declaration in the header file.
	This way, I don't have a version for each compilation unit that loads
	\filename{points.h}.

	Added section |@<Declarations for the header file@>| which contains
	|extern| declarations for both the global variables and constants.

	Moved the declarations of the non-class functions |operator*()|
	and |mediate()| into the section
	|@<Declare non-member functions for |Point|s@>|, which is written
	to the header file (\filename{points.h}).

	* colors.web:
	Changed |operator==()| so that only |red_part|, |green_part|, and
	|blue_part| are compared (no longer |name|).

	Added |modify()|, |set_red_part()|, |set_green_part()|,
	|set_blue_part()|, |set_name()|, and |set_use_name()|.

	* pspglb.web:
	Added section |@<Global constants@>|.  I now declare the constants with
	external linkage and put a second |extern| declaration in the header file.
	This way, I don't have a version for each compilation unit that loads
	\filename{pspglb.h}.

	Added section |@<Declarations for the header file@>| which contains
	|extern| declarations for both the variables and the constants
	(the constants are declared |extern| when they're initialized, too.
	See above).

	Got rid of |DO_HELP_LINES| and |HELP_COLOR|.  They weren't used
	anywhere.

	* colors.web:
	Broke up the |namespace Color| declaration so I can choose whether to use
	only the major colors or all of the |Color| definitions.  Got rid of
	|#define MAJOR_COLORS_ONLY| and the |#ifdef| and |#ifndef| expressions since
	I now do this by means of using one or the other {\\. cweb} section.  The one
	I don't use is never expanded.

	* persp.web: Testing |Colors| in this version.

	* colors.web: Minor changes.

	* points.web: Changed |drawdot_color|from |Color| to |const Color*|.
	Changed the |Color| arguments in the drawing functions to
	|const Color&|.  Made changes in the drawing
	functions to correspond to these changes.  Now using |operator<<()|
	with a |const Color| argument instead of explicitly invoking
	|get_part_part()|, etc., in |Point::output()|.

	* paths.web:
	Changed |draw_color| and |fill_color| from |Color| to |const Color*|.
	Changed the |Color| arguments in the drawing and filling functions to
	|const Color&|.  Made changes in the drawing and filling
	functions to correspond to these changes.  Now using |operator<<()|
	with a |const Color| argument instead of explicitly invoking
	|get_part_part()|, etc., in |Path::output()|.

	* ellipses.web:
	Changed |Color| arguments to |const Color&| arguments in
	|draw_in_rectangle()| and |draw_out_rectangle()|.

	* colors.web: Bug fix in the copy constructor:
	Now I assign to |red_part|, |green_part| and |blue_part|
	{\\it before\\/} I invoke |define_color_mp()|.  If I invoke it before
	I've done the assignment, incorrect values are written to |out_stream|.

	* points.web, patterns.web:
	Added |Color::| qualifier to |Colors| that are used in
	drawing and filling functions.

	* paths.web: Changed |help_color| to a |const Color*| and pointed it to
	|Colors::red|.

	Added |Color::| qualifier to |Colors| that are used as default arguments in
	drawing and filling functions.

	About to change |draw_color| and |fill_color| to |const Color*| and
	make the corresponding changes in the functions that use them.

	* ellipses.web:
	Added |Color::| qualifier to |Colors| that are used as arguments in
	|draw_in_rectangle()| and |draw_out_rectangle()|.

	* cuboid.web:
	Added |Color::| qualifier to |Colors| that are used as arguments in
	drawing and filling functions.

	* colors.web:
	Added copy constructor.  Added |show()|.  Added |define_colors_mp()|.
	Made the |Color| declarations in |namespace Colors| |extern const|.

	Added |initialize_colors()|.

	* colors.web:
	Fixed |operator=()|.  It now assigns |use_name|.  This fixes a bug.  Now,
	|operator<<()| works.

	About to change the |Colors| in |namespace Colors| to |const| and
	add |define_colors_mp()|.

2002-09-24  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	Changed the drawing and filling functions so that they use |Color| arguments
	for the colors instead of |strings|.

	Changed the data member |drawdot_color| in |class Point| to
	|Color| (it was formerly a |string|).

	* patterns.web:
	Changed the drawing and filling functions so that they use |Color| arguments
	for the colors instead of |strings|.

	* paths.web:
	Changed the drawing and filling functions so that they use |Color| arguments
	for the colors instead of |strings|.

	Changed the data members |draw_color|, |fill_color|, and |help_color|
	 in |class Path| to |Colors| (they were formerly |strings|).

	* ellipses.web, curves.web, cuboid.web:
	Changed the drawing and filling functions so that they use |Color| arguments
	for the colors instead of |strings|.

	* colors.web:
	Got rid of the |code| data member in |class Color|.  I'm currently
	calling |get_red_part()|, etc., literally, whenever I need to output a
	|Color| when drawing a |Path| (i.e., whenever ``withcolor'' is used).
	I should add |operator<<(const Color&)|.  I've put a ``TO DO'' comment in this
	file.

	Added |operator=()| for assignment and |operator==()| and |operator!=()|
	for comparisons.

	Added the global variables |Color* default_color| and
	|Color* background_color|.  I'm not happy about this.  I'd like them to
	be in the |namespace Colors|, but when I put them there, the functions that
	use them as default arguments couldn't find them.  I will try to find out
	why not.

	* persp.web: No significant changes.

	* pspglb.web:
	Added |template <class C> C* create_new()|.  It's meant to replace
	|Point::create_new_point()|, |Path::create_new_path()|, etc.

	* transform.web, shapes.web, rectangles.web, polygons.web, points.web, planes.web, pictures.web, patterns.web, paths.web, parser.web, lines.web, layers.web, ellipses.web:
	Added ``|#include "colors.h"|''.

	* cweavedriver.web: Added ``@i colors.web''.

	* curves.web, cuboid.web: Added ``|#include "colors.h"|''.

	* cmplprsp.web:
	Added code for ``ctangling'' \filename{colors.web} and compiling and linking the
	resulting {\\tt .c} and {\\tt .o} files.

	* circles.web: Added ``|#include "colors.h"|''.

	* colors.web:
	Added conditional compilation using the ``|@d MAJOR_COLORS_ONLY|''.  This
	saves on compiled time and storage if I don't need the complete range of colors.

	* colors.web:
	Got rid of |initialize_colors()|, because I can initialize in the internal declaration
	of |namespace Colors|.

	Changed |get_red_part()|, |get_green_part()|, and |get_blue_part()|:  They now
	take an optional |bool| argument which determines whether they return a number
	from 0 to 1 or one in the range 0 to 255 representing the color part.

	* colors.web:
	Initial version.  I've taken the definitions of colors from the file \filename{rgb.txt}
	that I received from Herr G{\\"u}nter Koch of the GWDG, G{\\"o}ttingen.

	This file contains the declaration of the |class Color|, declarations and definitions of
	functions for |class Color|, and the declaration of the |namespace Colors|.

	* colors.web: New file.

2002-09-23  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web, persp.tex: No significant changes.

2002-09-22  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* rectangles.web:
	Moved the |const| and non-|const| versions of |get_center()| from
	here to \filename{polygons.web}.  Got rid of |Point center| because
	|Polygon| already has a |center|.  Changed its initialization in the
	constructors, because if it's a data member of a base class, I can't
	use the ``{\\tt :}'' syntax.

	* polygons.web:
	Moved the |const| and non-|const| versions of |get_center()| from
	\filename{rectangles.web} to here.

	* points.web: Add ``TO DO'' comment.

	* parser.web:
	Added conditional text for including \filename{layers.h}.  Currently,
	this is not compiled, because \filename{layers.web} isn't functional yet.

	* 00TODO: Added items.

	* layers.web:
	Initial version of \filename{layers.web}.  It contains no C++ code as
	yet, and {\\tt cmpl} doesn't compile and link it with the rest of
	3DLDF yet.

	* layers.web: New file.

	* parser.web:
	Initial version of \filename{parser.web}.  It contains no C++ code as
	yet, and {\\tt cmpl} doesn't compile and link it with the rest of
	3DLDF yet.

	* parser.web: New file.

	* persp.web:
	Testing |hex_pattern_1()| in this version.  Otherwise, no significant
	changes.

	* persp.tex: No significant changes.

	* rectangles.web:
	Made |get_center()| virtual and changed the return value from
	|Point| to |Point&|.

	* polygons.web:
	Added |set()| with arguments for the center, number of sides, diameter,
	and angles for rotation.

	Made |get_center()| virtual and changed the return value from
	|Point| to |Point&|.

	Formatting changes.

	* paths.web: Very minor change.

	* patterns.web:
	Finished rewriting |hex_pattern_1()|.  It now can draw and/or fill up to
	three nested hexagons.  The first row can now have either an even or an
	odd number of sets of hexagons.  The values for the draw and fill colors
	are checked and if possible, the functions |draw()| or |fill()| are used
	instead of |filldraw()| to avoid unnecessary output of Metapost code.

2002-09-21  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Forgot to mention at last check in:  Removed |draw_frame()|.

	* persp.web:
	Started using \\filename{patterns.web} again.  Moved |hex_pattern_1()|
	from here to there.
	Now including \\filename{patterns.h}.

	* cweavedriver.web: Added {\\patterns.web}.

	* cmplprsp.web:
	Started using \\filename{patterns.web} again.  Moved |hex_pattern_1()| there.
	Made appropriate changes in this file.

	* patterns.web:
	Started using this file again.  Moved |hex_pattern_1()| here.

	* shapes.web:
	Changed |get_minimum_z()| to |get_maximum_z()| because I'm now using the maximum
	z value for the surface hiding routine in |Picture::output()|.

	* points.web:
	Changed |get_minimum_z()| to |get_maximum_z()| because I'm now using the maximum
	z value for the surface hiding routine in |Picture::output()|.

	Changed |class Compare_minimum_z| to |class Compare_maximum_z|.

	In |Picture::output()|:  Added the optional arguments
	|const bool do_sort| and |const bool do_warnings|.  Made the appropriate
	changes in the function definition.  |do_sort| can be set to |false|
	to suppress sorting, when the drawing and filling commands have already
	been done in the order that rendering should take place.  This can be
	useful in cases where the painter's algorithm used for surface hiding might
	fail.  Some cases will fail, i.e., where surfaces interpenetrate each other.

	|do_warnings| can be set to |false| when we know that part of the image will not
	be projectable, and we don't want to see the warning messages.

	Added some debugging code to |Picture::output()|.

	Moved the sections having to do with |Focus| more toward the end of this file.

	* pictures.web: In |Picture::output()|:  Added the optional arguments
	|const bool do_sort| and |const bool do_warnings|.

	* persp.tex: No significant changes.

	* paths.web:
	Changed |get_minimum_z()| to |get_maximum_z()| because I'm now using the maximum
	z value for the surface hiding routine in |Picture::output()|.

	* persp.web: No significant changes.  Tested using |hex_pattern_1()|.

2002-09-20  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: *** empty log message ***

	* 00TODO: Added an item.

	* persp.web:
	Added arguments to |hex_pattern_1()| which are passed to |draw()| command.
	Added comments.

	* transform.web: Minor changes.

	* points.web: No major changes.

	* paths.web:
	Fixed a bug in |Path:output()| by invoking |apply_transform()| and
	|persp_transform()| explicitly.  This bug was caused by a change in
	the |operator<<()| with a |Point| argument.  It no longer calls these
	functions and depends on the code that calls {\it it\/} to have done so.
	I put a note to this effect in the definition of |operator<<()|, but
	didn't to actually do it except for |Point::output()|.  Since |Point| and
	|Path| are the only classes that have |output()| functions, I think I'm
	safe.

	* persp.tex: Commented out the line that input \filename{persp.setup}.
	\filename{persp.setup} contains |special| commands which set up the
	page size and orientation.  THEY DO NOT WORK!! At least, for viewing
	in {\tt gv} they don't.  I believe they do work for printing.

	* points.web:
	Changed |text_int| argument of |label()| and |dotlabel()| from
	|unsigned int| to |int| because I wanted to have negative numbers
	when debugging |hex_pattern_1()|.

	* pictures.web:
	Changed default values for the optional |real| arguments to
	|Picture::output()|, because they were too narrow.  This will still
	need some adjustment.

	* persp.web:
	Rewrote |hex_pattern_1()|.  It works with the new |persp_transform()|.
	It's rather simple, but I have to archive it now because of problems
	with the file server.  I want to make sure I have this version in
	the archive.  Will explain the changes in more detail when the file
	server is working properly again.

2002-09-19  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* shapes.web: Made changes to |show()|:

	Added |bool| arguments |do_persp| and |do_apply|.
	Changed |const Focus*| argument to non-|const|.

	* points.web:
	Added |get_all_coords()| (|const| and non-|const| versions).
	It's used in |Point::show()| and
	|Path::show()| (see below).

	Made changes to |show()|:

	Added |bool| arguments |do_persp| and |do_apply|.
	Now using |get_all_coords()| to get a |valarray <real>| with the
	coordinates instead of |get_x()|, |get_y()|, and |get_z()|.  This
	means that |apply_transform()| and |persp_transform()| are either once
	or not at all.  Changed |const Focus*| argument to non-|const|.  Also
	made this change in |get_coord()|, |get_x()|, |get_y()|, etc.
	Removed some comments which were outdated.

	* paths.web: Made changes to |show()|:

	Added |bool| arguments |do_persp| and |do_apply|.
	Now using |get_all_coords()| to get a |valarray <real>| with the
	coordinates instead of |get_x()|, |get_y()|, and |get_z()|.  This
	means that |apply_transform()| and |persp_transform()| are either once
	or not at all.  Changed |const Focus*| argument to non-|const|.
	Changed so that lines are broken after two |Points| instead of three.

2002-09-18  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: Added items.

	* points.web:
	Added |const Focus*| argument to |show()|.  Also made the |string text| argument
	|const|.
	Added comment to ``start there'' in order to make it work properly with
	|'p'| as the |coords| argument.

	* paths.web:
	Added |const Focus*| argument to |show()|.  Also made the |string text| argument
	|const|.  Fixed this function so that it now shows the |Path| properly
	with the connectors.

	* shapes.web:
	Added |const Focus*| argument to |show()|.  Also made the |string text| argument
	|const|.

	* persp.web: No significant changes.

	* 00TODO: Added items.

	* shapes.web:
	Added |get_extremes()|, |suppress_output()|, and |unsuppress_output()|.
	They are used together with |do_output| in |Picture::output()| and in the
	versions of |output()| for the classes derived from |Shape| to enable or suppress
	output based on whether falls within the allowed limits for any given invocation
	of |Picture::output()|.  They are also used in case |set_extremes()| fails for
	any reason.

	* pictures.web:
	Added optional |real| arguments to the declaration of |Picture::output()|.
	They represent limits for the projected |Points|.  |Shapes| that lie
	outside the limits are not output.

	* points.web:
	Added |bool do_output|.  I need it in order to be able to suppress output for
	|Points| that can't be output for some reason.  Using |erase()| to remove the
	|Shape*| from |elements| in |Picture::output()| caused a memory fault.

	Added code to |Point::output()| for suppressing output if |do_output == false|.

	Added |do_output = true| to the constructors, setting functions, and assignment
	operator function.

	Added |get_extremes()| for returning |perspective_extremes|.

	Added |suppress_output()| and |unsuppress_output()|.

	Moved some sections around because they were placed badly.  This is still a
	problem!

	Added error handling code in |Picture::output()|.  |Shapes| are not output if
	they fall outside the limits passed as arguments to this function or their defaults.
	These arguments are new in this version.
	Output is also suppressed if |set_extremes()| returns |false|.

	* paths.web:
	Added |bool do_output|.  I need it in order to be able to suppress output for
	|Paths| that can't be output for some reason.  Using |erase()| to remove the
	|Shape*| from |elements| in |Picture::output()| caused a memory fault.

	Added code to |Path::output()| for suppressing output if |do_output == false|.

	Added |do_output = true| to the constructors, setting functions, and assignment
	operator function.

	Added |get_extremes()| for returning |perspective_extremes|.

	Added |suppress_output()| and |unsuppress_output()|.

	* points.web: Got |set_extremes()| to work.

	Added error handling code to |Picture::output()| so that it only sorts |elements|
	if the latter is non-empty.

	* 3DLDF.macs:
	Added \contseq{beginlog} and \contseq{endlog} for conditional printing
	of my log comments.

	* paths.web: Got |set_extremes()| to work.

	* shapes.web: Changed |set_minimum_z()| to |set_extremes()|.

	* polygons.web, ellipses.web: Changed comment.

	* paths.web: Got rid of |real minimum_z| and replaced it with
	|valarray <real> perspective_extremes|, which contains minimum and
	maximum values of x, y, and z.  Made the corresponding changes
	in |get_minimum_z()|.  Replaced |set_minimum_z()| with |set_extremes()|.
	Added code for initializing and resetting |perspective_extremes| in
	the |Path| constructors, setting functions, and assignment operator
	function.

	* points.web: Got rid of |real minimum_z| and replaced it with
	|valarray <real> perspective_extremes|, which contains minimum and
	maximum values of x, y, and z.  Made the corresponding changes
	in |get_minimum_z()|.  Replaced |set_minimum_z()| with |set_extremes()|.
	Added code for initializing and resetting |perspective_extremes| in
	the |Point| constructors, setting functions, and assignment operator
	function.  Changed |@<Initialize coordinates@>| to
	|@<Initialize coordinates and limits@>|.

	Changed |Focus| from a |struct| to a |class|.  Added functions for returning
	elements and information.  Made the corresponding changes in the functions
	that need to access elements of |Focus|.

	Added the data member |axis| to |Focus|.  I intend to
	use it for moving |position| to a position on the x- or y-axis and then
	projecting onto the z-y or x-z plane.  Made the corresponding changes
	in the constructors and setting functions.

2002-09-17  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web: No signiicant changes.

	* 00TODO: Added an item.

	* shapes.web:
	Made the arguments to |show()| optional.  Not sure why this was necessary, but
	it seems to do no harm.  It's probably because I called it on |Shapes| while
	debugging, whereas in the past I'd only called it on objects whose actual type was known.

	Made |get_minimum_z()| |const|.

	* points.web: Made |get_minimum_z()| |const|.

	Fixed bug in |drawdot()| and |undrawdot()|.  The newly created |Point| was
	not set to |*this|.  Changed the order of assignment in these two functions.

	Implemented surface hiding algorithm in |Picture::output()|.
	Added |class Compare_minimum_z|, which is used for sorting the |Shape| pointers
	in |Picture::elements|.

	* paths.web: Made |get_minimum_z()| |const|.

	* loader.web: Now including \filename{functional}.

	* points.web:
	Added the data member |minimum_z| and the functions |set_minimum_z()| and
	|get_minimum_z()| to |class Point|.  They are meant to be used for the hidden surface
	algorithm.

	Started making changes to |Picture::output()| in order to be able to sort the
	|Shapes| according to the value of |minimum_z|.

	* shapes.web: Added the pure virtual functions |set_minimum_z()| and
	|get_minimum_z()| to |class Shape|.  They are meant to be used for the hidden surface
	algorithm.

	* paths.web:
	Added the data member |minimum_z| and the functions |set_minimum_z()| and
	|get_minimum_z()| to |class Path|.  They are meant to be used for the hidden surface
	algorithm.

	* 00TODO: Added items.

	* persp.web: No major changes.

	* points.web: Added setting functions for |Focus| and |Focus::show()|.

	* transform.web: Fixed an error in {\TeX} code.

	* points.web, paths.web:
	Added versions of the drawing, filling, and labeling commands where a
	|Picture| is the first (required) argument.

	* ellipses.web: Fixed an error in {\TeX} code.

	* cuboid.web: Added a comment.

	* polygons.web:
	Got rid of |draw()|.  It's not necessary, because |Path::draw()| and the other drawing
	and filling functions for |Paths| are called for |Polygons|.

	* points.web:
	Added |Picture&| argument to the drawing, filling, and labeling functions.

	* paths.web:
	Added |Picture&| argument to the drawing and filling functions.

	* ellipses.web:
	Added |Picture&| argument to |draw_in_rectangle()| and |draw_out_rectangle()|.

	* cuboid.web:
	Added |Picture&| argument to the drawing and filling functions.

	* shapes.web:
	Changed the |Focus| argument of |output()| to |const Focus&|
	and added a |const Focus&| argument to |extract_elements()|.

	* points.web:
	Changed |Focus| argument of |persp_transform()| to constant reference
	(|const Focus&|).

	Moved error handling code from |Point::output()| to
	|Point::extract_elements()|.
	Also removed the invocations of |apply_transform()| and |persp_transform()|
	to |extract_elements()|.

	Added error handling code to |Label::output()|.  There is no
	|extract_elements()| for |Labels|, so the error handling has to be in
	|Label::output()|.

	Made the |bool| arguments and the |Focus*| argument to |get_coord()|,
	|get_x()|, |get_y()|, etc., |const|.

	Added error message to |Picture::output()| for the case that an empty vector
	is returned by |extract_elements()|.  This can happen when a |Point| in the
	|points| vector of the |Shape| cannot be projected using the value of the
	|Focus| that is being used.

	* pictures.web:
	Eliminated the version of |Label::output()| that didn't take a |Transform|
	argument.  Changed arguments to constant references (|const Focus&| and
	|const Transform&|).

	* patterns.web: Changed comment.

	* paths.web:
	Changed |extract_elements()| so that it now takes a |const Focus&| as
	an argument and performs error checking code.  Removed the error checking
	code from |output()|, since |extract_elements()| is always called before
	|output()|, and we might as well catch the errors there.

2002-09-16  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	Removed calls to  |apply_transform()| and |persp_transform()|
	in |Point::operator<<(()|.  Now code that uses the latter must make
	sure that the former are called {\it first}.

	* paths.web:
	In |output()|, I now call |apply_transform()| on each of the |Points| in
	|points| before I call |persp_transform()| on them.  This is necessary,
	I believe,
	because I've removed calls to these functions in |Point::operator<<(()|,
	which I use to output the |Points|.

	* shapes.web:
	Changed declaration of |output()| so that it takes a |Focus| argument.

	* pictures.web:
	Added |Focus| argument to |output()|.  Moved the definitions (version
	with argument and dummy version without argument) to \filename{points.web},
	because |Focus| is an incompletely defined type here.

	* paths.web:
	Added |Focus| argument to |output()|.  |focus| is the default.

	* points.web:
	Added |Focus| argument to |persp_transform()|.  Maybe I'd done this already
	before I archived the last version, but I've been working on the routines
	that use |persp_transform()| in this version.  |persp_transform()| now
	returns a |bool| so that the |Points| can be tested for projectability.

	Added |Focus| argument to |output()|.  Default is indicated in the
	definition, {\it not\/} the declaration, as I normally do.  This seems
	to work.  If it causes problems, I can write a dummy version that
	uses |focus| in the body of the function.

	Noted that it will be necessary to change |Path::output()| (and any other
	|output()| functions, if they exist), so that they don't use
	|operator<<()|, which can't be passed a |Focus| argument and always uses
	the default (|focus|).

	Changed the definitions of |Label::output()| so that they take a
	|focus| argument.  Here too, the default is indicated in the definition, not
	the declaration.

	Changed the way |persp_transform()| is called because of changes to
	declaration.

	Changed |get_coord()|, |get_x()|, |get_y()|, etc., so that they use
	a |Focus*| argument.  This time, I got compiler errors when I tried to
	put the defaults into the definition, so I had to use a |Focus*| argument
	instead of a |Focus|.  The default is 0, and in this case,
	the pointer is set to point at |focus| in the body of the function.
	While working on this, I made |get_x()|, etc., normal functions instead of
	|inline| functions.  I could change them back, but I'm not sure it's worth
	it.

	Changed |Picture::output()| to use |Focus| argument.  A dummy version takes
	care of making |focus| the default.

	* persp.web:
	Last log message was incorrectly applied to this file.  It was meant
	for \filename{points.web}.  Have put it there, but I don't know how to
	get rid of it here.

	* points.web, persp.web:
	Added error handling code to |persp_transform()|.  It now issues
	an error message and returns when the z-coordinate of a |Point| has the same
	value of the z-coordinate of the |Focus| or lies behind it.  The values
	for the z-coordinates are checked after |Focus.transform| has been
	applied, but before |Focus.persp|.

	About to change |persp_transform()| so that it returns a |bool| instead of
	|void|.  This way, |output()| can check whether it worked or not.  About
	to change |Path::output()|, so that all the |Points| on the |Path| are
	checked before doing any output to |out_stream|.

2002-09-14  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	Changed |DEBUG| to |false| in |persp_transform()| and |output()|.

	* paths.web: Changed |DEBUG| to |false| in |output()|.

	* transform.web:
	Made |struct Focus| a |friend| of |Transform|, in order to be able
	to set elements of |Transform::matrix| explicitly in the constructors of
	|Focus|.  I have noted in a comment that I could get rid of this |friend|
	declaration, if I write a |Transform| member function for this purpose,
	which I should do.

	* pspglb.web: Added forward declaration of |struct Focus|.

	* paths.web: Added debugging messages to |output()|.

	* points.web:
	Added |Transform persp| to |struct Focus|.  The reason is explained in
	the {\TeX} text of the |struct| definition.  Made appropriate changes to
	the constructors.

	Fixed the constructor of |Focus| with |Point| arguments so that it
	does the same thing as the one with |real| arguments.

	Got |persp_transform()| to work using an algorithm from David Salomon's
	book.  Now the focus has a position and a direction, and the scene can
	be viewed from any position.  A z-value is calculated for the perspective
	coordinates, which can be used in a hidden surface algorithm.

	Changed |get_x()|, |get_y()|, etc., so that they all call a generic
	|get_coord()| fucntion.  Wrote both a |const| and an non-|const| version
	of |get_coord()|.

2002-09-13  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	Got the new version of |persp_transform()| to work.  About to make
	some changes to it.  Also, about to delete the old version, so I'm entering
	this version into the archive.

2002-09-11  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web, points.web:
	Working on |persp_transform()|.  Haven't got it working yet.

	* points.web:
	Added |struct Focus| and constructors and made |focus| of this type.
	Where |focus| was used (only in |persp_transform()| and |hex_pattern1()|),
	I've replaced it with |focus.position|.  So in this version I've made
	no significant changes to the way things work yet.

	* persp.web:
	About to change definition of |focus| in order to implement a different
	algorithm in |persp_transform()|.

	* persp.tex: No major changes.

	* 00TODO: Added items (I assume).

	* theater.web: Made changes to formatting code.

	* shapes.web: Changed |show()|.

	* rectangles.web, procfile.web, polygons.web:
	Made changes to formatting code.

	* points.web: Made changes to formatting code.

	Changed |show()|.

	Working on |persp_transform()|.

	* planes.web, pictures.web, patterns.web:
	Made changes to formatting code.

	* paths.web: Made changes to formatting code.

	Changed |show()|.

	* lines.web, ellipses.web: Made changes to formatting code.

	* cweavedriver.web:
	Divided the section ``@* Formatting commands.'' into two parts: One for
	types defined in C++ and the C++ Standard Library, and one for types
	defined in 3DLDF.

	* curves.web, cuboid.web: Made changes to formatting code.

	* circles.web: Removed formatting code.

2002-09-09  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	Added new version of |persp_transform()| using the algorithm in
	Salomon, David, \book{Computer Graphics and Geometric Modelling}.
	Doesn't quite work right.  I get the error ``Resources lost'' when I
	call |hex_pattern1()|.  I suspect it's because of the lack of error
	handling.

	Added new version of |show()| for showing the various types of
	coordinates: world, perspective, user, and view.  I plan on changing
	the way coordinates are handled in the future, though.

2002-09-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transform.web:
	Added constructor for |Transform| with 16 |real arguments| for
	completely specifying a transformation matrix.

	* points.web:
	Working on redefining |persp_transform()|.  Haven't got new version to work
	yet.  Including it after the old version, but have commented it out.

	* patterns.web: Initial version.

	* patterns.web: New file.

	* polygons.web:
	Changed |bool DEBUG| from |true| to |false| in |intersection_points()|.

	* points.web:
	Commented out |~Label()|, which fixed a bug that caused a memory fault.

	* planes.web:
	Changed |bool DEBUG| from |true| to |false| in |intersection_line()|.

	* lines.web:
	Changed |bool DEBUG| from |true| to |false| in |get_distance()|.

	* pictures.web:
	Commented out |~Label()|, which fixed a bug that caused a memory fault.

	* persp.web:
	Found cause of bug involving labels and fixed it by commenting out
	|~Label()|.  Changed name of |hex_pattern()| to |hex_pattern1()|.
	Made changes to it, |draw_frame()|, and to the user code.

	This version produces two identical tessellations seen from two different
	focuses.
	{\TeX} code indicating the focuses using |\toks1| and |toks2| is
	written to \filename{sub_persp.tex}.

	* persp.tex:
	This version loads two identical tessellations seen from two different
	focuses.  They are positioned on the pages using {\TeX} code.  This must
	be individually tailored to the picture generated by |hex_pattern1()|.
	The focus is indicated by using |\toks1| and |toks2|, which are written to
	\filename{sub_persp.tex} by 3DLDF.

2002-09-05  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	About to freeze the state of the program previous to removing functions
	from the files that define the classes.  After I've done this, I will try
	to replace |Point* pt| in |Label| with |Point pt|.  I hope this will help
	me to fix the way |Picture::clear()| works.  I believe that this is the
	cause of the problem with memory faults when I use labels in |hex_pattern()|
	and/or |draw_frame()|.

2002-09-03  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Working on debugging |hex_pattern()| and |draw_frame()|.  Still having
	problems when I use labels.  I don't understand why.

	* points.web: Minor changes.

	* pictures.web: Added |show()|.

	* paths.web: Got rid of debugging messages.

	* paths.web: Removed debugging messages.

	* polygons.web: BUG FIX!!
	Changed the order of operations in |operator=()|.  Now, the |Path| is set first,
	then the other data members.  Before I did this, |label()| sometimes caused
	|*(points(1))| to be replaced by |center| after |current_picture.clear()| had been
	called (but not before).  I have no idea why this should have been the case, but so far,
	changing |operator=()| seems to have fixed the problem.

	Added |draw()| after making |Path::draw()| virtual.  I will probably make it
	non-virtual again and get rid of the |Polygon| version, but I haven't so far.

	* paths.web:
	In |@<Discard |points| and |connectors|@>|: Now using the |vector| function |clear()|
	instead of using a loop with |pop_back()|.

	Made |draw()| virtual.  This is probably unnecessary.  It was an attempt to
	fix a bug.  It didn't fix it, but something else seems to have.

	* persp.web:
	Worked on debugging |hex_pattern()| and |draw_frame()|.  About to delete a lot
	from |hex_pattern()|, so I'm checking this file back in, in case I want to get
	the old (non-functioning) version back for some reason.

	* pictures.web: Minor changes to debugging output.

	* persp.web: Minor changes.

	* paths.web:
	Fixed |fill()|, |filldraw()|, etc., so that |fill_draw_value|,
	|draw_color|, etc., are set for the copy that is put onto
	|current_picture|, and not for the |Path| itself.  Due to changes I
	made previously, these drawing and filling functions no longer worked
	correctly, until I made these changes.  I had already done so for
	|draw()|, but hadn't done them for the others, although I intended to.

	* cwebmac.tex:
	Changed default header for pages before named section and added datestamp
	to the header line.

	* cweavedriver.web: Minor changes.

	* 3DLDF.macs:
	Added ``\rcslog'' and ``\endrcslog'' for printing the RCS log comment to
	the cweave output.  This makes it possible to see which version of each
	file has been used.

	* 00TODO: Added items.

	* transform.web, procfile.web: Formatting changes.

	* pictures.web:
	Rearranged sections so that |Label| is in its own section before
	|Picture|.

	* persp.web: Minor changes.

	* paths.web: Commented-out one line of debugging output.

	* shapes.web: Various changes in headings for the cweave output.

	* transform.web:
	Removed invocation of a named section that I was no longer using.

	* pspglb.web:
	Various changes in headings for the cweave output.  Removed superfluous
	semi-colons after function definitions, which didn't look good in the
	cweave output.

	* transform.web:
	Various changes in headings for the cweave output.  No changes to the
	C++ code.

	* transform.web, theater.web, test_routines.web, shapes.web, rectangles.web, pspglb.web, procfile.web, polygons.web, points.web, planes.web, pictures.web, persp.web, paths.web, loader.web, lines.web, io.web, ellipses.web:
	Added ``\rcslog'' and ``\endrcslog'' around the log comment for RCS (the
	version control system).  This makes it so it's printed to the cweave
	output.

	* curves.web:
	Added ``\rcslog'' and ``\endrcslog'' around the log comment for RCS (the
	version control system).  This makes it so it's printed to the cweave
	output.

	Added note to myself about reading through |intersection_points()|.

	* cmplprsp.web:
	Moved the RCS log comment so that it will be printed properly by cweave.

	* cuboid.web, circles.web:
	Added ``\rcslog'' and ``\endrcslog'' around the log comment for RCS (the
	version control system).  This makes it so it's printed to the cweave
	output.

	* cmplprsp.web:
	Added ``\rcslog'' and ``\endrcslog'' around the log comment for RCS (the
	version control system).  This makes it so it's printed to the cweave
	output.

	Also changed ``3D4MP'' to ``3DLDF'' in a comment.

	* cweavedriver.web: Minor changes.

2002-09-02  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* pictures.web:
	Added comment about |Label.pt|.  I tried to change it to a |Point| from
	a |Point*|, but this didn't work.  See the comment under ``Label class
	definition'' for more information.

	* points.web: Changed |DEBUG| in |operator==()| to |false|.

	* paths.web: Changed |DEBUG| in |output()| to |false|.

2002-09-01  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Working on debugging |hex_pattern()|, but I haven't been able to find the
	cause of the problems.

	* polygons.web:
	Changed |operator=()| so that it uses |clear()| and calls |Path::operator=()|
	instead of casting.

	* points.web: Changed labelling functions to be |const|.

	Changed |clear()| so that both |shapes.size()| and |labels.size()| must
	be equal to 0 for |clear()| to exit without doing anything.

	* pictures.web: No significant changes.

	* paths.web:
	Changed heading `` Discard elements'' to ``Discard points and connectors''
	so that it matches the name of the section.

	When I copy |Path|s now, I don't copy |draw_color|, |fill_color|,
	|dashed|, and |pen|.  These items should only be set in the new |Path|
	that's created and put onto |current_picture|.  I don't think I've changed
	this in all the places where it should be changed yet.  It doesn't hurt to
	set them, but it will be cleaner to be consistent about not setting them.

	Changed labelling functions to be |const|.

	* persp.tex, cweavedriver.web:
	No significant changes.  Checking back in before using ``rcsfreeze'',
	just in case there's some change or other that's important, after all.

	* procfile.web:
	Changed compile comment to use ``-g'' instead of ``-O5'' because I want
	the compilation to generate debugging code and not to optimize.
	!! TO DO: I ought to have a command line option for deciding which I want
	to do.  I haven't gotten GDB to work with this program yet, though.

	* points.web:
	In version of |label()| with an integer for the first argument:
	changed |text_int| argument from |int| to |unsigned int|.  The same
	applies to |dotlabel()|.

	* pictures.web: Minor formatting changes.

	Following this version I will be trying to fix a bug that occurred when
	using
	|hex_pattern()| and |draw_frame()|.  It causes a memory fault.
	I suspect it may have something to do with
	|Picture::clear()| or the way in which labels are handled in |Picture|s.

	* persp.web: No longer including \filename{theater.h}.

	Currently debugging |hex_pattern()| and |draw_frame()|, since I discovered a
	bug that causes a memory fault.  I suspect it may have something to do with
	|Picture::clear()| or the way in which labels are handled in |Picture|s.

	* io.web:
	Added section names so that headings are printed when {\bf cweave} is run.

	Added |tex_stream| so that I can include {\TeX} code in my user code.  Changed
	|initialize_io()| to correspond to this.  Also changed
	|write_footer_to_out_stream()| to |write_footers()|, since a footer is also
	written to |tex_stream|.

	Got rid of superfluous |extern| declarations for functions.

	* cmplprsp.web:
	Removed outdated comment about \filename{loader.h}.  Noted that
	\filename{loader.web} doesn't create a C++ file.

	Commented out code having to do with \filename{theater.web}, since
	I'm not currently using it.

	Changed compile comment to use ``-g'' instead of ``-O5'' because I want
	the compilation to generate debugging code and not to optimize.
	!! TO DO: I ought to have a command line option for deciding which I want
	to do.  I haven't gotten GDB to work with this program yet, though.

	* 3D4MP.macs:
	Changed definition of ``\verbatim\title|endverbatim'' to ``3DLDF'' to
	correspond to the new name of the program.
	It's trickier to change the name of this file, because it's in RCS.
	Added not about this at the beginning of the file.

2002-08-30  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: Added item.

2002-08-22  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Got vertical and horizontal copying of |hex_pattern()| to work.  Need to
	adjust values.  It's a bit tricky getting the pattern and the frame centered
	properly using {\TeX}.  The best way would be to have 3DLDF write the values
	to a {\TeX} file.

	* theater.web: No significant changes.

	* polygons.web: Added |get_center()|.

	Added |shift()| and |operator*=()|.

	* pictures.web: Added |shift()|.

	* ellipses.web: Made |shift()| |virtual|.

	* transform.web:
	Added |shift_times(real)| for multiplying the shift by a real number.

	Added |operator*(real)| and |operator*=(real)|.  They multiply each
	element of |matrix| by the real argument.  I have no use for it now,
	but it may turn out to be useful for something.

2002-08-17  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Got rid of|Picture|s.  Now copying using hexagons.  Trying to fill entire
	frame.  Working on the copying routine.

	* points.web: Added |Picture::shift(const Point& p)|.

	Added labeling commands with integer argument.

	Changed labeling commands with |string| argument so that the |string|
	is no longer optional.

	BUG FIX: Changed |get_x()|, |get_y()|, |get_z()| and |get_x()| so
	that |persp_transform()| is invoked, if the argument |'p'| is used
	to get the corresponding perspective coordinate.  Before this was done,
	|get_x('p')|, etc.\space returned incorrect results.

	* persp.web:
	This version contains the triangles.  Getting rid of them in next
	version because the code is in the way.

2002-08-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* theater.web: Started working on hollowing out the M.

	* pictures.web:
	Added a comment about having both a global variable |DO_LABELS| and
	a |class| member variable in |class Picture| called |do_labels|.

	* persp.tex: No significant changes.

	* persp.mp:
	Removed |beginfig(1)| and |endfig()|, since these commands are used in
	\filename{sub_persp.mp}.  I'm not sure that the frame produced in
	\filename{persp.mp} is really output.

	Added |%% eval:(read-abbrev-file "~/.abbrev_defs")| to the local variables
	list, since I don't think it was being read.  However, I may be wrong about
	this.  The abbreviation table for Metafont mode was defined in
	my \filename{metafont-mode.el} file with abbreviations.  This was the
	reason I couldn't get rid of abbreviations I didn't want.  The things I
	was doing while I was finding this out may have caused
	\filename{~/.abbrev_defs} to not be loaded when loading this file.

	* theater.web:
	Added |bool DO_PERSPECTIVE_VIEWS| for enabling or suppressing the output of
	the perspective views.  Made the corresponding changes to the sections that
	take care of the output of the perspective views.

	Did the lower ``M'' on the vertical sign, but haven't ``hollowed it out''
	yet.  It is still solid.

2002-07-26  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web:
	Changed the definition of |Point::draw_help()| so that it calls the |Path| version.
	Before, it called |Path::draw()|, which caused dashing to be handled improperly.

	* cweavedriver.web: Changed the line
	\input 3D4MP.macs
	to
	\input 3DLDF.macs
	since I've changed the name of that file.

	* theater.web:
	Starting doing the letters on the vertical sign.  Currently, only the vertical
	sign is output.

	* 3DLDF.macs: Initial version.  Formerly called 3D4MP.macs.

	* 3DLDF.macs: New file.

	* persp.tex, persp.web, points.web, theater.web:
	This version was checked out as of 2002.07.26.  Haven't worked on it
	for a couple of months.  Checking it in, so that I can revert to the
	state it's in now, if necessary.

2002-05-10  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web:
	Fixed a bug.  |connector_iter| was not reset when the |Path| was output the
	second time when using |filldraw()|.  Now it is.

	* theater.web:
	Finished the vertical sign, except for the lettering.  About to
	print out several views, without help lines and labels.

	* paths.web:
	Made changes to the way the default arguments are handled in
	|Path::draw_help()| and |Point::draw_help()|.

	Added |get_last_point()|.

	* lines.web:
	Minor formatting change that corrects an error that occurred when
	running cweave cweavedriver.web.

	* cweavedriver.web: Minor adjustments.

	* cuboid.web:
	Minor formatting change that corrects an error that occurred when
	running cweave cweavedriver.web.

	* cmplprsp.web:
	Added routine which makes it possible to generate \filename{loader.h}
	from \filename{loader.web}.  This, in turn, makes it possible to
	include \filename{loader.web} in \filename{cweavedriver.web}.

	* circles.web: Added |get_radius()| and |get_diameter()|.

	* loader.web:
	Initial version.  Formerly, \filename{loader.h} was an ordinary file.
	Now, it's generated by running ctangle on \filename{loader.web}.
	\filename{cmplprsp.web} has been changed accordingly.

	* loader.web: New file.

2002-05-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* theater.web: Finished the connecting lines for the thickness of the
	vertical sign.  Started working on the curves for the neon tube.

2002-05-03  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* theater.web: Added code.

	* transform.web:
	Added declaration of |rotate_around()| with |Path| argument.
	Definition in \filename{paths.web}, because |Path| is an incomplete
	type in \filename{transform.web}.

	* points.web: Added definition of |Picture::rotate_around()|.

	* pictures.web:
	Correction from last checkin:  Added {\it declaration\/} of |rotate_around()|.
	It is defined in \filename{points.web}, because it has |Point| arguments,
	and |Point| is an incomplete type in this \filename{pictures.web}.

	* pictures.web: Added |rotate_around()|.

	* cmplprsp.web: Changed \filename{quader.web} to \filename{cuboid.web}.

	* paths.web:
	Added |Transform::rotate_around()| with |Path| argument.  Must be defined
	in \filename{paths.web} because |Path| is an incomplete type in
	\filename{transform.web}.

	* cuboid.web:
	Changed |rectangles| from an array of |Rectangle|s to a |vector<Rectangle*>|.
	Removed |ctr|.  Made changes to almost all of the functions in this file
	to account for these changes.  Using a |vector| makes it possible to dispense
	with |ctr|.  Instead, if I need to know how many |Rectangle|s have been
	set already, I can use |rectangles.size()|.  Also, in the drawing and filling
	functions, in the transformation functions, and perhaps in other places,
	I now use an |iterator| to cycle through |rectangles|.

	Added copy constructor.

	Changed |~Cuboid()| so that the dynamically allocated memory in
	|rectangles|, if any, is deallocated.  Following this, |rectangles| is
	cleared.

	Changed |operator=()| so that it deallocates and clears |rectangles| before
	assignment.

	Changed |operator()()| so that it uses |rectangles.size()| to check whether
	a |Cuboid| is already full instead of |ctr|, which no longer exists.

	Added |operator*=(const Transform&)|.

	* persp.web: Changed \filename{quader.h} to \filename{cuboid.h}.

	* cweavedriver.web:
	Changed \filename{quader.web} to \filename{cuboid.web}.

	* cuboid.web: Changed \filename{quader.h} to \filename{cuboid.h}.

	* cuboid.web:
	Initial version.  Changed name of \filename{quader.web} to
	\filename{cuboid.web}.  This means that if
	you need to compare this file with revisions earlier than the initial
	version of this file, you'll have to check revisions of
	\filename{quader.web}.

	* cuboid.web: New file.

2002-04-25  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* cweavedriver.web:
	Now loading \filename{quader.web} which defines |class Cuboid|.

	Currently, errors occur when cweave is run.  Must try to find where they occur.

	* persp.tex:
	Now loading additional perspective views with different heights of |focus|.

	* persp.web: Changed |render()| to |output()|.

	Loading the new header file \filename{quader.h}.

	Added some testing code.

	* theater.web:
	I redid the marquee and now I am redoing the vertical sign.  This is necessary, because
	these parts do not lie in the same plane as the base and the sub-marquee section.
	For this reason, rotating the parts to get the second side didn't work, since parts
	either did not match up or they intersected.

	* transform.web: Added declaration of |shift(const Point&)|.
	It's defined in \filename{points.web}, because |Point| is an incomplete type
	in this file.

	* rectangles.web: Added |get_center()|.

	* quader.web:
	Added a constructor with four |Point| arguments.  This way, a |Cuboid| can
	be initialized with the |Point|s for one of its surfaces.  I added it because I kept
	getting compiler errors when I tried to do this before I defined this constructor.

	Added |get_center()|.

	Added several versions of |draw()| and |filldraw()|.

	* pictures.web:
	Added a note to myself to check how I use |Label|s, since there's no constructor for
	it.  Maybe I ought to define one, although I assume the default constructor
	works adequately, since I haven't had any problems with |Label|s, so far.

	* points.web: Added |Transform::shift(const Point&)|.

	Changed |~Label()| so that it checks whether |Point* pt| (a member variable of |Label|)
	is $\equiv 0$, and if it's not, it's deleted.

	* ellipses.web:
	Minor formatting change that corrected an error that occurred when cweave was run.

	* pictures.web:
	Added |bool do_labels| to |class Picture|.  It's set to |true| in the constructors
	and to |false| in |suppress_labels()|.  It's used in |output()|.

	Fixed a bug in |output()|:  |transform| is now set to identity at the end of |output()|.
	This way, if a |Picture| is output again, |transform| is not applied again.  Since it's
	been applied once already to all of the |Shape|s, it shouldn't be applied again.

2002-04-24  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* theater.web: Added code.

2002-04-23  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* quader.web:
	Changed |Quader| to |Cuboid|.  Haven't changed the name of the file yet,
	though, because I have to look up how to go about this in the RCS directory.

	It might be better to leave the name as it is, and only change it for
	production versions.

	* theater.web:
	Managed to get the rotation of the marquee to work.  Changed the
	way I generate the perspective view.  Now I rotate each |Picture| as
	I push it onto the |vector<Picture>|.  I've added the |vector<Picture>|
	|persp_pictures| for this purpose.

	It's not possible to rotate all the
	parts of the front view around the same axes.  Also, the parity of
	some parts of the building make it necessary to perform more than one
	rotation.

2002-04-22  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* shapes.web: Changed |render()| to |output()|.

	* rectangles.web: Minor formatting change.

	* quader.web: Added |center| and |ctr| to |class Quader|.

	Added |shift()|, |draw()| and |filldraw()|.

	* points.web:
	Changed the member variable |p| in |bool_real_point| to |pt|.

	In |operator=()|: |drawdot_value|, |drawdot_color|, and |pen| are now
	copied.

	Added |set_to_identity()|, in case I want to set |transform| to identity
	for a |Point|.

	Fixed bug in |drawdot|:  Now |drawdot_value|, |drawdot_color|, and |pen| are
	set in the |Point| that is dynamically allocated and pushed onto
	|current_picture|.

	Got rid of the old |output()|, which had no definition, and changed |render()|
	to |output()|.

	Changed return value of the commented-out version of |intersection_point()|
	that uses |Line::intersection_point()| from |bool_real_point| to |bool_point|.
	Not using it currently, because it
	doesn't work properly.

	* pictures.web: Changed |render()| to |output()|.

	* persp.tex: No significant changes.

	* paths.web:
	Changed the version of |shift()| with with a |Point| argument
	so that it uses the version with |real| arguments.

	Changed |render()| to |output()|.

	* lines.web:
	Changed return value of (commented-out function) |Point::intersection_point()|
	to |bool_point| from |bool_real_point|.  Haven't fixed it yet, so still using
	the old version.

	Changed |Line::intersection_point()| to |Line::get_distance()|.

	* ellipses.web:
	Now using |get_center()| in |angle_point()| instead of accessing |center|
	directly.

	Changed the version of |shift()| with |real| arguments
	so that it uses |operator*=()| and the version with a |Point| argument
	so that it uses the version with |real| arguments.

	* cmplprsp.web: Added \filename{quader.web}.

	* theater.web:
	Finished front view except for lettering.  Have discovered, however, that
	rotating the pictures around an axis does not lead to good results.  Also,
	the perspective transformation that I've implemented is too limited.  It
	often leads to errors in Metapost.  I should find out how to project onto
	an arbitrary plane.

	The roof is the first part that uses 3D objects.  A hidden surface algorithm
	is needed now.

	In the next version I will start redefining the drawing using 3D information,
	since I've run into problems.  For example, I haven't been able to make the
	two sides of the marquee (that are visible) match up.

	* quader.web: Initial version.

	* quader.web: New file.

2002-04-17  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transform.web: Made |is_identity()| |const|.

	* points.web: Added definition of |Picture::operator+=(Picture&)|.
	It must be defined here, |Point|, which
	is an incompletely defined |class| in \filename{pictures.web}.

	Removed the declaration of |mediate()|, which was declared inside |class Point|.  This
	was erroneous, because |mediate()| is not a member function of |Point|.

	* pictures.web:
	Added |clear()| to |operator=()|.  This would have caused problems, if I'd ever used it on
	a non-empty |Picture|.

	Added |operator+=(Picture&)|.  Defined in \filename{points.web}, because it uses |Point|, which
	is incompletely defined in this file.

	Added |clear_transform()|.  May not need it, though.

	* paths.web: Removed an outdated comment.

	* lines.web:
	Added |position.apply_transform()| and |direction.apply_transform()| to
	the constructor that takes |Point| arguments.
	I don't know whether this has anything to do with the problems I'm having
	with |Line::intersection_point()|, but it can't hurt.

	* ellipses.web:
	Changed ``|first|'' to ``|b|'' and ``|second|'' to ``|pt|'' for a
	number of |bool_point|s.

	* theater.web:
	Added code for the upper stories.  About to start work on the roof.

2002-04-15  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.tex, persp.web, theater.web: Minor changes.

	* pspglb.web: Added forward declaration of |struct bool_point|.

	* points.web:
	Changed |bool_point| from a simple |typedef| using |pair| to a |struct|.
	This was necessary in order to be able to use |bool_point| as the return
	type for |Point::intersection_point()|.

	Went back to using old version of |Point::intersection_point()|, because
	I was having problems with the new version that uses
	|Line::intersection_point()|.
	Also changed |Point::intersection_point()| so that it returns a |bool_point|.

	Named of the members of |bool_point| to |b| and |pt|.  This required changing
	``|first|'' to ``|b|'' and ``|second|'' to ``|pt|'' in many places in
	|Point::intersection_point()|.

	* paths.web:
	Changed the return value of |intersection_point()| from |bool_real_point|
	to |bool_point| to account for the fact that I've gone back to using
	my old version of |Point::intersection_point()|, which I've changed to
	return a |bool_point|.

	* lines.web:
	Commented-out |Point::intersection_point()| because it wasn't working.
	This is the version that calls |Line::intersection_point()|.

	I've commented the old version back in.  This version uses traces on the
	major planes to find the intersection point.

	* curves.web:
	Changed |intersection_points(Point, Point, Point)| so that the
	|bool_point_pair| |return_value| uses the new names |b| and |pt| for the
	members of the |bool_point|s, instead of |first| and |second|, as they
	were before I changed |bool_point| to a |struct| from a simple |typedef|
	using |pair|.

	* persp.web: Removed testing code I was using in this file to
	|test_two_ellipse_intersections()| in \filename{test_routines.web}.

	* test_routines.web:
	Added testing code I was using in \filename{persp.web} to
	|test_two_ellipse_intersections()|.
	Haven't
	tested it here, don't know whether it causes problems in this function.

	* ellipses.web: Added |const| version of |get_center()|.

	Finished |Ellipse::intersection_points(Ellipse)| and tested it.
	It seems to work properly now for all cases.

	* curves.web:
	Fixed bug in |location()|.  After the |Plane_Curve| is put into a major plane with
	|center| at the origin, it is now rotated so that |points[0]|
	points x-axis, if the |Plane_Curve| lies in the x-y or x-z plane, or in the
	direction of the z-axis, if it lies in the z-y plane.

	* procfile.web: Minor change in an output string.

	* procfile.web:
	|process_file()| now removes the ``{\bf .hld}'' file when it's finished
	with it.  This is the copy of the header file that is made before running
	ctangle, and is compared with the new version in order to determine whether
	the files that depend on this header need to be recompiled.

2002-04-14  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* ellipses.web:
	Started implementing the algorithm for finding intersection points
	in the coplanar case where the centers differ.

	* ellipses.web: Worked on |Ellipse::intersections_points(Ellipse)|.
	Working on and testing the coplanar cases.

	Wrote a trap for the case
	that the ellipses are congruent and located in the same place.
	The case that the values of |axis_h| and |axis_v| are reversed and one of
	the ellipses has been rotated with respect to the other is handled
	correctly.

	Also, the cases where the ellipses are not congruent, but have the same
	center are handled.  In these cases, it's possible to use a simple algebraic
	solution, since the common center can be shifted to the origin, and the
	ellipses can be rotated into a major plane.

	I'm about to start work on the case that the centers are different.

	* persp.web:
	Added testing code for |Ellipse| intersections (coplanar cases).

	* persp.tex: No significant changes.

	* points.web, shapes.web, paths.web: Made |show()| |const|.

	* curves.web:
	Fixed a bug in |intersection_points()|.  |copy.points[0]| was not always
	oriented correctly to the horizontal axis, which caused an incorrect
	intersection point to be found.

	Some changes in {\TeX} text and formatting.

2002-04-12  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: Made |epsilon()| |static|.

	* planes.web: Forgot to mention at last check-in:
	Constructor now calls |normal.apply_transform()| and
	|point.apply_transform()|.

	|intersection_line()| returns a |Line| now, instead of a |point_pair|.

	* planes.web:
	Debugged |intersection_line()|.  I was having problems because of |Line|'s
	constructor.

	* paths.web: Made |operator*=()| |virtual|.

	Changed |get_plane()| so that |point.apply_transform()| is called.
	It is also now |const|.

	* lines.web:
	Changed the constructors and |operator=()| so that they just use their arguments
	without calculating
	|direction| from them.
	Calculating a |Line| should be done with |Point::get_line()|.

	Added |show()|.

	Added |INVALID_LINE|.

	* ellipses.web: Changed |position()| to |location()|.

	Worked on |intersection_points(Ellipse)|.  Rewrote the parallel, perpendicular,
	and skew cases, and started on a new version of the coincident case.  Having problems
	with this.  I thought I had an algebraic solution, but it turned out not to
	work.  Will have to wait until Dr.~Schwardmann answers my e-mail, or I'll have
	to look up the Buchberger algorithm.

	Added |operator*=(Transform)|.

	* curves.web: Changed |position()| to |location()|.

	* lines.web: Initial version.  Removed the code for |Line| from
	\filename{points.web} and put it here.

	* lines.web: New file.

	* planes.web: Initial version.  Removed the code for |Plane| from
	\filename{points.web} and put it here.

	* planes.web: New file.

	* theater.web, rectangles.web:
	Added |#include "lines.h"| and |#include "planes.h"| to
	|@<Include files@>|.

	* pspglb.web:
	Added |struct Plane| to the forward declarations of types.

	Minor formatting change.

	* polygons.web: Added |#include "lines.h"| and |#include "planes.h"| to
	|@<Include files@>|.

	* points.web: Removed the code for |Line| and |Plane| to the new files
	\filename{lines.web} and \filename{planes.web}.

	Removed the definitions of |Point::get_line()| and
	|Point::intersection_point()| to \filename{lines.web}, because
	they require |Line|s, and |Line| is an incomplete type in
	\filename{points.web}.

	* paths.web: Added |#include "lines.h"| and |#include "planes.h"| to
	|@<Include files@>|.

	* cweavedriver.web:
	The new files \filename{lines.web} and \filename{planes.web} are
	input.  I've alphabetized the formatting commands for the various
	data types that need them.

	* curves.web: Added |#include "lines.h"| and |#include "planes.h"| to
	|@<Include files@>|.

	* cmplprsp.web:
	cmpl has been changed so that it now processes the new files
	\filename{lines.web} and \filename{planes.web}.

	* ellipses.web: Added |#include "lines.h"| and |#include "planes.h"| to
	|@<Include files@>|.

	Commented-out declaration of
	|Ellipse::intersection_points(Ellipse& pc)|.  The definition has been
	removed, pending replacement using the algebraic solution provided by
	Dr.~Ulrich Schwardmann of the Gesellschaft f{\"u}r wissenschaftliche
	Datenverarbeitung, G{\"o}ttingen, Germany.

	* circles.web:
	Error in comment for last check-in!!  This is what it should have been:
	Added |#include "lines.h"| and |#include "planes.h"| to
	|@<Include files@>|.

	* circles.web, persp.web:
	Added |#include "points.h"| and |#include "lines.h"| to
	|@<Include files@>|.

	* ellipses.web: Removed the old definition of
	|Ellipse::intersection_points(const Ellipse&)|,
	which wasn't complete, anyway and put in a note to myself
	to replace it with one using the solutions that result from calling
	Mathematica's ``Solve'' command on the system of equations that
	describe the intersections between two ellipses.  Also, put a note to
	myself to use the same method for solving the problem of finding the
	intersection point of an |Ellipse| and a |Point|.

2002-04-10  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polygons.web: Started writing |Polygon::intersection_points()|.

	Changed order of arguments in the constructor with angle arguments.  Now
	|center| is the first argument, as it is for |Circle| and |Ellipse|.

	* persp.web: Started testing |Polygon::intersection_points()|.

	* ellipses.web: Minor formatting changes.

	* theater.web:
	Added code for the panels below the windows in the upper stories.

	* pspglb.web: Added formatting commands for types that I define here.

	Added |typedef pair <bool, real> bool_real|.

	* points.web:
	Changed return value of |is_on_segment()| from |pair <bool, real>|
	to |bool_real|, which is the same thing, defined using |typedef|.

	Changed |intersection_point()| so that it tests whether the |Point|
	is on both segments.  If it's not, it changes the |bool| value
	in the |bool_real_point| that it returns to |false|.

	* persp.web: Removed testing code for |Point::intersection_point()| to
	\filename{test_routines.web}.

	* persp.tex: Changed formatting for working on the theater drawing.

	* test_routines.web:
	Removed test routine for |Line::intersection_point()| from
	\filename{persp.web} to here.

	* test_routines.web:
	Added |@<Test routines@>=| in a couple of places, where it should have
	been.

	* pspglb.web:
	Added forward declaration of |bool_real_point|.  It's needed because it's
	used as the return value of
	|Point::intersection_point()|, which is, of course, declared within
	the declaration of |class Point|.  However, |bool_real_point| can only
	be defined {\it after\/} |Point| is defined.  This forward declaration
	solves the problem.

	* points.web:
	Added definition of |struct bool_real_point| and defined the
	|const bool_real_point| |INVALID_BOOL_REAL_POINT|.  Defined constructors
	and assignment operator for |bool_real_point|, too.

	Added formatting commands for |point_pair|, |bool_point|, |bool_point_pair|,
	|bool_point_quadruple| and |bool_real_point|.

	Added error handling code in |unit_vector()|.

	Added |Line::intersection_point()| and redefined
	|Point::intersection_point()| so that it uses the former.
	The new version uses the routine described in Jones, Huw.
	{\it Computer Graphics Through Key Mathematics}.
	I've kept the
	old version but commented it out.  It may be useful to have it, in case
	the new one turns out not to work properly, after all.  I have tested it,
	though.

	Removed some code for debugging output from |Line::get_line()|.

	Rearranged the order of compilation of some of the sections so that
	\filename{points.web} compiles correctly.

	* persp.web:
	Added testing code for the new version of |Point::intersection_point()|.

	* paths.web: Fixed minor formatting errors.

	Changed the return value of |intersection_point()| from |Point| to
	|bool_real_point|.

	* ellipses.web: Fixed minor formatting errors.

	* 3D4MP.macs:
	Added temporary definition for |\MP|.  Must redefine it to use the
	proper font.  Maybe it's defined somewhere for the Metapost manual.

	Added definition for |\uscore| for use in |\filename| where the filename
	has an underscore character.  \filename{test_routines.web} does, but
	otherwise I try to avoid using underscores in filenames.

	* cweavedriver.web:
	Commented-out input of \filename{loader.h}.  I may change the
	way cmpl works, so that \filename{loader.h} is replaced by
	\filename{loader.web}.  If I do, including it here will work better, because
	I'll be able to have the local variables list (for Emacs) within CWEB-type
	comments (@q ... @>).

	* cweavedriver.web: Added formatting commands for types.

	* procfile.web:
	Changed the messages that are printed to standard output about the
	state of the header files, i.e., whether they've changed or not.

	* procfile.web: Added error handling code.  Now, if
	{\tt ctangle} fails, \.{cmpl} exits.
	Changed |compile_return_value| and the other, similarly named variables
	to |system_call_return_value|, etc.~because they are now used for
	checking the result of {\tt ctangle} as well, and not just of compilation.

2002-04-08  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web: Testing |Point::get_line()|.  Just started.

	* pspglb.web: Added forward declaration of |struct Line|.

	* points.web:
	Added |struct Line|, together with a constructor and |Point::get_line()|.
	Haven't done anymore yet.

	* pspglb.web:
	Got rid of |DO_HELP_LINES| and |HELP_COLOR| and replaced them with |static| member
	variables of |Path|.

	* polygons.web:
	Merely added a comment about having to change the name ``Polygon'' to
	``Regular_Polygon'' if I decide to define irregular polygons as a class.

	* points.web:
	Added comment before |persp_transform()|, since it doesn't behave as I expected it to.

	Added declaration of |undraw()|.  It's defined in \filename{paths.web} because
	it uses a |Path|, which is an incomplete type here.

	Added declaration of |draw_help()|.  It's defined in \filename{paths.web} because
	it uses a |Path|, which is an incomplete type here.

	* persp.web:
	Moved |focus.set()| into |theater()| on the one hand and the testing
	code on the other.  Tested moving |focus| in between renderings.  It works, but
	not quite as I expected.  See |persp_transform()| in \filename{points.web} for
	more information.

	* persp.tex:
	Added code for a third PostScript file, but commented it out, because I
	don't need it now.

	Changed the way the PostScript files are put into their |\vboxes|, because the
	drawing has gotten too tall for DIN A3.

	* paths.web:
	Added |static| member variables to |class Path| for help lines (and curves):
	|string help_color|, |string help_dash_pattern|, and |bool do_help_lines|.

	Added |draw_help()|, versions for |Path|s and |Point|s.  The |Point| versions are
	declared in \filename{points.web} but must be defined in this file because they
	|Path|s, which is an incomplete type in \filename{points.web}.

	Added a |Point| version of |undraw()|.  What I said above about the declaration of
	|Point::draw_help()| applies to |Point::undraw()| as well.

	* theater.web:
	Worked on vertical sign.  Did column of masonry on the right-hand
	side.  Started work on the panels below the windows in the upper
	part of the building.

	Tested changing value of |focus|.  It works, but the way
	|persp_transform()| works is a bit different from what I expected.
	I've put a note in \filename{points.web} to check this.  I will
	probably change the definition of |persp_transform()| when I've
	read more about perspective transformations.

2002-04-07  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transform.web:
	Added default value for |angle| argument for |rotate_around()|.
	The default is 180.

	* theater.web:
	Started working on the vertical sign.  Have got the outline and the
	neon tube done.  Colors other than the ordinary ones are not displayed
	properly, neither with gv nor with Adobe Acrobat.  Must find out why not.

	* procfile.web:
	Changed, so that the result of compiling the individual files is checked.
	If compilation failed, cmpl exits.

	Fixed a bug involving recompilation depending on the state of the header
	file.  The case that a file doesn't write a header file wasn't handled
	properly.

	Now compiling using the ``-05'' option.  Linking is also done using
	this option.  The change for linking is in \filename{cmplprsp.web}.

	* points.web:
	Added default value for |angle| argument for the various versions of
	|rotate_around()|.  The default is 180.

	* persp.web: Minor changes in the course of testing.

	* persp.mp:
	Minor correction in the ``name of file''-comment at the beginning of the
	file.  ``mp'' had been expanded to ``my{\uscore}pen''.  I hope I've
	fixed this now.  I've redefined the abbreviation to expand to ``mp''.
	In a while, I'll delete from \filename{~/.abbrev_defs} and see if it's
	worked.

	* paths.web:
	Added default value for |angle| argument for the various versions of
	|rotate_around()|.  The default is 180.

	Added |operator&()| and |operator&=()| for concatenating |Path|s
	using Metapost's ``&'' operator.

	Added |operator+()| and |operator+=()| for adding |Point|s to |Path|s.

	Added |append()| for appending one |Path| to another using a connector,
	which can be specified.

	Changed |set_cycle()| so that it has a default argument of |true|.

	Got |reverse()| to work.

	Put in commented-out code for |operator==()|.  Haven't gotten around
	to defining it yet.

	* ellipses.web:
	Started to add |operator==()|, but left it commented-out, because
	|Path::operator==()| is needed to make it work, and I haven't defined
	it yet.

	* cmplprsp.web: Added compiler option ``-05'' to try to get 3DLDF to
	run faster.  Did the same thing in \filename{procfile.web}.

2002-04-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* paths.web:
	Intermediate version.  Working on |reverse()|.  See ``START HERE''.

	* loader.h: Now loading ``algorithm''.

	* paths.web: Added |operator&=(const Path& pa)|.

	* test_routines.web: Added |test_path_concatenation()| for
	|Path::operator&(const Path& pa) const|.

	* paths.web:
	Added |operator&(const Path& pa) const| for concatenating |Path|s.

2002-04-05  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web: Various changes.  Currently working on theater drawing.

	* theater.web: Started work on marquee.

	* pspglb.web: Added |bool DO_HELP_LINES| and |string HELP_COLOR|.

	* points.web, ellipses.web, test_routines.web:
	Changed |four_bool_points| to |bool_point_quadruple|.

	* ellipses.web:
	Changed |Ellipse::intersection_points(Point, Point)| and
	|Ellipse::intersection_points(Path)|so that they each return a
	|bool_point_pair|.

	Changed |angle_point()| in order to account for the change in
	|intersection_points(Point, Point)| (see above).

	* curves.web:
	Added error message in |angle_point()|.  There's no proper definition for it for
	|Plane_Curve|s.  Since it returns |INVALID_POINT|, it's likely that the
	program could recover from the error, if it's called for a |Plane_Curve| or a derived class
	without a definition of |angle_point()| of its own.  For this reason, I prefer having the
	error message rather than having it declared as |virtual|, but not defined, which would
	cause an error, I believe.

	Changed |intersection_points(Point, Point, Point)| so that it returns a
	|bool_point_pair|.

	* persp.web: Removed testing code to \filename{test_routines.web} and
	put it in |test_two_ellipse_intersections()|.

	* test_routines.web: Initial checked-in version.
	This file is not compiled or linked.
	It contains test routines that I don't want to recompile all the time.

	Added |test_two_ellipse_intersections()|.

	* test_routines.web: New file.

	* ellipses.web:
	Did some work on |Ellipse::intersection_points(Ellipse&)|.  It currently does
	not work for the coplanar case, but the other cases work.  It's not dangerous, so
	I'm leaving it in.  Taking a break from working on it.

	* points.web:
	Added |struct four_bool_points| with constructors and |operator=()|.
	Also added |const four_bool_points INVALID_FOUR_BOOL_POINTS|.

	* ellipses.web:
	Intermediate version.  Dr. Oswald Haan of the Gesellschaft fuer wissenschaftliche
	Datenverarbeitung, Goettingen, Germany, pointed out to me, that two ellipses that
	intersect each other can intersect each other at a maximum of four points.
	This means, that I have to rewrite |intersection_point(Ellipse&)| entirely to
	account for this case.  This version preserves a version where the return value has
	been changed to |four_bool_points| already, but the routines have not been changed.
	They don't even work properly yet for finding two intersection points.  About
	to try to get them to work for four.  Three intersection points are also possible, if
	one is a tangent.

	* points.web:
	Added |const bool_point INVALID_BOOL_POINT(false, INVALID_POINT)|.

	* points.web: Added |typedef pair <bool, Point> bool_point|.

	Commented-out some
	warning messages that were irritating in
	|intersection_line(const Plane& pl)|.

	* ellipses.web: Intermediate version.
	Got rid of |Plane_Curve::intersection_point(Plane_Curve&)| and replaced it
	with |Ellipse::intersection_point(Ellipse&)|.  Made appropriate changes.
	Currently debugging it.  About to try changing return value, so that it returns
	a |pair| of |bool_point|s rather than a |pair of |bool|s and a |pair|
	of |Point|s.

	* curves.web:
	Got rid of |intersection_point(Plane_Curve&)|.  It had too many things that
	were specific to |Ellipse|s in it.  I think it will be best to write specializations,
	rather than to try to make a |Plane_Curve| version function for all kinds of
	|Plane_Curve|s.  Since a plane curve can be a quadratic, a cubic, a quartic (I think),
	convex, non-convex, and all sorts of other things, I don't think it's practicable
	to write a general solution.  At least not at my level of mathematical knowledge.

2002-04-04  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* ellipses.web:
	Minor changes to |intersection_points()| with |Ellipse| argument.

2002-04-03  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web: Testing |Plane_Curve::intersection_points()|.  Testing
	intersection of an |Ellipse| with another |Ellipse|.

	* curves.web: Worked on
	|intersection_points(Point center, Point pc_center, Plane_Curve& pc)|.
	It now handles the case of two |Plane_Curves| that lie in the same plane.
	However, I haven't built traps for all conditions, i.e., if there's only one
	intersection point or none at all.  Also, it requires the existence of
	|angle_point()| and |position()| and |center|.  Since the only |Plane_Curve|s
	in existence now are |Ellipse|s (and |Circle|s, which are also |Ellipse|s),
	this isn't a problem, but I will either have to give the other classes
	derived from |Plane_Curve| these members and/or functions, or I'll have to
	overload |intersection_points()| appropriately.

	* ellipses.web: Added |virtual pair<bool_pair, point_pair>
	intersection_points(Ellipse& pc)|.

	* curves.web: Added |virtual pair<bool_pair, point_pair>
	intersection_points(Point center, Point pc_center,
	Plane_Curve& pc) const|.  Have programmed the easy cases
	(parallel and not coincident, and not parallel), and am
	about to start working on the case where the planes are parallel and
	coincident.

	* pspglb.web: Added |typedef pair<bool, bool> bool_pair|.

	* ellipses.web:
	Changed |Plane_Curve::intersection_points()| so that it returns
	intersection points
	even if they aren't on the line segment in question.  Now, a pair of
	|bool|s is also returned, indicating whether each |Point| is on the
	segment or not.

	Made corresponding changes in this file.

	* curves.web:
	Changed |intersection_points()| so that it returns intersection points
	even if they aren't on the line segment in question.  Now, a pair of
	|bool|s is also returned, indicating whether each |Point| is on the
	segment or not.

	* ellipses.web, curves.web:
	Moved |position()| from |Ellipse| to |Plane_Curve|.

	* ellipses.web: Minor bug fix in |Ellipse::position()|.  About to
	attempt putting it into \filename{curves.web} again.
	It didn't work the first time.

	* points.web:
	Added |Plane::get_distance(const Point&)|, which gets the distance
	of a |Point| to a |Plane|, and not the member |distance| of the
	|Plane|.

	* ellipses.web:
	Added |position()| and tested it.  Will try to move it to
	\filename{curves.web}, but want to check in this version first,
	in case moving it doesn't work.

	* polygons.web: Added |is_planar()|, which just returns |true|.

	* paths.web:
	Added |is_planar()|.  It is overloaded in |Polygon| and |Plane_Curve|,
	but I should change it here so that it tests whether a |Path| is
	planar, rather than just returning |false|, which is what it does
	currently.

	Moved |get_normal()| here from \filename{curves.web}.

	Added |get_plane()|.

	* curves.web: Moved |get_normal()| to \filename{paths.web}.

	Added |virtual inline bool is_planar() const|, which just returns
	|true|.

	* points.web: Fixed a bug that showed up when I tried to
	shift a |Point| with coordinates $\equiv 0$.
	I did this by having |world_coordinates[3]| initialized to 1,
	which it should have been in the first place.  Did the same
	for |user_coordinates| and |view_coordinates|, although they're
	currently not used.  Did not do so for |perspective_coordinates|,
	because I'm not sure how the perspective transformation is handled,
	and it seems to be working properly, anyway.

	Changed |shift(Point& p)| to |shift(const Point& p)|.  Since it
	now uses |get_x()|, etc., the argument can be a constant reference.

	Added |struct Plane| with constructor, the function
	|intersection_line()|, and the |const Plane INVALID_PLANE|.

2002-04-02  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	No changes (apparently).  At least, vc-diff doesn't display any.

	* ellipses.web: Made |Ellipse::intersection_points()| |virtual|.
	Added |in_rectangle()|, |out_rectangle()|, |draw_in_rectangle()|, and
	|draw_out_rectangle()|.  In |Ellipse::shift()|, returning
	|Path::shift(xx, yy, zz)| after shifting |center| explicitly.
	May have done this already in an earlier revision.

	* curves.web: Changes to |Plane_Curve::intersection_points()| and
	|@<Get coordinates and slope.@>|.  Made the former |virtual|.

2002-03-30  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* cweavedriver.web: Added formatting command for |bool|.

	* shapes.web, points.web, paths.web:
	Changed |clear_points()| to |clear()|.

	* points.web:
	Fixed |intersection_point()| so that it doesn't fail when one of the traces in a
	major plane is vertical.

	Got rid of the |const| pointers |x|, |y| and |z| in the definition of |class Point| and
	all of the places where they're used.

2002-03-28  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* theater.web: Added code for section between base and marquee.

	* rectangles.web:
	Added constructor and setting function that take four |Point|s as arguments.

	* shapes.web, paths.web:
	Changed |rotate_around()| so that it takes |const Point&|
	arguments.

	* points.web:
	Changed |rotate_around()| and |operator-()| so that they take |const Point&|
	arguments.

	* shapes.web:
	Made |Shape| a pure virtual class again.  This required minor changes to
	points.web and paths.web.

	* points.web:
	Made change to |rotate_around(Point& p0, Point& p1, real angle_degrees)|.
	The |Point| arguments used not to be references.  This was made necessary by
	my changing |Shape| back to a pure virtual class.

	* paths.web: Made minor change in
	|Point::rotate_around(const Path& p,  real angle_degrees)|.  It was made
	necessary by a change in |Point::rotate_around(Point&, Point&,  real angle_degrees)|
	which in turn was made necessary by making |Shape| a pure virtual class again.

	* pictures.web:
	Testing.  Changed |operator=()| so that it doesn't need an explicit |Shape*|.

	* theater.web: Backup version.
	About to try to make |Shape| a pure virtual class again.

	Added |beginfig()| and |endfig()| to io.web and using here to
	produce a second view (rotated), which is put onto the second page
	in persp.tex.

	* rectangles.web, polygons.web, persp.web: Backup version.
	About to try to make |Shape| a pure virtual class again.

	* persp.tex: Now inputting persp.2 as well.

	* io.web:
	Forgot to mention at the last check-in:  Added |beginfig()| and |endfig()|
	and sections |@<Declare I/O functions@>|
	and |@<|extern| variable declarations.@>|.

	* io.web, ellipses.web, curves.web, circles.web: Backup version.
	About to try to make |Shape| a pure virtual class again.

2002-03-26  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web: No significant changes.

	Worked on getting |Picture::clear()| to deallocate
	the storage that's allocated when making and copying |Picture|s, and succeeded,
	I believe.

	* theater.web:
	A few minor changes in the course of getting |Picture::clear()| to deallocate
	the storage that's allocated when making and copying |Picture|s.

	* shapes.web:
	Changed |Shape| so that it is no longer a pure virtual class.  I need pointers to
	|Shape| objects when I copy |Picture|s, so it can't be one anymore.
	Added dummy function definitions accordingly.

	Added |show()|, |get_copy()|, |is_on_free_store()|, and |clear_points()|.

	* pspglb.web: Added forward declaration of |Picture|.

	* pictures.web:
	Made |Picture| a |friend| of |Label|.  Necessary for accessing |Label.pt|.
	Deallocating |Label.pt| with |~Label()| in |Picture::clear()| didn't work,
	so I have to access it directly.  I don't believe this is a serious problem, since
	|Label|s only exist for use in rendering |Picture|s, anyway.

	Added |Label::get_copy()|.  Used when copying |Picture|s.

	Added copy constructor and assignment operator.  Was having problems because of the
	default copying mechanism, which is not good for objects containing pointers.

	Made changes to |clear()| and |render()| and had a very hard time getting this to
	work right.

	* paths.web:
	Added |get_copy()|, which allocates a new |Path*|, casts it to a |Shape*|,
	and returns the latter.

	Added |is_on_free_store()|.  I may not need this, in which case I should get rid of it.

	Added |clear_points()|.  It's needed because it's a |virtual| function in
	|Shape|.  I use it for getting rid of items in |Picture::clear()|.

	* points.web:
	The elements of |Pictures| are now deallocated properly.  Some of the functions
	are here, because they involve |Point|s, and |Point| is an incomplete type
	in pictures.web.

	Changed |show()| so that it corresponds to the virtual function in |Shape|.

	Added |get_copy()|, which allocates a new |Point*|, casts it to a |Shape*|,
	and returns the latter.

	Added |is_on_free_store()|.  I may not need this, in which case I should get rid of it.

	Added dummy function |clear_points()|.  It's needed because it's a |virtual| function in
	|Shape|.

	* shapes.web:
	About to change |Shape| to being a non-pure virtual function.  Saving this
	version in case it doesn't work out.

	* paths.web:
	Changed |new(Path)| to |create_new_path()| in drawing and filling functions.

	* pictures.web: Formatting changes.

	* pictures.web:
	Removed |vector<Shape*> elements| from the definition of |class Picture|.
	Instead, I've made it a local variable in |render()|.

	* pictures.web:
	Tried to get the destructor to call the destructors for the |Shape|s in the
	vectors |elements| and |shapes|, but I couldn't.  I've reverted from the test
	version, which I haven't saved.  I'm saving this version because the reverted version
	had |clear();| in the destructor.  I've gotten rid of that.  That is the only change.

	* cweavedriver.web: Added formatting instruction for |Label|.

	* pictures.web:
	Changed destructor so that it simply calls |clear()|.  This seems to solve the
	problem I was having.  Since |Picture|s don't directyl contain any
	elements that are allocated dynamically, it seems that I don't have to
	deallocate anything.  Must check on what really happens.

	* pictures.web: Added |labels.clear()| to |clear()|.

	* theater.web:
	Changed where I output the labels, because they can now be transformed along with
	the |Picture|.

	* shapes.web:
	Tried adding destructor to try to get |~Picture()| to work.
	So far, I've been unsuccessful.

	Added |virtual call_destructor() = 0;|, but commented it out.  This may be
	a possible solution.

	* rectangles.web:
	Added destructor.  Trying to get |~Picture()| to work, so far, unsuccessfully.

	* pspglb.web:
	Moved forward declarations of |Point| and |Path| to this file.

	* polygons.web:
	Added destructor.  Trying to get |~Picture()| to work, so far, unsuccessfully.

	* points.web:
	Added destructor.  Trying to get |~Picture()| to work, so far, unsuccessfully.

	Changed the way |label()| and |dotlabel()| work.  Changed |render()| and added
	|render(Transform t)| to correspond to this change.

	Changed |get_x()|, |get_y()|, etc. so that they take a |char| argument, indicating
	what set of coordinates to use.

	* paths.web, ellipses.web, curves.web, circles.web:
	Added destructor.  Trying to get |~Picture()| to work, so far, unsuccessfully.

	* pictures.web: Removed forward declaration of |Path| to pspglb.web.

	Added |class Label| definition.

	Added |vector<string> labels| to |class Picture| and changed the way
	labels are written.  They can now be transformed along with a |Picture|.

	Added destructor for |Picture|.  For some reason, deleting the elements of
	|shapes| doesn't work, while doing it for |elements| does.  Don't understand this.

	Got rid of |operator+=(string s)| and replaced it with |operator+=(Label* label)|.

	Changed the way |render()| outputs labels.

2002-03-25  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* theater.web:
	The code in this file now works.  I can now continue working on the drawing.

	* points.web:
	Changed the way |label()|, and |dotlabel()| work.  They no longer write
	directly to |out_stream|.  Instead, |string|s are written to
	|current_picture.labels| and they're output when the |Picture| is rendered.
	(It may be a different |Picture|, if |current_picture| is copied to another
	|Picture| and |current_picture| is subsequently cleared.)

	* pictures.web:
	Added |vector<string> labels| and changed the way labels are output.
	Now they're done while the |Picture| is rendered, after the |Shape|s.
	This prevents them from being overdrawn by the |Shape|s.  However, they
	can be overdrawn by |Shape|s in other |Picture|s.

	Added |operator+=(string s)| for adding elements to |labels|.

	Removed some commented-out code that was no longer needed.

	* persp.web:
	Removed most of testing code.  Currently using code in theater.web.

	* paths.web:
	Made |Circle| a |friend|, because |Circle::segment()| needs access to
	|connectors| and |points|.

	Changed the way |filldraw()|, |label()|, and |dotlabel()| work.

	* ellipses.web:
	Added |is_quadratic()|, |is_cubic()| and |is_quartic()|.
	used in |intersection_points()|.

	Changed name of |intersection_point()| to |intersection_points()|.

	Added |shift()| for |Ellipse|s, so that |center| is shifted, too.

	* cweavedriver.web: Minor formatting change.

	* curves.web:
	Moved |get_coefficients()| and |solve()| out of the section where
	|Plane_Curve| is defined.

	Added |is_quadratic()|, |is_cubic()| and |is_quartic()|.  |is_quadratic()| is
	used in |intersection_points()|.

	Changed name of |intersection_point()| to |intersection_points()|.

	* circles.web:
	Changed |segment()| so that it's possible to make closed segments that
	can be filled.  Changed |half()| and |quarter()| appropriately.

	* cmplprsp.web:
	Changed to account for the fact that theater.web now writes a header file.

	* 00TODO: Added items.

2002-03-24  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO:
	Added item.  Removed one or two things that have been taken care of.

	* 00LOG: Added item.

	* persp.web:
	Tested |Circle|s after changing them.  Now they're derived from |Ellipse|s.

	About to try compiling using theater.web again.

	* points.web: Changed |epsilon()| so that it's |const|.

	Changed |operator==()| so that the signs of the coordinates are calculated
	correctly.

	* ellipses.web:
	Changed |private| members to |protected|, in order to be able to derive
	|Circle| from |Ellipse|.

	Added error handling code for the case that an argument for |number_of_points| is
	not evenly divisible
	by 4.  This is needed in |intersection_point()| for aligning the |Ellipse| with main
	axes.

	Got rid of |get_diameter()|.  Wasn't using it, and it didn't seem to be coded
	properly.  If I need it, I can replace it.

	Added |get_axis_h()| and |get_axis_v()|.

	Added |angle_point()|.

	* cweavedriver.web:
	Added test_routines.web to the files that are processed.

	* curves.web:
	Changed |get_normal()| so that it returns a unit vector by default.

	Fixed a bug in |intersection_point()|.  |Point|s that were not on
	the segment were not set to |INVALID_POINT| in the coplanar case.

	In the skew case of |intersection_point()|, the value used for comparison
	(|Point::epsilon()|) was too small, so I've multiplied it by 10.  Noted position
	as a ``kludge''.

	* circles.web:
	Changed definition of |Circle|.  It is now derived from |Ellipse| rather
	that |Polygon|.  Tested |Plane_Curve::intersection_point()| on |Circle|s.

	Added |segment()|, which returns subpaths of the |Circle| using the |Point|s in the
	|vector points|, and derived |half()| and |quarter| from |segment()|.

	Got rid of |DEFAULT_SIDES|, since it's no longer needed.

	Got rid of |center|, because it's already a member of |Ellipse|.

	Changed |operator=()| and added a version that takes an |Ellipse| as its argument.

2002-03-21  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: Fixed |operator==()| (I hope).

	* curves.web:
	Finished testing |intersection_point()|.  Seems to be working properly.

	* persp.web:
	Added |test_ellipse_intersections().|  I should put it in a WEB file for
	test routines that shouldn't be recompiled each time, unless I'm using it.

2002-03-20  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web:
	Testing |Plane_Curve::intersection_point()|: Cases where curve is not parallel
	to a major plane.

	|operator==()| is not working. Must fix!!

	* persp.web, ellipses.web:
	Testing |Plane_Curve::intersection_point()|: Cases where curve is not parallel
	to a major plane.

	* curves.web:
	Testing cases where curve is not parallel to a major plane.

	* curves.web:
	Intermediate version.  |Plane_Curve::intersection_point()| can now handle the
	case of an intersection of a line skew to the plane of the curve.

	About to test whether lines parallel to the plane of the curve are handled properly.
	Then I will test whether curves in major planes other than the x-y plane are
	handled correctly.  Then I will code the routine for putting curves into the x-z plane,
	if they're not already in a major plane.

	* pspglb.web: Added |typedef pair<real, real> real_pair|.

	Added |struct real_triple|.  Originally, this was |typedef real[3] real_triple|,
	but it wasn't possible to use a |real_triple| defined in this way as the
	return value of a function.  Don't know why, but it caused a compiler error.  Made a
	note to look this up.

	* points.web: Added |typedef pair <Point, Point> point_pair|.

	Fixed |operator==()|.

	Changed error message in |slope()| to a warning, and commented it out.
	It applies to the case that the slope is undefined (i.e., for a vertical line).

	* ellipses.web:
	Intermediate version.  |Plane_Curve::intersection_point()| can now handle the
	cases 1) that the line and the curve are coplanar and 2) that the line is perpendicular
	to the plane in which the curve lies.  About to start on the case that they are skew.

	Added |get_coefficients()|.

	Fixed bug in |solve()|.

	* curves.web:
	Intermediate version.  |Plane_Curve::intersection_point()| can now handle the
	cases 1) that the line and the curve are coplanar and 2) that the line is perpendicular
	to the plane in which the curve lies.  About to start on the case that they are skew.

2002-03-19  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: Added items.

	* polygons.web:
	Changed |Closed_Plane_Curve| to |Plane_Curve|.  Did the same in other files,
	too, but didn't note it on check in.

	* points.web:
	Added declaration of |Point::draw(Point)|.  Must be defined in
	\filename{paths.web}, because it uses
	a |Path| internally, and |Path| is an incomplete type here.

	Noted bug in |operator==()|.  Must fix this!!

	* persp.web: Intermediate version.  Working on |intersection_point()|.

	* paths.web:
	Added |Point::draw(Point)|.  Must be defined here, because it uses
	a |Path| internally, and |Path| is an incomplete type in
	\filename{points.web}.

	* curves.web, ellipses.web:
	Intermediate version.  Working on |intersection_point()|.

2002-03-18  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* theater.web:
	Removed the code for drawing the theater building for Kafka's
	_Ein Hungerkuenstler_ from \filename{persp.web} and put it in
	this file.  This should make the program compile faster when testing and
	make the structure of the program easier to understand, since user code
	is now not mixed up with the code in |main()|.

	* polygons.web:
	|Polygon| is now derived from |Closed_Plane_Curve| rather than
	from |Path|.

	* points.web:
	Added optional argument to |unit_vector()| so that |*this| can
	be set to a unit vector without an additional assignment.

	Changed |operator==()| so that it performs rounding to .0001.

	* paths.web:
	Added default ``position'' arguments to |label()| and |dotlabel()|.

	* curves.web:
	Defined |class Closed_Plane_Curve|.  Started working on |intersection_point()|.
	It works so far.  Currently working on setting up the function for the
	various cases that can arise, with respect to orientation of the curve
	and the line to each other, i.e., whether they are coplanar, perpendicular,
	or skew.  If the curve already lies in a plane parallel to a major plane, then
	it's not rotated.

	* curves.web: Initial version.

	* curves.web: New file.

	* theater.web: Initial version.

	* theater.web: New file.

	* 00TODO: Added items, I think.

	* rectangles.web, polygons.web:
	Added curves.h and theater.h to the included files and reordered
	appropriately.

	* persp.web:
	Added curves.h and theater.h to the included files and reordered
	appropriately.
	About to remove the code for drawing the theater and put it in
	theater.web.

	* loader.h:
	Removed outline-regexp from local variable list so that I can
	input this file into cweavedriver.web.  Otherwise, the "@" character
	causes problems.

	* ellipses.web:
	Added curves.h and theater.h to the included files and reordered
	appropriately.

	* cweavedriver.web:
	Added loader.h, curves.web and theater.web.  Reordered to correspond
	to the new order of compilation.

	* cmplprsp.web: Added code for curves.web and theater.web.
	Increased value of |MAX_FLAGS| to 32.  Had a hard time tracing an error
	that resulted from adding files and using dependencies with values
	> MAX_FLAGS.

	* circles.web: Changed order of included header files.
	Minor formatting changes.

2002-03-14  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web, ellipses.web:
	Testing |Ellipse::is_on_ellipse()| and |Ellipse::intersection_point()|.

	* persp.web:
	This was revision 1.26.1.2.  Putting it back on the main branch.

	* ellipses.web:
	This was revision 1.29.1.2.  Putting it back on the main branch.

	* points.web:
	Made value of |epsilon()| smaller.  Changed |clean()| so that |epsilon()| can
	be multiplied by the argument |factor|.

	* persp.web:
	Essentially the same as last version, but with changes in formatting.  Perhaps
	other changes as well.  Checking in for freezing.

	* ellipses.web:
	Intermediate version.  Testing |intersection_point()|.  Checking in for freezing.

	* paths.web:
	In the declaration of |filldraw()|, I added "background" as the default
	for the argument |ffill_color|.

	* persp.web:
	In this version I've added the preprocessor directive |DO_THEATER| and cleaned up the
	code I'm using to test |Ellipse::intersection_point()|.  This is a branch, because
	in the last version, I removed some of the code for |@<Theater@>|, which I want to
	keep.  In this version I've commented-out most of the code for the ``Elliptical
	Windows'' section, and everything that follows it.  As I get it tested, I can comment
	it back in.

2002-03-13  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Working on |Ellipse::intersection_point()|.  Redoing elliptical windows.

	* ellipses.web:
	Working on |intersection_point()|, but having problems.  See earlier notes.

	* points.web: Added |clean()|.

	* ellipses.web:
	This version doesn't work.  Abandoning this branch and starting again
	with the last version that worked.

	* ellipses.web: Attempted _again_ to add code to |intersection_point()|
	that would check for an intersection point with a line that's _not_ in the same
	plane as the ellipse.  Again it didn't work, though, so I had to discard my
	additions.  There is at least one other minor change, so I'm checking in this
	version.  Must read up in Huw Jones, _Computer Graphics Through Key Mathematics_,
	how to do this with vectors.

	* points.web:
	Turned off an error message that was issued so frequently, that it became annoying.
	The error, if it is an error, doesn't seem to cause any problems.  It's in
	|angle()| and was issued when one or both points has 0 magnitude.  There is a
	comment at the place, so I'll be able to find it.  Now I return |INVALID_REAL|,
	but maybe I could just return 0.  Two places where |angle()| is called now account
	for this case.  I could check that the others do as well.  But as I've said, it
	doesn't seem to cause a problem.

	* ellipses.web:
	Minor change in debugging code.  Attempted to add code to |intersection_point()|
	that would check for an intersection point with a line that's _not_ in the same
	plane as the ellipse.  It didn't work, though, so I had to discard my additions.

	* ellipses.web:
	Intermediate version.  Added |is_on_ellipse()|.  About to add routine
	to |intersection_point()| that tests lines that don't lie in the same
	plane as the Ellipse.

	* ellipses.web:
	Made changes to |intersection_point()|.  It now only returns |Point|s that lie
	on the line segment.  I've also added exception handling.

	About to add routine for checking whether lines that aren't in the same plane intersect
	the ellipse.

	* points.web:
	Fixed bug in |set(real, real, real)|.  Don't know why it wasn't working, but
	changed it so it uses assignment, which is safer, anyway.

	Changed |label()| and |dotlabel()| so that they check whether a |Point| is equal to
	|INVALID_POINT| before doing anything.

	Added |is_on_segment()|.

	* loader.h:
	The Standard Library header files "exception" and "stdexcept" are now loaded.

	* pspglb.web: Added |solve_quadratic()|.  Formatting changes.
	|real_limits| and |INVALID_REAL| are needed in |solve_quadratic()|;
	therefore they are now in |@<Global variables@>|.  |real_limits| is written
	to \filename{pspglb.h} as an |extern| variable, but |INVALID_REAL| is
	|const|, so it's declaration must be written to \filename{pspglb.h}.

2002-03-12  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: Added items.

	* persp.web, ellipses.web:
	Made a few changes in the course of testing |intersection_point()|.

	* persp.web:
	Testing |Ellipse::intersection_point(Point pt0, Point pt1)|.

	* paths.web:
	Made changes to |align_with_axis()| with |Point| args: Now it
	multiplies |*this| by |t|.

	* ellipses.web:
	Fixed |Ellipse::intersection_point(Point pt0, Point pt1)|.  Now it works
	again.  Now it uses |align_with_axis()| and |slope()|.
	Must add routine for checking that the points returned really are on the line
	and the ellipse, and that the case is handled correctly, that one or both
	points do not lie on the line and the ellipse.  Must test that it works for
	slanted ellipses.

	* paths.web:
	Added second version of |align_with_axis()|.  It takes two |Point| arguments
	and the |char| argument for the axis.  It can be used, for example, with
	|Ellipse|s, if I pass as arguments the points on the |Ellipse| that
	I want aligned.

2002-03-11  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* ellipses.web:
	Intermediate version.  Working on |intersection_point()|.

	* points.web: Removed a little code for debugging output.

	* paths.web:
	Added |align_with_axis()|.  All I had to do was uncomment code I had commented-out.
	Not sure I need this function, but it might come in handy.

	* points.web: Changes to {\TeX} text.

	* paths.web:
	Added versions of |rotate_around()|.  One version is for |class Point|.  It must be
	defined here because it takes a |Path| argument and |Path| is an incomplete type in
	\filename{points.web}.  I've also redone |Path::rotate_around()| to make use of the
	fact that |Transform::rotate_around()| now exists.  That is, I no longer need to use
	a dummy |Point| in order to generate the transformation.  I have also added a |Path|
	version that takes a |Path| as an argument (it must be a line).

	Got rid of |align_with_z_axis()|.  It is obsolete since I've defined
	|Transform::align_with_axis()|.  I will program a version of |align_with_axis()|
	for |Path|s that are lines.

	* points.web:
	Added |Transform::rotate_around()| and |Point::rotate_around()|.

	* points.web:
	Forgot to mention in comment for last version, that I added |const| versions of |get_x()|,
	|get_y()|, etc.  Formatting changes in this version for these functions.
	In this version, I also added a |const| version of |operator==()|.

	* points.web:
	Added |slope()|.  It takes two |char| arguments for the coordinates in any of
	the meaningful combinations.

	* transform.web: Added |inverse()|.

	* shapes.web: Minor formatting change.

	* cweavedriver.web: No significant change.

	* transform.web: Intermediate version.  Working on |inverse()|.

	Added |INVALID_TRANSFORM|.  Added constructor that takes one real argument.  All elements
	of |matrix| are set to this argument.  Used this to construct |INVALID_TRANSFORM|.

	* ellipses.web:
	Intermediate version. Working on slope and intersection functions.
	Got rid of |history| and |revert|.  I will be able to use |align_with_axis()|
	to put an ellipse into the x-z plane with |center| at the origin, so I don't need
	to keep track of all the transformations that have been applied to an |Ellipse|, or
	an object in general.  Nor do I have to generate an inverse of each transformation,
	transformation, since I have to have a routine for generating an inverse anyway.  The
	reason is the following:  While it's easy to generate an inverse for a transformation of
	a known type, e.g., shift, shear, rotate, it's not possible to do so for transformations
	formed by using |operator*()| or |operator*=()|, except by using a routine for
	matrix inversion.

	* pspglb.web:
	Moved declarations of |real_limits|, |MAX_REAL|, |MAX_REAL_SQRT|,
	and |INVALID_REAL| to this file from \filename{points.web}.

	* points.web:
	Moved declarations of |real_limits|, |MAX_REAL|, |MAX_REAL_SQRT|,
	and |INVALID_REAL| to \filename{pspglb.web}.

	* paths.web:
	Intermediate version. Working on slope and intersection functions.

2002-03-10  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: Changes.

	* shapes.web:
	|rotate_around()| is no longer a member of |Shape|.  It was necessary to remove it,
	because of the problem of defining |Transform::rotate_around()| with |Point| arguments
	before |class Point| was completely defined.  I don't think this problem is solvable,
	but it doesn't really matter.  I'll just define |rotate_around()| for the classes
	for which it makes sense.

	* transform.web:
	Added |align_with_axis()|.  The declaration is in this file, but the definition is in
	\filename{points.web}.  This is explained in the files.
	I can use |align_with_axis()| in my replacement of |rotate_around()|.
	I can also use it to replace the code using |history| and |revert| in
	|Ellipse::intersection_point()|, since I can now use it to put |Ellipse|s in the
	x-z plane about the origin.

	* points.web:
	Added |align_with_axis()|.  I can use this to in my replacement of |rotate_around()|.
	I can also use it to replace the code using |history| and |revert| in
	|Ellipse::intersection_point()|, since I can now use it to put |Ellipse|s in the
	x-z plane about the origin.

2002-03-09  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Added |align_with_z_axis()| to \filename{paths.web} and put code here
	to test it.  Also testing |Point::intersection_point()| and
	|Ellipse::intersection_point()|.

	* points.web, ellipses.web:
	Added reminder to add error handling to |intersection_point()|.
	See the {\TeX} section before the function declaration.

	* points.web:
	Commented-out exception handling code in |angle()|, which doesn't work.
	Must find out why not.

	* paths.web: Added |align_with_z_axis()|.

2002-03-08  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web: Working on rectangles within the doors.

	* rectangles.web:
	Added setting function to correspond to the constructor with arguments:
	center, axis_h, axis_v, and angles of rotation.

	Minor formatting changes.

	* persp.web: Starting on rectangles inside doors.

	* cweavedriver.web: Not sure whether I made any changes.

	* paths.web:
	Got rid of redundant updating of |history| in the transformation routines.
	Noted necessity of writing a routine for matrix inversion so that I can
	update |revert|.

	* ellipses.web: Minor formatting change.

	* points.web:
	Added default argument "top" to |label()| and |dotlabel()|.

	* ellipses.web:
	Added exception handling in |intersection_point()|.  It can now cope with the case that
	the line falls on the z-axis, and therefore has no slope.  Both paths are rotated.

	Removed some debugging output.

	* persp.web:
	Got elliptical windows in base to work.  About to check on whether |history| and
	|revert| are updated correctly by transformations.

	* rectangles.web:
	Made |center| member of |class Rectangle|, i.e., it is no longer
	a member of |class Path|.

	Removed all references to |radius|, which does not apply to a rectangle.

	Renamed |axis_0| and |axis_1| to |axis_h| and |axis_v|, respectively.

	* polygons.web:
	Made |center| and |radius| members of |class Polygon|, i.e., they are no longer
	members of |class Path|.

	* points.web:
	Noted bug in |drawdot()|, which doesn't work at all at this time.

	* persp.web:
	Got |Ellipse::intersection_point()| to work.  Now working on getting the
	elliptical windows to work.

	* paths.web:
	Removed the class members |center| and |radius|.  They should be members
	of the classes that use them.

	Added |get_point()|.

	Changed |show()|. It doesn't work perfectly now, but at least the |Point|
	data that it shows is correct.

	Changed |intersection_point()| back to the way it was before.  I'll have to
	write special versions for the various derived classes, as for |Ellipse| (the
	only one I've done so far).

	* circles.web:
	Made |center| and |radius| members of |class Circle|, i.e., they are no longer
	members of |class Path|.
	Added setting function to correspond with the constructor with center,
	diameter, and angle arguments.
	Fixed minor formatting problems.

	* ellipses.web:
	Got |Ellipse::intersection_point()| with line argument to work.
	About to try fixing the case where slope cannot be calculated, because
	the x-coordinates of the two endpoints of the line are equal.  Will rotate the
	ellipse and the line.

	* ellipses.web:
	Added |Ellipse::intersection_point()|.  I may need separate versions for each
	type of object.

	* ellipses.web, persp.web:
	Got reversion to work in constructor.  Must make sure it works when further
	transformations are performed.

2002-03-07  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transform.web:
	Added |clean()|. Called in several places in this file.

	* rectangles.web, polygons.web, points.web: No significant change.

	* paths.web: Intermediate version.  Working on |intersection_point()|.

	* ellipses.web:
	Fixed constructor.  Now testing. Using |revert| is trickier than I thought.

	* circles.web: No significant change.

	* ellipses.web:
	Intermediate version.  Working on |intersection_point()|.
	About to change constructor so that it creates the ellipse in the
	x-z plane about the origin.

	* paths.web: Intermediate version.  Working on |intersection_point()|.

	* ellipses.web, points.web, persp.web, paths.web:
	Intermediate state.  Working on routine for finding intersection of
	an Ellipse with a line.

2002-03-06  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Commented-out code in order to get ellipses working.  Was successful, but
	haven't uncommented-out the code.  There's additional, untested code in
	ttemp.web. It must be added in carefully.

	* pspglb.web:
	Added global variable |DO_LABELS == false| for controlling whether labels should
	be printed or not.

	* paths.web:
	Changed |label()| and |dotlabel()| so that they do nothing when the
	global variable |DO_LABELS == false|.

	* ellipses.web:
	Fixed constructor (center, axis lengths, angles) so that it now works.  Had
	a terrible time with it and discovered a few bugs in other WEB files.

	* circles.web:
	Made a couple of changes to the constructor (center, diameter, angles).  There's
	a problem with |set()| when applied to a pointer to a |Point|.  When it's fixed,
	I could get rid of |temp_pt| in the constructor.

	* points.web:
	Added |get_x()|, |get_y()|, |get_z()| and |get_w()|.  Would like to get rid of
	|x|, |y|, |z|, and |w|, but they're used in too many routines.  Will have to
	proceed carefully.  The problem with them is that |apply_transform()| really needs
	to be called before they're useful.  The "|get|" functions can take care of this.

	Noted problem with |set()| when applied to pointers to |Point|s.  Haven't had a
	chance to find out what the problem is.

	Fixed bug in |shift()|.  Since it used multiplication, it didn't work when any of
	the |world_coordinates| are 0.

	Changed |label()| and |dotlabel()| so that they do nothing when the
	global variable |DO_LABELS == false|.

	* ellipses.web: The constructor in this version at least works.
	Still some problems to be ironed out, but I want to be able to reproduce this
	state.  Not quite sure why some things have to be the way they are.

2002-03-04  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: Changed value of |DEBUG| in |rotate_around()| in order to
	suppress messages.

	* points.web: Fixed bug in |rotate_around()|.

	* points.web: The final argument to |mediate()| is now 0.5 by default.

	* pictures.web: Added |clear()| and made minor changes to formatting.

	* ellipses.web:
	Now using default argument to |mediate()|, since it's always half-way where
	it's used in this file at present.

2002-03-01  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Added code for the theater.  Working pretty well now, even though I haven't
	started the second major revision.

	* points.web:
	Corrected the arguments in the declaration of |mediate()|, which were
	incorrect and didn't match the correct ones in the definition.

	* persp.tex:
	No significant changes.  Tried to get landscape to work, but it didn't.
	I think I either haven't set the paper sizes correctly, or there's a problem
	with the PostScript- or pdf-viewer.

	* persp.mp: No significant changes.

	* paths.web:
	Added |size()|, which returns the number of |Point*|s in |points|, and
	|subpath()|.

	* circles.web:
	Added |half()|.  First of the functions for extracting segments of |Circle|s.

	* transform.web:
	Reversed the direction of rotation about the y-axis, or axes parallel to it
	in |rotate()|.
	I'd already done so for the x-axis.
	May have to do the same thing for the z-axis, but I haven't gotten around to testing
	how it looks.

	* pspglb.web:
	For DEC Alpha:  Now, calculating PI with |4.0 * acos(1.0)|.
	This was necessary, because using the macro |__USE_STD_IOSTREAM| (needed for
	using \filename{sstream}) is incompatible
	with the use of the macro |__CXXL_PI| for |PI|. Asked Herr Heuer about this,
	because I find it annoying.  Maybe he'll be able to fix it.

	* pictures.web:
	Added |set_transform(Transform t)| and |operator*=(Transform t)|.
	This makes it possible to apply transformations to an entire |Picture|.
	For example, to apply a transformation |t| to |current_picture| I can say
	``|current_picture *= t|''  or ``|current_picture|.set_transform(t)|".
	The variant using |*=| multiplies the |current_picture.transform| by |t|,
	so it makes it possible to accumulate the effects of multiple transformations.
	|set_transform()|, on the other hand, resets |current_picture.transform| to |t|.

	* paths.web: Added |label()| and |dotlabel()| for |Path|s.
	Added setting functions to correspond to the constructors that take arguments.

	* loader.h:
	Now loading \filename{sstream} so that I can write datestamp to |out_stream|.
	This necessitated defining |__USE_STD_IOSTREAM|, which in turn caused problems
	with the macro PI (for DEC Alpha).  Now, PI is calculated with |4.0 * acos(1.0)|
	in \filename{pspglb.web}.

	* io.web: Now datestamp is written to |out_stream|.

2002-02-26  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* shapes.web, points.web, persp.web, paths.web, ellipses.web, pictures.web:
	Working on rendering.

	* shapes.web, rectangles.web, polygons.web, points.web, pictures.web, persp.web, paths.web, ellipses.web, circles.web:
	Started work on rendering using |extract_elements()|.

	* transform.web: No significant changes.

	* ellipses.web:
	Finished constructor with center, lengths, and angles of rotation.
	It only works for ellipses that are not too distorted by perspective.
	About to start second major revision.

2002-02-16  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* ellipses.web: Working on constructor with angle arguments.
	Added intersection function.

	* paths.web, points.web: Worked on intersection function.

	* cmplprsp.web:
	Entered an item in the ``TO DO'' list.  I should perform the same sort
	of test on the C code files as I do on the headers.  That way, I won't
	recompile if I've only changed comments or {\TeX} code.

	* points.web:
	Added |intersection_point()|. Tested it a bit, it seems to work okay.

2002-02-15  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* rectangles.web, polygons.web, points.web: No significant changes.

	* cmplprsp.web: Now compiling and linking everything.

	* ellipses.web: First revision. Having problems with intersection.

	* paths.web:
	Fixed the problem I was having before.  I found the answer on page 246
	of Stroustrup's _The C++ Programming Language_.  The problem was that I
	had no copy constructor, so memberwise copy was performed.  Since
	|points| contains pointers, this caused exactly the kind of problem
	Stroustrup warns against.  It was enough to fix this in paths.web,
	since the classes that derive from |Path| call |Path|'s
	copy constructor in the appropriate circumstances.  I wonder how the
	compiler knows to do this?

	* rectangles.web:
	Assignment wasn't working properly.  Found problem with
	syntax of assignment.  Problem occurs when a |Path| or an object of a
	class derived from |Path| is declared and assigned to in the same
	statement.  In this case, the new |Path| (or whatever) acts in a way
	similar to a pointer, and changes to the new object cause
	corresponding (and incorrect) changes to the object which was assigned
	from.

	Also, for |Path|s and derived classes:  Fixed the way destructors
	handle |point|s.  Note that |delete this| _never_ makes
	sense. Deallocation should always occur in the class that allocates
	space for something else.

	* transform.web:
	Added default arguments to |scale()| (1, since elements in
	|transform.matrix| are _multiplied_ by the arguments).

	* polygons.web: Assignment wasn't working properly.  Found problem with
	syntax of assignment.  Problem occurs when a |Path| or an object of a
	class derived from |Path| is declared and assigned to in the same
	statement.  In this case, the new |Path| (or whatever) acts in a way
	similar to a pointer, and changes to the new object cause
	corresponding (and incorrect) changes to the object which was assigned
	from.

	Also, for |Path|s and derived classes:  Fixed the way destructors
	handle |point|s.  Note that |delete this| _never_ makes
	sense. Deallocation should always occur in the class that allocates
	space for something else.

	* points.web:
	Added default arguments to |scale()| (1, since elements in
	|transform.matrix| are _multiplied_ by the arguments).

	* circles.web: Assignment wasn't working properly.  Found problem with
	syntax of assignment.  Problem occurs when a |Path| or an object of a
	class derived from |Path| is declared and assigned to in the same
	statement.  In this case, the new |Path| (or whatever) acts in a way
	similar to a pointer, and changes to the new object cause
	corresponding (and incorrect) changes to the object which was assigned
	from.

	Also, for |Path|s and derived classes:  Fixed the way destructors
	handle |point|s.  Note that |delete this| _never_ makes
	sense. Deallocation should always occur in the class that allocates
	space for something else.

	* paths.web:
	Various bug fixes.  Assignment wasn't working properly.  Found problem with
	syntax of assignment.  Problem occurs when a |Path| or an object of a
	class derived from |Path| is declared and assigned to in the same
	statement.  In this case, the new |Path| (or whatever) acts in a way
	similar to a pointer, and changes to the new object cause
	corresponding (and incorrect) changes to the object which was assigned
	from.

	Also, for |Path|s and derived classes:  Fixed the way destructors
	handle |point|s.  Note that |delete this| _never_ makes
	sense. Deallocation should always occur in the class that allocates
	space for something else.

	Added default arguments to |scale()| (1, since elements in
	|transform.matrix| are _multiplied_ by the arguments).

	Changed |show()|, so that lines aren't broken after the points.  It
	might be worthwhile to write a better |Point::show()| function so I
	don't have to extract the x-, y-, and z-values explicitly in
	|Path::show()|.

	* circles.web: Minor formatting change.

	* points.web: Added error handling code to |show()|.

	Added |operator==()| and |operator!=()|.

	* rectangles.web, circles.web:
	Got rid of references to |angle_x|, |angle_y|, and |angle_z|, which
	were formerly  data members of |class Polygon|. I've gotten rid of them.

	* polygons.web:
	Got rid of |angle_x|, |angle_y|, and |angle_z| as data members of
	|class Polygon|.

	* circles.web:
	In constructor where angles of rotation are given as arguments:
	Test in an additional place that the angle of rotation is non-zero
	before rotating.

	Minor changes in TeX text.

	* polygons.web:
	In constructor where angles of rotation are given as arguments:
	Test in an additional place that the angle of rotation is non-zero
	before rotating.

	* polygons.web:
	In constructor where angles of rotation are given as arguments:  Now I
	test for whether the angles are non-zero before rotating.

	* polygons.web:
	Made |private| members |protected|, because |Circle| is derived from
	|Polygon|.

	* circles.web: First major revision completed.

	* paths.web:
	Changed |private| members to |protected|, since I'm now deriving
	|Polygon| from |Path|.

	* polygons.web: Now deriving |Polygon| from |Path|.
	Removed drawing and rendering functions and the frameworks for the
	transformations.  Both of these types of functions are already available
	for |Path|s.

	About to define |Circle| and derive it from |Polygon|.

	* polygons.web:
	Added drawing and rendering functions. Also, frameworks for the
	transformations, which I haven't defined yet.
	In this version, |Polygon| contains a |Path| member.
	About to change: I'm going to try deriving |Polygon| from |Path|.

2002-02-14  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* polygons.web:
	Added constructor with center, diameter, and angles for rotating about
	axes parallel to the x-, y-, and z-axes.

	Next thing to do: add |render()|.

	* points.web: |apply_transform()| no longer calls |persp_transform()|.
	The latter must now be called explicitly. This is done in |show()|, |render()|,
	and |label()|.

	* paths.web:
	Added |push_point_ptr()| and |set_cycle| to make it possible to access
	|points| and |cycle_switch| from higher level |Shape|s.

	* polygons.web: First major revision.  Redoing constructor.

	* cmplprsp.web: Now compiling and linking polygons.web.

	* paths.web, transform.web, points.web, shapes.web:
	Got rid of |reflect_about()|.  It doesn't make sense in 3D.  Rotation does the
	trick.  Reflection must be in a plane, and I haven't defined planes yet.

	* transform.web:
	Removed the |static| variable |epsilon| and replaced it with an
	|inline| function |epsilon()|.

	* points.web:
	Removed the |static| variable |epsilon| and replaced it with an
	|inline| function |epsilon()|.

	Removed portions of |rotate_around()| and put them in named sections
	in order to be able to use them in other code, like |reflect_about()|.

	About to add additional transformations: |scale()|, |shear()|, |reflect()| and
	|reflect_about()|.

	* shapes.web:
	Fixed bug: |Point| arguments to |rotate_around()| and |reflect_about|
	are no longer const.
	They can't be, because |apply_transform()| must be applied to them.

	* transform.web: Fixed |is_identity()|.  Formatting changes.

	* points.web:
	Fixed bug: |Point| arguments to |shift()| and vector operations are no
	longer const.
	They can't be, because |apply_transform()| must be applied to them.

	Added |is_identity()| to |Point| and |Transform|. |apply_transform()|
	now tests whether |transform.matrix| is an identity matrix. If it is,
	it just returns instead of performing the matrix multiplication.

	Made changes to |operator+()|, |operator+=()|, |operator-()|, and
	|operator-=()|. They now use |shift()| instead of operating on the
	elements of |world_coordinates| directly.

	About to divide the code in |rotate_around()| into named sections, so
	I can use the parts in |reflect_about()| and possibly for generating
	shapes. The first part moves |Point|s to positions on the z-axis and
	the second part moves them back where they were. The action takes
	place in the middle, and can be something other than rotation, so I
	can reuse the code elsewhere if I take it out.

	* paths.web:
	Changed arguments to |rotate_around()| and |reflect_about()| because of changes
	to the definitions of the corresponding pure virtual functions in shapes.web.
	The |Point| arguments can no longer be |const|.

	Changed |is_line()| because |inline| functions must be defined in the |class|
	declaration.  Note that |is_line()| is not yet properly defined. Must write
	test for linearity of points in line and absence of connectors that would cause
	non-linearity.

2002-02-13  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* pspglb.web, pictures.web, transform.web: No significant changes.

	* paths.web: Formatting changes for cweave.

	* points.web:
	Fixed vector arithmetic functions: operator+() etc. Not sure why I was having
	a problem. x, y, and z were set properly, but for some reason apply_transform()
	didn't calculate the new values properly. Now I use a somewhat verbose construction
	in the versions without assignment (+, -, *, /) using the versions _with_ assignment.
	This works.

	* points.web:
	Added more vector functions. Also non-member multiplication with scalar,
	where scalar goes first. Had some problems getting it to work properly. Fixed
	the problems, but not sure why I had them.

	* points.web:
	Got rid of INVALID_X, INVALID_Y, and INVALID_Z,  and replaced them
	with INVALID_REAL.

	Added MAX_REAL and MAX_REAL_SQRT.

	Added magnitude(), angle(), and unit_vector().

	* points.web:
	Added first vector operations. About to add |magnitude|, |angle|, and
	|unit_vector| to |class Point|. These should all be 0 unless the |Point| was
	created by |cross_product()| or some other way, where it makes sense.

	* shapes.web: Changed |extract_paths()| to |extract_elements()|.

	Changed |: public shape| to |: protected Shape| in the class definitions
	in points.web and paths.web. Should be |protected| in all derived classes.

	Added |const static| variables for use in drawing, filling, undrawing, and
	unfilling commands.

	This compilation unit is now compiled and linked, since shapes.web now writes
	compilable C++ code. The corresponding change to cmplprsp.web has been made.

	* cmplprsp.web:
	Now compiling and linking shapes.web, since it now writes compilable code.
	Also, changed the numbering of |dependencies|, since I moved pictures.web to
	the position before points.web.

	* paths.web: Changed |extract_paths()| to |extract_elements()|.

	Changed |: public shape| to |: protected Shape| in the class definitions
	in points.web and paths.web. Should be |protected| in all derived classes.

	Changed |draw()| , |fill()|, etc. to use |const static| variables
	declared in shapes.web.

	* points.web: Changed |extract_paths()| to |extract_elements()|.

	Changed |: public shape| to |: protected Shape| in the class definitions
	in points.web and paths.web. Should be |protected| in all derived classes.

	Changed |draw()| to |drawdot()| and |undrawdot()|. Uses |const static| variables
	declared in shapes.web.

	* pictures.web:
	Changed |vector<Shape*> paths| to |vector<Shape*> elements|.

	Changed |: public shape| to |: protected Shape| in the class definitions
	in points.web and paths.web. Should be |protected| in all derived classes.

2002-02-11  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* 00TODO: Added items.

	* pictures.web:
	Not sure what I did since last revision. Working on rendering paths.

	* cmplprsp.web:
	No significant change, unless maybe I didn't check it in after adding
	pictures.web to the files that are compiled and linked.

	* paths.web:
	Replaced a general draw() function with draw(), fill(), filldraw(), and the
	``un''-variants. Fixed a bug in |create_new_path()|: |on_free_store| was set for
	|*this| and not for the new path that was created. Have now made
	|create_new_path()| |inline| and |static|.

	* paths.web:
	Added the possibility of using draw, fill, filldraw, undraw,
	unfill, and unfilldraw using withcolor, dashed, and withpen.
	In order to make this work, also added |operator=()| for |Path|s,
	|create_new_path()|, and modified |~Path()|. Next thing to do is to
	write explicit functions for fill, filldraw, etc. instead of having everything
	in |draw()| with too many arguments.

	* shapes.web:
	Added extract_paths() as pure virtual function. Removed draw(), added render().

	* points.web:
	Now draw() just puts objects (|Shapes|) onto |current_picture.shapes|
	for future rendering. About to add options for options.

	* paths.web:
	Now draw() just puts objects (|Shapes|) onto |current_picture.shapes|
	for future rendering. About to add options for filling and color.

	* pictures.web:
	First real version. Now draw() just puts objects (|Shapes|) onto
	|current_picture.shapes| for future rendering.

	* cmplprsp.web: Now compiling and linking pictures.web.

	* points.web:
	Added |epsilon| for testing whether the magnitude of values is too small.
	Changed apply_transform() to do this checking.
	Added note about adding additional version of |apply_transform()| that takes
	a |Transform| as an argument.
	Changed the way rotate_around returns the Transform value.

	* paths.web: Added reflect_about.

	* cmplprsp.web: Added item in TO DO list.

	* transform.web:
	Added typedef real Matrix[4][4] in pspglb.web. I believe this is only used
	in this compilation unit.

	Working on transformations for Paths.

	* points.web:
	Added a version of show() for use in Path::show() (and maybe elsewhere).
	Working on transformations for Paths.

	* paths.web: Added show(), rotate(). Working on transformations.

	* pspglb.web:
	Added typedef real Matrix[4][4], but only in the part that's written
	to pspglb.h. If I need to define global variables of type Matrix in
	this compilation unit, I'll have to put the typedef declaration into
	a part that's compiled.

	* paths.web, transform.web, points.web:
	Got shift to work with paths. Starting on rotate().

	* points.web, transform.web:
	Got rid of identity_switch. Must write is_identity() to test whether
	a matrix is an identity matrix.

2002-02-10  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web, points.web, transform.web: Testing.

	* paths.web: Problems. Can't get shift to work.

	* loader.h:
	Got rid of #include <varargs.h>. Maybe this will help me to get
	variable length argument lists to work again.

	* persp.web, loader.h, cweavedriver.web, paths.web:
	Checking in in order to check out an old version. Testing variable
	length arguments.

	* cmplprsp.web: Compiling and linking up to paths.web.

	* paths.web:
	First major revision. Have virtually started over. Only one constructor
	implemented so far. It takes two Points as arguments and makes a line.
	draw() is implemented, I hope properly. Transformations are declared and
	have dummy declarations, but not really defined.

	Points are allocated with create_new_point() and put onto
	vector<Point*> points. The destructor ~Path() deallocates them.

	Paths are no longer numbered, nor are numbered points put into |points|.

	* points.web:
	Added operator<<() for Points. Changed show() so that it shows the
	x- and y-coordinates in the perspective transformation. There's a way of
	making it possible to use "cout << <Point>;"; I have to declare a pointer
	to an ostream_withassign and point it at cout, or something similar. I
	have this somewhere in an old revision, but for now I've just output the
	values explicitly, together with the braces, measurement_units, commata
	etc.

	Added constant pointers to the perspective coordinates:
	const real* x_persp;
	const real* y_persp;
	const real* z_persp;
	const real* w_persp;

	Added dummy declarations/definitions for scale, shear, etc., which I've
	added to Shape as pure virtual functions.

	* transform.web: Removed a debugging message.

	* persp.tex:
	Changed \vskip2cm to \vss for the bottom part of the \vbox. Necessary
	because of change to size of bounding box, done in persp.mp.

	* persp.mp:
	Made bounding box larger. Using btex ... etex for the labels now,
	because spaces within quotes come out funny: Instead of a space, there's
	some sort of tick mark.

	* transform.web:
	Added a comment. Otherwise, no changes since last revision.

	* shapes.web: Added reflect(), scale(), shear(), and reflect_about()
	functions as pure virtual functions to class Shape.

	* points.web:
	Added place-holder declarations and definitions for reflect(), scale(),
	shear(), and reflect_about(). This was necessary, because I've added these
	functions as pure virtual functions to class Shape.

	* transform.web:
	Changed "unity" to "identity" with respect to transformations.
	Forgot to mention this when checking in last time. No changes since last
	revision.

	* points.web:
	Changed "unity" to "identity" with respect to transformations.
	Changed rotate() so that it returns a Transform. This way, I can apply it
	to other objects.

	* transform.web:
	Fixed rotate() so it returns a transformation that can be applied to
	other objects. Will test this when I've defined Paths.

2002-02-09  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: Fixing transformations.

	* persp.web: Testing.

	* transform.web: Working on fixing rotate().

	* transform.web: Fixed shift().

	* transform.web:
	Fixed rotate_around. Renamed transformed() to operator*=() again.
	Had problems with multiplication not taking place because of unity_switch
	not being set to false appropriately. Watch out for this!

	The next thing to do is to get the transformation functions to return
	Transforms that can be applied to other objects. Will check in this version
	before I do it, though, to prevent it from getting fouled up.

	* transform.web:
	Working on revising rotate_around(). Have to check in in order to
	get an old version out to see how transformed(Transform&) worked.

	* transform.web:
	Tried to change so that shift() and rotate() return Transforms
	representing the transformations, so that they can be applied to other
	objects (as in last log entry). However, it doesn't work the way it
	should. I think perhaps there's something about matrices I haven't
	understood. Must review the books I have. Also, operator*=() doesn't
	seem to work. Reverted to previous state.

	* transform.web:
	Changed shift() so that it returns the shift matrix, not *this. This
	way, the transformation can be applied to additional points (or whatever).

2002-02-08  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: No change, just inserted /* START HERE. */.

	* loader.h:
	No longer loading superfluous header files: String.h and psptypes.h
	(the latter doesn't exist anymore).
	Loads valarray now, too.

	* transform.web: Added user_transform. A few other minor changes.

	* pspglb.web: Added extern valarray<real> null_coordinates.
	Got rid of extern unsigned short NO_ID.

	* procfile.web:
	Added argument "do_not_compile" for files that don't write compilable
	C++ code (currently only shapes.web).

	* persp.web: Minor changes for testing. Now testing points.

	* cweavedriver.web: Minor changes.

	* shapes.web:
	Added pure virtual functions. Changed, so this file only writes shapes.h.
	Also, cmpl also doesn't compile shapes.c. If I change this, I'll have to
	make the corresponding changes to cmplprsp.web.

	* cmplprsp.web:
	Now compiling and linking points.  Made it so I can skip compiling files
	that only write headers and contain no C++ code.  Currently, this only
	applies to shapes.web.  Added an argument for this purpose to
	process_file().

	* 00LOOK_UP: Added an item.

	* points.web:
	First major revision. Cleared garbage out of the class definition.
	Fixed the constructors. About to start revising the transformation functions.

	* transform.web: Added note in "To Do": Add shear!

	* cmplprsp.web: Changed, so that I compile and link shapes.web.

	* transform.web: Added an outline heading at the end.

	* transform.web: First revision.

	Added unity_switch and is_unity().

	Removed rotate_x(),
	rotate_y(), and rotate_z(). Replaced them with rotate() with arguments for
	rotation about the x-, y-, and z-axis.

	Renamed transformed(Transform) to operator*=(Transform) and set(Transform)
	to operator*=(Transform).

	Added outline headings.

	* transform.web:
	Eliminated rotate_x(), rotate_y() and rotate_z() in favor of rotate() with
	arguments for rotation about the x-, y-, and z-axes.

2002-02-07  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* transform.web:
	Testing for <value> > epsilon in shift() and the rotation functions.
	Got rid of cleanup(). Next thing to do: Put rotation functions together into
	one.

	* bibliography.tex: Added text.

	* points.web, paths.web: Added comments.

	* 00QUESTIONS: Added items.

	* pictures.web: Initial version. Doesn't do anything yet.

	* pictures.web: New file.

	* cmplprsp.web:
	Added pictures.web. Changed, so I can test up to transforms. Later
	files not compiled. If WEB and C files are same age, I assume the WEB file
	is up to date. This can happen when files are checked out of the archive.

	* 00README: Added items.

	* pspglb.web: PI is now conditionally defined for the DEC C++ compiler.

	* persp.web:
	Commented-out things that don't apply to transforms. Currently only testing
	transforms.

	* 00TODO, 00NOTES, 00LOOK_UP: Added items.

	* transform.web:
	Started revising. Got rid of cleanup() and some other functions. Got rid of
	public member variables.

	* 3D4MP.macs:
	Changed \<#1> so that it uses angle braces (which was my original intention).

	* 3D4MP.macs: Added \def\<#1>{$\lbrace${\it #1\/}$\rbrace$}.

	* cmplprsp.web:
	Changed when of pictures.web is compiled. Now it's after paths.web.

	* procfile.web:
	Changed, so that tangling and compilation are not done if the WEB file
	and the .c file are the same age. The same thing applies if loader.h and
	pp are the same age. This can happen when the files are checked out of the
	archive, so I assume they're up to date.

	* cmplprsp.web:
	Changed, so that tangling and compilation are not done if the WEB file
	and the .c file are the same age. The same thing applies if loader.h and
	pp are the same age. This can happen when the files are checked out of the
	archive, so I assume they're up to date.

	Added a source file, pictures.web. The section where I added it is currently
	commented out, so I'll have to check that I've done it properly. However, it
	wasn't anything complicated, so I hope it works. If it doesn't, it shouldn't
	be hard to fix.

	* bibliography.macs:
	Initial version. Contains macros for the TeX file bibliography.tex.

	* bibliography.macs: New file.

	* bibliography.tex:
	Initial version. Contains annotated bibliography of the books, articles, etc.
	that I'm using for 3D4MP.

	* bibliography.tex: New file.

2002-02-04  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* persp.web:
	Got rid of boolean argument to focus(), since output should
	be automated.

	* points.web:
	Got rid of boolean argument to set() and constructors, since output should
	be automated.

	* 00README, 00LOG: Added some items.

	* listing.tex:
	Initial version. Used for printing out my various "00*" files.

	* listing.tex: New file.

	* 00TODO: Added some items.

	* persp.macs: Initial version.

	* persp.macs: New file.

	* 3D4MP.macs: Initial version.

	* 3D4MP.macs: New file.

	* transform.web:
	Minor change: Moved formatting command for Transform to this file.

	* paths.web:
	Minor change: Moved formatting command for Path to this file.

	* polygons.web:
	Minor change: Moved formatting command for Polygon to this file.

	* circles.web:
	Minor change: Moved formatting command for Circle to this file.

	* rectangles.web:
	Minor change: Moved formatting command for Rectangle to this file.

	* ellipses.web:
	Minor change: Moved formatting command for Ellipse to this file.

	* 00NOTES: Added some items.

	* points.web:
	Starting first major revision. Commented out most of operator << because
	it no longer works. So far, haven't made any significant changes. Still
	going through my notes and typing them into various files.

	* cmplprsp.web:
	Made it easier to comment out files for compilation and linking. It would
	be nice to be able to do this by reading in an ASCII file. Program this
	sometime.

	* pspglb.web: No major changes.

	* 00QUESTIONS: Added some items.

	* io.web:
	Added initialize_io() and write_footer_to_out_stream in order to get these
	actions out of persp.web.

	* persp.web:
	In process of first major revision. This version still compiles. About to
	make more radical changes.

	* 00LOOK_UP: Added items.

	* 00LOG: No significant changes.

	* 00QUESTIONS: Initial version.

	* 00QUESTIONS: New file.

	* 00NOTES: Initial version.

	* 00NOTES: New file.

	* 00LOOK_UP: Initial version.

	* 00LOOK_UP: New file.

	* 00LOG: Initial version.

	* 00LOG: New file.

	* 00README: Initial version.

	* 00README: New file.

	* cmplprsp.web:
	Added system_string, so that I can change what's compiled and linked more
	easily. Have made a note that I should make it possible for cmplprsp.web to
	read in a file that contains file names in order to do this.

	* 00TODO: Initial version.

	* 00TODO: New file.

2002-02-01  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* cmplprsp.web: Now only the files I'm working on are linked.
	Also, fixed a bug that caused file_age() to fail sometimes: If the WEB file
	and the C-file are the same age, it didn't work, because I had a "<" where a
	"==" belonged.

	* points.web:
	Forgot to mention: Changed origin and INVALID_POINT to const.

	* persp.web, points.web:
	Started revising. Really need to look at the print-out, though.

	* persp.web: No change.

	* persp.web: Testing.

	* cmplprsp.web, procfile.web:
	Currently, only processing up to points and then persp.

	* shapes.web:
	No significant changes. Must add virtual functions and add vector or
	valarray of Shapes for use in changing view coordinates and hiding surfaces.

	* points.web:
	Changed String to string. About to start modifying basic operations.

	* persp.web: Testing basic Point functions only.

	* persp.tex:
	Copied code from ~/metafont/metapost/kafka/hunger for formatting.

	* persp.mp: Testing basic Point functions only.

	* loader.h: No significant change.

	* cmplprsp.web:
	Currently only the files up to points.web are compiled, and then
	persp.web.

	* cweavedriver.web:
	This file now \inputs 3D4MP.macs instead of persp.macs. Using persp.macs
	for persp.tex instead.

	* shapes.web, loader.h, cweavedriver.web, pspglb.web, persp.web, circles.web, polygons.web:
	Checking back in in order to make a named configuration. No significant changes since last one.

	* procfile.web: Removed extra Local Variables list.

	* cmplprsp.web: I think this is working now.

	* procfile.web: Put the function check_header_file() into this file.

	* procfile.web: Included in cmplprsp.web.

	* procfile.web: New file.

2002-01-31  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* cmplprsp.web:
	Zwischenversion (what is this in English?). About to add routine for comparing the old and new header files.

	* rectangles.web:
	Removed #include "polygons.h" and #include "circles.h", since Rectangles
	don't need to know about Polygons and Circles.

	* ellipses.web:
	Removed #include "polygons.h", since Ellipses don't need to know about polygons.

	* ellipses.web, rectangles.web, circles.web, polygons.web, paths.web, points.web:
	Added #include "shapes.h". shapes.web currently is just a bare framework; it doesn't do anything yet.

	* shapes.web: Initial version. Just a bare framework, so far.

	* shapes.web: New file.

	* cmplprsp.web:
	Zwischenversion (what's the English expression for this?). It still compiles.

2002-01-28  Laurence Finston  <lfinsto1@gwdg-wb01.gwdg.de>

	* points.web: Changed outline-regexp and added a few headings.

	* transform.web, rectangles.web, pspglb.web, polygons.web, points.web, persp.web, persp.tex, persp.mp, paths.web, loader.h, io.web, ellipses.web, cwebmac.tex, cweavedriver.web, cmplprsp.web:
	Added version control header.

	* circles.web:
	Testing version control header to see if ctangle and cweave can cope with it.

	* persp.mp, persp.tex, cwebmac.tex, loader.h, transform.web, rectangles.web, pspglb.web, polygons.web, points.web, persp.web, paths.web, io.web, ellipses.web, cweavedriver.web, cmplprsp.web, circles.web:
	New file.

