diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/epix/doc |
Initial commit
Diffstat (limited to 'graphics/epix/doc')
59 files changed, 17739 insertions, 0 deletions
diff --git a/graphics/epix/doc/Makefile.am b/graphics/epix/doc/Makefile.am new file mode 100644 index 0000000000..ec9ac95e5f --- /dev/null +++ b/graphics/epix/doc/Makefile.am @@ -0,0 +1,45 @@ +# Makefile.am for ePiX v1.x "doc" directory +# + +EPIXFLAGS = --no-defaults -I.. -L.. -lepix -v + +%.eepic: %.xp + ../epix-local $(EPIXFLAGS) $< + +XPS := $(wildcard *.xp) + +EEPICS = $(XPS:.xp=.eepic) + +CLEANFILES = *~ *.aux *.dvi *.log *.out *.idx *.ilg *.ind *.toc \ + epix.info.bz2 manual_src.tar manual.pdf manual.ps \ + manual_src.tar.gz manual.pdf.gz manual.ps.gz manual-stamp + +MAINTAINERCLEANFILES = *.eepic *.aux *.dvi *.log *.out *.toc *.idx *.ind *.ilg + +## Targets ## +doc_DATA = manual.pdf.gz manual.ps.gz manual_src.tar.gz epix.info.bz2 + + +# tar up tex, xp, and eepic files; build ps, pdf +manual-stamp: manual.tex $(XPS) $(EEPICS) + latex -interaction=batchmode manual &>/dev/null + latex -interaction=batchmode manual &>/dev/null + makeindex manual.idx &>/dev/null + ../laps-local --pdf manual.tex + touch manual-stamp + +manual_src.tar.gz: manual-stamp + tar -cf manual_src.tar manual.aux manual.ind manual.tex manual.toc \ + $(XPS) $(EEPICS) + gzip -9 manual_src.tar + +#PS +manual.ps.gz: manual-stamp + gzip -9 -c manual.ps > manual.ps.gz + +#PDF +manual.pdf.gz: manual-stamp + gzip -9 -c manual.pdf > manual.pdf.gz + +epix.info.bz2: manual-stamp epix.info + bzip2 -fk epix.info diff --git a/graphics/epix/doc/Makefile.in b/graphics/epix/doc/Makefile.in new file mode 100644 index 0000000000..293c547251 --- /dev/null +++ b/graphics/epix/doc/Makefile.in @@ -0,0 +1,364 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Makefile.am for ePiX v1.x "doc" directory +# + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +subdir = doc +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(docdir)" +docDATA_INSTALL = $(INSTALL_DATA) +DATA = $(doc_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BASH_PATH = @BASH_PATH@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_EPIX_EL_FALSE = @ENABLE_EPIX_EL_FALSE@ +ENABLE_EPIX_EL_TRUE = @ENABLE_EPIX_EL_TRUE@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +RUNTIME_COMPILER = @RUNTIME_COMPILER@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EPIXFLAGS = --no-defaults -I.. -L.. -lepix -v +XPS := $(wildcard *.xp) +EEPICS = $(XPS:.xp=.eepic) +CLEANFILES = *~ *.aux *.dvi *.log *.out *.idx *.ilg *.ind *.toc \ + epix.info.bz2 manual_src.tar manual.pdf manual.ps \ + manual_src.tar.gz manual.pdf.gz manual.ps.gz manual-stamp + +MAINTAINERCLEANFILES = *.eepic *.aux *.dvi *.log *.out *.toc *.idx *.ind *.ilg +doc_DATA = manual.pdf.gz manual.ps.gz manual_src.tar.gz epix.info.bz2 +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-docDATA: $(doc_DATA) + @$(NORMAL_INSTALL) + test -z "$(docdir)" || $(mkdir_p) "$(DESTDIR)$(docdir)" + @list='$(doc_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f=$(am__strip_dir) \ + echo " $(docDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(docdir)/$$f'"; \ + $(docDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(docdir)/$$f"; \ + done + +uninstall-docDATA: + @$(NORMAL_UNINSTALL) + @list='$(doc_DATA)'; for p in $$list; do \ + f=$(am__strip_dir) \ + echo " rm -f '$(DESTDIR)$(docdir)/$$f'"; \ + rm -f "$(DESTDIR)$(docdir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(docdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-docDATA + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-docDATA uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-docDATA install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ + pdf-am ps ps-am uninstall uninstall-am uninstall-docDATA \ + uninstall-info-am + + +%.eepic: %.xp + ../epix-local $(EPIXFLAGS) $< + +# tar up tex, xp, and eepic files; build ps, pdf +manual-stamp: manual.tex $(XPS) $(EEPICS) + latex -interaction=batchmode manual &>/dev/null + latex -interaction=batchmode manual &>/dev/null + makeindex manual.idx &>/dev/null + ../laps-local --pdf manual.tex + touch manual-stamp + +manual_src.tar.gz: manual-stamp + tar -cf manual_src.tar manual.aux manual.ind manual.tex manual.toc \ + $(XPS) $(EEPICS) + gzip -9 manual_src.tar + +#PS +manual.ps.gz: manual-stamp + gzip -9 -c manual.ps > manual.ps.gz + +#PDF +manual.pdf.gz: manual-stamp + gzip -9 -c manual.pdf > manual.pdf.gz + +epix.info.bz2: manual-stamp epix.info + bzip2 -fk epix.info +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/graphics/epix/doc/alignment.eepic b/graphics/epix/doc/alignment.eepic new file mode 100644 index 0000000000..1c5d93bd48 --- /dev/null +++ b/graphics/epix/doc/alignment.eepic @@ -0,0 +1,19 @@ +%% Generated from alignment.xp on Fri Jan 7 14:18:43 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [-1,1] x [-1,1] +%% Actual size: 72pt x 24pt +%% Figure offset: right by 0pt, up by 0pt +%% +\setlength{\unitlength}{1pt} +\begin{picture}(72,24)(-0,-0) +%% --- +\path(0.00140226,12)(12.001,12)(24.0006,12)(36.0002,12)(47.9998,12) + (59.9994,12)(71.999,12) +\path(36,0.00046742)(36,12.0001)(36,23.9997) +\put(36,12){\makebox(0,0)[bl]{\texttt{[tr]}}} +\put(36,12){\makebox(0,0)[c]{{\circle*{3}}}} +\put(36,12){\makebox(0,0)[br]{\texttt{[tl]}}} +\put(36,12){\makebox(0,0)[tl]{\texttt{[br]}}} +\put(36,12){\makebox(0,0)[tr]{\texttt{[bl]}}} +\end{picture} diff --git a/graphics/epix/doc/alignment.xp b/graphics/epix/doc/alignment.xp new file mode 100644 index 0000000000..e6bfc3c298 --- /dev/null +++ b/graphics/epix/doc/alignment.xp @@ -0,0 +1,26 @@ +/* -*-ePiX-*- */ +/* alignment.c -- ePiX's reverse-LaTeX label alignment option */ +#include "epix.h" +using namespace ePiX; + +P O(0,0); + +int main() +{ + bounding_box(P(-1,-1), P(1,1)); + picture(P(72,24)); + unitlength("1pt"); + + begin(); + + Line(O, E_1); + Line(O, E_2); + + font_face("tt"); + dot(O, P(0,0), "[tr]", tr); + label(O, P(0,0), "[tl]", tl); + label(O, P(0,0), "[br]", br); + label(O, P(0,0), "[bl]", bl); + + end(); +} diff --git a/graphics/epix/doc/alignment_lr.eepic b/graphics/epix/doc/alignment_lr.eepic new file mode 100644 index 0000000000..111098caf3 --- /dev/null +++ b/graphics/epix/doc/alignment_lr.eepic @@ -0,0 +1,17 @@ +%% Generated from alignment_lr.xp on Fri Jan 7 14:18:31 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [-1,1] x [-1,1] +%% Actual size: 72pt x 24pt +%% Figure offset: right by 0pt, up by 0pt +%% +\setlength{\unitlength}{1pt} +\begin{picture}(72,24)(-0,-0) +%% --- +\put(0,12){\makebox(0,0)[r]{\texttt{[l]}}} +\put(0,12){\makebox(0,0)[c]{{\circle*{3}}}} +\put(0,12){\makebox(0,0)[l]{\texttt{[r]}}} +\put(72,12){\makebox(0,0)[b]{\texttt{[t]}}} +\put(72,12){\makebox(0,0)[c]{{\circle*{3}}}} +\put(72,12){\makebox(0,0)[t]{\texttt{[b]}}} +\end{picture} diff --git a/graphics/epix/doc/alignment_lr.xp b/graphics/epix/doc/alignment_lr.xp new file mode 100644 index 0000000000..a6871278e3 --- /dev/null +++ b/graphics/epix/doc/alignment_lr.xp @@ -0,0 +1,24 @@ +/* -*-ePiX-*- */ +/* alignment_lr.c -- ePiX's reverse-LaTeX label alignment option */ +#include "epix.h" +using namespace ePiX; + +P p1(-1,0), p2(1,0); + +int main() +{ + bounding_box(P(-1,-1), P(1,1)); + picture(P(72,24)); + unitlength("1pt"); + + begin(); + + font_face("tt"); + dot(p1, P(0,0), "[l]", l); + label(p1, P(0,0), "[r]", r); + + dot(p2, P(0,0), "[t]", t); + label(p2, P(0,0), "[b]", b); + + end(); +} diff --git a/graphics/epix/doc/arrow.eepic b/graphics/epix/doc/arrow.eepic new file mode 100644 index 0000000000..98adf21b49 --- /dev/null +++ b/graphics/epix/doc/arrow.eepic @@ -0,0 +1,22 @@ +%% Generated from arrows.xp on Mon Jul 2 20:38:11 EDT 2007 by +%% ePiX-1.1.6 +%% +%% Cartesian bounding box: [-2,2] x [-1,1] +%% Actual size: 24 x 12pt +%% Figure offset: left by 0pt, down by 0pt +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0} +\setlength{\unitlength}{1pt} +\begin{picture}(24,12)(-0,-0) +\path(0,6)(24,6) +%% +\path(17.8125,4.875)(15.75,4.875) +\path(19.875,5.25)(15.75,5.25) +\path(21.9375,5.625)(15.75,5.625) +\path(24,6)(15.75,6) +\path(21.9375,6.375)(15.75,6.375) +\path(19.875,6.75)(15.75,6.75) +\path(17.8125,7.125)(15.75,7.125) +\path(15.75,6)(15.75,4.5)(24,6)(15.75,7.5)(15.75,6) +%% +\end{picture} diff --git a/graphics/epix/doc/arrow.xp b/graphics/epix/doc/arrow.xp new file mode 100644 index 0000000000..34c47ad5e0 --- /dev/null +++ b/graphics/epix/doc/arrow.xp @@ -0,0 +1,18 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + picture(P(-2,-1),P(2,1), "24x12pt"); + + begin(); +#ifdef CAMBER25 + arrow_camber(0.25); +#elif CAMBER50 + arrow_camber(0.5); +#endif + + arrow(P(xmin(),0), P(xmax(),0)); + end(); +} diff --git a/graphics/epix/doc/arrow25.eepic b/graphics/epix/doc/arrow25.eepic new file mode 100644 index 0000000000..196889e2b2 --- /dev/null +++ b/graphics/epix/doc/arrow25.eepic @@ -0,0 +1,22 @@ +%% Generated from arrows.xp on Mon Jul 2 20:38:23 EDT 2007 by +%% ePiX-1.1.6 +%% +%% Cartesian bounding box: [-2,2] x [-1,1] +%% Actual size: 24 x 12pt +%% Figure offset: left by 0pt, down by 0pt +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0} +\setlength{\unitlength}{1pt} +\begin{picture}(24,12)(-0,-0) +\path(0,6)(24,6) +%% +\path(17.8125,4.875)(16.2656,4.875) +\path(19.875,5.25)(16.7813,5.25) +\path(21.9375,5.625)(17.2969,5.625) +\path(24,6)(17.8125,6) +\path(21.9375,6.375)(17.2969,6.375) +\path(19.875,6.75)(16.7813,6.75) +\path(17.8125,7.125)(16.2656,7.125) +\path(17.8125,6)(15.75,4.5)(24,6)(15.75,7.5)(17.8125,6) +%% +\end{picture} diff --git a/graphics/epix/doc/arrow50.eepic b/graphics/epix/doc/arrow50.eepic new file mode 100644 index 0000000000..e22fec0fd0 --- /dev/null +++ b/graphics/epix/doc/arrow50.eepic @@ -0,0 +1,22 @@ +%% Generated from arrows.xp on Mon Jul 2 20:38:34 EDT 2007 by +%% ePiX-1.1.6 +%% +%% Cartesian bounding box: [-2,2] x [-1,1] +%% Actual size: 24 x 12pt +%% Figure offset: left by 0pt, down by 0pt +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0} +\setlength{\unitlength}{1pt} +\begin{picture}(24,12)(-0,-0) +\path(0,6)(24,6) +%% +\path(17.8125,4.875)(16.7813,4.875) +\path(19.875,5.25)(17.8125,5.25) +\path(21.9375,5.625)(18.8438,5.625) +\path(24,6)(19.875,6) +\path(21.9375,6.375)(18.8438,6.375) +\path(19.875,6.75)(17.8125,6.75) +\path(17.8125,7.125)(16.7813,7.125) +\path(19.875,6)(15.75,4.5)(24,6)(15.75,7.5)(19.875,6) +%% +\end{picture} diff --git a/graphics/epix/doc/basepoint.eepic b/graphics/epix/doc/basepoint.eepic new file mode 100644 index 0000000000..efd76dfaa5 --- /dev/null +++ b/graphics/epix/doc/basepoint.eepic @@ -0,0 +1,16 @@ +%% Generated from basepoint.xp on Tue Jan 4 15:32:04 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [0,3.75] x [0,1] +%% Actual size: 3.75pc x 1pc +%% Figure offset: right by 0pc, up by 0pc +%% +\setlength{\unitlength}{1pc} +\begin{picture}(3.75,1)(-0,-0) +%% --- +\path(0,-0.375)(3.75,-0.375)(3.75,1)(0,1)(0,-0.375) +\allinethickness{0.15pt}% +\path(0,0)(3.75,0) +\put(0,0){$y=f(x)$} +\put(0,0){\makebox(0,0)[c]{{\circle*{0.111111}}}} +\end{picture} diff --git a/graphics/epix/doc/basepoint.xp b/graphics/epix/doc/basepoint.xp new file mode 100644 index 0000000000..7fc15f6cb1 --- /dev/null +++ b/graphics/epix/doc/basepoint.xp @@ -0,0 +1,36 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +int main() { + bounding_box(P(0,0),P(3.75,1)); + unitlength("1pc"); + picture(3.75,1); + // offset(-0.5,0); + + begin(); + + rect(P(x_min, y_min-0.375), P(x_max, y_max)); + + pen(0.15); + line(P(x_min,0), P(x_max,0)); + + dot_size(2); + + // std::cout << "\n\\LARGE"; + /* + label(P(0,0), P(0,0), "$b$"); + ddot(P(0,0)); + + label(P(1,0), P(0,0), "$f$"); + ddot(P(1,0)); + + label(P(2,0), P(0,0), "$p$"); + ddot(P(2,0)); + */ + + label(P(0,0), P(0,0), "$y=f(x)$"); + ddot(P(0,0)); + + end(); +} diff --git a/graphics/epix/doc/camera.eepic b/graphics/epix/doc/camera.eepic new file mode 100644 index 0000000000..7da56f9987 --- /dev/null +++ b/graphics/epix/doc/camera.eepic @@ -0,0 +1,285 @@ +%% Generated from camera.xp on Sat Sep 22 17:10:34 EDT 2007 by +%% ePiX-1.2.0 +%% +%% Cartesian bounding box: [-3.5,3.5] x [-3.5,2.5] +%% Actual size: 2.625 x 2.25in +%% Figure offset: left by 0in, down by 0in +%% +%% usepackages epic,eepic,xcolor +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0}% +\xdefinecolor{rgb_7f7f7f}{rgb}{0.498039,0.498039,0.498039}% +\xdefinecolor{rgb_e5e5e5}{rgb}{0.898039,0.898039,0.898039}% +\xdefinecolor{rgb_ffffff}{rgb}{1,1,1}% +\setlength{\unitlength}{1in}% +\begin{picture}(2.625,2.25)(0,0)% +\path(1.42243,1.30711)(1.4086,1.26997)(1.29561,1.27568) +\path(1.3125,1.3125)(1.4523,1.30564)(1.59359,1.29871) +\path(1.3125,1.3125)(1.3125,1.44704)(1.3125,1.58496) +\path(0.307912,0.721822)(0.173332,2.09409)(2.55902,2.04543) + (2.39965,0.566596)(0.307912,0.721822) +\put(1.58249,0.490175){\makebox(0,0)[l]{\colorbox{rgb_ffffff}{\hbox{\color{rgb_000000}\footnotesize \textbf{Sea}}}}} +\put(0.937572,1.11972){\makebox(0,0)[b]{\colorbox{rgb_ffffff}{\hbox{\color{rgb_000000}\footnotesize \textbf{Sky}}}}} +\put(0.735053,0.174015){\makebox(0,0)[r]{\colorbox{rgb_ffffff}{\hbox{\color{rgb_000000}\footnotesize \textbf{Eye}}}}} +\put(0.929482,0.537641){\makebox(0,0)[r]{\colorbox{rgb_ffffff}{\hbox{\color{rgb_000000}\footnotesize Viewpoint}}}} +\put(0.957156,0.537641){\color{rgb_000000}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(2.476,2.01776){\makebox(0,0)[tr]{\colorbox{rgb_ffffff}{\hbox{\color{rgb_000000}\footnotesize Canvas}}}} +\path(0.957156,0.537641)(1.17567,1.01413)(1.3125,1.3125) +\color{rgb_7f7f7f}% +\path(1.83216,0.911179)(1.84054,0.911179) +\path(1.82052,0.916691)(1.83729,0.916691) +\path(1.80888,0.922203)(1.83404,0.922203) +\path(1.79724,0.927715)(1.83079,0.927715) +\path(1.7856,0.933227)(1.82754,0.933227) +\path(1.77396,0.938739)(1.82429,0.938739) +\path(1.76232,0.944251)(1.82104,0.944251) +\path(1.75068,0.949763)(1.81779,0.949763) +\path(1.73904,0.955275)(1.81454,0.955275) +\path(1.7274,0.960787)(1.81129,0.960787) +\path(1.71576,0.966299)(1.80804,0.966299) +\path(1.70412,0.971811)(1.80479,0.971811) +\path(1.69248,0.977323)(1.80154,0.977323) +\path(1.68084,0.982835)(1.79829,0.982835) +\path(1.6692,0.988347)(1.79503,0.988347) +\path(1.65756,0.993859)(1.79178,0.993859) +\path(1.64592,0.999371)(1.78853,0.999371) +\path(1.63428,1.00488)(1.78528,1.00488) +\path(1.62264,1.0104)(1.78203,1.0104) +\path(1.611,1.01591)(1.77878,1.01591) +\path(1.60612,1.02142)(1.77553,1.02142) +\path(1.60892,1.02693)(1.77228,1.02693) +\path(1.61172,1.03244)(1.76903,1.03244) +\path(1.61452,1.03796)(1.76578,1.03796) +\path(1.61732,1.04347)(1.76253,1.04347) +\path(1.62012,1.04898)(1.75928,1.04898) +\path(1.62292,1.05449)(1.75603,1.05449) +\path(1.62572,1.06)(1.75278,1.06) +\path(1.62852,1.06551)(1.74952,1.06551) +\path(1.63132,1.07103)(1.74627,1.07103) +\path(1.63412,1.07654)(1.74302,1.07654) +\path(1.63692,1.08205)(1.73977,1.08205) +\path(1.63972,1.08756)(1.73652,1.08756) +\path(1.64252,1.09307)(1.73327,1.09307) +\path(1.64532,1.09859)(1.73002,1.09859) +\path(1.64812,1.1041)(1.72677,1.1041) +\path(1.65091,1.10961)(1.72352,1.10961) +\path(1.65371,1.11512)(1.72027,1.11512) +\path(1.65651,1.12063)(1.71702,1.12063) +\path(1.65931,1.12615)(1.71377,1.12615) +\path(1.66211,1.13166)(1.71052,1.13166) +\path(1.66491,1.13717)(1.70726,1.13717) +\path(1.66771,1.14268)(1.70401,1.14268) +\path(1.67051,1.14819)(1.70076,1.14819) +\path(1.67331,1.15371)(1.69751,1.15371) +\path(1.67611,1.15922)(1.69426,1.15922) +\path(1.67891,1.16473)(1.69101,1.16473) +\path(1.68171,1.17024)(1.68776,1.17024) +\path(1.83836,0.908239)(1.83836,0.914877) +\path(1.83293,0.910811)(1.83293,0.924087) +\path(1.8275,0.913384)(1.8275,0.933297) +\path(1.82207,0.915956)(1.82207,0.942506) +\path(1.81664,0.918528)(1.81664,0.951716) +\path(1.81121,0.9211)(1.81121,0.960926) +\path(1.80577,0.923672)(1.80577,0.970136) +\path(1.80034,0.926244)(1.80034,0.979345) +\path(1.79491,0.928816)(1.79491,0.988555) +\path(1.78948,0.931388)(1.78948,0.997765) +\path(1.78405,0.93396)(1.78405,1.00697) +\path(1.77862,0.936532)(1.77862,1.01618) +\path(1.77319,0.939104)(1.77319,1.02539) +\path(1.76775,0.941676)(1.76775,1.0346) +\path(1.76232,0.944248)(1.76232,1.04381) +\path(1.75689,0.94682)(1.75689,1.05302) +\path(1.75146,0.949392)(1.75146,1.06223) +\path(1.74603,0.951964)(1.74603,1.07144) +\path(1.7406,0.954536)(1.7406,1.08065) +\path(1.73517,0.957108)(1.73517,1.08986) +\path(1.72973,0.95968)(1.72973,1.09907) +\path(1.7243,0.962252)(1.7243,1.10828) +\path(1.71887,0.964824)(1.71887,1.11749) +\path(1.71344,0.967396)(1.71344,1.1267) +\path(1.70801,0.969968)(1.70801,1.13591) +\path(1.70258,0.97254)(1.70258,1.14512) +\path(1.69715,0.975112)(1.69715,1.15433) +\path(1.69171,0.977684)(1.69171,1.16354) +\path(1.68628,0.980256)(1.68628,1.17275) +\path(1.68085,0.982828)(1.68085,1.16855) +\path(1.67542,0.9854)(1.67542,1.15786) +\path(1.66999,0.987972)(1.66999,1.14716) +\path(1.66456,0.990544)(1.66456,1.13647) +\path(1.65912,0.993116)(1.65912,1.12577) +\path(1.65369,0.995689)(1.65369,1.11508) +\path(1.64826,0.998261)(1.64826,1.10439) +\path(1.64283,1.00083)(1.64283,1.09369) +\path(1.6374,1.0034)(1.6374,1.083) +\path(1.63197,1.00598)(1.63197,1.07231) +\path(1.62654,1.00855)(1.62654,1.06161) +\path(1.6211,1.01112)(1.6211,1.05092) +\path(1.61567,1.01369)(1.61567,1.04022) +\path(1.61024,1.01626)(1.61024,1.02953) +\color{rgb_000000}% +\path(1.68451,1.17575)(1.8438,0.905667)(1.60481,1.01884)(1.68451,1.17575) +\path(1.55858,1.06528)(1.62462,1.12321)(1.68451,1.17575) +\path(1.64966,0.825085)(1.75291,0.867943)(1.8438,0.905667) +\path(1.42984,0.888834)(1.52409,0.958865)(1.60481,1.01884) +\path(0.957156,0.537641)(1.4039,0.929569)(1.68451,1.17575) +\path(0.957156,0.537641)(1.50556,0.765274)(1.8438,0.905667) +\path(0.957156,0.537641)(1.35769,0.835234)(1.60481,1.01884) +\color{rgb_e5e5e5}% +\path(1.64572,0.826226)(1.5548,1.06009) +\path(1.63918,0.828123)(1.55101,1.0549) +\path(1.63264,0.830021)(1.54722,1.04971) +\path(1.6261,0.831918)(1.54344,1.04452) +\path(1.61955,0.833815)(1.53965,1.03933) +\path(1.61301,0.835712)(1.53586,1.03414) +\path(1.60647,0.837609)(1.53208,1.02895) +\path(1.59993,0.839507)(1.52829,1.02376) +\path(1.59339,0.841404)(1.5245,1.01857) +\path(1.58684,0.843301)(1.52072,1.01338) +\path(1.5803,0.845198)(1.51693,1.00819) +\path(1.57376,0.847095)(1.51314,1.003) +\path(1.56722,0.848993)(1.50936,0.997814) +\path(1.56068,0.85089)(1.50557,0.992624) +\path(1.55413,0.852787)(1.50178,0.987435) +\path(1.54759,0.854684)(1.498,0.982245) +\path(1.54105,0.856581)(1.49421,0.977056) +\path(1.53451,0.858479)(1.49042,0.971866) +\path(1.52797,0.860376)(1.48664,0.966677) +\path(1.52142,0.862273)(1.48285,0.961487) +\path(1.51488,0.86417)(1.47906,0.956298) +\path(1.50834,0.866067)(1.47528,0.951108) +\path(1.5018,0.867965)(1.47149,0.945919) +\path(1.49526,0.869862)(1.4677,0.940729) +\path(1.48871,0.871759)(1.46392,0.93554) +\path(1.48217,0.873656)(1.46013,0.93035) +\path(1.47563,0.875553)(1.45634,0.925161) +\path(1.46909,0.877451)(1.45256,0.919971) +\path(1.46255,0.879348)(1.44877,0.914781) +\path(1.456,0.881245)(1.44498,0.909592) +\path(1.44946,0.883142)(1.4412,0.904402) +\path(1.44292,0.885039)(1.43741,0.899213) +\path(1.43638,0.886937)(1.43362,0.894023) +\path(1.56052,1.06017)(1.55261,1.05709) +\path(1.56246,1.05506)(1.54664,1.04891) +\path(1.5644,1.04995)(1.54066,1.04072) +\path(1.56633,1.04484)(1.53469,1.03253) +\path(1.56827,1.03973)(1.52872,1.02435) +\path(1.57021,1.03461)(1.52274,1.01616) +\path(1.57215,1.0295)(1.51677,1.00797) +\path(1.57409,1.02439)(1.5108,0.999787) +\path(1.57602,1.01928)(1.50482,0.991601) +\path(1.57796,1.01417)(1.49885,0.983414) +\path(1.5799,1.00906)(1.49288,0.975228) +\path(1.58184,1.00395)(1.4869,0.967042) +\path(1.58377,0.998841)(1.48093,0.958855) +\path(1.58571,0.993731)(1.47496,0.950669) +\path(1.58765,0.988621)(1.46898,0.942483) +\path(1.58959,0.98351)(1.46301,0.934296) +\path(1.59152,0.9784)(1.45704,0.92611) +\path(1.59346,0.973289)(1.45106,0.917923) +\path(1.5954,0.968179)(1.44509,0.909737) +\path(1.59734,0.963068)(1.43911,0.901551) +\path(1.59928,0.957958)(1.43314,0.893364) +\path(1.60121,0.952847)(1.43369,0.887715) +\path(1.60315,0.947737)(1.44233,0.88521) +\path(1.60509,0.942626)(1.45097,0.882705) +\path(1.60703,0.937516)(1.45961,0.880199) +\path(1.60896,0.932405)(1.46825,0.877694) +\path(1.6109,0.927295)(1.47689,0.875189) +\path(1.61284,0.922184)(1.48552,0.872684) +\path(1.61478,0.917074)(1.49416,0.870179) +\path(1.61672,0.911963)(1.5028,0.867673) +\path(1.61865,0.906853)(1.51144,0.865168) +\path(1.62059,0.901742)(1.52008,0.862663) +\path(1.62253,0.896632)(1.52872,0.860158) +\path(1.62447,0.891521)(1.53736,0.857653) +\path(1.6264,0.886411)(1.54599,0.855147) +\path(1.62834,0.8813)(1.55463,0.852642) +\path(1.63028,0.87619)(1.56327,0.850137) +\path(1.63222,0.871079)(1.57191,0.847632) +\path(1.63416,0.865969)(1.58055,0.845127) +\path(1.63609,0.860858)(1.58919,0.842621) +\path(1.63803,0.855748)(1.59783,0.840116) +\path(1.63997,0.850637)(1.60646,0.837611) +\path(1.64191,0.845527)(1.6151,0.835106) +\path(1.64384,0.840416)(1.62374,0.8326) +\path(1.64578,0.835306)(1.63238,0.830095) +\path(1.64772,0.830195)(1.64102,0.82759) +\color{rgb_000000}% +\path(1.55858,1.06528)(1.64966,0.825085)(1.42984,0.888834)(1.55858,1.06528) +\path(1.69177,1.3845)(1.6229,1.16677)(1.54714,0.927292) +\put(1.69177,1.3845){\makebox(0,0)[b]{\colorbox{rgb_ffffff}{\hbox{\color{rgb_000000}\footnotesize Object}}}} +\path(2.05075,0.923554)(1.88188,0.980517)(1.71366,1.03726) +\put(2.05075,0.923554){\makebox(0,0)[l]{\colorbox{rgb_ffffff}{\hbox{\color{rgb_000000}\footnotesize Shadow}}}} +\put(1.12218,1.68556){\makebox(0,0)[b]{\colorbox{rgb_ffffff}{\hbox{\color{rgb_000000}\footnotesize Target}}}} +\path(1.12218,1.68556)(1.29391,1.34894) +\path(1.27634,1.40359)(1.2621,1.39054) +\path(1.27896,1.39892)(1.26528,1.38638) +\path(1.28062,1.39336)(1.26846,1.38222) +\path(1.28229,1.38781)(1.27164,1.37806) +\path(1.28395,1.38226)(1.27482,1.3739) +\path(1.28561,1.3767)(1.278,1.36974) +\path(1.28727,1.37115)(1.28118,1.36558) +\path(1.28893,1.3656)(1.28437,1.36142) +\path(1.29059,1.36005)(1.28755,1.35726) +\path(1.29225,1.35449)(1.29073,1.3531) +\path(1.25949,1.39395)(1.29061,1.35998) +\path(1.26348,1.39703)(1.28731,1.37102) +\path(1.26812,1.39939)(1.28401,1.38205) +\path(1.27276,1.40176)(1.28071,1.39309) +\path(1.26816,1.39941)(1.25892,1.3947)(1.29391,1.34894) + (1.2774,1.40413)(1.26816,1.39941) +\put(1.3125,1.3125){\color{rgb_000000}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\allinethickness{0.8pt}% +\path(0.957156,0.537641)(1.55482,0.490175) +\allinethickness{0.0055348in}% +\path(1.4989,0.489651)(1.50786,0.485229) +\path(1.49933,0.495061)(1.51726,0.486218) +\path(1.49976,0.500472)(1.52665,0.487207) +\path(1.50454,0.503736)(1.53604,0.488197) +\path(1.52968,0.496955)(1.54543,0.489186) +\path(1.54888,0.489549)(1.54985,0.491516) +\path(1.54293,0.488923)(1.54487,0.492858) +\path(1.53699,0.488297)(1.5399,0.494199) +\path(1.53104,0.487671)(1.53493,0.495541) +\path(1.5251,0.487045)(1.52995,0.496882) +\path(1.51916,0.486419)(1.52498,0.498223) +\path(1.51321,0.485792)(1.52001,0.499565) +\path(1.50727,0.485166)(1.51504,0.500906) +\path(1.50133,0.48454)(1.51006,0.502247) +\path(1.49903,0.491318)(1.50509,0.503589) +\allinethickness{0.8pt}% +\path(1.49929,0.494585)(1.49847,0.48424)(1.55482,0.490175) + (1.50012,0.50493)(1.49929,0.494585) +\path(0.957156,0.537641)(0.790401,0.174015) +\allinethickness{0.0055348in}% +\path(0.807364,0.192334)(0.808098,0.200697) +\path(0.80171,0.186228)(0.803178,0.202954) +\path(0.796055,0.180122)(0.798257,0.20521) +\path(0.807022,0.201191)(0.793617,0.202367) +\path(0.810836,0.196084)(0.793081,0.197642) +\path(0.806749,0.19167)(0.792545,0.192917) +\path(0.802662,0.187256)(0.792009,0.188191) +\path(0.798575,0.182843)(0.791473,0.183466) +\path(0.794488,0.178429)(0.790937,0.178741) +\allinethickness{0.8pt}% +\path(0.803586,0.202767)(0.794153,0.207092)(0.790401,0.174015) + (0.813019,0.198441)(0.803586,0.202767) +\path(0.957156,0.537641)(0.937572,1.09205) +\allinethickness{0.0055348in}% +\path(0.938782,1.08718)(0.936611,1.08655) +\path(0.939993,1.08231)(0.935649,1.08104) +\path(0.941204,1.07743)(0.934688,1.07554) +\path(0.942414,1.07256)(0.933727,1.07003) +\path(0.943625,1.06769)(0.932765,1.06453) +\path(0.944835,1.06282)(0.931804,1.05902) +\path(0.946046,1.05794)(0.930842,1.05352) +\path(0.947256,1.05307)(0.929881,1.04801) +\path(0.948467,1.0482)(0.929251,1.04261) +\path(0.931094,1.05496)(0.934635,1.0428) +\path(0.933253,1.06732)(0.940334,1.043) +\path(0.935413,1.07969)(0.946034,1.0432) +\allinethickness{0.8pt}% +\path(0.939306,1.04296)(0.949677,1.04333)(0.937572,1.09205) + (0.928935,1.0426)(0.939306,1.04296) +\end{picture}% diff --git a/graphics/epix/doc/camera.xp b/graphics/epix/doc/camera.xp new file mode 100644 index 0000000000..66f8fdb334 --- /dev/null +++ b/graphics/epix/doc/camera.xp @@ -0,0 +1,86 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +const double ht(4); + +const P target(0,0,0); +const P observer(0,-4,0); +const P dtarg(-0.5,0,1); +const double dx(0.375); + +// location of label +const P obj_loc(1,0,0.25); + +P F(P arg) +{ + double x(arg.x2()); + return (ht/(ht+x))*P(arg.x1(), 0, arg.x3()); +} + +P P1(0.75, -1, -0.25); +P P2(1, -1.25, -0.75); +P P3(0.5, -1.5, -0.5 ); +P midpt((1.0/3)*(P1+P2+P3)); + +int main() { + bounding_box(P(-3.5,-3.5),P(3.5,2.5)); + unitlength("0.375in"); + picture(P(7,6)); + + begin(); + + camera.at(P(1.5,-10,3.5)); + camera.range(10); + + font_size("footnotesize"); + right_angle(target, E_1, -E_2); + + line(target, target+2*dx*E_1); + line(target, target+2*dx*E_3); + + // grid(P(-3,0,-2), P(3,0,2), 6, 8); + grid(P(-3,0,-2), P(3,0,2)); + + masklabel(observer+E_1, P(2,0), "\\textbf{Sea}", r); + masklabel(observer+E_3, P(0,2), "\\textbf{Sky}", t); + masklabel(observer-E_2, P(-4,0), "\\textbf{Eye}", l); + + masklabel(observer, P(-2,0), "Viewpoint", l); + dot(observer); + + masklabel(P(3,0,2), P(-6,-2), "Canvas", bl); + + line(observer, target); + + fill(Black(0.5)); + triangle(F(P1), F(P2), F(P3)); + + line(P1, F(P1)); + line(P2, F(P2)); + line(P3, F(P3)); + + line(observer, F(P1)); + line(observer, F(P2)); + line(observer, F(P3)); + + fill(Black(0.1)); + triangle(P1, P2, P3); + + line(obj_loc, midpt); + masklabel(obj_loc, P(0,0), "Object", t); + + line(P(2,0,-1), F(midpt)); + masklabel(P(2,0,-1), P(0,0), "Shadow", r); + + masklabel(target+dtarg, P(0,0), "Target", t); + arrow(target+dtarg, target+0.1*dtarg, 0.5); + dot(target); + + bold(); + arrow(observer, observer+E_1, 0.5); + arrow(observer, observer-E_2, 0.5); + arrow(observer, observer+E_3, 0.5); + + end(); +} diff --git a/graphics/epix/doc/cb.eepic b/graphics/epix/doc/cb.eepic new file mode 100644 index 0000000000..7df0354645 --- /dev/null +++ b/graphics/epix/doc/cb.eepic @@ -0,0 +1,25 @@ +%% Generated from cb.xp on Tue Jan 4 15:32:10 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [-2,2] x [-1,1] +%% Actual size: 1.5in x 0.75in +%% Figure offset: right by 0in, up by 0in +%% +\setlength{\unitlength}{1in} +\begin{picture}(1.5,0.75)(-0,-0) +%% --- +\path(0,0.375)(1.5,0.375) +\put(0,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(0.375,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(0.75,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(1.125,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(1.5,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +%% --- +\path(0.75,0)(0.75,0.75) +\put(0.75,0){\makebox(0,0)[c]{\rule{4pt}{0.5pt}}} +\put(0.75,0.75){\makebox(0,0)[c]{\rule{4pt}{0.5pt}}} +%% --- +\thicklines +\path(0,0.375)(0.375,0.75)(0.75,0.375)(1.125,0.75)(1.5,0.375) +\put(0.75,-0.055348){\makebox(0,0)[t]{\code{cb}}} +\end{picture} diff --git a/graphics/epix/doc/cb.xp b/graphics/epix/doc/cb.xp new file mode 100644 index 0000000000..e0434b483e --- /dev/null +++ b/graphics/epix/doc/cb.xp @@ -0,0 +1,22 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + bounding_box(P(-2,-1),P(2,1)); + unitlength("1in"); + picture(1.5,0.75); + + begin(); + + h_axis(4); + v_axis(1); + + bold(); + plot(cb, x_min, x_max, 4); + + label(P(0,y_min), P(0,-4), "\\code{cb}", b); + + end(); +} diff --git a/graphics/epix/doc/color_density.eepic b/graphics/epix/doc/color_density.eepic new file mode 100644 index 0000000000..1b0ee79028 --- /dev/null +++ b/graphics/epix/doc/color_density.eepic @@ -0,0 +1,139 @@ +%% Generated from color_density.xp on Thu Jul 5 10:01:14 EDT 2007 by +%% ePiX-1.1.6 +%% +%% Cartesian bounding box: [-2,2] x [0,1.375] +%% Actual size: 4 x 1.5in +%% Figure offset: left by 0in, down by 0in +%% +\newrgbcolor{rgb_000000}{0 0 0} +\newrgbcolor{rgb_005454}{0 0.329412 0.329412} +\newrgbcolor{rgb_00a9a9}{0 0.662745 0.662745} +\newrgbcolor{rgb_00fefe}{0 0.996078 0.996078} +\newrgbcolor{rgb_00ffff}{0 1 1} +\newrgbcolor{rgb_540000}{0.329412 0 0} +\newrgbcolor{rgb_54ffff}{0.329412 1 1} +\newrgbcolor{rgb_a90000}{0.662745 0 0} +\newrgbcolor{rgb_a9ffff}{0.662745 1 1} +\newrgbcolor{rgb_fe0000}{0.996078 0 0} +\newrgbcolor{rgb_feffff}{0.996078 1 1} +\newrgbcolor{rgb_ff0000}{1 0 0} +\newrgbcolor{rgb_ff5454}{1 0.329412 0.329412} +\newrgbcolor{rgb_ffa9a9}{1 0.662745 0.662745} +\newrgbcolor{rgb_fffefe}{1 0.996078 0.996078} +\psset{unit=1in,linewidth=0.4pt} +\begin{pspicture}(4,1.5)(-0,-0) +\psset{fillcolor=rgb_feffff}% +\psline[fillstyle=solid] + (-0.123,1.22727)(0.127,1.22727)(0.127,1.5)(-0.123,1.5)(-0.123,1.22727) +%% +\psline(-0.123,1.22727)(0.127,1.22727)(0.127,1.5)(-0.123,1.5)(-0.123,1.22727) +%% +\psset{fillcolor=rgb_a9ffff}% +\psline[fillstyle=solid] + (0.21,1.22727)(0.46,1.22727)(0.46,1.5)(0.21,1.5)(0.21,1.22727) +%% +\psline(0.21,1.22727)(0.46,1.22727)(0.46,1.5)(0.21,1.5)(0.21,1.22727) +%% +\psset{fillcolor=rgb_54ffff}% +\psline[fillstyle=solid] + (0.543,1.22727)(0.793,1.22727)(0.793,1.5)(0.543,1.5)(0.543,1.22727) +%% +\psline(0.543,1.22727)(0.793,1.22727)(0.793,1.5)(0.543,1.5)(0.543,1.22727) +%% +\psset{fillcolor=rgb_00fefe}% +\psline[fillstyle=solid] + (0.876,1.22727)(1.126,1.22727)(1.126,1.5)(0.876,1.5)(0.876,1.22727) +%% +\psline(0.876,1.22727)(1.126,1.22727)(1.126,1.5)(0.876,1.5)(0.876,1.22727) +%% +\psset{fillcolor=rgb_00a9a9}% +\psline[fillstyle=solid] + (1.209,1.22727)(1.459,1.22727)(1.459,1.5)(1.209,1.5)(1.209,1.22727) +%% +\psline(1.209,1.22727)(1.459,1.22727)(1.459,1.5)(1.209,1.5)(1.209,1.22727) +%% +\psset{fillcolor=rgb_005454}% +\psline[fillstyle=solid] + (1.542,1.22727)(1.792,1.22727)(1.792,1.5)(1.542,1.5)(1.542,1.22727) +%% +\psline(1.542,1.22727)(1.792,1.22727)(1.792,1.5)(1.542,1.5)(1.542,1.22727) +%% +\psset{fillcolor=rgb_000000}% +\psline[fillstyle=solid] + (1.875,1.22727)(2.125,1.22727)(2.125,1.5)(1.875,1.5)(1.875,1.22727) +%% +\psline(1.875,1.22727)(2.125,1.22727)(2.125,1.5)(1.875,1.5)(1.875,1.22727) +%% +\psset{fillcolor=rgb_540000}% +\psline[fillstyle=solid] + (2.208,1.22727)(2.458,1.22727)(2.458,1.5)(2.208,1.5)(2.208,1.22727) +%% +\psline(2.208,1.22727)(2.458,1.22727)(2.458,1.5)(2.208,1.5)(2.208,1.22727) +%% +\psset{fillcolor=rgb_a90000}% +\psline[fillstyle=solid] + (2.541,1.22727)(2.791,1.22727)(2.791,1.5)(2.541,1.5)(2.541,1.22727) +%% +\psline(2.541,1.22727)(2.791,1.22727)(2.791,1.5)(2.541,1.5)(2.541,1.22727) +%% +\psset{fillcolor=rgb_fe0000}% +\psline[fillstyle=solid] + (2.874,1.22727)(3.124,1.22727)(3.124,1.5)(2.874,1.5)(2.874,1.22727) +%% +\psline(2.874,1.22727)(3.124,1.22727)(3.124,1.5)(2.874,1.5)(2.874,1.22727) +%% +\psset{fillcolor=rgb_ff5454}% +\psline[fillstyle=solid] + (3.207,1.22727)(3.457,1.22727)(3.457,1.5)(3.207,1.5)(3.207,1.22727) +%% +\psline(3.207,1.22727)(3.457,1.22727)(3.457,1.5)(3.207,1.5)(3.207,1.22727) +%% +\psset{fillcolor=rgb_ffa9a9}% +\psline[fillstyle=solid] + (3.54,1.22727)(3.79,1.22727)(3.79,1.5)(3.54,1.5)(3.54,1.22727) +%% +\psline(3.54,1.22727)(3.79,1.22727)(3.79,1.5)(3.54,1.5)(3.54,1.22727) +%% +\psset{fillcolor=rgb_fffefe}% +\psline[fillstyle=solid] + (3.873,1.22727)(4.123,1.22727)(4.123,1.5)(3.873,1.5)(3.873,1.22727) +%% +\psline(3.873,1.22727)(4.123,1.22727)(4.123,1.5)(3.873,1.5)(3.873,1.22727) +%% +\psline(0,0)(4,0) +%% +\rput(0,0){\makebox(0,0){{$\rule{0.5pt}{4pt}$}}} +\rput(1,0){\makebox(0,0){{$\rule{0.5pt}{4pt}$}}} +\rput(2,0){\makebox(0,0){{$\rule{0.5pt}{4pt}$}}} +\rput(3,0){\makebox(0,0){{$\rule{0.5pt}{4pt}$}}} +\rput(4,0){\makebox(0,0){{$\rule{0.5pt}{4pt}$}}} +\psline(2,0)(2,1.09091) +%% +\rput(2,0){\makebox(0,0){{$\rule{4pt}{0.5pt}$}}} +\rput(2,1.09091){\makebox(0,0){{$\rule{4pt}{0.5pt}$}}} +\rput(0,-0.055348){\makebox(0,0)[t]{{$-2$}}} +\rput(1,-0.055348){\makebox(0,0)[t]{{$-1$}}} +\rput(2,-0.055348){\makebox(0,0)[t]{{$\phantom{-}0$}}} +\rput(3,-0.055348){\makebox(0,0)[t]{{$\phantom{-}1$}}} +\rput(4,-0.055348){\makebox(0,0)[t]{{$\phantom{-}2$}}} +\psset{linecolor=rgb_00ffff}% +\psline(0,1.09091)(1,1.09091) +%% +\psline(1,1.09091)(2,0) +%% +\psline(2,0)(3,0) +%% +\psline(3,0)(4,1.09091) +%% +\psset{linewidth=0.8pt}% +\psset{linecolor=rgb_ff0000}% +\psline + (0,1.09091)(1,0) +%% +\psline(1,0)(2,0) +%% +\psline(2,0)(3,1.09091) +%% +\psline(3,1.09091)(4,1.09091) +%% +\end{pspicture} diff --git a/graphics/epix/doc/color_density.xp b/graphics/epix/doc/color_density.xp new file mode 100644 index 0000000000..f561fa43e3 --- /dev/null +++ b/graphics/epix/doc/color_density.xp @@ -0,0 +1,42 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +double dX(0.125), dY(0.25); + +int main() +{ + picture(P(-2, 0), P(2, 1.125 + dY), "4 x 1.5in"); + + begin(); + + fill(); + for (int i=-6; i<=6; ++i) + { + const double x(0.333*i); + fill(Red(x)); + rect(P(x-dX, 1.125), P(x+dX, 1.125+dY)); + } + nofill(); + + h_axis(4); + v_axis(P(0,0), P(0,1), 1); + + h_axis_labels(4, P(0,-4), b); + red(-1); + line(P(-2,1), P(-1,1)); + line(P(-1,1), P(0,0)); + line(P(0,0), P(1,0)); + line(P(1,0), P(2,1)); + + red(); + bold(); + line(P(-2,1), P(-1,0)); + line(P(-1,0), P(0,0)); + + line(P(0,0), P(1,1)); + line(P(1,1), P(2,1)); + + pst_format(); + end(); +} diff --git a/graphics/epix/doc/dots.eepic b/graphics/epix/doc/dots.eepic new file mode 100644 index 0000000000..839663481d --- /dev/null +++ b/graphics/epix/doc/dots.eepic @@ -0,0 +1,19 @@ +%% Generated from dots.xp on Tue Jan 4 15:32:12 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [0,8] x [0,1] +%% Actual size: 72pt x 12pt +%% Figure offset: right by 10pt, up by 2pt +%% +\setlength{\unitlength}{1pt} +\begin{picture}(72,12)(-10,-2) +%% --- +\put(0,0){\makebox(0,0)[c]{{\circle*{4.5}}}} +\put(9,0){\makebox(0,0)[c]{{\circle*{3}}}} +\put(18,0){\makebox(0,0)[c]{{\circle*{2}}}} +\put(36,0){\makebox(0,0)[c]{\rule{3pt}{3pt}}} +\put(45,0){\makebox(0,0)[c]{\rule{2pt}{2pt}}} +\path(58.5,0)(78.75,0) +\put(63,0){\makebox(0,0)[c]{{\circle{4.5}}}} +\whiten\put(72,0){\makebox(0,0)[c]{{\circle{3}}}} +\end{picture} diff --git a/graphics/epix/doc/dots.xp b/graphics/epix/doc/dots.xp new file mode 100644 index 0000000000..1f13fb6099 --- /dev/null +++ b/graphics/epix/doc/dots.xp @@ -0,0 +1,28 @@ +/* -*-ePiX-*- */ +/* dots.c -- Dot primitives */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + unitlength("1pt"); + bounding_box(P(0,0), P(8,1)); + picture(P(72,12)); + offset(P(10,2)); + + begin(); + + spot(P(0,0)); + dot(P(1,0)); + ddot(P(2,0)); + + box(P(4,0)); + bbox(P(5,0)); + + line(P(6.5,0), P(8.75,0)); + + ring(P(7,0)); + circ(P(8,0)); + + end(); +} diff --git a/graphics/epix/doc/ePiX.eepic b/graphics/epix/doc/ePiX.eepic new file mode 100644 index 0000000000..4bdec31118 --- /dev/null +++ b/graphics/epix/doc/ePiX.eepic @@ -0,0 +1,1099 @@ +%% Generated from ePiX.xp on Sat Sep 22 20:16:03 EDT 2007 by +%% ePiX-1.2.0 +%% +%% Cartesian bounding box: [-0.5,5.75] x [2,10] +%% Actual size: 4 x 7.5in +%% Figure offset: left by 0in, down by 0in +%% +%% usepackages epic,eepic,xcolor +%% +\xdefinecolor{cmy_000019}{cmyk}{0,0,0.0980392,0}% +\xdefinecolor{rgb_0000ff}{rgb}{0,0,1}% +\xdefinecolor{rgb_009800}{rgb}{0,0.596078,0}% +\xdefinecolor{rgb_7f7f7f}{rgb}{0.498039,0.498039,0.498039}% +\xdefinecolor{rgb_ff0000}{rgb}{1,0,0}% +\setlength{\unitlength}{1in}% +\begin{picture}(4,7.5)(0,0)% +\color{rgb_7f7f7f}% +\path(0.32,7.03125)(0.96,7.03125) +\path(0.902922,7.02606)(0.931461,7.02606) +\path(0.902922,7.03125)(0.96,7.03125) +\path(0.902922,7.03644)(0.931461,7.03644) +\path(0.954811,7.03031)(0.954811,7.03219) +\path(0.949622,7.02936)(0.949622,7.03314) +\path(0.944433,7.02842)(0.944433,7.03408) +\path(0.939244,7.02748)(0.939244,7.03502) +\path(0.934056,7.02653)(0.934056,7.03597) +\path(0.928867,7.02559)(0.928867,7.03691) +\path(0.923678,7.02465)(0.923678,7.03785) +\path(0.918489,7.0237)(0.918489,7.0388) +\path(0.9133,7.02276)(0.9133,7.03974) +\path(0.908111,7.02182)(0.908111,7.04068) +\path(0.902922,7.02087)(0.902922,7.04163) +\path(0.902922,7.03125)(0.902922,7.02087)(0.96,7.03125) + (0.902922,7.04163)(0.902922,7.03125) +\put(0.32,7.0866){\makebox(0,0)[b]{\hbox{\color{rgb_7f7f7f}\footnotesize \texttt{xp}, \texttt{flx}}}} +\put(0.32,7.03125){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(0.97999,7.08981){\makebox(0,0)[b]{\hbox{\color{rgb_7f7f7f}\footnotesize \texttt{eepic}}}} +\put(0.96,7.03125){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\allinethickness{1.2pt}% +\color{rgb_ff0000}% +\path(0.96,7.03125)(0.963187,7.03115)(0.966347,7.03086) + (0.969482,7.03039)(0.972591,7.02972)(0.975676,7.02888) + (0.978736,7.02785)(0.981772,7.02665)(0.984785,7.02528) + (0.987774,7.02374)(0.990741,7.02203)(0.993685,7.02016) + (0.996608,7.01813)(0.999509,7.01594)(1.00239,7.0136) + (1.00525,7.01111)(1.00809,7.00847)(1.01091,7.00569) + (1.01371,7.00277)(1.01649,6.99972)(1.01926,6.99653) + (1.02201,6.99321)(1.02474,6.98976)(1.02745,6.98619)(1.03014,6.9825) + (1.03282,6.97869)(1.03549,6.97477)(1.03814,6.97074)(1.04077,6.9666) + (1.04339,6.96235)(1.046,6.95801)(1.04859,6.95356)(1.05117,6.94903) + (1.05374,6.9444)(1.0563,6.93968)(1.05884,6.93488)(1.06138,6.93) + (1.0639,6.92504)(1.06641,6.92)(1.06891,6.9149)(1.07141,6.90972) + (1.07389,6.90448)(1.07637,6.89918)(1.07884,6.89382)(1.0813,6.8884) + (1.08375,6.88293)(1.0862,6.87742)(1.08864,6.87185)(1.09107,6.86625) + (1.0935,6.86061)(1.09593,6.85493)(1.09835,6.84921)(1.10076,6.84347) + (1.10317,6.8377)(1.10558,6.83191)(1.10799,6.8261)(1.1104,6.82028) + (1.1128,6.81444)(1.1152,6.80859)(1.1176,6.80273)(1.12,6.79688) + (1.1224,6.79102)(1.1248,6.78516)(1.1272,6.77931)(1.1296,6.77347) + (1.13201,6.76765)(1.13442,6.76184)(1.13683,6.75605) + (1.13924,6.75028)(1.14165,6.74454)(1.14407,6.73882)(1.1465,6.73314) + (1.14893,6.7275)(1.15136,6.7219)(1.1538,6.71633)(1.15625,6.71082) + (1.1587,6.70535)(1.16116,6.69993)(1.16363,6.69457)(1.16611,6.68927) + (1.16859,6.68403)(1.17109,6.67885)(1.17359,6.67375)(1.1761,6.66871) + (1.17862,6.66375)(1.18116,6.65887)(1.1837,6.65407)(1.18626,6.64935) + (1.18883,6.64472)(1.19141,6.64019)(1.194,6.63574)(1.19661,6.6314) + (1.19923,6.62715)(1.20186,6.62301)(1.20451,6.61898) + (1.20718,6.61506)(1.20986,6.61125)(1.21255,6.60756) + (1.21526,6.60399)(1.21799,6.60054)(1.22074,6.59722) + (1.22351,6.59403)(1.22629,6.59098)(1.22909,6.58806) + (1.23191,6.58528)(1.23475,6.58264)(1.23761,6.58015) + (1.24049,6.57781)(1.24339,6.57562)(1.24631,6.57359) + (1.24926,6.57172)(1.25223,6.57001)(1.25522,6.56847)(1.25823,6.5671) + (1.26126,6.5659)(1.26432,6.56487)(1.26741,6.56403)(1.27052,6.56336) + (1.27365,6.56289)(1.27681,6.5626)(1.28,6.5625) +\path(1.28,6.5625)(1.6,6.5625) +\allinethickness{0.0055348in}% +\path(1.59481,6.56156)(1.59402,6.56359) +\path(1.58962,6.56061)(1.58804,6.56467) +\path(1.58443,6.55967)(1.58207,6.56576) +\path(1.57924,6.55873)(1.57609,6.56685) +\path(1.57406,6.55778)(1.57011,6.56793) +\path(1.56887,6.55684)(1.56413,6.56902) +\path(1.56368,6.5559)(1.55815,6.57011) +\path(1.55849,6.55495)(1.55217,6.5712) +\path(1.5533,6.55401)(1.5462,6.57228) +\path(1.54811,6.55307)(1.54292,6.56641) +\path(1.55244,6.57115)(1.54292,6.56745) +\path(1.56195,6.56942)(1.54292,6.56202) +\path(1.57146,6.56769)(1.54292,6.55659) +\path(1.58097,6.56596)(1.54755,6.55296) +\path(1.59049,6.56423)(1.57377,6.55773) +\allinethickness{1.2pt}% +\path(1.54292,6.5625)(1.54292,6.55212)(1.6,6.5625)(1.54292,6.57288)(1.54292,6.5625) +\path(1.6,6.5625)(2.24,6.5625) +\allinethickness{0.0055348in}% +\path(2.18926,6.57172)(2.18292,6.56591) +\path(2.19561,6.57057)(2.18292,6.55895) +\path(2.20195,6.56942)(2.1831,6.55216) +\path(2.20829,6.56827)(2.19259,6.55388) +\path(2.21463,6.56711)(2.20207,6.5556) +\path(2.22097,6.56596)(2.21155,6.55733) +\path(2.22732,6.56481)(2.22103,6.55905) +\path(2.23366,6.56365)(2.23052,6.56078) +\path(2.18292,6.5602)(2.18926,6.55328) +\path(2.18292,6.56827)(2.19561,6.55443) +\path(2.18674,6.57218)(2.20195,6.55558) +\path(2.19562,6.57057)(2.20829,6.55673) +\path(2.20449,6.56896)(2.21463,6.55789) +\path(2.21337,6.56734)(2.22097,6.55904) +\path(2.22225,6.56573)(2.22732,6.56019) +\path(2.23112,6.56411)(2.23366,6.56135) +\allinethickness{1.2pt}% +\path(2.18292,6.5625)(2.18292,6.55212)(2.24,6.5625) + (2.18292,6.57288)(2.18292,6.5625) +\put(1.6,6.61785){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\footnotesize \texttt{dvi}}}}} +\put(1.6,6.5625){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(2.21793,6.59482){\makebox(0,0)[br]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\footnotesize \texttt{ps}}}}} +\put(2.24,6.5625){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(0.96,6.09375)(0.963187,6.09385)(0.966347,6.09414) + (0.969482,6.09461)(0.972591,6.09528)(0.975676,6.09612) + (0.978736,6.09715)(0.981772,6.09835)(0.984785,6.09972) + (0.987774,6.10126)(0.990741,6.10297)(0.993685,6.10484) + (0.996608,6.10687)(0.999509,6.10906)(1.00239,6.1114) + (1.00525,6.11389)(1.00809,6.11653)(1.01091,6.11931) + (1.01371,6.12223)(1.01649,6.12528)(1.01926,6.12847) + (1.02201,6.13179)(1.02474,6.13524)(1.02745,6.13881)(1.03014,6.1425) + (1.03282,6.14631)(1.03549,6.15023)(1.03814,6.15426)(1.04077,6.1584) + (1.04339,6.16265)(1.046,6.16699)(1.04859,6.17144)(1.05117,6.17597) + (1.05374,6.1806)(1.0563,6.18532)(1.05884,6.19012)(1.06138,6.195) + (1.0639,6.19996)(1.06641,6.205)(1.06891,6.2101)(1.07141,6.21528) + (1.07389,6.22052)(1.07637,6.22582)(1.07884,6.23118)(1.0813,6.2366) + (1.08375,6.24207)(1.0862,6.24758)(1.08864,6.25315)(1.09107,6.25875) + (1.0935,6.26439)(1.09593,6.27007)(1.09835,6.27579)(1.10076,6.28153) + (1.10317,6.2873)(1.10558,6.29309)(1.10799,6.2989)(1.1104,6.30472) + (1.1128,6.31056)(1.1152,6.31641)(1.1176,6.32227)(1.12,6.32812) + (1.1224,6.33398)(1.1248,6.33984)(1.1272,6.34569)(1.1296,6.35153) + (1.13201,6.35735)(1.13442,6.36316)(1.13683,6.36895) + (1.13924,6.37472)(1.14165,6.38046)(1.14407,6.38618)(1.1465,6.39186) + (1.14893,6.3975)(1.15136,6.4031)(1.1538,6.40867)(1.15625,6.41418) + (1.1587,6.41965)(1.16116,6.42507)(1.16363,6.43043)(1.16611,6.43573) + (1.16859,6.44097)(1.17109,6.44615)(1.17359,6.45125)(1.1761,6.45629) + (1.17862,6.46125)(1.18116,6.46613)(1.1837,6.47093)(1.18626,6.47565) + (1.18883,6.48028)(1.19141,6.48481)(1.194,6.48926)(1.19661,6.4936) + (1.19923,6.49785)(1.20186,6.50199)(1.20451,6.50602) + (1.20718,6.50994)(1.20986,6.51375)(1.21255,6.51744) + (1.21526,6.52101)(1.21799,6.52446)(1.22074,6.52778) + (1.22351,6.53097)(1.22629,6.53402)(1.22909,6.53694) + (1.23191,6.53972)(1.23475,6.54236)(1.23761,6.54485) + (1.24049,6.54719)(1.24339,6.54938)(1.24631,6.55141) + (1.24926,6.55328)(1.25223,6.55499)(1.25522,6.55653)(1.25823,6.5579) + (1.26126,6.5591)(1.26432,6.56013)(1.26741,6.56097)(1.27052,6.56164) + (1.27365,6.56211)(1.27681,6.5624)(1.28,6.5625) +\put(0.97999,6.03519){\makebox(0,0)[t]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\footnotesize \texttt{tex}}}}} +\put(0.96,6.09375){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(2.24,6.5625)(2.24533,6.55472)(2.25067,6.54701)(2.256,6.53936) + (2.26133,6.53177)(2.26667,6.52425)(2.272,6.5168)(2.27733,6.50941) + (2.28267,6.50208)(2.288,6.49482)(2.29333,6.48763)(2.29867,6.4805) + (2.304,6.47344)(2.30933,6.46644)(2.31467,6.45951)(2.32,6.45264) + (2.32533,6.44583)(2.33067,6.4391)(2.336,6.43242)(2.34133,6.42581) + (2.34667,6.41927)(2.352,6.41279)(2.35733,6.40638)(2.36267,6.40003) + (2.368,6.39375)(2.37333,6.38753)(2.37867,6.38138)(2.384,6.37529) + (2.38933,6.36927)(2.39467,6.36331)(2.4,6.35742)(2.40533,6.3516) + (2.41067,6.34583)(2.416,6.34014)(2.42133,6.33451)(2.42667,6.32894) + (2.432,6.32344)(2.43733,6.318)(2.44267,6.31263)(2.448,6.30732) + (2.45333,6.30208)(2.45867,6.29691)(2.464,6.2918)(2.46933,6.28675) + (2.47467,6.28177)(2.48,6.27686)(2.48533,6.27201)(2.49067,6.26722) + (2.496,6.2625)(2.50133,6.25785)(2.50667,6.25326)(2.512,6.24873) + (2.51733,6.24427)(2.52267,6.23988)(2.528,6.23555)(2.53333,6.23128) + (2.53867,6.22708)(2.544,6.22295)(2.54933,6.21888)(2.55467,6.21488) + (2.56,6.21094)(2.56533,6.20706)(2.57067,6.20326)(2.576,6.19951) + (2.58133,6.19583)(2.58667,6.19222)(2.592,6.18867)(2.59733,6.18519) + (2.60267,6.18177)(2.608,6.17842)(2.61333,6.17513)(2.61867,6.17191) + (2.624,6.16875)(2.62933,6.16566)(2.63467,6.16263)(2.64,6.15967) + (2.64533,6.15677)(2.65067,6.15394)(2.656,6.15117)(2.66133,6.14847) + (2.66667,6.14583)(2.672,6.14326)(2.67733,6.14076)(2.68267,6.13831) + (2.688,6.13594)(2.69333,6.13363)(2.69867,6.13138)(2.704,6.1292) + (2.70933,6.12708)(2.71467,6.12503)(2.72,6.12305)(2.72533,6.12113) + (2.73067,6.11927)(2.736,6.11748)(2.74133,6.11576)(2.74667,6.1141) + (2.752,6.1125)(2.75733,6.11097)(2.76267,6.10951)(2.768,6.10811) + (2.77333,6.10677)(2.77867,6.1055)(2.784,6.1043)(2.78933,6.10316) + (2.79467,6.10208)(2.8,6.10107)(2.80533,6.10013)(2.81067,6.09925) + (2.816,6.09844)(2.82133,6.09769)(2.82667,6.09701)(2.832,6.09639) + (2.83733,6.09583)(2.84267,6.09535)(2.848,6.09492)(2.85333,6.09456) + (2.85867,6.09427)(2.864,6.09404)(2.86933,6.09388)(2.87467,6.09378)(2.88,6.09375) +\allinethickness{0.0055348in}% +\path(2.82289,6.08916)(2.83102,6.08515) +\path(2.82293,6.09461)(2.83919,6.08659) +\path(2.82296,6.10005)(2.84735,6.08802) +\path(2.82634,6.10385)(2.85551,6.08945) +\path(2.84423,6.10048)(2.86367,6.09088) +\path(2.86211,6.09712)(2.87184,6.09232) +\path(2.8738,6.09266)(2.87482,6.09473) +\path(2.8676,6.09157)(2.86963,6.0957) +\path(2.8614,6.09048)(2.86445,6.09668) +\path(2.8552,6.0894)(2.85927,6.09765) +\path(2.84899,6.08831)(2.85408,6.09863) +\path(2.84279,6.08722)(2.8489,6.0996) +\path(2.83659,6.08613)(2.84372,6.10058) +\path(2.83039,6.08504)(2.83854,6.10155) +\path(2.82419,6.08395)(2.83335,6.10253) +\path(2.82292,6.09285)(2.82817,6.1035) +\allinethickness{1.2pt}% +\path(2.82292,6.0941)(2.82286,6.08372)(2.88,6.09375) + (2.82299,6.10448)(2.82292,6.0941) +\put(2.93535,6.09375){\makebox(0,0)[l]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\footnotesize \texttt{pdf}}}}} +\put(2.88,6.09375){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\allinethickness{0.4pt}% +\color{rgb_7f7f7f}% +\path(2.24,6.5625)(2.24533,6.57028)(2.25067,6.57799)(2.256,6.58564) + (2.26133,6.59323)(2.26667,6.60075)(2.272,6.6082)(2.27733,6.61559) + (2.28267,6.62292)(2.288,6.63018)(2.29333,6.63737)(2.29867,6.6445) + (2.304,6.65156)(2.30933,6.65856)(2.31467,6.66549)(2.32,6.67236) + (2.32533,6.67917)(2.33067,6.6859)(2.336,6.69258)(2.34133,6.69919) + (2.34667,6.70573)(2.352,6.71221)(2.35733,6.71862)(2.36267,6.72497) + (2.368,6.73125)(2.37333,6.73747)(2.37867,6.74362)(2.384,6.74971) + (2.38933,6.75573)(2.39467,6.76169)(2.4,6.76758)(2.40533,6.7734) + (2.41067,6.77917)(2.416,6.78486)(2.42133,6.79049)(2.42667,6.79606) + (2.432,6.80156)(2.43733,6.807)(2.44267,6.81237)(2.448,6.81768) + (2.45333,6.82292)(2.45867,6.82809)(2.464,6.8332)(2.46933,6.83825) + (2.47467,6.84323)(2.48,6.84814)(2.48533,6.85299)(2.49067,6.85778) + (2.496,6.8625)(2.50133,6.86715)(2.50667,6.87174)(2.512,6.87627) + (2.51733,6.88073)(2.52267,6.88512)(2.528,6.88945)(2.53333,6.89372) + (2.53867,6.89792)(2.544,6.90205)(2.54933,6.90612)(2.55467,6.91012) + (2.56,6.91406)(2.56533,6.91794)(2.57067,6.92174)(2.576,6.92549) + (2.58133,6.92917)(2.58667,6.93278)(2.592,6.93633)(2.59733,6.93981) + (2.60267,6.94323)(2.608,6.94658)(2.61333,6.94987)(2.61867,6.95309) + (2.624,6.95625)(2.62933,6.95934)(2.63467,6.96237)(2.64,6.96533) + (2.64533,6.96823)(2.65067,6.97106)(2.656,6.97383)(2.66133,6.97653) + (2.66667,6.97917)(2.672,6.98174)(2.67733,6.98424)(2.68267,6.98669) + (2.688,6.98906)(2.69333,6.99137)(2.69867,6.99362)(2.704,6.9958) + (2.70933,6.99792)(2.71467,6.99997)(2.72,7.00195)(2.72533,7.00387) + (2.73067,7.00573)(2.736,7.00752)(2.74133,7.00924)(2.74667,7.0109) + (2.752,7.0125)(2.75733,7.01403)(2.76267,7.01549)(2.768,7.01689) + (2.77333,7.01823)(2.77867,7.0195)(2.784,7.0207)(2.78933,7.02184) + (2.79467,7.02292)(2.8,7.02393)(2.80533,7.02487)(2.81067,7.02575) + (2.816,7.02656)(2.82133,7.02731)(2.82667,7.02799)(2.832,7.02861) + (2.83733,7.02917)(2.84267,7.02965)(2.848,7.03008)(2.85333,7.03044) + (2.85867,7.03073)(2.864,7.03096)(2.86933,7.03112)(2.87467,7.03122)(2.88,7.03125) +\path(2.87464,7.03024)(2.87481,7.03216) +\path(2.86927,7.02923)(2.86961,7.03307) +\path(2.86391,7.02822)(2.86442,7.03399) +\path(2.85855,7.02721)(2.85922,7.0349) +\path(2.85318,7.02621)(2.85403,7.03581) +\path(2.84782,7.0252)(2.84883,7.03672) +\path(2.84246,7.02419)(2.84364,7.03763) +\path(2.8371,7.02318)(2.83844,7.03854) +\path(2.83173,7.02217)(2.83325,7.03946) +\path(2.82637,7.02116)(2.82805,7.04037) +\path(2.87938,7.03113)(2.82289,7.03609) +\path(2.86058,7.0276)(2.82292,7.0309) +\path(2.84178,7.02406)(2.82296,7.02571) +\path(2.82292,7.0309)(2.82299,7.02052)(2.88,7.03125) + (2.82286,7.04128)(2.82292,7.0309) +\put(2.86001,7.08981){\makebox(0,0)[b]{\hbox{\color{rgb_7f7f7f}\footnotesize \texttt{eps}}}} +\put(2.88,7.03125){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(2.88,7.03125)(3.52,7.03125) +\path(3.47434,7.03955)(3.46292,7.03623) +\path(3.48575,7.03748)(3.46292,7.03083) +\path(3.49717,7.0354)(3.46292,7.02543) +\path(3.50858,7.03333)(3.4706,7.02227) +\path(3.46292,7.03964)(3.46811,7.02182) +\path(3.46808,7.04069)(3.4733,7.02276) +\path(3.47385,7.03964)(3.47849,7.0237) +\path(3.47962,7.03859)(3.48368,7.02465) +\path(3.48539,7.03754)(3.48887,7.02559) +\path(3.49116,7.03649)(3.49406,7.02653) +\path(3.49692,7.03545)(3.49924,7.02748) +\path(3.50269,7.0344)(3.50443,7.02842) +\path(3.50846,7.03335)(3.50962,7.02936) +\path(3.51423,7.0323)(3.51481,7.03031) +\path(3.46292,7.03125)(3.46292,7.02087)(3.52,7.03125) + (3.46292,7.04163)(3.46292,7.03125) +\put(3.57535,7.03125){\makebox(0,0)[l]{\hbox{\color{rgb_7f7f7f}\footnotesize \begin{minipage}{0.225in}\texttt{png mng gif}\end{minipage}}}} +\put(3.52,7.03125){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(1.92,6.09375){\makebox(0,0)[c]{\hbox{\color{rgb_009800}\texttt{\Large laps}}}} +\allinethickness{1.2pt}% +\color{rgb_ff0000}% +\path(0.32,5.15625)(0.96,5.15625) +\allinethickness{0.0055348in}% +\path(0.902922,5.15435)(0.90863,5.14691) +\path(0.902922,5.16284)(0.914338,5.14795) +\path(0.907102,5.16587)(0.920046,5.14899) +\path(0.914659,5.16449)(0.925753,5.15002) +\path(0.922216,5.16312)(0.931461,5.15106) +\path(0.929773,5.16175)(0.937169,5.1521) +\path(0.93733,5.16037)(0.942877,5.15314) +\path(0.944886,5.159)(0.948584,5.15417) +\path(0.952443,5.15762)(0.954292,5.15521) +\path(0.948429,5.15415)(0.952865,5.15755) +\path(0.936859,5.15204)(0.945731,5.15884) +\path(0.925288,5.14994)(0.938596,5.16014) +\path(0.913717,5.14783)(0.931461,5.16144) +\path(0.902922,5.14633)(0.924326,5.16274) +\path(0.902922,5.15309)(0.917192,5.16403) +\path(0.902922,5.15986)(0.910057,5.16533) +\allinethickness{1.2pt}% +\path(0.902922,5.15625)(0.902922,5.14587)(0.96,5.15625) + (0.902922,5.16663)(0.902922,5.15625) +\put(0.32,5.2116){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{xp}, \texttt{flx}}}}}} +\put(0.32,5.15625){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(0.97999,5.21481){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{eepic}}}}}} +\put(0.96,5.15625){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\allinethickness{0.4pt}% +\color{rgb_7f7f7f}% +\path(0.96,5.15625)(0.963187,5.15615)(0.966347,5.15586) + (0.969482,5.15539)(0.972591,5.15472)(0.975676,5.15388) + (0.978736,5.15285)(0.981772,5.15165)(0.984785,5.15028) + (0.987774,5.14874)(0.990741,5.14703)(0.993685,5.14516) + (0.996608,5.14313)(0.999509,5.14094)(1.00239,5.1386) + (1.00525,5.13611)(1.00809,5.13347)(1.01091,5.13069) + (1.01371,5.12777)(1.01649,5.12472)(1.01926,5.12153) + (1.02201,5.11821)(1.02474,5.11476)(1.02745,5.11119)(1.03014,5.1075) + (1.03282,5.10369)(1.03549,5.09977)(1.03814,5.09574)(1.04077,5.0916) + (1.04339,5.08735)(1.046,5.08301)(1.04859,5.07856)(1.05117,5.07403) + (1.05374,5.0694)(1.0563,5.06468)(1.05884,5.05988)(1.06138,5.055) + (1.0639,5.05004)(1.06641,5.045)(1.06891,5.0399)(1.07141,5.03472) + (1.07389,5.02948)(1.07637,5.02418)(1.07884,5.01882)(1.0813,5.0134) + (1.08375,5.00793)(1.0862,5.00242)(1.08864,4.99685)(1.09107,4.99125) + (1.0935,4.98561)(1.09593,4.97993)(1.09835,4.97421)(1.10076,4.96847) + (1.10317,4.9627)(1.10558,4.95691)(1.10799,4.9511)(1.1104,4.94528) + (1.1128,4.93944)(1.1152,4.93359)(1.1176,4.92773)(1.12,4.92188) + (1.1224,4.91602)(1.1248,4.91016)(1.1272,4.90431)(1.1296,4.89847) + (1.13201,4.89265)(1.13442,4.88684)(1.13683,4.88105) + (1.13924,4.87528)(1.14165,4.86954)(1.14407,4.86382)(1.1465,4.85814) + (1.14893,4.8525)(1.15136,4.8469)(1.1538,4.84133)(1.15625,4.83582) + (1.1587,4.83035)(1.16116,4.82493)(1.16363,4.81957)(1.16611,4.81427) + (1.16859,4.80903)(1.17109,4.80385)(1.17359,4.79875)(1.1761,4.79371) + (1.17862,4.78875)(1.18116,4.78387)(1.1837,4.77907)(1.18626,4.77435) + (1.18883,4.76972)(1.19141,4.76519)(1.194,4.76074)(1.19661,4.7564) + (1.19923,4.75215)(1.20186,4.74801)(1.20451,4.74398) + (1.20718,4.74006)(1.20986,4.73625)(1.21255,4.73256) + (1.21526,4.72899)(1.21799,4.72554)(1.22074,4.72222) + (1.22351,4.71903)(1.22629,4.71598)(1.22909,4.71306) + (1.23191,4.71028)(1.23475,4.70764)(1.23761,4.70515) + (1.24049,4.70281)(1.24339,4.70063)(1.24631,4.69859) + (1.24926,4.69672)(1.25223,4.69501)(1.25522,4.69347)(1.25823,4.6921) + (1.26126,4.6909)(1.26432,4.68987)(1.26741,4.68903)(1.27052,4.68836) + (1.27365,4.68789)(1.27681,4.6876)(1.28,4.6875) +\path(1.28,4.6875)(1.6,4.6875) +\path(1.59287,4.6862)(1.59429,4.68854) +\path(1.58575,4.68491)(1.58858,4.68958) +\path(1.57862,4.68361)(1.58288,4.69061) +\path(1.5715,4.68232)(1.57717,4.69165) +\path(1.56437,4.68102)(1.57146,4.69269) +\path(1.55725,4.67973)(1.56575,4.69373) +\path(1.55012,4.67843)(1.56005,4.69476) +\path(1.543,4.67714)(1.55434,4.6958) +\path(1.54292,4.68744)(1.54863,4.69684) +\path(1.59185,4.68602)(1.58488,4.69025) +\path(1.58369,4.68453)(1.56976,4.693) +\path(1.57554,4.68305)(1.55464,4.69575) +\path(1.56738,4.68157)(1.54292,4.69643) +\path(1.55923,4.68009)(1.54292,4.68999) +\path(1.55108,4.6786)(1.54292,4.68356) +\path(1.54292,4.6875)(1.54292,4.67712)(1.6,4.6875)(1.54292,4.69788)(1.54292,4.6875) +\path(1.6,4.6875)(2.24,4.6875) +\path(2.22632,4.68501)(2.18292,4.69269) +\path(2.21185,4.68238)(2.18292,4.6875) +\path(2.19739,4.67975)(2.18292,4.68231) +\path(2.18811,4.69693)(2.18466,4.67744) +\path(2.1933,4.69599)(2.1902,4.67844) +\path(2.19849,4.69505)(2.19573,4.67945) +\path(2.20368,4.6941)(2.20126,4.68046) +\path(2.20887,4.69316)(2.2068,4.68146) +\path(2.21406,4.69222)(2.21233,4.68247) +\path(2.21924,4.69127)(2.21787,4.68348) +\path(2.22443,4.69033)(2.2234,4.68448) +\path(2.22962,4.68939)(2.22893,4.68549) +\path(2.23481,4.68844)(2.23447,4.68649) +\path(2.18292,4.6875)(2.18292,4.67712)(2.24,4.6875) + (2.18292,4.69788)(2.18292,4.6875) +\put(1.6,4.74285){\makebox(0,0)[b]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \texttt{dvi}}}}} +\put(1.6,4.6875){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(2.21793,4.71982){\makebox(0,0)[br]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \texttt{ps}}}}} +\put(2.24,4.6875){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(0.96,4.21875)(0.963187,4.21885)(0.966347,4.21914) + (0.969482,4.21961)(0.972591,4.22028)(0.975676,4.22112) + (0.978736,4.22215)(0.981772,4.22335)(0.984785,4.22472) + (0.987774,4.22626)(0.990741,4.22797)(0.993685,4.22984) + (0.996608,4.23188)(0.999509,4.23406)(1.00239,4.2364) + (1.00525,4.23889)(1.00809,4.24153)(1.01091,4.24431) + (1.01371,4.24723)(1.01649,4.25028)(1.01926,4.25347) + (1.02201,4.25679)(1.02474,4.26024)(1.02745,4.26381)(1.03014,4.2675) + (1.03282,4.27131)(1.03549,4.27523)(1.03814,4.27926)(1.04077,4.2834) + (1.04339,4.28765)(1.046,4.29199)(1.04859,4.29644)(1.05117,4.30097) + (1.05374,4.3056)(1.0563,4.31032)(1.05884,4.31512)(1.06138,4.32) + (1.0639,4.32496)(1.06641,4.33)(1.06891,4.3351)(1.07141,4.34028) + (1.07389,4.34552)(1.07637,4.35082)(1.07884,4.35618)(1.0813,4.3616) + (1.08375,4.36707)(1.0862,4.37258)(1.08864,4.37815)(1.09107,4.38375) + (1.0935,4.38939)(1.09593,4.39507)(1.09835,4.40079)(1.10076,4.40653) + (1.10317,4.4123)(1.10558,4.41809)(1.10799,4.4239)(1.1104,4.42972) + (1.1128,4.43556)(1.1152,4.44141)(1.1176,4.44727)(1.12,4.45312) + (1.1224,4.45898)(1.1248,4.46484)(1.1272,4.47069)(1.1296,4.47653) + (1.13201,4.48235)(1.13442,4.48816)(1.13683,4.49395) + (1.13924,4.49972)(1.14165,4.50546)(1.14407,4.51118)(1.1465,4.51686) + (1.14893,4.5225)(1.15136,4.5281)(1.1538,4.53367)(1.15625,4.53918) + (1.1587,4.54465)(1.16116,4.55007)(1.16363,4.55543)(1.16611,4.56073) + (1.16859,4.56597)(1.17109,4.57115)(1.17359,4.57625)(1.1761,4.58129) + (1.17862,4.58625)(1.18116,4.59113)(1.1837,4.59593)(1.18626,4.60065) + (1.18883,4.60528)(1.19141,4.60981)(1.194,4.61426)(1.19661,4.6186) + (1.19923,4.62285)(1.20186,4.62699)(1.20451,4.63102) + (1.20718,4.63494)(1.20986,4.63875)(1.21255,4.64244) + (1.21526,4.64601)(1.21799,4.64946)(1.22074,4.65278) + (1.22351,4.65597)(1.22629,4.65902)(1.22909,4.66194) + (1.23191,4.66472)(1.23475,4.66736)(1.23761,4.66985) + (1.24049,4.67219)(1.24339,4.67437)(1.24631,4.67641) + (1.24926,4.67828)(1.25223,4.67999)(1.25522,4.68153)(1.25823,4.6829) + (1.26126,4.6841)(1.26432,4.68513)(1.26741,4.68597)(1.27052,4.68664) + (1.27365,4.68711)(1.27681,4.6874)(1.28,4.6875) +\put(0.97999,4.16019){\makebox(0,0)[t]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \texttt{tex}}}}} +\put(0.96,4.21875){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(2.24,4.6875)(2.24533,4.67972)(2.25067,4.67201)(2.256,4.66436) + (2.26133,4.65677)(2.26667,4.64925)(2.272,4.6418)(2.27733,4.63441) + (2.28267,4.62708)(2.288,4.61982)(2.29333,4.61263)(2.29867,4.6055) + (2.304,4.59844)(2.30933,4.59144)(2.31467,4.58451)(2.32,4.57764) + (2.32533,4.57083)(2.33067,4.5641)(2.336,4.55742)(2.34133,4.55081) + (2.34667,4.54427)(2.352,4.53779)(2.35733,4.53138)(2.36267,4.52503) + (2.368,4.51875)(2.37333,4.51253)(2.37867,4.50638)(2.384,4.50029) + (2.38933,4.49427)(2.39467,4.48831)(2.4,4.48242)(2.40533,4.4766) + (2.41067,4.47083)(2.416,4.46514)(2.42133,4.45951)(2.42667,4.45394) + (2.432,4.44844)(2.43733,4.443)(2.44267,4.43763)(2.448,4.43232) + (2.45333,4.42708)(2.45867,4.42191)(2.464,4.4168)(2.46933,4.41175) + (2.47467,4.40677)(2.48,4.40186)(2.48533,4.39701)(2.49067,4.39222) + (2.496,4.3875)(2.50133,4.38285)(2.50667,4.37826)(2.512,4.37373) + (2.51733,4.36927)(2.52267,4.36488)(2.528,4.36055)(2.53333,4.35628) + (2.53867,4.35208)(2.544,4.34795)(2.54933,4.34388)(2.55467,4.33988) + (2.56,4.33594)(2.56533,4.33206)(2.57067,4.32826)(2.576,4.32451) + (2.58133,4.32083)(2.58667,4.31722)(2.592,4.31367)(2.59733,4.31019) + (2.60267,4.30677)(2.608,4.30342)(2.61333,4.30013)(2.61867,4.29691) + (2.624,4.29375)(2.62933,4.29066)(2.63467,4.28763)(2.64,4.28467) + (2.64533,4.28177)(2.65067,4.27894)(2.656,4.27617)(2.66133,4.27347) + (2.66667,4.27083)(2.672,4.26826)(2.67733,4.26576)(2.68267,4.26331) + (2.688,4.26094)(2.69333,4.25863)(2.69867,4.25638)(2.704,4.2542) + (2.70933,4.25208)(2.71467,4.25003)(2.72,4.24805)(2.72533,4.24613) + (2.73067,4.24427)(2.736,4.24248)(2.74133,4.24076)(2.74667,4.2391) + (2.752,4.2375)(2.75733,4.23597)(2.76267,4.23451)(2.768,4.23311) + (2.77333,4.23177)(2.77867,4.2305)(2.784,4.2293)(2.78933,4.22816) + (2.79467,4.22708)(2.8,4.22607)(2.80533,4.22513)(2.81067,4.22425) + (2.816,4.22344)(2.82133,4.22269)(2.82667,4.22201)(2.832,4.22139) + (2.83733,4.22083)(2.84267,4.22035)(2.848,4.21992)(2.85333,4.21956) + (2.85867,4.21927)(2.864,4.21904)(2.86933,4.21888)(2.87467,4.21878)(2.88,4.21875) +\path(2.82416,4.22925)(2.82805,4.20963) +\path(2.82975,4.2282)(2.83325,4.21054) +\path(2.83533,4.22715)(2.83844,4.21146) +\path(2.84091,4.2261)(2.84364,4.21237) +\path(2.8465,4.22505)(2.84883,4.21328) +\path(2.85208,4.224)(2.85403,4.21419) +\path(2.85767,4.22295)(2.85922,4.2151) +\path(2.86325,4.2219)(2.86442,4.21601) +\path(2.86883,4.22085)(2.86961,4.21693) +\path(2.87442,4.2198)(2.87481,4.21784) +\path(2.82289,4.21293)(2.86575,4.22143) +\path(2.82292,4.21845)(2.85149,4.22411) +\path(2.82295,4.22396)(2.83724,4.22679) +\path(2.82292,4.2191)(2.82286,4.20872)(2.88,4.21875) + (2.82299,4.22948)(2.82292,4.2191) +\put(2.93535,4.21875){\makebox(0,0)[l]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \texttt{pdf}}}}} +\put(2.88,4.21875){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(2.24,4.6875)(2.24533,4.69528)(2.25067,4.70299)(2.256,4.71064) + (2.26133,4.71823)(2.26667,4.72575)(2.272,4.7332)(2.27733,4.74059) + (2.28267,4.74792)(2.288,4.75518)(2.29333,4.76237)(2.29867,4.7695) + (2.304,4.77656)(2.30933,4.78356)(2.31467,4.79049)(2.32,4.79736) + (2.32533,4.80417)(2.33067,4.8109)(2.336,4.81758)(2.34133,4.82419) + (2.34667,4.83073)(2.352,4.83721)(2.35733,4.84362)(2.36267,4.84997) + (2.368,4.85625)(2.37333,4.86247)(2.37867,4.86862)(2.384,4.87471) + (2.38933,4.88073)(2.39467,4.88669)(2.4,4.89258)(2.40533,4.8984) + (2.41067,4.90417)(2.416,4.90986)(2.42133,4.91549)(2.42667,4.92106) + (2.432,4.92656)(2.43733,4.932)(2.44267,4.93737)(2.448,4.94268) + (2.45333,4.94792)(2.45867,4.95309)(2.464,4.9582)(2.46933,4.96325) + (2.47467,4.96823)(2.48,4.97314)(2.48533,4.97799)(2.49067,4.98278) + (2.496,4.9875)(2.50133,4.99215)(2.50667,4.99674)(2.512,5.00127) + (2.51733,5.00573)(2.52267,5.01012)(2.528,5.01445)(2.53333,5.01872) + (2.53867,5.02292)(2.544,5.02705)(2.54933,5.03112)(2.55467,5.03512) + (2.56,5.03906)(2.56533,5.04294)(2.57067,5.04674)(2.576,5.05049) + (2.58133,5.05417)(2.58667,5.05778)(2.592,5.06133)(2.59733,5.06481) + (2.60267,5.06823)(2.608,5.07158)(2.61333,5.07487)(2.61867,5.07809) + (2.624,5.08125)(2.62933,5.08434)(2.63467,5.08737)(2.64,5.09033) + (2.64533,5.09323)(2.65067,5.09606)(2.656,5.09883)(2.66133,5.10153) + (2.66667,5.10417)(2.672,5.10674)(2.67733,5.10924)(2.68267,5.11169) + (2.688,5.11406)(2.69333,5.11637)(2.69867,5.11862)(2.704,5.1208) + (2.70933,5.12292)(2.71467,5.12497)(2.72,5.12695)(2.72533,5.12887) + (2.73067,5.13073)(2.736,5.13252)(2.74133,5.13424)(2.74667,5.1359) + (2.752,5.1375)(2.75733,5.13903)(2.76267,5.14049)(2.768,5.14189) + (2.77333,5.14323)(2.77867,5.1445)(2.784,5.1457)(2.78933,5.14684) + (2.79467,5.14792)(2.8,5.14893)(2.80533,5.14987)(2.81067,5.15075) + (2.816,5.15156)(2.82133,5.15231)(2.82667,5.15299)(2.832,5.15361) + (2.83733,5.15417)(2.84267,5.15465)(2.848,5.15508)(2.85333,5.15544) + (2.85867,5.15573)(2.864,5.15596)(2.86933,5.15612)(2.87467,5.15622)(2.88,5.15625) +\path(2.86706,5.15382)(2.87286,5.1575) +\path(2.85412,5.15138)(2.86572,5.15876) +\path(2.84118,5.14895)(2.85857,5.16001) +\path(2.82824,5.14651)(2.85143,5.16126) +\path(2.82297,5.14896)(2.84429,5.16252) +\path(2.82293,5.15473)(2.83715,5.16377) +\path(2.8229,5.1605)(2.83,5.16503) +\path(2.8743,5.15518)(2.87281,5.15751) +\path(2.8686,5.1541)(2.86563,5.15877) +\path(2.8629,5.15303)(2.85844,5.16003) +\path(2.85719,5.15196)(2.85126,5.1613) +\path(2.85149,5.15089)(2.84407,5.16256) +\path(2.84579,5.14981)(2.83688,5.16382) +\path(2.84009,5.14874)(2.8297,5.16508) +\path(2.83439,5.14767)(2.82286,5.16579) +\path(2.82869,5.1466)(2.82292,5.15566) +\path(2.82292,5.1559)(2.82299,5.14552)(2.88,5.15625) + (2.82286,5.16628)(2.82292,5.1559) +\put(2.86001,5.21481){\makebox(0,0)[b]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \texttt{eps}}}}} +\put(2.88,5.15625){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(2.88,5.15625)(3.52,5.15625) +\path(3.51287,5.15495)(3.50817,5.1584) +\path(3.50573,5.15366)(3.49634,5.16055) +\path(3.4986,5.15236)(3.48451,5.1627) +\path(3.49146,5.15106)(3.47268,5.16485) +\path(3.48433,5.14976)(3.46292,5.16548) +\path(3.47719,5.14847)(3.46292,5.15895) +\path(3.47006,5.14717)(3.46292,5.15241) +\path(3.46863,5.16559)(3.46292,5.15782) +\path(3.47434,5.16455)(3.46292,5.14901) +\path(3.48005,5.16351)(3.46773,5.14675) +\path(3.48575,5.16248)(3.4752,5.1481) +\path(3.49146,5.16144)(3.48267,5.14946) +\path(3.49717,5.1604)(3.49013,5.15082) +\path(3.50288,5.15936)(3.4976,5.15218) +\path(3.50858,5.15833)(3.50507,5.15353) +\path(3.51429,5.15729)(3.51253,5.15489) +\path(3.46292,5.15625)(3.46292,5.14587)(3.52,5.15625) + (3.46292,5.16663)(3.46292,5.15625) +\put(3.57535,5.15625){\makebox(0,0)[l]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \begin{minipage}{0.225in}\texttt{png mng gif}\end{minipage}}}}} +\put(3.52,5.15625){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(1.92,4.21875){\makebox(0,0)[c]{\hbox{\color{rgb_009800}\texttt{\Large epix}}}} +\allinethickness{1.2pt}% +\color{rgb_ff0000}% +\path(0.32,3.28125)(0.96,3.28125) +\allinethickness{0.0055348in}% +\path(0.908111,3.29068)(0.902922,3.27138) +\path(0.9133,3.28974)(0.9085,3.27189) +\path(0.918489,3.2888)(0.914223,3.27293) +\path(0.923678,3.28785)(0.919945,3.27397) +\path(0.928867,3.28691)(0.925667,3.27501) +\path(0.934056,3.28597)(0.931389,3.27605) +\path(0.939244,3.28502)(0.937111,3.27709) +\path(0.944433,3.28408)(0.942833,3.27813) +\path(0.949622,3.28314)(0.948556,3.27917) +\path(0.954811,3.28219)(0.954278,3.28021) +\path(0.902922,3.27602)(0.914338,3.27295) +\path(0.902922,3.28116)(0.925753,3.27502) +\path(0.902922,3.28631)(0.937169,3.2771) +\path(0.902922,3.29145)(0.948584,3.27917) +\allinethickness{1.2pt}% +\path(0.902922,3.28125)(0.902922,3.27087)(0.96,3.28125) + (0.902922,3.29163)(0.902922,3.28125) +\put(0.32,3.3366){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{xp}, \texttt{flx}}}}}} +\put(0.32,3.28125){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(0.97999,3.33981){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{eepic}}}}}} +\put(0.96,3.28125){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(0.96,3.28125)(0.963187,3.28115)(0.966347,3.28086) + (0.969482,3.28039)(0.972591,3.27972)(0.975676,3.27888) + (0.978736,3.27785)(0.981772,3.27665)(0.984785,3.27528) + (0.987774,3.27374)(0.990741,3.27203)(0.993685,3.27016) + (0.996608,3.26813)(0.999509,3.26594)(1.00239,3.2636) + (1.00525,3.26111)(1.00809,3.25847)(1.01091,3.25569) + (1.01371,3.25277)(1.01649,3.24972)(1.01926,3.24653) + (1.02201,3.24321)(1.02474,3.23976)(1.02745,3.23619)(1.03014,3.2325) + (1.03282,3.22869)(1.03549,3.22477)(1.03814,3.22074)(1.04077,3.2166) + (1.04339,3.21235)(1.046,3.20801)(1.04859,3.20356)(1.05117,3.19903) + (1.05374,3.1944)(1.0563,3.18968)(1.05884,3.18488)(1.06138,3.18) + (1.0639,3.17504)(1.06641,3.17)(1.06891,3.1649)(1.07141,3.15972) + (1.07389,3.15448)(1.07637,3.14918)(1.07884,3.14382)(1.0813,3.1384) + (1.08375,3.13293)(1.0862,3.12742)(1.08864,3.12185)(1.09107,3.11625) + (1.0935,3.11061)(1.09593,3.10493)(1.09835,3.09921)(1.10076,3.09347) + (1.10317,3.0877)(1.10558,3.08191)(1.10799,3.0761)(1.1104,3.07028) + (1.1128,3.06444)(1.1152,3.05859)(1.1176,3.05273)(1.12,3.04688) + (1.1224,3.04102)(1.1248,3.03516)(1.1272,3.02931)(1.1296,3.02347) + (1.13201,3.01765)(1.13442,3.01184)(1.13683,3.00605) + (1.13924,3.00028)(1.14165,2.99454)(1.14407,2.98882)(1.1465,2.98314) + (1.14893,2.9775)(1.15136,2.9719)(1.1538,2.96633)(1.15625,2.96082) + (1.1587,2.95535)(1.16116,2.94993)(1.16363,2.94457)(1.16611,2.93927) + (1.16859,2.93403)(1.17109,2.92885)(1.17359,2.92375)(1.1761,2.91871) + (1.17862,2.91375)(1.18116,2.90887)(1.1837,2.90407)(1.18626,2.89935) + (1.18883,2.89472)(1.19141,2.89019)(1.194,2.88574)(1.19661,2.8814) + (1.19923,2.87715)(1.20186,2.87301)(1.20451,2.86898) + (1.20718,2.86506)(1.20986,2.86125)(1.21255,2.85756) + (1.21526,2.85399)(1.21799,2.85054)(1.22074,2.84722) + (1.22351,2.84403)(1.22629,2.84098)(1.22909,2.83806) + (1.23191,2.83528)(1.23475,2.83264)(1.23761,2.83015) + (1.24049,2.82781)(1.24339,2.82563)(1.24631,2.82359) + (1.24926,2.82172)(1.25223,2.82001)(1.25522,2.81847)(1.25823,2.8171) + (1.26126,2.8159)(1.26432,2.81487)(1.26741,2.81403)(1.27052,2.81336) + (1.27365,2.81289)(1.27681,2.8126)(1.28,2.8125) +\path(1.28,2.8125)(1.6,2.8125) +\allinethickness{0.0055348in}% +\path(1.54292,2.80731)(1.59652,2.81313) +\path(1.54292,2.8125)(1.57865,2.81638) +\path(1.54292,2.81769)(1.56079,2.81963) +\path(1.59481,2.81156)(1.5946,2.81348) +\path(1.58962,2.81061)(1.5892,2.81446) +\path(1.58443,2.80967)(1.58381,2.81544) +\path(1.57924,2.80873)(1.57841,2.81643) +\path(1.57406,2.80778)(1.57301,2.81741) +\path(1.56887,2.80684)(1.56761,2.81839) +\path(1.56368,2.8059)(1.56221,2.81937) +\path(1.55849,2.80495)(1.55682,2.82035) +\path(1.5533,2.80401)(1.55142,2.82133) +\path(1.54811,2.80307)(1.54602,2.82231) +\allinethickness{1.2pt}% +\path(1.54292,2.8125)(1.54292,2.80212)(1.6,2.8125)(1.54292,2.82288)(1.54292,2.8125) +\path(1.6,2.8125)(2.24,2.8125) +\allinethickness{0.0055348in}% +\path(2.23481,2.81156)(2.23373,2.81364) +\path(2.22962,2.81061)(2.22746,2.81478) +\path(2.22443,2.80967)(2.22119,2.81592) +\path(2.21924,2.80873)(2.21492,2.81706) +\path(2.21406,2.80778)(2.20864,2.8182) +\path(2.20887,2.80684)(2.20237,2.81934) +\path(2.20368,2.8059)(2.1961,2.82048) +\path(2.19849,2.80495)(2.18983,2.82162) +\path(2.1933,2.80401)(2.18356,2.82276) +\path(2.18811,2.80307)(2.18292,2.81306) +\path(2.19108,2.8214)(2.18292,2.81716) +\path(2.19923,2.81991)(2.18292,2.81144) +\path(2.20738,2.81843)(2.18292,2.80573) +\path(2.21554,2.81695)(2.18919,2.80326) +\path(2.22369,2.81547)(2.20612,2.80634) +\path(2.23185,2.81398)(2.22306,2.80942) +\allinethickness{1.2pt}% +\path(2.18292,2.8125)(2.18292,2.80212)(2.24,2.8125) + (2.18292,2.82288)(2.18292,2.8125) +\put(1.6,2.86785){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{dvi}}}}}} +\put(1.6,2.8125){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(2.21793,2.84482){\makebox(0,0)[br]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{ps}}}}}} +\put(2.24,2.8125){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\allinethickness{0.4pt}% +\color{rgb_7f7f7f}% +\path(0.96,2.34375)(0.963187,2.34385)(0.966347,2.34414) + (0.969482,2.34461)(0.972591,2.34528)(0.975676,2.34612) + (0.978736,2.34715)(0.981772,2.34835)(0.984785,2.34972) + (0.987774,2.35126)(0.990741,2.35297)(0.993685,2.35484) + (0.996608,2.35688)(0.999509,2.35906)(1.00239,2.3614) + (1.00525,2.36389)(1.00809,2.36653)(1.01091,2.36931) + (1.01371,2.37223)(1.01649,2.37528)(1.01926,2.37847) + (1.02201,2.38179)(1.02474,2.38524)(1.02745,2.38881)(1.03014,2.3925) + (1.03282,2.39631)(1.03549,2.40023)(1.03814,2.40426)(1.04077,2.4084) + (1.04339,2.41265)(1.046,2.41699)(1.04859,2.42144)(1.05117,2.42597) + (1.05374,2.4306)(1.0563,2.43532)(1.05884,2.44012)(1.06138,2.445) + (1.0639,2.44996)(1.06641,2.455)(1.06891,2.4601)(1.07141,2.46528) + (1.07389,2.47052)(1.07637,2.47582)(1.07884,2.48118)(1.0813,2.4866) + (1.08375,2.49207)(1.0862,2.49758)(1.08864,2.50315)(1.09107,2.50875) + (1.0935,2.51439)(1.09593,2.52007)(1.09835,2.52579)(1.10076,2.53153) + (1.10317,2.5373)(1.10558,2.54309)(1.10799,2.5489)(1.1104,2.55472) + (1.1128,2.56056)(1.1152,2.56641)(1.1176,2.57227)(1.12,2.57812) + (1.1224,2.58398)(1.1248,2.58984)(1.1272,2.59569)(1.1296,2.60153) + (1.13201,2.60735)(1.13442,2.61316)(1.13683,2.61895) + (1.13924,2.62472)(1.14165,2.63046)(1.14407,2.63618)(1.1465,2.64186) + (1.14893,2.6475)(1.15136,2.6531)(1.1538,2.65867)(1.15625,2.66418) + (1.1587,2.66965)(1.16116,2.67507)(1.16363,2.68043)(1.16611,2.68573) + (1.16859,2.69097)(1.17109,2.69615)(1.17359,2.70125)(1.1761,2.70629) + (1.17862,2.71125)(1.18116,2.71613)(1.1837,2.72093)(1.18626,2.72565) + (1.18883,2.73028)(1.19141,2.73481)(1.194,2.73926)(1.19661,2.7436) + (1.19923,2.74785)(1.20186,2.75199)(1.20451,2.75602) + (1.20718,2.75994)(1.20986,2.76375)(1.21255,2.76744) + (1.21526,2.77101)(1.21799,2.77446)(1.22074,2.77778) + (1.22351,2.78097)(1.22629,2.78402)(1.22909,2.78694) + (1.23191,2.78972)(1.23475,2.79236)(1.23761,2.79485) + (1.24049,2.79719)(1.24339,2.79937)(1.24631,2.80141) + (1.24926,2.80328)(1.25223,2.80499)(1.25522,2.80653)(1.25823,2.8079) + (1.26126,2.8091)(1.26432,2.81013)(1.26741,2.81097)(1.27052,2.81164) + (1.27365,2.81211)(1.27681,2.8124)(1.28,2.8125) +\put(0.97999,2.28519){\makebox(0,0)[t]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \texttt{tex}}}}} +\put(0.96,2.34375){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\allinethickness{1.2pt}% +\color{rgb_ff0000}% +\path(2.24,2.8125)(2.24533,2.80472)(2.25067,2.79701)(2.256,2.78936) + (2.26133,2.78177)(2.26667,2.77425)(2.272,2.7668)(2.27733,2.75941) + (2.28267,2.75208)(2.288,2.74482)(2.29333,2.73763)(2.29867,2.7305) + (2.304,2.72344)(2.30933,2.71644)(2.31467,2.70951)(2.32,2.70264) + (2.32533,2.69583)(2.33067,2.6891)(2.336,2.68242)(2.34133,2.67581) + (2.34667,2.66927)(2.352,2.66279)(2.35733,2.65638)(2.36267,2.65003) + (2.368,2.64375)(2.37333,2.63753)(2.37867,2.63138)(2.384,2.62529) + (2.38933,2.61927)(2.39467,2.61331)(2.4,2.60742)(2.40533,2.6016) + (2.41067,2.59583)(2.416,2.59014)(2.42133,2.58451)(2.42667,2.57894) + (2.432,2.57344)(2.43733,2.568)(2.44267,2.56263)(2.448,2.55732) + (2.45333,2.55208)(2.45867,2.54691)(2.464,2.5418)(2.46933,2.53675) + (2.47467,2.53177)(2.48,2.52686)(2.48533,2.52201)(2.49067,2.51722) + (2.496,2.5125)(2.50133,2.50785)(2.50667,2.50326)(2.512,2.49873) + (2.51733,2.49427)(2.52267,2.48988)(2.528,2.48555)(2.53333,2.48128) + (2.53867,2.47708)(2.544,2.47295)(2.54933,2.46888)(2.55467,2.46488) + (2.56,2.46094)(2.56533,2.45706)(2.57067,2.45326)(2.576,2.44951) + (2.58133,2.44583)(2.58667,2.44222)(2.592,2.43867)(2.59733,2.43519) + (2.60267,2.43177)(2.608,2.42842)(2.61333,2.42513)(2.61867,2.42191) + (2.624,2.41875)(2.62933,2.41566)(2.63467,2.41263)(2.64,2.40967) + (2.64533,2.40677)(2.65067,2.40394)(2.656,2.40117)(2.66133,2.39847) + (2.66667,2.39583)(2.672,2.39326)(2.67733,2.39076)(2.68267,2.38831) + (2.688,2.38594)(2.69333,2.38363)(2.69867,2.38138)(2.704,2.3792) + (2.70933,2.37708)(2.71467,2.37503)(2.72,2.37305)(2.72533,2.37113) + (2.73067,2.36927)(2.736,2.36748)(2.74133,2.36576)(2.74667,2.3641) + (2.752,2.3625)(2.75733,2.36097)(2.76267,2.35951)(2.768,2.35811) + (2.77333,2.35677)(2.77867,2.3555)(2.784,2.3543)(2.78933,2.35316) + (2.79467,2.35208)(2.8,2.35107)(2.80533,2.35013)(2.81067,2.34925) + (2.816,2.34844)(2.82133,2.34769)(2.82667,2.34701)(2.832,2.34639) + (2.83733,2.34583)(2.84267,2.34535)(2.848,2.34492)(2.85333,2.34456) + (2.85867,2.34427)(2.864,2.34404)(2.86933,2.34388)(2.87467,2.34378)(2.88,2.34375) +\allinethickness{0.0055348in}% +\path(2.82869,2.3534)(2.82294,2.34686) +\path(2.83439,2.35233)(2.82289,2.33925) +\path(2.84009,2.35126)(2.82501,2.3341) +\path(2.84579,2.35019)(2.83287,2.33548) +\path(2.85149,2.34911)(2.84072,2.33686) +\path(2.85719,2.34804)(2.84858,2.33823) +\path(2.8629,2.34697)(2.85643,2.33961) +\path(2.8686,2.3459)(2.86429,2.34099) +\path(2.8743,2.34482)(2.87214,2.34237) +\path(2.8229,2.34038)(2.82921,2.33484) +\path(2.82294,2.34704)(2.83556,2.33595) +\path(2.82298,2.35369)(2.84191,2.33706) +\path(2.83154,2.35287)(2.84826,2.33818) +\path(2.84123,2.35104)(2.8546,2.33929) +\path(2.85092,2.34922)(2.86095,2.34041) +\path(2.86062,2.3474)(2.8673,2.34152) +\path(2.87031,2.34557)(2.87365,2.34264) +\allinethickness{1.2pt}% +\path(2.82292,2.3441)(2.82286,2.33372)(2.88,2.34375) + (2.82299,2.35448)(2.82292,2.3441) +\put(2.93535,2.34375){\makebox(0,0)[l]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{pdf}}}}}} +\put(2.88,2.34375){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(2.24,2.8125)(2.24533,2.82028)(2.25067,2.82799)(2.256,2.83564) + (2.26133,2.84323)(2.26667,2.85075)(2.272,2.8582)(2.27733,2.86559) + (2.28267,2.87292)(2.288,2.88018)(2.29333,2.88737)(2.29867,2.8945) + (2.304,2.90156)(2.30933,2.90856)(2.31467,2.91549)(2.32,2.92236) + (2.32533,2.92917)(2.33067,2.9359)(2.336,2.94258)(2.34133,2.94919) + (2.34667,2.95573)(2.352,2.96221)(2.35733,2.96862)(2.36267,2.97497) + (2.368,2.98125)(2.37333,2.98747)(2.37867,2.99362)(2.384,2.99971) + (2.38933,3.00573)(2.39467,3.01169)(2.4,3.01758)(2.40533,3.0234) + (2.41067,3.02917)(2.416,3.03486)(2.42133,3.04049)(2.42667,3.04606) + (2.432,3.05156)(2.43733,3.057)(2.44267,3.06237)(2.448,3.06768) + (2.45333,3.07292)(2.45867,3.07809)(2.464,3.0832)(2.46933,3.08825) + (2.47467,3.09323)(2.48,3.09814)(2.48533,3.10299)(2.49067,3.10778) + (2.496,3.1125)(2.50133,3.11715)(2.50667,3.12174)(2.512,3.12627) + (2.51733,3.13073)(2.52267,3.13512)(2.528,3.13945)(2.53333,3.14372) + (2.53867,3.14792)(2.544,3.15205)(2.54933,3.15612)(2.55467,3.16012) + (2.56,3.16406)(2.56533,3.16794)(2.57067,3.17174)(2.576,3.17549) + (2.58133,3.17917)(2.58667,3.18278)(2.592,3.18633)(2.59733,3.18981) + (2.60267,3.19323)(2.608,3.19658)(2.61333,3.19987)(2.61867,3.20309) + (2.624,3.20625)(2.62933,3.20934)(2.63467,3.21237)(2.64,3.21533) + (2.64533,3.21823)(2.65067,3.22106)(2.656,3.22383)(2.66133,3.22653) + (2.66667,3.22917)(2.672,3.23174)(2.67733,3.23424)(2.68267,3.23669) + (2.688,3.23906)(2.69333,3.24137)(2.69867,3.24362)(2.704,3.2458) + (2.70933,3.24792)(2.71467,3.24997)(2.72,3.25195)(2.72533,3.25387) + (2.73067,3.25573)(2.736,3.25752)(2.74133,3.25924)(2.74667,3.2609) + (2.752,3.2625)(2.75733,3.26403)(2.76267,3.26549)(2.768,3.26689) + (2.77333,3.26823)(2.77867,3.2695)(2.784,3.2707)(2.78933,3.27184) + (2.79467,3.27292)(2.8,3.27393)(2.80533,3.27487)(2.81067,3.27575) + (2.816,3.27656)(2.82133,3.27731)(2.82667,3.27799)(2.832,3.27861) + (2.83733,3.27917)(2.84267,3.27965)(2.848,3.28008)(2.85333,3.28044) + (2.85867,3.28073)(2.864,3.28096)(2.86933,3.28112)(2.87467,3.28122)(2.88,3.28125) +\allinethickness{0.0055348in}% +\path(2.82295,3.27579)(2.83249,3.27231) +\path(2.82292,3.28106)(2.84199,3.2741) +\path(2.82289,3.28633)(2.85149,3.27589) +\path(2.82456,3.29098)(2.861,3.27767) +\path(2.85228,3.28612)(2.8705,3.27946) +\path(2.87406,3.28013)(2.87481,3.28216) +\path(2.86813,3.27902)(2.86961,3.28307) +\path(2.86219,3.2779)(2.86442,3.28399) +\path(2.85626,3.27678)(2.85922,3.2849) +\path(2.85032,3.27567)(2.85403,3.28581) +\path(2.84439,3.27455)(2.84883,3.28672) +\path(2.83845,3.27343)(2.84364,3.28763) +\path(2.83252,3.27232)(2.83844,3.28854) +\path(2.82658,3.2712)(2.83325,3.28946) +\path(2.82295,3.27639)(2.82805,3.29037) +\allinethickness{1.2pt}% +\path(2.82292,3.2809)(2.82299,3.27052)(2.88,3.28125) + (2.82286,3.29128)(2.82292,3.2809) +\put(2.86001,3.33981){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{eps}}}}}} +\put(2.88,3.28125){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\allinethickness{0.4pt}% +\color{rgb_7f7f7f}% +\path(2.88,3.28125)(3.52,3.28125) +\path(3.51481,3.28031)(3.51477,3.2822) +\path(3.50962,3.27936)(3.50954,3.28315) +\path(3.50443,3.27842)(3.50432,3.2841) +\path(3.49924,3.27748)(3.49909,3.28505) +\path(3.49406,3.27653)(3.49386,3.286) +\path(3.48887,3.27559)(3.48863,3.28695) +\path(3.48368,3.27465)(3.4834,3.2879) +\path(3.47849,3.2737)(3.47818,3.28885) +\path(3.4733,3.27276)(3.47295,3.2898) +\path(3.46811,3.27182)(3.46772,3.29076) +\path(3.48855,3.28697)(3.46292,3.28644) +\path(3.51417,3.28231)(3.46292,3.28125) +\path(3.49512,3.27673)(3.46292,3.27606) +\path(3.46292,3.28125)(3.46292,3.27087)(3.52,3.28125) + (3.46292,3.29163)(3.46292,3.28125) +\put(3.57535,3.28125){\makebox(0,0)[l]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \begin{minipage}{0.225in}\texttt{png mng gif}\end{minipage}}}}} +\put(3.52,3.28125){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(1.92,2.34375){\makebox(0,0)[c]{\hbox{\color{rgb_009800}\texttt{\Large elaps}}}} +\allinethickness{1.2pt}% +\color{rgb_ff0000}% +\path(0.32,1.40625)(0.96,1.40625) +\allinethickness{0.0055348in}% +\path(0.912435,1.4149)(0.902922,1.41097) +\path(0.921948,1.41317)(0.902922,1.40531) +\path(0.931461,1.41144)(0.902922,1.39966) +\path(0.940974,1.40971)(0.91102,1.39734) +\path(0.950487,1.40798)(0.93551,1.4018) +\path(0.902922,1.40939)(0.908111,1.39682) +\path(0.905721,1.41612)(0.9133,1.39776) +\path(0.911752,1.41502)(0.918489,1.3987) +\path(0.917783,1.41393)(0.923678,1.39965) +\path(0.923814,1.41283)(0.928867,1.40059) +\path(0.929845,1.41173)(0.934056,1.40153) +\path(0.935876,1.41064)(0.939244,1.40248) +\path(0.941907,1.40954)(0.944433,1.40342) +\path(0.947938,1.40844)(0.949622,1.40436) +\path(0.953969,1.40735)(0.954811,1.40531) +\allinethickness{1.2pt}% +\path(0.902922,1.40625)(0.902922,1.39587)(0.96,1.40625) + (0.902922,1.41663)(0.902922,1.40625) +\put(0.32,1.4616){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{xp}, \texttt{flx}}}}}} +\put(0.32,1.40625){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(0.97999,1.46481){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{eepic}}}}}} +\put(0.96,1.40625){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(0.96,1.40625)(0.963187,1.40615)(0.966347,1.40586) + (0.969482,1.40539)(0.972591,1.40472)(0.975676,1.40388) + (0.978736,1.40285)(0.981772,1.40165)(0.984785,1.40028) + (0.987774,1.39874)(0.990741,1.39703)(0.993685,1.39516) + (0.996608,1.39313)(0.999509,1.39094)(1.00239,1.3886) + (1.00525,1.38611)(1.00809,1.38347)(1.01091,1.38069) + (1.01371,1.37777)(1.01649,1.37472)(1.01926,1.37153) + (1.02201,1.36821)(1.02474,1.36476)(1.02745,1.36119)(1.03014,1.3575) + (1.03282,1.35369)(1.03549,1.34977)(1.03814,1.34574)(1.04077,1.3416) + (1.04339,1.33735)(1.046,1.33301)(1.04859,1.32856)(1.05117,1.32403) + (1.05374,1.3194)(1.0563,1.31468)(1.05884,1.30988)(1.06138,1.305) + (1.0639,1.30004)(1.06641,1.295)(1.06891,1.2899)(1.07141,1.28472) + (1.07389,1.27948)(1.07637,1.27418)(1.07884,1.26882)(1.0813,1.2634) + (1.08375,1.25793)(1.0862,1.25242)(1.08864,1.24685)(1.09107,1.24125) + (1.0935,1.23561)(1.09593,1.22993)(1.09835,1.22421)(1.10076,1.21847) + (1.10317,1.2127)(1.10558,1.20691)(1.10799,1.2011)(1.1104,1.19528) + (1.1128,1.18944)(1.1152,1.18359)(1.1176,1.17773)(1.12,1.17188) + (1.1224,1.16602)(1.1248,1.16016)(1.1272,1.15431)(1.1296,1.14847) + (1.13201,1.14265)(1.13442,1.13684)(1.13683,1.13105) + (1.13924,1.12528)(1.14165,1.11954)(1.14407,1.11382)(1.1465,1.10814) + (1.14893,1.1025)(1.15136,1.0969)(1.1538,1.09133)(1.15625,1.08582) + (1.1587,1.08035)(1.16116,1.07493)(1.16363,1.06957)(1.16611,1.06427) + (1.16859,1.05903)(1.17109,1.05385)(1.17359,1.04875)(1.1761,1.04371) + (1.17862,1.03875)(1.18116,1.03387)(1.1837,1.02907)(1.18626,1.02435) + (1.18883,1.01972)(1.19141,1.01519)(1.194,1.01074)(1.19661,1.0064) + (1.19923,1.00215)(1.20186,0.998013)(1.20451,0.99398) + (1.20718,0.990058)(1.20986,0.98625)(1.21255,0.982559) + (1.21526,0.978989)(1.21799,0.975542)(1.22074,0.972222) + (1.22351,0.969033)(1.22629,0.965977)(1.22909,0.963057) + (1.23191,0.960278)(1.23475,0.957642)(1.23761,0.955152) + (1.24049,0.952812)(1.24339,0.950625)(1.24631,0.948594) + (1.24926,0.946723)(1.25223,0.945015)(1.25522,0.943472) + (1.25823,0.942099)(1.26126,0.940898)(1.26432,0.939874) + (1.26741,0.939028)(1.27052,0.938364)(1.27365,0.937886) + (1.27681,0.937597)(1.28,0.9375) +\path(1.28,0.9375)(1.6,0.9375) +\allinethickness{0.0055348in}% +\path(1.54292,0.934917)(1.54926,0.928275) +\path(1.54292,0.942712)(1.55561,0.929428) +\path(1.54596,0.947325)(1.56195,0.930581) +\path(1.55497,0.945688)(1.56829,0.931735) +\path(1.56397,0.94405)(1.57463,0.932888) +\path(1.57298,0.942413)(1.58097,0.934041) +\path(1.58199,0.940775)(1.58732,0.935194) +\path(1.59099,0.939138)(1.59366,0.936347) +\path(1.59067,0.935804)(1.59366,0.938653) +\path(1.58135,0.934109)(1.58732,0.939806) +\path(1.57202,0.932413)(1.58097,0.940959) +\path(1.5627,0.930718)(1.57463,0.942112) +\path(1.55337,0.929022)(1.56829,0.943265) +\path(1.54405,0.927327)(1.56195,0.944419) +\path(1.54292,0.933461)(1.55561,0.945572) +\path(1.54292,0.940669)(1.54926,0.946725) +\allinethickness{1.2pt}% +\path(1.54292,0.9375)(1.54292,0.927122)(1.6,0.9375) + (1.54292,0.947878)(1.54292,0.9375) +\path(1.6,0.9375)(2.24,0.9375) +\allinethickness{0.0055348in}% +\path(2.23385,0.936381)(2.23481,0.938443) +\path(2.22769,0.935262)(2.22962,0.939387) +\path(2.22154,0.934143)(2.22443,0.94033) +\path(2.21538,0.933024)(2.21924,0.941274) +\path(2.20923,0.931905)(2.21406,0.942217) +\path(2.20308,0.930787)(2.20887,0.943161) +\path(2.19692,0.929668)(2.20368,0.944104) +\path(2.19077,0.928549)(2.19849,0.945047) +\path(2.18461,0.92743)(2.1933,0.945991) +\path(2.18292,0.935846)(2.18811,0.946934) +\path(2.23185,0.936017)(2.22148,0.940867) +\path(2.22369,0.934535)(2.20297,0.944233) +\path(2.21554,0.933052)(2.18445,0.9476) +\path(2.20738,0.93157)(2.18292,0.943017) +\path(2.19923,0.930087)(2.18292,0.937719) +\path(2.19108,0.928605)(2.18292,0.93242) +\allinethickness{1.2pt}% +\path(2.18292,0.9375)(2.18292,0.927122)(2.24,0.9375) + (2.18292,0.947878)(2.18292,0.9375) +\put(1.6,0.992848){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{dvi}}}}}} +\put(1.6,0.9375){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(2.21793,0.969823){\makebox(0,0)[br]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{ps}}}}}} +\put(2.24,0.9375){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\allinethickness{0.4pt}% +\color{rgb_7f7f7f}% +\path(0.96,0.46875)(0.963187,0.468847)(0.966347,0.469136) + (0.969482,0.469614)(0.972591,0.470278)(0.975676,0.471124) + (0.978736,0.472148)(0.981772,0.473349)(0.984785,0.474722) + (0.987774,0.476265)(0.990741,0.477973)(0.993685,0.479844) + (0.996608,0.481875)(0.999509,0.484062)(1.00239,0.486402) + (1.00525,0.488892)(1.00809,0.491528)(1.01091,0.494307) + (1.01371,0.497227)(1.01649,0.500283)(1.01926,0.503472) + (1.02201,0.506792)(1.02474,0.510239)(1.02745,0.513809) + (1.03014,0.5175)(1.03282,0.521308)(1.03549,0.52523) + (1.03814,0.529263)(1.04077,0.533403)(1.04339,0.537647) + (1.046,0.541992)(1.04859,0.546435)(1.05117,0.550972) + (1.05374,0.555601)(1.0563,0.560317)(1.05884,0.565118)(1.06138,0.57) + (1.0639,0.57496)(1.06641,0.579996)(1.06891,0.585103) + (1.07141,0.590278)(1.07389,0.595518)(1.07637,0.60082) + (1.07884,0.606181)(1.0813,0.611597)(1.08375,0.617065) + (1.0862,0.622582)(1.08864,0.628145)(1.09107,0.63375) + (1.0935,0.639394)(1.09593,0.645074)(1.09835,0.650786) + (1.10076,0.656528)(1.10317,0.662295)(1.10558,0.668086) + (1.10799,0.673896)(1.1104,0.679722)(1.1128,0.685562) + (1.1152,0.691411)(1.1176,0.697266)(1.12,0.703125)(1.1224,0.708984) + (1.1248,0.714839)(1.1272,0.720688)(1.1296,0.726528) + (1.13201,0.732354)(1.13442,0.738164)(1.13683,0.743955) + (1.13924,0.749722)(1.14165,0.755464)(1.14407,0.761176) + (1.1465,0.766856)(1.14893,0.7725)(1.15136,0.778105) + (1.1538,0.783668)(1.15625,0.789185)(1.1587,0.794653) + (1.16116,0.800069)(1.16363,0.80543)(1.16611,0.810732) + (1.16859,0.815972)(1.17109,0.821147)(1.17359,0.826254) + (1.1761,0.83129)(1.17862,0.83625)(1.18116,0.841132) + (1.1837,0.845933)(1.18626,0.850649)(1.18883,0.855278) + (1.19141,0.859815)(1.194,0.864258)(1.19661,0.868603) + (1.19923,0.872847)(1.20186,0.876987)(1.20451,0.88102) + (1.20718,0.884942)(1.20986,0.88875)(1.21255,0.892441) + (1.21526,0.896011)(1.21799,0.899458)(1.22074,0.902778) + (1.22351,0.905967)(1.22629,0.909023)(1.22909,0.911943) + (1.23191,0.914722)(1.23475,0.917358)(1.23761,0.919848) + (1.24049,0.922188)(1.24339,0.924375)(1.24631,0.926406) + (1.24926,0.928277)(1.25223,0.929985)(1.25522,0.931528) + (1.25823,0.932901)(1.26126,0.934102)(1.26432,0.935126) + (1.26741,0.935972)(1.27052,0.936636)(1.27365,0.937114) + (1.27681,0.937403)(1.28,0.9375) +\put(0.97999,0.410187){\makebox(0,0)[t]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \texttt{tex}}}}} +\put(0.96,0.46875){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(2.24,0.9375)(2.24533,0.92972)(2.25067,0.922005) + (2.256,0.914355)(2.26133,0.906771)(2.26667,0.899251) + (2.272,0.891797)(2.27733,0.884408)(2.28267,0.877083) + (2.288,0.869824)(2.29333,0.86263)(2.29867,0.855501)(2.304,0.848438) + (2.30933,0.841439)(2.31467,0.834505)(2.32,0.827637) + (2.32533,0.820833)(2.33067,0.814095)(2.336,0.807422) + (2.34133,0.800814)(2.34667,0.794271)(2.352,0.787793) + (2.35733,0.78138)(2.36267,0.775033)(2.368,0.76875) + (2.37333,0.762533)(2.37867,0.75638)(2.384,0.750293) + (2.38933,0.744271)(2.39467,0.738314)(2.4,0.732422) + (2.40533,0.726595)(2.41067,0.720833)(2.416,0.715137) + (2.42133,0.709505)(2.42667,0.703939)(2.432,0.698438) + (2.43733,0.693001)(2.44267,0.68763)(2.448,0.682324) + (2.45333,0.677083)(2.45867,0.671908)(2.464,0.666797) + (2.46933,0.661751)(2.47467,0.656771)(2.48,0.651855) + (2.48533,0.647005)(2.49067,0.64222)(2.496,0.6375)(2.50133,0.632845) + (2.50667,0.628255)(2.512,0.62373)(2.51733,0.619271) + (2.52267,0.614876)(2.528,0.610547)(2.53333,0.606283) + (2.53867,0.602083)(2.544,0.597949)(2.54933,0.59388) + (2.55467,0.589876)(2.56,0.585938)(2.56533,0.582064) + (2.57067,0.578255)(2.576,0.574512)(2.58133,0.570833) + (2.58667,0.56722)(2.592,0.563672)(2.59733,0.560189) + (2.60267,0.556771)(2.608,0.553418)(2.61333,0.55013) + (2.61867,0.546908)(2.624,0.54375)(2.62933,0.540658) + (2.63467,0.53763)(2.64,0.534668)(2.64533,0.531771) + (2.65067,0.528939)(2.656,0.526172)(2.66133,0.52347) + (2.66667,0.520833)(2.672,0.518262)(2.67733,0.515755) + (2.68267,0.513314)(2.688,0.510937)(2.69333,0.508626) + (2.69867,0.50638)(2.704,0.504199)(2.70933,0.502083) + (2.71467,0.500033)(2.72,0.498047)(2.72533,0.496126) + (2.73067,0.494271)(2.736,0.49248)(2.74133,0.490755) + (2.74667,0.489095)(2.752,0.4875)(2.75733,0.48597)(2.76267,0.484505) + (2.768,0.483105)(2.77333,0.481771)(2.77867,0.480501) + (2.784,0.479297)(2.78933,0.478158)(2.79467,0.477083)(2.8,0.476074) + (2.80533,0.47513)(2.81067,0.474251)(2.816,0.473437) + (2.82133,0.472689)(2.82667,0.472005)(2.832,0.471387) + (2.83733,0.470833)(2.84267,0.470345)(2.848,0.469922) + (2.85333,0.469564)(2.85867,0.469271)(2.864,0.469043) + (2.86933,0.46888)(2.87467,0.468783)(2.88,0.46875) +\path(2.86583,0.471416)(2.82296,0.474287) +\path(2.86567,0.466235)(2.82292,0.469098) +\path(2.84427,0.462478)(2.82289,0.46391) +\path(2.82817,0.478501)(2.82689,0.459429) +\path(2.83335,0.477526)(2.8322,0.460361) +\path(2.83854,0.476551)(2.83751,0.461293) +\path(2.84372,0.475576)(2.84282,0.462225) +\path(2.8489,0.474601)(2.84814,0.463157) +\path(2.85408,0.473625)(2.85345,0.464089) +\path(2.85927,0.47265)(2.85876,0.465021) +\path(2.86445,0.471675)(2.86407,0.465954) +\path(2.86963,0.4707)(2.86938,0.466886) +\path(2.87482,0.469725)(2.87469,0.467818) +\path(2.82292,0.469098)(2.82286,0.458721)(2.88,0.46875) + (2.82299,0.479476)(2.82292,0.469098) +\put(2.93535,0.46875){\makebox(0,0)[l]{\hbox{\color{rgb_7f7f7f}\texttt{\footnotesize \texttt{pdf}}}}} +\put(2.88,0.46875){\color{rgb_7f7f7f}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\allinethickness{1.2pt}% +\color{rgb_ff0000}% +\path(2.24,0.9375)(2.24533,0.94528)(2.25067,0.952995) + (2.256,0.960645)(2.26133,0.968229)(2.26667,0.975749) + (2.272,0.983203)(2.27733,0.990592)(2.28267,0.997917)(2.288,1.00518) + (2.29333,1.01237)(2.29867,1.0195)(2.304,1.02656)(2.30933,1.03356) + (2.31467,1.04049)(2.32,1.04736)(2.32533,1.05417)(2.33067,1.0609) + (2.336,1.06758)(2.34133,1.07419)(2.34667,1.08073)(2.352,1.08721) + (2.35733,1.09362)(2.36267,1.09997)(2.368,1.10625)(2.37333,1.11247) + (2.37867,1.11862)(2.384,1.12471)(2.38933,1.13073)(2.39467,1.13669) + (2.4,1.14258)(2.40533,1.1484)(2.41067,1.15417)(2.416,1.15986) + (2.42133,1.16549)(2.42667,1.17106)(2.432,1.17656)(2.43733,1.182) + (2.44267,1.18737)(2.448,1.19268)(2.45333,1.19792)(2.45867,1.20309) + (2.464,1.2082)(2.46933,1.21325)(2.47467,1.21823)(2.48,1.22314) + (2.48533,1.22799)(2.49067,1.23278)(2.496,1.2375)(2.50133,1.24215) + (2.50667,1.24674)(2.512,1.25127)(2.51733,1.25573)(2.52267,1.26012) + (2.528,1.26445)(2.53333,1.26872)(2.53867,1.27292)(2.544,1.27705) + (2.54933,1.28112)(2.55467,1.28512)(2.56,1.28906)(2.56533,1.29294) + (2.57067,1.29674)(2.576,1.30049)(2.58133,1.30417)(2.58667,1.30778) + (2.592,1.31133)(2.59733,1.31481)(2.60267,1.31823)(2.608,1.32158) + (2.61333,1.32487)(2.61867,1.32809)(2.624,1.33125)(2.62933,1.33434) + (2.63467,1.33737)(2.64,1.34033)(2.64533,1.34323)(2.65067,1.34606) + (2.656,1.34883)(2.66133,1.35153)(2.66667,1.35417)(2.672,1.35674) + (2.67733,1.35924)(2.68267,1.36169)(2.688,1.36406)(2.69333,1.36637) + (2.69867,1.36862)(2.704,1.3708)(2.70933,1.37292)(2.71467,1.37497) + (2.72,1.37695)(2.72533,1.37887)(2.73067,1.38073)(2.736,1.38252) + (2.74133,1.38424)(2.74667,1.3859)(2.752,1.3875)(2.75733,1.38903) + (2.76267,1.39049)(2.768,1.39189)(2.77333,1.39323)(2.77867,1.3945) + (2.784,1.3957)(2.78933,1.39684)(2.79467,1.39792)(2.8,1.39893) + (2.80533,1.39987)(2.81067,1.40075)(2.816,1.40156)(2.82133,1.40231) + (2.82667,1.40299)(2.832,1.40361)(2.83733,1.40417)(2.84267,1.40465) + (2.848,1.40508)(2.85333,1.40544)(2.85867,1.40573)(2.864,1.40596) + (2.86933,1.40612)(2.87467,1.40622)(2.88,1.40625) +\allinethickness{0.0055348in}% +\path(2.82288,1.41337)(2.82817,1.3965) +\path(2.82772,1.41543)(2.83335,1.39747) +\path(2.83353,1.41441)(2.83854,1.39845) +\path(2.83934,1.41339)(2.84372,1.39942) +\path(2.84515,1.41237)(2.8489,1.4004) +\path(2.85096,1.41135)(2.85408,1.40137) +\path(2.85677,1.41033)(2.85927,1.40235) +\path(2.86257,1.40931)(2.86445,1.40332) +\path(2.86838,1.40829)(2.86963,1.4043) +\path(2.87419,1.40727)(2.87482,1.40527) +\path(2.83547,1.39787)(2.86857,1.40826) +\path(2.82296,1.39954)(2.85714,1.41026) +\path(2.82293,1.40512)(2.84572,1.41227) +\path(2.82289,1.4107)(2.83429,1.41427) +\allinethickness{1.2pt}% +\path(2.82292,1.4059)(2.82299,1.39552)(2.88,1.40625) + (2.82286,1.41628)(2.82292,1.4059) +\put(2.86001,1.46481){\makebox(0,0)[b]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \texttt{eps}}}}}} +\put(2.88,1.40625){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\path(2.88,1.40625)(3.52,1.40625) +\allinethickness{0.0055348in}% +\path(3.50867,1.40419)(3.51287,1.40755) +\path(3.49734,1.40213)(3.50573,1.40884) +\path(3.48601,1.40007)(3.4986,1.41014) +\path(3.47467,1.39801)(3.49146,1.41144) +\path(3.46334,1.39595)(3.48433,1.41274) +\path(3.46292,1.40262)(3.47719,1.41403) +\path(3.46292,1.40962)(3.47006,1.41533) +\path(3.51429,1.40521)(3.51235,1.40764) +\path(3.50858,1.40417)(3.5047,1.40903) +\path(3.50288,1.40314)(3.49705,1.41042) +\path(3.49717,1.4021)(3.4894,1.41181) +\path(3.49146,1.40106)(3.48175,1.41321) +\path(3.48575,1.40002)(3.47409,1.4146) +\path(3.48005,1.39899)(3.46644,1.41599) +\path(3.47434,1.39795)(3.46292,1.41222) +\path(3.46863,1.39691)(3.46292,1.40404) +\allinethickness{1.2pt}% +\path(3.46292,1.40625)(3.46292,1.39587)(3.52,1.40625) + (3.46292,1.41663)(3.46292,1.40625) +\put(3.57535,1.40625){\makebox(0,0)[l]{\fboxrule0.1pt% +\fcolorbox{rgb_ff0000}{cmy_000019}{\hbox{\color{rgb_0000ff}\texttt{\footnotesize \begin{minipage}{0.225in}\texttt{png mng gif}\end{minipage}}}}}} +\put(3.52,1.40625){\color{rgb_0000ff}$\allinethickness{0.0207555in}\circle{0.0207555}$}% +\put(1.92,0.46875){\makebox(0,0)[c]{\hbox{\color{rgb_009800}\texttt{\Large flix}}}} +\end{picture}% diff --git a/graphics/epix/doc/ePiX.xp b/graphics/epix/doc/ePiX.xp new file mode 100644 index 0000000000..c39e6b2ac0 --- /dev/null +++ b/graphics/epix/doc/ePiX.xp @@ -0,0 +1,156 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +void emph(const std::string& prog) +{ + if (prog == "all") + black(); + else + { + bbold(Red()); + label_color(Blue()); + label_mask(Yellow(0.1)); + label_border(Red(), "0.1pt"); + } +} + +void restore(const std::string& prog) +{ + if (prog == "all") + emph(prog); + + else + { + plain(); + black(0.5); + label_mask(Neutral()); + } +} + +void diagram(const std::string& prog) +{ + font_size("footnotesize"); + arrow_width(1.5); + restore(prog); + + if (prog != "laps") + emph(prog); + + arrow(P(0,1), P(1,1)); + + dot(P(0,1), P(0,4), "\\texttt{xp}, \\texttt{flx}", t); + dot(P(1,1), P(2,4), "\\texttt{eepic}", t); + restore(prog); + + if (prog != "epix") + emph(prog); + + spline(P(1,1), P(1.2,1), P(1.3,0.5), P(1.5,0.5)); + arrow(P(1.5,0.5), P(2,0.5)); + arrow(P(2,0.5), P(3,0.5)); + + dot(P(2,0.5), P(0,4), "\\texttt{dvi}", t); + dot(P(3,0.5), P(-2,2), "\\texttt{ps}", tl); + restore(prog); + + if(prog == "laps") + emph(prog); + + spline(P(1,0), P(1.2,0), P(1.3,0.5), P(1.5,0.5)); + + dot(P(1,0), P(2,-4), "\\texttt{tex}", b); + + if (prog == "elaps") // and laps + emph(prog); + + arrow(P(3,0.5), P(3.5,0), P(4,0)); + + dot(P(4,0), P(4,0), "\\texttt{pdf}", r); + restore(prog); + + if (prog == "elaps" || prog == "flix") + emph(prog); + + arrow(P(3,0.5), P(3.5,1), P(4,1)); + + dot(P(4,1), P(-2,4), "\\texttt{eps}", t); + restore(prog); + + if(prog == "flix") + emph(prog); + + arrow(P(4,1), P(5,1)); + + dot(P(5,1), P(4,0), + "\\begin{minipage}{0.225in}\\texttt{png mng gif}\\end{minipage}", r); + restore(prog); + + if (prog != "all") + { + font_size("Large"); + font_face("tt"); + label_color(Green(0.6)); + label(P(2.5,0), prog); + } + +} + +int main() +{ +#ifdef SHOW_ALL + picture(P(-0.5,0), P(5.75,10), "4 x 7.5 in"); +#else + picture(P(-0.5,2), P(5.75,10), "4 x 7.5 in"); +#endif + + begin(); + // border(); + + screen laps(P(0,0), P(5,1)); + activate(laps); + + diagram("laps"); + laps.v_scale(0.5, P(0,0.5)); + inset(laps, P(0,8), P(5,10)); + deactivate(laps); + + + screen epix(P(0,0), P(5,1)); + activate(epix); + + diagram("epix"); + epix.v_scale(0.5, P(0,0.5)); + inset(epix, P(0,6), P(5,8)); + deactivate(epix); + + + screen elaps(P(0,0), P(5,1)); + activate(elaps); + + diagram("elaps"); + elaps.v_scale(0.5, P(0,0.5)); + inset(elaps, P(0,4), P(5,6)); + deactivate(elaps); + + + screen flix(P(0,0), P(5,1)); + activate(flix); + + diagram("flix"); + flix.v_scale(0.5, P(0,0.5)); + inset(flix, P(0,2), P(5,4)); + deactivate(flix); + +#ifdef SHOW_ALL + screen all(P(0,0), P(5,1)); + activate(all); + + diagram("all"); + all.v_scale(0.5, P(0,0.5)); + inset(all, P(0,0), P(5,2)); + deactivate(all); +#endif + + end(); +} diff --git a/graphics/epix/doc/epix.info b/graphics/epix/doc/epix.info new file mode 100644 index 0000000000..3b30c42c39 --- /dev/null +++ b/graphics/epix/doc/epix.info @@ -0,0 +1,4696 @@ +This is epix.info, produced by makeinfo version 4.9 from epix.texi. + + This is the manual for ePiX, Version 1.2 Copyright (C) 2001, 2002, +2003, 2004, 2005, 2006, 2007 Andrew D. Hwang + + +File: epix.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) + +ePiX manual +*********** + +This is the manual for ePiX, Version 1.2 Copyright (C) 2001, 2002, +2003, 2004, 2005, 2006, 2007 Andrew D. Hwang + +* Menu: + +* Introduction :: +* Getting Started :: +* Reference Manual :: +* Advanced Topics :: +* Software Freedom:: +* Acknowledgments:: +* Function Index:: +* Concept Index:: + + --- The Detailed Node Listing --- + +Introduction + +* Changes in Version 1.2:: +* Software Dependencies:: +* Installation:: + +Getting Started + +* Running `ePiX':: +* The Drawing Model:: +* Tutorial:: +* `C++' Basics:: +* Animation:: +* Layout Tricks:: + +Reference Manual + +* File Structure:: +* Picture Size and Aspect Ratio:: +* Color:: +* Scene Attributes:: +* Drawing Attributes:: +* Creating and Drawing Objects:: +* More About `C++':: +* Attribute Quick Reference:: + +Advanced Topics + +* Hidden Object Removal:: +* Extensions:: +* Programmer's Guide:: + + +File: epix.info, Node: Introduction, Next: Getting Started, Prev: Top, Up: Top + +1 Introduction +************** + +`ePiX', a collection of batch utilities, creates mathematically +accurate figures, plots, and animations containing `LaTeX' typography. +The input syntax is easy to learn, and the user interface resembles +that of `LaTeX' itself: You prepare a scene description in a text +editor, then "compile" the input file into a picture. `LaTeX'- and +web-compatible output types include a `LaTeX' picture-like environment +written with `PSTricks', `tikz', or `eepic' macros; vector images +(`eps', `ps', and `pdf'); and bitmapped images and movies (`png', +`mng', and `gif'). + + `ePiX''s strengths include: + + * Quality of output: `ePiX' creates accurate, publication-quality + figures whose appearance matches that of `LaTeX'. Typography may + be put in a figure as easily as in an ordinary `LaTeX' document. + + * Ease of use: Figure objects and their attributes are specified + by simple, descriptive commands. + + * Flexibility: Objects are described by attributes and Cartesian + location; as in `LaTeX', printed appearance is determined when the + figure is compiled. A well-designed figure can be altered + dramatically, yet precisely, with command-line switches or minor + changes to the input file. + + * Power and extendibility: `ePiX' inherits the power of `C++' as a + programming language; variables, data structures, loops, and + recursion can be used to draw complicated plots and figures with + just a few lines of input. External code can be incorporated in a + figure with a command line option or by using a Makefile. + + * Economy of storage and transmission: For a document containing + many figures, a compressed tar file of the `LaTeX' sources and + `ePiX' files is typically a few percent the size of the compressed + PostScript file. + + * License: `ePiX' is _free software_. You are granted the right to + use the program for whatever purpose, and to inspect, modify, + and re-distribute the source code, so long as you do not + restrict the rights of others to do the same. In short, the + license is similar to the terms under which theorems are + published. + + + `ePiX' facilitates logical, as opposed to visual, structuring of +mathematical figures, analogous to the relationship between `LaTeX' and +a word processor. A few stylistic defaults streamline the creation of +simple figures, but there are few internal restrictions on the contents +or appearance of a figure; aesthetic and practical decisions are left +to you. + + If you are a: + + * Potential user, you may wish to skip immediately to "Software + Dependencies" before investing additional time. + + * New user, proceed from here until you have enough understanding + to run the software, then experiment with the samples files while + reading Chapter *Note chapter:started::, , or return to the + manual as needed. + + * More advanced user, browse at will, probably starting with + Chapter *Note chapter:ref-man::, . + + + This manual is relatively conversational, and occasionally redundant, +especially between portions meant for readers at different levels of +familiarity. Throughout, you are assumed to be familiar with `LaTeX' +and basic linear algebra: the description of points, vectors, lines, +and planes in three-dimensional space. Other material, such as `C++' +syntax, is introduced as needed. + +* Menu: + +* Changes in Version 1.2:: +* Software Dependencies:: +* Installation:: + + +File: epix.info, Node: Changes in Version 1.2, Next: Software Dependencies, Prev: Introduction, Up: Introduction + +1.1 Changes in Version 1.2 +========================== + +`ePiX' 1.2.x has been written almost entirely from scratch. The +conceptual model is unchanged, but there are a few changes of syntax. +If you're new to `ePiX', please skip straight to Section *Note +section:software_deps::, . + + + +Except as noted below, `ePiX' 1.0 files will compile under Version 1.2. +Generally, global variables have been deprecated or removed, and should +be replaced by function calls in new files. The following changes are +either required, or else strongly recommended (and may become +mandatory). + + * (Mandatory) The global variable tix in a `flix' file must be + manipulated through the function tix(). + + * (Mandatory) The command `use_pstricks()' is obsolete. PSTricks + output is obtained systematically as an output format. + + * (Mandatory) Deprecated "aliases" no longer exist: `triple' (for + the `P' class), `D' (for `Deriv'), and `I' (for `Integral'). + Lowercase trig function names conflicted with the standard + namespace and have been removed. + + * (Mandatory) Geometric object commands (`circle', `plane', + `segment', and `sphere'), which formerly created class objects, + now perform drawing just as `ellipse', `line', `rect', etc., do. + The classes are available with capitalized names (`Circle', + etc.). + + * (Mandatory) Camera orientation is controlled with functions + named `tilt', `pan', and `roll'; each rotates the camera about + an axis through the viewpoint, not through the target. + + * (Recommended) The global size variables x_min, x_max, y_min, + y_max, x_size, and y_size should be replaced by the function + calls xmin(), etc. (No underscores.) + + * (Suggested) The camera may be accessed through the function + `cam()'. + + * (Suggested) The size and bounding box are given in one command, + such as `picture(P(-1,0), P(1,1), "4x3in")'. The old syntax will + be retained indefinitely. + + + + + * Output is cleanly separated from the internal representation. + Figures may be written with a choice of macros--`PSTricks', + `tikz', and `eepic' at present--and new output types are easily + coded so long as the format supports arbitrary line segments, + color, and the ability to place a `LaTeX' box at a specified + location. + + * Colors are a manipulable data type, available in RGB, CMY, CMYK, + and Gray models. `xcolor'-style operations, such as color model + conversion, blending, superposition, and inversion are provided. + + The camera has a filter which affects the colors of all scene + elements. Filters performing CMYK separation are provided. + + * Color filling is controlled with declarations, similarly to line + colors in `ePiX' 1.0. Arrows and markers of type spot, dot, ddot, + and circ are now colored like other markers. Parametric surfaces + may be color-shaded. + + If a figure contains many shaded elements, a color-capable output + format (e.g.\ `PSTricks' or `tikz') should be used for + efficiency. Filled regions are implemented as fine hatching in + `eepic'. + + * An `axis' class provides coordinate axes with labels in a + variety of styles: decimals or scientific notation of specified + precision, fractions, trig fractions, logarithmic labels in + arbitrary (integer) base, and user-supplied styles. + + * `ePiX' 1.2.x performs page layout. Sub-figures may be manipulated + flexibly. The sample files give several applications. + + * Non-member intersection operators for circles, planes, spheres, + and segments are provided. A "non-generic" intersection does not + throw an exception, but instead returns an undrawable "malformed" + object. + + + +File: epix.info, Node: Software Dependencies, Next: Installation, Prev: Changes in Version 1.2, Up: Introduction + +1.2 Software Dependencies +========================= + +If you run GNU/Linux, a BSD, or Solaris, you probably have (and can +surely install) all the external software needed to use `ePiX'. On Mac +OS X, you will need the Apple developer tools and an X server (XCode +and XDarwin on the Tiger disks), and the free `fink' package manager to +build a GNU environment. For Windows, you'll need to install Cygwin +and several packages. Detailed instructions are given below. + + "Under the hood", an input file is successively converted to a +`LaTeX' picture; `dvi'; PostScript, `pdf' or `eps'; and if desired, to +a bitmapped image or movie. Four shell scripts--`epix', `laps', +`elaps', and `flix'--automate the various file format conversions. + + `ePiX' consists of a `C++' library, header, and shell scripts, and +requires GNU `bash' and a compiler _for normal use_. For complete +functionality, you need `g++' (Version 3.2 or later), `bash', a text +editor (`ePiX' works particularly well with `emacs'), a `LaTeX' +distribution, `Ghostscript', `gv' (or your favorite PS/PDF previewer), +and `ImageMagick'. GNU `grep' and `sed' are good to have. You may need +additional "developer packages" (`binutils', `make') in order to build +`ePiX'. The more up to date your software is, the better your +experience is likely to be, but bleeding edge versions are not +necessary, or even always desirable. + + Aside from their reliance on specific programs, `ePiX''s shell +scripts are written using Unix-style pathnames. Thus, the most +straightforward way to use `ePiX' is to install a GNU environment. + + Jay Belanger's `emacs' mode allows you to write, compile, and view +`ePiX' figures without leaving `emacs'. If you use another editor, +you'll want to create template source files so you don't have to type +boilerplate code each time you write a new figure. + + + +Cygwin can be used to run `ePiX' under Windows. Download `setup.exe' +from `http://www.cygwin.com', then install the packages you need. The +following are recommended, and sufficient for the actions described in +this manual. + +(Archive) bzip2, tar +(Devel) binutils, coreutils, gcc, gcc-g++, make, sed +(Editors) emacs, emacs-X11, vim +(Graphics) ImageMagick, ghostscript-base, ghostscript-x11, gv +(Publishing) tetex (all) +(Shells) bash, bash-completion +(X11) X-start-menu-icons, X-startup-scripts, + XFree86-lib-compat, xorg-x11-fscl, xorg-x11-fsrv + + + +File: epix.info, Node: Installation, Prev: Software Dependencies, Up: Introduction + +1.3 Installation +================ + +`ePiX' is distributed over the World-Wide Web as source code. Packages +may be found at `http://mathcs.holycross.edu/~ahwang/epix/ePiX.html' +The latest stable release is also on the CTAN mirrors, in the +`graphics' directory. (Some users of Red Hat have reported file +permission problems when unpacking the CTAN tarballs. If you encounter +this difficulty, please try downloading the sources from the project +main page.) Unpack the compressed tar file with the appropriate +command: + + tar -zxvf epix-x.y.z.tar.gz + tar -jxvf epix-x.y.z.tar.bz2 + (`x.y.z' is the version number) or, if your `tar' doesn't do +decompression, + + gunzip -c epix-x.y.z.tar.gz | tar -xvf - + bzcat epix-x.y.z.tar.bz2 | tar -xvf - + `cd' to the source directory, `epix-x.y.z'. The `INSTALL' file +contains detailed installation instructions. If you're impatient, the +short of it is `./configure [--options]; make; make install'. Run +`./configure --help' for a list of options. + + By default, `ePiX' installs in subdirectories of `/usr/local'; if +you want to install elsewhere, supply `./configure' with the +appropriate `--prefix'. You may also want to consult `POST-INSTALL' for +information on setting your `PATH' variable so your shell can find +`ePiX'. The manual and sample files are in `/usr/local/share/doc/epix'. + + + +There are two mailing lists, one for user questions, one for +development discussion. Please visit +`http://savannah.nongnu.org/mail/?group=epix' to subscribe. + + +File: epix.info, Node: Getting Started, Next: Reference Manual, Prev: Introduction, Up: Top + +2 Getting Started +***************** + +This chapter describes the basics of creating figures in `ePiX' for +readers familiar with `LaTeX' but completely new to `C++'. No detailed +knowledge of `C++' is needed to use `ePiX', only a bit of grammar that +is easily absorbed by example. + + Section *Note section:running::, describes the commands (shell +scripts) comprising `ePiX', and explains how to set up a graphical +environment using standard *nix programs. Section *Note +section:overview::, briefly describes figure creation. Section *Note +section:tutorial::, presents a few files side-by-side with their +output, and should be read at a computer so you can run the exercises. + +* Menu: + +* Running `ePiX':: +* The Drawing Model:: +* Tutorial:: +* `C++' Basics:: +* Animation:: +* Layout Tricks:: + + +File: epix.info, Node: Running `ePiX', Next: The Drawing Model, Prev: Getting Started, Up: Getting Started + +2.1 Running `ePiX' +================== + +An "input file" is a human-written figure specification containing +`ePiX' commands. An "output file" is machine-created, and is included +directly into a `LaTeX' document with the appropriate packages. + + Conversion ("compiling" a figure) is accomplished with four shell +scripts, `laps', `epix', `elaps', and `flix'. Each script has a +preferred extension for its input files, and is invoked with a command +of the form + + <script> [options] <input file(s)> + Often, no options are necessary. `<script> --help' describes +`<script>''s options. + + By default, output file names are constructed by replacing the input +extension with the (preferred) output extension. For brevity, +extensions may be omitted. If the script has doubts about your intent, +it proceeds with default behavior and prints a warning message. + + The author is a great fan of <TAB> completion, under which a shell, +based on what has been typed so far, automatically fills in a command +when the <TAB> key is pressed. `ePiX' comes with code snippets that +complete intelligently when the first part of a command is one of the +shell scripts. For example, if command completion is active, typing +`epix' <TAB> prints only names of `epix' input files. To use this +feature, you must install Ian MacDonald's `bash completion' package. +The `INSTALL' and `POST_INSTALL' files contain details. + + + +`laps' performs `LaTeX' to PostScript/PDF conversion, and is +independent of the rest of `ePiX'. By default, `laps' invokes `LaTeX' +and `dvips'. The option `--pdf' creates a PDF file by post-processing +the PostScript with `ps2pdf'. Other `TeX'-family processors +(`pslatex', `pdftex', etc.) may be used instead of `LaTeX' by invoking +`laps' with an appropriate option. + + + +`epix' compiles an input file into a `LaTeX' picture. The input file +should have extension `xp' (for eXtended Picture). Jay Belanger's +`emacs' mode is Highly Recommended; the installation procedure can be +found in the `POST_INSTALL' file. When this mode is active, `emacs' +automatically inserts a preamble template when a new `xp' file is +created. In addition, you can peruse `ePiX''s info file, or format, +compile, and preview files, all from within `emacs'. + + Output files from the script `epix' have extension `eepic', after +Conrad Kwok's enhancements to the `LaTeX' picture environment. In +Version 1.2, however, an output file need not contain `eepic' macros at +all. + + An output file is `input' directly into a `LaTeX' document whose +preamble contains appropriate `usepackage' lines. Rotated text +requires the `rotating' package. + + + +`elaps' creates stand-alone vector images (`eps' or `pdf') from `epix' +input files or `eepic' figures, even those not produced with `epix'. +`elaps' automatically loads the `LaTeX' packages needed for features +described in this manual. Additional `LaTeX' packages and `dvips' +options may be specified on the command line. + + + +`flix' creates bitmapped images and movies, Section *Note +section:animation::, . Input files should have extension `flx', and +must contain a valid `epix' header as well as additional code. Jay +Belanger's `emacs' mode facilitates creation of `flix' files. + + +File: epix.info, Node: The Drawing Model, Next: Tutorial, Prev: Running `ePiX', Up: Getting Started + +2.2 The Drawing Model +===================== + +To draw a figure manually, you select a sheet of paper of appropriate +size and add paths, markers, and labels. These scene elements have +attributes (line color, line width, fill color, font size, etc.) +affecting their appearance. + + `ePiX''s drawing model behaves similarly. A `picture' command sets +the _canvas_ (or logical drawing area, a Cartesian rectangle) and the +true size of the final figure. A `begin' command initializes the +"virtual paper" for drawing. Subsequent _drawing commands_ add objects +to the scene: lines, curves, function plots, labels, and the like. The +printed appearance of scene elements is determined by the current +"attribute state" and controlled by _style declaration_ which remain in +effect until superseded. Finally, an `end' command closes the figure and +prints it to the output file. + + In this manual, command descriptions follow a few conventions. +Optional arguments are enclosed in square brackets. A `len' argument is +either a number (representing a length in `pt') or a double-quoted +string containing a number and a two-letter `LaTeX' length unit, such +as `"1.5pt"' or `"6cm"'. A `color' argument is a named primary +(`Red()', `Cyan()', `White()', etc.), or a `Color' specified by +densities (`RGB(r,g,b)', `CMY(c,m,y)', etc.) + + * Fill color: `fill(color)', `nofill()'. + + * Line color and width: `plain([color])', `bold([color])'. + + * Text size: `font_size([size])', returns to `normalsize' if no + argument is given. + + + \noindent A complete list of style commands is found in Section +*Note section:quickref::, , starting on page *Note section:quickref::. + + To handle three-dimensional scenes, a `camera' performs point +projection from a selected spatial location to the canvas. As a user, +you'll need to control relatively few of the `camera''s parameters. +Keep in mind, however, that elements are added to a scene in the same +order their commands appear in the output file, and that later elements +generally cover earlier ones. Some three-dimensional scenes require +manual ordering of the input file; such ordering is dependent on the +`camera''s location. + + By default, `ePiX' draws thin, solid, black lines, performs no +filling of regions, prints text in a 12 pt Roman font, and looks down +the z axis from a large distance, giving orthogonal projection on the +(x,y) plane. When the `camera' is moved, the z axis points vertically +up on the page. + + +File: epix.info, Node: Tutorial, Next: `C++' Basics, Prev: The Drawing Model, Up: Getting Started + +2.3 Tutorial +============ + +This section presents sample input files side-by-side with their output +so you can compare what you write with what you'll see on the screen or +page. `ePiX' provides standard drawing capabilities, but like all +software has its own idioms and personality. The basic syntax, which +comes from `C'/`C++', should be mostly self-explanatory. One-line +comments begin with the string "//". + + To use the sample files interactively, you'll need working software: +`bash', `emacs', `ePiX', `g++', `gv', and a running X server. To +complete your "GUI", start `gv' and select "Watch file" from the "State" +menu. The loaded file will update automatically when it changes. + + Create a "scratch" directory, `cd' into it, and run the command + + tar -zxf /usr/local/share/doc/epix/sample_src.tar.gz + (Change the path as appropriate for your installation.) This unpacks +copies of the sample files into your scratch directory, including all +the files mentioned in this manual. The `README' file serves as a table +of contents. + + Open a sample file in `emacs', compile it from the drop-down menu +(or with the keyboard command), then open the `EPS' file in `gv'. Now +you're ready to follow the tutorial interactively. A few suggested +exercises are included with each file. Naturally, as you study more +files, you'll be able to make more interesting changes on your own. + + + +The first sample, `hello.xp', contains code needed to specify the +figure's size, followed by the classic greeting. The `border' command +draws a box around the figure in the specified color and width, and +serves here merely to delimit the output from the surrounding page. + +/* -*-ePiX-*- */ +#include "epix.h" // These lines are analogous +using namespace ePiX; // to a usepackage command. + +int main() +{ + picture(P(-1,-1), P(1,1), "2 x 1in"); // corners, true size + + begin(); // ---- Figure body starts here ---- + + border(Black(), "1pt"); // color, line width + + font_size("Huge"); // May be any font size, e.g. "scriptsize" + label(P(0,0), "Hello, world!"); + + end(); // ---- End figure; write output file ---- +} + + +[Image] + + * Change the color and width of the border. (`RGB(r,g,b);' creates + an RGB color, CMY colors are analogous. Named primaries are + available. The densities should be between 0 and 1 for + "expected" behavior.) + + * Add `backing(Cyan());' after the `border' command. + + * Put the command `crop_ellipse();' before the `border' command. + Permute the `crop_ellipse' command with the `border' and + `backing' lines, and note how the attribute (`crop') affects + objects (`border', `backing'). + + + + +Our next file uses simple objects to draw a 2-D house-and-sun scene. + + +int main() +{ + picture(P(0,0), P(5,2), "3.75 x 1.5in"); + + begin(); + + triangle(P(0.9, 1), P(3.1, 1), P(2, 1.5)); // vertices + circle(P(4,1.5), 0.25); // center and radius + + rect(P(1,0), P(3,1)); // opposite corners + + fill(Black(0.1)); // light gray + rect(P(2.3,0), P(2.7,0.8)); // the door + nofill(); + + bold(); // draw thicker lines + grid(P(1.4, 0.2), P(2, 0.6), 2, 2); // corners, number of squares + + line(P(xmin(), 0), P(xmax(), 0)); // endpoints + + end(); +} + + +[Image] + + * Add declarations such as `bold(RGB(1,0.9,0.5))' or + `fill(Yellow())' to color the scene. (Color and filling are + orthogonal attributes.) + + \noindent The sample file `house.flx' uses loops to draw gradient +fills of the lawn, sky, and sun, and animates a sunset. + + + +Plotted functions must be defined in the "preamble", before `main'. +"High-level" elements--coordinate axes and grids, axis labels, and +graphs--are drawn with mnemonically-named commands. + +// double = double-precision floating point +double f(double x) { return 0.75*Sin(x) - 0.25*Sin(2*x); } + +int main() +{ + picture(P(-2,-1), P(2,1), "5 x 1in"); // [-2,2] x [-1,1] + + begin(); + revolutions(); // set angle units, [0,1] = one turn + + h_axis(16); // axes w/default endpts + v_axis(4); + h_axis_labels(4, P(0,-4), b); // shift down 4pt, align below + + plain(Red()); + plot(f, xmin(), xmax(), 120); // use 120 intervals + + end(); +} + + +[Image] + + * Define and plot some different functions; adjust the bounding + box as necessary. (Use repeated multiplication for polynomials. + The `polarplot' command graphs r=f(\theta).) + + * Change the arguments to `h_axis_labels'. The first specifies the + number of intervals to label; the second gives the label offset + in `pt'. The last puts each label below (`b') its Cartesian + location. + + + + +Functions of two or three variables are defined just like functions of +one variable, but for plotting the return type must be a point (`P'), +not a real number (`double'). The `domain' class specifies the set of +inputs to plot. + + +P f(double r, double th) +{ + return P(r*Cos(th), r*Sin(th), pow(r, 3)*Cos(3*th)); +} + +int main() +{ + picture(P(-1,-1), P(1, 1), "2 x 1in"); + begin(); + pst_format(); // use PSTricks macros for output + + // corners ([0,1] x [0,2\pi]) and fineness + // (8x40 rectangles, plotted at 16x120 resolution) + domain R(P(0,0), P(1, 2*M_PI), mesh(8,40), mesh(16,120)); + + camera.at(P(3,1,2)); // set the viewpoint + arrow(P(0,0,0), P(1.25,0,0)); // coordinate axes + arrow(P(0,0,0), P(0,1.25,0)); + + plain(Blue(1.2)); // line color and width + fill(Yellow()); // shading color + surface(f, R); + + end(); +} + + +[Image] + + + +A function can be defined by an arbitrary algorithm, and a `domain' may +be used to plot a family of functions for several values of one +variable. + + +P sin_n(double x, double n) // Taylor polynomial of sin x +{ + const int N((int) floor(n)); // convert n to an index bound + const double sqx(-pow(x, 2)); // -x^2 + double val(x), summand(x); + + for (int i=1; i <= 2*N+1; i += 2) + { + summand *= (sqx/((i+1)*(i+2))); // (-1)^i x^{2i+1}/(2i+1)! + val += summand; + } + + return P(x, val); // return (x, y) +} + +int main() +{ + picture(P(0, -1), P(6*M_PI, 1), "5 x 1in"); + + begin(); + + set_crop(); + bold(Green()); + plot(Sin, 0, xmax(), 120); + + domain R(P(0,1), P(6*M_PI, 41), mesh(60, 40), mesh(120, 40)); + for (int i=3; 0 <= i; --i) // print in descending degree + { + bold(RGB(0.25*i, 0, 1-0.25*i)); // degree-dependent color + plot(sin_n, R.slice2(5*i+1)); // plot for n = 5i+1 + } + end(); +} + + +[Image] + + + +Page layout can be composed from sub-pages with `screen' objects. In +the loop body below, objects are added to the "active" `screen', then +`inset' into the "canvas", the screen representing the entire figure. + + +P f(double u, double v) +{ + return P((u-v)*(u+v), 2*u*v, u); +} + +int main() +{ + picture(P(0,0), P(2,3), "5x7.5in"); // overall size + + begin(); + + domain R(P(-1,-1), P(1,1), mesh(12,12), mesh(24,24)); + + for (int i=0; i<2; ++i) + for (int j=0; j<3; ++j) + { + screen my(P(-3,-3), P(3,3)); + activate(my); + border(Red(0.6), "1pt"); + // frame-dependent viewpoint + camera.at(sph(10, (2*j+i+1)*M_PI/8, M_PI/6)); + + plot(f, R); + arrow(P(0,0,0), 2*E_1); + arrow(P(0,0,0), 2*E_2); + // SW corner at (i, 2-j), padded by 0.05 on all sides + inset(P(i+0.05,2.05-j), P(i+0.95,2.95-j)); + } + + end(); +} + + +[Image] + + +File: epix.info, Node: `C++' Basics, Next: Animation, Prev: Tutorial, Up: Getting Started + +2.4 `C++' Basics +================ + +An `ePiX' source file is a `C++' program. If you've successfully +modified and compiled the sample files, you know enough `C++' to use +`ePiX'. In the author's experience, `C' grammar suffices for most +applications. An excellent introduction to definitions of functions +and variables, control statements, and overall program structure is +Kernighan and Ritchie's _The `C' Programming Language_, second edition +`KnR'. + + + +Jay Belanger's `emacs' mode for `ePiX' inserts a file template when an +empty buffer is opened with the extension `xp'. This section explains +the purposes served by the template. A few additional remarks may help +you avoid basic syntax pitfalls. + + A `C++' file consists of "statements", analogous to ordinary +sentences. Common types include _declarations_ (which "register" a +function, variable, or type name with the compiler), _definitions_ +(which assign meaning to declared names), and _function calls_ (which +cause a named function to execute). Most statements in an `ePiX' input +file are function calls ("commands"). Plain declarations are +relatively rare in user files, since a definition serves to declare any +new names that it contains. + + Every statement ends with a semicolon, and conventionally a file +contains at most one statement per line. The compiler ignores nearly +all whitespace (spaces, tabs, and newlines), which should be used +freely to make files easy to read. Other punctuation (periods, commas, +(semi)colons, parentheses, braces, and quotes) dictates file parsing, +and must adhere stringently to grammar. + + An `ePiX' file always begins with the lines + +#include "epix.h" // N.B. pre-processor directive, no semicolon +using namespace ePiX; + The first line is analogous to a `LaTeX' `usepackage' command: It +loads the contents of the "header" file `epix.h', importing the names +of commands provided by `ePiX'. To avoid name conflicts, `ePiX''s +commands are enclosed in a "namespace". For example, the `label' +command is actually known to the compiler as `ePiX::label'. The second +line above tells the compiler to apply the prefix tacitly. + + + +Definitions of variables and functions play the same role in a figure +that macro definitions play in a `LaTeX' document: gathering and +organizing information on which the figure depends. A variable is +defined by supplying its type, name, and initial value. By far the most +common data types in `ePiX' are `double' (double-precision floating +point number), `P', and `int'. The name of a variable may consist +(only) of letters (including the underscore character) and digits, and +must begin with a letter: + +my_var, var2, MY_var, aLongVariableName; // valid +my-var, 2var, \v@@riable, $x, ${MY_VARIABLE}; // not valid + Variable names are case-sensitive, and numerous (non-universal) +conventions govern the significance of capitalization. Generally, make +names descriptive but not unwieldy, and avoid language keywords (such +as `const', `true', `double', `class', or `public') and names that +begin with an underscore. + + A function accepts "arguments" and "returns a value". To define a +function in `C++', you must specify the return type, the name of the +function, the types of the arguments, and the algorithm by which the +value is computed from the inputs. The code block + +double f(double x) +{ + return sqrt(1-x*x); +} + specifies the `double'-valued function f of one `double' variable +defined by the formula f(x)=\sqrt1-x^2. + + + +`C++' has two types of comments. `C'-style comments, which may span +several lines, are delimited by the strings `/*' and `*/'. One-line +comments, analogous to the `LaTeX' `\%', are begun with `//'. A +one-line comment may appear within a multi-line comment, but a +`C'-style comment may not; the compiler will mistake the first `*/' it +encounters as the end of the current multi-line comment. + + + +All the "action" in a `C++' program occurs inside the special function +`main'. Running a compiled `C++' program is viewed by the operating +system as calling the program's `main' function. The return value (an +`int') is the program's exit status. The contents of the output file +start with `begin()' and terminate with `end()'. Intervening +statements constitute the _body_ of the file. + + In `C++', a function may not be defined inside another function. +Thus, variables may be defined inside `main', but functions cannot be. + + + +In `C++', a `string' is a sequence of characters. Most `string's in +`ePiX' input files are _literals_, double-quoted `string's whose value +is read from the input. In a string literal, backslash is an escape +character; a single backslash is produced by a double backslash in the +input file. Certain letters have special meanings when +backslash-escaped, including "\n" (newline) and "\t" (<TAB>). Unlike +`LaTeX', `C++' does not require a space to separate an escape sequence +from following text; the string "\\textwidth" literally represents a +`LaTeX' command, while "\textwidth" is read "`TABextwidth'" by the +compiler. + + Though not commonly needed, raw text can be printed to the output +file. The functions `write', `pre_write', and `post_write' accept +`string' arguments. `write' prints its argument where the call appears +in the input file. The other functions print their arguments before or +after the completed picture, respectively. These commands must be in +the file body. As an application, a complete `LaTeX' `figure' +environment (with caption and label) can be produced by an `ePiX' file, +Figure *Note fig:captioned::, . + + +#include "epix.h" +using namespace ePiX; + +int main() +{ + picture(P(-1,-1), P(1,1), "10cm x 3in); + begin(); + pre_write("\@float Figure[hbt]"); // comes before the picture + + post_write("\@caption{A \@code{LaTeX}\ figure.}"); // and after + post_write("\@end float"); + + < ... other ePiX commands ... > + write("%% A comment near the end, but inside the picture."); + end(); +} // End of main() + +Figure: Generating a self-contained figure in `ePiX'. + + + +An algorithm's behavior usually depends on internal state. A +_conditional statement_ causes blocks of code to be executed according +to criteria. A _loop_ repeatedly executes a code block, usually +changing the values of variables in a predictable way, so that the loop +exits after finitely many traversals. + + +File: epix.info, Node: Animation, Next: Layout Tricks, Prev: `C++' Basics, Up: Getting Started + +2.5 Animation +============= + +`ePiX' is well-suited to the creation of mathematically accurate +animations: If a figure depends suitably upon a "time" parameter, then +a loop can be used to draw the entire figure for multiple time values, +yielding successive "snapshots" of the figure as time progresses. The +shell script `flix' automates the process of compiling a suitable input +file into a collection of `png's and assembling these frames into a +`mng' or `gif' animation. ImageMagick is the image-handling engine. + + A `flix' file is an `epix' file with two restrictions: + * The `double' variable `tix()' is used as "clock". + + * `main' accepts two command line arguments and sets `tix()' + accordingly. + Jay Belanger's `emacs' mode recognizes the file extension `.flx' and +inserts template code if an empty buffer is opened. Creation of `flix' +files is as easy as creation of `epix' files. The `samples' directory +contains a handful of `flix' files that may be consulted for ideas. + + By default, `flix' creates movies with 24 frames, in which `tix()' +runs from 0 to 1, and animates at 0.08 sec/frame. These and other +parameters can be changed with command-line options. + + A "typical" `.flx' file may take 30 seconds to a few minutes to +compile, depending on the number of frames and the complexity of each +frame. To facilitate debugging, `elaps' can be run on a `flix' file. +`elaps' runs in a fraction of the time, and if `elaps' can't produce a +viewable image, `flix' will surely fail. While running, `flix' prints +a progress bar counting the number of `eps' files that have been +created. There will be a delay of a few seconds (or more) after the +last frame is produced, during which ImageMagick's `convert' utility +assembles the movie. + + +File: epix.info, Node: Layout Tricks, Prev: Animation, Up: Getting Started + +2.6 Layout Tricks +================= + + + +Stereograms are created by drawing a single scene twice from slightly +different points of view. To create a stereogram with `ePiX', write a +"scene" function containing the necessary drawing commands, then set +the camera appropriately and call the scene function twice, once for +each frame. + + + +The sample files `lorenz.xp' and `twisted_cubic.xp' use page layout to +draw crossed-eyes stereograms. For each frame, create and activate a +`screen', set the camera, and call the scene function. The frames are +inset side by side in the final picture. For a crossed-eyes stereogram, +the frame from the "rightmost" camera position is placed on the left. + + + +The sample files `cube.flx' and `mirrorball.flx' contain animated +red-cyan stereograms, suitable for viewing with 3-D glasses. The +technique works best with black-and-white line drawings, but the basic +approach is the same as for crossed-eyes stereograms: Create a scene +function and call it twice, setting the camera appropriately. Layout is +unnecessary since the frames are superposed. Pen colors should be +close to red and cyan, but "optimal" choices depend on one's eyes and +3-D glasses. + + + +Either form of stereogram can be animated in a `.flx' file, but keeping +one's eyes properly crossed requires practice while most people can +instantly see depth with 3-D glasses. As always when using `flix', +debug the scene with `elaps' before compiling a movie. If a +stereoscopic effect is difficult to see in a still image, it will be +even harder to perceive in a movie. + + + +`ePiX' can place external images into a figure, similarly to Rolf +Niepraschk's `overpic' package. You provide the Cartesian center point, +the file name, and optionally the true height and/or width of the image: + + label(P(a,b), "\\includegraphics[width=w,height=h]{file}"); + This effect requires the `graphicx' package. When compiling a +stand-alone graphic containing an external image, you must specify the +`graphicx' package on the command line: `elaps -p graphicx <file>' + + +File: epix.info, Node: Reference Manual, Next: Advanced Topics, Prev: Getting Started, Up: Top + +3 Reference Manual +****************** + +This chapter details `ePiX''s capabilities, discussing attributes and +data types, and listing available commands in the form + + label(P posn, [P offset], string text, [align]); + circle(P ctr, double rad=1, normal=P(0,0,1)); + As in Chapter *Note chapter:started::, , function arguments are given +by type (`P', `double', `string', etc.)\ and name, or by name alone if +the type is clear. Optional arguments are enclosed in square brackets. +A few argument types, such as `[align]' above, admit only a small +number of values; these cases are explained when the corresponding +command is first introduced. + + A name followed by an equals sign and a value indicates a default +argument; if omitted in an input file, the compiler substitutes the +default value. Only trailing arguments may be specified this way. For +example, if the `rad' argument of the `circle' command is omitted, the +`normal' argument _must_ be omitted as well. + + In an input file, only an argument's value is given, not the type: + + label(P(0,0), P(0,-4), "Hello world", b); + circle(P(0,-0.25), sqrt(2)); // use default normal + + Generally, `len' signifies either a number (representing a length in +`pt') or a double-quoted string containing a number and a two-letter +`LaTeX' length unit, such as `"1.5pt"' or `"6cm"'. `color' represents a +`Color' object constructed from a named primary (`Blue()', +`Magenta(0.7)', etc.), a color specification (`RGB(r,g,b)', +`CMY(c,m,y)', etc.), or an operator applied to an existing `Color'. + +* Menu: + +* File Structure:: +* Picture Size and Aspect Ratio:: +* Color:: +* Scene Attributes:: +* Drawing Attributes:: +* Creating and Drawing Objects:: +* More About `C++':: +* Attribute Quick Reference:: + + +File: epix.info, Node: File Structure, Next: Picture Size and Aspect Ratio, Prev: Reference Manual, Up: Reference Manual + +3.1 File Structure +================== + +An `ePiX' input file constitutes a short `C++' program. When this +program is compiled and run by one of the shell scripts, it creates a +figure file suitable for inclusion in `LaTeX'. + + Like a `LaTeX' document, an `ePiX' file contains a _preamble_, which +sets up a drawing environment, and a _body_, which contains actual +figure-generating commands. The minimal file has the form + +#include "epix.h" // N.B. no semicolon +using namespace ePiX; + +int main() { + picture(P(a1,b1), P(a2,b2), "n1 [unit1] x n2 unit2"); + begin(); // end of preamble, start of body + end(); // end of body +} + `ePiX' commands are of four general types: drawing, attribute setting, +definitions (of data and functions), and operations on existing +objects. Except as noted below, drawing and attribute commands must +appear in the body, between `begin()' and `end()'. Function definitions +must come in the preamble, before `main()'. Data definitions may appear +in the preamble or body. + + + +The `end()' command writes the output file to `stdout', using `eepic' +macros by default. The shell scripts redirect `stdout' to an +appropriate disk file. + + The attribute-setting command `pst_format()' causes the output file +to be written using `PSTricks' macros when `end' is called. Similarly, +`tikz_format()' causes the file to be written using `tikz' macros, and +`eepic_format()' causes the file to be written using `eepic' macros. +These commands may appear anywhere in the figure body. There is no +reason for a file to contain more than one such command. + + The output format may be selected on the command line, overriding any +explicit request in the input file. Supplying `epix', `elaps', or +`flix' with one of the options `--pst', `--tikz', or `--eepic' is +tantamount to issuing a `pst_format()' (etc.)\ command just before the +end of the file. These options are listed in decreasing precedence. If +more than one is given, the "strongest" applies, regardless of the +command line order. + + A figure may be written directly to a specified disk file, in a +format unaffected by the command line flags above. The command + + print_eepic("file.tex"); + writes the figure to the named file using `eepic' macros. Analogous +commands exist for the formats `pst' and `tikz'. These commands perform +an immediate action. Consequently, the command's location in the input +file is significant, and multiple commands may appear in a single file, +so long as distinct file name arguments are provided. Applications +include writing the same figure in multiple formats, or creating +successive "snapshots" of a lengthy computation. + + +File: epix.info, Node: Picture Size and Aspect Ratio, Next: Color, Prev: File Structure, Up: Reference Manual + +3.2 Picture Size and Aspect Ratio +================================= + +The `picture' command specifies a figure's logical and true sizes. In +the "minimal file" snippet above, the _canvas_ is the Cartesian +rectangle [a_1,a_2]\times[b_1,b_2] whose corners are given. Either pair +of opposite corners is acceptable, but confusion is less likely when +the SW and NE corners are given, in this order. + + The true (printed) width and height are read from `picture''s third +argument, a "size `string'" such as "4cm x 1in", containing a number +and optional `LaTeX' length unit, an `x', another number, and a +mandatory length unit. Spaces may be used for legibility. The +mandatory length unit becomes the `LaTeX' `unitlength'. The argument +"4cm x 1in" creates a picture 4 cm wide and 1 in high, but internally +converts 4 cm to inches. Recognized length units are `pt' (points, the +default), `cm' (centimeters), `in' (inches), `mm' (millimeters), `pc' +(picas), and `bp' (big points). (`1in = 2.54cm = 72bp = 72.27pt', `1pc += 12pt'.) + + The logical and true sizes may be defined separately with the +commands + + bounding_box(P(a1,b1), P(a2,b2)); + picture(n1, n2); + unitlength(len); // len a length string, not a double + One way or another, the logical and true dimensions _must_ have +positive values when the `begin()' command is issued. + + `LaTeX' treats the contents of a picture environment as a single box, +aligned by default on its lower left corner. An `offset' command +accepts two `double' arguments or a size `string' and shifts the page +location accordingly. The command `offset("0.25 x -0.5cm")' shifts the +picture right 0.25 cm and down 0.5 cm. If the `unitlength' is 1 cm, +the command `offset(0.25, -0.5)' has the same effect. + + A non-zero `offset' causes a picture's contents to appear in a +location where `LaTeX' does not expect them. This can be useful in a +`LaTeX' document, but should be avoided when compiling a stand-alone +image, since `dvips' may crop according to rules of its own. + + The canvas's corners are `(xmin(),ymin())' and `(xmax(),ymax())', +while its width and height are `xsize()' and `ysize()'. The canvas is a +virtual, advisory data structure; its dimensions are not directly +related to the figure's printed size, and picture elements may lie +outside the canvas. Affine scaling maps the canvas to the page when the +output file is written. +[Image] + + The figure's aspect ratio is controlled by sizing the canvas. The +aspect ratio is "true" if the canvas and page rectangles are +geometrically similar, e.g., if both boxes are 1.5 times as wide as +they are tall. + + +File: epix.info, Node: Color, Next: Scene Attributes, Prev: Picture Size and Aspect Ratio, Up: Reference Manual + +3.3 Color +========= + +`ePiX' provides a `Color' data type. Four models are implemented: +`RGB', `CMY', `CMYK', and `Gray'. A `Color' holds primary color +"channels", each carrying an intensity between 0 (no color) and 1 (full +saturation). "No color" means black in `RGB' and `Gray', white in +`CMY(K)'. `RGB', `CMY', and `CMYK' colors are written to the output +file as commands in the corresponding model. `Gray' shades are written +in `RGB'. + + Operations on red-green-blue colors are described below. +Functionally, colors are converted to `RGB', operated upon, then +converted back to the original model. Conversions are as described in +Uwe Kern's `xcolor' manual `xcolor'. + + + +Each color model has a "constructor" creating a color of specified +densities. The `RGB' and `CMY' models have named "primary" +constructors; the density argument is optional and defaults to 1. + + // red-green-blue colors + RGB(double r=0, double g=0, double b=0); + Red(d=1); Green(d=1); Blue(d=1); + White(d=1); Black(d=1); + + + // cyan-magenta-yellow colors + CMY(double c=0, double m=0, double y=0); + Cyan(d=1); Magenta(d=1); Yellow(d=1); + CMY_White(d=1); CMY_Black(d=1); + + // gray + Gray(double d=0); // equivalent to RGB(d, d, d) + Each `CMY' constructor has a corresponding `CMYK' function, e.g.\ +`CyanK()' or `CMYK_White()'. + + Though color densities lie between 0 and 1, `ePiX''s primary color +constructors take arguments mod 4, viewed as elements of [-2,2]. +Consider `Red(d)', "red with density d". For integer values of d, the +constructor has the following meanings: `Red(0)' is black, `Red(1)' is +red, `Red(2)'=`Red(-2)' is white, and `Red(-1)' is anti-red, or cyan. +For non-integer d, the constructor interpolates between the bracketing +integer values, Figure *Note fig:densities::, . Other primary +constructors work analogously. + + +[Image] + +Figure[hbt] + + Let \delta:[-2,2]\to[0,1] be the piecewise-linear function that +converts real numbers to primary color densities, \clip:R\to[0,1] the +clipping function. The non-primary constructor `RGB(r, g, b)' computes +the density of the red channel as +\clip\bigl(\delta(r)+\delta(-g)+\delta(-b)\bigr); the green and blue +channel densities are computed similarly. Every color can be created +with arguments between 0 and 1, but the constructor accepts arbitrary +real arguments and returns colors varying "continuously and +periodically". + + Colors possess an "alpha-channel" for transparency. Except as +supported by the output format, this feature is a stub. + + + +Colors can be scaled, inverted, blended, superposed, and filtered. In +the code below, `tint' is a `Color'. The effect of each operation is +described in the `rgb' model; the visual result is the same in all +models. + + tint *= double c; // multiply channels by c, rebuild + tint.invert(); // (r, g, b) -> (1-r, 1-g, 1-b) + tint.blend(Color col, double t); // (1-t)*tint + t*col + tint.superpose(col); // add channels, then clip to [0,1] + tint.alpha(double d); // set alpha channel to clip(d) + + tint.filter(col); // return min density in each channel + Except for `filter', these operators modify their object. `filter' +simulates the effect of viewing `col' through a transparent sheet of +`tint', and returns a new `Color' object having the same model as +`tint' without modifying `tint' itself. + + +File: epix.info, Node: Scene Attributes, Next: Drawing Attributes, Prev: Color, Up: Reference Manual + +3.4 Scene Attributes +==================== + +Objects in a scene sit in 3-dimensional space. A _camera_ maps objects +to the _active screen_. The active `screen' may, in turn crop its +contents. Each drawing command creates an object, "photographs" it, and +adds the image to the active `screen'. This section describes the +`Camera' and `screen' classes and a few associated concepts. + + + +By default, angles are measured in `radian's. Two other angular modes +are available: `degrees' and `revolutions'. The angular mode is set +with a named command, `radians()', `degrees()', or `revolutions()'. The +current angular mode affects all trigonometric functions and operations. + + + +Three-dimensional scenes are drawn on flat paper by applying a +mathematical transformation. By default, `ePiX' uses _point +projection_, the technique used by art students when they trace on a +window with grease pencil, Figure *Note fig:camera::, . + + +[Image] + +Figure[hbt] + + `ePiX' depicts a Cartesian world by projecting mathematically to a +screen plane, then affinely scaling to a printed page. The camera, +which maps the world to the screen, consists of a _body_ (data that +determines the position and orientation of the camera), a _lens_ (the +actual mapping to the screen plane), and a _filter_ (a color through +which the scene is viewed). + + + +The camera's spatial orientation is described by a triple of mutually +perpendicular unit vectors. In memory of happy days at the beach, +these vectors are called _sea_, _sky_, and _eye_. The screen plane is +parallel to the sea-sky plane; the sea vector points horizontally to +the right, sky points vertically upward. The eye is their cross +product, which points directly at the viewer. + + The sea-sky-eye basis is located at the _viewpoint_, the camera's +spatial location. The _target_, the origin of the screen plane, lies on +the line through the viewpoint in the direction opposite the eye +vector. The distance from the viewpoint to the target is the _range_. +The _camera sphere_ is centered at the viewpoint and passes through the +target. The orientation, viewpoint, target, and range completely (and +redundantly) determine the camera's geometric situation in the world. + + + +A _lens_ maps the world to the screen. `ePiX' comes with four lenses: +_shadow_ (the default), _orthogonal_, _fisheye_, and _bubble_. Each +lens simulates the appearance of world objects as seen by an observer +at the viewpoint. The shadow lens is point projection from the +viewpoint to the screen plane. The orthogonal lens projects from +infinite distance. Each of the other lenses performs radial projection +to the camera sphere, then maps the sphere to the screen plane; the +fisheye lens does orthogonal projection (so the entire image lies +inside the disk centered at the target whose radius is the range) while +the bubble lens does stereographic projection from the target's +antipode. + + An input file normally uses a single camera, so a global object named +`camera' is defined automatically. At the start of a figure, the +`camera' looks down on the (x_1,x_2)-plane from a distant point on the +x_3-axis. The resulting view, essentially projection along the axis, is +suitable for 2-dimensional figures. + + The `camera' is manipulated similarly to a real camera: + + camera.at(P posn); // set viewpoint to posn + camera.look_at(P targ); // set target to targ + camera.range(double dist); // fix target, move viewpoint + camera.focus(double dist); // fix viewpoint, move target + camera.tilt(double angle); // rotate about the sea axis + camera.pan(double angle); // rotate about the sky axis + camera.roll(double angle); // rotate about the eye axis + camera.clip_range(dist); // cull scenery closer than dist + Explicitly setting the viewpoint or target makes the sky vector +parallel to the projection of the x_3 axis when possible; otherwise the +x_2-axis is used. Setting the range or focus moves the `camera' +parallel along the eye line. Each command re-sizes the image; note that +increasing the focus _enlarges_ the image. The three rotation +operations fix the viewpoint, but only roll fixes the target. + + + +The `camera' has a _filter_ through which all scene `Color's pass. For +uniformity, the filter should only be set at the start of the file +body, before any visible elements have been placed in the scene. The +filter has two primary uses--model conversion and color separation--but +can also be used for special effects. + + There is a `Neutral' color, for which filtering has no effect at +all. The `camera''s default filter is `Neutral'. In addition, each +color model has a _neutral_ representative, `RGB_Neutral', etc. Passing +`Color's through a neutral filter preserves their appearance but +converts them to the neutral `Color''s model. + + Filtering can be used to "split" a `Color' into primary +constituents. For `RGB' channels, the primaries themselves are suitable +filters. For `CMYK' channels, there are special _process_ filters, +named C_Process, etc. + + camera.filter(CMY_Neutral()); // convert all colors to CMY + camera.filter(Gray_Neutral()); // black and white photography + camera.filter(Green()); // the green channel + camera.filter(M_Process()); // the magenta channel + camera.filter(Red(1.4)); // la vie en rose? + + + + +Two operations handle elements lying far from the target. _Cropping_ +culls elements based on their screen location, and is described later. +_Clipping_ removes objects whose spatial location lies outside the +"clip region". + + Initially, the clip region is a very large box centered at the +origin. Commands are provided to resize this box, keeping the faces +parallel to coordinate planes. + + clip_box(P pt1, P pt2); // opposite corners + clip_box(P pt); // opposite corners pt and -pt + clip_to (P pt); // pt and P(0,0,0) + clip_box(); // very large box + Additional "clippers" may be added manually. Individual clipping +planes are specified by a point and inward-pointing normal vector. +Parallel planes cutting a "slice" or "slab" are described by a +location, direction, and a distance. The location lies halfway between +the clipping planes, and the planes' normals point toward the location. + + clip_face(P loc, P perp); // perp points inward + clip_slice(loc, perp); // very close parallel planes + clip_slice(loc, perp, dist); // planes separated by dist + clip_restore(); // remove manually-added clip planes + Like `clip_restore', the `clip_box' and `clip_to' commands remove all +user-specified half spaces. + + + +By default, drawing occurs in the Cartesian coordinate system of the +`canvas'. However, insets and subfigures are most naturally composed in +"local" coordinates, then placed into their final location as a unit, a +process called _layout_. `ePiX' implements layout with the `screen' +class. + + + +A `screen' is a Cartesian plane containing a distinguished coordinate +rectangle, its _bounding box_. The `canvas' of a figure is a `screen', +as is the internal representation of the printed page. At any point of +a file body, some `screen' is _active_, or "open for drawing". A new +`screen' is created from a pair of opposite corners, but is not used +until explicitly activated. + + screen subfig(P(a1,b1), P(a2,b2)); // [a1, a2] x [b1, b2] + activate(subfig); // open subfig for drawing + // commands to draw in subfig + deactivate(subfig); // re-activate the previous screen + + The `canvas' is automatically drawn at the `end' of the input file. +The contents of other `screen's must be incorporated into the `canvas' +explicitly with an `import' or `inset' command. `import' affinely +scales the bounding box of the "child" `screen' to the `canvas'. `inset' +specifies corners in the "parent" where the child is placed. + + import(); // active screen to canvas + import(subfig); // subfig to canvas + inset(P sw, P ne); // active screen to specified rectangle + inset(subfig, sw, ne); // subfig to specified rectangle + inset(subfig); // inset to subfig's corners + + + +The portion of a `screen' enclosed by a specified rectangle can be +_extracted_. Each of the commands + + subfig.extract(P sw, P ne); + canvas().extract(P sw, P ne); + returns the `screen' having stated corners and containing part of +`subfig' or the `canvas', respectively. Elliptical and diamond-shaped +portions of a `screen' may be extracted. The contents occupy the +ellipse or diamond inscribed in the given rectangle. + + subfig.extract_ellipse(sw, ne); + canvas().extract_diamond(sw, ne); + The `screen' returned by `extract' (or its variants) may be used just +like a manually-constructed `screen', for example to construct a +magnified inset. + + + +On occasion, it is necessary to draw at known page size, independently +of the unit length. For 2-dimensional drawing in the (x_1,x_2)-plane +with the `camera' in its default location, the coordinates (horizontal, +vertical, or both) of a `screen' may be interpreted as true pt offsets +relative to a specified point rather than as Cartesian coordinates. + + inlay(subfig, P loc); + inlay_horizontal(subfig, loc); + inlay_vertical(subfig, loc); + Each command maps the origin of `subfig' to the specified location in +the active `screen'. The first performs affine scaling so that one +Cartesian unit in `subfig' maps to one true pt on the page. The second +and third commands perform this scaling only in the named direction. + + The `inlay' functions are suitable only for 2-dimensional effects. +For 3-dimensional true-size drawing, the function `pt_to_screen' +converts a true length of 1 pt into Cartesian coordinates in the active +`screen'. For example, the command `line(P(0,0), +P(pt_to_screen(12),0))' draws a line segment 12 pt long with its left +endpoint at the Cartesian origin. True size drawing is unusual in an +input file, but has definite uses in library code; `ePiX''s right angle +marker is a typical application. + + Either type of true-size drawing works as described when drawing in +the `canvas', and _only_ when drawing in a `screen' imported to the +`canvas' at "true Cartesian" size (one `screen' unit maps to one +Cartesian unit in the `canvas'). In other situations, the true size +coordinate(s) will be scaled by additional affine transformation(s). + + + +A `screen' has a _crop mask_: rectangular (default), elliptical, or +diamond-shaped. If cropping is switched on in the active `screen', +added elements are cropped to the crop mask. For example, cropping by +the default crop mask in the `canvas' ensures the figure lies inside +the printed region allocated by `LaTeX'. + + The `crop' commands below affect the active `screen' only. Cropping +is not a "global" attribute, but must be set or unset explicitly for +each `screen'. By default, cropping is switched off. + + set_crop(); // activate cropping + set_crop(false); // deactivate cropping + crop_diamond(); // <>-shaped mask, set crop state + crop_ellipse(); // etc... + crop(); // crop active screen's contents + Normally the crop mask is inscribed in the `screen''s bounding box. +The commands `crop_diamond' and `crop_ellipse' also accept a pair of +`P' arguments, which are treated as corners of the crop box. + + The active `screen' may be decorated with a `border' (outline of +specified color and line width) and `backing' (solid fill color). The +crop mask determines the shape of the `border' and `backing'. + + border(color, len); + backing(color); + Identically-named member functions can be applied to an arbitrary +`screen' whether or not it is active: + + scr.crop_rectangle().backing(Blue(1.8)); + canvas().crop(); + + + +A _plane affine map_ has the form T(x) = Ax+b for some invertible +2\times2 matrix A and a constant vector b. `ePiX''s `affine' class +allows affine maps to be built and applied to `screen's' contents. + + An affine map is uniquely determined by the images of three +non-collinear points. The constructor returns the affine map sending +the points (1,0), (0,1), and (0,0) to `pt1', `pt2', and `pt0', +respectively. + + affine af(P pt1, P pt2, P pt0=P(0,0)); + To emphasize, the arguments are locations, not displacements, and the +image of the origin comes last. There is also a `void' constructor +(taking no arguments) which returns the identity map. + + To facilitate construction of affine maps, an existing `affine' may +be post-composed with a variety of "elementary" affine transformations. +In the commands below, `th' is an angle (in current units), `sc' is a +non-zero `double', and `ctr' is a point fixed by the composing +transformation. In each command, `ctr' defaults to (0,0). + + affine af; // the identity map + af.shift(P arg); // translate by arg + af.rotate(th, [ctr]); // counterclockwise rotation about ctr + af.reflect(th, [ctr]); // reflect across line through ctr + + af.h_scale(sc, [ctr]); // horizontal scaling + af.v_scale(sc, [ctr]); // vertical scaling + af.scale(sc, [ctr]); // dilatation + + af.h_shear(sc, [ctr]); // shear preserving horizontals + af.v_shear(sc, [ctr]); // shear preserving verticals + + af.invert(); // the inverse + af.postcomp(affine f); // post-compose with f + af(f); // pre-compose, af not modified + A non-invertible `affine' can be created _only_ by shearing or scaling +with an extremely large or extremely small argument, or by supplying +three collinear points to the constructor. Calling `invert' on a +non-invertible map merely issues a warning and performs no action. + + An `affine' may be applied to a `screen''s current contents. The +`screen' class has eight member functions (`shift' through `shear') +with syntax identical to the affine map functions. In addition, an +arbitrary `affine' may be applied to a `screen': + + scr.shift(arg); // shift scr's contents by arg; etc. + scr.apply(f); // apply f to scr's contents + To apply a composition of several maps to a `screen', it's best to +build an `affine' map by composition, then `apply' the map. Composing +`affine's is cheap; `apply'ing an `affine' is costly in proportion to +the number of elements in the `screen'. + + Applying an `affine' to a `screen' has no effect on the bounding +box, `border', or `backing', and may move elements outside the bounding +box even if cropping is active. To ensure a `screen''s contents lie +inside the bounding box, `crop' the `screen' _after_ `apply'ing the +`affine'(s). + + The sample file `inverse.xp' uses `affine' maps to depict branches +of inverse functions in one variable, `symmetry.xp' depicts the +permutation group S_3 by its action on a regular hexagon. + + +File: epix.info, Node: Drawing Attributes, Next: Creating and Drawing Objects, Prev: Scene Attributes, Up: Reference Manual + +3.5 Drawing Attributes +====================== + +`ePiX' maintains drawing states for filled regions, paths, and text +objects. + + + +Filling is either on or off. When filling is active, closed paths are +filled with the current _fill color_. + + fill(); // turn filling on + fill(color); // turn filling on, specify color + nofill(); // turn filling off, same as fill(false); + + + +Paths and borders of filled regions are drawn with two _pen_s, each +described by color and line width. The _line pen_ draws all path-like +objects. The _base pen_ does nothing unless it is wider then the line +pen, in which case it draws an "underlayer" or "border" on the line pen. + + pen(len); // set line pen width + pen(color); // set line color, keep width + pen(color, len); // set color and width + As usual, `len' may be either a length string or a `double', +interpreted as a width in `pt'. There are `base' functions with the +same signatures and analogous meanings for the base pen. + + The line width can be set with named declarations; the optional +argument sets the line color: + + plain([color]); // 0.4pt + bold([color]); // 0.8pt + bbold([color]); // 1.6pt + + + +By default, path-like objects are drawn with solid lines. Dashed, +dotted, and free-form path style patterns are also available. (The +`base' underlayer is always solid.) The page length of a pattern +defaults to 12 pt, but can be set. + + line_style(string); + dash_size(len=12); + The path style is set with a WYSIWYG string of dashes, spaces, and +periods, representing a pattern of dashes, gaps, and dots. In the +sample styles below, the repeating units have the same page size, 12 pt. +[Image] + + For brevity and uniformity, named commands are provided. + + solid(); "-" dashed(); "- -" dotted(); " . " + A sequence of n dashes, spaces, and dots corresponds to a dash/dot +pattern in an interval divided into n subintervals of equal length. If +the ith character is a dash or space, the ith subinterval is drawn +solid or empty, respectively. If the ith character is a period, a dot is +placed at the midpoint of the ith subinterval. + + This pattern is applied to a path-like object as follows. The page +length of each edge is divided by the current `dash_size' and the +ceiling (next largest integer) taken. This many copies of the current +path style are scaled onto the edge. The first and last characters are +adjacent in repeated units. + + There are three inequivalent ways to adjust the dash length/dot +spacing in a non-line path: Change the `dash_length', create a path +with a different number of points, or use a longer, repetitive pattern. +For best results, the style string should not be longer than about a +dozen characters. + + If you need several dashed/dotted line styles in multiple figures, +it's best to define a custom header instead of hard-coding line styles. +See Section *Note section:extensions::, for guidance. + + + +Two types of textual element may appear in a file: _labels_ (text +boxes) and _markers_ (`LaTeX' symbols). A marker occupies a box of zero +size, and is placed at a specified Cartesian location. A label has +typographical size, and is usually offset from its Cartesian location. +For placement, an _alignment point_ is attached to each label, and +Cartesian coordinates position the alignment point. + + + +A label is printed as a `LaTeX' box. By default, the alignment point +is its reference point, the intersection of the left edge and the +baseline, which is used by `LaTeX' to position the box on the +page:[Image] + + The alignment point may be _offset_ manually by a specified number +of `pt'. Additionally, a label's location with respect to the alignment +point can be chosen with an optional `LaTeX'-style alignment option. +This scheme allows labels to be placed easily where they will not +overlap other parts of the figure, and ensures labels stay properly +positioned when the size or aspect ratio of a figure changes. + + label(P posn, P offset, string msg, [align]); + label(posn, msg); + The first two components of the `offset' argument are numbers of `pt' +to shift the alignment point right and up. The optional `align' +argument may be one--or an appropriate pair--of `t', `b', `r', or `l' +(top, bottom, right, left), or `c' (center). These alignment options +specify the position of the label _relative to the Cartesian location_ +`posn', namely they work _opposite_ to the way they work in `LaTeX'. +[Image]\qquad [Image] + + The `msg' argument is usually a snippet of `LaTeX' code enclosed in +double quotes. `C++' treats "\" as an escape character, so a double +backslash is needed in the source to get a single backslash in the +output. For example, + + label(P(0,0), P(2,-1), "$\\rho = \\sin\\theta$", br); + positions an alignment point `2pt' right and `1pt' below the +(Cartesian) origin, and typesets the equation \rho=\sin\theta below and +to the right. + + Labels can be rotated; the (counterclockwise) angle is set in current +angle units with the command `label_angle(theta)'. For example, a +rotation angle of 90 degrees prints labels along a vertical axis. +Though label rotation has legitimate uses, it can make labels more +difficult to read, defeating their purpose. Do not use rotated labels +merely because they are available. As a practical matter, if an output +file contains rotated labels, the enclosing document must use the +`rotating' package. `elaps' automatically loads this package. + + An `affine' behaves moderately intelligently when acting on a marker +or label. The mapping is applied to the label's location, and the +"linear part" is used to adjust the offset and label angle. No attempt +is made to treat alignment. For best results, if a `screen' will have +an `affine' applied to it, label positions should be fine-tuned only +with offsets, not alignment arguments. In all situations, the font +itself is unchanged; no attempt is made to print sheared, scaled, or +reflected text. The sample file `inverse.xp' illustrates the effect of +affine maps on labels. + + + +By default, the font in an `ePiX' figure is that of the enclosing +document. The font size and face are changed with "declaration-style" +commands such as + +font_size("Large"); +font_face("sc"); + The argument of font_size is a valid `LaTeX' size. If no argument is +given, `normalsize' is understood. font_face accepts a two-letter +string, appended to the string "`text'" to give a `LaTeX' font +declaration command ("`textsc'" above). Finer-grained control is +accomplished by placing `LaTeX' commands into the label text. + + + +Each label command has a corresponding "mask" version (`masklabel') +that draws an opaque rectangle under the label text. The mask size +exceeds the label's size by an amount of _padding_, and the mask is +itself surrounded by a rectangular _border_, of specified color and +width. + + label_color(color); // set label text color + label_mask(color=White()); // set mask color + label_pad(string len); + + label_border(color, [len]); // set color (and line width) + label_border(len); // set line width only + no_label_border(); // turn off label borders + + + +`ePiX''s marker types, listed in Table *Note table:marker::, , are +obtained with the command marker(P pt, <MARKER TYPE>); Several +"dot-like" marker types are available by name: [Image] + + spot(P pt); dot(P pt); ddot(P pt); + --- box(P pt); bbox(P pt); + ring(P pt); circ(P pt); --- + A `circ' is filled with the current `mask_color', and a `ring' is +"hollow". Each dot-like marker can also be called with label syntax, +generating a labeled marker with one command. + + dot(P posn, offset=P(0,0), msg="", align=none); // etc. + + By default, `spot' and `ring' are 4 pt in diameter; `dot', `box', +and `circ' are 3 pt in diameter; `ddot' and `bbox' are 2 pt in +diameter. At arbitrary diameter, a `spot' is 4/3 the diameter of a `dot' +and a `ddot' is 2/3 the diameter. The command `dot_size(diam=3)' sets +the diameter of a `dot', and hence the size of all dot-like markers. + + +[Image] + +Table[tb] + + + +When constructing and placing a label, + * Offsets are specified in `pt' (true length), not Cartesian + units: A label's location relative to its alignment point should + not depend on the logical or printed size of the figure. + + * The label text is enclosed in double quotes (the single + character `"'), and contains the `LaTeX' code to generate the + label. Backslashes are doubled. + + + +Old-style color declarations set the fill color, line color, and text +color. + + rgb(r, g, b); cmyk(c, m, y, k); + rgb(P); cmyk(P); // for function-controlled colors + red(d); // similarly for other primaries + + + +File: epix.info, Node: Creating and Drawing Objects, Next: More About `C++', Prev: Drawing Attributes, Up: Reference Manual + +3.6 Creating and Drawing Objects +================================ + +Scene elements include geometric objects, coordinate grids, axis +labels, and function plots. A few commands create an object (a point, +line segment, circle, sphere, or plane) that can be used in subsequent +computations, but most drawing commands automatically create, draw, and +discard objects. + + + +The simplest object in the world, and by far the most common named data +structure, is `P', an ordered triple of real numbers (double-precision +floats). The function `P(x1,x2,x3)' creates the point (x_1,x_2,x_3). If +only two arguments are provided, x_3=0 by default. This convention +allows `ePiX' to treat 2- and 3-dimensional figures uniformly. The +standard basis is available: `E_1=P(1,0,0)', etc. + + Depending on context, a `P' may represent either a _location_ +(point) or a _displacement_ (vector). Almost all `ePiX' functions treat +a `P' as a point. However, algebraic operators and commands that plot +vector fields treat `P' arguments as displacements. + + Polar, cylindrical, and spherical coordinate `P' constructors are +sensitive to the current angular mode. + + P pt=polar(r,t); // (r*Cos(t), r*Sin(t), 0) + P pt=cis(t); // (Cos(t), Sin(t), 0) = polar(1, t) + P pt=cyl(r,t,z); // (r*Cos(t), r*Sin(t), z) + P pt=sph(r,t,phi); // polar(r,t)*Cos(phi) + (0,0,r*Sin(phi)) + + Algebraic operations--addition/subtraction, scalar multiplication; +scalar, cross, and componentwise products; orthogonalization--can be +performed on `P's. In compound expressions, the binary operators below +should be enclosed in parentheses, and scalars must be collected at +left, `P's at right. + + double u=pt.x1(); // first coordinate of pt, etc. + P(a,b,c)|P(x,y,z); // scalar product, ax+by+cz + P(a,b,c)&P(x,y,z); // componentwise product (ax, by, cz) + P(a,b,c)*P(x,y,z); // cross product (bz-cy, cx-az, ay-bx) + J(p); // quarter turn about the x3-axis + p%q; // orthogonalization, p (mod q) + Explicitly, `p\%q' is the unique vector `p+k*q' perpendicular to `q'. + + `P' operations express mathematical relationships, and therefore +imbue a figure with logical structure, making the input file easier to +read, modify, and maintain. Commonly, a file preamble will define a few +named points with hard-coded coordinates, then define additional points +of interest using `P' operators. + + + +In addition to `P', objects of type `Circle', `Plane', `Segment', and +`Sphere' can be used for Euclidean geometry constructions. Simple +affine operations are supplied for each type, as is a `draw()' +function, which represents the object as a path in the screen. + + obj.shift(P arg); // translate by arg + obj.move_to(P arg); // move center to arg + obj.scale(double c); // scale about center by c + obj.draw(); + A `Segment''s "center" is its midpoint. A `Plane' has no center; +`move_to' translates the `Plane' to pass through `arg', and `scale' has +no effect. + + A `Circle' data structure consists of a center, radius, and a +perpendicular unit vector. Three constructors are provided: + + Circle(center=P(0,0,0), double rad=1, normal=E_3); + Circle(P center, P point); + Circle(P p1, P p2, P p3); + The second constructor creates the `Circle' parallel to the (x_1,x_2) +plane, with given center, and radius equal to the distance between the +arguments. (A warning is printed if the second argument does not lie on +the circle, namely, if the arguments do not lie in a plane parallel to +the (x_1,x_2) plane.) The third returns the `Circle' passing through +the given points; the points must not be collinear. + + The data defining a `Circle' are recovered with member functions +named `center()', `radius()', and `perp()'. + + A `Plane' is specified by a point and normal vector, or by three +non-collinear points. The `draw()' function clips the plane and draws +the resulting polygon. Unless the clip box has been set manually, the +clipped polygon's vertices will have large coordinates. + + A `Segment' is constructed from its endpoints. The member function +`midpoint()' returns the center. + + A `Sphere' is specified by a point and a radius--by default the +origin and unity, or by the center and a point on the sphere. Member +functions `center()' and `radius()' return the defining data. +Capabilities specific to geography and spherical geometry are described +below, pp. *Note non-eucl::ff. + + The `draw()' function of a `Sphere' draws the horizon visible from +the current viewpoint. While this horizon is a circle in object space, +its image in the screen is generally an ellipse. Antipodal points are +not generally mapped to points symmetrically placed with respect to the +center of this ellipse. These effects are most pronounced when the +viewpoint is close to the `Sphere' and the center is not close to the +`target'. + + + +To facilitate geometric computation, `ePiX''s `Circle', `Plane', +`Segment', and `Sphere' classes can be intersected with the `*' +operator. + + A `Circle' has a center, radius, and unit normal; a `Plane' has a +distinguished point and unit normal; a `Segment' has two endpoints; a +`Sphere' has a center and radius. An object is _malformed_ if these +conditions are not met. The constructors return well-formed objects +with two exceptions: `Circle' and `Plane' create malformed objects if +called with three collinear points. The operator `*' returns a +malformed object if either argument is malformed, or if the operands +are disjoint, tangent, or coincident. Malformedness is benign: Calling +`draw()' on a malformed object does nothing. + + + +A `frame' comprises three mutually perpendicular unit vectors. The +constructor takes three vectors. The `frame''s third vector e_3 is +positively proportional to `v3', the second vector e_2 is positively +proportional to `v2\%v3', and the first is the cross product, +e_1=e_2\times e_3. Thus, a `frame' is right-handed, and does not depend +on `v1'. + + The elements of a `frame' are named `sea', `sky', and `eye', just as +for the `camera'. A `frame' can be rotated through an arbitrary angle +about any of its elements. + + frame(); // the standard basis {E_1, E_2, E_3} + frame fr(v1, v2, v3); // orthonormalize {v1, v2, v3} + fr.sea(); // the first element of fr, etc. + fr.rot1(theta); // rotate fr through theta about sea, etc. + + + +Basic path-like objects are drawn with named commands. Arguments of +polygon commands are endpoints/vertices. Except for `line' and `Line', +the following are subject to filling. + + line(P p1, P p2, [double expand]); + Line(p1, p2); // draw line through p1, p2 (crop required) + triangle(P p1, P p2, P p3); + rect(P p1, P p2); + quad(P p1, P p2, P p3, P p4); // quadrilateral + circle(ctr=P(0,0,0), rad=1, normal=E_3); + circle(ctr, pt); + circle(pt1, pt2, pt3); + The optional `line' argument is an expansion parameter: +`line(p1,p2,t);' draws a segment centered at the midpoint of `p1' and +`p2', with length scaled by 2^t/100. (Setting t=100 doubles the length, +while t=-100 halves the length.) The arguments of `rect()' must lie in +a plane parallel to a coordinate plane. The arguments to `circle' +commands are the same as for `Circle' constructors. + + Quadratic and cubic splines are described by their control points. A +list of `P' is drawn as a "natural" spline (the C^2 piecewise cubic +curve with vanishing second derivatives at the endpoints); the number +of points per cubic segment must be specified. Circular and elliptical +arcs are given by center, a basis, angular range, and an optional +number of intervals. + + spline(P p1, P p2, P p3, [int n]); // quadratic + spline(P p1, P p2, P p3, P p4, [int n]); // cubic + spline(vector<P>, int n); // natural spline + + arc(P ctr, rad, t_min, t_max); // parallel to (x1,x2)-plane + ellipse(P ctr, P v1, P v2); // in plane spanned by v1, v2 + ellipse(P ctr, P v1, P v2, t_min, t_max, [int n]); + If parameter bounds are omitted in an `ellipse' command, the entire +ellipse is drawn. When the angular range subtends one or more full +turns in an `arc' or `ellipse' the curve is subject to filling. + + Commands for planar (half-)ellipses remain from `ePiX''s early days: + + ellipse(P ctr, P radius); + ellipse_left(P ctr, P radius); + ellipse_right(P ctr, P radius); + ellipse_top(P ctr, P radius); + ellipse_bottom(P ctr, P radius); + If `radius' is `P(a,b)', these commands draw all or half of the +ellipse with given center in the (x_1,x_2) plane, axes parallel to the +coordinate axes, and axis lengths 2a and 2b. + + Two commands are available to mark off right angles or a subtended +angle. Each accepts a spatial location and two non-zero directions, and +draws a scene element in the plane spanned by the vectors. + + right_angle(P loc, P v1, P v2, scale=8); + arc_measure(P loc, P v1, P v2, scale=8); + arc_measure(P loc, P v1, P v2, offset, text, align, scale=8); + The `right_angle' command does not check its arguments for +perpendicularity. The `arc_measure' commands mark the _small_ angle +subtended by the directions; the label form places a label at the +midpoint of the arc. The (optional) `scale' argument is the true size +in `pt' of the marker. + + + +Consider a path made up of equal-length segments that can point at any +angle of the form 2\pi k/n radians, for 0\leq k<n, like spokes on a +wheel. A path is specified by a finite sequence of integers, taken +modulo n. For example, if n=6, then the sequence 0, 1, -1, 0 corresponds +to the ASCII path _/_. `ePiX''s fractal approximation starts with such +a "seed" then recursively (up to a specified depth) replaces each +segment with a scaled and rotated copy of the seed, Figure *Note +fig:fractal::, . The seed above generates the standard von Koch +snowflake fractal. In code: + + const int seed[] = {6, 4, 0, 1, -1, 0}; + fractal(P(a,b), P(c,d), depth, seed); + The first entry of `seed[]' (here 6) is the number of "spokes" n, the +second (4) is the number of terms in the seed, and the remaining +entries are the seed proper. The final path joins (a,b) to (c,d). The +number of segments in the final path grows exponentially in the depth, +so depths larger than 5 or 6 are likely to exceed the capabilities of +`LaTeX' and/or PostScript. + +[Image] + +Figure[hbt] + + + +Line segments, splines, and arcs can be drawn with arrowheads at one +end. In profile, an arrowhead's width is `3pt', and its height is 5.5 +times the width. The actual printed height depends on the head's +orientation with respect to the camera. By default, an arrowhead is a +filled triangle. The shape and size are adjusted with declarations: + + arrow_width(w=3); // width in pt + arrow_ratio(r=5.5); // height-to-width + arrow_inset(c=0); // base indent as frac of ht + [Image]\qquad [Image]\qquad [Image] \\ The `inset' must be between -1 +and 1. Each `arrow' command accepts an optional `scale' argument, which +scales the arrowhead. + + arrow(P tail, P tip, [scale]); + arrow(P p1, P p2, P p3, [scale]); // spline arrows + arrow(P p1, P p2, P p3, P p4, [scale]); + arrow(P ctr, P v1, P v2, t_min, t_max, [scale]); // ellipse + A few "special-purpose" commands are supplied: + + dart (P p1, P p2); // same as arrow(p1, p2, 0.5); + aarrow(P p1, P p2); // double-headed arrow <---> + arc_arrow(ctr, rad, t_min, t_max, [scale]); + If an `arc_arrow' is too short, nothing is drawn. + + + +`ePiX' provides an `axis' class for coordinate axes. Labels are +generated automatically in a variety of styles: decimal, scientific +notation, fraction, and trigonometric fraction. Logarithmic axes and +labels are available. Axis and labeling commands from Version 1.0 have +been retained. + + + +An `axis' consists of a line segment divided into a specified number of +equal-length subintervals by "major" (long) tick marks. Each +subinterval may be divided further by "minor" (short) tick marks. +Minor ticks may be equally-spaced ("Cartesian") or logarithmically +placed. Finally, a label is written at each major tick mark with +specified offset and alignment. Labels are generated automatically from +the endpoints, so the line should be parallel to a coordinate axis. +Label attributes (masking, borders, font size and face, rotation angle) +are determined by the current label style, not by the `axis'. + + The command + + axis(P tail, P head, int n, P offset=P(0,0), [align = none]); + creates an axis joining `tail' to `head', divided into `n' segments of +equal length, with a major tick mark and label at each division point +and endpoint. The `offset' and `align' arguments have the same meaning +as for ordinary labels. + + The number and length of minor ticks, and the alignment of ticks, are +controlled with member functions: + + axis Ax(P(a,c), P(b,c), n); + Ax.subdivide(n); // put n-1 minor ticks in each axis segment + Ax.tick_ratio(r); // minor length = r*major length + Ax.align(AL=c); // align all ticks; AL = t, b, l, r, or c + By default, major ticks are `6pt' long and twice the length of minor +ticks. The global declaration `tick_size(len)' sets the major length, +subject to "reasonable stylistic limits". For visual consistency, tick +lengths should not be changed casually. + + Labels on an `axis' may be drawn in several styles, selected with +member functions: + + Ax.dec(); // decimals (default) + Ax.frac(); // fractions, e.g. 0.5 -> \frac{1}{2} + Ax.trig(); // fractional multiples of \pi + Ax.sci(); // scientific notation, k\times base^N + + Ax.unmark(double); // remove label at selected location + Ax.precision(p); // set number of digits for decimal labels + Ax.align_labels(AL); // re-align labels + Arbitrary textual labels depending on one coordinate are obtained by +writing a `string'-valued function of `double' and "registering" it: + + // f represents x as a string in given precision and base + std::string f(double x, unsigned int prec, unsigned int base); + Ax.label_rep(f); + For example, textual tags can be printed instead of numeric labels. + + By default, an `axis' is Cartesian. The member function `log(int +b=10)' converts an `axis' to "log mode" with specified base; this +affects both tick marks and labeling. If `b' is at least 3, minor tick +marks appropriate for a logarithmic axis base `b' are drawn. Second, +labels are written in decimal or scientific notation appropriately for +a logarithmic axis; that is, "k\times b^N" (or its decimal value) is +written at location N+\log_b k. + + Minor ticks of a log `axis' may be labeled individually; again, this +is controlled with member functions: + + Ax.tag(d); // labels at N+log_b(d) + Ax.tag235(); // tag 2, 3, and 5 if b=10 + Ax.tags(); // tag 1, ..., b-1 + Ax.untag(); // remove all tags, including 1 + Ax.untag(double); // remove one tag, e.g. Ax.untag(9); + + For convenience, an `axis' object along an edge of the active +`screen' can be created with a named command: + + top_axis(n, offset, align); + bottom_axis(n, offset, align); + left_axis(n, offset, align); + right_axis(n, offset, align); + The ticks automatically point into the bounding box. + + The functions above create objects or set `axis' attributes, but +write no output. Tick marks and labels can be printed separately, or at +once: + + Ax.draw(); // axis, tick marks, and labels + Ax.draw_ticks(); // axis and ticks only + Ax.draw_labels(); + + + +`ePiX' formerly supplied commands for drawing simple axes and their +labels. These commands have been kept for compatibility. Horizontal +axes are generated with + + h_axis(p1, p2, n, align=c); // n subintervals (n+1 ticks) + h_log_axis(p1, p2, n, align=c, base=10); + For vertical axes, use `v_axis'. The style of tick mark is +appropriate for an axis of the given type. Horizontal axis tick marks +may be aligned `t' (above the axis) or `b' (below). Similarly, vertical +axis ticks may be aligned `r' or `l'. + + The endpoint arguments of a coordinate axis may be omitted, in which +case they default to p_1=(x_min,0) and p_2=(x_max,0) for a horizontal +axis, or to p_1=(0,y_min) and p_2=(0,y_max) for a vertical axis. If the +bounding box has integer width and/or height, omitting the number of +points draws tick marks one unit apart. + + Labels for a horizontal Cartesian or logarithmic axis are generated +with the commands + + h_axis_labels(P p1, P p2, int n, P offset, [align]); + h_axis_masklabels(p1, p2, n, offset, [align]); + h_axis_log_labels(p1, p2, [n], offset, [align], base=10); + h_axis_log_masklabels(p1, p2, [n], offset, [align], base=10); + Labels for a vertical axis are generated with `v_axis_labels', etc. +The labels are automatically generated to match their horizontal +location. The first puts (n+1) evenly-spaced labels on the segment +joining `p1' and `p2'. As with ordinary labels, the `offset' is in +`pt', and the optional `LaTeX'-style alignment option positions the +labels using their corners. The second command draws masked labels +according to the current label masking attributes. The third writes +labels in exponential notation, using the Cartesian coordinate as +exponent. + + As for coordinate axes, the initial and final points may be omitted +in an `axis_[mask]labels' command, with the same defaults. The +`offset' and number of labels must always be specified. + + + +Broken axes are best drawn using page layout, especially if axis labels +are to be drawn. To accomplish the task, create a screen for each piece +of axis, using appropriate Cartesian coordinates for the corners, then +`inset' the screens so the axis pieces are nearly end to end. A zig-zag +glyph signifies the break: + + axis_break(P, P, scale=12); + The `P' arguments are the screen coordinates of the ends to be joined; +the optional third argument is the true height and width in `pt' of the +glyph. The sample file `coord_tricks.xp' uses layout and axis breaks. + + + +Cartesian grids fill a coordinate rectangle, and have a specified +number of lines in each direction. A polar grid has specified radius, +and numbers of rings and sectors. + + grid(n1, n2); // fills the bounding box + grid(p1, p2, n1, n2); // fills the box with corners p1, p2 + polar_grid(r, n1, n2); + + Log and semi-log grids are drawn with analogous syntax: + + log_grid (p1, p2, n1, n2, [base1], [base2]); // log-log + log1_grid(p1, p2, n1, n2, [base]); // log-lin + log2_grid(p1, p2, n1, n2, [base]); // lin-log + The n_i arguments dictate the number of squares, namely the number of +orders of magnitude spanned in the logarithmic direction(s). The +(optional) base arguments default to 10, and control the number of +lines drawn per order of magnitude. As with Cartesian grids, the +corners are optional; if omitted, the grid fills the bounding box. + + Graph paper may be created by superimposing grids: + + pen(0.25); + grid(10*xsize(), 10*ysize()); + pen(0.5); + grid(2*xsize(), 2*ysize()); + pen(1); + grid(xsize(), ysize()); + + + +A `path' data structure is an ordered list of points that can be +cropped, clipped, mapped, concatenated, and drawn. The first four +constructors mirror polygon-drawing commands above. Function graphs +and parametric paths are built from a real- or `P'-valued function `f' +of one variable. + + path(p1, p2, expand=0); // line (endpoints) + path(p1, p2, p3, [n]); // quadratic spline + path(p1, p2, p3, p4, [n]); // cubic spline + path(p1, v1, v2, t_min, t_max, [n]); // ellipse + path(f, t_min, t_max, [n]); + + The member function `pt()' accepts a `P' or three (or two) doubles +and appends the specified point to a `path'. This snippet creates a +regular n-gon: + + path ngon; // declare new path + for (int i=0; i<=n; ++i) + ngon.pt(cis(i*full_turn()/n)); // works in all angle modes + Compound paths may be built by concatenation. If `path1' and `path2' +share an endpoint, the commands + + path1 += path2; + path1 -= path2; + replace `path1' with the result of traversing `path1' "forward", then +following `path2' in the forward or reverse direction (respectively). +For expected results, the first (or last) point on `path2' should be +the last point of `path1'. The notation suggests 1-dimensional homology +chains. The sample file `contour.xp' illustrates path creation and +manipulation. + + A `path' is a data structure, and must be drawn explicitly to create +visible output. By default a `path' is not a closed loop (even if the +first and last points are the same), and is not filled when drawn. +Member functions perform these tasks. Continuing the n-gon snippet +above, + + ngon.close(); // mark path as closed + ngon.fill(); // draw filled region if filling is active + ngon.draw(); // print to the screen + `path::close()' adds a closing edge if necessary. Once a `path' is +closed, no more points can be added. A closed path clips and crops +differently than an open `path' with the same data. `path::fill()' has +no effect on an unclosed `path'. + + + +The noun "map" refers to a `C++' function that accepts one or more +`double' arguments and returns a `double' or a `P'. Mathematically, a +map can be depicted in two ways: as a graph (which retains information +about the domain), or as a parametrized curve or surface (which +discards domain information). `ePiX' assumes that `double'-valued maps +are graphed and `P'-valued maps are drawn parametrically. Either sort +of depiction is called a "plot". `ePiX' plots are either "wire mesh", +produced by a `plot' command, or "shaded", produced by a `surface' +command. + + + +For the moment, "function" means "function of one variable" (precisely, +a `double'-valued function of a `double' variable). A function graph +depends on the domain and the number of points to use. Each of the +commands + + plot(f, t_min, t_max, n); + polarplot(f, t_min, t_max, n); + shadeplot(f, t_min, t_max, n); + graphs the function `f' on the interval `[t_min, t_max]' by dividing +the interval into `n' subintervals of equal length. The first gives a +Cartesian plot, the second a polar plot with bounds in current angular +units, the third shades the region between the graph and the horizontal +axis. If two functions are given to `shadeplot', the region between +their graphs is shaded. + + + +An `ePiX' `domain' is a coordinate box of dimension one, two, or three, +specified by a pair of opposite corners and two _meshes_ ("coarse" and +"fine", respectively) which specify the amount of data to be plotted. +Plotting is explained in detail below. + + // [a1,a2] x [b1,b2]: n1 x n2 rectangles, m1 x m2 intervals + domain R2(P(a1,b1), P(a2,b2), mesh(n1,n2), [mesh(m1,m2)]); + + // [a1,a2] x [b1,b2] x [c1,c2] divided analogously + domain R3(P(a1,b1,c1), P(a2,b2,c2), + mesh(n1,n2,n3), [mesh(m1,m2,m3)]); + If unspecified, the fine mesh is the same as the coarse mesh. For +expected behavior, the coarse mesh should "divide" the fine mesh, in +that m_i should be a (usually small) integer multiple of n_i for each i. + + A `domain' may be _resized_ in any coordinate for which the +thickness is positive, and can be _sliced_ by setting one variable to a +constant. The result of slicing is a `domain' whose dimension is one +smaller than the original. Finally, "`slices'" operators return the +list of `domain's obtained by setting one variable to evenly-spaced +constants. By default, the number of slices is specified by the coarse +mesh. An optional argument specifies the number of slices. This +argument need not be related to the coarse mesh. + + R2.resize2(a,b); // [a1,b1] x [a,b] + R2.slice1(t); // set x1 = t + R3.slices3([n]); // (n+1) domains with x3 = const +[Image] + + \smallskip When possible, resizing preserves grid square sizes. +Generally, though, integer truncation occurs: If `R=domain(P(0,0), +P(1,1), mesh(10,6))', then `R.resize1(0,0.25)' is the rectangle +[0,0.25]\times[0,1] subdivided into 2\times6 subrectangles, since +10\div4=2 in integer arithmetic. For expected behavior, choose mesh +sizes to avoid integer truncation. + + The arguments of a `plot' command are a map, followed by either a +domain or its logical equivalent. + + double f(double t) { return t*t; } + P F(double u, double v) { return P(u, v, exp(u)*Sin(v)); } + P G(double u, double v, double w) { return P(v*w, u*w, u*v); } + + plot(f, a, b, n); // f:[a,b] -> R, using n intervals + plot(F, R2); // graph of exp(u)*Sin(v) + plot(G, R3.slice2(0.5); // G: R^3 -> R^3 restricted to y=0.5 + By (compiler-enforced) convention, `plot' commands involving a +`P'-valued map accept a `domain' argument, as in the second and third +commands above. To plot a `double'-valued function, by contrast, supply +the logical equivalent of a `domain', usually the endpoints and the +number of intervals, as in the first `plot' command above. + + Resizing and slicing allow a map `F' to be plotted selectively over +parts of its domain. This can be used to emphasize parts of the image, +layer scene elements, patch surfaces together, and so forth. Resize +and slice(s) commands may be used directly in a `plot' command: + + plot(F, R2.resize1(0,0.5)); + plot(F, R2.slices1()); + + + +The `P' arguments of a `domain' are a pair of opposite corners. The +first `mesh' argument, the _coarse_ mesh, specifies the number of +subdivisions in each coordinate direction. The second `mesh', the +_fine_ mesh, determines the number of points used in each direction +when plotting. + + Separating the roles of coarse and fine meshes allows a plot to +conform closely to a surface without using a fine grid of curves. Both +parts of Figure *Note fig:plot::, are drawn with a 6\times20 coarse +mesh. In the first picture, the fine mesh is also 6\times20, while in +the second, the fine mesh is 12\times60. + + +[Image] [Image] + +Figure[hbt] + + The coarse mesh is significant only for domains of dimension at +least 2. The coarse mesh's size determines the number of curves or +surfaces plotted _perpendicularly_ to a coordinate direction, while the +fine mesh's size determines the number of segments used _along_ that +direction. For predictable results, the fine mesh should be a small +multiple of the coarse mesh. + + Plotting works analogously for 3-dimensional `domain's and maps +depending on three variables: The "one-dimensional skeleton" of the +`domain''s image is drawn. A `P'-valued map of three variables can be +plotted over a 1- or 2-dimensional `domain'. (The effect may be +unexpected unless the domain arises by slicing, however.) A map +depending on one or two variables cannot be plotted over a +3-dimensional `domain'. + + + +`ePiX''s shaded surface plotting implements a degree of hidden surface +removal. The algorithm breaks a surface into mesh fragments, sorts them +in decreasing (approximate) distance to the camera, and prints them. +If filling is active, a mesh fragment is shaded according to the angle +between the normal vector and the direction to the camera, simulating +constant ambient lighting; otherwise, the current fill color is used. +This technique works fairly well for surfaces without intersection, and +even acceptably handles intersecting surfaces for which mesh elements +intersect only along boundaries. + + The syntax of a `surface' command is identical to a `plot' command +when only a single surface is drawn. For example, + + surface(F, R, cull=0); + plots the `P'-valued function `F' over the domain `R', the shaded +equivalent of the corresponding `plot' command. The optional `cull' +argument removes elements that point toward (`cull=-1') or away from +(`cull=1') the camera. Naturally, orientation of mesh elements depends +on the parametrization `F', not merely on the surface. Culling reduces +the output file size, but is useful mostly for closed, convex surfaces. + + There are special commands for surfaces of rotation; each accepts a +final `cull' argument. + + surface_rev(f, t_min, t_max, n_lats, n_longs); + surface_rev(f, g, t_min, t_max, n_lats, n_longs=24); + surface_rev(f, g, R, frame coords); + The first revolves the graph of f about the x-axis, the second uses +the parametric curve t\mapsto\bigl(f(t),g(t)\bigr) as profile. In each +case, the parameter interval [t_min,t_max] is divided into n_lats +equal-length subintervals, n_longs copies of the profile curve are +drawn, and the complete surface (one full turn) is drawn. + + The third form uses a `domain' to control the range of longitudes, +and draws a surface of rotation in the Cartesian coordinate system +defined by the orthonormal basis `coords', by default the standard +basis. The arguments `f' and `g' define a parametric curve in the plane +spanned by the first two elements of `coords', and the first element is +the axis of rotation. + + As in wire mesh plotting, the fine mesh is used to draw the +boundaries of surface patches; this tends to make surfaces look +smoother for modest-sized coarse meshes. If the coarse mesh is too +coarse, however, two visually undesirable effects can occur. First, +adjacent regions of the surface may be shaded very differently, since +shading is constant over patches defined by the coarse mesh. Second, a +patch nearly tangent to a line of sight may be drawn badly if the patch +bends back on itself, since the boundary of the _patch_ is drawn, not +the visible edge of the mathematical surface. See +`samples/artifacts.xp'. + + + +A scene containing two or more shaded surfaces cannot generally be +built up one surface at a time. Instead, multiple surfaces must be +assembled into a single data structure before they can be drawn. +Multiple surfaces are built from one or more maps and one or more +2-dimensional `domain's. In the code snippets below, `F' and `G' are +`P'-valued functions of 3 variables, and `R' is a 3-dimensional +`domain'. + + To plot the images of several `domain's under a _single map_, +assemble the `domain's into a list if necessary, then issue a `surface' +command: + + surface(F, R.slices3(), cull=0); + + domain_list DL(R.slice1(0)); // build domain list + DL.add(R.slice2(0.5)); // add a domain, etc. + surface(G, DL, cull=0); // draw + For multiple maps, `ePiX' provides the `scenery' class. Conceptually, +`scenery' is an agglomeration of shaded surfaces, built one surface at +a time from maps and 2-dimensional `domain's. The `add' function +accepts two arguments--a map, and either a `domain' or a list of +`domain's--and contributes its data to the `scenery' rather than +plotting immediately. Completed `scenery' is drawn manually. + + scenery S(F, R.slice3(0.25)); // S contains one surface + S.add(F, R.slice2(0)); // S contains two surfaces + S.add(G, R.slices1(3)); // S contains six surfaces + S.draw(cull=0); + Complete examples are included in the `samples' directory: +`spherical.xp' and `minkowski.xp'. + + In principle, a scene may contain arbitrarily many surfaces. However, +figures that contain many objects tend to tax `LaTeX''s internal +stacks. Frequent color changes exacerbate the problem. Even if you use +`hugelatex' (or increase `LaTeX''s memory), a figure containing more +than a few thousand mesh elements is unlikely to compile. At moderate +resolution, a surface can easily contain 1000 patches. Each shell +script has a command-line option to invoke `hugelatex'; your mileage +may vary. + + + +By default, a `surface' or `scenery' is colored according to the +current fill color. For finer control, each `surface', `surface_rev', +and `scenery' command accepts an optional position-dependent `color' +specification. + + surface(F, R, color, cull=0); + surface_rev(f, [g], t_min, t_max, n_lats, n_longs, color); + surface_rev(f, g, R, color, [coords]); + + scenery S(F, R, color); + S.add(F, R, color); + The `color' argument is a `P'-valued function of two or three +`double's whose output is interpreted as a set of `RGB' densities. If +`color' takes two arguments, they are `domain' coordinates, and the +surface is colored according to parameter values. If `color' takes +three arguments, they are Cartesian coordinates, and the surface is +colored according to spatial location. Please see the sample files +`surface_shade.xp' and `S2_harmonics.xp'. + + + +`ePiX' provides high-level commands for plotting derivatives and +definite integrals, Riemann sums, tangent lines, slope- and vector +fields, and solutions of planar and spatial systems of differential +equations. + + In this section, `f' and `g' are `double'-valued functions of one +variable. + + + + + sup(f, a, b); // max/min of f on [a,b] + inf(f, a, b); + newton(f, g, x0); // find approximate crossing point + Newton's method returns the crossing point of the given functions, +starting from the specified seed, which should be reasonably close to +the expected solution. If a critical point is hit or 5 iterations pass, +a warning is issued and the current result (probably incorrect) is +returned. The second function g defaults to the zero function if +omitted. + + + +The classes `Deriv' and `Integral' are used to calculate values of +derivatives and integrals, and to plot these functions. + + Deriv df(f); // function object: df(x) = f'(x) + df.eval(t); // return f'(t) + df.left(t); // deriv from left at t: (f(t)-f(t-dt))/dt + df.right(t); // deriv from right at t: (f(t+dt)-f(t))/dt + + Integral prim(f,a); // function object: prim(x) = int_a^x f + prim.eval(b); // numerical integral of f over [a,b] + double val(Integral(f).eval(1)); // val = \int_0^1 f + The lower limit on an integral is 0 by default. `Deriv's and +`Integral's can be used directly in a `plot' command: + + plot(Deriv(f), a, b, n); // plot f' over [a,b] + plot(Integral(f, x0), a, b, n); + riemann_sum(f, a, b, n, TYPE); + The second graphs the definite integral x\mapsto\int_x_0^x f(t)\,dt +over [a,b]. As above, x_0 defaults to 0. The third draws rectangles or +trapezoids whose area approximates the definite integral of f over +[a,b]. The `TYPE' may be `UPPER', `LOWER', `LEFT', `RIGHT', `MIDPT', or +`TRAP'. + + Tangent lines and envelopes (families of tangent lines) are drawn +with + + tan_line(f, t); // f real- or vector-valued + envelope(f, t_min, t_max, n); // family of tangent lines + tan_field(f, g, t_min, t_max, n); // field of tangents + The sample files `conic.xp' and `lissajous.xp' illustrate these +features. + + + +Let `F' be a `P'-valued function of two or three variables. + + ode_plot(F, p_0, t_min, t_max, n); + flow(F, p_0, t_max, n); + The first plots the solution curve of the initial-value problem +\dotx=F(x), x(0)=p_0, over the specified time interval. If t_min is +omitted, its value is 0, so the curve starts at p_0. With manual +calculation to rotate a planar field a quarter turn, `ode_plot' can be +used to draw level curves (isobars) of a function of two variables; see +the sample file `dipole.xp'. The `flow' function returns the result of +starting at p_0 and flowing by F for time t_max, using Euler's method +with n time steps. This is useful for placing markers or arrowheads +precisely along a flow line. + + A planar or spatial vector field itself may be plotted over a domain +`R' in three styles: + + vector_field(F, R, [scale]); // true length + dart_field (F, R, [scale]); // const length + slope_field (F, R, [scale]); // const length + The field is sampled at the grid points of the coarse mesh. If the +domain is 2-dimensional, the plot is a planar slice of the field, even +if the field depends on three variables. If the domain is +3-dimensional, the field is drawn in successive slices x_3=const, +starting at the height of the first corner of `R' and ending at the +height of the second corner. + + The optional final argument, which defaults to 1, scales the +arrowheads in a vector field, and scales the (constant) length of field +elements for slope and dart fields. The sample files `layout2.xp', +`lorenz.xp', `slopefield.xp', and `vfield.xp' illustrate usage. + + In each field-plotting command, the domain argument may be replaced +by two points, representing corners of a coordinate rectangle, and two +integers, the number of grid intervals in the selected coordinate +directions. Only planar slices of a vector field can be plotted using +the alternative syntax. + + + +`ePiX' provides limited features for spherical and hyperbolic geometry: +the ability to draw lines in the half-plane and Poincar\'e disk models +of the hyperbolic plane, and to draw latitudes, longitudes, great +circle arcs, spherical triangles, regular polyhedra, and parametrized +curves on a sphere. + + Hyperbolic line segments are specified by their endpoints in the +upper half space or ball (Poincar\'e) models. In each case there is no +output if either endpoint lies outside the model. + + hyperbolic_line(p, q); + disk_line(p, q); + For compatibility with 2-dimensional hyperbolic space, the half-space +model is the set \(x_1,x_2,x_3)\mid x_2>0\. + + A `frame' determines geographical coordinates on a `Sphere': the +first element points toward longitude 0 on the equator, the third +element points to the north pole. A latitude line depends on a +`Sphere', a `frame', the numerical latitude, and a range of longitudes. +A longitude line is described similarly. + + latitude(lat, long_min, long_max, Sphere S, frame coords); + longitude(lngtd, lat_min, lat_max, Sphere S, frame coords); + By default, `coords' is the standard `frame' and `S' is the unit +sphere. These commands draw only the portion of the curve that is +visible from the current viewpoint. The function `back_latitude' draws +the invisible portion of a latitude line. + + Spherical arcs and triangles are described by their endpoints. Only +the direction vector from the center of the sphere to an endpoint is +significant; if a sphere is scaled or moved, the same function call +will draw the corresponding object on the new sphere. + + The following draw the visible (front) portions of great circle arcs: + + front_arc(p1, p2, S); // short arc on S from p1 to p2 + front_arc2(p1, p2, S); // arc from p1 to -p1 through p2 + front_line(p1, p2, S); // great circle through p1 and p2 + Triangles and regular (Platonic) polyhedra are provided. The sample +file `sample/polyhedra.xp' illustrates usage. + + front_triangle(p1, p2, p3, S); // spherical triangle + front_tetra(S, coords); // regular tetrahedron + front_cube(S, coords); // hexahedron + front_octa(S, coords); // octahedron + front_dodeca(S, coords); // dodecahedron + front_icosa(S, coords); // icosahedron + Each function has a `back' version, which draws the hidden portion. +The tetrahedron, cube, and octahedron are (up to scale) inscribed in +the cube of side length 2 centered at the origin whose sides are +parallel to `frame'. The point (1,1,1) is a vertex of the tetrahedron. + + Up to scale, the icosahedron's vertices lie on the golden rectangle +with vertices (\pm\gamma,0,\pm1) and its images under cyclic +permutation of coordinates. The dodecahedron is dual to the icosahedron. + + + +Parametrized paths on a `Sphere S' (by default the unit sphere) can be +specified either by radial projection of a `P'-valued curve, or by +stereographic projection of a plane curve given as a pair of +`double'-valued functions: + + frontplot_R(phi, t_min, t_max, n, [S]); // radial + frontplot_N(f1, f2, t_min, t_max, n, [S]); // from north pole + frontplot_S(f1, f2, t_min, t_max, n, [S]); // from south pole + Attempts to perform radial projection on a path through the origin +will generate division-by-zero errors. Stereographic projection maps +the equatorial plane \x_3=0\ to the unit sphere by projection from the +corresponding pole: N=(0,0,1), S=(0,0,-1). + + Each spherical plot command has a `back' version that prints only +the portion of the path invisible from the current viewpoint. Because +of the way `ePiX' layers output, it is generally best to put hidden +portions of the input before visible portions, with line width and/or +style that suggests hidden lines. + + + +Files of numerical data can be created, manipulated, analyzed, plotted +(paths, scatter plots, and histograms), read, and written. The format +for a data file is one or more floating-point numbers per line, with +the same number of entries per line. Anything that appears on a line +after the `LaTeX' comment character `\%' is a comment. + + `ePiX' provides two `plot' commands for file data. The first +facilitates plotting selected columns; the second simplifies plotting +the first two columns with one or both scales logarithmic. Either form +can be used to plot selected columns logarithmically. + + The general commands read numbers from two or three columns of a +specified file, pass them as arguments to a `P'-valued function `F', +and plot the resulting points: + + plot("filename", STYLE, [i_1], [i_2], [i_3], [F]); + plot("filename", STYLE, F, [i_1], [i_2], [i_3]); + The first argument is the name of the data file. The `STYLE' may be +`PATH', which joins the points in the order they appear, or any of the +marker types in Table *Note table:marker::, . The integers i_k specify +columns from which to extract data; these default, respectively, to the +first column, second column, and null (a column of zeroes). If the +"coordinate system" `F' is omitted in the first command, it defaults to +the Cartesian point constructor. The function `F' is mandatory in the +second form; useful choices include `log_log', `log_lin', and +`lin_log', which plot the corresponding coordinate logarithmically. + + + +For more elaborate analysis, the `data_file' class presents an +interface to a file as an ordered list of columns. There are two +general ways to create a `data_file': read in an external file, or +generate data (up to three columns) using specified `double'-valued +functions. In the constructors below, each function `fi' is a +`double'-valued function of one variable. + + data_file DF("my_data"); // read data from disk file + data_file DF(f1, t_min, t_max, num_pts); // values of f1 + data_file DF(f1, f2, t_min, t_max, num_pts); + data_file DF(f1, f2, f3, t_min, t_max, num_pts); + data_file DF(3); // create empty data_file with 3 columns + DF.read("file1"); // read a disk file + + Columns of a `data_file' can be transformed by a user-specified +function, averaged, correlated, extracted (for use by other code), +scatter plotted, and written to a disk file at specified precision. +Below, the function `f' is a `double'-valued function of one variable +and `F' is a `P'-valued function of two or three variables, whose +components are written back to the selected columns. + + DF.transform(f, i); // apply f to selected column(s) + DF.transform(F, i=1, j=2); + DF.transform(F, i, j, k); + Basic statistical operations on columns are provided. + + DF.dot(i,j); // dot product of columns i, j + DF.avg(i); // mean of column i + DF.var(i); // population variance + DF.covar(i,j); // covariance + DF.regression(i,j); // plot regression line + A `data_file' is scatter plotted using syntax as described above. % +The output is cropped automatically to the bounding box. + + DF.plot(STYLE, [i1], [i2], [i3], [F]); + DF.plot(STYLE, F, [i1], [i2], [i3]); + Histograms and bar charts are described below. + + A `data_file' can be written to a disk file as raw data, or in +specified format. Below, `fmt' denotes a `string'-valued formatting +function of two variables and `myfile' is the name of the disk file to +be written. + + DF.precision(4); // set to 4 significant figures + DF.write("myfile"); // write as tab-separated columns + DF.write("myfile", fmt, [i1], [i2]); // apply fmt to cols + A column can be extracted as a `C++' `vector' for use by another +function. + + DF.column(i); // i-th column + DF.column(f, i); // i-th column, transformed by f + + + +`ePiX' provides a `data_mask' class for culling data from a file +according to the values in a specified column, and a `data_bins' class +for sorting data by value. + + A `data_mask' consists of an interval of numbers and a "filter" +function. The (closed, open, or half-open) interval is given as a +string in standard mathematical notation, or by its endpoints (for a +closed interval). The filter is a `double'-valued function of +`double', by default the identity, f(x)=x. + + data_mask dm("[a, b]", [f]); + data_mask dm(a, b, [f]); + A `data_mask' "passes" inputs x if f(x) lies in the interval. The +member function `reverse()' inverts this logical test. + + The `data_file' class has `prune' functions to cull rows for which a +specified column's entry satisfies a `data_mask''s criterion. + + DF.prune(dm, i); // remove row if i-th column entry fails + DF.prune(a, b, i); // remove row if i-th column outside [a,b] + + A `data_bins' object models an interval divided at specified +locations into "bins", not necessarily of equal length. Numerical data +is read in and the number of points in each bin counted. The lifetime +of a `data_bins' object has two stages. First, "cuts" (endpoints of +subintervals) are added. Then, once data is read, the cuts are "locked" +and cannot subsequently be changed. + + // [xmin, xmax] divided into n equal intervals, 1 by default + data_bins db(xmin, xmax, [n]); + db.cut(x); // add a cut at x (if x is in bounds) + db.read(vector<double>); // read data, lock bins + + A `data_bins' object can be plotted as a histogram (rectangles' +_area_ is proportional to the bin population), bar chart (rectangles' +_height_ is proportional to the bin population), or spline +interpolation of a bar chart. + + db.histogram(c=1); // c = vertical scale factor + db.bar_chart(c=1); + db.plot(c=1); + By default (`c=1'), the height of a bar chart rectangle is the +fraction of the total population contained in the bin; thus, the height +is always between 0 and 1. For a histogram, the height of a rectangle +is the fraction of the population per horizontal unit in the bin; thus, +the total area over an interval [a,b] does not depend on how [a,b] has +been subdivided. The sample files `dataplot.xp' and `histogram.xp' +illustrate use. + + Statistical convention dictates cuts be chosen distinctly from data +values; that is, values should all fall strictly within a bin, not at a +boundary point. With large, unknown data sets, this convention may be +difficult to uphold. `ePiX' attempts to handle anomalous data +intelligently, by keeping counts of values "out-of-range" or "on-cut". + + In detail, if x<a or x>b is a data value, it is counted as +out-of-range and does not contribute to the histogram population. If +x=a or x=b, the value counts as both out-of-range and on-cut but is +added to the population of the lowest or highest bin, respectively. Any +other cut appearing as a data input is flagged as on-cut, and +increments the population of each adjacent bin by one-half. When a +histogram or bar chart is written, `ePiX' prints a warning message +summarizing the number of anomalous data seen. + + + +Simple horizontal and vertical error bars are provided. The final +(optional) argument is the true height or width (respectively) in pt. + + h_error_bar(P location, double error, <mark type>, ht=6); + v_error_bar(P location, double error, <mark type>, wd=6); + + To create more complex elements, such as asymmetric bars, whisker +plots, labeled error bars, and the like, write a custom function using +true-size drawing, see page *Note truesize::. For example, a fillable, +labeled, asymmetric, vertical rectangular error bar can be implemented +(entirely in `ePiX') like this: + + void error_bar(P loc, double lo, double hi, P offset, + std::string text, align, double wd=6) + { + const double width(pt_to_screen(0.5*wd)); // converts to 3pt + rect(loc - P(width, lo), loc + P(width, hi)); + line(loc - P(width, 0), loc + P(width, 0)); + label(loc + P(width, 0), offset, text, align); + } + For stylistic uniformity, functions such as this should be put into a +library and used systematically. Section *Note section:extensions::, +outlines the process of writing, compiling, and using a custom library. + + + +A `legend' systematically labels different parts of a plot by +associating visual "keys" with explanatory text. This tends to be most +useful for plots containing several distinct but conceptually related +graphs requiring contrast. + + Visually, a `legend' is represented as an aligned list of rows, each +containing a box (the key), a gap (the label skip), and some text. +These rows are printed in a (usually large) masked label. By default, +keys are `12pt' squares bordered in black, the label skip is `6pt', the +background is white, and the border is plain black. These attributes +are controlled (simultaneously for all items) with member functions. +Parameters of type `double' represent lengths in `pt'. + + legend L; + L.backing(color); // set background + L.border(color, [double]); // set border color [and width] + L.border(double); // border width + + L.item_border(color, [double]); + L.item_border(double); // same, for item borders + + L.label_skip(double); + L.key_size(double); + + + +There are three types of legend key, representing filled regions, +paths, and markers. Fill and path keys get their visual attributes from +the current drawing state. A mark key must be told the marker type. +Each is created by specifying the item text. + + L.fill_item(text); + L.path_item(text); + L.mark_item(<mark type>, text); + Keys in the printed legend appear in the same order they are created +in the input file. + + + +Normally, a `legend' is defined near the start of a file, and an item +is added at the point in the file where the corresponding object or +plot is drawn, so that the item receives the correct attributes. A +`legend' is placed into the figure with the `draw' function. The +arguments have the same meaning as for ordinary `label's. + + L.draw(P location, P offset, align); + All three arguments are mandatory. "Global" `legend' settings +(border, backing, etc.) may be changed anywhere between the `legend''s +creation and `draw' function. The sample file `legend.xp' revisits the +example on page *Note taylor_poly::, including a trig-labeled axis and a +legend. The file `shadeplot.xp' contains filled keys, and `dataplot.xp' +contains a `legend' with items of mixed type. + + +File: epix.info, Node: More About `C++', Next: Attribute Quick Reference, Prev: Creating and Drawing Objects, Up: Reference Manual + +3.7 More About `C++' +==================== + +A textbook or similarly detailed reference is essential for serious +study of `C' or `C++'. _The `C' Programming Language_, second edition, +by Kernighan and Ritchie `KnR', is an excellent, manageable resource +for the basics of procedural programming. _C++ Primer Plus_, by Stephen +Prata `Prata', clearly lays out the extensive details of `C++'. +Marshall Cline's _`C++' FAQ Lite_ `Cline' engagingly discusses common +points of confusion and furnishes tips on good design and programming. + + `C++' is a powerful, complex language whose syntax is similar to that +of `C', or to the scripting languages of Maple and Mathematica. An +`ePiX' input file is source code for a `C++' program that writes a +`LaTeX' picture as output. `ePiX' may be viewed as an extension to +`C++'; in the same way that `LaTeX' furnishes a high-level interface to +`TeX', `ePiX' provides a high-level bridge between the computational +power of `C++' and the `LaTeX' `picture' environment. + + Like all high-level programming languages, `C++' provides variables, +functions, and control structures. Variables hold pieces of data such +as numerical values and geometric locations, while functions operate on +data. A control structure, such as a loop or conditional statement, +affects the program's course according to the program's current state. +A source file is composed primarily of "statements", which perform +actions ranging from defining variables and functions to setting figure +attributes, performing calculations, and writing objects to the output +file. + + + +Names of variables and functions may consist (only) of letters, digits, +and the underscore character. The first character of a name must not be +a digit, and the language standard reserves names starting with +underscore for library authors. Names are case-sensitive, but it's +usually a bad idea to use a single name capitalized and uncapitalized +in a single file. Numerous capitalization conventions are used +informally; this document uses uncapitalized words separated by +underscores for variables and functions, and occasionally uses all +capitals for constants. As with names of `LaTeX' macros, primary +considerations are clarity (of meaning), readability, and consistency. + + Every variable in `C++' has a "type", such as integer (`int'), +double-precision floating point (`double'), or Boolean (`bool', true or +false). `ePiX' provides additional types, the most common of which is +`P', for point. The construct `P(x,y,z)' creates (x,y,z), while +`P(x,y)' gives (x,y,0), which is effectively the pair (x,y). A variable +is defined by giving its type, its name, and an initializing expression. + + In `C' and `C++', a _pointer_ variable holds the memory address of +another variable. Pointers are useful for manipulating (possibly large) +data structures through "handles" of fixed small size. `C++' also +provides _references_, which bind an additional name to an existing +object and allow the object to be manipulated through this alias. The +statements + + double x=1; // ordinary variable definition + double& rx=x; // bind a reference, signified by & + define a variable `x' having the value 1, and bind a reference +variable `rx' to it. As long as `rx' exists, it refers to `x'. If the +value of `x' changes, the value of `rx' does as well. Conversely, the +value of `x' can be altered by assigning to `rx'. However, `rx' is the +size of a pointer, regardless of the size of `x', so `rx' can be passed +efficiently in a function call. + + + +In a programming language, the term "function" refers to a block of +code that is executable by name. A `C++' function takes a list of +"arguments", and has a "return value". This information, together with +the function's name, must be provided when a function is defined. A +function may not be defined inside another function. However, a +function may call other functions (including itself) as part of its +execution: + + int factorial(unsigned int n) + { + if (n == 0) return 1; + else return n*factorial(n-1); + } + + The special type `void' represents a "null type". A function that +performs an action but does not return a value has return type `void'. +A function that takes no arguments may be viewed as taking a single +`void' argument. + + Every `C++' program has a special function `main()', which is called +by the operating system when the program is run. The arguments of +`main()' are command-line arguments, and the return type is an integer +that signals success or failure. User-specified functions must be +defined before the call to `main()' or in a separately-compiled file. + + Functions in `C++' may be as simple as an algebraic formula or as +complex as an arbitrary algorithm. Greatest common divisors, finite +sums, numerical derivatives and integrals, solutions of differential +equations, recursively generated fractal curves, and curves of best fit +are a few applications in `ePiX'. Several sample files contain +user-level algorithms, which do not require knowledge of `ePiX''s +internal data structures. The source file `functions.cc' contains +simple functions defined by algorithms, and `functions.h' illustrates +the use of `C++' templates. Other source files, such as `plots.cc', may +be consulted for Simpson's rule, Euler's method, and the like. + + + +`C++' knows several familiar mathematical functions by name: + + sqrt exp log log10 ceil floor fabs + (`fabs' is the absolute value for a floating-point argument.) `ePiX' +provides trig and inverse trig functions sensitive to angular mode: + + Cos Sin Tan + Sec Csc Cot + Acos Asin Atan + The inverse functions are principle branches. + + The function `pow(x,y)' returns x^y when x>0, and `atan2(y,x)' (N.B. +argument order) returns Arg(x+iy)\in(-\pi,\pi], the principle branch of +arg. `C++' knows many constants to 20 decimal places, such as `M_PI', +`M_PI_2', and `M_E' for \pi, \pi/2, and e respectively. `ePiX' defines +a few additional functions: + + sgn zero sinx cb + `sgn' is the signum function; `zero' is the constant function; `sinx' +is the function x\mapsto \sin(x)/x with the discontinuity removed; `cb' +(for "Charlie Brown") is the period-2 extension of the absolute value +function on [-1,1]. + + The GNU `C++' library defines other functions, including inverse +hyperbolic functions (`acosh', etc.), `log' and `exp' with base 2, 10, +or arbitrary b (`log2', etc.), the error and gamma functions (`erf' and +`tgamma' [sic], respectively), and Bessel functions of first and second +kind: `j0', `j1', `y0', etc. Use, e.g., `jn(5, )' to get higher +indices. The GNU `C' library reference manual `GNUC' describes these +and other functions in detail. + + Functions may be used in subsequent definitions, and functions of two +(or more) variables are defined in direct analogy to functions of one +variable: + +double f(double t) { return t*t*log(t*t); } // t^2 \ln(t^2) +double g(double s, double t) { return exp(2*s)*Sin(t); } + + + + +Unlike `C', `C++' supports "object-oriented programming". In a +nutshell, a _class_ is an abstraction in computer code of some concept, +such as a point, a sphere, a mapping that can be plotted, or a camera. +Classes allow a programmer to separate an object's _interface_ (the set +of meaningful operations) from its _implementation_ (the data +structures and algorithms that realize the interface). + + A class implementation consists of _members_ (named data elements) +and _member functions_ (functions that belong to the class and have +free access to members). `C++' classes enforce access permissions on +their members, protecting data from being manipulated except as +promised by the interface. + + An ideal interface looks like a black box: It hides the +implementation completely. In order to cooperate, two classes need +only know each other's interfaces. This separation of form and function +modularizes a program, and facilitates debugging, code reuse, and +overall maintainability, particularly in large programs. + + In simple programming, classes may be treated like built-in types. +Each class object has its own member functions, whose call syntax +differs from standard function calls: + + Circle C1(P(1,0), 1.5); // circle of given center and radius + C1.draw(); // member function Circle::draw(); + Naturally, this call draws the circle `C1'. Generally, a member +function call consists of a class object's name, a period, and the name +of the member function. Arguments, if any, go in the parentheses after +the member function name, just as in a regular function call. + + A few short paragraphs cannot do more than scratch the surface of +classes and object-oriented programming. For more details, please +consult a book, such as Prata `Prata' or Stroustrup `S', or Cline's +on-line FAQ `Cline'. + + + +`C' and `C++' are "call by value" languages. Variables are not passed +to a function; instead a copy of the value is made, and the function +operates only on the copy. Though this feature causes occasional +inconvenience, it prevents an object from being altered unexpectedly by +a function call in a different part of the program. Calling by value +helps localize the logic of a program, and circumvents easy-to-write +but extremely hard-to-find bugs. + + In `C++', a function may accept reference arguments. Passing an +object by reference grants the calling function access to the object +itself, not to a copy. There are two common applications: The object is +a large data structure for which copying is "expensive", or the +function _needs_ to modify its arguments (e.g., a function `swap(x,y)' +that exchanges the values of `x' and `y'). + + For the first situation, `C++' provides the `const' keyword, which +ensures the function does not modify its arguments, but accepts a +reference merely for efficiency. Any attempt to modify a `const' +argument will be caught by the compiler. Most `ePiX' commands accept +`const' reference arguments. + + The ability to pass function arguments by reference is sometimes +touted as a feature in `C++' texts. However, the technique circumvents +the data encapsulation of calling by value, and should be avoided +unless absolutely necessary. If a function merely "updates" the value +of a variable, probably the variable should be of class type, and the +update should be performed by a member function. + + A function declaration must indicate that its arguments are +references. The declarations below have the indicated idiomatic +meanings. + + class matrix; + double det(matrix); // call by value, perhaps inefficient + matrix& transpose(matrix&); // probably changes its argument + double trace(const matrix&); // does not change its argument + Unlike pointer arguments, reference arguments impose no syntactic +burden on the user. If `A' is a `matrix', then `transpose(A);' and +`trace(A);' will compile. You need not declare explicit reference +variables and pass those to the function. + + + +`C++' provides "overloading": Multiple functions can be given the same +name, so long as the number and/or type of their arguments differ. (It +is _not_ enough for the return types alone to differ. The compiler +must be able to select a function from its calling syntax.) To the +user, the appearance is that a single function intelligently handles +multiple argument lists. Naturally, overloaded names should refer to +functions that are conceptually related. + + + +A `C++' statement ends with a semicolon. A collection of statements +enclosed by curly braces is a "code block", and may be viewed as a +single logical statement. Curly braces determine a "scope", inside +which variable names may be re-used without ambiguity. Function bodies +are code blocks, as are the alternatives associated to control +statements. A variable defined between curly braces is said to be +_local_ to the scope in which it is defined; its value cannot be used +out of scope. Variables should be declared in the smallest scope +possible. + + The compiler is not picky about spaces, tabs, and newlines, so an +input file should be formatted to make local scopes visually apparent. +`emacs' automatically indents code to reflect scope, though the default +behavior does not please all users. As with variable naming, clarity +and consistency are paramount. + + + +A `C++' source file is compiled in multiple stages that occur +transparently to the user. The first step, pre-processing, involves +simple text replacement for file inclusion, macro expansion and +conditional compilation. Next, the source is compiled and assembled: +Human-readable language instructions are parsed, then represented in +assembly language. Finally, the object files are linked: Function calls +are resolved to hard-coded file offsets, possibly involving external +library files, and the program instructions are packaged into an +executable binary that the operating system can run. + + Pre-processing is used much less in `C++' than in `C'; the language +itself supports safer and more featureful alternatives to macros, such +as `const' variables and inline functions. File inclusion and +conditional compilation are the chief uses of the pre-processor. Lines +of the form + + #include <iostream> + #include "epix.h" + cause the contents of a _header file_ to be read into the source file. +A header file contains variable and function _declarations_, statements +that specify types and names but do not define actual data. +Declarations tell the compiler just enough to resolve expressions and +function calls without knowing specific values or function definitions. + + Conditional compilation is similar to conditional `LaTeX' code. For +example, a file might produce either color or monochrome output as +follows: + +#ifdef COLOR + ... // code for generating color figure +#endif /* COLOR */ +#ifndef COLOR + ... // monochrome code +#endif /* undef COLOR */ + The "compiler symbol" `COLOR' is an ordinary `C++' name. To control +compilation, either put a `\#define COLOR' line in the file, or +(better) supply the flag on the command line: \\ epix -DCOLOR +<file.xp> \\ Every `\#ifdef' must have a matching `\#endif'. Commenting +the `\#endif' is a good habit; in a realistic file, the start and end +of a conditional block may be separated by more than one screen. + + + +As a programming language, `C++' provides certain features common to +all languages (such as `LaTeX', MetaPost, Perl, Lisp\ldots) and adheres +to rules of grammar. Salient differences between `LaTeX' and `C++' +include: + + 1. Every `C++' statement and function call must end with a + semicolon. An omitted semicolon may result in a cryptic error + message from the compiler. Pre-processor directives, which start + with a `\#', do not end with a semicolon. + + 2. Backslash is an escape character in `C++': + // Put label $y=\sin x$ at (2,1) + // Note single ^ backslash in output + label(P(2,1), P(0,0), "$y=\\sin x$"); + // Double backslash ^^ in source + + 3. Variable and function names may contain letters (including + underscore) and digits _only_, are case sensitive, and must + begin with a letter. + + 4. Variables in `C++' must have a declared _type_, such as `int' + (integer) or `double' (double-precision floating point). If a + variable has global scope and its value does not change, the + definition should probably come in the preamble or at the + beginning of `main'. Local variables should be defined in the + smallest possible scope. Unlike `C', `C++' allows variables to be + defined where they first appear. + + 5. `C++' requires explicit use of `*' to denote multiplication; + juxtaposition is not enough. `C++' does not support the use of ^ + for exponentiation, e.g., t^2 is invalid. Instead, use `t*t' or + `pow(t,2)'. + + 6. `C++' has single- and multi-line comments. Everything between a + double slash and the next newline is ignored, while the strings + /* and */ delimit multi-line comments. A single-line comment may + appear within a multi-line comment, but the compiler does not + nest multi-line comments. + + + Between them, `C' and `C++' have about 100 reserved keywords which +cannot be used as function or variable names. + + +File: epix.info, Node: Attribute Quick Reference, Prev: More About `C++', Up: Reference Manual + +3.8 Attribute Quick Reference +============================= + +In the body of an input file, the "drawing state" determines the +figure's appearance. Attributes are declarations, set by commands that +accept arguments of the stated type. + + A `len' argument is a double-quoted string containing a number and a +two-letter `LaTeX' length unit, such as `"1.5pt"' or `"6cm"'. A `color' +argument is a named primary (`Red()', `Cyan()', `White()', etc.), a +`Color' specified by densities (`RGB(...)', `CMYK(...)', etc.), or a +`Color' object. Using `Neutral()' as a `Color' argument generally turns +off the corresponding attribute. + + * Angular mode: `radians()', `degrees()', or `revolutions()'. + + The angular mode affects all trigonometric operations, including + camera rotations, the drawing of arcs and ellipses, polar plotting, + label angle, and the trig functions themselves. Angle-sensitive + trig functions are capitalized, e.g., `Cos', `Tan'. + + * Fill style: `fill(color)', `fill(bool)', `nofill()'. + + * Path style: + + * Width: `plain()', `bold()', `bbold()', `pen(len)'. + + * Line style: `line_style(string)'. The argument is a + WYSIWYG sequence of dashes, spaces, and periods. + `dash_size(double)' and `dot_sep(double)' set the + (approximate) length in `pt' of the pattern. The commands + `solid()', `dashed()', `dotted()' define "standard" + defaults for brevity. + + * Path color: Paths can be drawn using _two_ pens, one atop + the other. When the "base" pen is white (or the + background color) and wider than the "line" pen, a path + masks parts of the figure it crosses. A 3-D effect may be + obtained by making the base pen a darker shade than the + "line" pen. + + `pen(color,[len])', `base(color,[len])' + + Standard widths: `plain(color)', `bold(color)', + `bbold(color)' + + + * Text attributes: + + * Color: `label_color(color)' + + * Mask: `label_mask(color)', `label_pad(len)' + + * Border: `label_border(color, [len])', + `label_border(len)'. The command `no_label_border()' + turns off label borders. + + * Font size: `font_size(LaTeX size)', no argument means + `normalsize'. + + * Font face: `font_face(LaTeX font)', two-letter font + selection string, default is `rm'. + + * Rotation: `label_angle(double)' + + + + Do not confuse `Color' constructors with the similarly-named +(deprecated) lowercase attribute-setting commands, `rgb(r,g,b)', +`cmyk(c,m,y,k)', `red(d)', etc. These commands affect text, paths, and +filled regions. For example, the single command `red()' has the same +effect as the three commands `pen(Red())', `fill(Red())', and +`label_color(Red())'. + + +File: epix.info, Node: Advanced Topics, Next: Software Freedom, Prev: Reference Manual, Up: Top + +4 Advanced Topics +***************** + +This chapter covers _ad hoc_ tricks and open-ended techniques that +require relatively more programming sophistication. You will almost +surely need an external `C++' reference if you do not speak the +language. + +* Menu: + +* Hidden Object Removal:: +* Extensions:: +* Programmer's Guide:: + + +File: epix.info, Node: Hidden Object Removal, Next: Extensions, Prev: Advanced Topics, Up: Advanced Topics + +4.1 Hidden Object Removal +========================= + +`ePiX' writes the output file in the same order that objects appear in +the input. The order is significant because PostScript builds a figure +in layers: Objects are drawn over objects that come earlier in the +file. Shaded polygons can be used to obtain surprisingly effective +hidden object removal in surface meshes. This section describes the +data structures defined in the source files `surface.*'. + + The basic idea is to create a shaded polygon class that knows its +approximate distance to the camera. For computational simplicity, a +mesh "facet" is treated as a quadrilateral, located at the arithmetic +mean of its vertices. A facet's boundary is created from a map and a +domain by tracing a fine mesh rectangle counterclockwise. + + To draw a parametrized surface, facets are stored in a `C++' vector, +sorted in decreasing order of distance to the camera, and printed to +the output file. If filling is active, the gray density of a facet +depends on the cosine of the angle between the normal vector and the +vector from the camera to the element. + + This simple algorithm works surprisingly well when mesh elements +intersect at most along complete edges. To incorporate line-like +elements (e.g., coordinate axes, wire-mesh plots) with shaded surfaces, +the best technique is often to order high-level scene elements +manually, breaking up shaded surfaces (for example, with domain +resizing or clipping) as necessary. The sample file `saddle.xp' +illustrates possible techniques. + + Shaded surfaces can be decorated with a bit of hackery. For example, +the `facet::draw' function in `facet.cc' can be modified easily to draw +line elements, tangents, or normal vectors along with the facet itself. +The sample file `decorate.xp' contains a couple of ideas. (The +decorations are activated by compiler flags; please consult the file +itself for information on compiling.) + + +File: epix.info, Node: Extensions, Next: Programmer's Guide, Prev: Hidden Object Removal, Up: Advanced Topics + +4.2 Extensions +============== + +Thanks to a suggestion of Andrew Sterian, `ePiX' is extensible. User +extensions span a spectrum, from header files that require only basic +knowledge of `C++' to separately compiled libraries that add +substantial new features. The structure of the source code is outlined +in Section *Note section:programmers::, . + + + +A `C++' header file conventionally has suffix `.h', as in `myheader.h'. +To use this custom header, put a line `\#include "myheader.h"' in your +source file. + + User definitions can be easily and robustly implemented with "inline +functions". Inline functions are superficially similar to macros, but +are far more safe and featureful (since they are handled by the +compiler rather than by the pre-processor). Examples are + + inline void Bold() { pen(1.6); } + inline void purple() { rgb(0.5, 0, 0.7); } + inline void draw_square(double s) { rect(P(-s,-s),P(s,s)); } + inline double cube(double x) { return pow(x,3); // x^3 } + The keyword `void' signifies a function that does not return a value, +or (when used as an implicit parameter) a function that does not accept +arguments. Inline function definitions are syntactically identical to +ordinary function definitions, but _must_ occur in a header file or in +the source file where they are used. The examples above might be used +in an input file as follows: + + Bold(); + draw_square(cube(1.25)); + + + +The next few sections outline the creation of a "static library" on +GNU/Linux, and explain how to incorporate custom features at runtime. +The extensively-commented sample files `std_F.cc' and `std_F.h' +illustrate the techniques described below, and may be used for guidance +and experimentation. + + A small library is usually written as a _header_ file, which +contains class and function declarations (also called "prototypes"), +and a _source_ file, which contains the actual code. Conventionally +(under *nix), these files have extension `.h' and `.cc' respectively. +Header and source files may "include" other header files, to +incorporate additional functionality. + +/* my_code.h */ +#ifndef MY_CODE +#define MY_CODE +#include <cmath> // standard library math header +#include "epix.h" // ePiX header +using ePiX::P; + +namespace Mine { // to avoid name conflicts + // functions for special relativity + double lorentz_norm(const P&); + bool spacelike(const P&); +} // end of namespace +#endif /* MY_CODE */ + This file exhibits two "safety features". The three `MY_CODE' lines +prevent the file from being included multiple times. In a file of this +size, inclusion protection is overkill, but as your code base grows and +the number of header files increases, this protection is essential. +Second, the header introduces a "Mine" namespace. Inside this +namespace, two functions are declared as prototypes, giving the +function's return type, name, and argument type(s). A header file +should be commented fairly liberally, so that a year or two from now +you'll be able to decipher the file's contents. For a longer file, +version and contact information, an overall comment describing the +file's features, and license information are appropriate. + + Next, the corresponding source file; definitions are also placed into +the namespace, and must match their prototypes from the header file +exactly. + +/* my_code.cc */ +#include "my_code.h" +using namespace ePiX; + +namespace Mine { + double lorentz_norm(const P& arg) + { + double x(arg.x1()), y(arg.x2()), z(arg.x3()); // extract coords + return (y-x)*(y+x) + z*z; // -x^2 + y^2 + z^2 + } + bool spacelike(const P& arg) + { + return (lorentz_norm(arg) > 0); // true if inequality is + } +} // end of namespace + Copies of these files are included with the source code so you can +experiment with them. Next, the source file must be "compiled", +"archived", and "indexed". In the commands below, the percent sign is +the prompt. + +% g++ -c my_code.cc +% ar -ru libcustom.a my_code.o +% ranlib libcustom.a + Please see your system documentation for details on command options +and what each step does. For linking (below), the name of the library +file must begin "lib" and have the extension `.a'. Once these steps are +successfully completed, put the library `libcustom.a' and header file +`my_code.h' in your project directory. You're ready to use the code in +an `ePiX' figure. + + + +The script `epix' allows input files to be linked with external +libraries at run time, when the input file is compiled into a temporary +executable. + + `epix' recognizes command line options and passes them verbatim to +the compiler. The most commonly used options are those of the form + + -I<include> -L<libdir> -l<lib> + For example, to link `figure.xp' against `mylibs/libcustom.a', run the +command + + epix -Lmylibs -lcustom figure + The options `-I. -L.' tell the compiler to look in the current +directory for header and library files. Compiler options may appear in +any order, but must come before the name of the input file(s). + + Compiler options may be placed in the configuration file +`\$HOME/.epixrc', with syntax as above. A line in the config file that +contains a pound sign (`\#') is a comment, no matter where in the line +the `\#' appears. If any non-comment line fails to start with a dash, +the rest of the file is silently discarded. Command-line options are +read before the config file. + + + +The script `epix' links by default against the `C' math library +`libm.a' and the `ePiX' library `libepix.a'. The command option +`--no-defaults' clears the header and include paths and removes +`libepix.a' from the link list. The script may therefore be used with +multiple versions of `ePiX', a potentially useful feature if you +regularly need to compile old source files, or simply prefer the syntax +of an older version. + + To install and use (say) Version 1.0.0, build the package according +to its `INSTALL' instructions, but _do not use the makefile to +install_. Instead, manually install the header and library only, using +their version number: + +# install -m 644 epix.h /usr/local/include/epix-1.0.h +# install -m 644 libepix.a /usr/local/lib/libepix-1.0.a + A non-system directory may be used instead of `/usr/local'. To use +the old version, a source file must `include' the appropriate header +file (which is identified by its version number). To compile, issue a +command such as + +epix --no-defaults -I/usr/local -L/usr/local -lepix-1.0 file.xp + + +File: epix.info, Node: Programmer's Guide, Prev: Extensions, Up: Advanced Topics + +4.3 Programmer's Guide +====================== + +This section briefly surveys `ePiX''s implementation, and is intended +for (potential) programmers. The source code is divided into modules +with small, well-defined responsibilities, but the user interface is +mostly compatible with the syntax of Version 1.0. These constraints +demanded a degree of implementation hiding. For example, the +user-visible classes defined in `Color.h', `path.h', and `screen.h' +contain only a pointer to the implementation class, and style data is +hidden behind global commands. + + Functionally, the code consists of the user interface; implementation +class\-es comprising drawing attributes, spatial objects, screens and +representations of their elements, and output; and miscellaneous +utility functions. The headers in each group, and their contents, are +described in Section *Note section:interface::, . + + The user interface headers are assembled into a single file, +`epix.h', and installed in `/usr/local/include' by default. In normal +use, the shell scripts read only the user interface header. The +individual headers, including the components of `epix.h', are installed +in `/usr/local/include/epix'. These are provided for authors of +external libraries, who may need access to implementation details. + + + +`ePiX' harnesses the computational power of `C++' to the typographical +capabilities of `LaTeX'. Consequently, `ePiX' should be viewed in part +as a framework for expressing numerical data visually. + + In the course of your work, you may develop specialized code filling +a gap in `ePiX''s functionality. If your code seems likely to be of +interest to other users, please consider bundling it as an external +package and notifying the `ePiX' community so your work can be linked +from the project pages and distributed to interested users. + + There are no formal requirements for external packages, but in the +interest of uniformity contributed code should follow the GNU Coding +Standards `GNUCoding'. At a minimum, an external package should build +with the standard `./configure; make; make install' commands, and the +`configure' script should accept an option `--with-epix' for the user +to specify a non-default `ePiX' install directory. + + If an external package builds a static library, it should provide a +single header containing all the package's entry points, and enclose +its interface in a namespace. Entry points should not collide with +`ePiX' functions. Naming the package "`epix-<...>'" is a good idea, but +not essential. For example, a package providing textual nodes and +diagram layout might be named `epix-nodes'. Input files would use the +package with the lines + + #include "epix-nodes.h" + using namespace ePiX-nodes; + and be compiled with + + epix -lepix-nodes <file> + + The user and internal interfaces of `ePiX'-1.2 are not likely to +change. Still, it's prudent to rely only on the user interface in +contributed code whenever possible. Doing so also simplifies your work +as an author; your library can simply `include' the user header file, +and deal only with high-level objects and drawing attributes. + + + +These files (in order) comprise the global header `epix.h'. + + `enums.h' Marker, alignment, Riemann integral, and vector field +types. + + `length.h' Physical lengths, conceptually a number and two-letter +`LaTeX' length unit. + + `interval.h' Closed, open, and half-open interval ranges for data +culling. + + `triples.h' The `P' class. + + `functions.h' Angle-sensitive trig functions, miscellaneous utility +functions, the `Deriv' and `Integral' classes. + + `pairs.h' Screen locations and displacements, with complex +arithmetic operations. + + `Color.h' The Color class interface, named primaries and +constructors. + + `state.h' Angle mode; clipping and cropping; label styles; filling; +arrow head style; dot and tick sizes, dash length; line style; line and +base pen attributes; color-setting commands. + + `frame.h' Orthonormal bases. + + `domain.h' Coordinate boxes for function plotting. + + `camera.h' The camera. + + `screen.h' The screen class. + + `picture.h' Dimension-setting, offset, layout, decoration, verbatim +text, and output format commands. + + `markers.h' Point markers, axis labels, and coordinate axes. + + `axis.h' Coordinate axes and labels in various styles. + + `legend.h' Plot legends. + + `path.h' The path class. + + `curves.h' Polygons, arrows, ellipses, arcs, splines, coordinate +grids, and recursive fractal curves. + + `circle.h' The `Circle' shape object class. + + `plane.h' The `Plane' shape object class. + + `segment.h' The `Segment' shape object class. + + `sphere.h' The `Sphere' shape object class. + + `intersections.h' Shape object intersection operators. + + `plots.h' Plotting commands. + + `surface.h' Shaded surface plots. + + `data_mask.h' Helper class for data pruning. + + `data_file.h' Class for storing and representing data. + + `data_bins.h' Class for sorting and counting data. + + `geometry.h' Latitudes and longitudes; spherical plotting, arcs, +polygons, and polyhedra; hyperbolic arcs. + + + +`Color_Base.h' The Color implementation interface. + + `Color_CMY.h' The CMY color model. + + `Color_CMYK.h' The CMYK color model. + + `Color_Gray.h' The Gray color model. + + `Color_Neutral.h' Each color class has a "Neutral" member that +converts colors to that model by filtering. This file defines the +unique "model-less" Neutral color for which filtering performs no +action. + + `Color_RGB.h' The RGB color model. + + `Color_Sep.h' Classes for CMYK separation. + + `active_screen.h' Simple manipulator for the active screen. + + `picture_data.h' Picture implementation: two `screen' s +(representing the `canvas' and the output page), true dimensions and +offsets, pointer to output format, list of colors, and lists of +verbatim text to write before and after printing the `picture' +environment in the output file. For simplicity, the `screen's and +dimensions are public; encapsulation from the user results from +"hiding" this header. + + + +Declaration-style attributes are maintained with functions returning +static references: `the_angle_style()', `the_arrowhead_style()', +`the_label_style()', `the_mark_size()', `the_paint_style()', and +`the_path_style()'. Each function is declared in the analogously-named +header. + + `angle_units.h' Angular modes: `radians' , `revolutions', and +`degrees'. + + `arrow_style.h' Arrow head style data: width, ratio, and inset. + + `label_style.h' Text object style: Label and mask colors, padding, +border color and width, alignment, font size, font face, and angle. + + `marker_style.h' Dot and tick sizes. + + `paint_style.h' Line and base pens, fill color. + + `path_style.h' Solid, dashed, dotted lines. + + `pen_data.h' The pen class. + + + +`arrow_data.h' Arrow representation. + + `facet.h' Shaded surface elements. + + `label_data.h' Text (label and marker) objects. + + `legend_item.h' Items for `legend' s. + + `path_data.h' Path implementation. + + `spline.h' The natural spline class. + + `spline_data.h' Templates for quadratic and cubic splines. + + + +Elements in a `screen' are represented polymorphically as "`tile's", of +which there are six types: `glyph' (textual elements), `pen_arrow' +(arrows), `pen_fill' (filled regions), `pen_line' (path-like elements), +`verbatim' (raw text), and `legend_tile' (legends). + + Border and background shape are dictated by the `screen_mask' class. +The cropping algorithm assumes the contour of a screen mask is convex. + + `affine.h' Affine maps. + + `cropping.h' Screen mask cropping. + + `glyph.h' Markers and labels. + + `legend_tile.h' Screen representation of a `legend' . + + `mask_diamond.h' Screen diamond mask. + + `mask_ellipse.h' Screen elliptical mask. + + `mask_rectangle.h' Screen rectangular mask. + + `pen_arrow.h' Arrows. + + `pen_fill.h' Filled regions. + + `pen_line.h' Paths. + + `screen_data.h' Screen implementation class. + + `screen_mask.h' Screen mask interface. + + `tile.h' Screen element interface. + + `verbatim.h' Text in output stream. + + + +Output is divided into a couple of high-level operations and several +"atomic" low-level operations. To create a new output format, one need +only implement the `format' interface for the desired file type. Paths +and filled regions may be implemented however the output type dictates. + + `eepic.h' eepic macros. + + `fmt_template.h' "skeleton" header for new output formats. + + `format.h' The output interface. + + `pst.h' PSTricks macros. + + `tikz.h' tikz macros. + + + +`Color_Utils.h' Functions for setting color channel densities. + + `clipping.h' The clip box. + + `constants.h' Global constants: Line widths; dot, tick, and dash +sizes; arrowhead parameters; miscellaneous numerical constants and +internal parameters. + + `crop_algorithms.h' Path and loop clipping templates. + + `deriv.h' Finite difference template. + + `edge_data.h' Path element representation template. + + `errors.h' Warning and error messages. + + `frac.h' Rational numbers and operators. + + `halfspace.h' Halfspace cutting. + + `hatching.h' Filling regions in eepic. + + `lens.h' Camera lenses. + + `map.h' Wrappers for templated plotting. + + `plot_algorithms.h' Plotting templates. + + `screen_crop.h' Crop paths and loops. + + `utils.h' Truncation, date and time, line breaking. + + +File: epix.info, Node: Software Freedom, Next: Acknowledgments, Prev: Advanced Topics, Up: Top + +Appendix A Software Freedom +*************************** + +Academics in general, and mathematicians in particular, depend on free +exchange of information. We prove theorems or establish experimental +results, write up formal accounts, place preprints on public file +servers, and submit papers to peer-reviewed journals. If accepted, the +results--data, techniques, methods of reasoning, citations, and +conclusions--are published in print and become part of the public +record, governed by copyright law. Libraries purchase journal +subscriptions, but researchers and scholars may use ideas from the +literature merely by giving appropriate citations in their own work. +"Theft" arises from false claims of authorship. + + Carried over to software, the academic process would guarantee rights +similar to those provided by the GNU General Public License (GPL): + + * (GPL 0) To run a program for any purpose. + + * (GPL 1) To study how the program works, and adapt it to your + needs. + + * (GPL 2) To redistribute copies of the program. + + * (GPL 3) To improve the program, and release improvements to the + public, so that the whole community benefits. + + + In reality, attitudes toward software differ markedly. Most academics +work on a proprietary platform, use proprietary software for research +and teaching, and share information with colleagues and students in +proprietary, even obfuscated, data formats. Contrary to the academic +ethic, proprietary software licenses restrict access to information: +preventing users from learning how a program works internally ("reverse +engineering"), limiting the number of users who may run a piece of +software, and forbidding users from running (or sometimes even +installing) a purchased copy on multiple machines. + + Restrictions on use aside, if one cannot examine a program's source +code, one cannot fully trust the output, any more than one can trust +(for purposes of scientific publication) results of a commercial +testing lab. + + Consider a hypothetical future world in which scholarly results are +disseminated like software. Instead of subscriptions, journals sell +licenses granting readership to a specified number of individuals. +Photocopying an article for a class or research seminar constitutes +"piracy", though if the institution has purchased a sufficiently large +site license the teacher or speaker may bring the physical volume to +class and project the pages onto a screen. + + Of course, reading an article is scarcely enlightening. Mathematics +papers contain only the statements of theorems. Merely opening the +journal binds the reader to a lengthy legal agreement, stating that +theorems be used only for specific purposes and threatening serious +legal consequences for attempting to discover the author's proofs. + + The actions of a single student, employee, or faculty member can +expose an institution to a costly "journal audit" from the Mathematical +Society of America (MSA), with the institution responsible for legal +costs if the audit reveals license violations anywhere in the +organization. + + Mathematicians who long for the Old Days when papers contained +proofs and were shared freely are dismissed as idealistic cranks or +labeled anti-business communists. Common knowledge asserts the obvious +superiority of proprietary journals, and the necessity of licenses for +keeping mathematicians gainfully employed. + + Back in our world, some vendors have attempted to placate opponents +of closed source with "shared source" licenses, under which one may +sign a non-disclosure agreement and subsequently examine source code. +In the future world analogy, a shared source agreement would allow +journal licensees to sign an NDA, then see the proofs of theorems. +Readers could thereby correct errors in proofs (benefitting the +publisher by improving the reliability of the journal), but would be +legally forbidden from using the ideas elsewhere (denying benefit to +other mathematicians). + + Legally and conceptually codifying software as a commodity ignores a +fundamental reality: Like an idea or recipe, software can be copied +without loss of the original. The perception of "theft" by copying +arises from an artificial belief that software has an owner who must be +monetarily compensated each time a person acquires a copy. The nature +of software does not enforce the "sale" model in the way services and +physical commodities do. It therefore seems philosophically +inappropriate to treat software as a commodity, and perilous to conform +the legal system to the enforcement of such a model. + + At its best, software enhances our productivity and creativity. +Sharing software, like sharing ideas, benefits a larger number of +people without detriment to existing users. I hope this modest program +is, in conjunction with the much larger efforts of others (especially +Donald Knuth, Richard Stallman, and the many people who have +contributed to the authorship of `LaTeX' and its packages), useful to +you in your mathematical work. + + Please visit the Free Software Foundation, at `http://www.fsf.org', +to learn more about free software and how you can contribute to its +development and adoption. + + +File: epix.info, Node: Acknowledgments, Next: Function Index, Prev: Software Freedom, Up: Top + +Appendix B Acknowledgments +************************** + +`ePiX' is built on the work of many people (unfortunately, most of whom +I am unaware). The following people have contributed, sometimes +unknowingly but always generously: + + *Infrastructure* Donald Knuth, Conrad Kwok, Leslie Lamport, Tim +Morgan, Piet van Oostrum, Sunil Podar, Richard Stallman, Till Tantau, +Herbert Voss, Timothy van Zandt + + *Enhancements* Jay Belanger, Robin Blume-Kohout, Julian Gilbey, +Marcus Hanwell, Yvon Henel, Svend Daugaard Pedersen, Andrew Sterian + + *Porting and packaging* Julian Gilbey (Debian); Tsuguru Kato +(FreeBSD); Markus Dittrich, Danny van Dyk, Christian Faulhammer, +Olivier Fisette, Chris Gianelloni, Michael Hanselmann, Marcus Hanwell, +David Holm, Peter Johanson, Patrick Kursawe, Tobias Scherbaum, Markus +Ullmann (Gentoo); Guido Gonzato (RPM); Rene Rebe (T2) + + *Debugging, advice, and other assistance* Jay Belanger, Felipe Paulo +Guazzi Bergo, Karl Berry, Robin Blume-Kohout, Patrick Cousot, Stephen +Gibson, Julian Gilbey, Dov Grobgeld, Bob Grover, Jim Hefferon, Jacques +L'helgoual, Yvon Henel, Hartmut Henkel, Herng-Jeng Jou, Walter +Kehowski, Kevin McCormick, Ross Moore, Thorsten Riess, Alan Sill, Neel +Smith, Michael Somos, Andrew Sterian, Ryszard Tanas, Kai Trukenmueller, +Torbjorn Vik, Wenguang Wang, Gabe Weaver, Mariusz Wodzicki + + +File: epix.info, Node: Function Index, Next: Concept Index, Prev: Acknowledgments, Up: Top + +Function Index +************** + + +* Menu: + +* aarrow: Creating and Drawing Objects. + (line 248) +* Acos: More About C++. (line 112) +* activate: Scene Attributes. (line 161) +* affine: Scene Attributes. (line 271) +* apply: Scene Attributes. (line 307) +* arc: Creating and Drawing Objects. + (line 167) +* arc_arrow: Creating and Drawing Objects. + (line 248) +* arc_measure: Creating and Drawing Objects. + (line 193) +* arrow: Creating and Drawing Objects. + (line 242) +* arrow_inset: Creating and Drawing Objects. + (line 235) +* arrow_ratio: Creating and Drawing Objects. + (line 235) +* arrow_width: Creating and Drawing Objects. + (line 235) +* Asin: More About C++. (line 112) +* Atan: More About C++. (line 112) +* axis: Creating and Drawing Objects. + (line 275) +* axis.align: Creating and Drawing Objects. + (line 284) +* axis.align_labels: Creating and Drawing Objects. + (line 296) +* axis.dec: Creating and Drawing Objects. + (line 296) +* axis.draw: Creating and Drawing Objects. + (line 342) +* axis.draw_labels: Creating and Drawing Objects. + (line 342) +* axis.draw_ticks: Creating and Drawing Objects. + (line 342) +* axis.frac: Creating and Drawing Objects. + (line 296) +* axis.label_rep: Creating and Drawing Objects. + (line 307) +* axis.precision: Creating and Drawing Objects. + (line 296) +* axis.sci: Creating and Drawing Objects. + (line 296) +* axis.subdivide: Creating and Drawing Objects. + (line 284) +* axis.tag: Creating and Drawing Objects. + (line 323) +* axis.tag235: Creating and Drawing Objects. + (line 323) +* axis.tags: Creating and Drawing Objects. + (line 323) +* axis.tick_ratio: Creating and Drawing Objects. + (line 284) +* axis.trig: Creating and Drawing Objects. + (line 296) +* axis.unmark: Creating and Drawing Objects. + (line 296) +* axis.untag: Creating and Drawing Objects. + (line 323) +* axis_break: Creating and Drawing Objects. + (line 394) +* back_arc: Creating and Drawing Objects. + (line 851) +* back_arc2: Creating and Drawing Objects. + (line 851) +* back_cube: Creating and Drawing Objects. + (line 857) +* back_dodeca: Creating and Drawing Objects. + (line 857) +* back_icosa: Creating and Drawing Objects. + (line 857) +* back_latitude: Creating and Drawing Objects. + (line 837) +* back_line: Creating and Drawing Objects. + (line 851) +* back_longitude: Creating and Drawing Objects. + (line 837) +* back_octa: Creating and Drawing Objects. + (line 857) +* back_tetra: Creating and Drawing Objects. + (line 857) +* back_triangle: Creating and Drawing Objects. + (line 857) +* backing: Scene Attributes. (line 252) +* backplot_N: Creating and Drawing Objects. + (line 879) +* backplot_R: Creating and Drawing Objects. + (line 879) +* backplot_S: Creating and Drawing Objects. + (line 879) +* bbold: Drawing Attributes. (line 33) +* bbox: Drawing Attributes. (line 174) +* begin: File Structure. (line 12) +* Black: Color. (line 23) +* Blue: Color. (line 23) +* bold: Drawing Attributes. (line 33) +* border: Scene Attributes. (line 252) +* bottom_axis: Creating and Drawing Objects. + (line 332) +* bounding_box: Picture Size and Aspect Ratio. + (line 24) +* box: Drawing Attributes. (line 174) +* Camera.at: Scene Attributes. (line 75) +* Camera.clip_range: Scene Attributes. (line 75) +* Camera.focus: Scene Attributes. (line 75) +* Camera.look_at: Scene Attributes. (line 75) +* Camera.pan: Scene Attributes. (line 75) +* Camera.range: Scene Attributes. (line 75) +* Camera.roll: Scene Attributes. (line 75) +* Camera.tilt: Scene Attributes. (line 75) +* canvas: Scene Attributes. (line 183) +* cb: More About C++. (line 123) +* circ: Drawing Attributes. (line 174) +* circle: Creating and Drawing Objects. + (line 145) +* Circle: Creating and Drawing Objects. + (line 70) +* cis: Creating and Drawing Objects. + (line 27) +* clip_box: Scene Attributes. (line 127) +* clip_face: Scene Attributes. (line 137) +* clip_restore: Scene Attributes. (line 137) +* clip_slice: Scene Attributes. (line 137) +* clip_to: Scene Attributes. (line 127) +* CMY: Color. (line 29) +* CMY_Black: Color. (line 29) +* CMY_White: Color. (line 29) +* cmyk: Drawing Attributes. (line 210) +* CMYK: Color. (line 29) +* Color.alpha: Color. (line 73) +* Color.blend: Color. (line 73) +* Color.filter: Color. (line 73) +* Color.invert: Color. (line 73) +* Color.superpose: Color. (line 73) +* Cos: More About C++. (line 112) +* Cot: More About C++. (line 112) +* crop: Scene Attributes. (line 239) +* crop_diamond: Scene Attributes. (line 239) +* crop_ellipse: Scene Attributes. (line 239) +* Csc: More About C++. (line 112) +* Cyan: Color. (line 29) +* cyl: Creating and Drawing Objects. + (line 27) +* dart: Creating and Drawing Objects. + (line 248) +* dart_field: Creating and Drawing Objects. + (line 793) +* dash_size: Drawing Attributes. (line 44) +* dashed: Drawing Attributes. (line 53) +* data_bins: Creating and Drawing Objects. + (line 1006) +* data_bins.bar_chart: Creating and Drawing Objects. + (line 1016) +* data_bins.cut: Creating and Drawing Objects. + (line 1006) +* data_bins.histogram: Creating and Drawing Objects. + (line 1016) +* data_bins.plot: Creating and Drawing Objects. + (line 1016) +* data_bins.read: Creating and Drawing Objects. + (line 1006) +* data_file: Creating and Drawing Objects. + (line 931) +* data_file.avg: Creating and Drawing Objects. + (line 950) +* data_file.column: Creating and Drawing Objects. + (line 973) +* data_file.covar: Creating and Drawing Objects. + (line 950) +* data_file.dot: Creating and Drawing Objects. + (line 950) +* data_file.plot: Creating and Drawing Objects. + (line 958) +* data_file.precision: Creating and Drawing Objects. + (line 967) +* data_file.read: Creating and Drawing Objects. + (line 931) +* data_file.regression: Creating and Drawing Objects. + (line 950) +* data_file.transform: Creating and Drawing Objects. + (line 945) +* data_file.var: Creating and Drawing Objects. + (line 950) +* data_file.write: Creating and Drawing Objects. + (line 967) +* data_mask: Creating and Drawing Objects. + (line 988) +* data_mask.prune: Creating and Drawing Objects. + (line 996) +* ddot: Drawing Attributes. (line 174) +* deactivate: Scene Attributes. (line 161) +* Deriv: Creating and Drawing Objects. + (line 745) +* Deriv.eval: Creating and Drawing Objects. + (line 745) +* Deriv.left: Creating and Drawing Objects. + (line 745) +* Deriv.right: Creating and Drawing Objects. + (line 745) +* disk_line: Creating and Drawing Objects. + (line 826) +* domain: Creating and Drawing Objects. + (line 512) +* domain.resize: Creating and Drawing Objects. + (line 531) +* domain.slice: Creating and Drawing Objects. + (line 531) +* domain.slices: Creating and Drawing Objects. + (line 531) +* domain_list: Creating and Drawing Objects. + (line 668) +* domain_list.add: Creating and Drawing Objects. + (line 668) +* dot: Drawing Attributes. (line 174) +* dot_size: Drawing Attributes. (line 185) +* dotted: Drawing Attributes. (line 53) +* draw: Creating and Drawing Objects. + (line 59) +* ellipse: Creating and Drawing Objects. + (line 167) +* ellipse_bottom: Creating and Drawing Objects. + (line 180) +* ellipse_left: Creating and Drawing Objects. + (line 180) +* ellipse_right: Creating and Drawing Objects. + (line 180) +* ellipse_top: Creating and Drawing Objects. + (line 180) +* end: File Structure. (line 12) +* envelope: Creating and Drawing Objects. + (line 768) +* extract: Scene Attributes. (line 183) +* extract_diamond: Scene Attributes. (line 190) +* extract_ellipse: Scene Attributes. (line 190) +* fill: Drawing Attributes. (line 12) +* flow: Creating and Drawing Objects. + (line 778) +* font_face: Drawing Attributes. (line 144) +* font_size: Drawing Attributes. (line 144) +* fractal: Creating and Drawing Objects. + (line 214) +* frame: Creating and Drawing Objects. + (line 134) +* front_arc: Creating and Drawing Objects. + (line 851) +* front_arc2: Creating and Drawing Objects. + (line 851) +* front_cube: Creating and Drawing Objects. + (line 857) +* front_dodeca: Creating and Drawing Objects. + (line 857) +* front_icosa: Creating and Drawing Objects. + (line 857) +* front_line: Creating and Drawing Objects. + (line 851) +* front_octa: Creating and Drawing Objects. + (line 857) +* front_tetra: Creating and Drawing Objects. + (line 857) +* front_triangle: Creating and Drawing Objects. + (line 857) +* frontplot_N: Creating and Drawing Objects. + (line 879) +* frontplot_R: Creating and Drawing Objects. + (line 879) +* frontplot_S: Creating and Drawing Objects. + (line 879) +* Gray: Color. (line 29) +* Green: Color. (line 23) +* grid: Creating and Drawing Objects. + (line 405) +* h_axis: Creating and Drawing Objects. + (line 352) +* h_axis_labels: Creating and Drawing Objects. + (line 368) +* h_axis_log_labels: Creating and Drawing Objects. + (line 368) +* h_axis_log_masklabels: Creating and Drawing Objects. + (line 368) +* h_axis_masklabels: Creating and Drawing Objects. + (line 368) +* h_error_bar: Creating and Drawing Objects. + (line 1047) +* h_log_axis: Creating and Drawing Objects. + (line 352) +* h_scale: Scene Attributes. (line 282) +* h_shear: Scene Attributes. (line 282) +* hyperbolic_line: Creating and Drawing Objects. + (line 826) +* import: Scene Attributes. (line 172) +* include: C++ Basics. (line 37) +* inf: Creating and Drawing Objects. + (line 731) +* inlay: Scene Attributes. (line 204) +* inlay_horizontal: Scene Attributes. (line 204) +* inlay_vertical: Scene Attributes. (line 204) +* inset: Scene Attributes. (line 172) +* Integral: Creating and Drawing Objects. + (line 745) +* Integral.eval: Creating and Drawing Objects. + (line 745) +* J: Creating and Drawing Objects. + (line 38) +* label <1>: Drawing Attributes. (line 99) +* label: Layout Tricks. (line 46) +* label_border: Drawing Attributes. (line 160) +* label_color: Drawing Attributes. (line 160) +* label_mask: Drawing Attributes. (line 160) +* label_pad: Drawing Attributes. (line 160) +* latitude: Creating and Drawing Objects. + (line 837) +* left_axis: Creating and Drawing Objects. + (line 332) +* legend: Creating and Drawing Objects. + (line 1083) +* legend.backing: Creating and Drawing Objects. + (line 1083) +* legend.border: Creating and Drawing Objects. + (line 1083) +* legend.draw: Creating and Drawing Objects. + (line 1115) +* legend.fill_item: Creating and Drawing Objects. + (line 1101) +* legend.item_border: Creating and Drawing Objects. + (line 1083) +* legend.key_size: Creating and Drawing Objects. + (line 1083) +* legend.label_skip: Creating and Drawing Objects. + (line 1083) +* legend.mark_item: Creating and Drawing Objects. + (line 1101) +* legend.path_item: Creating and Drawing Objects. + (line 1101) +* Line: Creating and Drawing Objects. + (line 145) +* line: Creating and Drawing Objects. + (line 145) +* line_style: Drawing Attributes. (line 44) +* log1_grid: Creating and Drawing Objects. + (line 411) +* log2_grid: Creating and Drawing Objects. + (line 411) +* log_grid: Creating and Drawing Objects. + (line 411) +* longitude: Creating and Drawing Objects. + (line 837) +* Magenta: Color. (line 29) +* move_to: Creating and Drawing Objects. + (line 59) +* newton: Creating and Drawing Objects. + (line 731) +* no_label_border: Drawing Attributes. (line 160) +* nofill: Drawing Attributes. (line 12) +* ode_plot: Creating and Drawing Objects. + (line 778) +* P: Creating and Drawing Objects. + (line 27) +* P.x1: Creating and Drawing Objects. + (line 38) +* P.x2: Creating and Drawing Objects. + (line 38) +* P.x3: Creating and Drawing Objects. + (line 38) +* path: Creating and Drawing Objects. + (line 437) +* path.close: Creating and Drawing Objects. + (line 468) +* path.draw: Creating and Drawing Objects. + (line 468) +* path.fill: Creating and Drawing Objects. + (line 468) +* pen <1>: Creating and Drawing Objects. + (line 422) +* pen: Drawing Attributes. (line 23) +* picture <1>: Picture Size and Aspect Ratio. + (line 24) +* picture: File Structure. (line 12) +* plain: Drawing Attributes. (line 33) +* Plane: Creating and Drawing Objects. + (line 85) +* plot: Creating and Drawing Objects. + (line 495) +* polar: Creating and Drawing Objects. + (line 27) +* polar_grid: Creating and Drawing Objects. + (line 405) +* polarplot: Creating and Drawing Objects. + (line 495) +* post_write: C++ Basics. (line 122) +* postcomp: Scene Attributes. (line 282) +* pre_write: C++ Basics. (line 122) +* pt_to_screen: Scene Attributes. (line 214) +* quad: Creating and Drawing Objects. + (line 145) +* rect: Creating and Drawing Objects. + (line 145) +* Red: Color. (line 23) +* reflect: Scene Attributes. (line 282) +* rgb: Drawing Attributes. (line 210) +* RGB: Color. (line 23) +* riemann_sum: Creating and Drawing Objects. + (line 756) +* right_angle: Creating and Drawing Objects. + (line 193) +* right_axis: Creating and Drawing Objects. + (line 332) +* ring: Drawing Attributes. (line 174) +* rotate: Scene Attributes. (line 282) +* scale <1>: Creating and Drawing Objects. + (line 59) +* scale: Scene Attributes. (line 282) +* scenery: Creating and Drawing Objects. + (line 680) +* scenery.add: Creating and Drawing Objects. + (line 680) +* scenery.draw: Creating and Drawing Objects. + (line 680) +* Sec: More About C++. (line 112) +* Segment: Creating and Drawing Objects. + (line 90) +* set_crop: Scene Attributes. (line 239) +* sgn: More About C++. (line 123) +* shadeplot: Creating and Drawing Objects. + (line 495) +* shift <1>: Creating and Drawing Objects. + (line 59) +* shift: Scene Attributes. (line 282) +* Sin: More About C++. (line 112) +* sinx: More About C++. (line 123) +* slope_field: Creating and Drawing Objects. + (line 793) +* solid: Drawing Attributes. (line 53) +* sph: Creating and Drawing Objects. + (line 27) +* Sphere: Creating and Drawing Objects. + (line 93) +* spline: Creating and Drawing Objects. + (line 167) +* spot: Drawing Attributes. (line 174) +* sup: Creating and Drawing Objects. + (line 731) +* surface: Creating and Drawing Objects. + (line 616) +* surface_rev: Creating and Drawing Objects. + (line 627) +* Tan: More About C++. (line 112) +* tan_field: Creating and Drawing Objects. + (line 768) +* tan_line: Creating and Drawing Objects. + (line 768) +* top_axis: Creating and Drawing Objects. + (line 332) +* triangle: Creating and Drawing Objects. + (line 145) +* unitlength: Picture Size and Aspect Ratio. + (line 24) +* v_axis: Creating and Drawing Objects. + (line 352) +* v_axis_labels: Creating and Drawing Objects. + (line 368) +* v_axis_log_labels: Creating and Drawing Objects. + (line 368) +* v_axis_log_masklabels: Creating and Drawing Objects. + (line 368) +* v_axis_masklabels: Creating and Drawing Objects. + (line 368) +* v_error_bar: Creating and Drawing Objects. + (line 1047) +* v_log_axis: Creating and Drawing Objects. + (line 352) +* v_scale: Scene Attributes. (line 282) +* v_shear: Scene Attributes. (line 282) +* vector_field: Creating and Drawing Objects. + (line 793) +* White: Color. (line 23) +* write: C++ Basics. (line 122) +* Yellow: Color. (line 29) +* zero: More About C++. (line 123) + + +File: epix.info, Node: Concept Index, Prev: Function Index, Up: Top + +Concept Index +************* + + +* Menu: + +* Affine map: Scene Attributes. (line 264) +* Affine map!action on labels: Drawing Attributes. (line 130) +* Angle units <1>: Drawing Attributes. (line 121) +* Angle units: Scene Attributes. (line 14) +* Angular mode <1>: More About C++. (line 112) +* Angular mode: Creating and Drawing Objects. + (line 27) +* Animation: Animation. (line 6) +* Arrow: Creating and Drawing Objects. + (line 231) +* Axes: Creating and Drawing Objects. + (line 257) +* Axes!broken: Creating and Drawing Objects. + (line 390) +* Axes!labeling: Creating and Drawing Objects. + (line 257) +* Axes!logarithmic: Creating and Drawing Objects. + (line 350) +* Bar Charts: Creating and Drawing Objects. + (line 1013) +* Bounding box: Scene Attributes. (line 156) +* Camera <1>: Hidden Object Removal. + (line 13) +* Camera: Scene Attributes. (line 21) +* Camera!color separation: Scene Attributes. (line 94) +* Camera!lens: Scene Attributes. (line 57) +* Camera!manipulation: Scene Attributes. (line 69) +* Camera!manipulation of: Scene Attributes. (line 116) +* Camera!viewpoint: Scene Attributes. (line 31) +* canvas: The Drawing Model. (line 11) +* Circle: Creating and Drawing Objects. + (line 69) +* Classes: More About C++. (line 149) +* Clipping: Scene Attributes. (line 120) +* Color <1>: Drawing Attributes. (line 215) +* Color: Color. (line 6) +* Color!separation: Scene Attributes. (line 94) +* Color!surface plotting: Creating and Drawing Objects. + (line 700) +* Color!transparency: Color. (line 65) +* Conditional statement: More About C++. (line 22) +* Cplusplus@C++ <1>: More About C++. (line 6) +* Cplusplus@C++: C++ Basics. (line 6) +* Cropping: Scene Attributes. (line 231) +* Data plotting: Creating and Drawing Objects. + (line 897) +* Domain: Creating and Drawing Objects. + (line 509) +* Emacs@emacs <1>: Animation. (line 19) +* Emacs@emacs <2>: C++ Basics. (line 16) +* Emacs@emacs <3>: Running ePiX. (line 50) +* Emacs@emacs: Software Dependencies. + (line 36) +* Error bars: Creating and Drawing Objects. + (line 1046) +* Filling: Drawing Attributes. (line 11) +* Fonts: Drawing Attributes. (line 142) +* Free software <1>: Software Freedom. (line 6) +* Free software: Introduction. (line 42) +* Function: More About C++. (line 22) +* Function!call syntax: More About C++. (line 186) +* Function!class member: More About C++. (line 156) +* Function!mathematical: More About C++. (line 108) +* Function!overloaded: More About C++. (line 229) +* Function!returning void: More About C++. (line 84) +* Graph paper: Creating and Drawing Objects. + (line 422) +* Graphical interface: Tutorial. (line 13) +* Hidden object removal: Hidden Object Removal. + (line 6) +* Histograms: Creating and Drawing Objects. + (line 1013) +* Input file!comment in: More About C++. (line 337) +* Input file!conditional compilation: More About C++. (line 281) +* Installation <1>: Installation. (line 31) +* Installation: Software Dependencies. + (line 6) +* Intersection: Creating and Drawing Objects. + (line 109) +* Labels <1>: More About C++. (line 310) +* Labels: Drawing Attributes. (line 80) +* Labels!alignment: Drawing Attributes. (line 80) +* Labels!axis: Creating and Drawing Objects. + (line 257) +* Labels!backslash in: Drawing Attributes. (line 205) +* Labels!fonts in: Drawing Attributes. (line 142) +* Labels!in double quotes: Drawing Attributes. (line 205) +* Labels!rotated: Drawing Attributes. (line 121) +* Layout <1>: Scene Attributes. (line 148) +* Layout: Layout Tricks. (line 6) +* Legends: Creating and Drawing Objects. + (line 1072) +* Mac OS X: Software Dependencies. + (line 6) +* Marker types: Drawing Attributes. (line 172) +* Output format: File Structure. (line 31) +* Path: Drawing Attributes. (line 11) +* Path!class: Creating and Drawing Objects. + (line 433) +* Path!filled: Drawing Attributes. (line 11) +* Path!fractal: Creating and Drawing Objects. + (line 206) +* Path!style: Drawing Attributes. (line 41) +* Picture!aspect ratio: Picture Size and Aspect Ratio. + (line 44) +* Picture!bounding box: Picture Size and Aspect Ratio. + (line 44) +* Picture!offset: Picture Size and Aspect Ratio. + (line 6) +* Picture!size: Picture Size and Aspect Ratio. + (line 6) +* Plane: Creating and Drawing Objects. + (line 85) +* Plotting: Creating and Drawing Objects. + (line 480) +* Plotting!calculus: Creating and Drawing Objects. + (line 721) +* Plotting!data: Creating and Drawing Objects. + (line 897) +* Plotting!spherical: Creating and Drawing Objects. + (line 833) +* Plotting!surface: Creating and Drawing Objects. + (line 605) +* Point: Creating and Drawing Objects. + (line 14) +* Pointer: More About C++. (line 52) +* post_write: C++ Basics. (line 122) +* pre_write: C++ Basics. (line 122) +* Preamble: File Structure. (line 10) +* Screen: Scene Attributes. (line 21) +* Screen!active: Scene Attributes. (line 148) +* Segment: Creating and Drawing Objects. + (line 90) +* Sphere: Creating and Drawing Objects. + (line 93) +* Stereograms: Layout Tricks. (line 8) +* Variable!local: More About C++. (line 239) +* Variable!names: More About C++. (line 34) +* Variable!pointer: More About C++. (line 52) +* Variable!reference: More About C++. (line 186) +* Variable!type of: More About C++. (line 45) +* Viewpoint: Scene Attributes. (line 31) +* Windows operating system: Software Dependencies. + (line 40) +* write: C++ Basics. (line 122) + + + +Tag Table: +Node: Top185 +Node: Introduction1105 +Node: Changes in Version 1.24664 +Node: Software Dependencies8541 +Ref: section:software_deps8714 +Node: Installation11086 +Node: Getting Started12670 +Ref: chapter:started12806 +Node: Running `ePiX'13556 +Ref: section:running13709 +Node: The Drawing Model16861 +Ref: section:overview17013 +Node: Tutorial19428 +Ref: section:tutorial19560 +Ref: taylor_poly24927 +Node: `C++' Basics26756 +Ref: fig:captioned32767 +Node: Animation33131 +Ref: section:animation33262 +Node: Layout Tricks34998 +Ref: section:layout35116 +Node: Reference Manual37114 +Ref: chapter:ref-man37255 +Node: File Structure38952 +Node: Picture Size and Aspect Ratio41705 +Ref: page:scaling44202 +Node: Color44417 +Ref: section:color44557 +Ref: fig:densities46382 +Node: Scene Attributes47847 +Ref: fig:camera48882 +Ref: truesize56642 +Node: Drawing Attributes62495 +Ref: table:marker70626 +Node: Creating and Drawing Objects71285 +Ref: fig:fractal81596 +Ref: fig:plot96868 +Ref: non-eucl107182 +Node: More About `C++'121128 +Ref: references130049 +Node: Attribute Quick Reference137418 +Ref: section:quickref137580 +Node: Advanced Topics140341 +Ref: chapter:adv140481 +Node: Hidden Object Removal140765 +Ref: section:hidden140932 +Node: Extensions142805 +Ref: section:extensions142953 +Node: Programmer's Guide149302 +Ref: section:programmers149436 +Ref: section:interface152502 +Node: Software Freedom158743 +Node: Acknowledgments164009 +Node: Function Index165447 +Node: Concept Index200200 + +End Tag Table diff --git a/graphics/epix/doc/graphpaper.eepic b/graphics/epix/doc/graphpaper.eepic new file mode 100644 index 0000000000..94a18e8085 --- /dev/null +++ b/graphics/epix/doc/graphpaper.eepic @@ -0,0 +1,101 @@ +%% Generated from graphpaper.xp on Tue Jan 4 15:32:14 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [-2,2] x [-1,1] +%% Actual size: 2in x 1in +%% Figure offset: right by 0in, up by 0in +%% +\setlength{\unitlength}{0.01in} +\begin{picture}(200,100)(-0,-0) +%% --- +\allinethickness{0.25pt}% +\path(0,0)(0,100) +\path(5,0)(5,100) +\path(10,0)(10,100) +\path(15,0)(15,100) +\path(20,0)(20,100) +\path(25,0)(25,100) +\path(30,0)(30,100) +\path(35,0)(35,100) +\path(40,0)(40,100) +\path(45,0)(45,100) +\path(50,0)(50,100) +\path(55,0)(55,100) +\path(60,0)(60,100) +\path(65,0)(65,100) +\path(70,0)(70,100) +\path(75,0)(75,100) +\path(80,0)(80,100) +\path(85,0)(85,100) +\path(90,0)(90,100) +\path(95,0)(95,100) +\path(100,0)(100,100) +\path(105,0)(105,100) +\path(110,0)(110,100) +\path(115,0)(115,100) +\path(120,0)(120,100) +\path(125,0)(125,100) +\path(130,0)(130,100) +\path(135,0)(135,100) +\path(140,0)(140,100) +\path(145,0)(145,100) +\path(150,0)(150,100) +\path(155,0)(155,100) +\path(160,0)(160,100) +\path(165,0)(165,100) +\path(170,0)(170,100) +\path(175,0)(175,100) +\path(180,0)(180,100) +\path(185,0)(185,100) +\path(190,0)(190,100) +\path(195,0)(195,100) +\path(200,0)(200,100) +\path(0,0)(200,0) +\path(0,5)(200,5) +\path(0,10)(200,10) +\path(0,15)(200,15) +\path(0,20)(200,20) +\path(0,25)(200,25) +\path(0,30)(200,30) +\path(0,35)(200,35) +\path(0,40)(200,40) +\path(0,45)(200,45) +\path(0,50)(200,50) +\path(0,55)(200,55) +\path(0,60)(200,60) +\path(0,65)(200,65) +\path(0,70)(200,70) +\path(0,75)(200,75) +\path(0,80)(200,80) +\path(0,85)(200,85) +\path(0,90)(200,90) +\path(0,95)(200,95) +\path(0,100)(200,100) +%% --- +\allinethickness{0.5pt}% +\path(0,0)(0,100) +\path(25,0)(25,100) +\path(50,0)(50,100) +\path(75,0)(75,100) +\path(100,0)(100,100) +\path(125,0)(125,100) +\path(150,0)(150,100) +\path(175,0)(175,100) +\path(200,0)(200,100) +\path(0,0)(200,0) +\path(0,25)(200,25) +\path(0,50)(200,50) +\path(0,75)(200,75) +\path(0,100)(200,100) +%% --- +\allinethickness{1pt}% +\path(0,0)(0,100) +\path(50,0)(50,100) +\path(100,0)(100,100) +\path(150,0)(150,100) +\path(200,0)(200,100) +\path(0,0)(200,0) +\path(0,50)(200,50) +\path(0,100)(200,100) +%% --- +\end{picture} diff --git a/graphics/epix/doc/graphpaper.xp b/graphics/epix/doc/graphpaper.xp new file mode 100644 index 0000000000..795c499d4d --- /dev/null +++ b/graphics/epix/doc/graphpaper.xp @@ -0,0 +1,24 @@ +/* -*-ePiX-*- */ +/* graphpaper.c -- July 6, 2002 */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + bounding_box(P(-2,-1), P(2,1)); + picture(P(200,100)); + unitlength("0.01in"); + + begin(); + + pen(0.25); + grid(10*x_size, 10*y_size); + + pen(0.5); + grid(2*x_size, 2*y_size); + + pen(1); + grid(x_size, y_size); + + end(); +} diff --git a/graphics/epix/doc/hello.eepic b/graphics/epix/doc/hello.eepic new file mode 100644 index 0000000000..9b58fefc81 --- /dev/null +++ b/graphics/epix/doc/hello.eepic @@ -0,0 +1,15 @@ +%% Generated from hello.xp on Thu Jun 28 11:33:40 EDT 2007 by +%% ePiX-1.1.6 +%% +%% Cartesian bounding box: [-1,1] x [-1,1] +%% Actual size: 2 x 1in +%% Figure offset: left by 0in, down by 0in +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0} +\setlength{\unitlength}{1in} +\begin{picture}(2,1)(-0,-0) +\put(1,0.5){\makebox(0,0)[c]{{\Huge Hello, world!}}} +\allinethickness{1pt}% +\path(2,0)(2,1)(0,1)(0,0)(2,0) +%% +\end{picture} diff --git a/graphics/epix/doc/hello.xp b/graphics/epix/doc/hello.xp new file mode 100644 index 0000000000..c8bd3739b9 --- /dev/null +++ b/graphics/epix/doc/hello.xp @@ -0,0 +1,20 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + picture(P(-1,-1),P(1,1), "2x1in"); + + begin(); + + // uncomment and permute these lines + // crop_ellipse(); + // backing(Yellow()); + border(Black(), "1pt"); + + font_size("Huge"); + label(P(0,0), "Hello, world!"); + + end(); +} diff --git a/graphics/epix/doc/koch.eepic b/graphics/epix/doc/koch.eepic new file mode 100644 index 0000000000..1f949958c0 --- /dev/null +++ b/graphics/epix/doc/koch.eepic @@ -0,0 +1,160 @@ +%% Generated from koch.xp on Tue Jan 4 15:32:16 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [0,3] x [0,0.5] +%% Actual size: 3in x 0.5in +%% Figure offset: right by 0in, up by 0.25in +%% +\setlength{\unitlength}{1in} +\begin{picture}(3,0.5)(-0,-0.25) +%% --- +\path(0,0)(0.25,0)(0.25,0.25)(0.5,0.25)(0.5,0)(0.5,-0.25)(0.75,-0.25) + (0.75,0)(1,0) +%% --- +\path(1,0)(1.0625,0)(1.0625,0.0625)(1.125,0.0625)(1.125,0)(1.125,-0.0625) + (1.1875,-0.0625)(1.1875,0)(1.25,0)(1.25,0.0625)(1.1875,0.0625) + (1.1875,0.125)(1.25,0.125)(1.3125,0.125)(1.3125,0.1875)(1.25,0.1875) + (1.25,0.25)(1.3125,0.25)(1.3125,0.3125)(1.375,0.3125)(1.375,0.25) + (1.375,0.1875)(1.4375,0.1875)(1.4375,0.25)(1.5,0.25)(1.5,0.1875) + (1.5625,0.1875)(1.5625,0.125)(1.5,0.125)(1.4375,0.125)(1.4375,0.0625) + (1.5,0.0625)(1.5,0)(1.5,-0.0625)(1.5625,-0.0625)(1.5625,-0.125) + (1.5,-0.125)(1.4375,-0.125)(1.4375,-0.1875)(1.5,-0.1875)(1.5,-0.25) + (1.5625,-0.25)(1.5625,-0.1875)(1.625,-0.1875)(1.625,-0.25)(1.625,-0.3125) + (1.6875,-0.3125)(1.6875,-0.25)(1.75,-0.25)(1.75,-0.1875)(1.6875,-0.1875) + (1.6875,-0.125)(1.75,-0.125)(1.8125,-0.125)(1.8125,-0.0625)(1.75,-0.0625) + (1.75,0)(1.8125,0)(1.8125,0.0625)(1.875,0.0625)(1.875,0) +\path(1.875,0)(1.875,-0.0625)(1.9375,-0.0625)(1.9375,0)(2,0) +%% --- +\path(2,0)(2.01562,0)(2.01562,0.015625)(2.03125,0.015625)(2.03125,0) + (2.03125,-0.015625)(2.04688,-0.015625)(2.04688,0)(2.0625,0) + (2.0625,0.015625)(2.04688,0.015625)(2.04688,0.03125)(2.0625,0.03125) + (2.07812,0.03125)(2.07812,0.046875)(2.0625,0.046875)(2.0625,0.0625) + (2.07812,0.0625)(2.07812,0.078125)(2.09375,0.078125)(2.09375,0.0625) + (2.09375,0.046875)(2.10938,0.046875)(2.10938,0.0625)(2.125,0.0625) + (2.125,0.046875)(2.14062,0.046875)(2.14062,0.03125)(2.125,0.03125) + (2.10938,0.03125)(2.10938,0.015625)(2.125,0.015625)(2.125,0) + (2.125,-0.015625)(2.14062,-0.015625)(2.14062,-0.03125)(2.125,-0.03125) + (2.10938,-0.03125)(2.10938,-0.046875)(2.125,-0.046875)(2.125,-0.0625) + (2.14062,-0.0625)(2.14062,-0.046875)(2.15625,-0.046875)(2.15625,-0.0625) + (2.15625,-0.078125)(2.17188,-0.078125)(2.17188,-0.0625)(2.1875,-0.0625) + (2.1875,-0.046875)(2.17188,-0.046875)(2.17188,-0.03125)(2.1875,-0.03125) + (2.20312,-0.03125)(2.20312,-0.015625)(2.1875,-0.015625)(2.1875,0) + (2.20312,0)(2.20312,0.015625)(2.21875,0.015625)(2.21875,0) +\path(2.21875,0)(2.21875,-0.015625)(2.23438,-0.015625)(2.23438,0)(2.25,0) + (2.25,0.015625)(2.23438,0.015625)(2.23438,0.03125)(2.25,0.03125) + (2.26562,0.03125)(2.26562,0.046875)(2.25,0.046875)(2.25,0.0625) + (2.23438,0.0625)(2.23438,0.046875)(2.21875,0.046875)(2.21875,0.0625) + (2.21875,0.078125)(2.20312,0.078125)(2.20312,0.0625)(2.1875,0.0625) + (2.1875,0.078125)(2.17188,0.078125)(2.17188,0.09375)(2.1875,0.09375) + (2.20312,0.09375)(2.20312,0.109375)(2.1875,0.109375)(2.1875,0.125) + (2.20312,0.125)(2.20312,0.140625)(2.21875,0.140625)(2.21875,0.125) + (2.21875,0.109375)(2.23438,0.109375)(2.23438,0.125)(2.25,0.125) + (2.26562,0.125)(2.26562,0.140625)(2.28125,0.140625)(2.28125,0.125) + (2.28125,0.109375)(2.29688,0.109375)(2.29688,0.125)(2.3125,0.125) + (2.3125,0.140625)(2.29688,0.140625)(2.29688,0.15625)(2.3125,0.15625) + (2.32812,0.15625)(2.32812,0.171875)(2.3125,0.171875)(2.3125,0.1875) + (2.29688,0.1875)(2.29688,0.171875)(2.28125,0.171875)(2.28125,0.1875) + (2.28125,0.203125)(2.26562,0.203125)(2.26562,0.1875) +\path(2.26562,0.1875)(2.25,0.1875)(2.25,0.203125)(2.23438,0.203125) + (2.23438,0.21875)(2.25,0.21875)(2.26562,0.21875)(2.26562,0.234375) + (2.25,0.234375)(2.25,0.25)(2.26562,0.25)(2.26562,0.265625) + (2.28125,0.265625)(2.28125,0.25)(2.28125,0.234375)(2.29688,0.234375) + (2.29688,0.25)(2.3125,0.25)(2.3125,0.265625)(2.29688,0.265625) + (2.29688,0.28125)(2.3125,0.28125)(2.32812,0.28125)(2.32812,0.296875) + (2.3125,0.296875)(2.3125,0.3125)(2.32812,0.3125)(2.32812,0.328125) + (2.34375,0.328125)(2.34375,0.3125)(2.34375,0.296875)(2.35938,0.296875) + (2.35938,0.3125)(2.375,0.3125)(2.375,0.296875)(2.39062,0.296875) + (2.39062,0.28125)(2.375,0.28125)(2.35938,0.28125)(2.35938,0.265625) + (2.375,0.265625)(2.375,0.25)(2.375,0.234375)(2.39062,0.234375) + (2.39062,0.21875)(2.375,0.21875)(2.35938,0.21875)(2.35938,0.203125) + (2.375,0.203125)(2.375,0.1875)(2.39062,0.1875)(2.39062,0.203125) + (2.40625,0.203125)(2.40625,0.1875)(2.40625,0.171875)(2.42188,0.171875) + (2.42188,0.1875)(2.4375,0.1875)(2.4375,0.203125)(2.42188,0.203125) +\path(2.42188,0.203125)(2.42188,0.21875)(2.4375,0.21875)(2.45312,0.21875) + (2.45312,0.234375)(2.4375,0.234375)(2.4375,0.25)(2.45312,0.25) + (2.45312,0.265625)(2.46875,0.265625)(2.46875,0.25)(2.46875,0.234375) + (2.48438,0.234375)(2.48438,0.25)(2.5,0.25)(2.5,0.234375) + (2.51562,0.234375)(2.51562,0.21875)(2.5,0.21875)(2.48438,0.21875) + (2.48438,0.203125)(2.5,0.203125)(2.5,0.1875)(2.51562,0.1875) + (2.51562,0.203125)(2.53125,0.203125)(2.53125,0.1875)(2.53125,0.171875) + (2.54688,0.171875)(2.54688,0.1875)(2.5625,0.1875)(2.5625,0.171875) + (2.57812,0.171875)(2.57812,0.15625)(2.5625,0.15625)(2.54688,0.15625) + (2.54688,0.140625)(2.5625,0.140625)(2.5625,0.125)(2.54688,0.125) + (2.54688,0.109375)(2.53125,0.109375)(2.53125,0.125)(2.53125,0.140625) + (2.51562,0.140625)(2.51562,0.125)(2.5,0.125)(2.48438,0.125) + (2.48438,0.109375)(2.46875,0.109375)(2.46875,0.125)(2.46875,0.140625) + (2.45312,0.140625)(2.45312,0.125)(2.4375,0.125)(2.4375,0.109375) + (2.45312,0.109375)(2.45312,0.09375)(2.4375,0.09375)(2.42188,0.09375) +\path(2.42188,0.09375)(2.42188,0.078125)(2.4375,0.078125)(2.4375,0.0625) + (2.45312,0.0625)(2.45312,0.078125)(2.46875,0.078125)(2.46875,0.0625) + (2.46875,0.046875)(2.48438,0.046875)(2.48438,0.0625)(2.5,0.0625) + (2.5,0.046875)(2.51562,0.046875)(2.51562,0.03125)(2.5,0.03125) + (2.48438,0.03125)(2.48438,0.015625)(2.5,0.015625)(2.5,0)(2.5,-0.015625) + (2.51562,-0.015625)(2.51562,-0.03125)(2.5,-0.03125)(2.48438,-0.03125) + (2.48438,-0.046875)(2.5,-0.046875)(2.5,-0.0625)(2.51562,-0.0625) + (2.51562,-0.046875)(2.53125,-0.046875)(2.53125,-0.0625) + (2.53125,-0.078125)(2.54688,-0.078125)(2.54688,-0.0625)(2.5625,-0.0625) + (2.5625,-0.078125)(2.57812,-0.078125)(2.57812,-0.09375)(2.5625,-0.09375) + (2.54688,-0.09375)(2.54688,-0.109375)(2.5625,-0.109375)(2.5625,-0.125) + (2.54688,-0.125)(2.54688,-0.140625)(2.53125,-0.140625)(2.53125,-0.125) + (2.53125,-0.109375)(2.51562,-0.109375)(2.51562,-0.125)(2.5,-0.125) + (2.48438,-0.125)(2.48438,-0.140625)(2.46875,-0.140625)(2.46875,-0.125) + (2.46875,-0.109375)(2.45312,-0.109375)(2.45312,-0.125)(2.4375,-0.125) +\path(2.4375,-0.125)(2.4375,-0.140625)(2.45312,-0.140625)(2.45312,-0.15625) + (2.4375,-0.15625)(2.42188,-0.15625)(2.42188,-0.171875)(2.4375,-0.171875) + (2.4375,-0.1875)(2.45312,-0.1875)(2.45312,-0.171875)(2.46875,-0.171875) + (2.46875,-0.1875)(2.46875,-0.203125)(2.48438,-0.203125)(2.48438,-0.1875) + (2.5,-0.1875)(2.5,-0.203125)(2.51562,-0.203125)(2.51562,-0.21875) + (2.5,-0.21875)(2.48438,-0.21875)(2.48438,-0.234375)(2.5,-0.234375) + (2.5,-0.25)(2.51562,-0.25)(2.51562,-0.234375)(2.53125,-0.234375) + (2.53125,-0.25)(2.53125,-0.265625)(2.54688,-0.265625)(2.54688,-0.25) + (2.5625,-0.25)(2.5625,-0.234375)(2.54688,-0.234375)(2.54688,-0.21875) + (2.5625,-0.21875)(2.57812,-0.21875)(2.57812,-0.203125)(2.5625,-0.203125) + (2.5625,-0.1875)(2.57812,-0.1875)(2.57812,-0.171875)(2.59375,-0.171875) + (2.59375,-0.1875)(2.59375,-0.203125)(2.60938,-0.203125)(2.60938,-0.1875) + (2.625,-0.1875)(2.625,-0.203125)(2.64062,-0.203125)(2.64062,-0.21875) + (2.625,-0.21875)(2.60938,-0.21875)(2.60938,-0.234375)(2.625,-0.234375) + (2.625,-0.25)(2.625,-0.265625)(2.64062,-0.265625)(2.64062,-0.28125) +\path(2.64062,-0.28125)(2.625,-0.28125)(2.60938,-0.28125) + (2.60938,-0.296875)(2.625,-0.296875)(2.625,-0.3125)(2.64062,-0.3125) + (2.64062,-0.296875)(2.65625,-0.296875)(2.65625,-0.3125) + (2.65625,-0.328125)(2.67188,-0.328125)(2.67188,-0.3125)(2.6875,-0.3125) + (2.6875,-0.296875)(2.67188,-0.296875)(2.67188,-0.28125)(2.6875,-0.28125) + (2.70312,-0.28125)(2.70312,-0.265625)(2.6875,-0.265625)(2.6875,-0.25) + (2.70312,-0.25)(2.70312,-0.234375)(2.71875,-0.234375)(2.71875,-0.25) + (2.71875,-0.265625)(2.73438,-0.265625)(2.73438,-0.25)(2.75,-0.25) + (2.75,-0.234375)(2.73438,-0.234375)(2.73438,-0.21875)(2.75,-0.21875) + (2.76562,-0.21875)(2.76562,-0.203125)(2.75,-0.203125)(2.75,-0.1875) + (2.73438,-0.1875)(2.73438,-0.203125)(2.71875,-0.203125)(2.71875,-0.1875) + (2.71875,-0.171875)(2.70312,-0.171875)(2.70312,-0.1875)(2.6875,-0.1875) + (2.6875,-0.171875)(2.67188,-0.171875)(2.67188,-0.15625)(2.6875,-0.15625) + (2.70312,-0.15625)(2.70312,-0.140625)(2.6875,-0.140625)(2.6875,-0.125) + (2.70312,-0.125)(2.70312,-0.109375)(2.71875,-0.109375)(2.71875,-0.125) + (2.71875,-0.140625)(2.73438,-0.140625) +\path(2.73438,-0.140625)(2.73438,-0.125)(2.75,-0.125)(2.76562,-0.125) + (2.76562,-0.109375)(2.78125,-0.109375)(2.78125,-0.125)(2.78125,-0.140625) + (2.79688,-0.140625)(2.79688,-0.125)(2.8125,-0.125)(2.8125,-0.109375) + (2.79688,-0.109375)(2.79688,-0.09375)(2.8125,-0.09375)(2.82812,-0.09375) + (2.82812,-0.078125)(2.8125,-0.078125)(2.8125,-0.0625)(2.79688,-0.0625) + (2.79688,-0.078125)(2.78125,-0.078125)(2.78125,-0.0625) + (2.78125,-0.046875)(2.76562,-0.046875)(2.76562,-0.0625)(2.75,-0.0625) + (2.75,-0.046875)(2.73438,-0.046875)(2.73438,-0.03125)(2.75,-0.03125) + (2.76562,-0.03125)(2.76562,-0.015625)(2.75,-0.015625)(2.75,0)(2.76562,0) + (2.76562,0.015625)(2.78125,0.015625)(2.78125,0)(2.78125,-0.015625) + (2.79688,-0.015625)(2.79688,0)(2.8125,0)(2.8125,0.015625) + (2.79688,0.015625)(2.79688,0.03125)(2.8125,0.03125)(2.82812,0.03125) + (2.82812,0.046875)(2.8125,0.046875)(2.8125,0.0625)(2.82812,0.0625) + (2.82812,0.078125)(2.84375,0.078125)(2.84375,0.0625)(2.84375,0.046875) + (2.85938,0.046875)(2.85938,0.0625)(2.875,0.0625)(2.875,0.046875) +\path(2.875,0.046875)(2.89062,0.046875)(2.89062,0.03125)(2.875,0.03125) + (2.85938,0.03125)(2.85938,0.015625)(2.875,0.015625)(2.875,0) + (2.875,-0.015625)(2.89062,-0.015625)(2.89062,-0.03125)(2.875,-0.03125) + (2.85938,-0.03125)(2.85938,-0.046875)(2.875,-0.046875)(2.875,-0.0625) + (2.89062,-0.0625)(2.89062,-0.046875)(2.90625,-0.046875)(2.90625,-0.0625) + (2.90625,-0.078125)(2.92188,-0.078125)(2.92188,-0.0625)(2.9375,-0.0625) + (2.9375,-0.046875)(2.92188,-0.046875)(2.92188,-0.03125)(2.9375,-0.03125) + (2.95312,-0.03125)(2.95312,-0.015625)(2.9375,-0.015625)(2.9375,0) + (2.95312,0)(2.95312,0.015625)(2.96875,0.015625)(2.96875,0) + (2.96875,-0.015625)(2.98438,-0.015625)(2.98438,0)(3,0) +%% --- +\end{picture} diff --git a/graphics/epix/doc/koch.xp b/graphics/epix/doc/koch.xp new file mode 100644 index 0000000000..d1a04e1c0f --- /dev/null +++ b/graphics/epix/doc/koch.xp @@ -0,0 +1,24 @@ +/* -*-ePiX-*- */ +/* koch.c -- Simple fractal "curve" generation. -- June 6, 2002 */ + +#include "epix.h" +using namespace ePiX; + +// const int koch_seed[] = {6, 4, 0, 1, -1, 0}; +const int seed[] = {4, 8, 0, 1, 0, 3, 3, 0, 1, 0}; + +int main() +{ + bounding_box(P(0,0), P(3, 0.5)); + picture(P(3, 0.5)); + unitlength("1in"); + offset(P(0,0.25)); + + begin(); + + for (int i=1; i <= 3; ++i) + fractal(P(i-1,0), P(i,0), i, seed); + + end(); +} + diff --git a/graphics/epix/doc/layout.eepic b/graphics/epix/doc/layout.eepic new file mode 100644 index 0000000000..07eec3fcb6 --- /dev/null +++ b/graphics/epix/doc/layout.eepic @@ -0,0 +1,1511 @@ +%% Generated from layout.xp on Sat Jun 30 12:16:41 EDT 2007 by +%% ePiX-1.1.6 +%% +%% Cartesian bounding box: [0,2] x [0,3] +%% Actual size: 5 x 7.5in +%% Figure offset: left by 0in, down by 0in +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0} +\xdefinecolor{rgb_980000}{rgb}{0.596078,0,0} +\setlength{\unitlength}{1in} +\begin{picture}(5,7.5)(-0,-0) +\path(1.95438,5.77398)(1.9095,5.84756)(1.86459,5.91634) + (1.81949,5.98073)(1.77406,6.04108)(1.72817,6.09772) + (1.68169,6.15093)(1.63449,6.20095)(1.58643,6.24802) + (1.53738,6.29233)(1.4872,6.33406)(1.43575,6.37337)(1.38287,6.41039) + (1.32843,6.44527)(1.27224,6.4781)(1.21415,6.50899)(1.15394,6.53802) + (1.09144,6.56528)(1.02641,6.59083)(0.958625,6.61472) + (0.887817,6.63701)(0.813702,6.65773)(0.735966,6.67692) + (0.654259,6.69459)(0.568192,6.71076) +%% +\path(1.7999,5.73751)(1.76689,5.81018)(1.7333,5.87809) + (1.69903,5.94164)(1.66399,6.00118)(1.6281,6.05703)(1.59125,6.10945) + (1.55336,6.15868)(1.51431,6.20496)(1.47401,6.24846) + (1.43234,6.28936)(1.38918,6.32782)(1.34441,6.36396) + (1.29789,6.39792)(1.24946,6.4298)(1.19898,6.45968)(1.14626,6.48766) + (1.09112,6.5138)(1.03334,6.53816)(0.972699,6.5608) + (0.908939,6.58175)(0.841779,6.60103)(0.770903,6.61868) + (0.69596,6.6347)(0.616556,6.64908) +%% +\path(1.64758,5.71257)(1.62656,5.78375)(1.60445,5.85027) + (1.5812,5.91251)(1.55677,5.97079)(1.53112,6.02543)(1.50418,6.07667) + (1.4759,6.12475)(1.4462,6.16989)(1.41501,6.21226)(1.38225,6.25204) + (1.34781,6.28935)(1.31159,6.32435)(1.27348,6.35712) + (1.23334,6.38779)(1.19104,6.41643)(1.14642,6.44311)(1.09929,6.4679) + (1.04947,6.49085)(0.996736,6.512)(0.940842,6.53138)(0.881517,6.549) + (0.818452,6.56488)(0.7513,6.579)(0.679669,6.59135) +%% +\path(1.49959,5.69983)(1.49052,5.76899)(1.47988,5.83363) + (1.46769,5.89408)(1.45395,5.95068)(1.43865,6.00371)(1.42178,6.0534) + (1.4033,6.09999)(1.38319,6.14367)(1.36138,6.18461)(1.33782,6.22297) + (1.31245,6.25888)(1.28517,6.29246)(1.2559,6.32381)(1.22453,6.35304) + (1.19093,6.3802)(1.15497,6.40538)(1.11648,6.42861)(1.0753,6.44994) + (1.03121,6.4694)(0.983998,6.48701)(0.933394,6.50277) + (0.879107,6.51667)(0.820805,6.52869)(0.758105,6.53879) +%% +\path(1.35808,5.69964)(1.36071,5.7663)(1.36137,5.82859) + (1.36012,5.88685)(1.35701,5.94137)(1.35206,5.99243) + (1.34528,6.04024)(1.33669,6.08502)(1.32628,6.12695) + (1.31402,6.16618)(1.29989,6.20287)(1.28384,6.23713)(1.2658,6.26908) + (1.24573,6.2988)(1.22352,6.32638)(1.19908,6.35188)(1.17229,6.37536) + (1.14301,6.39686)(1.1111,6.41641)(1.07637,6.43402)(1.03861,6.4497) + (0.997597,6.46343)(0.953048,6.47519)(0.904656,6.48495)(0.852063,6.49264) +%% +\path(1.22499,5.71201)(1.23894,5.77574)(1.25058,5.83529) + (1.26001,5.89099)(1.26732,5.94311)(1.27257,5.99188) + (1.27581,6.03753)(1.27707,6.08023)(1.27637,6.12016) + (1.27372,6.15746)(1.26912,6.19226)(1.26255,6.22468)(1.25398,6.2548) + (1.24336,6.28272)(1.23063,6.30849)(1.21572,6.33218) + (1.19853,6.35383)(1.17897,6.37346)(1.1569,6.3911)(1.13216,6.40674) + (1.10459,6.42038)(1.07398,6.43198)(1.04008,6.44151) + (1.00263,6.44891)(0.961291,6.45409) +%% +\path(1.10205,5.73661)(1.12678,5.79705)(1.14894,5.85356) + (1.16867,5.90641)(1.18608,5.95585)(1.20126,6.00209)(1.2143,6.04534) + (1.22526,6.08575)(1.23418,6.12348)(1.2411,6.15867)(1.24604,6.19142) + (1.24901,6.22184)(1.25,6.25)(1.249,6.27598)(1.24597,6.29984) + (1.24087,6.32162)(1.23364,6.34134)(1.22419,6.35903) + (1.21243,6.37468)(1.19825,6.3883)(1.1815,6.39984)(1.16202,6.40927) + (1.13961,6.41653)(1.11404,6.42153)(1.08505,6.42418) +%% +\path(0.990653,5.77275)(1.02551,5.82968)(1.05762,5.88291) + (1.08714,5.93269)(1.11422,5.97925)(1.13897,6.02279)(1.1615,6.06346) + (1.18189,6.10143)(1.20023,6.13683)(1.21656,6.16978) + (1.23095,6.20036)(1.24341,6.22868)(1.25398,6.2548)(1.26266,6.27878) + (1.26945,6.30066)(1.27433,6.32047)(1.27727,6.33823) + (1.27824,6.35395)(1.27716,6.36761)(1.27397,6.37919) + (1.26857,6.38865)(1.26084,6.39593)(1.25063,6.40095) + (1.23778,6.40361)(1.22209,6.40378) +%% +\path(0.891818,5.81952)(0.936069,5.87276)(0.977467,5.92257) + (1.01619,5.96916)(1.05241,6.01272)(1.08626,6.05343) + (1.11788,6.09143)(1.14736,6.12687)(1.17482,6.15986) + (1.20032,6.19049)(1.22395,6.21886)(1.24576,6.24504)(1.2658,6.26908) + (1.28412,6.29103)(1.30073,6.31092)(1.31565,6.32877) + (1.32889,6.34458)(1.34044,6.35836)(1.35028,6.37006) + (1.35839,6.37967)(1.36472,6.38712)(1.3692,6.39234)(1.37176,6.39522) + (1.3723,6.39566)(1.37069,6.39349) +%% +\path(0.806183,5.87573)(0.85904,5.92524)(0.909007,5.97156) + (0.956284,6.01489)(1.00105,6.0554)(1.04347,6.09324) + (1.08369,6.12855)(1.12183,6.16142)(1.15802,6.19198) + (1.19236,6.22029)(1.22494,6.24644)(1.25585,6.27048) + (1.28517,6.29246)(1.31296,6.31241)(1.33928,6.33035) + (1.36418,6.34629)(1.3877,6.36022)(1.40988,6.37214)(1.43074,6.38199) + (1.4503,6.38973)(1.46858,6.3953)(1.48558,6.3986)(1.50128,6.39953) + (1.51567,6.39793)(1.52872,6.39365) +%% +\path(0.734,5.94009)(0.794644,5.98587)(0.852427,6.02873) + (0.907559,6.06882)(0.960235,6.1063)(1.01063,6.14129) + (1.05891,6.17391)(1.10521,6.20425)(1.14968,6.2324)(1.19244,6.25843) + (1.23361,6.28241)(1.27329,6.30437)(1.31159,6.32435)(1.3486,6.34237) + (1.38441,6.35845)(1.41911,6.37258)(1.45277,6.38474) + (1.48548,6.39492)(1.5173,6.40305)(1.54832,6.40909)(1.57859,6.41296) + (1.6082,6.41454)(1.63721,6.41373)(1.6657,6.41035)(1.69373,6.40423) +%% +\path(0.675166,6.01119)(0.742777,6.05334)(0.807609,6.09281) + (0.869881,6.12974)(0.929796,6.16426)(0.987543,6.19647) + (1.0433,6.22648)(1.09722,6.25436)(1.14946,6.28019)(1.20016,6.30402) + (1.24947,6.32591)(1.29751,6.34588)(1.34441,6.36396) + (1.39029,6.38017)(1.43528,6.39451)(1.47948,6.40696)(1.52302,6.4175) + (1.56602,6.42609)(1.60861,6.43269)(1.65091,6.43722)(1.69305,6.4396) + (1.73517,6.4397)(1.77744,6.43741)(1.82002,6.43255)(1.86308,6.42493) +%% +\path(0.62927,6.08763)(0.703045,6.12629)(0.774167,6.1625) + (0.842861,6.1964)(0.909337,6.22808)(0.973792,6.25763) + (1.03641,6.28514)(1.09737,6.31068)(1.15683,6.3343)(1.21496,6.35605) + (1.27191,6.37597)(1.32783,6.39408)(1.38287,6.41039) + (1.43719,6.42493)(1.49093,6.43766)(1.54425,6.44859) + (1.59729,6.45768)(1.65023,6.46488)(1.70324,6.47014) + (1.75649,6.47337)(1.81019,6.4745)(1.86455,6.47339)(1.9198,6.46991) + (1.97622,6.46388)(2.03409,6.4551) +%% +\path(1.95438,5.77398)(1.877,5.75436)(1.7999,5.73751) + (1.72333,5.72355)(1.64758,5.71257)(1.57291,5.70464) + (1.49959,5.69983)(1.4279,5.69816)(1.35808,5.69964)(1.29037,5.70427) + (1.22499,5.71201)(1.16216,5.72282)(1.10205,5.73661) + (1.04484,5.75329)(0.990653,5.77275)(0.939616,5.79488) + (0.891818,5.81952)(0.847326,5.84652)(0.806183,5.87573) + (0.768408,5.90698)(0.734,5.94009)(0.702933,5.97489) + (0.675166,6.01119)(0.650637,6.04883)(0.62927,6.08763) +%% +\path(1.86459,5.91634)(1.79875,5.89596)(1.7333,5.87809) + (1.66845,5.86282)(1.60445,5.85027)(1.54151,5.84052) + (1.47988,5.83363)(1.41976,5.82964)(1.36137,5.82859) + (1.30491,5.83047)(1.25058,5.83529)(1.19853,5.843)(1.14894,5.85356) + (1.10193,5.86689)(1.05762,5.88291)(1.01611,5.90151) + (0.977467,5.92257)(0.941756,5.94597)(0.909007,5.97156) + (0.879232,5.9992)(0.852427,6.02873)(0.828566,6.05999) + (0.807609,6.09281)(0.789499,6.12704)(0.774167,6.1625) +%% +\path(1.77406,6.04108)(1.71877,6.02)(1.66399,6.00118) + (1.60993,5.98475)(1.55677,5.97079)(1.50471,5.95942) + (1.45395,5.95068)(1.40465,5.94465)(1.35701,5.94137) + (1.31118,5.94086)(1.26732,5.94311)(1.22558,5.94812) + (1.18608,5.95585)(1.14892,5.96625)(1.11422,5.97925) + (1.08203,5.99478)(1.05241,6.01272)(1.02541,6.03297)(1.00105,6.0554) + (0.97933,6.07989)(0.960235,6.1063)(0.943738,6.13447) + (0.929796,6.16426)(0.918352,6.19551)(0.909337,6.22808) +%% +\path(1.68169,6.15093)(1.63613,6.12916)(1.59125,6.10945) + (1.54721,6.09191)(1.50418,6.07667)(1.46232,6.0638)(1.42178,6.0534) + (1.38272,6.04553)(1.34528,6.04024)(1.3096,6.03757)(1.27581,6.03753) + (1.24401,6.04012)(1.2143,6.04534)(1.18677,6.05313)(1.1615,6.06346) + (1.13852,6.07626)(1.11788,6.09143)(1.0996,6.1089)(1.08369,6.12855) + (1.07013,6.15026)(1.05891,6.17391)(1.04998,6.19936)(1.0433,6.22648) + (1.0388,6.25512)(1.03641,6.28514) +%% +\path(1.58643,6.24802)(1.54994,6.22555)(1.51431,6.20496) + (1.47969,6.18637)(1.4462,6.16989)(1.41399,6.15563)(1.38319,6.14367) + (1.35391,6.13409)(1.32628,6.12695)(1.3004,6.12229)(1.27637,6.12016) + (1.25427,6.12056)(1.23418,6.12348)(1.21615,6.12892) + (1.20023,6.13683)(1.18644,6.14717)(1.17482,6.15986) + (1.16535,6.17483)(1.15802,6.19198)(1.15281,6.21121)(1.14968,6.2324) + (1.14858,6.25544)(1.14946,6.28019)(1.15223,6.30652)(1.15683,6.3343) +%% +\path(1.4872,6.33406)(1.45923,6.31085)(1.43234,6.28936) + (1.40664,6.26972)(1.38225,6.25204)(1.35927,6.23642) + (1.33782,6.22297)(1.318,6.21176)(1.29989,6.20287)(1.28357,6.19636) + (1.26912,6.19226)(1.2566,6.19061)(1.24604,6.19142)(1.23748,6.19468) + (1.23095,6.20036)(1.22644,6.20844)(1.22395,6.21886) + (1.22346,6.23156)(1.22494,6.24644)(1.22834,6.26342) + (1.23361,6.28241)(1.24068,6.30328)(1.24947,6.32591) + (1.25991,6.35018)(1.27191,6.37597) +%% +\path(1.38287,6.41039)(1.36299,6.38639)(1.34441,6.36396) + (1.32725,6.34324)(1.31159,6.32435)(1.29754,6.30738) + (1.28517,6.29246)(1.27457,6.27966)(1.2658,6.26908)(1.25892,6.26077) + (1.25398,6.2548)(1.251,6.2512)(1.25,6.25)(1.251,6.2512) + (1.25398,6.2548)(1.25892,6.26077)(1.2658,6.26908)(1.27457,6.27966) + (1.28517,6.29246)(1.29754,6.30738)(1.31159,6.32435) + (1.32725,6.34324)(1.34441,6.36396)(1.36299,6.38639)(1.38287,6.41039) +%% +\path(1.27224,6.4781)(1.26007,6.45322)(1.24946,6.4298) + (1.24053,6.40794)(1.23334,6.38779)(1.22799,6.36945) + (1.22453,6.35304)(1.22302,6.33865)(1.22352,6.32638) + (1.22604,6.31631)(1.23063,6.30849)(1.23727,6.30299) + (1.24597,6.29984)(1.25671,6.29906)(1.26945,6.30066) + (1.28414,6.30462)(1.30073,6.31092)(1.31913,6.31951) + (1.33928,6.33035)(1.36108,6.34335)(1.38441,6.35845) + (1.40918,6.37553)(1.43528,6.39451)(1.46257,6.41526)(1.49093,6.43766) +%% +\path(1.15394,6.53802)(1.14916,6.51218)(1.14626,6.48766) + (1.14532,6.46459)(1.14642,6.44311)(1.14962,6.42333) + (1.15497,6.40538)(1.16252,6.38935)(1.17229,6.37536)(1.18429,6.3635) + (1.19853,6.35383)(1.21499,6.34643)(1.23364,6.34134)(1.25442,6.3386) + (1.27727,6.33823)(1.30213,6.34023)(1.32889,6.34458) + (1.35745,6.35126)(1.3877,6.36022)(1.41952,6.37141)(1.45277,6.38474) + (1.48732,6.40014)(1.52302,6.4175)(1.55973,6.43672)(1.59729,6.45768) +%% +\path(1.02641,6.59083)(1.02876,6.56389)(1.03334,6.53816) + (1.04022,6.51377)(1.04947,6.49085)(1.06115,6.46953)(1.0753,6.44994) + (1.09195,6.4322)(1.1111,6.41641)(1.13276,6.40268)(1.1569,6.3911) + (1.18348,6.38175)(1.21243,6.37468)(1.24369,6.36996) + (1.27716,6.36761)(1.31274,6.36764)(1.35028,6.37006) + (1.38967,6.37486)(1.43074,6.38199)(1.47334,6.39141)(1.5173,6.40305) + (1.56245,6.41685)(1.60861,6.43269)(1.6556,6.45049)(1.70324,6.47014) +%% +\path(0.887817,6.63701)(0.897069,6.60884)(0.908939,6.58175) + (0.923508,6.55588)(0.940842,6.53138)(0.960994,6.50838) + (0.983998,6.48701)(1.00987,6.46741)(1.03861,6.4497)(1.0702,6.43398) + (1.10459,6.42038)(1.14172,6.40897)(1.1815,6.39984)(1.22383,6.39305) + (1.26857,6.38865)(1.31559,6.38667)(1.36472,6.38712) + (1.41578,6.39001)(1.46858,6.3953)(1.52292,6.40297)(1.57859,6.41296) + (1.63537,6.42519)(1.69305,6.4396)(1.75139,6.45607)(1.81019,6.4745) +%% +\path(0.735966,6.67692)(0.7519,6.64732)(0.770903,6.61868) + (0.793063,6.59115)(0.818452,6.56488)(0.847122,6.54) + (0.879107,6.51667)(0.91442,6.49502)(0.953048,6.47519) + (0.994955,6.45732)(1.04008,6.44151)(1.08834,6.42788) + (1.13961,6.41653)(1.19376,6.40753)(1.25063,6.40095) + (1.31003,6.39684)(1.37176,6.39522)(1.43559,6.39612) + (1.50128,6.39953)(1.56857,6.40541)(1.63721,6.41373) + (1.70692,6.42442)(1.77744,6.43741)(1.84849,6.45261)(1.9198,6.46991) +%% +\path(0.568192,6.71076)(0.590579,6.67951)(0.616556,6.64908) + (0.646225,6.61965)(0.679669,6.59135)(0.716949,6.56435) + (0.758105,6.53879)(0.803148,6.51484)(0.852063,6.49264) + (0.904803,6.47235)(0.961291,6.45409)(1.02142,6.43799) + (1.08505,6.42418)(1.15201,6.41274)(1.22209,6.40378) + (1.29507,6.39734)(1.37069,6.39349)(1.44868,6.39226) + (1.52872,6.39365)(1.61052,6.39765)(1.69373,6.40423) + (1.77803,6.41335)(1.86308,6.42493)(1.94854,6.43888)(2.03409,6.4551) +%% +\path(1.25,6.25)(0.90831,5.83754) +%% +\path(0.929086,5.88702)(0.940008,5.90021) +\path(0.922161,5.87053)(0.944004,5.8969) +\path(0.915235,5.85404)(0.947999,5.89359) +\path(0.90831,5.83754)(0.951995,5.89028) +\path(0.923227,5.84742)(0.955991,5.88697) +\path(0.938144,5.85729)(0.959987,5.88366) +\path(0.953061,5.86716)(0.963983,5.88035) +\path(0.951995,5.89028)(0.936012,5.90352)(0.90831,5.83754) + (0.967979,5.87704)(0.951995,5.89028) +%% +\path(1.25,6.25)(1.9921,6.09631) +%% +\path(1.90984,6.09745)(1.88348,6.10291) +\path(1.93726,6.09707)(1.88453,6.10799) +\path(1.96468,6.09669)(1.88558,6.11307) +\path(1.9921,6.09631)(1.88663,6.11815) +\path(1.96678,6.10685)(1.88768,6.12323) +\path(1.94147,6.11739)(1.88874,6.12831) +\path(1.91616,6.12793)(1.88979,6.13339) +\path(1.88663,6.11815)(1.88242,6.09782)(1.9921,6.09631) + (1.89084,6.13847)(1.88663,6.11815) +%% +\allinethickness{1pt}% +\color{rgb_980000}% +\path(2.375,5.125) + (2.375,7.375)(0.125,7.375)(0.125,5.125)(2.375,5.125) +%% +\allinethickness{0.4pt}% +\color{rgb_000000}% +\path(1.57249,2.99581) + (1.60208,3.08238)(1.62568,3.16486)(1.6436,3.24353)(1.65613,3.31869) + (1.66348,3.39059)(1.66589,3.45945)(1.66353,3.52548) + (1.65656,3.58888)(1.64515,3.64982)(1.6294,3.70847)(1.60943,3.76497) + (1.58534,3.81945)(1.5572,3.87205)(1.52509,3.92289)(1.48905,3.97206) + (1.44912,4.01968)(1.40534,4.06584)(1.35773,4.11062)(1.3063,4.15411) + (1.25104,4.19638)(1.19195,4.23751)(1.129,4.27756)(1.06218,4.3166)(0.991435,4.35469) +%% +\path(1.39706,3.04908)(1.43364,3.12654)(1.46419,3.20061) + (1.48899,3.27155)(1.50828,3.33955)(1.52226,3.40482) + (1.53114,3.46754)(1.53508,3.52788)(1.53423,3.58598)(1.5287,3.64199) + (1.51863,3.69603)(1.50409,3.74824)(1.48518,3.79871) + (1.46195,3.84755)(1.43447,3.89487)(1.40276,3.94074) + (1.36687,3.98526)(1.3268,4.02851)(1.28256,4.07055)(1.23414,4.11145) + (1.18153,4.1513)(1.12471,4.19013)(1.06363,4.22802) + (0.998248,4.26502)(0.928503,4.30119) +%% +\path(1.24877,3.10605)(1.29092,3.17474)(1.32712,3.24068) + (1.3576,3.30403)(1.38257,3.36496)(1.40221,3.42363)(1.41669,3.48018) + (1.42614,3.53473)(1.43068,3.5874)(1.43043,3.6383)(1.42548,3.68755) + (1.4159,3.73523)(1.40174,3.78143)(1.38307,3.82624)(1.35991,3.86973) + (1.33228,3.91199)(1.3002,3.95308)(1.26366,3.99306)(1.22265,4.03201) + (1.17713,4.06997)(1.12708,4.107)(1.07245,4.14315)(1.01316,4.17848) + (0.94915,4.21303)(0.88033,4.24685) +%% +\path(1.12691,3.16617)(1.17344,3.22652)(1.21419,3.28463) + (1.24934,3.34063)(1.27907,3.39466)(1.30353,3.44682) + (1.32285,3.49721)(1.33713,3.54595)(1.34648,3.59312) + (1.35097,3.63881)(1.35067,3.68311)(1.34564,3.72607)(1.3359,3.76779) + (1.32149,3.80832)(1.30242,3.84773)(1.27869,3.88608) + (1.25028,3.92343)(1.21716,3.95982)(1.17931,3.99531) + (1.13666,4.02995)(1.08914,4.06378)(1.0367,4.09685)(0.979215,4.1292) + (0.916597,4.16087)(0.848721,4.19189) +%% +\path(1.03051,3.22888)(1.08046,3.28136)(1.12486,3.33203) + (1.16386,3.38098)(1.1976,3.42832)(1.22618,3.47411)(1.24971,3.51846) + (1.26827,3.56143)(1.28193,3.60309)(1.29073,3.64351) + (1.29472,3.68275)(1.29392,3.72088)(1.28835,3.75794)(1.27801,3.794) + (1.26288,3.82909)(1.24294,3.86327)(1.21815,3.89658) + (1.18844,3.92907)(1.15376,3.96077)(1.11403,3.99173) + (1.06914,4.02198)(1.01898,4.05155)(0.963433,4.08048) + (0.902342,4.10881)(0.835544,4.13656) +%% +\path(0.958412,3.29368)(1.01103,3.3388)(1.05838,3.38244) + (1.10059,3.42468)(1.13773,3.4656)(1.1699,3.50525)(1.19715,3.54369) + (1.21956,3.58099)(1.23714,3.61719)(1.24993,3.65234)(1.25794,3.6865) + (1.26117,3.7197)(1.25961,3.75199)(1.25324,3.78341)(1.242,3.814) + (1.22584,3.84379)(1.20471,3.87282)(1.1785,3.90111)(1.14713,3.92871) + (1.11049,3.95563)(1.06842,3.98191)(1.02079,4.00758) + (0.967431,4.03266)(0.90814,4.05717)(0.842708,4.08114) +%% +\path(0.909289,3.36006)(0.964025,3.39834)(1.01381,3.43541) + (1.05873,3.47132)(1.09883,3.50614)(1.13418,3.5399)(1.16481,3.57265) + (1.19075,3.60442)(1.212,3.63526)(1.22857,3.66521)(1.24045,3.69429) + (1.2476,3.72255)(1.25,3.75)(1.24758,3.77668)(1.24029,3.80262) + (1.22803,3.82784)(1.21071,3.85236)(1.18821,3.87622)(1.1604,3.89941) + (1.12714,3.92198)(1.08825,3.94394)(1.04353,3.9653) + (0.992768,3.98607)(0.935726,4.00629)(0.872128,4.02595) +%% +\path(0.881704,3.42756)(0.938175,3.45953)(0.990033,3.4905) + (1.03733,3.5205)(1.08009,3.54957)(1.11835,3.57774)(1.15212,3.60504) + (1.1814,3.63149)(1.20618,3.65713)(1.22644,3.68198)(1.24213,3.70606) + (1.25321,3.72939)(1.25961,3.75199)(1.26127,3.77388) + (1.25808,3.79508)(1.24993,3.8156)(1.2367,3.83545)(1.21824,3.85464) + (1.19439,3.87319)(1.16495,3.89111)(1.12973,3.9084)(1.08847,3.92506) + (1.04091,3.94111)(0.986766,3.95654)(0.92569,3.97136) +%% +\path(0.874138,3.49573)(0.93211,3.52194)(0.985819,3.54729) + (1.03529,3.5718)(1.08054,3.5955)(1.12156,3.61841)(1.15836,3.64055) + (1.19091,3.66193)(1.21917,3.68256)(1.24311,3.70247) + (1.26267,3.72167)(1.27778,3.74015)(1.28835,3.75794) + (1.29429,3.77504)(1.29547,3.79146)(1.29177,3.80719) + (1.28303,3.82225)(1.26907,3.83662)(1.2497,3.85032)(1.22469,3.86333) + (1.1938,3.87564)(1.15674,3.88726)(1.1132,3.89816)(1.06282,3.90834)(1.0052,3.91777) +%% +\path(0.885031,3.56419)(0.944391,3.58516)(0.999849,3.60537) + (1.05141,3.62484)(1.09907,3.64357)(1.14282,3.66157) + (1.18263,3.67886)(1.21846,3.69544)(1.25027,3.71131)(1.278,3.72648) + (1.30157,3.74095)(1.32091,3.75472)(1.3359,3.76779)(1.34643,3.78015) + (1.35237,3.7918)(1.35356,3.80272)(1.34982,3.81291)(1.34096,3.82236) + (1.32674,3.83103)(1.30692,3.83893)(1.28121,3.84601) + (1.24929,3.85226)(1.21078,3.85763)(1.16529,3.8621)(1.11235,3.86562) +%% +\path(0.912807,3.63258)(0.973544,3.64883)(1.03075,3.66437) + (1.0844,3.67923)(1.1345,3.69339)(1.18102,3.70686)(1.22391,3.71963) + (1.26313,3.73171)(1.29863,3.74309)(1.33033,3.75376) + (1.35815,3.76372)(1.38199,3.77294)(1.40174,3.78143) + (1.41728,3.78915)(1.42844,3.7961)(1.43507,3.80224)(1.43696,3.80755) + (1.43391,3.812)(1.42567,3.81556)(1.41195,3.81818)(1.39244,3.81982) + (1.36679,3.82042)(1.33458,3.81993)(1.29537,3.81827)(1.24863,3.81537) +%% +\path(0.955906,3.70059)(1.01809,3.7126)(1.0771,3.72394) + (1.13294,3.73461)(1.18557,3.74461)(1.23497,3.75392) + (1.28108,3.76253)(1.32387,3.77044)(1.36326,3.77762) + (1.39918,3.78406)(1.43155,3.78974)(1.46025,3.79463) + (1.48518,3.79871)(1.5062,3.80194)(1.52314,3.8043)(1.53585,3.80574) + (1.54411,3.80622)(1.54771,3.80568)(1.54637,3.80407) + (1.53982,3.80133)(1.52771,3.79737)(1.50967,3.79211) + (1.48526,3.78546)(1.45399,3.7773)(1.4153,3.76751) +%% +\path(1.0128,3.76793)(1.07655,3.77617)(1.13751,3.78375) + (1.19566,3.79067)(1.25098,3.7969)(1.30343,3.80242)(1.35296,3.80723) + (1.39954,3.81129)(1.44308,3.81459)(1.48353,3.81709) + (1.52079,3.81875)(1.55477,3.81956)(1.58534,3.81945) + (1.61238,3.81839)(1.63574,3.81633)(1.65524,3.8132)(1.67069,3.80894) + (1.68186,3.80347)(1.68849,3.79671)(1.6903,3.78856)(1.68695,3.77892) + (1.67805,3.76764)(1.66317,3.7546)(1.64178,3.73963)(1.61332,3.72254) +%% +\path(1.57249,2.99581)(1.48135,3.02195)(1.39706,3.04908) + (1.31956,3.07714)(1.24877,3.10605)(1.1846,3.13575)(1.12691,3.16617) + (1.0756,3.19723)(1.03051,3.22888)(0.991504,3.26105) + (0.958412,3.29368)(0.931066,3.3267)(0.909289,3.36006) + (0.892898,3.3937)(0.881704,3.42756)(0.875516,3.46158) + (0.874138,3.49573)(0.877376,3.52995)(0.885031,3.56419) + (0.896906,3.59842)(0.912807,3.63258)(0.932537,3.66665) + (0.955906,3.70059)(0.982723,3.73436)(1.0128,3.76793) +%% +\path(1.62568,3.16486)(1.54188,3.18217)(1.46419,3.20061) + (1.39261,3.22013)(1.32712,3.24068)(1.26766,3.26219) + (1.21419,3.28463)(1.16661,3.30793)(1.12486,3.33203) + (1.08882,3.35689)(1.05838,3.38244)(1.03343,3.40863) + (1.01381,3.43541)(0.999398,3.46271)(0.990033,3.4905) + (0.985561,3.51871)(0.985819,3.54729)(0.990638,3.57619) + (0.999849,3.60537)(1.01328,3.63478)(1.03075,3.66437) + (1.05208,3.69411)(1.0771,3.72394)(1.10564,3.75384)(1.13751,3.78375) +%% +\path(1.65613,3.31869)(1.57945,3.32854)(1.50828,3.33955) + (1.44265,3.3517)(1.38257,3.36496)(1.32805,3.37929)(1.27907,3.39466) + (1.2356,3.41101)(1.1976,3.42832)(1.165,3.44653)(1.13773,3.4656) + (1.11571,3.48548)(1.09883,3.50614)(1.087,3.52752)(1.08009,3.54957) + (1.07798,3.57225)(1.08054,3.5955)(1.08762,3.61929)(1.09907,3.64357) + (1.11475,3.66828)(1.1345,3.69339)(1.15816,3.71885)(1.18557,3.74461) + (1.21656,3.77064)(1.25098,3.7969) +%% +\path(1.66589,3.45945)(1.59601,3.46292)(1.53114,3.46754) + (1.47135,3.4733)(1.41669,3.48018)(1.36718,3.48816)(1.32285,3.49721) + (1.2837,3.50732)(1.24971,3.51846)(1.22088,3.53059)(1.19715,3.54369) + (1.17849,3.55772)(1.16481,3.57265)(1.15605,3.58843) + (1.15212,3.60504)(1.15293,3.62242)(1.15836,3.64055)(1.1683,3.65937) + (1.18263,3.67886)(1.20121,3.69896)(1.22391,3.71963) + (1.25058,3.74084)(1.28108,3.76253)(1.31526,3.78468)(1.35296,3.80723) +%% +\path(1.65656,3.58888)(1.59309,3.58689)(1.53423,3.58598) + (1.48007,3.58615)(1.43068,3.5874)(1.38614,3.58973)(1.34648,3.59312) + (1.31173,3.59758)(1.28193,3.60309)(1.25706,3.60963) + (1.23714,3.61719)(1.22213,3.62574)(1.212,3.63526)(1.2067,3.64574) + (1.20618,3.65713)(1.21037,3.66942)(1.21917,3.68256) + (1.23251,3.69654)(1.25027,3.71131)(1.27235,3.72684) + (1.29863,3.74309)(1.32898,3.76003)(1.36326,3.77762) + (1.40135,3.79582)(1.44308,3.81459) +%% +\path(1.6294,3.70847)(1.57186,3.70176)(1.51863,3.69603) + (1.4698,3.69129)(1.42548,3.68755)(1.38575,3.68482)(1.35067,3.68311) + (1.32031,3.68242)(1.29472,3.68275)(1.27392,3.68411)(1.25794,3.6865) + (1.24679,3.68989)(1.24045,3.69429)(1.23891,3.69969) + (1.24213,3.70606)(1.25007,3.71339)(1.26267,3.72167) + (1.27987,3.73086)(1.30157,3.74095)(1.3277,3.75191)(1.35815,3.76372) + (1.3928,3.77634)(1.43155,3.78974)(1.47426,3.80389)(1.52079,3.81875) +%% +\path(1.58534,3.81945)(1.53323,3.80866)(1.48518,3.79871) + (1.44131,3.78962)(1.40174,3.78143)(1.36658,3.77414)(1.3359,3.76779) + (1.3098,3.76239)(1.28835,3.75794)(1.27161,3.75448)(1.25961,3.75199) + (1.25241,3.7505)(1.25,3.75)(1.25241,3.7505)(1.25961,3.75199) + (1.27161,3.75448)(1.28835,3.75794)(1.3098,3.76239)(1.3359,3.76779) + (1.36658,3.77414)(1.40174,3.78143)(1.44131,3.78962) + (1.48518,3.79871)(1.53323,3.80866)(1.58534,3.81945) +%% +\path(1.52509,3.92289)(1.47784,3.90853)(1.43447,3.89487) + (1.39512,3.88192)(1.35991,3.86973)(1.32897,3.85833) + (1.30242,3.84773)(1.28036,3.83798)(1.26288,3.82909) + (1.25007,3.82109)(1.242,3.814)(1.23872,3.80784)(1.24029,3.80262) + (1.24673,3.79836)(1.25808,3.79508)(1.27433,3.79277) + (1.29547,3.79146)(1.3215,3.79113)(1.35237,3.7918)(1.38804,3.79345) + (1.42844,3.7961)(1.47351,3.79972)(1.52314,3.8043)(1.57726,3.80985)(1.63574,3.81633) +%% +\path(1.44912,4.01968)(1.40612,4.00221)(1.36687,3.98526) + (1.33151,3.96887)(1.3002,3.95308)(1.27308,3.93792)(1.25028,3.92343) + (1.23193,3.90964)(1.21815,3.89658)(1.20904,3.8843)(1.20471,3.87282) + (1.20524,3.86216)(1.21071,3.85236)(1.22118,3.84345)(1.2367,3.83545) + (1.25731,3.82837)(1.28303,3.82225)(1.31387,3.81709) + (1.34982,3.81291)(1.39086,3.80973)(1.43696,3.80755) + (1.48807,3.80638)(1.54411,3.80622)(1.60502,3.80707)(1.67069,3.80894) +%% +\path(1.35773,4.11062)(1.31832,4.09041)(1.28256,4.07055) + (1.25061,4.05107)(1.22265,4.03201)(1.19883,4.01341) + (1.17931,3.99531)(1.16424,3.97775)(1.15376,3.96077) + (1.14802,3.94441)(1.14713,3.92871)(1.15123,3.91369)(1.1604,3.89941) + (1.17476,3.8859)(1.19439,3.87319)(1.21935,3.86132)(1.2497,3.85032) + (1.28549,3.84021)(1.32674,3.83103)(1.37347,3.82281) + (1.42567,3.81556)(1.48331,3.80931)(1.54637,3.80407) + (1.61479,3.79987)(1.68849,3.79671) +%% +\path(1.25104,4.19638)(1.2145,4.17376)(1.18153,4.1513) + (1.15234,4.12903)(1.12708,4.107)(1.10596,4.08523)(1.08914,4.06378) + (1.07681,4.04268)(1.06914,4.02198)(1.06629,4.00171) + (1.06842,3.98191)(1.07569,3.96264)(1.08825,3.94394) + (1.10622,3.92584)(1.12973,3.9084)(1.15889,3.89165)(1.1938,3.87564) + (1.23455,3.86042)(1.28121,3.84601)(1.33383,3.83246) + (1.39244,3.81982)(1.45707,3.80811)(1.52771,3.79737) + (1.60435,3.78763)(1.68695,3.77892) +%% +\path(1.129,4.27756)(1.09455,4.25281)(1.06363,4.22802) + (1.03643,4.20324)(1.01316,4.17848)(0.994019,4.15379) + (0.979215,4.1292)(0.968952,4.10475)(0.963433,4.08048) + (0.96286,4.05644)(0.967431,4.03266)(0.977337,4.00919) + (0.992768,3.98607)(1.0139,3.96337)(1.04091,3.94111) + (1.07396,3.91936)(1.1132,3.89816)(1.15877,3.87757)(1.21078,3.85763) + (1.26936,3.8384)(1.33458,3.81993)(1.40653,3.80226)(1.48526,3.78546) + (1.5708,3.76955)(1.66317,3.7546) +%% +\path(0.991435,4.35469)(0.958234,4.32805)(0.928503,4.30119) + (0.902461,4.27411)(0.88033,4.24685)(0.862339,4.21944) + (0.848721,4.19189)(0.83971,4.16426)(0.835544,4.13656) + (0.836464,4.10884)(0.842708,4.08114)(0.854517,4.05349) + (0.872128,4.02595)(0.895776,3.99856)(0.92569,3.97136) + (0.962093,3.94442)(1.0052,3.91777)(1.05522,3.89149) + (1.11235,3.86562)(1.17676,3.84023)(1.24863,3.81537)(1.3281,3.79111) + (1.4153,3.76751)(1.51034,3.74463)(1.61332,3.72254) +%% +\path(1.25,3.75)(0.507902,3.59631) +%% +\path(0.583844,3.62793)(0.610211,3.63339) +\path(0.55853,3.61739)(0.611263,3.62831) +\path(0.533216,3.60685)(0.612315,3.62323) +\path(0.507902,3.59631)(0.613368,3.61815) +\path(0.535321,3.59669)(0.61442,3.61307) +\path(0.56274,3.59707)(0.615472,3.60799) +\path(0.590158,3.59745)(0.616525,3.60291) +\path(0.613368,3.61815)(0.609159,3.63847)(0.507902,3.59631) + (0.617577,3.59782)(0.613368,3.61815) +%% +\path(1.25,3.75)(1.59169,3.33754) +%% +\path(1.54694,3.36716)(1.53602,3.38035) +\path(1.56186,3.35729)(1.54001,3.38366) +\path(1.57677,3.34742)(1.54401,3.38697) +\path(1.59169,3.33754)(1.548,3.39028) +\path(1.58476,3.35404)(1.552,3.39359) +\path(1.57784,3.37053)(1.556,3.3969) +\path(1.57091,3.38702)(1.55999,3.40021) +\path(1.548,3.39028)(1.53202,3.37704)(1.59169,3.33754) + (1.56399,3.40352)(1.548,3.39028) +%% +\allinethickness{1pt}% +\color{rgb_980000}% +\path(2.375,2.625) + (2.375,4.875)(0.125,4.875)(0.125,2.625)(2.375,2.625) +%% +\allinethickness{0.4pt}% +\color{rgb_000000}% +\path + (0.927506,0.495809)(1.01757,0.548834)(1.10157,0.602843) + (1.17947,0.657739)(1.25125,0.713425)(1.3169,0.769804) + (1.37643,0.826777)(1.42989,0.884247)(1.47732,0.94212) + (1.51879,1.0003)(1.55438,1.0587)(1.58419,1.11722)(1.60833,1.17579) + (1.62692,1.23431)(1.64008,1.2927)(1.64797,1.35089)(1.65074,1.40881) + (1.64854,1.46638)(1.64154,1.52354)(1.62991,1.58023) + (1.61383,1.63639)(1.59347,1.69196)(1.56902,1.7469)(1.54066,1.80115)(1.50857,1.85469) +%% +\path(0.8777,0.611715)(0.959433,0.655571)(1.03581,0.700614) + (1.10675,0.74677)(1.17219,0.793961)(1.2321,0.842109) + (1.28645,0.891132)(1.33522,0.940947)(1.37842,0.991473) + (1.41609,1.04262)(1.44824,1.09432)(1.47494,1.14647)(1.49626,1.199) + (1.51227,1.25182)(1.52307,1.30486)(1.52876,1.35804) + (1.52946,1.41127)(1.52529,1.46449)(1.51639,1.51763)(1.5029,1.57062) + (1.48496,1.62339)(1.46273,1.67588)(1.43637,1.72802) + (1.40604,1.77978)(1.37192,1.83108) +%% +\path(0.850911,0.713606)(0.924836,0.749547)(0.993963,0.786789) + (1.05819,0.825281)(1.11743,0.864964)(1.17161,0.905781) + (1.22068,0.947667)(1.26458,0.990557)(1.3033,1.03438) + (1.33682,1.07908)(1.36514,1.12456)(1.38829,1.17077) + (1.40628,1.21763)(1.41917,1.26507)(1.42702,1.313)(1.42989,1.36136) + (1.42787,1.41007)(1.42105,1.45906)(1.40954,1.50826) + (1.39346,1.55759)(1.37292,1.607)(1.34805,1.6564)(1.31901,1.70574) + (1.28592,1.75496)(1.24895,1.80399) +%% +\path(0.844563,0.803527)(0.911256,0.832549)(0.97359,0.862922) + (1.03145,0.894614)(1.08472,0.927588)(1.13332,0.961802) + (1.17715,0.997213)(1.21616,1.03377)(1.25029,1.07143) + (1.27949,1.11013)(1.30374,1.14982)(1.32302,1.19043) + (1.33734,1.23191)(1.3467,1.27419)(1.35115,1.31721)(1.35071,1.3609) + (1.34544,1.40519)(1.33541,1.45002)(1.32069,1.49531) + (1.30138,1.54101)(1.27758,1.58703)(1.24938,1.63332)(1.21692,1.6798) + (1.18032,1.72642)(1.13972,1.7731) +%% +\path(0.856643,0.883119)(0.916712,0.906022)(0.972764,0.930277) + (1.02467,0.955868)(1.0723,0.982778)(1.11556,1.01098) + (1.15433,1.04046)(1.18853,1.07117)(1.21807,1.10309) + (1.24291,1.13617)(1.26297,1.17038)(1.27822,1.20567)(1.28864,1.242) + (1.2942,1.27931)(1.29492,1.31754)(1.29079,1.35666)(1.28185,1.39658) + (1.26815,1.43727)(1.24972,1.47865)(1.22664,1.52067) + (1.19897,1.56326)(1.16682,1.60635)(1.13027,1.64988) + (1.08945,1.69379)(1.04445,1.73802) +%% +\path(0.885577,0.953717)(0.93965,0.971145)(0.989968,0.989888) + (1.03639,1.00995)(1.07878,1.03132)(1.11702,1.05399) + (1.15098,1.07797)(1.18055,1.10322)(1.20565,1.12975) + (1.22618,1.15751)(1.24206,1.1865)(1.25323,1.21667)(1.25963,1.24801) + (1.26123,1.28046)(1.258,1.314)(1.24993,1.34858)(1.23701,1.38415) + (1.21926,1.42067)(1.1967,1.45809)(1.16937,1.49635)(1.13734,1.5354) + (1.10065,1.57517)(1.0594,1.61562)(1.01366,1.65667)(0.963551,1.69828) +%% +\path(0.930139,1.01641)(0.97886,1.02889)(1.02402,1.04261) + (1.06548,1.05759)(1.10308,1.07385)(1.13669,1.09139) + (1.16618,1.11021)(1.19141,1.13032)(1.21227,1.15172)(1.22866,1.1744) + (1.24046,1.19834)(1.2476,1.22355)(1.25,1.25)(1.24758,1.27767) + (1.2403,1.30654)(1.22812,1.33658)(1.211,1.36775)(1.18893,1.40004) + (1.16191,1.43338)(1.12996,1.46775)(1.0931,1.50311)(1.05137,1.53939) + (1.00483,1.57655)(0.95355,1.61455)(0.897604,1.65331) +%% +\path(0.989383,1.07211)(1.03341,1.08005)(1.07402,1.08915) + (1.11107,1.09943)(1.14439,1.11092)(1.17383,1.12362) + (1.19925,1.13757)(1.22049,1.15278)(1.23743,1.16926) + (1.24993,1.18702)(1.25787,1.20606)(1.26114,1.22639) + (1.25963,1.24801)(1.25325,1.2709)(1.24192,1.29508)(1.22557,1.32052) + (1.20414,1.3472)(1.17758,1.37511)(1.14587,1.40423)(1.10898,1.43452) + (1.06692,1.46596)(1.0197,1.49852)(0.967353,1.53214) + (0.909912,1.5668)(0.84744,1.60244) +%% +\path(1.0626,1.12156)(1.1026,1.12531)(1.1393,1.1301) + (1.17253,1.13598)(1.20212,1.14296)(1.22791,1.15108) + (1.24973,1.16037)(1.26742,1.17086)(1.28083,1.18256)(1.2898,1.19551) + (1.29418,1.20972)(1.29384,1.22521)(1.28864,1.242)(1.27846,1.26009) + (1.26319,1.27949)(1.24272,1.30021)(1.21697,1.32225)(1.18585,1.3456) + (1.14931,1.37026)(1.10728,1.39622)(1.05973,1.42347) + (1.00664,1.45198)(0.948007,1.48173)(0.883841,1.51269)(0.81417,1.54484) +%% +\path(1.14927,1.16539)(1.18593,1.16521)(1.21938,1.16596) + (1.24942,1.16766)(1.27589,1.17035)(1.2986,1.17407)(1.31737,1.17886) + (1.33202,1.18475)(1.34238,1.19178)(1.34825,1.19998) + (1.34948,1.20938)(1.3459,1.22002)(1.33734,1.23191)(1.32364,1.2451) + (1.30466,1.25959)(1.28026,1.27541)(1.2503,1.29259)(1.21467,1.31112) + (1.17326,1.33103)(1.12598,1.35233)(1.07274,1.375)(1.01349,1.39906) + (0.948177,1.4245)(0.876769,1.45131)(0.799255,1.47948) +%% +\path(1.24904,1.20411)(1.28307,1.20023)(1.31396,1.19712) + (1.3415,1.19483)(1.3655,1.19339)(1.38577,1.19284)(1.4021,1.19323) + (1.41431,1.19461)(1.42218,1.197)(1.42551,1.20046)(1.4241,1.20502) + (1.41776,1.21074)(1.40628,1.21763)(1.38947,1.22576) + (1.36714,1.23514)(1.33911,1.24583)(1.3052,1.25784)(1.26524,1.27122) + (1.21907,1.28599)(1.16656,1.30219)(1.10756,1.31982) + (1.04196,1.33891)(0.969654,1.35948)(0.890556,1.38154)(0.804598,1.4051) +%% +\path(1.3617,1.23817)(1.39385,1.23075)(1.4229,1.22394) + (1.44865,1.21779)(1.47089,1.21232)(1.48943,1.2076)(1.50402,1.20365) + (1.51446,1.20053)(1.52052,1.19829)(1.52196,1.19696) + (1.51856,1.19661)(1.51007,1.19727)(1.49626,1.199)(1.47689,1.20184) + (1.45173,1.20585)(1.42053,1.21107)(1.38308,1.21755) + (1.33914,1.22534)(1.28849,1.23448)(1.23092,1.24502) + (1.16623,1.25701)(1.09423,1.27047)(1.01474,1.28546) + (0.927602,1.30199)(0.83267,1.32012) +%% +\path(1.4872,1.26793)(1.51821,1.2571)(1.5462,1.2467) + (1.57093,1.23677)(1.5922,1.22735)(1.60978,1.21849)(1.62342,1.21022) + (1.63288,1.20259)(1.6379,1.19565)(1.63823,1.18945)(1.6336,1.18404) + (1.62373,1.17947)(1.60833,1.17579)(1.58713,1.17306) + (1.55982,1.17134)(1.52613,1.17068)(1.48574,1.17114) + (1.43836,1.17279)(1.3837,1.17569)(1.32146,1.17988)(1.25135,1.18545) + (1.17308,1.19243)(1.08639,1.20091)(0.99101,1.21092)(0.886683,1.22254) +%% +\path(0.927506,0.495809)(0.899539,0.55566)(0.8777,0.611715) + (0.861604,0.664274)(0.850911,0.713606)(0.845319,0.759952) + (0.844563,0.803527)(0.848407,0.844524)(0.856643,0.883119) + (0.869088,0.919469)(0.885577,0.953717)(0.90597,0.985993) + (0.930139,1.01641)(0.957975,1.04509)(0.989383,1.07211) + (1.02428,1.09758)(1.0626,1.12156)(1.10428,1.14414)(1.14927,1.16539) + (1.19753,1.18536)(1.24904,1.20411)(1.30377,1.2217)(1.3617,1.23817) + (1.42285,1.25356)(1.4872,1.26793) +%% +\path(1.10157,0.602843)(1.06552,0.653288)(1.03581,0.700614) + (1.01206,0.745046)(0.993963,0.786789)(0.981224,0.826026) + (0.97359,0.862922)(0.970837,0.897627)(0.972764,0.930277) + (0.979193,0.960993)(0.989968,0.989888)(1.00495,1.01706) + (1.02402,1.04261)(1.04708,1.06661)(1.07402,1.08915) + (1.10479,1.11029)(1.1393,1.1301)(1.17751,1.14864)(1.21938,1.16596) + (1.26487,1.1821)(1.31396,1.19712)(1.36664,1.21106)(1.4229,1.22394) + (1.48275,1.23581)(1.5462,1.2467) +%% +\path(1.25125,0.713425)(1.20852,0.754966)(1.17219,0.793961) + (1.14193,0.830577)(1.11743,0.864964)(1.09844,0.89726) + (1.08472,0.927588)(1.07607,0.95606)(1.0723,0.982778) + (1.07325,1.00784)(1.07878,1.03132)(1.08876,1.0533)(1.10308,1.07385) + (1.12165,1.09304)(1.14439,1.11092)(1.17123,1.12754) + (1.20212,1.14296)(1.23702,1.15721)(1.27589,1.17035) + (1.31872,1.18239)(1.3655,1.19339)(1.41622,1.20335)(1.47089,1.21232) + (1.52955,1.22032)(1.5922,1.22735) +%% +\path(1.37643,0.826777)(1.32827,0.85999)(1.28645,0.891132) + (1.25067,0.920321)(1.22068,0.947667)(1.19624,0.973268) + (1.17715,0.997213)(1.16324,1.01959)(1.15433,1.04046) + (1.15028,1.0599)(1.15098,1.07797)(1.15631,1.09472)(1.16618,1.11021) + (1.18051,1.12448)(1.19925,1.13757)(1.22233,1.14953) + (1.24973,1.16037)(1.28142,1.17014)(1.31737,1.17886)(1.3576,1.18655) + (1.4021,1.19323)(1.4509,1.19893)(1.50402,1.20365)(1.56151,1.20741)(1.62342,1.21022) +%% +\path(1.47732,0.94212)(1.42478,0.967642)(1.37842,0.991473) + (1.338,1.01369)(1.3033,1.03438)(1.27412,1.05361)(1.25029,1.07143) + (1.23165,1.08791)(1.21807,1.10309)(1.20944,1.11702) + (1.20565,1.12975)(1.20662,1.1413)(1.21227,1.15172)(1.22256,1.16103) + (1.23743,1.16926)(1.25686,1.17643)(1.28083,1.18256) + (1.30933,1.18768)(1.34238,1.19178)(1.37998,1.19488)(1.42218,1.197) + (1.469,1.19814)(1.52052,1.19829)(1.57679,1.19746)(1.6379,1.19565) +%% +\path(1.55438,1.0587)(1.49833,1.07721)(1.44824,1.09432) + (1.4039,1.11009)(1.36514,1.12456)(1.3318,1.13779)(1.30374,1.14982) + (1.28083,1.16067)(1.26297,1.17038)(1.25007,1.17898)(1.24206,1.1865) + (1.23887,1.19294)(1.24046,1.19834)(1.2468,1.20271)(1.25787,1.20606) + (1.27366,1.20839)(1.29418,1.20972)(1.31944,1.21005) + (1.34948,1.20938)(1.38435,1.20771)(1.4241,1.20502)(1.46881,1.20133) + (1.51856,1.19661)(1.57345,1.19085)(1.6336,1.18404) +%% +\path(1.60833,1.17579)(1.54946,1.18798)(1.49626,1.199) + (1.44858,1.20887)(1.40628,1.21763)(1.36924,1.22531) + (1.33734,1.23191)(1.3105,1.23747)(1.28864,1.242)(1.2717,1.24551) + (1.25963,1.24801)(1.25241,1.2495)(1.25,1.25)(1.25241,1.2495) + (1.25963,1.24801)(1.2717,1.24551)(1.28864,1.242)(1.3105,1.23747) + (1.33734,1.23191)(1.36924,1.22531)(1.40628,1.21763) + (1.44858,1.20887)(1.49626,1.199)(1.54946,1.18798)(1.60833,1.17579) +%% +\path(1.64008,1.2927)(1.5789,1.29929)(1.52307,1.30486) + (1.47248,1.30943)(1.42702,1.313)(1.3866,1.31559)(1.35115,1.31721) + (1.3206,1.31786)(1.29492,1.31754)(1.27406,1.31626)(1.258,1.314) + (1.24675,1.31076)(1.2403,1.30654)(1.23868,1.30132)(1.24192,1.29508) + (1.25007,1.28781)(1.26319,1.27949)(1.28135,1.27009) + (1.30466,1.25959)(1.33321,1.24795)(1.36714,1.23514) + (1.40659,1.22112)(1.45173,1.20585)(1.50274,1.18927)(1.55982,1.17134) +%% +\path(1.65074,1.40881)(1.5876,1.4105)(1.52946,1.41127) + (1.47624,1.41113)(1.42787,1.41007)(1.38428,1.40809) + (1.34544,1.40519)(1.3113,1.40136)(1.28185,1.39658)(1.25709,1.39085) + (1.23701,1.38415)(1.22163,1.37646)(1.211,1.36775)(1.20515,1.35801) + (1.20414,1.3472)(1.20805,1.33529)(1.21697,1.32225)(1.23101,1.30803) + (1.2503,1.29259)(1.27497,1.27588)(1.3052,1.25784)(1.34116,1.23842) + (1.38308,1.21755)(1.43118,1.19515)(1.48574,1.17114) +%% +\path(1.64154,1.52354)(1.57665,1.52102)(1.51639,1.51763) + (1.4607,1.51338)(1.40954,1.50826)(1.36288,1.50224)(1.32069,1.49531) + (1.28297,1.48746)(1.24972,1.47865)(1.22095,1.46887)(1.1967,1.45809) + (1.177,1.44627)(1.16191,1.43338)(1.15151,1.41938)(1.14587,1.40423) + (1.14509,1.38787)(1.14931,1.37026)(1.15864,1.35134) + (1.17326,1.33103)(1.19333,1.30928)(1.21907,1.28599)(1.2507,1.26109) + (1.28849,1.23448)(1.33271,1.20605)(1.3837,1.17569) +%% +\path(1.61383,1.63639)(1.54727,1.6303)(1.48496,1.62339) + (1.42684,1.61563)(1.37292,1.607)(1.32316,1.59747)(1.27758,1.58703) + (1.23617,1.57563)(1.19897,1.56326)(1.16601,1.54986)(1.13734,1.5354) + (1.11301,1.51983)(1.0931,1.50311)(1.0777,1.48517)(1.06692,1.46596) + (1.06088,1.44542)(1.05973,1.42347)(1.06362,1.40002)(1.07274,1.375) + (1.08731,1.3483)(1.10756,1.31982)(1.13377,1.28943)(1.16623,1.25701) + (1.20529,1.2224)(1.25135,1.18545) +%% +\path(1.56902,1.7469)(1.50078,1.73787)(1.43637,1.72802) + (1.37578,1.71732)(1.31901,1.70574)(1.26605,1.69325)(1.21692,1.6798) + (1.17165,1.66536)(1.13027,1.64988)(1.09284,1.63332)(1.0594,1.61562) + (1.03003,1.59672)(1.00483,1.57655)(0.983899,1.55505) + (0.967353,1.53214)(0.955336,1.50773)(0.948007,1.48173) + (0.945551,1.45402)(0.948177,1.4245)(0.956122,1.39304) + (0.969654,1.35948)(0.989078,1.32368)(1.01474,1.28546) + (1.04703,1.24461)(1.08639,1.20091) +%% +\path(1.50857,1.85469)(1.43853,1.8433)(1.37192,1.83108) + (1.30872,1.81799)(1.24895,1.80399)(1.1926,1.78904)(1.13972,1.7731) + (1.09032,1.75611)(1.04445,1.73802)(1.00217,1.71876) + (0.963551,1.69828)(0.928663,1.67649)(0.897604,1.65331) + (0.870487,1.62866)(0.84744,1.60244)(0.828611,1.57454) + (0.81417,1.54484)(0.80431,1.5132)(0.799255,1.47948) + (0.799255,1.44351)(0.804598,1.4051)(0.815612,1.36405) + (0.83267,1.32012)(0.856198,1.27305)(0.886683,1.22254) +%% +\path(1.25,1.25)(0.600163,1.38459) +%% +\path(0.68242,1.38345)(0.708786,1.37799) +\path(0.655001,1.38383)(0.707734,1.37291) +\path(0.627582,1.38421)(0.706681,1.36782) +\path(0.600163,1.38459)(0.705629,1.36274) +\path(0.625477,1.37404)(0.704577,1.35766) +\path(0.650792,1.3635)(0.703524,1.35258) +\path(0.676106,1.35296)(0.702472,1.3475) +\path(0.705629,1.36274)(0.709838,1.38307)(0.600163,1.38459) + (0.70142,1.34242)(0.705629,1.36274) +%% +\path(1.25,1.25)(0.90831,0.837544) +%% +\path(0.929086,0.887024)(0.940008,0.900207) +\path(0.922161,0.870531)(0.944004,0.896897) +\path(0.915235,0.854037)(0.947999,0.893587) +\path(0.90831,0.837544)(0.951995,0.890277) +\path(0.923227,0.847417)(0.955991,0.886966) +\path(0.938144,0.85729)(0.959987,0.883656) +\path(0.953061,0.867163)(0.963983,0.880346) +\path(0.951995,0.890277)(0.936012,0.903518)(0.90831,0.837544) + (0.967979,0.877035)(0.951995,0.890277) +%% +\allinethickness{1pt}% +\color{rgb_980000}% +\path(2.375,0.125) + (2.375,2.375)(0.125,2.375)(0.125,0.125)(2.375,0.125) +%% +\allinethickness{0.4pt}% +\color{rgb_000000}% +\path(4.32177,5.61398) + (4.31023,5.69921)(4.29571,5.77929)(4.27832,5.85466) + (4.25813,5.92574)(4.23521,5.99286)(4.20959,6.05635)(4.1813,6.11649) + (4.15036,6.17352)(4.11676,6.22769)(4.0805,6.27919)(4.04155,6.32822) + (3.99986,6.37493)(3.9554,6.41949)(3.90809,6.46204)(3.85786,6.50269) + (3.80463,6.54158)(3.7483,6.5788)(3.68874,6.61445)(3.62584,6.64863) + (3.55945,6.68142)(3.48941,6.71289)(3.41554,6.74311) + (3.33764,6.77214)(3.25551,6.80006) +%% +\path(4.13841,5.61911)(4.13845,5.69921)(4.13499,5.7746) + (4.12815,5.84568)(4.11806,5.91278)(4.10479,5.97624) + (4.08842,6.03631)(4.06899,6.09326)(4.04655,6.14732) + (4.02109,6.19867)(3.99263,6.24751)(3.96116,6.29401) + (3.92663,6.33832)(3.88902,6.38056)(3.84826,6.42088) + (3.80428,6.45939)(3.75699,6.49618)(3.70631,6.53136) + (3.65209,6.56502)(3.59422,6.59722)(3.53254,6.62806) + (3.46687,6.65758)(3.39703,6.68587)(3.32279,6.71296)(3.24391,6.73891) +%% +\path(3.97074,5.63438)(3.98145,5.70897)(3.98827,5.77929) + (3.99133,5.84568)(3.99078,5.90844)(3.98672,5.96784) + (3.97923,6.02413)(3.96839,6.07752)(3.95423,6.12822) + (3.93678,6.17639)(3.91605,6.22222)(3.89204,6.26583) + (3.86473,6.30736)(3.83407,6.34695)(3.80002,6.38469)(3.7625,6.42068) + (3.72142,6.45502)(3.67668,6.4878)(3.62816,6.51909)(3.57571,6.54895) + (3.51917,6.57745)(3.45835,6.60465)(3.39303,6.63059) + (3.32299,6.65533)(3.24794,6.6789) +%% +\path(3.82031,5.65946)(3.84076,5.72828)(3.85704,5.79325) + (3.8693,5.85466)(3.87769,5.91278)(3.88234,5.96784)(3.88333,6.02004) + (3.88074,6.06957)(3.87462,6.1166)(3.86501,6.16129)(3.85192,6.20378) + (3.83536,6.24419)(3.81529,6.28265)(3.79169,6.31924) + (3.76451,6.35408)(3.73366,6.38723)(3.69906,6.41879) + (3.66061,6.44883)(3.61816,6.47739)(3.57157,6.50455) + (3.52065,6.53035)(3.46521,6.55484)(3.40502,6.57805) + (3.33981,6.60002)(3.26928,6.62077) +%% +\path(3.68828,5.69383)(3.71752,5.75673)(3.74242,5.81619) + (3.76316,5.87245)(3.77989,5.92574)(3.79272,5.97624) + (3.80176,6.02413)(3.80708,6.06957)(3.80875,6.1127)(3.80678,6.15367) + (3.80122,6.19257)(3.79205,6.22953)(3.77926,6.26463) + (3.76282,6.29797)(3.74266,6.32962)(3.71872,6.35966) + (3.69089,6.38814)(3.65907,6.41512)(3.62312,6.44066) + (3.58287,6.46478)(3.53814,6.48754)(3.4887,6.50895)(3.43432,6.52905) + (3.37469,6.54785)(3.3095,6.56536) +%% +\path(3.57536,5.73678)(3.61246,5.79374)(3.64519,5.84764) + (3.6737,5.89868)(3.69814,5.94703)(3.71864,5.99286)(3.73529,6.03631) + (3.74816,6.07752)(3.75733,6.1166)(3.76282,6.15367)(3.76466,6.18881) + (3.76284,6.22212)(3.75735,6.25368)(3.74816,6.28355)(3.7352,6.3118) + (3.71839,6.33848)(3.69766,6.36364)(3.67286,6.38731) + (3.64387,6.40955)(3.6105,6.43036)(3.57256,6.44976)(3.52982,6.46778) + (3.48202,6.48442)(3.42884,6.49968)(3.36994,6.51354) +%% +\path(3.48182,5.78746)(3.52593,5.83858)(3.5657,5.88698) + (3.6013,5.93282)(3.63287,5.97624)(3.66052,6.01738)(3.68434,6.05635) + (3.70443,6.09326)(3.72082,6.12822)(3.73357,6.16129) + (3.74268,6.19257)(3.74817,6.22212)(3.75,6.25)(3.74815,6.27626) + (3.74256,6.30096)(3.73315,6.32411)(3.71983,6.34577) + (3.70247,6.36595)(3.68092,6.38466)(3.65502,6.40193) + (3.62455,6.41774)(3.58928,6.43209)(3.54893,6.44498) + (3.50317,6.45637)(3.45165,6.46623) +%% +\path(3.40754,5.84494)(3.45785,5.89041)(3.50396,5.93346) + (3.54601,5.97421)(3.58414,6.0128)(3.61846,6.04931)(3.64906,6.08384) + (3.67601,6.11649)(3.69937,6.14732)(3.71917,6.17639) + (3.73544,6.20378)(3.74817,6.22953)(3.75735,6.25368) + (3.76295,6.27626)(3.76491,6.29732)(3.76315,6.31686)(3.75758,6.3349) + (3.74809,6.35145)(3.73451,6.36651)(3.71669,6.38006)(3.69441,6.3921) + (3.66744,6.40258)(3.63549,6.41148)(3.59823,6.41875)(3.55529,6.42432) +%% +\path(3.352,5.90822)(3.40781,5.9483)(3.45961,5.98623) + (3.50754,6.0221)(3.55172,6.05601)(3.59226,6.08804)(3.62924,6.11826) + (3.66274,6.14674)(3.69281,6.17352)(3.71948,6.19867) + (3.74278,6.22222)(3.76271,6.24419)(3.77926,6.26463)(3.7924,6.28355) + (3.80208,6.30096)(3.80823,6.31686)(3.81077,6.33125) + (3.80957,6.34412)(3.8045,6.35546)(3.79539,6.36522)(3.78206,6.37338) + (3.76426,6.37987)(3.74171,6.38464)(3.7141,6.3876)(3.68106,6.38866) +%% +\path(3.31441,5.97626)(3.37509,6.01129)(3.432,6.04439) + (3.48528,6.07564)(3.53504,6.10512)(3.58139,6.13288)(3.6244,6.15897) + (3.66415,6.18345)(3.70069,6.20635)(3.73405,6.22769) + (3.76427,6.24751)(3.79135,6.26583)(3.81529,6.28265) + (3.83606,6.29797)(3.85363,6.3118)(3.86794,6.32411)(3.8789,6.3349) + (3.88643,6.34412)(3.89039,6.35175)(3.89064,6.35772) + (3.88701,6.36198)(3.87927,6.36444)(3.86717,6.36501) + (3.85042,6.36359)(3.82865,6.36003) +%% +\path(3.29368,6.04807)(3.35869,6.07842)(3.42021,6.10703) + (3.47839,6.13398)(3.53332,6.1593)(3.5851,6.18306)(3.63381,6.20527) + (3.67954,6.22597)(3.72232,6.24518)(3.7622,6.26292)(3.79922,6.27919) + (3.8334,6.29401)(3.86473,6.30736)(3.89321,6.31924)(3.91881,6.32962) + (3.94149,6.33848)(3.9612,6.34577)(3.97785,6.35145)(3.99135,6.35546) + (4.00158,6.35772)(4.00838,6.35815)(4.01158,6.35663) + (4.01096,6.35306)(4.00627,6.34727)(3.99719,6.33908) +%% +\path(3.28857,6.12268)(3.35743,6.14874)(3.42314,6.17324) + (3.4858,6.19622)(3.54552,6.21772)(3.60241,6.23776)(3.65653,6.25637) + (3.70797,6.27356)(3.75678,6.28934)(3.80302,6.30372) + (3.84672,6.31668)(3.88792,6.32822)(3.92663,6.33832) + (3.96287,6.34695)(3.99662,6.35408)(4.02787,6.35966) + (4.05658,6.36364)(4.08272,6.36595)(4.10621,6.36651) + (4.12697,6.36522)(4.14491,6.36198)(4.15988,6.35663) + (4.17173,6.34904)(4.18026,6.33901)(4.18525,6.32631) +%% +\path(3.29768,6.19917)(3.37001,6.22136)(3.43952,6.24213) + (3.50631,6.26151)(3.57051,6.27953)(3.63219,6.29619) + (3.69145,6.31151)(3.74836,6.32549)(3.80299,6.33812)(3.85541,6.3494) + (3.90567,6.35932)(3.95381,6.36784)(3.99986,6.37493) + (4.04387,6.38056)(4.08585,6.38469)(4.1258,6.38723)(4.16374,6.38814) + (4.19966,6.38731)(4.23353,6.38466)(4.26532,6.38006) + (4.29499,6.37338)(4.32247,6.36444)(4.34769,6.35306) + (4.37053,6.33901)(4.39086,6.32202) +%% +\path(4.32177,5.61398)(4.22824,5.61526)(4.13841,5.61911) + (4.0525,5.62549)(3.97074,5.63438)(3.89329,5.64572)(3.82031,5.65946) + (3.75194,5.67553)(3.68828,5.69383)(3.6294,5.71428)(3.57536,5.73678) + (3.52617,5.76121)(3.48182,5.78746)(3.4423,5.81541)(3.40754,5.84494) + (3.37747,5.87592)(3.352,5.90822)(3.33103,5.94171)(3.31441,5.97626) + (3.30201,6.01176)(3.29368,6.04807)(3.28926,6.08509) + (3.28857,6.12268)(3.29144,6.16074)(3.29768,6.19917) +%% +\path(4.29571,5.77929)(4.2137,5.77577)(4.13499,5.7746) + (4.05978,5.77577)(3.98827,5.77929)(3.92064,5.78512) + (3.85704,5.79325)(3.79759,5.80362)(3.74242,5.81619)(3.6916,5.83089) + (3.64519,5.84764)(3.60322,5.86637)(3.5657,5.88698)(3.53263,5.90938) + (3.50396,5.93346)(3.47965,5.95911)(3.45961,5.98623) + (3.44377,6.01469)(3.432,6.04439)(3.42419,6.07521)(3.42021,6.10703) + (3.41991,6.13974)(3.42314,6.17324)(3.42973,6.2074)(3.43952,6.24213) +%% +\path(4.25813,5.92574)(4.18659,5.9182)(4.11806,5.91278) + (4.05273,5.90952)(3.99078,5.90844)(3.93239,5.90952) + (3.87769,5.91278)(3.82683,5.9182)(3.77989,5.92574)(3.73697,5.93537) + (3.69814,5.94703)(3.66343,5.96068)(3.63287,5.97624) + (3.60644,5.99364)(3.58414,6.0128)(3.56592,6.03362)(3.55172,6.05601) + (3.54146,6.07988)(3.53504,6.10512)(3.53237,6.13163)(3.53332,6.1593) + (3.53775,6.18804)(3.54552,6.21772)(3.55649,6.24825)(3.57051,6.27953) +%% +\path(4.20959,6.05635)(4.1476,6.04537)(4.08842,6.03631) + (4.03224,6.02922)(3.97923,6.02413)(3.92955,6.02106) + (3.88333,6.02004)(3.8407,6.02106)(3.80176,6.02413)(3.7666,6.02922) + (3.73529,6.03631)(3.70786,6.04537)(3.68434,6.05635)(3.66475,6.0692) + (3.64906,6.08384)(3.63724,6.10022)(3.62924,6.11826) + (3.62499,6.13787)(3.6244,6.15897)(3.62738,6.18147)(3.63381,6.20527) + (3.64358,6.23027)(3.65653,6.25637)(3.67254,6.28349)(3.69145,6.31151) +%% +\path(4.15036,6.17352)(4.0971,6.15956)(4.04655,6.14732) + (3.99887,6.13685)(3.95423,6.12822)(3.91277,6.12146)(3.87462,6.1166) + (3.83992,6.11368)(3.80875,6.1127)(3.7812,6.11368)(3.75733,6.1166) + (3.7372,6.12146)(3.72082,6.12822)(3.70822,6.13685)(3.69937,6.14732) + (3.69425,6.15956)(3.69281,6.17352)(3.69498,6.18914) + (3.70069,6.20635)(3.70984,6.22505)(3.72232,6.24518) + (3.73801,6.26664)(3.75678,6.28934)(3.77849,6.3132)(3.80299,6.33812) +%% +\path(4.0805,6.27919)(4.03524,6.26259)(3.99263,6.24751) + (3.95285,6.23403)(3.91605,6.22222)(3.88236,6.21212) + (3.85192,6.20378)(3.82484,6.19726)(3.80122,6.19257) + (3.78114,6.18975)(3.76466,6.18881)(3.75183,6.18975) + (3.74268,6.19257)(3.73722,6.19726)(3.73544,6.20378) + (3.73731,6.21212)(3.74278,6.22222)(3.7518,6.23403)(3.76427,6.24751) + (3.78012,6.26259)(3.79922,6.27919)(3.82147,6.29725) + (3.84672,6.31668)(3.87484,6.3374)(3.90567,6.35932) +%% +\path(3.99986,6.37493)(3.96191,6.35595)(3.92663,6.33832) + (3.89419,6.32209)(3.86473,6.30736)(3.83839,6.29419) + (3.81529,6.28265)(3.79555,6.27278)(3.77926,6.26463) + (3.76651,6.25825)(3.75735,6.25368)(3.75184,6.25092)(3.75,6.25) + (3.75184,6.25092)(3.75735,6.25368)(3.76651,6.25825) + (3.77926,6.26463)(3.79555,6.27278)(3.81529,6.28265) + (3.83839,6.29419)(3.86473,6.30736)(3.89419,6.32209) + (3.92663,6.33832)(3.96191,6.35595)(3.99986,6.37493) +%% +\path(3.90809,6.46204)(3.8768,6.44088)(3.84826,6.42088) + (3.82261,6.40212)(3.80002,6.38469)(3.78061,6.36864) + (3.76451,6.35408)(3.75182,6.34105)(3.74266,6.32962)(3.7371,6.31986) + (3.7352,6.3118)(3.73701,6.30549)(3.74256,6.30096)(3.75186,6.29823) + (3.76491,6.29732)(3.78166,6.29823)(3.80208,6.30096)(3.8261,6.30549) + (3.85363,6.3118)(3.88457,6.31986)(3.91881,6.32962)(3.9562,6.34105) + (3.99662,6.35408)(4.03989,6.36864)(4.08585,6.38469) +%% +\path(3.80463,6.54158)(3.77938,6.5184)(3.75699,6.49618) + (3.73762,6.47503)(3.72142,6.45502)(3.70853,6.43625) + (3.69906,6.41879)(3.69315,6.40273)(3.69089,6.38814) + (3.69237,6.37509)(3.69766,6.36364)(3.7068,6.35385)(3.71983,6.34577) + (3.73676,6.33944)(3.75758,6.3349)(3.78227,6.33216)(3.81077,6.33125) + (3.84301,6.33216)(3.8789,6.3349)(3.91834,6.33944)(3.9612,6.34577) + (4.00733,6.35385)(4.05658,6.36364)(4.10878,6.37509)(4.16374,6.38814) +%% +\path(3.68874,6.61445)(3.66891,6.58934)(3.65209,6.56502) + (3.63846,6.54157)(3.62816,6.51909)(3.62135,6.49766) + (3.61816,6.47739)(3.61871,6.45836)(3.62312,6.44066) + (3.63148,6.42436)(3.64387,6.40955)(3.66033,6.39629) + (3.68092,6.38466)(3.70565,6.37472)(3.73451,6.36651) + (3.76748,6.36008)(3.8045,6.35546)(3.8455,6.35268)(3.89039,6.35175) + (3.93905,6.35268)(3.99135,6.35546)(4.04713,6.36008) + (4.10621,6.36651)(4.16841,6.37472)(4.23353,6.38466) +%% +\path(3.55945,6.68142)(3.54439,6.65444)(3.53254,6.62806) + (3.52408,6.60236)(3.51917,6.57745)(3.51798,6.55341) + (3.52065,6.53035)(3.52733,6.50836)(3.53814,6.48754) + (3.55319,6.46798)(3.57256,6.44976)(3.59633,6.43299) + (3.62455,6.41774)(3.65725,6.40408)(3.69441,6.3921)(3.73603,6.38184) + (3.78206,6.37338)(3.83242,6.36674)(3.88701,6.36198) + (3.94571,6.35911)(4.00838,6.35815)(4.07484,6.35911) + (4.14491,6.36198)(4.21837,6.36674)(4.29499,6.37338) +%% +\path(3.41554,6.74311)(3.40457,6.71429)(3.39703,6.68587) + (3.39312,6.65793)(3.39303,6.63059)(3.39694,6.60393) + (3.40502,6.57805)(3.41743,6.55306)(3.43432,6.52905) + (3.45581,6.50614)(3.48202,6.48442)(3.51304,6.464)(3.54893,6.44498) + (3.58974,6.42744)(3.63549,6.41148)(3.68616,6.39719) + (3.74171,6.38464)(3.80208,6.37389)(3.86717,6.36501) + (3.93685,6.35806)(4.01096,6.35306)(4.08932,6.35005) + (4.17173,6.34904)(4.25793,6.35005)(4.34769,6.35306) +%% +\path(3.25551,6.80006)(3.24787,6.76939)(3.24391,6.73891) + (3.24387,6.70872)(3.24794,6.6789)(3.25635,6.64955)(3.26928,6.62077) + (3.28694,6.59267)(3.3095,6.56536)(3.33712,6.53894)(3.36994,6.51354) + (3.40808,6.48927)(3.45165,6.46623)(3.5007,6.44454)(3.55529,6.42432) + (3.61541,6.40566)(3.68106,6.38866)(3.75217,6.37343) + (3.82865,6.36003)(3.91038,6.34856)(3.99719,6.33908) + (4.08889,6.33165)(4.18525,6.32631)(4.286,6.32309)(4.39086,6.32202) +%% +\path(3.75,6.25)(3.14565,5.94783) +%% +\path(3.19923,5.99202)(3.21941,6.00211) +\path(3.18137,5.97729)(3.22173,5.99747) +\path(3.16351,5.96256)(3.22405,5.99283) +\path(3.14565,5.94783)(3.22637,5.98819) +\path(3.16815,5.95328)(3.22869,5.98355) +\path(3.19065,5.95872)(3.23101,5.9789) +\path(3.21315,5.96417)(3.23333,5.97426) +\path(3.22637,5.98819)(3.21709,6.00675)(3.14565,5.94783) + (3.23565,5.96962)(3.22637,5.98819) +%% +\path(3.75,6.25)(4.35435,5.94783) +%% +\path(4.28685,5.96417)(4.26667,5.97426) +\path(4.30935,5.95872)(4.26899,5.9789) +\path(4.33185,5.95328)(4.27131,5.98355) +\path(4.35435,5.94783)(4.27363,5.98819) +\path(4.33649,5.96256)(4.27595,5.99283) +\path(4.31863,5.97729)(4.27827,5.99747) +\path(4.30077,5.99202)(4.28059,6.00211) +\path(4.27363,5.98819)(4.26435,5.96962)(4.35435,5.94783) + (4.28291,6.00675)(4.27363,5.98819) +%% +\allinethickness{1pt}% +\color{rgb_980000}% +\path(4.875,5.125) + (4.875,7.375)(2.625,7.375)(2.625,5.125)(4.875,5.125) +%% +\allinethickness{0.4pt}% +\color{rgb_000000}% +\path(3.75,2.95191) + (3.81752,3.02689)(3.87769,3.10015)(3.93077,3.17175) + (3.97698,3.24175)(4.01655,3.3102)(4.04971,3.37715)(4.07667,3.44266) + (4.09761,3.50676)(4.11274,3.5695)(4.12223,3.63093)(4.12626,3.69108) + (4.125,3.75)(4.11861,3.80772)(4.10725,3.86428)(4.09106,3.91971) + (4.07018,3.97405)(4.04476,4.02733)(4.01493,4.07958) + (3.98081,4.13082)(3.94252,4.1811)(3.90018,4.23043)(3.85391,4.27884) + (3.80382,4.32635)(3.75,4.373) +%% +\path(3.62348,3.04636)(3.69014,3.11055)(3.75,3.17364) + (3.80325,3.23566)(3.85004,3.29665)(3.89055,3.35662)(3.92492,3.4156) + (3.9533,3.47361)(3.97585,3.53068)(3.9927,3.58684)(4.00399,3.64209) + (4.00986,3.69647)(4.01042,3.75)(4.0058,3.80269)(3.99613,3.85457) + (3.98152,3.90564)(3.96208,3.95594)(3.93793,4.00548) + (3.90916,4.05428)(3.87589,4.10235)(3.8382,4.1497)(3.79621,4.19636) + (3.75,4.24234)(3.69967,4.28766)(3.64529,4.33232) +%% +\path(3.52707,3.13497)(3.59209,3.1895)(3.65084,3.24339) + (3.70344,3.29667)(3.75,3.34934)(3.79061,3.40141)(3.82538,3.45289) + (3.85441,3.5038)(3.87779,3.55414)(3.89561,3.60392)(3.90797,3.65315) + (3.91496,3.70184)(3.91667,3.75)(3.91317,3.79764)(3.90456,3.84476) + (3.89092,3.89138)(3.87233,3.93749)(3.84887,3.98312) + (3.82061,4.02827)(3.78763,4.07294)(3.75,4.11715)(3.7078,4.16089) + (3.6611,4.20419)(3.60997,4.24703)(3.55447,4.28944) +%% +\path(3.45806,3.21828)(3.52096,3.26413)(3.57809,3.30969) + (3.6295,3.35496)(3.67526,3.39995)(3.71541,3.44466)(3.75,3.4891) + (3.77909,3.53325)(3.80273,3.57714)(3.82096,3.62075)(3.83384,3.6641) + (3.84142,3.70718)(3.84375,3.75)(3.84087,3.79256)(3.83283,3.83486) + (3.81967,3.8769)(3.80146,3.91869)(3.77822,3.96024)(3.75,4.00153) + (3.71685,4.04257)(3.67882,4.08337)(3.63594,4.12393) + (3.58827,4.16425)(3.53583,4.20433)(3.47868,4.24417) +%% +\path(3.41407,3.29673)(3.47461,3.33478)(3.52983,3.37277) + (3.57974,3.41071)(3.62435,3.44861)(3.66367,3.48645) + (3.69771,3.52425)(3.72649,3.56199)(3.75,3.59969)(3.76826,3.63734) + (3.78129,3.67494)(3.78909,3.7125)(3.79167,3.75)(3.78904,3.78746) + (3.78121,3.82486)(3.76819,3.86222)(3.75,3.89953)(3.72664,3.9368) + (3.69812,3.97401)(3.66445,4.01118)(3.62564,4.0483)(3.58171,4.08537) + (3.53265,4.1224)(3.47849,4.15938)(3.41923,4.19631) +%% +\path(3.39296,3.37075)(3.4511,3.40176)(3.50433,3.43287) + (3.55261,3.46409)(3.59592,3.49541)(3.63424,3.52685) + (3.66754,3.55839)(3.69579,3.59005)(3.71897,3.62182) + (3.73705,3.65369)(3.75,3.68568)(3.7578,3.71779)(3.76042,3.75) + (3.75783,3.78233)(3.75,3.81477)(3.73691,3.84733)(3.71853,3.88) + (3.69483,3.91279)(3.66578,3.9457)(3.63135,3.97872)(3.59152,4.01186) + (3.54625,4.04512)(3.49552,4.0785)(3.43929,4.112)(3.37755,4.14562) +%% +\path(3.39286,3.44071)(3.44871,3.46535)(3.5,3.49019) + (3.54669,3.51523)(3.58871,3.54048)(3.62601,3.56593) + (3.65854,3.59158)(3.68622,3.61745)(3.70902,3.64352) + (3.72685,3.66981)(3.73967,3.69632)(3.74741,3.72305)(3.75,3.75) + (3.74738,3.77718)(3.7395,3.80458)(3.72627,3.83222)(3.70763,3.86009) + (3.68351,3.8882)(3.65385,3.91654)(3.61856,3.94513)(3.57759,3.97397) + (3.53084,4.00306)(3.47826,4.0324)(3.41976,4.062)(3.35526,4.09185) +%% +\path(3.41207,3.50691)(3.46585,3.5258)(3.51542,3.54493) + (3.56068,3.56429)(3.60155,3.58389)(3.63797,3.60374) + (3.66983,3.62385)(3.69705,3.6442)(3.71955,3.66482)(3.73723,3.6857) + (3.75,3.70686)(3.75776,3.72829)(3.76042,3.75)(3.75786,3.772) + (3.75,3.79429)(3.73672,3.81688)(3.71791,3.83978)(3.69345,3.86299) + (3.66325,3.88651)(3.62716,3.91036)(3.58508,3.93454) + (3.53687,3.95906)(3.48241,3.98392)(3.42157,4.00914)(3.3542,4.03471) +%% +\path(3.44909,3.56967)(3.50114,3.58335)(3.54927,3.59725) + (3.59338,3.61138)(3.63338,3.62575)(3.66914,3.64036) + (3.70058,3.65523)(3.72757,3.67034)(3.75,3.68572)(3.76775,3.70137) + (3.7807,3.71729)(3.78871,3.7335)(3.79167,3.75)(3.78942,3.7668) + (3.78182,3.7839)(3.76873,3.80132)(3.75,3.81907)(3.72546,3.83715) + (3.69495,3.85557)(3.6583,3.87434)(3.61533,3.89348)(3.56585,3.91299) + (3.50967,3.93289)(3.4466,3.95318)(3.37642,3.97388) +%% +\path(3.50255,3.62924)(3.55328,3.63818)(3.60037,3.64731) + (3.6437,3.65662)(3.68317,3.66613)(3.71864,3.67584)(3.75,3.68576) + (3.7771,3.69589)(3.79982,3.70624)(3.81799,3.71682)(3.83148,3.72763) + (3.84012,3.73869)(3.84375,3.75)(3.8422,3.76157)(3.83527,3.77341) + (3.8228,3.78553)(3.80457,3.79794)(3.78037,3.81064)(3.75,3.82366) + (3.71321,3.837)(3.66978,3.85067)(3.61944,3.8647)(3.56192,3.87908) + (3.49696,3.89383)(3.42425,3.90898) +%% +\path(3.57125,3.68585)(3.62111,3.6905)(3.66761,3.69525) + (3.71062,3.70012)(3.75,3.70511)(3.78562,3.71023)(3.81734,3.71548) + (3.84501,3.72086)(3.86847,3.72638)(3.88754,3.73205) + (3.90206,3.73787)(3.91183,3.74385)(3.91667,3.75)(3.91636,3.75632) + (3.91068,3.76281)(3.89941,3.7695)(3.8823,3.77637)(3.85908,3.78346) + (3.82949,3.79075)(3.79324,3.79827)(3.75,3.80602)(3.69946,3.81401) + (3.64125,3.82226)(3.57502,3.83078)(3.50036,3.83958) +%% +\path(3.65406,3.73974)(3.70358,3.74046)(3.75,3.74121) + (3.79318,3.74198)(3.833,3.74276)(3.86929,3.74358)(3.90191,3.74441) + (3.93068,3.74527)(3.95544,3.74616)(3.976,3.74708)(3.99216,3.74802) + (4.0037,3.74899)(4.01042,3.75)(4.01206,3.75104)(4.00837,3.75211) + (3.99908,3.75322)(3.9839,3.75437)(3.96252,3.75556)(3.9346,3.75679) + (3.89979,3.75807)(3.8577,3.75939)(3.80792,3.76076)(3.75,3.76219) + (3.68346,3.76367)(3.60778,3.76522) +%% +\path(3.75,3.79107)(3.79972,3.78823)(3.84661,3.7853) + (3.89054,3.78228)(3.93135,3.77916)(3.9689,3.77593)(4.00301,3.7726) + (4.03353,3.76915)(4.06025,3.76559)(4.08298,3.7619)(4.10151,3.75807) + (4.1156,3.75411)(4.125,3.75)(4.12945,3.74573)(4.12867,3.7413) + (4.12234,3.7367)(4.11013,3.73191)(4.09167,3.72692)(4.06658,3.72172) + (4.03443,3.71631)(3.99475,3.71065)(3.94705,3.70474) + (3.89077,3.69857)(3.8253,3.6921)(3.75,3.68532) +%% +\path(3.75,2.95191)(3.68279,2.9999)(3.62348,3.04636) + (3.57169,3.09136)(3.52707,3.13497)(3.4893,3.17726)(3.45806,3.21828) + (3.43308,3.25809)(3.41407,3.29673)(3.40078,3.33428) + (3.39296,3.37075)(3.39039,3.40622)(3.39286,3.44071) + (3.40015,3.47426)(3.41207,3.50691)(3.42844,3.5387)(3.44909,3.56967) + (3.47384,3.59984)(3.50255,3.62924)(3.53507,3.6579)(3.57125,3.68585) + (3.61095,3.71312)(3.65406,3.73974)(3.70045,3.76571)(3.75,3.79107) +%% +\path(3.87769,3.10015)(3.81014,3.13738)(3.75,3.17364) + (3.69699,3.20897)(3.65084,3.24339)(3.61129,3.27696) + (3.57809,3.30969)(3.55101,3.34161)(3.52983,3.37277) + (3.51434,3.40318)(3.50433,3.43287)(3.49961,3.46187)(3.5,3.49019) + (3.50533,3.51787)(3.51542,3.54493)(3.53012,3.57138) + (3.54927,3.59725)(3.57273,3.62255)(3.60037,3.64731) + (3.63203,3.67153)(3.66761,3.69525)(3.70697,3.71847)(3.75,3.74121) + (3.79658,3.76348)(3.84661,3.7853) +%% +\path(3.97698,3.24175)(3.91004,3.26948)(3.85004,3.29665) + (3.79676,3.32326)(3.75,3.34934)(3.70956,3.3749)(3.67526,3.39995) + (3.64691,3.42452)(3.62435,3.44861)(3.60741,3.47223) + (3.59592,3.49541)(3.58974,3.51816)(3.58871,3.54048) + (3.59269,3.56239)(3.60155,3.58389)(3.61516,3.60501) + (3.63338,3.62575)(3.65609,3.64612)(3.68317,3.66613) + (3.71451,3.68579)(3.75,3.70511)(3.78953,3.7241)(3.833,3.74276) + (3.8803,3.76111)(3.93135,3.77916) +%% +\path(4.04971,3.37715)(3.98409,3.39652)(3.92492,3.4156) + (3.87206,3.43439)(3.82538,3.45289)(3.78474,3.47113)(3.75,3.4891) + (3.72103,3.5068)(3.69771,3.52425)(3.67992,3.54144)(3.66754,3.55839) + (3.66045,3.57511)(3.65854,3.59158)(3.6617,3.60783)(3.66983,3.62385) + (3.68282,3.63964)(3.70058,3.65523)(3.723,3.6706)(3.75,3.68576) + (3.78148,3.70072)(3.81734,3.71548)(3.85752,3.73004) + (3.90191,3.74441)(3.95043,3.7586)(4.00301,3.7726) +%% +\path(4.09761,3.50676)(4.03372,3.51878)(3.97585,3.53068) + (3.9239,3.54247)(3.87779,3.55414)(3.83742,3.56569)(3.80273,3.57714) + (3.77361,3.58847)(3.75,3.59969)(3.73181,3.61081)(3.71897,3.62182) + (3.7114,3.63272)(3.70902,3.64352)(3.71176,3.65422)(3.71955,3.66482) + (3.73232,3.67532)(3.75,3.68572)(3.77252,3.69603)(3.79982,3.70624) + (3.83182,3.71636)(3.86847,3.72638)(3.90969,3.73632) + (3.95544,3.74616)(4.00565,3.75592)(4.06025,3.76559) +%% +\path(4.12223,3.63093)(4.06031,3.63652)(4.00399,3.64209) + (3.95323,3.64764)(3.90797,3.65315)(3.86819,3.65864)(3.83384,3.6641) + (3.80489,3.66953)(3.78129,3.67494)(3.76301,3.68033)(3.75,3.68568) + (3.74223,3.69101)(3.73967,3.69632)(3.74227,3.7016)(3.75,3.70686) + (3.76282,3.71209)(3.7807,3.71729)(3.8036,3.72248)(3.83148,3.72763) + (3.86431,3.73277)(3.90206,3.73787)(3.94468,3.74296) + (3.99216,3.74802)(4.04444,3.75306)(4.10151,3.75807) +%% +\path(4.125,3.75)(4.0651,3.75)(4.01042,3.75)(3.96094,3.75) + (3.91667,3.75)(3.8776,3.75)(3.84375,3.75)(3.8151,3.75) + (3.79167,3.75)(3.77344,3.75)(3.76042,3.75)(3.7526,3.75)(3.75,3.75) + (3.7526,3.75)(3.76042,3.75)(3.77344,3.75)(3.79167,3.75) + (3.8151,3.75)(3.84375,3.75)(3.8776,3.75)(3.91667,3.75) + (3.96094,3.75)(4.01042,3.75)(4.0651,3.75)(4.125,3.75) +%% +\path(4.10725,3.86428)(4.04926,3.85943)(3.99613,3.85457) + (3.94789,3.84967)(3.90456,3.84476)(3.8662,3.83982)(3.83283,3.83486) + (3.80449,3.82987)(3.78121,3.82486)(3.76304,3.81983)(3.75,3.81477) + (3.74214,3.80969)(3.7395,3.80458)(3.7421,3.79945)(3.75,3.79429) + (3.76323,3.78911)(3.78182,3.7839)(3.80582,3.77867)(3.83527,3.77341) + (3.87021,3.76812)(3.91068,3.76281)(3.95672,3.75748) + (4.00837,3.75211)(4.06567,3.74672)(4.12867,3.7413) +%% +\path(4.07018,3.97405)(4.01387,3.96504)(3.96208,3.95594) + (3.91488,3.94676)(3.87233,3.93749)(3.8345,3.92814)(3.80146,3.91869) + (3.77327,3.90916)(3.75,3.89953)(3.73173,3.88982)(3.71853,3.88) + (3.71047,3.87009)(3.70763,3.86009)(3.71008,3.84998) + (3.71791,3.83978)(3.73119,3.82947)(3.75,3.81907)(3.77443,3.80855) + (3.80457,3.79794)(3.84049,3.78721)(3.8823,3.77637)(3.93007,3.76543) + (3.9839,3.75437)(4.04389,3.7432)(4.11013,3.73191) +%% +\path(4.01493,4.07958)(3.95994,4.06701)(3.90916,4.05428) + (3.86269,4.04136)(3.82061,4.02827)(3.78301,4.01499)(3.75,4.00153) + (3.72167,3.98787)(3.69812,3.97401)(3.67945,3.95996)(3.66578,3.9457) + (3.6572,3.93123)(3.65385,3.91654)(3.65582,3.90164)(3.66325,3.88651) + (3.67625,3.87116)(3.69495,3.85557)(3.71949,3.83974)(3.75,3.82366) + (3.78662,3.80733)(3.82949,3.79075)(3.87877,3.77391)(3.9346,3.75679) + (3.99715,3.7394)(4.06658,3.72172) +%% +\path(3.94252,4.1811)(3.8884,4.16554)(3.8382,4.1497) + (3.79203,4.13357)(3.75,4.11715)(3.71222,4.10042)(3.67882,4.08337) + (3.64992,4.066)(3.62564,4.0483)(3.60613,4.03026)(3.59152,4.01186) + (3.58195,3.9931)(3.57759,3.97397)(3.57857,3.95446)(3.58508,3.93454) + (3.59727,3.91422)(3.61533,3.89348)(3.63943,3.8723)(3.66978,3.85067) + (3.70656,3.82859)(3.75,3.80602)(3.8003,3.78296)(3.8577,3.75939) + (3.92244,3.73529)(3.99475,3.71065) +%% +\path(3.85391,4.27884)(3.80014,4.26079)(3.75,4.24234) + (3.70361,4.22348)(3.6611,4.20419)(3.62261,4.18445)(3.58827,4.16425) + (3.55823,4.14357)(3.53265,4.1224)(3.51169,4.10072)(3.49552,4.0785) + (3.48431,4.05574)(3.47826,4.0324)(3.47756,4.00847)(3.48241,3.98392) + (3.49304,3.95874)(3.50967,3.93289)(3.53255,3.90634) + (3.56192,3.87908)(3.59806,3.85106)(3.64125,3.82226) + (3.69179,3.79265)(3.75,3.76219)(3.81621,3.73084)(3.89077,3.69857) +%% +\path(3.75,4.373)(3.69598,4.35293)(3.64529,4.33232) + (3.59808,4.31117)(3.55447,4.28944)(3.51462,4.26712) + (3.47868,4.24417)(3.44683,4.22058)(3.41923,4.19631) + (3.39607,4.17133)(3.37755,4.14562)(3.36387,4.11914) + (3.35526,4.09185)(3.35196,4.06372)(3.3542,4.03471)(3.36226,4.00478) + (3.37642,3.97388)(3.39698,3.94196)(3.42425,3.90898) + (3.45859,3.87487)(3.50036,3.83958)(3.54995,3.80305) + (3.60778,3.76522)(3.6743,3.726)(3.75,3.68532) +%% +\path(3.75,3.75)(3,3.75) +%% +\path(3.08562,3.76557)(3.11416,3.76557) +\path(3.05708,3.76038)(3.11416,3.76038) +\path(3.02854,3.75519)(3.11416,3.75519) +\path(3,3.75)(3.11416,3.75) +\path(3.02854,3.74481)(3.11416,3.74481) +\path(3.05708,3.73962)(3.11416,3.73962) +\path(3.08562,3.73443)(3.11416,3.73443) +\path(3.11416,3.75)(3.11416,3.77076)(3,3.75)(3.11416,3.72924)(3.11416,3.75) +%% +\path(3.75,3.75)(3.75,3.29644) +%% +\path(3.73443,3.33925)(3.73443,3.35352) +\path(3.73962,3.32498)(3.73962,3.35352) +\path(3.74481,3.31071)(3.74481,3.35352) +\path(3.75,3.29644)(3.75,3.35352) +\path(3.75519,3.31071)(3.75519,3.35352) +\path(3.76038,3.32498)(3.76038,3.35352) +\path(3.76557,3.33925)(3.76557,3.35352) +\path(3.75,3.35352)(3.72924,3.35352)(3.75,3.29644)(3.77076,3.35352)(3.75,3.35352) +%% +\allinethickness{1pt}% +\color{rgb_980000}% +\path(4.875,2.625) + (4.875,4.875)(2.625,4.875)(2.625,2.625)(4.875,2.625) +%% +\allinethickness{0.4pt}% +\color{rgb_000000}% +\path(3.17823,0.61398) + (3.2696,0.641697)(3.35808,0.672175)(3.44338,0.705355) + (3.52526,0.741164)(3.60346,0.779511)(3.67777,0.820294) + (3.748,0.863394)(3.81395,0.908683)(3.87549,0.956019) + (3.93248,1.00525)(3.98483,1.05622)(4.03246,1.10877) + (4.07534,1.16272)(4.11344,1.2179)(4.14676,1.27413)(4.17536,1.33125) + (4.19927,1.38908)(4.21858,1.44744)(4.23339,1.50617) + (4.24381,1.56512)(4.24998,1.62413)(4.25204,1.68304) + (4.25015,1.74173)(4.24449,1.80006) +%% +\path(3.20899,0.72735)(3.28831,0.749673)(3.36501,0.774599) + (3.43887,0.802101)(3.50964,0.832134)(3.57711,0.86464) + (3.64108,0.899549)(3.70136,0.936774)(3.75778,0.976219) + (3.8102,1.01777)(3.85849,1.06132)(3.90256,1.10672)(3.94232,1.15384) + (3.97773,1.20253)(4.00875,1.25265)(4.03538,1.30404) + (4.05764,1.35653)(4.07557,1.40997)(4.08922,1.46419) + (4.09868,1.51905)(4.10405,1.57438)(4.10544,1.63004) + (4.10297,1.68587)(4.0968,1.74173)(4.08706,1.79749) +%% +\path(3.25032,0.823133)(3.31889,0.840786)(3.38504,0.860893) + (3.44855,0.883449)(3.50922,0.908436)(3.56683,0.935822) + (3.62121,0.965564)(3.67218,0.997604)(3.7196,1.03187) + (3.76331,1.06829)(3.8032,1.10676)(3.83917,1.14717)(3.87115,1.18943) + (3.89907,1.23339)(3.92291,1.27893)(3.94265,1.32592) + (3.95829,1.37421)(3.96988,1.42366)(3.97745,1.47411) + (3.98107,1.52542)(3.98083,1.57745)(3.97684,1.63004)(3.9692,1.68304) + (3.95805,1.73632)(3.94353,1.78975) +%% +\path(3.30152,0.904095)(3.36048,0.917621)(3.41712,0.933458) + (3.47125,0.951621)(3.52267,0.972112)(3.5712,0.994925) + (3.61667,1.02004)(3.65892,1.04742)(3.6978,1.07702)(3.73319,1.10879) + (3.76496,1.14265)(3.79303,1.17853)(3.81732,1.21634) + (3.83777,1.25597)(3.85434,1.29732)(3.86702,1.34026) + (3.87582,1.38467)(3.88074,1.43043)(3.88184,1.47739) + (3.87918,1.52542)(3.87283,1.57438)(3.8629,1.62413)(3.84948,1.67451) + (3.83271,1.72541)(3.81271,1.77667) +%% +\path(3.36219,0.972363)(3.41251,0.982168)(3.46056,0.994146) + (3.50614,1.00833)(3.54909,1.02474)(3.58923,1.04339)(3.6264,1.06427) + (3.66046,1.08739)(3.69125,1.1127)(3.71867,1.14019)(3.74261,1.16981) + (3.76296,1.20149)(3.77966,1.23517)(3.79266,1.27077)(3.8019,1.3082) + (3.80739,1.34736)(3.80911,1.38814)(3.80708,1.43043) + (3.80136,1.47411)(3.79199,1.51905)(3.77905,1.56512) + (3.76263,1.61219)(3.74284,1.66012)(3.71979,1.70877)(3.69363,1.75801) +%% +\path(3.43214,1.02959)(3.4747,1.03597)(3.51496,1.04439) + (3.55275,1.0549)(3.58792,1.06753)(3.6203,1.08231)(3.64973,1.09927) + (3.67607,1.1184)(3.6992,1.13971)(3.71899,1.16319)(3.73534,1.18881) + (3.74816,1.21653)(3.75738,1.24631)(3.76294,1.27809)(3.7648,1.3118) + (3.76296,1.34736)(3.7574,1.38467)(3.74815,1.42366)(3.73525,1.46419) + (3.71875,1.50617)(3.69874,1.54948)(3.67529,1.59398) + (3.64852,1.63955)(3.61855,1.68606)(3.58552,1.73338) +%% +\path(3.51138,1.07706)(3.54694,1.08023)(3.58016,1.0853) + (3.61086,1.09235)(3.63888,1.10142)(3.66407,1.11255) + (3.68628,1.12577)(3.70537,1.14113)(3.72121,1.15862) + (3.73369,1.17827)(3.74271,1.20006)(3.74817,1.22398)(3.75,1.25) + (3.74815,1.27809)(3.74259,1.3082)(3.73328,1.34026)(3.72024,1.37421) + (3.70349,1.40997)(3.68306,1.44744)(3.65901,1.48653) + (3.63142,1.52713)(3.60039,1.56912)(3.56602,1.61239) + (3.52843,1.65681)(3.48778,1.70226) +%% +\path(3.60007,1.11578)(3.62936,1.11587)(3.65621,1.11774) + (3.68045,1.12147)(3.70192,1.1271)(3.72047,1.13471)(3.73595,1.14434) + (3.74823,1.15603)(3.75716,1.16982)(3.76264,1.18573) + (3.76456,1.20378)(3.76283,1.22398)(3.75738,1.24631) + (3.74815,1.27077)(3.73509,1.29732)(3.7182,1.32592)(3.69748,1.35653) + (3.67293,1.38908)(3.6446,1.42349)(3.61256,1.4597)(3.57688,1.49759) + (3.53766,1.53708)(3.49501,1.57805)(3.44908,1.62039)(3.40001,1.66397) +%% +\path(3.69855,1.14651)(3.72225,1.14361)(3.74337,1.14236) + (3.76176,1.14283)(3.77726,1.14511)(3.78969,1.14925) + (3.79892,1.15533)(3.8048,1.16341)(3.80719,1.17352)(3.80598,1.18573) + (3.80105,1.20006)(3.7923,1.21653)(3.77966,1.23517)(3.76307,1.25597) + (3.74248,1.27893)(3.71787,1.30404)(3.68923,1.33125) + (3.65659,1.36053)(3.61998,1.39183)(3.57947,1.42509) + (3.53514,1.46021)(3.48708,1.49713)(3.43543,1.53574) + (3.38033,1.57593)(3.32194,1.6176) +%% +\path(3.80729,1.16986)(3.82604,1.16398)(3.84208,1.15962) + (3.85522,1.15685)(3.86529,1.15577)(3.87214,1.15645)(3.8756,1.15897) + (3.87551,1.16341)(3.87174,1.16982)(3.86415,1.17827) + (3.85261,1.18881)(3.83704,1.20149)(3.81732,1.21634)(3.7934,1.23339) + (3.76522,1.25265)(3.73275,1.27413)(3.69598,1.29782) + (3.65492,1.32371)(3.60961,1.35175)(3.56011,1.3819)(3.50651,1.41411) + (3.4489,1.44831)(3.38744,1.48442)(3.32226,1.52235)(3.25354,1.56199) +%% +\path(3.92693,1.18624)(3.94139,1.17736)(3.95296,1.16985) + (3.96145,1.1638)(3.96668,1.1593)(3.96848,1.15645)(3.96666,1.15533) + (3.96105,1.15603)(3.95151,1.15862)(3.93788,1.16319) + (3.92002,1.16981)(3.89781,1.17853)(3.87115,1.18943) + (3.83994,1.20253)(3.80413,1.2179)(3.76366,1.23554)(3.71851,1.25549) + (3.66869,1.27773)(3.61423,1.30227)(3.55518,1.32909) + (3.49162,1.35815)(3.42367,1.38939)(3.35146,1.42277) + (3.27515,1.45821)(3.19494,1.49562) +%% +\path(4.05827,1.19595)(4.06911,1.18399)(4.07686,1.17324) + (4.08133,1.1638)(4.08232,1.15577)(4.07962,1.14925)(4.07305,1.14434) + (4.06242,1.14113)(4.04754,1.13971)(4.02825,1.14019) + (4.00437,1.14265)(3.97577,1.14717)(3.94232,1.15384)(3.9039,1.16272) + (3.86043,1.17387)(3.81183,1.18736)(3.75806,1.20321) + (3.69912,1.22147)(3.63501,1.24216)(3.56578,1.26527)(3.4915,1.29081) + (3.41229,1.31874)(3.32827,1.34904)(3.23963,1.38165)(3.14657,1.4165) +%% +\path(4.20232,1.19917)(4.21023,1.18399)(4.21485,1.16985) + (4.21597,1.15685)(4.21335,1.14511)(4.20679,1.13471) + (4.19606,1.12577)(4.18094,1.1184)(4.16122,1.1127)(4.1367,1.10879) + (4.10719,1.10676)(4.07249,1.10672)(4.03246,1.10877)(3.98694,1.113) + (3.93582,1.11951)(3.87898,1.12838)(3.81635,1.13966)(3.7479,1.15344) + (3.67361,1.16975)(3.59351,1.18864)(3.50765,1.21013) + (3.41613,1.23423)(3.31908,1.26093)(3.21668,1.2902)(3.10914,1.32202) +%% +\path(3.17823,0.61398)(3.19224,0.673067)(3.20899,0.72735) + (3.22838,0.77725)(3.25032,0.823133)(3.27472,0.865321) + (3.30152,0.904095)(3.33069,0.939703)(3.36219,0.972363) + (3.39601,1.00227)(3.43214,1.02959)(3.47059,1.05448) + (3.51138,1.07706)(3.55453,1.09746)(3.60007,1.11578)(3.64806,1.1321) + (3.69855,1.14651)(3.7516,1.15908)(3.80729,1.16986)(3.8657,1.1789) + (3.92693,1.18624)(3.99108,1.19191)(4.05827,1.19595) + (4.12864,1.19837)(4.20232,1.19917) +%% +\path(3.35808,0.672175)(3.35983,0.72558)(3.36501,0.774599) + (3.37347,0.819598)(3.38504,0.860893)(3.39963,0.898765) + (3.41712,0.933458)(3.43745,0.965188)(3.46056,0.994146) + (3.4864,1.0205)(3.51496,1.04439)(3.54621,1.06595)(3.58016,1.0853) + (3.61682,1.10254)(3.65621,1.11774)(3.69838,1.13099) + (3.74337,1.14236)(3.79125,1.15188)(3.84208,1.15962)(3.89595,1.1656) + (3.95296,1.16985)(4.01323,1.17239)(4.07686,1.17324) + (4.14402,1.17239)(4.21485,1.16985) +%% +\path(3.52526,0.741164)(3.51545,0.788632)(3.50964,0.832134) + (3.50762,0.871978)(3.50922,0.908436)(3.51427,0.941744) + (3.52267,0.972112)(3.5343,0.999723)(3.54909,1.02474) + (3.56698,1.0473)(3.58792,1.06753)(3.61189,1.08554)(3.63888,1.10142) + (3.66888,1.11525)(3.70192,1.1271)(3.73803,1.13704)(3.77726,1.14511) + (3.81965,1.15134)(3.86529,1.15577)(3.91427,1.15842)(3.96668,1.1593) + (4.02266,1.15842)(4.08232,1.15577)(4.14583,1.15134)(4.21335,1.14511) +%% +\path(3.67777,0.820294)(3.65721,0.861701)(3.64108,0.899549) + (3.62915,0.934095)(3.62121,0.965564)(3.6171,0.994154) + (3.61667,1.02004)(3.6198,1.04337)(3.6264,1.06427)(3.6364,1.08287) + (3.64973,1.09927)(3.66636,1.11354)(3.68628,1.12577) + (3.70947,1.13602)(3.73595,1.14434)(3.76576,1.15076) + (3.79892,1.15533)(3.83551,1.15806)(3.8756,1.15897)(3.91928,1.15806) + (3.96666,1.15533)(4.01786,1.15076)(4.07305,1.14434) + (4.13239,1.13602)(4.19606,1.12577) +%% +\path(3.81395,0.908683)(3.7835,0.944037)(3.75778,0.976219) + (3.73655,1.00544)(3.7196,1.03187)(3.70673,1.05569)(3.6978,1.07702) + (3.69268,1.09599)(3.69125,1.1127)(3.69345,1.12725)(3.6992,1.13971) + (3.70846,1.15015)(3.72121,1.15862)(3.73744,1.16517) + (3.75716,1.16982)(3.7804,1.1726)(3.80719,1.17352)(3.83761,1.1726) + (3.87174,1.16982)(3.90966,1.16517)(3.95151,1.15862) + (3.99741,1.15015)(4.04754,1.13971)(4.10207,1.12725)(4.16122,1.1127) +%% +\path(3.93248,1.00525)(3.89302,1.03469)(3.85849,1.06132) + (3.82862,1.08529)(3.8032,1.10676)(3.78203,1.12584)(3.76496,1.14265) + (3.75186,1.15728)(3.74261,1.16981)(3.73712,1.1803)(3.73534,1.18881) + (3.73721,1.19538)(3.74271,1.20006)(3.75182,1.20285) + (3.76456,1.20378)(3.78095,1.20285)(3.80105,1.20006) + (3.82491,1.19538)(3.85261,1.18881)(3.88428,1.1803)(3.92002,1.16981) + (3.95999,1.15728)(4.00437,1.14265)(4.05336,1.12584)(4.10719,1.10676) +%% +\path(4.03246,1.10877)(3.9849,1.13255)(3.94232,1.15384) + (3.90448,1.17276)(3.87115,1.18943)(3.84215,1.20393) + (3.81732,1.21634)(3.79653,1.22673)(3.77966,1.23517) + (3.76664,1.24168)(3.75738,1.24631)(3.75184,1.24908)(3.75,1.25) + (3.75184,1.24908)(3.75738,1.24631)(3.76664,1.24168) + (3.77966,1.23517)(3.79653,1.22673)(3.81732,1.21634) + (3.84215,1.20393)(3.87115,1.18943)(3.90448,1.17276) + (3.94232,1.15384)(3.9849,1.13255)(4.03246,1.10877) +%% +\path(4.11344,1.2179)(4.05862,1.23638)(4.00875,1.25265) + (3.96358,1.26681)(3.92291,1.27893)(3.88655,1.28908) + (3.85434,1.29732)(3.82617,1.30368)(3.8019,1.3082)(3.78147,1.3109) + (3.7648,1.3118)(3.75185,1.3109)(3.74259,1.3082)(3.737,1.30368) + (3.73509,1.29732)(3.73691,1.28908)(3.74248,1.27893) + (3.75189,1.26681)(3.76522,1.25265)(3.78259,1.23638)(3.80413,1.2179) + (3.83001,1.1971)(3.86043,1.17387)(3.89561,1.14806)(3.93582,1.11951) +%% +\path(4.17536,1.33125)(4.1141,1.34487)(4.05764,1.35653) + (4.00578,1.36629)(3.95829,1.37421)(3.91502,1.38033) + (3.87582,1.38467)(3.84055,1.38727)(3.80911,1.38814) + (3.78141,1.38727)(3.7574,1.38467)(3.73702,1.38033)(3.72024,1.37421) + (3.70706,1.36629)(3.69748,1.35653)(3.69152,1.34487) + (3.68923,1.33125)(3.69069,1.3156)(3.69598,1.29782)(3.70521,1.27783) + (3.71851,1.25549)(3.73607,1.23067)(3.75806,1.20321) + (3.78473,1.17295)(3.81635,1.13966) +%% +\path(4.21858,1.44744)(4.1516,1.45669)(4.08922,1.46419) + (4.03123,1.46999)(3.97745,1.47411)(3.9277,1.47657)(3.88184,1.47739) + (3.83976,1.47657)(3.80136,1.47411)(3.76654,1.46999) + (3.73525,1.46419)(3.70743,1.45669)(3.68306,1.44744) + (3.66212,1.43639)(3.6446,1.42349)(3.63055,1.40867)(3.61998,1.39183) + (3.61298,1.3729)(3.60961,1.35175)(3.60998,1.32826)(3.61423,1.30227) + (3.62251,1.27364)(3.63501,1.24216)(3.65195,1.20761)(3.67361,1.16975) +%% +\path(4.24381,1.56512)(4.17177,1.57053)(4.10405,1.57438) + (4.04046,1.57668)(3.98083,1.57745)(3.925,1.57668)(3.87283,1.57438) + (3.82422,1.57053)(3.77905,1.56512)(3.73724,1.55811) + (3.69874,1.54948)(3.66348,1.53917)(3.63142,1.52713) + (3.60256,1.51329)(3.57688,1.49759)(3.5544,1.47993)(3.53514,1.46021) + (3.51915,1.43832)(3.50651,1.41411)(3.49729,1.38745) + (3.49162,1.35815)(3.48963,1.32601)(3.4915,1.29081)(3.49742,1.25228)(3.50765,1.21013) +%% +\path(4.25204,1.68304)(4.1755,1.68516)(4.10297,1.68587) + (4.03426,1.68516)(3.9692,1.68304)(3.90765,1.6795)(3.84948,1.67451) + (3.79458,1.66806)(3.74284,1.66012)(3.69417,1.65063) + (3.64852,1.63955)(3.60582,1.62683)(3.56602,1.61239) + (3.52909,1.59616)(3.49501,1.57805)(3.46379,1.55795) + (3.43543,1.53574)(3.40997,1.51128)(3.38744,1.48442) + (3.36791,1.45499)(3.35146,1.42277)(3.3382,1.38755)(3.32827,1.34904) + (3.32183,1.30695)(3.31908,1.26093) +%% +\path(4.24449,1.80006)(4.16396,1.79942)(4.08706,1.79749) + (4.01364,1.79428)(3.94353,1.78975)(3.87659,1.78389) + (3.81271,1.77667)(3.75175,1.76806)(3.69363,1.75801) + (3.63824,1.74647)(3.58552,1.73338)(3.53538,1.71867) + (3.48778,1.70226)(3.44267,1.68406)(3.40001,1.66397) + (3.35977,1.64186)(3.32194,1.6176)(3.28653,1.59104)(3.25354,1.56199) + (3.22299,1.53026)(3.19494,1.49562)(3.16944,1.4578)(3.14657,1.4165) + (3.12642,1.37138)(3.10914,1.32202) +%% +\path(3.75,1.25)(3.27753,1.48623) +%% +\path(3.34504,1.46989)(3.36522,1.4598) +\path(3.32254,1.47533)(3.3629,1.45515) +\path(3.30004,1.48078)(3.36058,1.45051) +\path(3.27753,1.48623)(3.35825,1.44587) +\path(3.29539,1.4715)(3.35593,1.44123) +\path(3.31325,1.45677)(3.35361,1.43659) +\path(3.33111,1.44204)(3.35129,1.43195) +\path(3.35825,1.44587)(3.36754,1.46444)(3.27753,1.48623) + (3.34897,1.42731)(3.35825,1.44587) +%% +\path(3.75,1.25)(3.14565,0.947826) +%% +\path(3.19923,0.99202)(3.21941,1.00211) +\path(3.18137,0.977289)(3.22173,0.997469) +\path(3.16351,0.962557)(3.22405,0.992827) +\path(3.14565,0.947826)(3.22637,0.988186) +\path(3.16815,0.953275)(3.22869,0.983545) +\path(3.19065,0.958724)(3.23101,0.978904) +\path(3.21315,0.964173)(3.23333,0.974263) +\path(3.22637,0.988186)(3.21709,1.00675)(3.14565,0.947826) + (3.23565,0.969622)(3.22637,0.988186) +%% +\allinethickness{1pt}% +\color{rgb_980000}% +\path(4.875,0.125) + (4.875,2.375)(2.625,2.375)(2.625,0.125)(4.875,0.125) +%% +\end{picture} diff --git a/graphics/epix/doc/layout.xp b/graphics/epix/doc/layout.xp new file mode 100644 index 0000000000..cd3e201011 --- /dev/null +++ b/graphics/epix/doc/layout.xp @@ -0,0 +1,36 @@ +/* -*-ePiX-*- */ +/* layout.xp -- June 27, 2007 */ +#include "epix.h" +using namespace ePiX; + +const double a(sqrt(3)); +P f(double u, double v) +{ + return P((u-v)*(u+v), 2*u*v, u); //u*(u-a*v)*(u+a*v)); +} + +int main() +{ + picture(P(0,0), P(2,3), "5x7.5in"); + + begin(); + + domain R(P(-1,-1), P(1,1), mesh(12,12), mesh(24,24)); + + for (int i=0; i<2; ++i) + for (int j=0; j<3; ++j) + { + screen my(P(-3,-3), P(3,3)); + activate(my); + border(Red(0.6), "1pt"); + camera.at(sph(10, (2*j+i+1)*M_PI/8, M_PI/6)); + + plot(f, R); + arrow(P(0,0,0), 2*E_1); + arrow(P(0,0,0), 2*E_2); + inset(P(i+0.05,2.05-j), P(i+0.95,2.95-j)); + } + + end(); +} + diff --git a/graphics/epix/doc/manual.pdf b/graphics/epix/doc/manual.pdf Binary files differnew file mode 100644 index 0000000000..bd8fc76619 --- /dev/null +++ b/graphics/epix/doc/manual.pdf diff --git a/graphics/epix/doc/manual.tex b/graphics/epix/doc/manual.tex new file mode 100644 index 0000000000..71aa59aa97 --- /dev/null +++ b/graphics/epix/doc/manual.tex @@ -0,0 +1,5030 @@ +%% Version 1.2.0 +\documentclass[12pt]{book} +\usepackage{amsmath,latexsym,epic,eepic,pstricks,xcolor,comment} +\usepackage[dvips,hyperref]{hyperref} + +\usepackage{makeidx} +\makeindex + +\renewcommand{\thefigure}{\arabic{chapter}.\arabic{figure}} + +\newcommand{\code}[1]{\texttt{#1}} +\newcommand{\filename}[1]{\texttt{#1}} +\newcommand{\Key}[1]{\texttt{#1}} +\newcommand{\URL}[1]{\texttt{#1}} + +%% \setlength{\topmargin}{0.5in} +\newcommand{\ePiX}{\code{ePiX}} +\newcommand{\ext}{\code{ePiX\_ext}} +\newcommand{\epix}{\code{epix}} +\newcommand{\eepic}{\code{eepic}} +\newcommand{\C}{\code{C}} +\newcommand{\CXX}{\code{C++}} +\newcommand{\pyepix}{\code{Pyepix}} + +\DeclareMathOperator{\clip}{clip} + +\newcommand{\Header}[1]{\smallskip\noindent\texttt{#1}% + \index{Header file!{#1}@\texttt{#1}}\quad} + +%% Substitution commands easily removable by sed for texinfo: +%% Remove recalcitrant chunks, +\newcommand{\texicomment}{} +\newcommand{\texicommentend}{} + +%% mark simple math, +\newcommand{\teximath}[1]{$#1$} +%% make function index entries, +\newcommand{\findex}[1]{} + +%% top-level division (first argument for texinfo node name) +\newcommand{\texinfochapter}[2]{\chapter{#2}} +\newcommand{\texinfoappendix}[2]{\chapter{#2}} + +%%\renewcommand{\subsection*}[1]{\subsection{#1}} + +\title{ \ePiX\ Tutorial and \\ Reference Manual} +\author{Andrew D. Hwang \\ + Department\ of Math and CS \\ + College of the Holy Cross} +\date{Version 1.2, September, 2007} + +\begin{document} + +\maketitle + +\tableofcontents + +\texinfochapter{1}{Introduction} + +\ePiX, a collection of batch utilities, creates mathematically +accurate figures, plots, and animations containing \LaTeX\ typography. +The input syntax is easy to learn, and the user interface resembles +that of \LaTeX\ itself: You prepare a scene description in a text +editor, then ``compile'' the input file into a picture. \LaTeX- and +web-compatible output types include a \LaTeX\ picture-like environment +written with \code{PSTricks}, \code{tikz}, or \code{eepic} macros; +vector images (\code{eps}, \code{ps}, and~\code{pdf}); and bitmapped +images and movies (\code{png}, \code{mng}, and~\code{gif}). + +\ePiX's strengths include: + +\begin{itemize} +\item Quality of output: \ePiX\ creates accurate, publication-quality + figures whose appearance matches that of \LaTeX. Typography may be + put in a figure as easily as in an ordinary \LaTeX\ document. + +\item Ease of use: Figure objects and their attributes are specified + by simple, descriptive commands. + +\item Flexibility: Objects are described by attributes and Cartesian + location; as in \LaTeX, printed appearance is determined when the + figure is compiled. A well-designed figure can be altered + dramatically, yet precisely, with command-line switches or minor + changes to the input file. + +\item Power and extendibility: \ePiX\ inherits the power of \CXX\ as a + programming language; variables, data structures, loops, and + recursion can be used to draw complicated plots and figures with + just a few lines of input. External code can be incorporated in a + figure with a command line option or by using a Makefile. + +\item Economy of storage and transmission: For a document containing + many figures, a compressed tar file of the \LaTeX\ sources and + \ePiX\ files is typically a few percent the size of the compressed + PostScript file. + +\item License: \ePiX\ is \emph{free software}.\index{Free software} + You are granted the right to use the program for whatever purpose, + and to inspect, modify, and re-distribute the source code, so long + as you do not restrict the rights of others to do the same. In + short, the license is similar to the terms under which theorems are + published. + +\end{itemize} + + +\ePiX\ facilitates logical, as opposed to visual, structuring of +mathematical figures, analogous to the relationship between \LaTeX\ +and a word processor. A few stylistic defaults streamline the creation +of simple figures, but there are few internal restrictions on the +contents or appearance of a figure; aesthetic and practical decisions +are left to you. + +If you are a: + +\begin{itemize} + +\item Potential user, you may wish to skip immediately to ``Software + Dependencies'' before investing additional time. + +\item New user, proceed from here until you have enough understanding + to run the software, then experiment with the samples files while + reading Chapter~\ref{chapter:started}, or return to the manual as + needed. + +\item More advanced user, browse at will, probably starting with + Chapter~\ref{chapter:ref-man}. + +\end{itemize} + +This manual is relatively conversational, and occasionally redundant, +especially between portions meant for readers at different levels of +familiarity. Throughout, you are assumed to be familiar with \LaTeX\ +and basic linear algebra: the description of points, vectors, lines, +and planes in three-dimensional space. Other material, such as \CXX\ +syntax, is introduced as needed. + + +\section{Changes in Version~1.2} + +\ePiX~1.2.x has been written almost entirely from scratch. The +conceptual model is unchanged, but there are a few changes of +syntax. If you're new to~\ePiX, please skip straight to +Section~\ref{section:software_deps}. + + +\subsection{Syntax Changes} + +Except as noted below, \ePiX~1.0 files will compile under +Version~1.2. Generally, global variables have been deprecated or +removed, and should be replaced by function calls in new files. The +following changes are either required, or else strongly recommended +(and may become mandatory). + +\begin{itemize} + +\item (Mandatory) The global variable \verb+tix+ in a \filename{flix} + file must be manipulated through the function \verb+tix()+. + +\item (Mandatory) The command \code{use\_pstricks()} is obsolete. + PSTricks output is obtained systematically as an output format. + +\item (Mandatory) Deprecated ``aliases'' no longer exist: + \code{triple} (for the \code{P} class), \code{D}~(for \code{Deriv}), + and \code{I}~(for \code{Integral}). Lowercase trig function names + conflicted with the standard namespace and have been removed. + +\item (Mandatory) Geometric object commands (\code{circle}, + \code{plane}, \code{segment}, and~\code{sphere}), which formerly + created class objects, now perform drawing just as \code{ellipse}, + \code{line}, \code{rect}, etc., do. The classes are available with + capitalized names (\code{Circle}, etc.). + +\item (Mandatory) Camera orientation is controlled with functions + named \code{tilt}, \code{pan}, and~\code{roll}; each rotates + the camera about an axis through the viewpoint, not through the + target. + +\item (Recommended) The global size variables \verb+x_min+, + \verb+x_max+, \verb+y_min+, \verb+y_max+, \verb+x_size+, and + \verb+y_size+ should be replaced by the function calls + \verb+xmin()+, etc. (No underscores.) + +\item (Suggested) The camera may be accessed through the function + \code{cam()}. + +\item (Suggested) The size and bounding box are given in one command, + such as \code{picture(P(-1,0), P(1,1), "4x3in")}. The old syntax + will be retained indefinitely. + +\end{itemize} + + +\subsection{New Features} + +\begin{itemize} + +\item Output is cleanly separated from the internal representation. + Figures may be written with a choice of macros---\code{PSTricks}, + \code{tikz}, and \code{eepic} at present---and new output types + are easily coded so long as the format supports arbitrary line + segments, color, and the ability to place a \LaTeX\ box at a + specified location. + +\item Colors are a manipulable data type, available in RGB, CMY, CMYK, + and Gray models. \filename{xcolor}-style operations, such as color + model conversion, blending, superposition, and inversion are + provided. + + The camera has a filter which affects the colors of all scene + elements. Filters performing CMYK separation are provided. + +\item Color filling is controlled with declarations, similarly to line + colors in \ePiX~1.0. Arrows and markers of type spot, dot, ddot, + and~circ are now colored like other markers. Parametric surfaces + may be color-shaded. + + If a figure contains many shaded elements, a color-capable output + format (e.g.\ \code{PSTricks}~or \code{tikz}) should be used for + efficiency. Filled regions are implemented as fine hatching in + \filename{eepic}. + +\item An \code{axis} class provides coordinate axes with labels in a + variety of styles: decimals or scientific notation of specified + precision, fractions, trig fractions, logarithmic labels in + arbitrary (integer) base, and user-supplied styles. + +\item \ePiX~1.2.x performs page layout. Sub-figures may be manipulated + flexibly. The sample files give several applications. + +\item Non-member intersection operators for circles, planes, spheres, + and segments are provided. A ``non-generic'' intersection does not + throw an exception, but instead returns an undrawable ``malformed'' + object. + +\end{itemize} + + +\section{Software Dependencies} +\label{section:software_deps} + +\index{Installation|(} +\index{Mac OS X} + +If you run GNU/Linux, a BSD, or Solaris, you probably have (and can +surely install) all the external software needed to use \ePiX. On +Mac~OS~X, you will need the Apple developer tools and an X~server +(XCode and XDarwin on the Tiger disks), and the free~\code{fink} +package manager to build a GNU environment. For Windows, you'll need +to install Cygwin and several packages. Detailed instructions are +given below. + +``Under the hood'', an input file is successively converted to a +\LaTeX\ picture; \code{dvi}; PostScript, \code{pdf}~or \code{eps}; and +if desired, to a bitmapped image or movie. Four shell +scripts---\epix, \code{laps}, \code{elaps}, and~\code{flix}---automate +the various file format conversions. + +\ePiX\ consists of a \CXX\ library, header, and shell scripts, and +requires GNU \code{bash} and a compiler \emph{for normal use}. For +complete functionality, you need \code{g++} (Version~3.2 or later), +\code{bash}, a text editor (\ePiX\ works particularly well with +\code{emacs}), a \LaTeX\ distribution, \code{Ghostscript}, \code{gv} +(or your favorite PS/PDF previewer), and \code{ImageMagick}. GNU +\code{grep} and \code{sed} are good to have. You may need additional +``developer packages'' (\code{binutils}, \code{make}) in order to +build \ePiX. The more up to date your software is, the better your +experience is likely to be, but bleeding edge versions are not +necessary, or even always desirable. + +Aside from their reliance on specific programs, \ePiX's shell scripts +are written using Unix-style pathnames. Thus, the most straightforward +way to use \ePiX\ is to install a GNU environment. + +Jay Belanger's \code{emacs} mode allows you to write, compile, and +view \ePiX\ figures without leaving \code{emacs}. If you use another +editor, you'll want to create template source files so you don't have +to type boilerplate code each time you write a new figure. +\index{Emacs@\code{emacs}} + + +\subsection{Setting up an Environment Under Windows} + +\index{Windows operating system|(} +\begin{comment} +Version~1.0.4 of \ePiX\ has been implemented in Python~2.2 by Andrew +Sterian, making \ePiX\ available on any platform that supports Python, +and without requiring a \CXX~compiler or~\code{bash}. Python is a +GPL-ed scripting language, and is available with a Windows installer +and detailed instructions. The easiest alternative for Windows users +is probably to install Python~2.2 or later (if necessary) and +\code{Pyepix}. The \code{pyepix} project home page is: +\URL{claymore.engineer.gvsu.edu/~steriana/Python/index.html} +\end{comment} + +Cygwin can be used to run \ePiX\ under Windows. Download +\filename{setup.exe} from \URL{www.cygwin.com}, then install the +packages you need. The following are recommended, and sufficient for +the actions described in this manual. +\begin{verbatim} +(Archive) bzip2, tar +(Devel) binutils, coreutils, gcc, gcc-g++, make, sed +(Editors) emacs, emacs-X11, vim +(Graphics) ImageMagick, ghostscript-base, ghostscript-x11, gv +(Publishing) tetex (all) +(Shells) bash, bash-completion +(X11) X-start-menu-icons, X-startup-scripts, + XFree86-lib-compat, xorg-x11-fscl, xorg-x11-fsrv +\end{verbatim} +\index{Windows operating system|)} + + +\section{Installation} + +\ePiX\ is distributed over the World-Wide Web as source code. Packages +may be found at \URL{mathcs.holycross.edu/\~{}ahwang/epix/ePiX.html} +The latest stable release is also on the CTAN mirrors, in the +\code{graphics} directory. (Some users of Red Hat have reported file +permission problems when unpacking the CTAN tarballs. If you encounter +this difficulty, please try downloading the sources from the project +main page.) Unpack the compressed tar file with the appropriate +command: +\begin{verbatim} + tar -zxvf epix-x.y.z.tar.gz + tar -jxvf epix-x.y.z.tar.bz2 +\end{verbatim} +(\code{x.y.z}~is the version number) or, if your \code{tar} +doesn't do decompression, +\begin{verbatim} + gunzip -c epix-x.y.z.tar.gz | tar -xvf - + bzcat epix-x.y.z.tar.bz2 | tar -xvf - +\end{verbatim} +\code{cd} to the source directory, \filename{epix-x.y.z}. The +\filename{INSTALL} file contains detailed installation instructions. +If you're impatient, the short of it is \code{./configure [--options]; + make; make install}. Run \code{./configure --help} for a list of +options. + +By default, \ePiX\ installs in subdirectories of +\filename{/usr/local}; if you want to install elsewhere, supply +\code{./configure} with the appropriate \code{--prefix}. You may also +want to consult \filename{POST-INSTALL} for information on setting +your \code{PATH} variable so your shell can find \ePiX. The manual +and sample files are in \filename{/usr/local/share/doc/epix}. +\index{Installation|)} + + +\subsection{Development} + +There are two mailing lists, one for user questions, one for +development discussion. Please visit +\URL{savannah.nongnu.org/mail/?group=epix} to subscribe. + + +\texinfochapter{2}{Getting Started} +\label{chapter:started} + +This chapter describes the basics of creating figures in \ePiX\ for +readers familiar with \LaTeX\ but completely new to~\CXX. No detailed +knowledge of~\CXX\ is needed to use \ePiX, only a bit of grammar that +is easily absorbed by example. + +Section~\ref{section:running} describes the commands (shell scripts) +comprising \ePiX, and explains how to set up a graphical environment +using standard *nix programs. Section~\ref{section:overview} briefly +describes figure creation. Section~\ref{section:tutorial} presents a +few files side-by-side with their output, and should be read at a +computer so you can run the exercises. + + +\section{Running \ePiX} +\label{section:running} + +An ``input file'' is a human-written figure specification containing +\ePiX\ commands. An ``output file'' is machine-created, and is +included directly into a \LaTeX\ document with the appropriate +packages. + +Conversion (``compiling'' a figure) is accomplished with four shell +scripts, \code{laps}, \code{epix}, \code{elaps}, and \code{flix}. +Each script has a preferred extension for its input files, and is +invoked with a command of the form +\begin{verbatim} + <script> [options] <input file(s)> +\end{verbatim} +Often, no options are necessary. \code{<script> --help} +describes \code{<script>}'s options. +\texicomment +Figure~\ref{fig:programs} (page~\pageref{fig:programs}) diagrams the +shell scripts and the file types they process. +\texicommentend + +By default, output file names are constructed by replacing the input +extension with the (preferred) output extension. For brevity, +extensions may be omitted. If the script has doubts about your intent, +it proceeds with default behavior and prints a warning message. + +The author is a great fan of \Key{TAB} completion, under which a +shell, based on what has been typed so far, automatically fills in a +command when the \Key{TAB} key is pressed. \ePiX\ comes with code +snippets that complete intelligently when the first part of a command +is one of the shell scripts. For example, if command completion is +active, typing \code{epix} \Key{TAB} prints only names of \code{epix} +input files. To use this feature, you must install Ian MacDonald's +\code{bash completion} package. The \filename{INSTALL} and +\filename{POST\_INSTALL} files contain details. + + +\subsubsection*{\code{laps}} + +\code{laps} performs \LaTeX\ to PostScript/PDF conversion, and is +independent of the rest of \ePiX. By default, \code{laps} invokes +\LaTeX~and \code{dvips}. The option \code{--pdf} creates a PDF~file by +post-processing the PostScript with~\code{ps2pdf}. Other \TeX-family +processors (\code{pslatex}, \code{pdftex}, etc.) may be used instead +of~\LaTeX\ by invoking \code{laps} with an appropriate option. + + +\subsubsection*{\code{epix}} + +\code{epix} compiles an input file into a \LaTeX\ picture. The input +file should have extension \filename{xp} (for eXtended Picture). Jay +Belanger's \code{emacs} mode is Highly Recommended; the installation +procedure can be found in the \filename{POST\_INSTALL} file. When this +mode is active, \code{emacs} automatically inserts a preamble template +when a new \filename{xp} file is created. In addition, you can peruse +\ePiX's info file, or format, compile, and preview files, all from +within \code{emacs}. +\index{Emacs@\code{emacs}} + +Output files from the script \code{epix} have extension +\filename{eepic}, after Conrad Kwok's enhancements to the \LaTeX\ +picture environment. In Version~1.2, however, an output file need not +contain \code{eepic} macros at all. + +An output file is \code{input} directly into a \LaTeX\ document whose +preamble contains appropriate \code{usepackage} lines. +\texicomment +\begin{center} + \begin{tabular}{cc} + Format & Required Package(s) \\ + \hline + \code{eepic} & \code{epic,eepic,xcolor} \\ + \code{pst} & \code{pstricks} \\ + \code{tikz} & \code{tikz} + \end{tabular} +\end{center} +\texicommentend +Rotated text requires the \code{rotating} package. + + +\subsubsection*{\code{elaps}} + +\code{elaps} creates stand-alone vector images (\filename{eps}~or +\filename{pdf}) from \code{epix} input files or \filename{eepic} +figures, even those not produced with \code{epix}. \code{elaps} +automatically loads the \LaTeX\ packages needed for features described +in this manual. Additional \LaTeX\ packages and \code{dvips} options +may be specified on the command line. + + +\subsubsection*{\code{flix}} + +\code{flix} creates bitmapped images and movies, +Section~\ref{section:animation}. Input files should have extension +\filename{flx}, and must contain a valid \code{epix} header as well as +additional code. Jay Belanger's \code{emacs} mode facilitates creation +of \code{flix} files. + + +\section{The Drawing Model} +\label{section:overview} + +To draw a figure manually, you select a sheet of paper of appropriate +size and add paths, markers, and labels. These scene elements have +attributes (line color, line width, fill color, font size, etc.) +affecting their appearance. + +\index{canvas} +\ePiX's drawing model behaves similarly. A \code{picture} command +sets the \emph{canvas} (or logical drawing area, a Cartesian +rectangle) and the true size of the final figure. A \code{begin} +command initializes the ``virtual paper'' for drawing. Subsequent +\emph{drawing commands} add objects to the scene: lines, curves, +function plots, labels, and the like. The printed appearance of scene +elements is determined by the current ``attribute state'' and +controlled by \emph{style declaration} which remain in effect until +superseded. Finally, an \code{end} command closes the figure and +prints it to the output file. + +In this manual, command descriptions follow a few +conventions. Optional arguments are enclosed in square brackets. A +\code{len} argument is either a number (representing a length in +\code{pt}) or a double-quoted string containing a number and a +two-letter \LaTeX\ length unit, such as \code{"1.5pt"} or +\code{"6cm"}. A \code{color} argument is a named primary +(\code{Red()}, \code{Cyan()}, \code{White()}, etc.), or a \code{Color} +specified by densities (\code{RGB(r,g,b)}, \code{CMY(c,m,y)}, etc.) + +\begin{itemize} + +\item Fill color: \code{fill(color)}, \code{nofill()}. + +\item Line color and width: \code{plain([color])}, + \code{bold([color])}. + +\item Text size: \code{font\_size([size])}, returns to + \code{normalsize} if no argument is given. + +\end{itemize} + +\noindent A complete list of style commands is found in +Section~\ref{section:quickref}, starting on +page~\pageref{section:quickref}. + +To handle three-dimensional scenes, a \code{camera} performs point +projection from a selected spatial location to the canvas. As a user, +you'll need to control relatively few of the \code{camera}'s +parameters. Keep in mind, however, that elements are added to a scene +in the same order their commands appear in the output file, and that +later elements generally cover earlier ones. Some three-dimensional +scenes require manual ordering of the input file; such ordering is +dependent on the \code{camera}'s location. + +By default, \ePiX\ draws thin, solid, black lines, performs no filling +of regions, prints text in a 12~pt Roman font, and looks down the +\teximath{z}~axis from a large distance, giving orthogonal projection +on the \teximath{(x,y)}~plane. When the \code{camera} is moved, the +\teximath{z}~axis points vertically up on the page. + + +\section{Tutorial} +\label{section:tutorial} + +This section presents sample input files side-by-side with their +output so you can compare what you write with what you'll see on the +screen or page. \ePiX\ provides standard drawing capabilities, but +like all software has its own idioms and personality. The basic +syntax, which comes from \code{C}/\CXX, should be mostly +self-explanatory. One-line comments begin with the +string~``\verb+//+''. + + +%%\index{Emacs@\code{emacs}} +\index{Graphical interface} +To use the sample files interactively, you'll need working software: +\filename{bash}, \filename{emacs}, \ePiX, \filename{g++}, +\filename{gv}, and a running X~server. To complete your ``GUI'', +start~\filename{gv} and select ``Watch file'' from the ``State'' +menu. The loaded file will update automatically when it changes. + +Create a ``scratch'' directory, \code{cd} into it, and run the command +\begin{verbatim} + tar -zxf /usr/local/share/doc/epix/sample_src.tar.gz +\end{verbatim} +(Change the path as appropriate for your installation.) This unpacks +copies of the sample files into your scratch directory, including all +the files mentioned in this manual. The \filename{README} file serves +as a table of contents. + +Open a sample file in \filename{emacs}, compile it from the drop-down +menu (or with the keyboard command), then open the \filename{EPS} file +in~\filename{gv}. Now you're ready to follow the tutorial +interactively. A few suggested exercises are included with each +file. Naturally, as you study more files, you'll be able to make more +interesting changes on your own. + + +\subsubsection*{Basic Drawing} + +The first sample, \filename{hello.xp}, contains code needed to specify +the figure's size, followed by the classic greeting. The \code{border} +command draws a box around the figure in the specified color and +width, and serves here merely to delimit the output from the +surrounding page. +\begin{verbatim} +/* -*-ePiX-*- */ +#include "epix.h" // These lines are analogous +using namespace ePiX; // to a usepackage command. + +int main() +{ + picture(P(-1,-1), P(1,1), "2 x 1in"); // corners, true size + + begin(); // ---- Figure body starts here ---- + + border(Black(), "1pt"); // color, line width + + font_size("Huge"); // May be any font size, e.g. "scriptsize" + label(P(0,0), "Hello, world!"); + + end(); // ---- End figure; write output file ---- +} +\end{verbatim} + +\begin{center} + \input{hello.eepic} +\end{center} + +\begin{itemize} + +\item Change the color and width of the + border. (\code{RGB(r,g,b);} creates an RGB color, CMY colors are + analogous. Named primaries are available. The densities should be + between \teximath{0}~and \teximath{1} for ``expected'' behavior.) + +\item Add \code{backing(Cyan());} after the \code{border} command. + +\item Put the command \code{crop\_ellipse();} before the \code{border} + command. Permute the \code{crop\_ellipse} command with the + \code{border} and \code{backing} lines, and note how the attribute + (\code{crop}) affects objects (\code{border}, \code{backing}). + +\end{itemize} + + +\subsubsection*{Geometric Objects} + +Our next file uses simple objects to draw a 2-D house-and-sun scene. + +\begin{verbatim} +int main() +{ + picture(P(0,0), P(5,2), "3.75 x 1.5in"); + + begin(); + + triangle(P(0.9, 1), P(3.1, 1), P(2, 1.5)); // vertices + circle(P(4,1.5), 0.25); // center and radius + + rect(P(1,0), P(3,1)); // opposite corners + + fill(Black(0.1)); // light gray + rect(P(2.3,0), P(2.7,0.8)); // the door + nofill(); + + bold(); // draw thicker lines + grid(P(1.4, 0.2), P(2, 0.6), 2, 2); // corners, number of squares + + line(P(xmin(), 0), P(xmax(), 0)); // endpoints + + end(); +} +\end{verbatim} + +\begin{center} + \input{objects.eepic} +\end{center} + +\begin{itemize} + +\item Add declarations such as \code{bold(RGB(1,0.9,0.5))} or + \code{fill(Yellow())} to color the scene. (Color and filling are + orthogonal attributes.) +\end{itemize} + +\noindent The sample file \filename{house.flx} uses loops to draw +gradient fills of the lawn, sky, and sun, and animates a sunset. + + +\subsubsection*{Function Plotting} + +Plotted functions must be defined in the ``preamble'', before +\code{main}. ``High-level'' elements---coordinate axes and grids, axis +labels, and graphs---are drawn with mnemonically-named commands. +\begin{verbatim} +// double = double-precision floating point +double f(double x) { return 0.75*Sin(x) - 0.25*Sin(2*x); } + +int main() +{ + picture(P(-2,-1), P(2,1), "5 x 1in"); // [-2,2] x [-1,1] + + begin(); + revolutions(); // set angle units, [0,1] = one turn + + h_axis(16); // axes w/default endpts + v_axis(4); + h_axis_labels(4, P(0,-4), b); // shift down 4pt, align below + + plain(Red()); + plot(f, xmin(), xmax(), 120); // use 120 intervals + + end(); +} +\end{verbatim} + +\begin{center} + \input{plotting.eepic} +\end{center} + +\begin{itemize} + +\item Define and plot some different functions; adjust the bounding + box as necessary. (Use repeated multiplication for polynomials. + The \code{polarplot} command graphs \teximath{r=f(\theta)}.) + +\item Change the arguments to \code{h\_axis\_labels}. The first + specifies the number of intervals to label; the second gives the + label offset in~\code{pt}. The last puts each label below~(\code{b}) + its Cartesian location. + +\end{itemize} + + +\subsubsection*{Multivariable Plotting} + +Functions of two or three variables are defined just like functions of +one variable, but for plotting the return type must be a +point~(\code{P}), not a real number~(\code{double}). The \code{domain} +class specifies the set of inputs to plot. + +\begin{verbatim} +P f(double r, double th) +{ + return P(r*Cos(th), r*Sin(th), pow(r, 3)*Cos(3*th)); +} + +int main() +{ + picture(P(-1,-1), P(1, 1), "2 x 1in"); + begin(); + pst_format(); // use PSTricks macros for output + + // corners ([0,1] x [0,2\pi]) and fineness + // (8x40 rectangles, plotted at 16x120 resolution) + domain R(P(0,0), P(1, 2*M_PI), mesh(8,40), mesh(16,120)); + + camera.at(P(3,1,2)); // set the viewpoint + arrow(P(0,0,0), P(1.25,0,0)); // coordinate axes + arrow(P(0,0,0), P(0,1.25,0)); + + plain(Blue(1.2)); // line color and width + fill(Yellow()); // shading color + surface(f, R); + + end(); +} +\end{verbatim} + +\begin{center} + \input{plotting2.eepic} +\end{center} + + +\subsubsection*{Loops and Control Structures} +\label{taylor_poly} + +A function can be defined by an arbitrary algorithm, and a +\code{domain} may be used to plot a family of functions for several +values of one variable. + +\begin{footnotesize} +\begin{verbatim} +P sin_n(double x, double n) // Taylor polynomial of sin x +{ + const int N((int) floor(n)); // convert n to an index bound + const double sqx(-pow(x, 2)); // -x^2 + double val(x), summand(x); + + for (int i=1; i <= 2*N+1; i += 2) + { + summand *= (sqx/((i+1)*(i+2))); // (-1)^i x^{2i+1}/(2i+1)! + val += summand; + } + + return P(x, val); // return (x, y) +} + +int main() +{ + picture(P(0, -1), P(6*M_PI, 1), "5 x 1in"); + + begin(); + + set_crop(); + bold(Green()); + plot(Sin, 0, xmax(), 120); + + domain R(P(0,1), P(6*M_PI, 41), mesh(60, 40), mesh(120, 40)); + for (int i=3; 0 <= i; --i) // print in descending degree + { + bold(RGB(0.25*i, 0, 1-0.25*i)); // degree-dependent color + plot(sin_n, R.slice2(5*i+1)); // plot for n = 5i+1 + } + end(); +} +\end{verbatim} +\end{footnotesize} + +\begin{center} + \input{plotting3.eepic} +\end{center} + + +\subsubsection*{Page Layout} + +Page layout can be composed from sub-pages with \code{screen} objects. +In the loop body below, objects are added to the ``active'' +\code{screen}, then \code{inset} into the ``canvas'', the screen +representing the entire figure. + +\begin{verbatim} +P f(double u, double v) +{ + return P((u-v)*(u+v), 2*u*v, u); +} + +int main() +{ + picture(P(0,0), P(2,3), "5x7.5in"); // overall size + + begin(); + + domain R(P(-1,-1), P(1,1), mesh(12,12), mesh(24,24)); + + for (int i=0; i<2; ++i) + for (int j=0; j<3; ++j) + { + screen my(P(-3,-3), P(3,3)); + activate(my); + border(Red(0.6), "1pt"); + // frame-dependent viewpoint + camera.at(sph(10, (2*j+i+1)*M_PI/8, M_PI/6)); + + plot(f, R); + arrow(P(0,0,0), 2*E_1); + arrow(P(0,0,0), 2*E_2); + // SW corner at (i, 2-j), padded by 0.05 on all sides + inset(P(i+0.05,2.05-j), P(i+0.95,2.95-j)); + } + + end(); +} +\end{verbatim} + +\begin{center} + \input{layout.eepic} +\end{center} + + +\section{\CXX\ Basics} + +\index{Cplusplus@\CXX|(} +An \ePiX\ source file is a \CXX~program. If you've successfully +modified and compiled the sample files, you know enough~\CXX\ to use +\ePiX. In the author's experience, \code{C}~grammar suffices for most +applications. An excellent introduction to definitions of functions +and variables, control statements, and overall program structure is +Kernighan~and Ritchie's \emph{The \code{C} Programming Language}, +second edition~\cite{KnR}. + + +\subsection{File Format} + +\index{Emacs@\code{emacs}} +Jay Belanger's \code{emacs} mode for \code{ePiX} inserts a file +template when an empty buffer is opened with the extension~\code{xp}. +This section explains the purposes served by the template. A few +additional remarks may help you avoid basic syntax pitfalls. + +A \CXX\ file consists of ``statements'', analogous to ordinary +sentences. Common types include \emph{declarations} (which +``register'' a function, variable, or type name with the compiler), +\emph{definitions} (which assign meaning to declared names), and +\emph{function calls} (which cause a named function to execute). Most +statements in an \ePiX\ input file are function calls (``commands''). +Plain declarations are relatively rare in user files, since a +definition serves to declare any new names that it contains. + +Every statement ends with a semicolon, and conventionally a file +contains at most one statement per line. The compiler ignores +nearly all whitespace (spaces, tabs, and newlines), which should be +used freely to make files easy to read. Other punctuation +(periods, commas, (semi)colons, parentheses, braces, and quotes) +dictates file parsing, and must adhere stringently to grammar. + +An \ePiX\ file always begins with the lines +\findex{include} +\begin{verbatim} +#include "epix.h" // N.B. pre-processor directive, no semicolon +using namespace ePiX; +\end{verbatim} +The first line is analogous to a \LaTeX\ \code{usepackage} command: It +loads the contents of the ``header'' file \filename{epix.h}, importing +the names of commands provided by~\ePiX. To avoid name conflicts, +\ePiX's commands are enclosed in a ``namespace''. For example, the +\code{label} command is actually known to the compiler as +\code{ePiX::label}. The second line above tells the compiler to apply +the prefix tacitly. + + +\subsection{Variables and Functions} +%% \index{Variable}\index{Variable!names} +%% \index{Function}\index{Function!names} + +Definitions of variables and functions play the same role in a figure +that macro definitions play in a \LaTeX\ document: gathering and +organizing information on which the figure depends. A variable is +defined by supplying its type, name, and initial value. By far the +most common data types in~\ePiX\ are \code{double} (double-precision +floating point number), \code{P}, and \code{int}. The name of a +variable may consist (only) of letters (including the underscore +character) and digits, and must begin with a letter: +\begin{verbatim} +my_var, var2, MY_var, aLongVariableName; // valid +my-var, 2var, \v@riable, $x, ${MY_VARIABLE}; // not valid +\end{verbatim} +Variable names are case-sensitive, and numerous (non-universal) +conventions govern the significance of capitalization. Generally, make +names descriptive but not unwieldy, and avoid language keywords (such +as \code{const}, \code{true}, \code{double}, \code{class}, or +\code{public}) and names that begin with an underscore. + +A function accepts ``arguments'' and ``returns a value''. To define a +function in~\CXX, you must specify the return type, the name of the +function, the types of the arguments, and the algorithm by which the +value is computed from the inputs. The code block +\begin{verbatim} +double f(double x) +{ + return sqrt(1-x*x); +} +\end{verbatim} +specifies the \code{double}-valued function~\teximath{f} of one \code{double} +variable defined by the formula \teximath{f(x)=\sqrt{1-x^2}}. + + +\subsection{Comments} + +\CXX\ has two types of comments. \code{C}-style comments, which may +span several lines, are delimited by the strings \code{/*}~and +\code{*/}. One-line comments, analogous to the \LaTeX~\code{\%}, are +begun with \code{//}. A one-line comment may appear within a multi-line +comment, but a \code{C}-style comment may not; the compiler will +mistake the first~\code{*/} it encounters as the end of the current +multi-line comment. + + +\subsection{Program Execution} + +All the ``action'' in a \CXX\ program occurs inside the special +function~\code{main}. Running a compiled \CXX~program is viewed by the +operating system as calling the program's \code{main} function. The +return value (an \code{int}) is the program's exit status. The +contents of the output file start with \code{begin()} and terminate +with \code{end()}. Intervening statements constitute the \emph{body} +of the file. + +In \CXX, a function may not be defined inside another function. Thus, +variables may be defined inside \code{main}, but functions cannot be. + + +\subsection{Strings and Raw Output} + +In \CXX, a \code{string} is a sequence of characters. Most +\code{string}s in \ePiX\ input files are \emph{literals}, +double-quoted \code{string}s whose value is read from the input. In a +string literal, backslash is an escape character; a single backslash +is produced by a double backslash in the input file. Certain letters +have special meanings when backslash-escaped, including ``\verb+\n+'' +(newline) and ``\verb+\t+'' (\Key{TAB}). Unlike~\LaTeX, \CXX~does not +require a space to separate an escape sequence from following text; +the string ``\verb+\\textwidth+'' literally represents a \LaTeX\ +command, while ``\verb+\textwidth+'' is read ``\code{TABextwidth}'' by +the compiler. + +Though not commonly needed, raw text can be printed to the output +file. The functions \code{write}, \code{pre\_write}, and +\code{post\_write} accept \code{string} arguments. \code{write} prints +its argument where the call appears in the input file. The other +functions print their arguments before or after the completed picture, +respectively. These commands must be in the file body. As an +application, a complete \LaTeX\ \code{figure} environment (with +caption and label) can be produced by an \ePiX\ file, +Figure~\ref{fig:captioned}. + +\index{pre\_write} +\index{post\_write} +\index{write} +\findex{pre\_write} +\findex{post\_write} +\findex{write} +\begin{figure} +\begin{footnotesize} +\begin{verbatim} +#include "epix.h" +using namespace ePiX; + +int main() +{ + picture(P(-1,-1), P(1,1), "10cm x 3in); + begin(); + pre_write("\\begin{figure}[hbt]"); // comes before the picture + + post_write("\\caption{A \\LaTeX\\ figure.}"); // and after + post_write("\\end{figure}"); + + < ... other ePiX commands ... > + write("%% A comment near the end, but inside the picture."); + end(); +} // End of main() +\end{verbatim} +\end{footnotesize} +\caption{Generating a self-contained figure in \ePiX.} +\label{fig:captioned} +\end{figure} + + +\subsection{Conditionals and Loops} + +An algorithm's behavior usually depends on internal state. A +\emph{conditional statement} causes blocks of code to be executed +according to criteria. A \emph{loop} repeatedly executes a code +block, usually changing the values of variables in a predictable way, +so that the loop exits after finitely many traversals. + +\texicomment +Figure~\ref{fig:gcd} illustrates conditionals and loops with +Euclid's algorithm for the greatest common divisor. Three pieces of +notation require explanation: \code{j\%i} means~``\teximath{j\pmod i}'', +\code{||} is logical~``or'', and \code{==} is ``test for equality''. +(A single~``\code{=}'' is the assignment operator.) + +\index{Function!Euclidean algorithm} +\begin{figure}[hbt] +\begin{footnotesize} +\begin{verbatim} +int gcd (int i, int j) +{ + int temp(i); // initialization syntax + if (i==0 || j==0) + return i+j; // define gcd(k,0) = k + + else { + if (j < i) // swap them + { + temp = j; + j = i; + i = temp; + } + // the work is done here... + while (0 != (temp = j%i)) // assign temp, test for zero + { + j = i; + i = temp; + } + return i; + } +} +\end{verbatim} +\end{footnotesize} +\caption{Euclid's division algorithm in~\CXX.} +\label{fig:gcd} +\end{figure} +\texicommentend + +%% \noindent For details on conditionals, or for more advanced techniques +%% of \CXX\ programming, please consult a textbook or online tutorial. +\index{Cplusplus@\CXX|)} + +%% Force previous two figures onto the same page +%%\clearpage + +\section{Animation} +\label{section:animation} + +\index{Animation|(} +\ePiX\ is well-suited to the creation of mathematically accurate +animations: If a figure depends suitably upon a ``time'' parameter, +then a loop can be used to draw the entire figure for multiple time +values, yielding successive ``snapshots'' of the figure as time +progresses. The shell script~\code{flix} automates the process of +compiling a suitable input file into a collection of \filename{png}s +and assembling these frames into a \filename{mng}~or \filename{gif} +animation. ImageMagick is the image-handling engine. + +A \code{flix} file is an \code{epix} file with two restrictions: +\begin{itemize} + \item The \code{double} variable \code{tix()} is used as + ``clock''. + + \item \code{main} accepts two command line arguments and sets + \code{tix()} accordingly. +\end{itemize} +\index{Emacs@\code{emacs}} +Jay Belanger's \code{emacs} mode recognizes the file +extension~\filename{.flx} and inserts template code if an empty buffer +is opened. Creation of \code{flix} files is as easy as creation of +\code{epix} files. The \filename{samples} directory contains a +handful of \code{flix} files that may be consulted for ideas. + +By default, \code{flix} creates movies with 24~frames, in which +\code{tix()} runs from~0 to~1, and animates at +\teximath{0.08}~sec/frame. These and other parameters can be changed +with command-line options. + +A ``typical'' \code{.flx} file may take 30~seconds to a few minutes to +compile, depending on the number of frames and the complexity of each +frame. To facilitate debugging, \code{elaps} can be run on a +\code{flix} file. \code{elaps} runs in a fraction of the time, and if +\code{elaps} can't produce a viewable image, \code{flix} will surely +fail. While running, \code{flix} prints a progress bar counting the +number of \filename{eps} files that have been created. There will be +a delay of a few seconds (or more) after the last frame is produced, +during which ImageMagick's \code{convert} utility assembles the movie. +\index{Animation|)} + + +\section{Layout Tricks} +\label{section:layout} +\index{Layout} + +\subsection{Stereograms} +\index{Stereograms} +Stereograms are created by drawing a single scene twice from slightly +different points of view. To create a stereogram with \ePiX, write a +``scene'' function containing the necessary drawing commands, then set +the camera appropriately and call the scene function twice, once for +each frame. + +\subsubsection*{Crossed-Eyes Stereograms} + +The sample files \filename{lorenz.xp}~and \filename{twisted\_cubic.xp} +use page layout to draw crossed-eyes stereograms. For each frame, +create and activate a \code{screen}, set the camera, and call the +scene function. The frames are inset side by side in the final +picture. For a crossed-eyes stereogram, the frame from the +``rightmost'' camera position is placed on the left. + +\subsubsection*{Bi-Color Stereograms} + +The sample files \filename{cube.flx}~and \filename{mirrorball.flx} +contain animated red-cyan stereograms, suitable for viewing with 3-D +glasses. The technique works best with black-and-white line drawings, +but the basic approach is the same as for crossed-eyes stereograms: +Create a scene function and call it twice, setting the camera +appropriately. Layout is unnecessary since the frames are superposed. +Pen colors should be close to red and cyan, but ``optimal'' choices +depend on one's eyes and 3-D glasses. + +\subsubsection*{Stereographic Movies} + +Either form of stereogram can be animated in a \code{.flx} file, but +keeping one's eyes properly crossed requires practice while most +people can instantly see depth with 3-D glasses. As always when using +\code{flix}, debug the scene with \code{elaps} before compiling a +movie. If a stereoscopic effect is difficult to see in a still image, +it will be even harder to perceive in a movie. + + +\subsection{Inset Images} + +\ePiX\ can place external images into a figure, similarly to +Rolf Niepraschk's \code{overpic} package. You provide the Cartesian +center point, the file name, and optionally the true height and/or +width of the image: +\findex{label} +\begin{verbatim} + label(P(a,b), "\\includegraphics[width=w,height=h]{file}"); +\end{verbatim} +This effect requires the \filename{graphicx} package. When compiling a +stand-alone graphic containing an external image, you must specify the +\filename{graphicx} package on the command line: \code{elaps -p +graphicx <file>} + +\texicomment +\begin{figure}[hbt] + \begin{center} + \input{ePiX.eepic} + \end{center} + \caption{Visual guide to \ePiX's shell scripts} + \label{fig:programs} +\end{figure} +\texicommentend + + +\texinfochapter{3}{Reference Manual} +\label{chapter:ref-man} + +This chapter details \ePiX's capabilities, discussing attributes and +data types, and listing available commands in the form +\begin{verbatim} + label(P posn, [P offset], string text, [align]); + circle(P ctr, double rad=1, normal=P(0,0,1)); +\end{verbatim} +As in Chapter~\ref{chapter:started}, function arguments are given by +type (\code{P}, \code{double}, \code{string}, etc.)\ and name, or by +name alone if the type is clear. Optional arguments are enclosed in +square brackets. A few argument types, such as \code{[align]} above, +admit only a small number of values; these cases are explained when +the corresponding command is first introduced. + +A name followed by an equals sign and a value indicates a default +argument; if omitted in an input file, the compiler substitutes the +default value. Only trailing arguments may be specified this way. For +example, if the \code{rad} argument of the \code{circle} command is +omitted, the \code{normal} argument \emph{must} be omitted as well. + +In an input file, only an argument's value is given, not the type: +\begin{verbatim} + label(P(0,0), P(0,-4), "Hello world", b); + circle(P(0,-0.25), sqrt(2)); // use default normal +\end{verbatim} + +Generally, \code{len} signifies either a number (representing a length +in \code{pt}) or a double-quoted string containing a number and a +two-letter \LaTeX\ length unit, such as \code{"1.5pt"} or +\code{"6cm"}. \code{color} represents a \code{Color} object +constructed from a named primary (\code{Blue()}, \code{Magenta(0.7)}, +etc.), a color specification (\code{RGB(r,g,b)}, \code{CMY(c,m,y)}, +etc.), or an operator applied to an existing \code{Color}. + + +\section{File Structure} + +An \ePiX\ input file constitutes a short \CXX\ program. When this +program is compiled and run by one of the shell scripts, it creates a +figure file suitable for inclusion in \LaTeX. + +\index{Preamble} +Like a \LaTeX\ document, an \ePiX\ file contains a \emph{preamble}, +which sets up a drawing environment, and a \emph{body}, which contains +actual figure-generating commands. The minimal file has the form +\findex{picture} +\findex{begin} +\findex{end} +\begin{verbatim} +#include "epix.h" // N.B. no semicolon +using namespace ePiX; + +int main() { + picture(P(a1,b1), P(a2,b2), "n1 [unit1] x n2 unit2"); + begin(); // end of preamble, start of body + end(); // end of body +} +\end{verbatim} +\ePiX\ commands are of four general types: drawing, attribute setting, +definitions (of data and functions), and operations on existing +objects. Except as noted below, drawing and attribute commands must +appear in the body, between \code{begin()}~and \code{end()}. Function +definitions must come in the preamble, before \code{main()}. Data +definitions may appear in the preamble or body. + + +\subsubsection*{Output Format} +\index{Output format} + +The \code{end()} command writes the output file to \code{stdout}, +using \code{eepic} macros by default. The shell scripts redirect +\code{stdout} to an appropriate disk file. + +The attribute-setting command \code{pst\_format()} causes the output +file to be written using \code{PSTricks} macros when \code{end} is +called. Similarly, \code{tikz\_format()} causes the file to be written +using \code{tikz} macros, and \code{eepic\_format()} causes the file +to be written using \code{eepic} macros. These commands may appear +anywhere in the figure body. There is no reason for a file to contain +more than one such command. + +The output format may be selected on the command line, overriding any +explicit request in the input file. Supplying \code{epix}, +\code{elaps}, or \code{flix} with one of the options \code{--pst}, +\code{--tikz}, or \code{--eepic} is tantamount to issuing a +\code{pst\_format()} (etc.)\ command just before the end of the +file. These options are listed in decreasing precedence. If more than +one is given, the ``strongest'' applies, regardless of the command +line order. + +A figure may be written directly to a specified disk file, in a format +unaffected by the command line flags above. The command +\begin{verbatim} + print_eepic("file.tex"); +\end{verbatim} +writes the figure to the named file using \code{eepic} +macros. Analogous commands exist for the formats \code{pst}~and +\code{tikz}. These commands perform an immediate action. Consequently, +the command's location in the input file is significant, and multiple +commands may appear in a single file, so long as distinct file name +arguments are provided. Applications include writing the same figure +in multiple formats, or creating successive ``snapshots'' of a lengthy +computation. + + +\section{Picture Size and Aspect Ratio} + +\index{Picture!size} +\index{Picture!offset} +The \code{picture} command specifies a figure's logical and true +sizes. In the ``minimal file'' snippet above, the \emph{canvas} is the +Cartesian rectangle \teximath{[a_1,a_2]\times[b_1,b_2]} whose corners +are given. Either pair of opposite corners is acceptable, but +confusion is less likely when the SW~and NE corners are given, in this +order. + +The true (printed) width and height are read from \code{picture}'s +third argument, a ``size \code{string}'' such as \verb+"4cm x 1in"+, +containing a number and optional \LaTeX\ length unit, an~\code{x}, +another number, and a mandatory length unit. Spaces may be used for +legibility. The mandatory length unit becomes the \LaTeX\ +\code{unitlength}. The argument \verb+"4cm x 1in"+ creates a picture +4~cm wide and 1~in high, but internally converts 4~cm to inches. +Recognized length units are \code{pt} (points, the default), \code{cm} +(centimeters), \code{in} (inches), \code{mm} (millimeters), \code{pc} +(picas), and \code{bp} (big points). +(\code{1in = 2.54cm = 72bp = 72.27pt}, \code{1pc = 12pt}.) + +The logical and true sizes may be defined separately with the commands +\findex{bounding\_box} +\findex{picture} +\findex{unitlength} +\begin{verbatim} + bounding_box(P(a1,b1), P(a2,b2)); + picture(n1, n2); + unitlength(len); // len a length string, not a double +\end{verbatim} +One way or another, the logical and true dimensions \emph{must} have +positive values when the \code{begin()} command is issued. + +\LaTeX\ treats the contents of a picture environment as a single box, +aligned by default on its lower left corner. An \code{offset} command +accepts two \code{double} arguments or a size \code{string} and shifts +the page location accordingly. The command +\code{offset("0.25 x -0.5cm")} shifts the picture right +\teximath{0.25}~cm and down \teximath{0.5}~cm. If the +\code{unitlength} is 1~cm, the command \code{offset(0.25, -0.5)} has +the same effect. + +A non-zero \code{offset} causes a picture's contents to appear in a +location where \LaTeX\ does not expect them. This can be useful in a +\LaTeX\ document, but should be avoided when compiling a stand-alone +image, since \code{dvips} may crop according to rules of its own. + + +\index{Picture!aspect ratio} +\index{Picture!bounding box} +The canvas's corners are \code{(xmin(),ymin())} and +\code{(xmax(),ymax())}, while its width and height are +\code{xsize()}~and \code{ysize()}. The canvas is a virtual, advisory +data structure; its dimensions are not directly related to the +figure's printed size, and picture elements may lie outside the +canvas. Affine scaling maps the canvas to the page when the output +file is written. +\begin{center} +\input{scaling.eepic} +\end{center} +\label{page:scaling} +The figure's aspect ratio is controlled by sizing the canvas. The +aspect ratio is ``true'' if the canvas and page rectangles are +geometrically similar, e.g., if both boxes are 1.5~times as wide as +they are tall. + + +\section{Color} +\label{section:color} + +\index{Color|(} +\ePiX\ provides a \code{Color} data type. Four models are implemented: +\code{RGB}, \code{CMY}, \code{CMYK}, and \code{Gray}. A \code{Color} +holds primary color ``channels'', each carrying an intensity between +0~(no color) and~1 (full saturation). ``No color'' means black in +\code{RGB} and \code{Gray}, white in \code{CMY(K)}. \code{RGB}, +\code{CMY}, and~\code{CMYK} colors are written to the output file as +commands in the corresponding model. \code{Gray} shades are written +in~\code{RGB}. + +Operations on red-green-blue colors are described below. Functionally, +colors are converted to~\code{RGB}, operated upon, then converted back +to the original model. Conversions are as described in Uwe Kern's +\filename{xcolor} manual~\cite{xcolor}. + + +\subsection{Constructors} + +Each color model has a ``constructor'' creating a color of specified +densities. The \code{RGB}~and \code{CMY} models have named ``primary'' +constructors; the density argument is optional and defaults to~1. +\findex{RGB} +\findex{Red} +\findex{Green} +\findex{Blue} +\findex{White} +\findex{Black} +\begin{verbatim} + // red-green-blue colors + RGB(double r=0, double g=0, double b=0); + Red(d=1); Green(d=1); Blue(d=1); + White(d=1); Black(d=1); +\end{verbatim} +\findex{CMY} +\findex{Cyan} +\findex{Magenta} +\findex{Yellow} +\findex{CMY\_White} +\findex{CMY\_Black} +\findex{CMYK} +\findex{Gray} +\begin{verbatim} + // cyan-magenta-yellow colors + CMY(double c=0, double m=0, double y=0); + Cyan(d=1); Magenta(d=1); Yellow(d=1); + CMY_White(d=1); CMY_Black(d=1); + + // gray + Gray(double d=0); // equivalent to RGB(d, d, d) +\end{verbatim} +Each \code{CMY} constructor has a corresponding \code{CMYK} function, +e.g.\ \code{CyanK()}~or \code{CMYK\_White()}. + +Though color densities lie between 0~and 1, \ePiX's primary color +constructors take arguments mod~4, viewed as elements +of~\teximath{[-2,2]}. Consider \code{Red(d)}, ``red with +density~\teximath{d}''. For integer values of~\teximath{d}, the +constructor has the following meanings: \code{Red(0)}~is black, +\code{Red(1)}~is red, \code{Red(2)}=\code{Red(-2)}~is white, and +\code{Red(-1)}~is anti-red, or cyan. For non-integer~\teximath{d}, the +constructor interpolates between the bracketing integer values, +Figure~\ref{fig:densities}. Other primary constructors work +analogously. + +\begin{figure}[hbt] + \begin{center} + \input{color_density.eepic} + \end{center} + \caption{The red primary constructor.} +\label{fig:densities} +\end{figure} + +Let \teximath{\delta:[-2,2]\to[0,1]} be the piecewise-linear function +that converts real numbers to primary color densities, +\teximath{\clip:\mathbf{R}\to[0,1]} the clipping function. The +non-primary constructor \code{RGB(r, g, b)} computes the density of +the red channel as +\teximath{\clip\bigl(\delta(r)+\delta(-g)+\delta(-b)\bigr)}; the green +and blue channel densities are computed similarly. Every color can be +created with arguments between 0~and 1, but the constructor accepts +arbitrary real arguments and returns colors varying ``continuously and +periodically''. + +\index{Color!transparency} +Colors possess an ``alpha-channel'' for transparency. Except as +supported by the output format, this feature is a stub. + + +\subsection{Color Operations} + +Colors can be scaled, inverted, blended, superposed, and filtered. In +the code below, \code{tint}~is a \code{Color}. The effect of each +operation is described in the \code{rgb} model; the visual result is +the same in all models. +\findex{Color.invert} +\findex{Color.blend} +\findex{Color.superpose} +\findex{Color.alpha} +\findex{Color.filter} +\begin{verbatim} + tint *= double c; // multiply channels by c, rebuild + tint.invert(); // (r, g, b) -> (1-r, 1-g, 1-b) + tint.blend(Color col, double t); // (1-t)*tint + t*col + tint.superpose(col); // add channels, then clip to [0,1] + tint.alpha(double d); // set alpha channel to clip(d) + + tint.filter(col); // return min density in each channel +\end{verbatim} +Except for \code{filter}, these operators modify their object. +\code{filter} simulates the effect of viewing \code{col} +through a transparent sheet of \code{tint}, and returns a new +\code{Color} object having the same model as \code{tint} without +modifying \code{tint} itself. + + +\section{Scene Attributes} + +Objects in a scene sit in 3-dimensional space. A \emph{camera} +maps objects to the \emph{active screen}. The active \code{screen} +may, in turn crop its contents. Each drawing command creates an +object, ``photographs'' it, and adds the image to the active +\code{screen}. This section describes the \code{Camera} and +\code{screen} classes and a few associated concepts. + + +\subsection{Angular Mode} +\index{Angle units} + +By default, angles are measured in \code{radian}s. Two other angular +modes are available: \code{degrees}~and \code{revolutions}. The +angular mode is set with a named command, \code{radians()}, +\code{degrees()}, or \code{revolutions()}. The current angular mode +affects all trigonometric functions and operations. + + +\subsection{The Camera} +\index{Camera|(emph} +\index{Screen|(} + +Three-dimensional scenes are drawn on flat paper by applying a +mathematical transformation. By default, \ePiX\ uses \emph{point +projection}, the technique used by art students when they trace on a +window with grease pencil, Figure~\ref{fig:camera}. + +\begin{figure}[hbt] + \begin{center} + \input{camera.eepic} + \end{center} + \vspace*{-0.25in} + \caption{Point projection.} + \label{fig:camera} +\end{figure} + +\index{Camera!viewpoint} +\index{Viewpoint} +\ePiX\ depicts a Cartesian world by projecting mathematically to a +screen plane, then affinely scaling to a printed page. The camera, +which maps the world to the screen, consists of a \emph{body} (data +that determines the position and orientation of the camera), a +\emph{lens} (the actual mapping to the screen plane), and a +\emph{filter} (a color through which the scene is viewed). + + +\subsubsection*{Body} + +The camera's spatial orientation is described by a triple of mutually +perpendicular unit vectors. In memory of happy days at the beach, +these vectors are called \emph{sea}, \emph{sky}, and~\emph{eye}. The +screen plane is parallel to the sea-sky plane; the sea vector points +horizontally to the right, sky points vertically upward. The eye is +their cross product, which points directly at the viewer. + +The sea-sky-eye basis is located at the \emph{viewpoint}, the camera's +spatial location. The \emph{target}, the origin of the screen plane, +lies on the line through the viewpoint in the direction opposite the +eye vector. The distance from the viewpoint to the target is the +\emph{range}. The \emph{camera sphere} is centered at the viewpoint +and passes through the target. The orientation, viewpoint, target, +and range completely (and redundantly) determine the camera's +geometric situation in the world. + + +\subsubsection*{The Lens} +\index{Camera!lens} + +A \emph{lens} maps the world to the screen. \ePiX\ comes with four +lenses: \emph{shadow} (the default), \emph{orthogonal}, +\emph{fisheye}, and \emph{bubble}. Each lens simulates the appearance +of world objects as seen by an observer at the viewpoint. The shadow +lens is point projection from the viewpoint to the screen plane. The +orthogonal lens projects from infinite distance. Each of the other +lenses performs radial projection to the camera sphere, then maps the +sphere to the screen plane; the fisheye lens does orthogonal +projection (so the entire image lies inside the disk centered at the +target whose radius is the range) while the bubble lens does +stereographic projection from the target's antipode. +\index{Screen|)} + + +\index{Camera!manipulation|(} +An input file normally uses a single camera, so a global object named +\code{camera} is defined automatically. At the start of a figure, the +\code{camera} looks down on the \teximath{(x_1,x_2)}-plane from a +distant point on the \teximath{x_3}-axis. The resulting view, +essentially projection along the axis, is suitable for 2-dimensional +figures. + +The \code{camera} is manipulated similarly to a real camera: +\findex{Camera.at} +\findex{Camera.look\_at} +\findex{Camera.range} +\findex{Camera.focus} +\findex{Camera.tilt} +\findex{Camera.pan} +\findex{Camera.roll} +\findex{Camera.clip\_range} +\begin{verbatim} + camera.at(P posn); // set viewpoint to posn + camera.look_at(P targ); // set target to targ + camera.range(double dist); // fix target, move viewpoint + camera.focus(double dist); // fix viewpoint, move target + camera.tilt(double angle); // rotate about the sea axis + camera.pan(double angle); // rotate about the sky axis + camera.roll(double angle); // rotate about the eye axis + camera.clip_range(dist); // cull scenery closer than dist +\end{verbatim} +Explicitly setting the viewpoint or target makes the sky vector +parallel to the projection of the \teximath{x_3}~axis when possible; +otherwise the \teximath{x_2}-axis is used. Setting the range or focus +moves the \code{camera} parallel along the eye line. Each command +re-sizes the image; note that increasing the focus \emph{enlarges} the +image. The three rotation operations fix the viewpoint, but only roll +fixes the target. + + +\subsubsection*{Filtering and Color Separation} +\index{Color!separation} +\index{Camera!color separation} + +The \code{camera} has a \emph{filter} through which all scene +\code{Color}s pass. For uniformity, the filter should only be set at +the start of the file body, before any visible elements have been +placed in the scene. The filter has two primary uses---model +conversion and color separation---but can also be used for special +effects. + +There is a \code{Neutral} color, for which filtering has no effect at +all. The \code{camera}'s default filter is \code{Neutral}. In +addition, each color model has a \emph{neutral} representative, +\code{RGB\_Neutral}, etc. Passing \code{Color}s through a neutral +filter preserves their appearance but converts them to the neutral +\code{Color}'s model. + +Filtering can be used to ``split'' a \code{Color} into primary +constituents. For \code{RGB} channels, the primaries themselves are +suitable filters. For \code{CMYK} channels, there are special +\emph{process} filters, named \verb+C_Process+, etc. +\begin{verbatim} + camera.filter(CMY_Neutral()); // convert all colors to CMY + camera.filter(Gray_Neutral()); // black and white photography + camera.filter(Green()); // the green channel + camera.filter(M_Process()); // the magenta channel + camera.filter(Red(1.4)); // la vie en rose? +\end{verbatim} +\index{Camera!manipulation of|)} +\index{Camera|)} + + +\subsection{Clipping} + +\index{Clipping|(} + +Two operations handle elements lying far from the target. +\emph{Cropping} culls elements based on their screen location, and is +described later. \emph{Clipping} removes objects whose spatial +location lies outside the ``clip region''. + +Initially, the clip region is a very large box centered at the +origin. Commands are provided to resize this box, keeping the faces +parallel to coordinate planes. +\findex{clip\_box} +\findex{clip\_to} +\begin{verbatim} + clip_box(P pt1, P pt2); // opposite corners + clip_box(P pt); // opposite corners pt and -pt + clip_to (P pt); // pt and P(0,0,0) + clip_box(); // very large box +\end{verbatim} +Additional ``clippers'' may be added manually. Individual clipping +planes are specified by a point and inward-pointing normal vector. +Parallel planes cutting a ``slice'' or ``slab'' are described by a +location, direction, and a distance. The location lies halfway between +the clipping planes, and the planes' normals point toward the location. +\findex{clip\_face} +\findex{clip\_slice} +\findex{clip\_restore} +\begin{verbatim} + clip_face(P loc, P perp); // perp points inward + clip_slice(loc, perp); // very close parallel planes + clip_slice(loc, perp, dist); // planes separated by dist + clip_restore(); // remove manually-added clip planes +\end{verbatim} +Like \code{clip\_restore}, the \code{clip\_box} and \code{clip\_to} +commands remove all user-specified half spaces. +\index{Clipping|)} + + +\subsection{Screens and Page Layout} +\index{Screen|(} +\index{Screen!active} +\index{Layout} + +By default, drawing occurs in the Cartesian coordinate system of the +\code{canvas}. However, insets and subfigures are most naturally +composed in ``local'' coordinates, then placed into their final +location as a unit, a process called \emph{layout}. \ePiX\ implements +layout with the \code{screen} class. + + +\subsubsection*{Screens} +\index{Bounding box} + +A \code{screen} is a Cartesian plane containing a distinguished +coordinate rectangle, its \emph{bounding box}. The \code{canvas} of a +figure is a \code{screen}, as is the internal representation of the +printed page. At any point of a file body, some \code{screen} is +\emph{active}, or ``open for drawing''. A new \code{screen} is created +from a pair of opposite corners, but is not used until explicitly +activated. +\findex{activate} +\findex{deactivate} +\begin{verbatim} + screen subfig(P(a1,b1), P(a2,b2)); // [a1, a2] x [b1, b2] + activate(subfig); // open subfig for drawing + // commands to draw in subfig + deactivate(subfig); // re-activate the previous screen +\end{verbatim} + +The \code{canvas} is automatically drawn at the \code{end} of the +input file. The contents of other \code{screen}s must be incorporated +into the \code{canvas} explicitly with an \code{import}~or +\code{inset} command. \code{import} affinely scales the bounding box +of the ``child'' \code{screen} to the \code{canvas}. \code{inset} +specifies corners in the ``parent'' where the child is +placed. +\findex{import} +\findex{inset} +\begin{verbatim} + import(); // active screen to canvas + import(subfig); // subfig to canvas + inset(P sw, P ne); // active screen to specified rectangle + inset(subfig, sw, ne); // subfig to specified rectangle + inset(subfig); // inset to subfig's corners +\end{verbatim} + + +\subsubsection*{Extracting} + +The portion of a \code{screen} enclosed by a specified rectangle can +be \emph{extracted}. Each of the commands +\findex{extract} +\findex{canvas} +\begin{verbatim} + subfig.extract(P sw, P ne); + canvas().extract(P sw, P ne); +\end{verbatim} +returns the \code{screen} having stated corners and containing part of +\code{subfig} or the \code{canvas}, respectively. Elliptical and +diamond-shaped portions of a \code{screen} may be extracted. The +contents occupy the ellipse or diamond inscribed in the given +rectangle. +\findex{extract\_diamond} +\findex{extract\_ellipse} +\begin{verbatim} + subfig.extract_ellipse(sw, ne); + canvas().extract_diamond(sw, ne); +\end{verbatim} +The \code{screen} returned by \code{extract} (or its variants) may be +used just like a manually-constructed \code{screen}, for example to +construct a magnified inset. + + +\subsubsection*{True-Size Drawing} +\label{truesize} + +On occasion, it is necessary to draw at known page size, independently +of the unit length. For 2-dimensional drawing in the +\teximath{(x_1,x_2)}-plane with the \code{camera} in its default +location, the coordinates (horizontal, vertical, or both) of a +\code{screen} may be interpreted as true~pt offsets relative to a +specified point rather than as Cartesian coordinates. +\findex{inlay} +\findex{inlay\_horizontal} +\findex{inlay\_vertical} +\begin{verbatim} + inlay(subfig, P loc); + inlay_horizontal(subfig, loc); + inlay_vertical(subfig, loc); +\end{verbatim} +Each command maps the origin of \code{subfig} to the specified +location in the active \code{screen}. The first performs affine +scaling so that one Cartesian unit in \code{subfig} maps to one +true~pt on the page. The second and third commands perform this +scaling only in the named direction. + +\findex{pt\_to\_screen} +The \code{inlay} functions are suitable only for 2-dimensional +effects. For 3-dimensional true-size drawing, the function +\code{pt\_to\_screen} converts a true length of 1~pt into Cartesian +coordinates in the active \code{screen}. For example, the command +\code{line(P(0,0), P(pt\_to\_screen(12),0))} draws a line segment +12~pt long with its left endpoint at the Cartesian origin. True size +drawing is unusual in an input file, but has definite uses in library +code; \ePiX's right angle marker is a typical application. + +Either type of true-size drawing works as described when drawing in +the \code{canvas}, and \emph{only} when drawing in a \code{screen} +imported to the \code{canvas} at ``true Cartesian'' size (one +\code{screen} unit maps to one Cartesian unit in the \code{canvas}). +In other situations, the true size coordinate(s) will be scaled by +additional affine transformation(s). + + +\subsubsection*{Cropping and Decorations} + +\index{Cropping} +A \code{screen} has a \emph{crop mask}: rectangular (default), +elliptical, or diamond-shaped. If cropping is switched on in the +active \code{screen}, added elements are cropped to the crop mask. +For example, cropping by the default crop mask in the \code{canvas} +ensures the figure lies inside the printed region allocated by +\LaTeX. + +The \code{crop} commands below affect the active \code{screen} +only. Cropping is not a ``global'' attribute, but must be set or unset +explicitly for each \code{screen}. By default, cropping is switched +off. +\findex{crop} +\findex{crop\_ellipse} +\findex{crop\_diamond} +\findex{set\_crop} +\begin{verbatim} + set_crop(); // activate cropping + set_crop(false); // deactivate cropping + crop_diamond(); // <>-shaped mask, set crop state + crop_ellipse(); // etc... + crop(); // crop active screen's contents +\end{verbatim} +Normally the crop mask is inscribed in the \code{screen}'s bounding +box. The commands \code{crop\_diamond} and \code{crop\_ellipse} also +accept a pair of \code{P}~arguments, which are treated as corners of +the crop box. + +The active \code{screen} may be decorated with a \code{border} +(outline of specified color and line width) and \code{backing} (solid +fill color). The crop mask determines the shape of the \code{border} +and \code{backing}. +\findex{border} +\findex{backing} +\begin{verbatim} + border(color, len); + backing(color); +\end{verbatim} +Identically-named member functions can be applied to an arbitrary +\code{screen} whether or not it is active: +\begin{verbatim} + scr.crop_rectangle().backing(Blue(1.8)); + canvas().crop(); +\end{verbatim} + + +\subsubsection*{Affine Maps} +\index{Affine map} + +A \emph{plane affine map} has the form \teximath{T(x) = Ax+b} for some +invertible \teximath{2\times2} matrix~\teximath{A} and a constant +vector~\teximath{b}. \ePiX's \code{affine} class allows affine maps to +be built and applied to \code{screen}s' contents. + +An affine map is uniquely determined by the images of three +non-collinear points. The constructor returns the affine map sending +the points \teximath{(1,0)}, \teximath{(0,1)}, and~\teximath{(0,0)} to +\code{pt1}, \code{pt2}, and~\code{pt0}, respectively. +\findex{affine} +\begin{verbatim} + affine af(P pt1, P pt2, P pt0=P(0,0)); +\end{verbatim} +To emphasize, the arguments are locations, not displacements, and the +image of the origin comes last. There is also a \code{void} +constructor (taking no arguments) which returns the identity map. + +To facilitate construction of affine maps, an existing \code{affine} +may be post-composed with a variety of ``elementary'' affine +transformations. In the commands below, \code{th} is an angle (in +current units), \code{sc} is a non-zero \code{double}, and \code{ctr} +is a point fixed by the composing transformation. In each command, +\code{ctr} defaults to \teximath{(0,0)}. +\findex{shift} +\findex{rotate} +\findex{reflect} +\findex{h\_scale} +\findex{v\_scale} +\findex{scale} +\findex{h\_shear} +\findex{v\_shear} +\findex{postcomp} +\begin{verbatim} + affine af; // the identity map + af.shift(P arg); // translate by arg + af.rotate(th, [ctr]); // counterclockwise rotation about ctr + af.reflect(th, [ctr]); // reflect across line through ctr + + af.h_scale(sc, [ctr]); // horizontal scaling + af.v_scale(sc, [ctr]); // vertical scaling + af.scale(sc, [ctr]); // dilatation + + af.h_shear(sc, [ctr]); // shear preserving horizontals + af.v_shear(sc, [ctr]); // shear preserving verticals + + af.invert(); // the inverse + af.postcomp(affine f); // post-compose with f + af(f); // pre-compose, af not modified +\end{verbatim} +A non-invertible \code{affine} can be created \emph{only} by shearing +or scaling with an extremely large or extremely small argument, or by +supplying three collinear points to the constructor. Calling +\code{invert} on a non-invertible map merely issues a warning and +performs no action. + +An \code{affine} may be applied to a \code{screen}'s current contents. +The \code{screen} class has eight member functions (\code{shift} +through \code{shear}) with syntax identical to the affine map +functions. In addition, an arbitrary \code{affine} may be applied to a +\code{screen}: +\findex{apply} +\begin{verbatim} + scr.shift(arg); // shift scr's contents by arg; etc. + scr.apply(f); // apply f to scr's contents +\end{verbatim} +To apply a composition of several maps to a \code{screen}, it's best +to build an \code{affine} map by composition, then \code{apply} the +map. Composing \code{affine}s is cheap; \code{apply}ing an +\code{affine} is costly in proportion to the number of elements in the +\code{screen}. + +Applying an \code{affine} to a \code{screen} has no effect on the +bounding box, \code{border}, or \code{backing}, and may move elements +outside the bounding box even if cropping is active. To ensure a +\code{screen}'s contents lie inside the bounding box, \code{crop} the +\code{screen} \emph{after} \code{apply}ing the \code{affine}(s). + +The sample file \filename{inverse.xp} uses \code{affine} maps to +depict branches of inverse functions in one variable, +\filename{symmetry.xp} depicts the permutation group~\teximath{S_3} +by its action on a regular hexagon. +\index{Screen|)} + + +\section{Drawing Attributes} + +\ePiX\ maintains drawing states for filled regions, paths, and text +objects. + + +\subsection{Filled Regions} + +\index{Filling} +\index{Path|(} +\index{Path!filled} +Filling is either on or off. When filling is active, closed paths are +filled with the current \emph{fill color}. +\findex{fill} +\findex{nofill} +\begin{verbatim} + fill(); // turn filling on + fill(color); // turn filling on, specify color + nofill(); // turn filling off, same as fill(false); +\end{verbatim} + + +\subsection{Paths} + +Paths and borders of filled regions are drawn with two \emph{pen}s, +each described by color and line width. The \emph{line pen} draws +all path-like objects. The \emph{base pen} does nothing unless it is +wider then the line pen, in which case it draws an ``underlayer'' or +``border'' on the line pen. +\findex{pen} +\begin{verbatim} + pen(len); // set line pen width + pen(color); // set line color, keep width + pen(color, len); // set color and width +\end{verbatim} +As usual, \code{len} may be either a length string or a \code{double}, +interpreted as a width in~\code{pt}. There are \code{base} functions +with the same signatures and analogous meanings for the base pen. + +The line width can be set with named declarations; the optional +argument sets the line color: +\findex{plain} +\findex{bold} +\findex{bbold} +\begin{verbatim} + plain([color]); // 0.4pt + bold([color]); // 0.8pt + bbold([color]); // 1.6pt +\end{verbatim} + + +\subsubsection*{Path Style} + +\index{Path!style} +By default, path-like objects are drawn with solid lines. Dashed, +dotted, and free-form path style patterns are also available. (The +\code{base} underlayer is always solid.) The page length of a pattern +defaults to 12~pt, but can be set. +\findex{line\_style} +\findex{dash\_size} +\begin{verbatim} + line_style(string); + dash_size(len=12); +\end{verbatim} +The path style is set with a WYSIWYG string of dashes, spaces, and +periods, representing a pattern of dashes, gaps, and dots. In the +sample styles below, the repeating units have the same page size, +12~pt. +\begin{center} + \input{pathstyle.eepic} +\end{center} +For brevity and uniformity, named commands are provided. +\findex{solid} +\findex{dashed} +\findex{dotted} +\begin{verbatim} + solid(); "-" dashed(); "- -" dotted(); " . " +\end{verbatim} +A sequence of \teximath{n}~dashes, spaces, and dots corresponds to a +dash/dot pattern in an interval divided into \teximath{n}~subintervals +of equal length. If the \teximath{i}th character is a dash or space, +the \teximath{i}th~subinterval is drawn solid or empty, +respectively. If the \teximath{i}th~character is a period, a dot is +placed at the midpoint of the \teximath{i}th~subinterval. + +This pattern is applied to a path-like object as follows. The page +length of each edge is divided by the current \code{dash\_size} and +the ceiling (next largest integer) taken. This many copies of the +current path style are scaled onto the edge. The first and last +characters are adjacent in repeated units. + +There are three inequivalent ways to adjust the dash length/dot +spacing in a non-line path: Change the \code{dash\_length}, create a +path with a different number of points, or use a longer, repetitive +pattern. For best results, the style string should not be longer than +about a dozen characters. + +If you need several dashed/dotted line styles in multiple figures, +it's best to define a custom header instead of hard-coding line +styles. See Section~\ref{section:extensions} for guidance. +\index{Path|)} + + +\subsection{Text Objects} + +\index{Labels|(emph} +\index{Labels!alignment} + +Two types of textual element may appear in a file: \emph{labels} (text +boxes) and \emph{markers} (\LaTeX\ symbols). A marker occupies a box +of zero size, and is placed at a specified Cartesian location. A label +has typographical size, and is usually offset from its Cartesian +location. For placement, an \emph{alignment point} is attached to each +label, and Cartesian coordinates position the alignment point. + +\subsubsection*{Labels} + +A label is printed as a \LaTeX\ box. By default, the alignment point +is its reference point, the intersection of the left edge and the +baseline, which is used by \LaTeX\ to position the box on the +page:\input{basepoint.eepic} + +\index{Labels!alignment|(} +The alignment point may be \emph{offset} manually by a specified +number of \code{pt}. Additionally, a label's location with respect to +the alignment point can be chosen with an optional \LaTeX-style +alignment option. This scheme allows labels to be placed easily where +they will not overlap other parts of the figure, and ensures labels +stay properly positioned when the size or aspect ratio of a figure +changes. +\findex{label} +\begin{verbatim} + label(P posn, P offset, string msg, [align]); + label(posn, msg); +\end{verbatim} +The first two components of the \code{offset} argument are numbers +of~\code{pt} to shift the alignment point right and up. The optional +\code{align} argument may be one---or an appropriate pair---of +\code{t}, \code{b}, \code{r}, or~\code{l} (top, bottom, right, left), +or~\code{c} (center). These alignment options specify the position of +the label \emph{relative to the Cartesian location}~\code{posn}, +namely they work \emph{opposite} to the way they work in \LaTeX. +\begin{center} + \input{alignment_lr.eepic}\qquad + \input{alignment.eepic} +\end{center} +\index{Labels!alignment|)} + +The \code{msg} argument is usually a snippet of \LaTeX\ code enclosed +in double quotes. \CXX~treats ``\verb+\+'' as an escape character, so +a double backslash is needed in the source to get a single backslash +in the output. For example, +\begin{verbatim} + label(P(0,0), P(2,-1), "$\\rho = \\sin\\theta$", br); +\end{verbatim} +positions an alignment point \code{2pt}~right and \code{1pt}~below the +(Cartesian) origin, and typesets the equation +\teximath{\rho=\sin\theta} below and to the right. + +\index{Labels!rotated} +\index{Angle units} +Labels can be rotated; the (counterclockwise) angle is set in current +angle units with the command \code{label\_angle(theta)}. For example, +a rotation angle of~90 degrees prints labels along a vertical +axis. Though label rotation has legitimate uses, it can make labels +more difficult to read, defeating their purpose. Do not use rotated +labels merely because they are available. As a practical matter, if an +output file contains rotated labels, the enclosing document must use +the \code{rotating} package. \code{elaps} automatically loads this +package. + +\index{Affine map!action on labels} +An \code{affine} behaves moderately intelligently when acting on a +marker or label. The mapping is applied to the label's location, and +the ``linear part'' is used to adjust the offset and label angle. No +attempt is made to treat alignment. For best results, if a +\code{screen} will have an \code{affine} applied to it, label +positions should be fine-tuned only with offsets, not alignment +arguments. In all situations, the font itself is unchanged; no +attempt is made to print sheared, scaled, or reflected text. The +sample file \filename{inverse.xp} illustrates the effect of affine +maps on labels. + + +\subsubsection*{Fonts and Type Size} + +\index{Fonts} +\index{Labels!fonts in} +By default, the font in an \ePiX\ figure is that of the enclosing +document. The font size and face are changed with +``declaration-style'' commands such as +\findex{font\_size} +\findex{font\_face} +\begin{verbatim} +font_size("Large"); +font_face("sc"); +\end{verbatim} +The argument of \verb+font_size+ is a valid \LaTeX\ size. If no +argument is given, \code{normalsize} is understood. \verb+font_face+ +accepts a two-letter string, appended to the string ``\code{text}'' to +give a \LaTeX\ font declaration command (``\code{textsc}'' above). +Finer-grained control is accomplished by placing \LaTeX\ commands +into the label text. + + +\subsubsection*{Label Attributes and Masked Labels} + +Each label command has a corresponding ``mask'' version +(\code{masklabel}) that draws an opaque rectangle under the label +text. The mask size exceeds the label's size by an amount of +\emph{padding}, and the mask is itself surrounded by a rectangular +\emph{border}, of specified color and width. +\findex{label\_color} +\findex{label\_mask} +\findex{label\_pad} +\findex{label\_border} +\findex{no\_label\_border} +\begin{verbatim} + label_color(color); // set label text color + label_mask(color=White()); // set mask color + label_pad(string len); + + label_border(color, [len]); // set color (and line width) + label_border(len); // set line width only + no_label_border(); // turn off label borders +\end{verbatim} + + +\subsubsection*{Markers} + +\index{Marker types|(} +\ePiX's marker types, listed in Table~\ref{table:marker}, are obtained +with the command \verb+marker(P pt, <MARKER TYPE>);+ Several +``dot-like'' marker types are available by name: \input{dots.eepic} +\findex{spot} +\findex{dot} +\findex{ddot} +\findex{box} +\findex{bbox} +\findex{ring} +\findex{circ} +\begin{verbatim} + spot(P pt); dot(P pt); ddot(P pt); + --- box(P pt); bbox(P pt); + ring(P pt); circ(P pt); --- +\end{verbatim} +A \code{circ} is filled with the current \code{mask\_color}, and a +\code{ring} is ``hollow''. Each dot-like marker can also be called +with label syntax, generating a labeled marker with one command. +\begin{verbatim} + dot(P posn, offset=P(0,0), msg="", align=none); // etc. +\end{verbatim} + +\findex{dot\_size} +By default, \code{spot}~and \code{ring} are 4~pt in diameter; +\code{dot}, \code{box}, and~\code{circ} are 3~pt in diameter; +\code{ddot}~and \code{bbox} are 2~pt in diameter. At arbitrary +diameter, a \code{spot} is \teximath{4/3}~the diameter of a~\code{dot} +and a~\code{ddot} is \teximath{2/3}~the diameter. The command +\code{dot\_size(diam=3)} sets the diameter of a \code{dot}, and hence +the size of all dot-like markers. + +\begin{table}[tb] + \begin{center} + \input{marker.eepic} + \end{center} + \caption{\ePiX's \code{marker} types.} + \label{table:marker} +\end{table} +\index{Marker types|)} + + + +\subsubsection*{Reminders} + +When constructing and placing a label, +\begin{itemize} +\item Offsets are specified in \code{pt} (true length), not Cartesian + units: A label's location relative to its alignment point should not + depend on the logical or printed size of the figure. + +\item The label text is enclosed in double quotes (the single + character~\code{"}), and contains the \LaTeX\ code to generate the + label. Backslashes are doubled. + \index{Labels!backslash in} + \index{Labels!in double quotes} +\end{itemize} +\index{Labels|)} + + +\subsection{Color Declarations} + +Old-style color declarations set the fill color, line color, and +text color. +\findex{rgb} +\findex{cmyk} +\begin{verbatim} + rgb(r, g, b); cmyk(c, m, y, k); + rgb(P); cmyk(P); // for function-controlled colors + red(d); // similarly for other primaries +\end{verbatim} +\index{Color|)} + + +\section{Creating and Drawing Objects} + +Scene elements include geometric objects, coordinate grids, axis +labels, and function plots. A few commands create an object (a point, +line segment, circle, sphere, or plane) that can be used in subsequent +computations, but most drawing commands automatically create, draw, +and discard objects. + + +\subsection{Geometric Data Structures} + +\index{Point|(} +The simplest object in the world, and by far the most common named +data structure, is~\code{P}, an ordered triple of real numbers +(double-precision floats). The function~\code{P(x1,x2,x3)} creates the +point~\teximath{(x_1,x_2,x_3)}. If only two arguments are provided, +\teximath{x_3=0} by default. This convention allows \ePiX\ to treat +2-~and 3-dimensional figures uniformly. The standard basis is +available: \code{E\_1=P(1,0,0)}, etc. + +Depending on context, a \code{P} may represent either a +\emph{location} (point) or a \emph{displacement} (vector). Almost all +\ePiX\ functions treat a~\code{P} as a point. However, algebraic +operators and commands that plot vector fields treat \code{P} +arguments as displacements. + +Polar, cylindrical, and spherical coordinate \code{P}~constructors are +sensitive to the current angular mode. +\index{Angular mode} +\findex{P} +\findex{polar} +\findex{cis} +\findex{cyl} +\findex{sph} +\begin{verbatim} + P pt=polar(r,t); // (r*Cos(t), r*Sin(t), 0) + P pt=cis(t); // (Cos(t), Sin(t), 0) = polar(1, t) + P pt=cyl(r,t,z); // (r*Cos(t), r*Sin(t), z) + P pt=sph(r,t,phi); // polar(r,t)*Cos(phi) + (0,0,r*Sin(phi)) +\end{verbatim} + +Algebraic operations---addition/subtraction, scalar multiplication; +scalar, cross, and componentwise products; orthogonalization---can +be performed on~\code{P}s. In compound expressions, the binary +operators below should be enclosed in parentheses, and scalars must be +collected at left, \code{P}s at right. +\findex{P.x1} +\findex{P.x2} +\findex{P.x3} +\findex{J} +\begin{verbatim} + double u=pt.x1(); // first coordinate of pt, etc. + P(a,b,c)|P(x,y,z); // scalar product, ax+by+cz + P(a,b,c)&P(x,y,z); // componentwise product (ax, by, cz) + P(a,b,c)*P(x,y,z); // cross product (bz-cy, cx-az, ay-bx) + J(p); // quarter turn about the x3-axis + p%q; // orthogonalization, p (mod q) +\end{verbatim} +Explicitly, \code{p\%q}~is the unique vector \code{p+k*q} +perpendicular to~\code{q}. + +\code{P}~operations express mathematical relationships, and therefore +imbue a figure with logical structure, making the input file easier to +read, modify, and maintain. Commonly, a file preamble will define a +few named points with hard-coded coordinates, then define additional +points of interest using \code{P}~operators. +\index{Point|)} + + +\subsubsection*{Other Geometric Classes} + +In addition to~\code{P}, objects of type \code{Circle}, \code{Plane}, +\code{Segment}, and \code{Sphere} can be used for Euclidean geometry +constructions. Simple affine operations are supplied for each type, as +is a \code{draw()} function, which represents the object as a path in +the screen. +\findex{shift} +\findex{move\_to} +\findex{scale} +\findex{draw} +\begin{verbatim} + obj.shift(P arg); // translate by arg + obj.move_to(P arg); // move center to arg + obj.scale(double c); // scale about center by c + obj.draw(); +\end{verbatim} +A \code{Segment}'s ``center'' is its midpoint. A \code{Plane} has no +center; \code{move\_to} translates the \code{Plane} to pass through +\code{arg}, and \code{scale} has no effect. + +\index{Circle} +A \code{Circle} data structure consists of a center, radius, and a +perpendicular unit vector. Three constructors are provided: +\findex{Circle} +\begin{verbatim} + Circle(center=P(0,0,0), double rad=1, normal=E_3); + Circle(P center, P point); + Circle(P p1, P p2, P p3); +\end{verbatim} +The second constructor creates the \code{Circle} parallel to the +\teximath{(x_1,x_2)}~plane, with given center, and radius equal to the distance +between the arguments. (A warning is printed if the second argument +does not lie on the circle, namely, if the arguments do not lie in a +plane parallel to the \teximath{(x_1,x_2)}~plane.) The third returns the +\code{Circle} passing through the given points; the points must not be +collinear. + +The data defining a \code{Circle} are recovered with member functions +named \code{center()}, \code{radius()}, and \code{perp()}. + +\index{Plane} +\findex{Plane} +A \code{Plane} is specified by a point and normal vector, or by three +non-collinear points. The \code{draw()} function clips the plane and +draws the resulting polygon. Unless the clip box has been set +manually, the clipped polygon's vertices will have large coordinates. + +\index{Segment} +\findex{Segment} +A \code{Segment} is constructed from its endpoints. The member +function \code{midpoint()} returns the center. + +\index{Sphere} +\findex{Sphere} +A \code{Sphere} is specified by a point and a radius---by default the +origin and unity, or by the center and a point on the sphere. Member +functions \code{center()}~and \code{radius()} return the defining +data. Capabilities specific to geography and spherical geometry are +described below, pp.~\pageref{non-eucl}ff. + +The \code{draw()} function of a \code{Sphere} draws the horizon +visible from the current viewpoint. While this horizon is a circle in +object space, its image in the screen is generally an ellipse. +Antipodal points are not generally mapped to points symmetrically +placed with respect to the center of this ellipse. These effects are +most pronounced when the viewpoint is close to the \code{Sphere} and +the center is not close to the \code{target}. + + +\subsubsection*{Intersection} + +\index{Intersection} + +To facilitate geometric computation, \ePiX's \code{Circle}, +\code{Plane}, \code{Segment}, and \code{Sphere} classes can be +intersected with the \code{*}~operator. +\texicomment +Table~\ref{table:intersect} +lists the return types for each pair of arguments. Intersection is +commutative, so only the top half of the table is shown. For purposes +of intersection, a \code{Segment} is extended into a line. +The sample file \filename{pascal.xp} gives typical applications of +objects and intersection. +\findex{intersection} +\begin{table}[hbt] +\begin{center} + \begin{tabular}{c|cccc} + \code{*} & + \code{Segment} & \code{Circle} & \code{Plane} & \code{Sphere} \\ + \hline + \code{Segment} & \code{P} & \code{Segment} & \code{P} & \code{Segment} \\ + \code{Circle} & & \code{Segment} & \code{Segment} & \code{Segment} \\ + \code{Plane} & & & \code{Segment} & \code{Circle} \\ + \code{Sphere} & & & & \code{Circle} + \end{tabular} + \caption{Object intersection types.} + \label{table:intersect} +\end{center} +\end{table} +\texicommentend + +A \code{Circle} has a center, radius, and unit normal; a \code{Plane} +has a distinguished point and unit normal; a \code{Segment} has two +endpoints; a \code{Sphere} has a center and radius. An object is +\emph{malformed} if these conditions are not met. The constructors +return well-formed objects with two exceptions: \code{Circle} and +\code{Plane} create malformed objects if called with three collinear +points. The operator~\code{*} returns a malformed object if either +argument is malformed, or if the operands are disjoint, tangent, or +coincident. Malformedness is benign: Calling \code{draw()} on a +malformed object does nothing. + + +\subsubsection*{Orthonormal Frames} + +A \code{frame} comprises three mutually perpendicular unit +vectors. The constructor takes three vectors. The \code{frame}'s third +vector~\teximath{e_3} is positively proportional to~\code{v3}, the +second vector~\teximath{e_2} is positively proportional to +\code{v2\%v3}, and the first is the cross product, +\teximath{e_1=e_2\times e_3}. Thus, a \code{frame} is right-handed, +and does not depend on~\code{v1}. + +The elements of a \code{frame} are named \code{sea}, \code{sky}, and +\code{eye}, just as for the \code{camera}. A \code{frame} can be +rotated through an arbitrary angle about any of its elements. +\findex{frame} +\begin{verbatim} + frame(); // the standard basis {E_1, E_2, E_3} + frame fr(v1, v2, v3); // orthonormalize {v1, v2, v3} + fr.sea(); // the first element of fr, etc. + fr.rot1(theta); // rotate fr through theta about sea, etc. +\end{verbatim} + + +\subsection{Path-Like Elements} + +Basic path-like objects are drawn with named commands. Arguments of +polygon commands are endpoints/vertices. Except for \code{line}~and +\code{Line}, the following are subject to filling. +\findex{line} +\findex{Line} +\findex{triangle} +\findex{rect} +\findex{quad} +\findex{circle} +\begin{verbatim} + line(P p1, P p2, [double expand]); + Line(p1, p2); // draw line through p1, p2 (crop required) + triangle(P p1, P p2, P p3); + rect(P p1, P p2); + quad(P p1, P p2, P p3, P p4); // quadrilateral + circle(ctr=P(0,0,0), rad=1, normal=E_3); + circle(ctr, pt); + circle(pt1, pt2, pt3); +\end{verbatim} +The optional \code{line} argument is an expansion parameter: +\code{line(p1,p2,t);} draws a segment centered at the midpoint of +\code{p1}~and \code{p2}, with length scaled +by~\teximath{2^{t/100}}. (Setting \teximath{t=100} doubles the length, +while \teximath{t=-100} halves the length.) The arguments of +\code{rect()} must lie in a plane parallel to a coordinate plane. The +arguments to \code{circle} commands are the same as for \code{Circle} +constructors. + +Quadratic and cubic splines are described by their control points. A +list of~\code{P} is drawn as a ``natural'' spline (the \teximath{C^2} +piecewise cubic curve with vanishing second derivatives at the +endpoints); the number of points per cubic segment must be specified. +Circular and elliptical arcs are given by center, a basis, angular +range, and an optional number of intervals. +\findex{spline} +\findex{arc} +\findex{ellipse} +\begin{verbatim} + spline(P p1, P p2, P p3, [int n]); // quadratic + spline(P p1, P p2, P p3, P p4, [int n]); // cubic + spline(vector<P>, int n); // natural spline + + arc(P ctr, rad, t_min, t_max); // parallel to (x1,x2)-plane + ellipse(P ctr, P v1, P v2); // in plane spanned by v1, v2 + ellipse(P ctr, P v1, P v2, t_min, t_max, [int n]); +\end{verbatim} +\texicomment +Mathematically, these commands draw parametric paths +\begin{align*} + \text{Spline:}\quad&(1-t)^2 p_1 + 2(1-t)t p_2 + t^2 p_3, + && t\in[0,1] \\ + \text{Spline:}\quad&(1-t)^3 p_1 + 3(1-t)^2t p_2 + 3(1-t)t^2 p_3 + t^3p_4, + && t\in[0,1] \\ + \text{Arc:}\quad&\mathrm{ctr} + (\cos t)(\mathrm{rad},0,0) + + (\sin t)(0,\mathrm{rad},0), + && t\in[t_\mathrm{min}, t_\mathrm{max}] \\ + \text{Ellipse:}\quad&\mathrm{ctr} + (\cos t)v_1 + (\sin t)v_2, + && t\in[t_\mathrm{min}, t_\mathrm{max}]. +\end{align*} +\texicommentend +If parameter bounds are omitted in an \code{ellipse} command, the +entire ellipse is drawn. When the angular range subtends one or more +full turns in an \code{arc}~or \code{ellipse} the curve is subject to +filling. + +Commands for planar (half-)ellipses remain from \ePiX's early days: +\findex{ellipse} +\findex{ellipse\_left} +\findex{ellipse\_right} +\findex{ellipse\_top} +\findex{ellipse\_bottom} +\begin{verbatim} + ellipse(P ctr, P radius); + ellipse_left(P ctr, P radius); + ellipse_right(P ctr, P radius); + ellipse_top(P ctr, P radius); + ellipse_bottom(P ctr, P radius); +\end{verbatim} +If \code{radius} is \code{P(a,b)}, these commands draw all or half of +the ellipse with given center in the \teximath{(x_1,x_2)} plane, axes +parallel to the coordinate axes, and axis lengths \teximath{2a}~and +\teximath{2b}. + +Two commands are available to mark off right angles or a subtended +angle. Each accepts a spatial location and two non-zero directions, +and draws a scene element in the plane spanned by the vectors. +\findex{right\_angle} +\findex{arc\_measure} +\begin{verbatim} + right_angle(P loc, P v1, P v2, scale=8); + arc_measure(P loc, P v1, P v2, scale=8); + arc_measure(P loc, P v1, P v2, offset, text, align, scale=8); +\end{verbatim} +The \code{right\_angle} command does not check its arguments for +perpendicularity. The \code{arc\_measure} commands mark the +\emph{small} angle subtended by the directions; the label form places +a label at the midpoint of the arc. The (optional) \code{scale} +argument is the true size in~\code{pt} of the marker. + + +\subsubsection*{Recursive Fractal Curves} + +\index{Path!fractal} +Consider a path made up of equal-length segments that can point at any +angle of the form~\teximath{2\pi k/n} radians, for \teximath{0\leq +k<n}, like spokes on a wheel. A path is specified by a finite sequence +of integers, taken modulo~\teximath{n}. For example, if +\teximath{n=6}, then the sequence \teximath{0, 1, -1, 0} corresponds +to the ASCII path \verb+_/\_+. \ePiX's fractal approximation starts +with such a ``seed'' then recursively (up to a specified depth) +replaces each segment with a scaled and rotated copy of the seed, +Figure~\ref{fig:fractal}. The seed above generates the standard +von~Koch snowflake fractal. In code: +\findex{fractal} +\begin{verbatim} + const int seed[] = {6, 4, 0, 1, -1, 0}; + fractal(P(a,b), P(c,d), depth, seed); +\end{verbatim} +The first entry of \code{seed[]} (here~6) is the number of +``spokes''~\teximath{n}, the second~(4) is the number of terms in the +seed, and the remaining entries are the seed proper. The final path +joins \teximath{(a,b)}~to \teximath{(c,d)}. The number of segments in +the final path grows exponentially in the depth, so depths larger than +5~or 6 are likely to exceed the capabilities of \LaTeX\ and/or +PostScript. +\begin{figure}[hbt] + \begin{center} + \input{koch.eepic} + \end{center} + \caption{Successive iterations of \{\code{4,8,0,1,0,3,3,0,1,0}\}} + \label{fig:fractal} +\end{figure} + + +\subsubsection*{Arrows} + +\index{Arrow} +Line segments, splines, and arcs can be drawn with arrowheads at one +end. In profile, an arrowhead's width is \code{3pt}, and its height +is 5.5~times the width. The actual printed height depends on the +head's orientation with respect to the camera. By default, an +arrowhead is a filled triangle. The shape and size are adjusted with +declarations: +\findex{arrow\_width} +\findex{arrow\_ratio} +\findex{arrow\_inset} +\begin{verbatim} + arrow_width(w=3); // width in pt + arrow_ratio(r=5.5); // height-to-width + arrow_inset(c=0); // base indent as frac of ht +\end{verbatim} +\input{arrow.eepic} Inset\teximath{=0}\qquad +\input{arrow25.eepic} Inset\teximath{=0.25}\qquad +\input{arrow50.eepic} Inset\teximath{=0.5} \\ +The \code{inset} must be between \teximath{-1}~and \teximath{1}. Each +\code{arrow} command accepts an optional \code{scale} argument, which +scales the arrowhead. +\findex{arrow} +\begin{verbatim} + arrow(P tail, P tip, [scale]); + arrow(P p1, P p2, P p3, [scale]); // spline arrows + arrow(P p1, P p2, P p3, P p4, [scale]); + arrow(P ctr, P v1, P v2, t_min, t_max, [scale]); // ellipse +\end{verbatim} +A few ``special-purpose'' commands are supplied: +\findex{dart} +\findex{aarrow} +\findex{arc\_arrow} +\begin{verbatim} + dart (P p1, P p2); // same as arrow(p1, p2, 0.5); + aarrow(P p1, P p2); // double-headed arrow <---> + arc_arrow(ctr, rad, t_min, t_max, [scale]); +\end{verbatim} +If an \code{arc\_arrow} is too short, nothing is drawn. + + +\subsection{Coordinate Axes and Labels} + +\index{Labels!axis|(} +\index{Axes!labeling} +\index{Axes|(} +\ePiX\ provides an \code{axis} class for coordinate axes. Labels are +generated automatically in a variety of styles: decimal, scientific +notation, fraction, and trigonometric fraction. Logarithmic axes and +labels are available. Axis and labeling commands from Version~1.0 have +been retained. + + +\subsubsection*{The \code{axis} Class} + +An \code{axis} consists of a line segment divided into a specified +number of equal-length subintervals by ``major'' (long) tick marks. +Each subinterval may be divided further by ``minor'' (short) tick +marks. Minor ticks may be equally-spaced (``Cartesian'') or +logarithmically placed. Finally, a label is written at each major tick +mark with specified offset and alignment. Labels are generated +automatically from the endpoints, so the line should be parallel to a +coordinate axis. Label attributes (masking, borders, font size and +face, rotation angle) are determined by the current label style, not +by the \code{axis}. + +The command +\findex{axis} +\begin{verbatim} + axis(P tail, P head, int n, P offset=P(0,0), [align = none]); +\end{verbatim} +creates an axis joining \code{tail} to \code{head}, divided into +\code{n}~segments of equal length, with a major tick mark and label at +each division point and endpoint. The \code{offset} and \code{align} +arguments have the same meaning as for ordinary labels. + +The number and length of minor ticks, and the alignment of ticks, are +controlled with member functions: +\findex{axis.subdivide} +\findex{axis.tick\_ratio} +\findex{axis.align} +\begin{verbatim} + axis Ax(P(a,c), P(b,c), n); + Ax.subdivide(n); // put n-1 minor ticks in each axis segment + Ax.tick_ratio(r); // minor length = r*major length + Ax.align(AL=c); // align all ticks; AL = t, b, l, r, or c +\end{verbatim} +By default, major ticks are \code{6pt}~long and twice the length of +minor ticks. The global declaration \code{tick\_size(len)} sets the +major length, subject to ``reasonable stylistic limits''. For visual +consistency, tick lengths should not be changed casually. + +\index{Axes!labeling} +Labels on an \code{axis} may be drawn in several styles, selected with +member functions: +\findex{axis.dec} +\findex{axis.frac} +\findex{axis.trig} +\findex{axis.sci} +\findex{axis.unmark} +\findex{axis.precision} +\findex{axis.align\_labels} +\begin{verbatim} + Ax.dec(); // decimals (default) + Ax.frac(); // fractions, e.g. 0.5 -> \frac{1}{2} + Ax.trig(); // fractional multiples of \pi + Ax.sci(); // scientific notation, k\times base^N + + Ax.unmark(double); // remove label at selected location + Ax.precision(p); // set number of digits for decimal labels + Ax.align_labels(AL); // re-align labels +\end{verbatim} +Arbitrary textual labels depending on one coordinate are obtained by +writing a \code{string}-valued function of~\code{double} and +``registering'' it: +\findex{axis.label\_rep} +\begin{verbatim} + // f represents x as a string in given precision and base + std::string f(double x, unsigned int prec, unsigned int base); + Ax.label_rep(f); +\end{verbatim} +For example, textual tags can be printed instead of numeric labels. + +By default, an \code{axis} is Cartesian. The member function +\code{log(int b=10)} converts an \code{axis} to ``log mode'' with +specified base; this affects both tick marks and labeling. If \code{b} +is at least~3, minor tick marks appropriate for a logarithmic axis +base~\code{b} are drawn. Second, labels are written in decimal or +scientific notation appropriately for a logarithmic axis; that is, +``\teximath{k\times b^N}'' (or its decimal value) is written at +location \teximath{N+\log_b k}. + +Minor ticks of a log \code{axis} may be labeled individually; again, +this is controlled with member functions: +\findex{axis.tag} +\findex{axis.tag235} +\findex{axis.tags} +\findex{axis.untag} +\begin{verbatim} + Ax.tag(d); // labels at N+log_b(d) + Ax.tag235(); // tag 2, 3, and 5 if b=10 + Ax.tags(); // tag 1, ..., b-1 + Ax.untag(); // remove all tags, including 1 + Ax.untag(double); // remove one tag, e.g. Ax.untag(9); +\end{verbatim} + +For convenience, an \code{axis} object along an edge of the active +\code{screen} can be created with a named command: +\findex{top\_axis} +\findex{bottom\_axis} +\findex{left\_axis} +\findex{right\_axis} +\begin{verbatim} + top_axis(n, offset, align); + bottom_axis(n, offset, align); + left_axis(n, offset, align); + right_axis(n, offset, align); +\end{verbatim} +The ticks automatically point into the bounding box. + +The functions above create objects or set \code{axis} attributes, but +write no output. Tick marks and labels can be printed separately, or +at once: +\findex{axis.draw} +\findex{axis.draw\_ticks} +\findex{axis.draw\_labels} +\begin{verbatim} + Ax.draw(); // axis, tick marks, and labels + Ax.draw_ticks(); // axis and ticks only + Ax.draw_labels(); +\end{verbatim} + + +\subsubsection*{Other Axis-Drawing Commands} + +\index{Axes!logarithmic} +\ePiX\ formerly supplied commands for drawing simple axes and their +labels. These commands have been kept for compatibility. Horizontal +axes are generated with +\findex{h\_axis} +\findex{h\_log\_axis} +\findex{v\_axis} +\findex{v\_log\_axis} +\begin{verbatim} + h_axis(p1, p2, n, align=c); // n subintervals (n+1 ticks) + h_log_axis(p1, p2, n, align=c, base=10); +\end{verbatim} +For vertical axes, use \code{v\_axis}. The style of tick mark is +appropriate for an axis of the given type. Horizontal axis tick marks +may be aligned \code{t}~(above the axis) or~\code{b} +(below). Similarly, vertical axis ticks may be aligned \code{r}~or +\code{l}. + +The endpoint arguments of a coordinate axis may be omitted, in which +case they default to \teximath{p_1=(x_\mathrm{min},0)} and +\teximath{p_2=(x_\mathrm{max},0)} for a horizontal axis, or to +\teximath{p_1=(0,y_\mathrm{min})} and +\teximath{p_2=(0,y_\mathrm{max})} for a vertical axis. If the bounding +box has integer width and/or height, omitting the number of points +draws tick marks one unit apart. + +Labels for a horizontal Cartesian or logarithmic axis are generated +with the commands +\findex{h\_axis\_labels} +\findex{h\_axis\_masklabels} +\findex{h\_axis\_log\_labels} +\findex{h\_axis\_log\_masklabels} +\findex{v\_axis\_labels} +\findex{v\_axis\_masklabels} +\findex{v\_axis\_log\_labels} +\findex{v\_axis\_log\_masklabels} +\begin{verbatim} + h_axis_labels(P p1, P p2, int n, P offset, [align]); + h_axis_masklabels(p1, p2, n, offset, [align]); + h_axis_log_labels(p1, p2, [n], offset, [align], base=10); + h_axis_log_masklabels(p1, p2, [n], offset, [align], base=10); +\end{verbatim} +Labels for a vertical axis are generated with \code{v\_axis\_labels}, +etc. The labels are automatically generated to match their horizontal +location. The first puts \teximath{(n+1)}~evenly-spaced labels on the segment +joining \code{p1}~and \code{p2}. As with ordinary labels, the +\code{offset} is in~\code{pt}, and the optional \LaTeX-style alignment +option positions the labels using their corners. The second command +draws masked labels according to the current label masking +attributes. The third writes labels in exponential notation, using the +Cartesian coordinate as exponent. + +As for coordinate axes, the initial and final points may be omitted in +an \code{axis\_[mask]labels} command, with the same defaults. The +\code{offset} and number of labels must always be specified. + + +\subsubsection*{Broken Axes} +\index{Axes!broken} + +Broken axes are best drawn using page layout, especially if axis +labels are to be drawn. To accomplish the task, create a screen for +each piece of axis, using appropriate Cartesian coordinates for the +corners, then \code{inset} the screens so the axis pieces are nearly +end to end. A zig-zag glyph signifies the break: +\findex{axis\_break} +\begin{verbatim} + axis_break(P, P, scale=12); +\end{verbatim} +The \code{P} arguments are the screen coordinates of the ends to be +joined; the optional third argument is the true height and width +in~\code{pt} of the glyph. The sample file \filename{coord\_tricks.xp} +uses layout and axis breaks. + + +\subsubsection*{Coordinate Grids} + +Cartesian grids fill a coordinate rectangle, and have a specified +number of lines in each direction. A polar grid has specified radius, +and numbers of rings and sectors. +\findex{grid} +\findex{polar\_grid} +\begin{verbatim} + grid(n1, n2); // fills the bounding box + grid(p1, p2, n1, n2); // fills the box with corners p1, p2 + polar_grid(r, n1, n2); +\end{verbatim} + +Log and semi-log grids are drawn with analogous syntax: +\findex{log\_grid} +\findex{log1\_grid} +\findex{log2\_grid} +\begin{verbatim} + log_grid (p1, p2, n1, n2, [base1], [base2]); // log-log + log1_grid(p1, p2, n1, n2, [base]); // log-lin + log2_grid(p1, p2, n1, n2, [base]); // lin-log +\end{verbatim} +The~\teximath{n_i} arguments dictate the number of squares, namely the number +of orders of magnitude spanned in the logarithmic direction(s). The +(optional) base arguments default to~10, and control the number of +lines drawn per order of magnitude. As with Cartesian grids, the +corners are optional; if omitted, the grid fills the bounding box. + +\index{Graph paper} +Graph paper may be created by superimposing grids: +\texicomment +\begin{center} + \begin{minipage}[b]{2.5in} + \begin{footnotesize} +\texicommentend +\findex{pen} +\findex{grid} +\begin{verbatim} + pen(0.25); + grid(10*xsize(), 10*ysize()); + pen(0.5); + grid(2*xsize(), 2*ysize()); + pen(1); + grid(xsize(), ysize()); +\end{verbatim} +\texicomment + \end{footnotesize} + \end{minipage} + \qquad + \input{graphpaper.eepic} +\end{center} +\index{Axes|)} +\texicommentend + +\subsection{The Path Class} + +\index{Path!class} +A \code{path} data structure is an ordered list of points that can be +cropped, clipped, mapped, concatenated, and drawn. The first four +constructors mirror polygon-drawing commands above. Function graphs +and parametric paths are built from a real- or \code{P}-valued +function~\code{f} of one variable. +\findex{path} +\begin{verbatim} + path(p1, p2, expand=0); // line (endpoints) + path(p1, p2, p3, [n]); // quadratic spline + path(p1, p2, p3, p4, [n]); // cubic spline + path(p1, v1, v2, t_min, t_max, [n]); // ellipse + path(f, t_min, t_max, [n]); +\end{verbatim} + +The member function \code{pt()} accepts a~\code{P} or three (or two) +doubles and appends the specified point to a \code{path}. This +snippet creates a regular \teximath{n}-gon: +\begin{verbatim} + path ngon; // declare new path + for (int i=0; i<=n; ++i) + ngon.pt(cis(i*full_turn()/n)); // works in all angle modes +\end{verbatim} +Compound paths may be built by concatenation. If \code{path1}~and +\code{path2} share an endpoint, the commands +\begin{verbatim} + path1 += path2; + path1 -= path2; +\end{verbatim} +replace \code{path1} with the result of traversing \code{path1} +``forward'', then following \code{path2} in the forward or reverse +direction (respectively). For expected results, the first +(or last) point on~\code{path2} should be the last point +of~\code{path1}. The notation suggests 1-dimensional homology +chains. The sample file \filename{contour.xp} illustrates path +creation and manipulation. + +A \code{path} is a data structure, and must be drawn explicitly to +create visible output. By default a \code{path} is not a closed loop +(even if the first and last points are the same), and is not filled +when drawn. Member functions perform these tasks. Continuing the +\teximath{n}-gon snippet above, +\findex{path.close} +\findex{path.fill} +\findex{path.draw} +\begin{verbatim} + ngon.close(); // mark path as closed + ngon.fill(); // draw filled region if filling is active + ngon.draw(); // print to the screen +\end{verbatim} +\code{path::close()} adds a closing edge if necessary. Once a +\code{path} is closed, no more points can be added. A closed path +clips and crops differently than an open \code{path} with the same +data. \code{path::fill()} has no effect on an unclosed \code{path}. + + +\subsection{Function Plotting} + +\index{Plotting|(} +The noun ``map'' refers to a \CXX\ function that accepts one or +more \code{double} arguments and returns a \code{double}~or +a~\code{P}. Mathematically, a map can be depicted in two ways: as a +graph (which retains information about the domain), or as a +parametrized curve or surface (which discards domain +information). \ePiX\ assumes that \code{double}-valued maps are +graphed and \code{P}-valued maps are drawn parametrically. Either sort +of depiction is called a ``plot''. \ePiX\ plots are either ``wire +mesh'', produced by a \code{plot} command, or ``shaded'', produced by +a \code{surface} command. + + +\subsubsection*{Basic Plotting} + +For the moment, ``function'' means ``function of one variable'' +(precisely, a \code{double}-valued function of a \code{double} +variable). A function graph depends on the domain and the number of +points to use. Each of the commands +\findex{plot} +\findex{polarplot} +\findex{shadeplot} +\begin{verbatim} + plot(f, t_min, t_max, n); + polarplot(f, t_min, t_max, n); + shadeplot(f, t_min, t_max, n); +\end{verbatim} +graphs the function~\code{f} on the interval \code{[t\_min, t\_max]} +by dividing the interval into \code{n}~subintervals of equal length. +The first gives a Cartesian plot, the second a polar plot with bounds +in current angular units, the third shades the region between the +graph and the horizontal axis. If two functions are given to +\code{shadeplot}, the region between their graphs is shaded. + + +\subsubsection*{Domains and Wiremesh Plots} + +\index{Domain|(} +An \ePiX\ \code{domain} is a coordinate box of dimension one, two, or +three, specified by a pair of opposite corners and two \emph{meshes} +(``coarse'' and ``fine'', respectively) which specify the amount of +data to be plotted. Plotting is explained in detail below. +\findex{domain} +\begin{verbatim} + // [a1,a2] x [b1,b2]: n1 x n2 rectangles, m1 x m2 intervals + domain R2(P(a1,b1), P(a2,b2), mesh(n1,n2), [mesh(m1,m2)]); + + // [a1,a2] x [b1,b2] x [c1,c2] divided analogously + domain R3(P(a1,b1,c1), P(a2,b2,c2), + mesh(n1,n2,n3), [mesh(m1,m2,m3)]); +\end{verbatim} +If unspecified, the fine mesh is the same as the coarse mesh. For +expected behavior, the coarse mesh should ``divide'' the fine mesh, in +that \teximath{m_i}~should be a (usually small) integer multiple +of~\teximath{n_i} for each~\teximath{i}. + +A \code{domain} may be \emph{resized} in any coordinate for which the +thickness is positive, and can be \emph{sliced} by setting one +variable to a constant. The result of slicing is a \code{domain} whose +dimension is one smaller than the original. Finally, +``\code{slices}'' operators return the list of \code{domain}s obtained +by setting one variable to evenly-spaced constants. By default, the +number of slices is specified by the coarse mesh. An optional argument +specifies the number of slices. This argument need not be related to +the coarse mesh. +\findex{domain.resize} +\findex{domain.slice} +\findex{domain.slices} +\begin{verbatim} + R2.resize2(a,b); // [a1,b1] x [a,b] + R2.slice1(t); // set x1 = t + R3.slices3([n]); // (n+1) domains with x3 = const +\end{verbatim} +\begin{center} + \input{slices.eepic} +\end{center} +\smallskip +When possible, resizing preserves grid square sizes. Generally, +though, integer truncation occurs: If \code{R=domain(P(0,0), P(1,1), +mesh(10,6))}, then \code{R.resize1(0,0.25)} is the rectangle +\teximath{[0,0.25]\times[0,1]} subdivided into \teximath{2\times6} +subrectangles, since \teximath{10\div4=2} in integer arithmetic. For +expected behavior, choose mesh sizes to avoid integer truncation. + + +The arguments of a \code{plot} command are a map, followed by either a +domain or its logical equivalent. +\findex{plot} +\begin{verbatim} + double f(double t) { return t*t; } + P F(double u, double v) { return P(u, v, exp(u)*Sin(v)); } + P G(double u, double v, double w) { return P(v*w, u*w, u*v); } + + plot(f, a, b, n); // f:[a,b] -> R, using n intervals + plot(F, R2); // graph of exp(u)*Sin(v) + plot(G, R3.slice2(0.5); // G: R^3 -> R^3 restricted to y=0.5 +\end{verbatim} +By (compiler-enforced) convention, \code{plot} commands involving a +\code{P}-valued map accept a \code{domain} argument, as in the second +and third commands above. To plot a \code{double}-valued function, by +contrast, supply the logical equivalent of a \code{domain}, usually +the endpoints and the number of intervals, as in the first \code{plot} +command above. + +Resizing and slicing allow a map~\code{F} to be plotted selectively +over parts of its domain. This can be used to emphasize parts of the +image, layer scene elements, patch surfaces together, and so forth. +Resize and slice(s) commands may be used directly in a \code{plot} +command: +\findex{plot} +\begin{verbatim} + plot(F, R2.resize1(0,0.5)); + plot(F, R2.slices1()); +\end{verbatim} + + +\subsubsection*{Meshes and Plotting} + +The \code{P}~arguments of a \code{domain} are a pair of opposite +corners. The first \code{mesh} argument, the \emph{coarse} mesh, +specifies the number of subdivisions in each coordinate direction. +The second \code{mesh}, the \emph{fine} mesh, determines the number of +points used in each direction when plotting. + +\begin{comment} +Suppose the \code{domain}~\code{R2} is, as above, the rectangle +\teximath{[0,3]\times[-1,2]}. The argument \code{mesh(12,6)} divides the +rectangle a \teximath{12\times6}~array of subrectangles known as the +\emph{coarse mesh}. A \code{P}-valued map~\code{F} of two variables is +plotted over the edges of the coarse mesh. Rather than drawing +quadrilaterals, however, \ePiX\ draws the image curves at the +resolution specified by the argument \code{mesh(60,60)}, the +\emph{fine mesh}. In this example, the curves in each direction are +drawn using 60~line segments. +\end{comment} + +Separating the roles of coarse and fine meshes allows a plot to +conform closely to a surface without using a fine grid of curves. +Both parts of Figure~\ref{fig:plot} are drawn with a +\teximath{6\times20} coarse mesh. In the first picture, the fine mesh +is also \teximath{6\times20}, while in the second, the fine mesh is +\teximath{12\times60}. + +\begin{figure}[hbt] + \begin{center} + \input{plot_a.eepic}\hspace*{0.5in} + \input{plot_b.eepic} + \caption{Coarse and fine meshes.} + \label{fig:plot} + \end{center} +\end{figure} + +The coarse mesh is significant only for domains of dimension at +least~2. The coarse mesh's size determines the number of curves or +surfaces plotted \emph{perpendicularly} to a coordinate direction, +while the fine mesh's size determines the number of segments used +\emph{along} that direction. For predictable results, the fine mesh +should be a small multiple of the coarse mesh. + +Plotting works analogously for 3-dimensional \code{domain}s and maps +depending on three variables: The ``one-dimensional skeleton'' of the +\code{domain}'s image is drawn. A \code{P}-valued map of +three variables can be plotted over a 1-~or 2-dimensional +\code{domain}. (The effect may be unexpected unless the domain arises +by slicing, however.) A map depending on one or two variables cannot +be plotted over a 3-dimensional \code{domain}. +\index{Domain|)} + + +\subsubsection*{Shaded Surfaces} + +\index{Plotting!surface|(} + +\ePiX's shaded surface plotting implements a degree of hidden surface +removal. The algorithm breaks a surface into mesh fragments, sorts +them in decreasing (approximate) distance to the camera, and prints +them. If filling is active, a mesh fragment is shaded according to +the angle between the normal vector and the direction to the camera, +simulating constant ambient lighting; otherwise, the current fill +color is used. This technique works fairly well for surfaces without +intersection, and even acceptably handles intersecting surfaces for +which mesh elements intersect only along boundaries. + +The syntax of a \code{surface} command is identical to a \code{plot} +command when only a single surface is drawn. For example, +\findex{surface} +\begin{verbatim} + surface(F, R, cull=0); +\end{verbatim} +plots the \code{P}-valued function~\code{F} over the domain~\code{R}, +the shaded equivalent of the corresponding \code{plot} command. The +optional \code{cull} argument removes elements that point toward +(\code{cull=-1}) or away from (\code{cull=1}) the camera. Naturally, +orientation of mesh elements depends on the parametrization~\code{F}, +not merely on the surface. Culling reduces the output file size, but +is useful mostly for closed, convex surfaces. + +There are special commands for surfaces of rotation; each accepts a +final \code{cull} argument. +\findex{surface\_rev} +\begin{verbatim} + surface_rev(f, t_min, t_max, n_lats, n_longs); + surface_rev(f, g, t_min, t_max, n_lats, n_longs=24); + surface_rev(f, g, R, frame coords); +\end{verbatim} +The first revolves the graph of~\teximath{f} about the +\teximath{x}-axis, the second uses the parametric curve +\teximath{t\mapsto\bigl(f(t),g(t)\bigr)} as profile. In each case, the +parameter interval \verb+[t_min,t_max]+ is divided into \verb+n_lats+ +equal-length subintervals, \verb+n_longs+ copies of the profile curve +are drawn, and the complete surface (one full turn) is drawn. + +The third form uses a \code{domain} to control the range of +longitudes, and draws a surface of rotation in the Cartesian +coordinate system defined by the orthonormal basis \code{coords}, by +default the standard basis. The arguments \code{f}~and \code{g} define +a parametric curve in the plane spanned by the first two elements +of~\code{coords}, and the first element is the axis of rotation. + +As in wire mesh plotting, the fine mesh is used to draw the boundaries +of surface patches; this tends to make surfaces look smoother for +modest-sized coarse meshes. If the coarse mesh is too coarse, however, +two visually undesirable effects can occur. First, adjacent regions of +the surface may be shaded very differently, since shading is constant +over patches defined by the coarse mesh. Second, a patch nearly +tangent to a line of sight may be drawn badly if the patch bends back +on itself, since the boundary of the \emph{patch} is drawn, not the +visible edge of the mathematical surface. See +\filename{samples/artifacts.xp}. + + +\subsubsection*{Multiple Domains and/or Maps} + +A scene containing two or more shaded surfaces cannot generally be +built up one surface at a time. Instead, multiple surfaces must be +assembled into a single data structure before they can be drawn. +Multiple surfaces are built from one or more maps and one or more +2-dimensional \code{domain}s. In the code snippets below, \code{F}~and +\code{G} are \code{P}-valued functions of 3~variables, and~\code{R} is +a 3-dimensional \code{domain}. + +To plot the images of several \code{domain}s under a \emph{single +map}, assemble the \code{domain}s into a list if necessary, then issue +a \code{surface} command: +\findex{surface} +\findex{domain\_list} +\findex{domain\_list.add} +\begin{verbatim} + surface(F, R.slices3(), cull=0); + + domain_list DL(R.slice1(0)); // build domain list + DL.add(R.slice2(0.5)); // add a domain, etc. + surface(G, DL, cull=0); // draw +\end{verbatim} +For multiple maps, \ePiX\ provides the \code{scenery} +class. Conceptually, \code{scenery} is an agglomeration of shaded +surfaces, built one surface at a time from maps and 2-dimensional +\code{domain}s. The \code{add} function accepts two arguments---a map, +and either a \code{domain} or a list of \code{domain}s---and +contributes its data to the \code{scenery} rather than plotting +immediately. Completed \code{scenery} is drawn manually. +\findex{scenery} +\findex{scenery.add} +\findex{scenery.draw} +\begin{verbatim} + scenery S(F, R.slice3(0.25)); // S contains one surface + S.add(F, R.slice2(0)); // S contains two surfaces + S.add(G, R.slices1(3)); // S contains six surfaces + S.draw(cull=0); +\end{verbatim} +Complete examples are included in the \filename{samples} directory: +\filename{spherical.xp}~and \filename{minkowski.xp}. + +In principle, a scene may contain arbitrarily many surfaces. However, +figures that contain many objects tend to tax \LaTeX's internal +stacks. Frequent color changes exacerbate the problem. Even if you +use \filename{hugelatex} (or increase \LaTeX's memory), a figure +containing more than a few thousand mesh elements is unlikely to +compile. At moderate resolution, a surface can easily contain +1000~patches. Each shell script has a command-line option to invoke +\filename{hugelatex}; your mileage may vary. + + +\subsubsection*{User-Specified Color Shading} + +\index{Color!surface plotting} +By default, a \code{surface} or \code{scenery} is colored according to +the current fill color. For finer control, each \code{surface}, +\code{surface\_rev}, and \code{scenery} command accepts an optional +position-dependent \code{color} specification. +\findex{surface} +\findex{surface\_rev} +\findex{scenery} +\findex{scenery.add} +\begin{verbatim} + surface(F, R, color, cull=0); + surface_rev(f, [g], t_min, t_max, n_lats, n_longs, color); + surface_rev(f, g, R, color, [coords]); + + scenery S(F, R, color); + S.add(F, R, color); +\end{verbatim} +The \code{color} argument is a \code{P}-valued function of two or +three \code{double}s whose output is interpreted as a set of +\code{RGB}~densities. If \code{color} takes two arguments, they are +\code{domain} coordinates, and the surface is colored according to +parameter values. If \code{color} takes three arguments, they are +Cartesian coordinates, and the surface is colored according to spatial +location. Please see the sample files +\filename{surface\_shade.xp}~and \filename{S2\_harmonics.xp}. +\index{Plotting!surface|)} + + +\subsection{Calculus Plotting} +\index{Plotting!calculus|(} + +\ePiX\ provides high-level commands for plotting derivatives and +definite integrals, Riemann sums, tangent lines, slope- and vector +fields, and solutions of planar and spatial systems of differential +equations. + +In this section, \code{f}~and \code{g} are \code{double}-valued +functions of one variable. + +\subsubsection*{Utility Functions} + +\findex{sup} +\findex{inf} +\findex{newton} +\begin{verbatim} + sup(f, a, b); // max/min of f on [a,b] + inf(f, a, b); + newton(f, g, x0); // find approximate crossing point +\end{verbatim} +Newton's method returns the crossing point of the given functions, +starting from the specified seed, which should be reasonably close to +the expected solution. If a critical point is hit or 5~iterations +pass, a warning is issued and the current result (probably incorrect) +is returned. The second function~\teximath{g} defaults to the zero function if +omitted. + +\subsubsection*{Derivatives and Integrals} + +The classes \code{Deriv}~and \code{Integral} are used to calculate +values of derivatives and integrals, and to plot these functions. +\findex{Deriv} +\findex{Deriv.eval} +\findex{Deriv.left} +\findex{Deriv.right} +\findex{Integral} +\findex{Integral.eval} +\begin{verbatim} + Deriv df(f); // function object: df(x) = f'(x) + df.eval(t); // return f'(t) + df.left(t); // deriv from left at t: (f(t)-f(t-dt))/dt + df.right(t); // deriv from right at t: (f(t+dt)-f(t))/dt + + Integral prim(f,a); // function object: prim(x) = int_a^x f + prim.eval(b); // numerical integral of f over [a,b] + double val(Integral(f).eval(1)); // val = \int_0^1 f +\end{verbatim} +The lower limit on an integral is~0 by default. \code{Deriv}s and +\code{Integral}s can be used directly in a \code{plot} command: +\findex{plot} +\findex{riemann\_sum} +\begin{verbatim} + plot(Deriv(f), a, b, n); // plot f' over [a,b] + plot(Integral(f, x0), a, b, n); + riemann_sum(f, a, b, n, TYPE); +\end{verbatim} +The second graphs the definite integral \teximath{x\mapsto\int_{x_0}^x +f(t)\,dt} over~\teximath{[a,b]}. As above, \teximath{x_0}~defaults +to~0. The third draws rectangles or trapezoids whose area approximates +the definite integral of~\teximath{f} over~\teximath{[a,b]}. The +\code{TYPE} may be \code{UPPER}, \code{LOWER}, \code{LEFT}, +\code{RIGHT}, \code{MIDPT}, or~\code{TRAP}. + +Tangent lines and envelopes (families of tangent lines) are drawn with +\findex{tan\_line} +\findex{envelope} +\findex{tan\_field} +\begin{verbatim} + tan_line(f, t); // f real- or vector-valued + envelope(f, t_min, t_max, n); // family of tangent lines + tan_field(f, g, t_min, t_max, n); // field of tangents +\end{verbatim} +The sample files \filename{conic.xp}~and \filename{lissajous.xp} +illustrate these features. + + +\subsubsection*{Systems of Differential Equations} + +Let \code{F}~be a \code{P}-valued function of two or three variables. +\findex{ode\_plot} +\findex{flow} +\begin{verbatim} + ode_plot(F, p_0, t_min, t_max, n); + flow(F, p_0, t_max, n); +\end{verbatim} +The first plots the solution curve of the initial-value problem +\teximath{\dot{x}=F(x)}, \teximath{x(0)=p_0}, over the specified time +interval. If \teximath{t_\mathrm{min}} is omitted, its value is~0, so +the curve starts at~\teximath{p_0}. With manual calculation to rotate +a planar field a quarter turn, \code{ode\_plot} can be used to draw +level curves (isobars) of a function of two variables; see the sample +file \filename{dipole.xp}. The \code{flow} function returns the +result of starting at~\teximath{p_0} and flowing by~\teximath{F} for +time~\teximath{t_\mathrm{max}}, using Euler's method with~\teximath{n} +time steps. This is useful for placing markers or arrowheads precisely +along a flow line. + +A planar or spatial vector field itself may be plotted over a +domain~\code{R} in three styles: +\findex{vector\_field} +\findex{dart\_field} +\findex{slope\_field} +\begin{verbatim} + vector_field(F, R, [scale]); // true length + dart_field (F, R, [scale]); // const length + slope_field (F, R, [scale]); // const length +\end{verbatim} +The field is sampled at the grid points of the coarse mesh. If the +domain is 2-dimensional, the plot is a planar slice of the field, even +if the field depends on three variables. If the domain is +3-dimensional, the field is drawn in successive slices +\teximath{x_3=\mathrm{const}}, starting at the height of the first +corner of~\code{R} and ending at the height of the second corner. + +The optional final argument, which defaults to~\teximath{1}, scales the +arrowheads in a vector field, and scales the (constant) length of +field elements for slope and dart fields. The sample files +\filename{layout2.xp}, \filename{lorenz.xp}, \filename{slopefield.xp}, +and \filename{vfield.xp} illustrate usage. + +In each field-plotting command, the domain argument may be replaced by +two points, representing corners of a coordinate rectangle, and two +integers, the number of grid intervals in the selected coordinate +directions. Only planar slices of a vector field can be plotted using +the alternative syntax. +\index{Plotting|)} + + +\subsection{Non-Euclidean Geometry} +\label{non-eucl} + +\ePiX\ provides limited features for spherical and hyperbolic +geometry: the ability to draw lines in the half-plane and Poincar\'e +disk models of the hyperbolic plane, and to draw latitudes, +longitudes, great circle arcs, spherical triangles, regular polyhedra, +and parametrized curves on a sphere. + +Hyperbolic line segments are specified by their endpoints in the upper +half space or ball (Poincar\'e) models. In each case there is no +output if either endpoint lies outside the model. +\findex{hyperbolic\_line} +\findex{disk\_line} +\begin{verbatim} + hyperbolic_line(p, q); + disk_line(p, q); +\end{verbatim} +For compatibility with 2-dimensional hyperbolic space, the half-space +model is the set \teximath{\{(x_1,x_2,x_3)\mid x_2>0\}}. + +\index{Plotting!spherical|(} +A \code{frame} determines geographical coordinates on a \code{Sphere}: +the first element points toward longitude~0 on the equator, the third +element points to the north pole. A latitude line depends on a +\code{Sphere}, a \code{frame}, the numerical latitude, and a range of +longitudes. A longitude line is described similarly. +\findex{latitude} +\findex{longitude} +\findex{back\_latitude} +\findex{back\_longitude} +\begin{verbatim} + latitude(lat, long_min, long_max, Sphere S, frame coords); + longitude(lngtd, lat_min, lat_max, Sphere S, frame coords); +\end{verbatim} +By default, \code{coords} is the standard \code{frame} and \code{S} is +the unit sphere. These commands draw only the portion of the curve +that is visible from the current viewpoint. The function +\code{back\_latitude} draws the invisible portion of a latitude line. + +Spherical arcs and triangles are described by their endpoints. Only +the direction vector from the center of the sphere to an endpoint is +significant; if a sphere is scaled or moved, the same function call +will draw the corresponding object on the new sphere. + +The following draw the visible (front) portions of great circle arcs: +\findex{front\_arc} +\findex{front\_arc2} +\findex{front\_line} +\findex{back\_arc} +\findex{back\_arc2} +\findex{back\_line} +\begin{verbatim} + front_arc(p1, p2, S); // short arc on S from p1 to p2 + front_arc2(p1, p2, S); // arc from p1 to -p1 through p2 + front_line(p1, p2, S); // great circle through p1 and p2 +\end{verbatim} +Triangles and regular (Platonic) polyhedra are provided. The sample +file \filename{sample/polyhedra.xp} illustrates usage. +\findex{front\_triangle} +\findex{front\_tetra} +\findex{front\_cube} +\findex{front\_octa} +\findex{front\_dodeca} +\findex{front\_icosa} +\findex{back\_triangle} +\findex{back\_tetra} +\findex{back\_cube} +\findex{back\_octa} +\findex{back\_dodeca} +\findex{back\_icosa} +\begin{verbatim} + front_triangle(p1, p2, p3, S); // spherical triangle + front_tetra(S, coords); // regular tetrahedron + front_cube(S, coords); // hexahedron + front_octa(S, coords); // octahedron + front_dodeca(S, coords); // dodecahedron + front_icosa(S, coords); // icosahedron +\end{verbatim} +Each function has a \code{back} version, which draws the hidden +portion. The tetrahedron, cube, and octahedron are (up to scale) +inscribed in the cube of side length~\teximath{2} centered at the origin whose +sides are parallel to~\code{frame}. The point \teximath{(1,1,1)} is a vertex of +the tetrahedron. + +Up to scale, the icosahedron's vertices lie on the golden rectangle +with vertices \teximath{(\pm\gamma,0,\pm1)} and its images under cyclic +permutation of coordinates. The dodecahedron is dual to the +icosahedron. + +\subsubsection*{Spherical Plotting} + +Parametrized paths on a \code{Sphere~S} (by default the unit sphere) +can be specified either by radial projection of a \code{P}-valued +curve, or by stereographic projection of a plane curve given as a pair +of \code{double}-valued functions: +\findex{frontplot\_R} +\findex{frontplot\_N} +\findex{frontplot\_S} +\findex{backplot\_R} +\findex{backplot\_N} +\findex{backplot\_S} +\begin{verbatim} + frontplot_R(phi, t_min, t_max, n, [S]); // radial + frontplot_N(f1, f2, t_min, t_max, n, [S]); // from north pole + frontplot_S(f1, f2, t_min, t_max, n, [S]); // from south pole +\end{verbatim} +Attempts to perform radial projection on a path through the origin +will generate division-by-zero errors. Stereographic projection maps +the equatorial plane \teximath{\{x_3=0\}} to the unit sphere by +projection from the corresponding pole: \teximath{N=(0,0,1)}, +\teximath{S=(0,0,-1)}. + +Each spherical plot command has a \code{back} version that prints only +the portion of the path invisible from the current viewpoint. +Because of the way \ePiX\ layers output, it is generally best to put +hidden portions of the input before visible portions, with line width +and/or style that suggests hidden lines. + + +\subsection{Data Plotting} +\index{Plotting!data|(} +\index{Data plotting|(} + +Files of numerical data can be created, manipulated, analyzed, +plotted (paths, scatter plots, and histograms), read, and written. +The format for a data file is one or more floating-point +numbers per line, with the same number of entries per line. Anything +that appears on a line after the \LaTeX\ comment character~\code{\%} +is a comment. + +\ePiX\ provides two \code{plot} commands for file data. The first +facilitates plotting selected columns; the second simplifies plotting +the first two columns with one or both scales logarithmic. Either form +can be used to plot selected columns logarithmically. + +The general commands read numbers from two or three columns of a +specified file, pass them as arguments to a \code{P}-valued +function~\code{F}, and plot the resulting points: +\findex{plot} +\begin{verbatim} + plot("filename", STYLE, [i_1], [i_2], [i_3], [F]); + plot("filename", STYLE, F, [i_1], [i_2], [i_3]); +\end{verbatim} +The first argument is the name of the data file. The \code{STYLE} may +be \code{PATH}, which joins the points in the order they appear, or +any of the marker types in Table~\ref{table:marker}. The +integers~\teximath{i_k} specify columns from which to extract data; these +default, respectively, to the first column, second column, and null (a +column of zeroes). If the ``coordinate system''~\code{F} is omitted in +the first command, it defaults to the Cartesian point constructor. The +function~\code{F} is mandatory in the second form; useful choices +include \code{log\_log}, \code{log\_lin}, and~\code{lin\_log}, which +plot the corresponding coordinate logarithmically. + + +\subsubsection*{Data Files} + +For more elaborate analysis, the \code{data\_file} class presents an +interface to a file as an ordered list of columns. There are two +general ways to create a \code{data\_file}: read in an external file, +or generate data (up to three columns) using specified +\code{double}-valued functions. In the constructors below, each +function~\code{fi} is a \code{double}-valued function of one variable. +\findex{data\_file} +\findex{data\_file.read} +\begin{verbatim} + data_file DF("my_data"); // read data from disk file + data_file DF(f1, t_min, t_max, num_pts); // values of f1 + data_file DF(f1, f2, t_min, t_max, num_pts); + data_file DF(f1, f2, f3, t_min, t_max, num_pts); + data_file DF(3); // create empty data_file with 3 columns + DF.read("file1"); // read a disk file +\end{verbatim} + +Columns of a \code{data\_file} can be transformed by a user-specified +function, averaged, correlated, extracted (for use by other code), +scatter plotted, and written to a disk file at specified +precision. Below, the function~\code{f} is a \code{double}-valued +function of one variable and~\code{F} is a \code{P}-valued function of +two or three variables, whose components are written back to the +selected columns. +\findex{data\_file.transform} +\begin{verbatim} + DF.transform(f, i); // apply f to selected column(s) + DF.transform(F, i=1, j=2); + DF.transform(F, i, j, k); +\end{verbatim} +Basic statistical operations on columns are provided. +\findex{data\_file.dot} +\findex{data\_file.avg} +\findex{data\_file.var} +\findex{data\_file.covar} +\findex{data\_file.regression} +\begin{verbatim} + DF.dot(i,j); // dot product of columns i, j + DF.avg(i); // mean of column i + DF.var(i); // population variance + DF.covar(i,j); // covariance + DF.regression(i,j); // plot regression line +\end{verbatim} +A \code{data\_file} is scatter plotted using syntax as described above. +% The output is cropped automatically to the bounding box. +\findex{data\_file.plot} +\begin{verbatim} + DF.plot(STYLE, [i1], [i2], [i3], [F]); + DF.plot(STYLE, F, [i1], [i2], [i3]); +\end{verbatim} +Histograms and bar charts are described below. + +A \code{data\_file} can be written to a disk file as raw data, or in +specified format. Below, \code{fmt} denotes a \code{string}-valued +formatting function of two variables and \filename{myfile} is the +name of the disk file to be written. +\findex{data\_file.precision} +\findex{data\_file.write} +\begin{verbatim} + DF.precision(4); // set to 4 significant figures + DF.write("myfile"); // write as tab-separated columns + DF.write("myfile", fmt, [i1], [i2]); // apply fmt to cols +\end{verbatim} +A column can be extracted as a \code{C++}~\code{vector} for use by +another function. +\findex{data\_file.column} +\begin{verbatim} + DF.column(i); // i-th column + DF.column(f, i); // i-th column, transformed by f +\end{verbatim} + + +\subsubsection*{Data Containers} + +\ePiX\ provides a \code{data\_mask} class for culling data from a file +according to the values in a specified column, and a \code{data\_bins} +class for sorting data by value. + +A \code{data\_mask} consists of an interval of numbers and a +``filter'' function. The (closed, open, or half-open) interval is +given as a string in standard mathematical notation, or by its +endpoints (for a closed interval). The filter is a +\code{double}-valued function of \code{double}, by default the +identity, \teximath{f(x)=x}. +\findex{data\_mask} +\begin{verbatim} + data_mask dm("[a, b]", [f]); + data_mask dm(a, b, [f]); +\end{verbatim} +A \code{data\_mask} ``passes'' inputs~\teximath{x} if~\teximath{f(x)} +lies in the interval. The member function \code{reverse()} inverts +this logical test. + +The \code{data\_file} class has \code{prune} functions to cull +rows for which a specified column's entry satisfies a +\code{data\_mask}'s criterion. +\findex{data\_mask.prune} +\begin{verbatim} + DF.prune(dm, i); // remove row if i-th column entry fails + DF.prune(a, b, i); // remove row if i-th column outside [a,b] +\end{verbatim} + +A \code{data\_bins} object models an interval divided at specified +locations into ``bins'', not necessarily of equal length. Numerical +data is read in and the number of points in each bin counted. The +lifetime of a \code{data\_bins} object has two stages. First, ``cuts'' +(endpoints of subintervals) are added. Then, once data is read, the +cuts are ``locked'' and cannot subsequently be changed. +\findex{data\_bins} +\findex{data\_bins.cut} +\findex{data\_bins.read} +\begin{verbatim} + // [xmin, xmax] divided into n equal intervals, 1 by default + data_bins db(xmin, xmax, [n]); + db.cut(x); // add a cut at x (if x is in bounds) + db.read(vector<double>); // read data, lock bins +\end{verbatim} + +\index{Histograms} +\index{Bar Charts} +A \code{data\_bins} object can be plotted as a histogram (rectangles' +\emph{area} is proportional to the bin population), bar chart +(rectangles' \emph{height} is proportional to the bin population), or +spline interpolation of a bar chart. +\findex{data\_bins.histogram} +\findex{data\_bins.bar\_chart} +\findex{data\_bins.plot} +\begin{verbatim} + db.histogram(c=1); // c = vertical scale factor + db.bar_chart(c=1); + db.plot(c=1); +\end{verbatim} +By default (\code{c=1}), the height of a bar chart rectangle is the +fraction of the total population contained in the bin; thus, the +height is always between 0~and 1. For a histogram, the height of a +rectangle is the fraction of the population per horizontal unit in the +bin; thus, the total area over an interval~\teximath{[a,b]} does not +depend on how~\teximath{[a,b]} has been subdivided. The sample files +\filename{dataplot.xp}~and \filename{histogram.xp} illustrate use. + +Statistical convention dictates cuts be chosen distinctly from data +values; that is, values should all fall strictly within a bin, not at +a boundary point. With large, unknown data sets, this convention may +be difficult to uphold. \ePiX\ attempts to handle anomalous data +intelligently, by keeping counts of values ``out-of-range'' or +``on-cut''. + +In detail, if \teximath{x<a} or \teximath{x>b} is a data value, it is +counted as out-of-range and does not contribute to the histogram +population. If \teximath{x=a} or \teximath{x=b}, the value counts as +both out-of-range and on-cut but is added to the population of the +lowest or highest bin, respectively. Any other cut appearing as a data +input is flagged as on-cut, and increments the population of each +adjacent bin by one-half. When a histogram or bar chart is written, +\ePiX\ prints a warning message summarizing the number of anomalous +data seen. + + +\subsubsection*{Error Bars} +\index{Error bars} + +Simple horizontal and vertical error bars are provided. The final +(optional) argument is the true height or width (respectively) in pt. +\findex{h\_error\_bar} +\findex{v\_error\_bar} +\begin{verbatim} + h_error_bar(P location, double error, <mark type>, ht=6); + v_error_bar(P location, double error, <mark type>, wd=6); +\end{verbatim} + +To create more complex elements, such as asymmetric bars, whisker +plots, labeled error bars, and the like, write a custom function using +true-size drawing, see page~\pageref{truesize}. For example, a +fillable, labeled, asymmetric, vertical rectangular error bar can be +implemented (entirely in \ePiX) like this: +\begin{verbatim} + void error_bar(P loc, double lo, double hi, P offset, + std::string text, align, double wd=6) + { + const double width(pt_to_screen(0.5*wd)); // converts to 3pt + rect(loc - P(width, lo), loc + P(width, hi)); + line(loc - P(width, 0), loc + P(width, 0)); + label(loc + P(width, 0), offset, text, align); + } +\end{verbatim} +For stylistic uniformity, functions such as this should be put into a +library and used systematically. Section~\ref{section:extensions} +outlines the process of writing, compiling, and using a custom +library. +\index{Plotting!data|)} +\index{Data plotting|)} + + +\subsection{Legends} +\index{Legends} + +A \code{legend} systematically labels different parts of a plot by +associating visual ``keys'' with explanatory text. This tends to be +most useful for plots containing several distinct but conceptually +related graphs requiring contrast. + +Visually, a \code{legend} is represented as an aligned list of rows, +each containing a box (the key), a gap (the label skip), and some +text. These rows are printed in a (usually large) masked label. By +default, keys are \code{12pt}~squares bordered in black, the label +skip is~\code{6pt}, the background is white, and the border is plain +black. These attributes are controlled (simultaneously for all items) +with member functions. Parameters of type \code{double} represent +lengths in~\code{pt}. +\findex{legend} +\findex{legend.backing} +\findex{legend.border} +\findex{legend.item\_border} +\findex{legend.label\_skip} +\findex{legend.key\_size} +\begin{verbatim} + legend L; + L.backing(color); // set background + L.border(color, [double]); // set border color [and width] + L.border(double); // border width + + L.item_border(color, [double]); + L.item_border(double); // same, for item borders + + L.label_skip(double); + L.key_size(double); +\end{verbatim} + + +\subsubsection*{Legend Keys} + +There are three types of legend key, representing filled regions, +paths, and markers. Fill and path keys get their visual attributes +from the current drawing state. A mark key must be told the marker +type. Each is created by specifying the item text. +\findex{legend.fill\_item} +\findex{legend.path\_item} +\findex{legend.mark\_item} +\begin{verbatim} + L.fill_item(text); + L.path_item(text); + L.mark_item(<mark type>, text); +\end{verbatim} +Keys in the printed legend appear in the same order they are created +in the input file. + + +\subsubsection*{Creating a Legend} + +Normally, a \code{legend} is defined near the start of a file, and an +item is added at the point in the file where the corresponding object +or plot is drawn, so that the item receives the correct attributes. A +\code{legend} is placed into the figure with the \code{draw} +function. The arguments have the same meaning as for ordinary +\code{label}s. +\findex{legend.draw} +\begin{verbatim} + L.draw(P location, P offset, align); +\end{verbatim} +All three arguments are mandatory. ``Global'' \code{legend} settings +(border, backing, etc.) may be changed anywhere between the +\code{legend}'s creation and \code{draw} function. The sample file +\filename{legend.xp} revisits the example on +page~\pageref{taylor_poly}, including a trig-labeled axis and a +legend. The file \filename{shadeplot.xp} contains filled keys, and +\filename{dataplot.xp} contains a \code{legend} with items of mixed +type. + + +\section{More About \CXX} +\index{Cplusplus@\CXX|(emph} + +A textbook or similarly detailed reference is essential for serious +study of~\code{C} or~\CXX. \emph{The \code{C} Programming Language}, +second edition, by Kernighan~and Ritchie~\cite{KnR}, is an excellent, +manageable resource for the basics of procedural +programming. \emph{C++ Primer Plus}, by Stephen Prata~\cite{Prata}, +clearly lays out the extensive details of~\CXX. Marshall Cline's +\emph{\CXX\ FAQ Lite}~\cite{Cline} engagingly discusses common points +of confusion and furnishes tips on good design and programming. + +\CXX\ is a powerful, complex language whose syntax is similar to that +of~\C, or to the scripting languages of Maple~and Mathematica. An +\ePiX\ input file is source code for a \CXX~program that writes a +\LaTeX\ picture as output. \ePiX\ may be viewed as an extension +to~\CXX; in the same way that \LaTeX\ furnishes a high-level interface +to~\TeX, \ePiX\ provides a high-level bridge between the computational +power of~\CXX\ and the \LaTeX\ \code{picture} environment. + +\index{Function} +\index{Conditional statement} +Like all high-level programming languages, \CXX\ provides variables, +functions, and control structures. Variables hold pieces of data such +as numerical values and geometric locations, while functions operate +on data. A control structure, such as a loop or conditional statement, +affects the program's course according to the program's current state. +A source file is composed primarily of ``statements'', which perform +actions ranging from defining variables and functions to setting +figure attributes, performing calculations, and writing objects to the +output file. + +\subsection{Names and Types} + +\index{Variable!names|(} +Names of variables and functions may consist (only) of letters, +digits, and the underscore character. The first character of a name +must not be a digit, and the language standard reserves names starting +with underscore for library authors. Names are case-sensitive, but +it's usually a bad idea to use a single name capitalized and +uncapitalized in a single file. Numerous capitalization conventions +are used informally; this document uses uncapitalized words separated +by underscores for variables and functions, and occasionally uses all +capitals for constants. As with names of \LaTeX\ macros, primary +considerations are clarity (of meaning), readability, and consistency. +\index{Variable!names|)} + +\index{Variable!type of} +Every variable in \CXX\ has a ``type'', +such as integer (\code{int}), double-precision floating point +(\code{double}), or Boolean (\code{bool}, true~or false). \ePiX\ +provides additional types, the most common of which is~\code{P}, for +point. The construct \code{P(x,y,z)} creates~\teximath{(x,y,z)}, while +\code{P(x,y)} gives~\teximath{(x,y,0)}, which is effectively the +pair~\teximath{(x,y)}. A variable is defined by giving its type, its +name, and an initializing expression. + +\index{Variable!pointer} +\index{Pointer} +In~\code{C} and~\CXX, a \emph{pointer} variable holds the memory +address of another variable. Pointers are useful for manipulating +(possibly large) data structures through ``handles'' of fixed small +size. \CXX\ also provides \emph{references}, which bind an additional +name to an existing object and allow the object to be manipulated +through this alias. The statements +\begin{verbatim} + double x=1; // ordinary variable definition + double& rx=x; // bind a reference, signified by & +\end{verbatim} +define a variable~\code{x} having the value~1, and bind a reference +variable~\code{rx} to it. As long as~\code{rx} exists, it refers +to~\code{x}. If the value of~\code{x} changes, the value of~\code{rx} +does as well. Conversely, the value of~\code{x} can be altered by +assigning to~\code{rx}. However,~\code{rx} is the size of a pointer, +regardless of the size of~\code{x}, so~\code{rx} can be passed +efficiently in a function call. +\texicomment +Some applications are discussed on page~\pageref{references}. +\texicommentend + + +\subsection{Functions} + +\index{Function|(} +In a programming language, the term ``function'' refers to a block of +code that is executable by name. A \CXX\ function takes a list of +``arguments'', and has a ``return value''. This information, together +with the function's name, must be provided when a function is defined. +A function may not be defined inside another function. However, a +function may call other functions (including itself) as part of its +execution: +\begin{verbatim} + int factorial(unsigned int n) + { + if (n == 0) return 1; + else return n*factorial(n-1); + } +\end{verbatim} + +\index{Function!returning \code{void}} +The special type~\code{void} represents a ``null type''. A function +that performs an action but does not return a value has return type +\code{void}. A function that takes no arguments may be viewed as +taking a single \code{void} argument. + +Every \CXX\ program has a special function~\code{main()}, which is +called by the operating system when the program is run. The arguments +of~\code{main()} are command-line arguments, and the return type is an +integer that signals success or failure. User-specified functions must +be defined before the call to \code{main()} or in a +separately-compiled file. + +Functions in~\CXX\ may be as simple as an algebraic formula or as +complex as an arbitrary algorithm. Greatest common divisors, finite +sums, numerical derivatives and integrals, solutions of differential +equations, recursively generated fractal curves, and curves of best +fit are a few applications in \ePiX. Several sample files contain +user-level algorithms, which do not require knowledge of \ePiX's +internal data structures. The source file \filename{functions.cc} +contains simple functions defined by algorithms, and +\filename{functions.h} illustrates the use of \CXX\ templates. Other +source files, such as \filename{plots.cc}, may be consulted for +Simpson's rule, Euler's method, and the like. + + +\subsection{Mathematical Functions} + +\index{Function!mathematical|(} +\CXX~knows several familiar mathematical functions by name: +\begin{verbatim} + sqrt exp log log10 ceil floor fabs +\end{verbatim} +(\code{fabs} is the absolute value for a floating-point argument.) +\ePiX\ provides trig and inverse trig functions sensitive to angular +mode: +\index{Angular mode} +\findex{Cos} +\findex{Sin} +\findex{Tan} +\findex{Sec} +\findex{Csc} +\findex{Cot} +\findex{Acos} +\findex{Asin} +\findex{Atan} +\begin{verbatim} + Cos Sin Tan + Sec Csc Cot + Acos Asin Atan +\end{verbatim} +The inverse functions are principle branches. + +The function \code{pow(x,y)} returns~\teximath{x^y} when +\teximath{x>0}, and \code{atan2(y,x)} (N.B. argument order) returns +\teximath{\mathrm{Arg}(x+iy)\in(-\pi,\pi]}, the principle branch of +arg. \CXX~knows many constants to 20~decimal places, such as +\code{M\_PI}, \code{M\_PI\_2}, and \code{M\_E} for~\teximath{\pi}, +\teximath{\pi/2}, and~\teximath{e} respectively. \ePiX\ defines a few +additional functions: +\findex{sgn} +\findex{zero} +\findex{sinx} +\findex{cb} +\begin{verbatim} + sgn zero sinx cb +\end{verbatim} +\texicomment +\begin{center} + \input{sgn.eepic}\qquad + \input{sinx.eepic}\qquad + \input{cb.eepic} +\end{center} +\medskip +\texicommentend +\code{sgn} is the signum function; \code{zero} is the constant +function; \code{sinx} is the function \teximath{x\mapsto \sin(x)/x} +with the discontinuity removed; \code{cb} (for ``Charlie Brown'') is +the period-2 extension of the absolute value function +on~\teximath{[-1,1]}. + +The GNU \CXX\ library defines other functions, including inverse +hyperbolic functions (\code{acosh}, etc.), \code{log}~and \code{exp} +with base~2, 10, or arbitrary~\teximath{b} (\code{log2}, etc.), the +error and gamma functions (\code{erf}~and \code{tgamma} [sic], +respectively), and Bessel functions of first and second kind: +\code{j0}, \code{j1}, \code{y0}, etc. Use, e.g., \code{jn(5,~)} to get +higher indices. The GNU \C~library reference manual~\cite{GNUC} +describes these and other functions in detail. + +Functions may be used in subsequent definitions, and functions of two +(or more) variables are defined in direct analogy to functions of one +variable: +\begin{verbatim} +double f(double t) { return t*t*log(t*t); } // t^2 \ln(t^2) +double g(double s, double t) { return exp(2*s)*Sin(t); } +\end{verbatim} +\index{Function!mathematical|)} + + +\subsection{Basics of Classes} + +\index{Classes|(} +Unlike~\code{C}, \CXX\ supports ``object-oriented programming''. In a +nutshell, a \emph{class} is an abstraction in computer code of some +concept, such as a point, a sphere, a mapping that can be plotted, or +a camera. Classes allow a programmer to separate an object's +\emph{interface} (the set of meaningful operations) from its +\emph{implementation} (the data structures and algorithms that realize +the interface). + +\index{Function!class member} +A class implementation consists of \emph{members} (named data +elements) and \emph{member functions} (functions that belong to the +class and have free access to members). \CXX\ classes enforce access +permissions on their members, protecting data from being manipulated +except as promised by the interface. + +An ideal interface looks like a black box: It hides the implementation +completely. In order to cooperate, two classes need only know each +other's interfaces. This separation of form and function modularizes a +program, and facilitates debugging, code reuse, and overall +maintainability, particularly in large programs. + +In simple programming, classes may be treated like built-in types. +Each class object has its own member functions, whose call syntax +differs from standard function calls: +\begin{verbatim} + Circle C1(P(1,0), 1.5); // circle of given center and radius + C1.draw(); // member function Circle::draw(); +\end{verbatim} +Naturally, this call draws the circle~\code{C1}. Generally, a member +function call consists of a class object's name, a period, and the +name of the member function. Arguments, if any, go in the parentheses +after the member function name, just as in a regular function call. + +A few short paragraphs cannot do more than scratch the surface of +classes and object-oriented programming. For more details, please +consult a book, such as Prata~\cite{Prata} or Stroustrup~\cite{S}, or +Cline's on-line FAQ~\cite{Cline}. +\index{Classes|)} + + +\subsection{References and Function Arguments} + +\index{Function!call syntax} +\index{Variable!reference} +\label{references} +\code{C}~and \CXX\ are ``call by value'' languages. Variables are not +passed to a function; instead a copy of the value is made, and the +function operates only on the copy. Though this feature causes +occasional inconvenience, it prevents an object from being altered +unexpectedly by a function call in a different part of the program. +Calling by value helps localize the logic of a program, and +circumvents easy-to-write but extremely hard-to-find bugs. + +In \CXX, a function may accept reference arguments. Passing an object +by reference grants the calling function access to the object itself, +not to a copy. There are two common applications: The object is a +large data structure for which copying is ``expensive'', or the +function \emph{needs} to modify its arguments (e.g., a function +\code{swap(x,y)} that exchanges the values of \code{x}~and +\code{y}). + +For the first situation, \CXX\ provides the \code{const} keyword, +which ensures the function does not modify its arguments, but accepts +a reference merely for efficiency. Any attempt to modify a +\code{const} argument will be caught by the compiler. Most \ePiX\ +commands accept \code{const} reference arguments. + +The ability to pass function arguments by reference is sometimes +touted as a feature in \CXX\ texts. However, the technique circumvents +the data encapsulation of calling by value, and should be avoided +unless absolutely necessary. If a function merely ``updates'' the +value of a variable, probably the variable should be of class type, +and the update should be performed by a member function. + +A function declaration must indicate that its arguments are +references. The declarations below have the indicated idiomatic +meanings. +\begin{verbatim} + class matrix; + double det(matrix); // call by value, perhaps inefficient + matrix& transpose(matrix&); // probably changes its argument + double trace(const matrix&); // does not change its argument +\end{verbatim} +Unlike pointer arguments, reference arguments impose no syntactic +burden on the user. If~\code{A} is a~\code{matrix}, then +\code{transpose(A);} and \code{trace(A);} will compile. You need not +declare explicit reference variables and pass those to the function. + + +\subsection{Overloading} + +\index{Function!overloaded} +\CXX\ provides ``overloading'': Multiple functions can be given the +same name, so long as the number and/or type of their arguments +differ. (It is \emph{not} enough for the return types alone to differ. +The compiler must be able to select a function from its calling +syntax.) To the user, the appearance is that a single function +intelligently handles multiple argument lists. Naturally, overloaded +names should refer to functions that are conceptually related. +\index{Function|)} + + +\subsection{Scope} + +\index{Variable!local} +A \CXX\ statement ends with a semicolon. A collection of statements +enclosed by curly braces is a ``code block'', and may be viewed as a +single logical statement. Curly braces determine a ``scope'', inside +which variable names may be re-used without ambiguity. Function +bodies are code blocks, as are the alternatives associated to control +statements. A variable defined between curly braces is said to be +\emph{local} to the scope in which it is defined; its value cannot +be used out of scope. Variables should be declared in the smallest +scope possible. + +The compiler is not picky about spaces, tabs, and newlines, so an +input file should be formatted to make local scopes visually +apparent. \code{emacs} automatically indents code to reflect scope, +though the default behavior does not please all users. As with +variable naming, clarity and consistency are paramount. + + +\subsection{Headers and Pre-Processing} + +A \CXX\ source file is compiled in multiple stages that occur +transparently to the user. The first step, pre-processing, involves +simple text replacement for file inclusion, macro expansion and +conditional compilation. Next, the source is compiled and assembled: +Human-readable language instructions are parsed, then represented in +assembly language. Finally, the object files are linked: Function +calls are resolved to hard-coded file offsets, possibly involving +external library files, and the program instructions are packaged into +an executable binary that the operating system can run. + +Pre-processing is used much less in~\CXX\ than in~\code{C}; the +language itself supports safer and more featureful alternatives to +macros, such as \code{const} variables and inline functions. File +inclusion and conditional compilation are the chief uses of the +pre-processor. Lines of the form +\begin{verbatim} + #include <iostream> + #include "epix.h" +\end{verbatim} +cause the contents of a \emph{header file} to be read into the source +file. A header file contains variable and function +\emph{declarations}, statements that specify types and names but do +not define actual data. Declarations tell the compiler just enough +to resolve expressions and function calls without knowing specific +values or function definitions. + +\index{Input file!conditional compilation} +Conditional compilation is similar to conditional \LaTeX\ code. For +example, a file might produce either color or monochrome output as +follows: +\begin{verbatim} +#ifdef COLOR + ... // code for generating color figure +#endif /* COLOR */ +#ifndef COLOR + ... // monochrome code +#endif /* undef COLOR */ +\end{verbatim} +The ``compiler symbol'' \code{COLOR} is an ordinary \CXX\ name. To +control compilation, either put a \code{\#define COLOR} line in the +file, or (better) supply the flag on the command line: \\ +\verb+ epix -DCOLOR <file.xp>+ \\ +Every \code{\#ifdef} must have a matching \code{\#endif}. Commenting +the \code{\#endif} is a good habit; in a realistic file, the start and +end of a conditional block may be separated by more than one screen. + + +\subsection{Comparison with \LaTeX\ Syntax} + +As a programming language, \CXX\ provides certain features common to +all languages (such as \LaTeX, MetaPost, Perl, Lisp\ldots) and adheres +to rules of grammar. Salient differences between \LaTeX\ and \CXX\ +include: + +\begin{enumerate} +\item Every \CXX\ statement and function call must end with a + semicolon. An omitted semicolon may result in a cryptic error + message from the compiler. Pre-processor directives, which start + with a~\code{\#}, do not end with a semicolon. + +\item Backslash is an escape character in \CXX: + \index{Labels} +\begin{verbatim} + // Put label $y=\sin x$ at (2,1) + // Note single ^ backslash in output + label(P(2,1), P(0,0), "$y=\\sin x$"); + // Double backslash ^^ in source +\end{verbatim} + +\item Variable and function names may contain letters (including + underscore) and digits \emph{only}, are case sensitive, and must + begin with a letter. + +\item Variables in \CXX\ must have a declared \emph{type}, such as + \code{int} (integer) or \code{double} (double-precision floating + point). If a variable has global scope and its value does not + change, the definition should probably come in the preamble or at + the beginning of \code{main}. Local variables should be defined in + the smallest possible scope. Unlike~\C, \CXX\ allows variables to be + defined where they first appear. + +\item \CXX~requires explicit use of~\code{*} to denote multiplication; + juxtaposition is not enough. \CXX~does not support the use of + \verb+^+ for exponentiation, e.g., \verb+t^2+ is invalid. Instead, + use \code{t*t}~or \code{pow(t,2)}. + +\item \CXX\ has single- and multi-line comments. Everything between a + double slash and the next newline is ignored, while the strings + \verb+/*+~and \verb+*/+ delimit multi-line comments. A single-line + comment may appear within a multi-line comment, but the compiler + does not nest multi-line comments. + \index{Input file!comment in} + +\end{enumerate} + +Between them, \C~and \CXX~have about 100~reserved keywords which +cannot be used as function or variable names. +\index{Cplusplus@\CXX|)} + + +\section{Attribute Quick Reference} +\label{section:quickref} + +In the body of an input file, the ``drawing state'' determines the +figure's appearance. Attributes are declarations, set by commands that +accept arguments of the stated type. + +A \code{len} argument is a double-quoted string containing a number +and a two-letter \LaTeX\ length unit, such as \code{"1.5pt"} or +\code{"6cm"}. A \code{color} argument is a named primary +(\code{Red()}, \code{Cyan()}, \code{White()}, etc.), a \code{Color} +specified by densities (\code{RGB(...)}, \code{CMYK(...)}, etc.), or a +\code{Color} object. Using \code{Neutral()} as a \code{Color} argument +generally turns off the corresponding attribute. + +\begin{itemize} + +\item Angular mode: \code{radians()}, \code{degrees()}, or + \code{revolutions()}. + + The angular mode affects all trigonometric operations, including + camera rotations, the drawing of arcs and ellipses, polar plotting, + label angle, and the trig functions themselves. Angle-sensitive trig + functions are capitalized, e.g., \code{Cos}, \code{Tan}. + +\item Fill style: \code{fill(color)}, \code{fill(bool)}, + \code{nofill()}. + +\item Path style: + + \begin{itemize} + + \item Width: \code{plain()}, \code{bold()}, \code{bbold()}, + \code{pen(len)}. + + \item Line style: \code{line\_style(string)}. The argument is a + WYSIWYG sequence of dashes, spaces, and periods. + \code{dash\_size(double)} and \code{dot\_sep(double)} set the + (approximate) length in~\code{pt} of the pattern. The commands + \code{solid()}, \code{dashed()}, \code{dotted()} define + ``standard'' defaults for brevity. + + \item Path color: + Paths can be drawn using \emph{two} pens, one atop the other. When + the ``base'' pen is white (or the background color) and wider than + the ``line'' pen, a path masks parts of the figure it crosses. A + 3-D effect may be obtained by making the base pen a darker shade + than the ``line'' pen. + + \code{pen(color,[len])}, \code{base(color,[len])} + + Standard widths: \code{plain(color)}, \code{bold(color)}, + \code{bbold(color)} + + \end{itemize} + +\item Text attributes: + + \begin{itemize} + + \item Color: \code{label\_color(color)} + + \item Mask: \code{label\_mask(color)}, \code{label\_pad(len)} + + \item Border: \code{label\_border(color, [len])}, + \code{label\_border(len)}. The command \code{no\_label\_border()} + turns off label borders. + + \item Font size: \code{font\_size(LaTeX size)}, no argument means + \code{normalsize}. + + \item Font face: \code{font\_face(LaTeX font)}, two-letter font + selection string, default is \code{rm}. + + \item Rotation: \code{label\_angle(double)} + + \end{itemize} + +\end{itemize} + +Do not confuse \code{Color} constructors with the similarly-named +(deprecated) lowercase attribute-setting commands, \code{rgb(r,g,b)}, +\code{cmyk(c,m,y,k)}, \code{red(d)}, etc. These commands affect text, +paths, and filled regions. For example, the single command +\code{red()} has the same effect as the three commands +\code{pen(Red())}, \code{fill(Red())}, and \code{label\_color(Red())}. + + +\texinfochapter{4}{Advanced Topics} +\label{chapter:adv} + +This chapter covers \emph{ad hoc} tricks and open-ended techniques +that require relatively more programming sophistication. You will +almost surely need an external \CXX\ reference if you do not speak the +language. + + +\section{Hidden Object Removal} +\label{section:hidden} + +\index{Hidden object removal|(} +\ePiX\ writes the output file in the same order that objects appear in +the input. The order is significant because PostScript builds a figure +in layers: Objects are drawn over objects that come earlier in the +file. Shaded polygons can be used to obtain surprisingly effective +hidden object removal in surface meshes. This section describes the +data structures defined in the source files \code{surface.*}. + +\index{Camera} +The basic idea is to create a shaded polygon class that knows its +approximate distance to the camera. For computational simplicity, a +mesh ``facet'' is treated as a quadrilateral, located at the +arithmetic mean of its vertices. A facet's boundary is created from a +map and a domain by tracing a fine mesh rectangle counterclockwise. + +To draw a parametrized surface, facets are stored in a \CXX\ vector, +sorted in decreasing order of distance to the camera, and printed to +the output file. If filling is active, the gray density of a facet +depends on the cosine of the angle between the normal vector and the +vector from the camera to the element. + +This simple algorithm works surprisingly well when mesh elements +intersect at most along complete edges. To incorporate line-like +elements (e.g., coordinate axes, wire-mesh plots) with shaded +surfaces, the best technique is often to order high-level scene +elements manually, breaking up shaded surfaces (for example, with +domain resizing or clipping) as necessary. The sample file +\filename{saddle.xp} illustrates possible techniques. + +Shaded surfaces can be decorated with a bit of hackery. For example, +the \code{facet::draw} function in \filename{facet.cc} can be +modified easily to draw line elements, tangents, or normal vectors +along with the facet itself. The sample file +\filename{decorate.xp} contains a couple of ideas. (The +decorations are activated by compiler flags; please consult the file +itself for information on compiling.) +\index{Hidden object removal|)} + + +\section{Extensions} +\label{section:extensions} + +Thanks to a suggestion of Andrew Sterian, \ePiX\ is extensible. User +extensions span a spectrum, from header files that require only basic +knowledge of~\CXX\ to separately compiled libraries that add +substantial new features. The structure of the source code is +outlined in Section~\ref{section:programmers}. + + +\subsection{Header Files} + +A \CXX~header file conventionally has suffix~\filename{.h}, as in +\filename{myheader.h}. To use this custom header, put a line +\code{\#include "myheader.h"} in your source file. + +User definitions can be easily and robustly implemented with ``inline +functions''. Inline functions are superficially similar to macros, but +are far more safe and featureful (since they are handled by the +compiler rather than by the pre-processor). Examples are +\begin{verbatim} + inline void Bold() { pen(1.6); } + inline void purple() { rgb(0.5, 0, 0.7); } + inline void draw_square(double s) { rect(P(-s,-s),P(s,s)); } + inline double cube(double x) { return pow(x,3); // x^3 } +\end{verbatim} +The keyword \code{void} signifies a function that does not return a +value, or (when used as an implicit parameter) a function that does +not accept arguments. Inline function definitions are syntactically +identical to ordinary function definitions, but \emph{must} occur in a +header file or in the source file where they are used. The examples +above might be used in an input file as follows: +\begin{verbatim} + Bold(); + draw_square(cube(1.25)); +\end{verbatim} + + +\subsection{Compiling} + +The next few sections outline the creation of a ``static library'' on +GNU/Linux, and explain how to incorporate custom features at runtime. +The extensively-commented sample files \filename{std\_F.cc}~and +\filename{std\_F.h} illustrate the techniques described below, and may +be used for guidance and experimentation. + +A small library is usually written as a \emph{header} file, which +contains class and function declarations (also called ``prototypes''), +and a \emph{source} file, which contains the actual +code. Conventionally (under *nix), these files have extension +\filename{.h}~and \filename{.cc} respectively. Header and source files +may ``include'' other header files, to incorporate additional +functionality. +\begin{verbatim} +/* my_code.h */ +#ifndef MY_CODE +#define MY_CODE +#include <cmath> // standard library math header +#include "epix.h" // ePiX header +using ePiX::P; + +namespace Mine { // to avoid name conflicts + // functions for special relativity + double lorentz_norm(const P&); + bool spacelike(const P&); +} // end of namespace +#endif /* MY_CODE */ +\end{verbatim} +This file exhibits two ``safety features''. The three \code{MY\_CODE} +lines prevent the file from being included multiple times. In a file +of this size, inclusion protection is overkill, but as your code base +grows and the number of header files increases, this protection is +essential. Second, the header introduces a ``Mine'' namespace. Inside +this namespace, two functions are declared as prototypes, giving the +function's return type, name, and argument type(s). A header file +should be commented fairly liberally, so that a year or two from now +you'll be able to decipher the file's contents. For a longer file, +version and contact information, an overall comment describing the +file's features, and license information are appropriate. + +Next, the corresponding source file; definitions are also placed into +the namespace, and must match their prototypes from the header file +exactly. +\begin{verbatim} +/* my_code.cc */ +#include "my_code.h" +using namespace ePiX; + +namespace Mine { + double lorentz_norm(const P& arg) + { + double x(arg.x1()), y(arg.x2()), z(arg.x3()); // extract coords + return (y-x)*(y+x) + z*z; // -x^2 + y^2 + z^2 + } + bool spacelike(const P& arg) + { + return (lorentz_norm(arg) > 0); // true if inequality is + } +} // end of namespace +\end{verbatim} +Copies of these files are included with the source code so you can +experiment with them. Next, the source file must be ``compiled'', +``archived'', and ``indexed''. In the commands below, the percent sign +is the prompt. +\begin{verbatim} +% g++ -c my_code.cc +% ar -ru libcustom.a my_code.o +% ranlib libcustom.a +\end{verbatim} +Please see your system documentation for details on command options +and what each step does. For linking (below), the name of the library +file must begin ``lib'' and have the extension~\filename{.a}. Once these +steps are successfully completed, put the library \filename{libcustom.a} +and header file \filename{my\_code.h} in your project directory. You're +ready to use the code in an \ePiX\ figure. + + +\subsection{Runtime Linking} + +The script~\epix\ allows input files to be linked with external +libraries at run time, when the input file is compiled into a +temporary executable. + +\epix\ recognizes command line options and passes them verbatim to the +compiler. The most commonly used options are those of the form +\begin{verbatim} + -I<include> -L<libdir> -l<lib> +\end{verbatim} +For example, to link \filename{figure.xp} against +\filename{mylibs/libcustom.a}, run the command +\begin{verbatim} + epix -Lmylibs -lcustom figure +\end{verbatim} +The options \code{-I. -L.} tell the compiler to look in the current +directory for header and library files. Compiler options may appear +in any order, but must come before the name of the input file(s). + +Compiler options may be placed in the configuration file +\filename{\$HOME/.epixrc}, with syntax as above. A line in the config +file that contains a pound sign~(\code{\#}) is a comment, no matter +where in the line the~\code{\#} appears. If any non-comment line +fails to start with a dash, the rest of the file is silently +discarded. Command-line options are read before the config file. + + +\subsection{Using Multiple Versions} + +The script \filename{epix}~links by default against the \code{C}~math +library \code{libm.a}~and the \ePiX\ library \code{libepix.a}. The +command option \code{--no-defaults} clears the header and include +paths and removes \code{libepix.a} from the link list. The script may +therefore be used with multiple versions of \ePiX, a potentially +useful feature if you regularly need to compile old source files, or +simply prefer the syntax of an older version. + +To install and use (say) Version~1.0.0, build the package according to +its \filename{INSTALL} instructions, but \emph{do not use the makefile + to install}. Instead, manually install the header and library only, +using their version number: +\begin{verbatim} +# install -m 644 epix.h /usr/local/include/epix-1.0.h +# install -m 644 libepix.a /usr/local/lib/libepix-1.0.a +\end{verbatim} +A non-system directory may be used instead of \filename{/usr/local}. +To use the old version, a source file must \code{include} the +appropriate header file (which is identified by its version number). +To compile, issue a command such as +\begin{verbatim} +epix --no-defaults -I/usr/local -L/usr/local -lepix-1.0 file.xp +\end{verbatim} + + +\section{Programmer's Guide} +\label{section:programmers} + +This section briefly surveys \ePiX's implementation, and is intended +for (potential) programmers. The source code is divided into modules +with small, well-defined responsibilities, but the user interface is +mostly compatible with the syntax of Version~1.0. These constraints +demanded a degree of implementation hiding. For example, the +user-visible classes defined in \filename{Color.h}, \filename{path.h}, +and~\filename{screen.h} contain only a pointer to the implementation +class, and style data is hidden behind global commands. + +Functionally, the code consists of the user interface; implementation +class\-es comprising drawing attributes, spatial objects, screens and +representations of their elements, and output; and miscellaneous +utility functions. The headers in each group, and their contents, are +described in Section~\ref{section:interface}. + +The user interface headers are assembled into a single file, +\filename{epix.h}, and installed in \filename{/usr/local/include} by +default. In normal use, the shell scripts read only the user interface +header. The individual headers, including the components of +\filename{epix.h}, are installed in +\filename{/usr/local/include/epix}. These are provided for authors of +external libraries, who may need access to implementation details. + + +\subsection{External Packages} + +\ePiX\ harnesses the computational power of~\CXX\ to the typographical +capabilities of \LaTeX. Consequently, \ePiX\ should be viewed in part +as a framework for expressing numerical data visually. + +In the course of your work, you may develop specialized code filling a +gap in \ePiX's functionality. If your code seems likely to be of +interest to other users, please consider bundling it as an external +package and notifying the \ePiX\ community so your work can be linked +from the project pages and distributed to interested users. + +There are no formal requirements for external packages, but in the +interest of uniformity contributed code should follow the GNU Coding +Standards~\cite{GNUCoding}. At a minimum, an external package should +build with the standard \code{./configure; make; make install} +commands, and the \code{configure} script should accept an option +\code{--with-epix} for the user to specify a non-default \ePiX\ +install directory. + +If an external package builds a static library, it should provide a +single header containing all the package's entry points, and enclose +its interface in a namespace. Entry points should not collide with +\ePiX\ functions. Naming the package ``\filename{epix-<...>}'' is a +good idea, but not essential. For example, a package providing textual +nodes and diagram layout might be named \filename{epix-nodes}. Input +files would use the package with the lines +\begin{verbatim} + #include "epix-nodes.h" + using namespace ePiX-nodes; +\end{verbatim} +and be compiled with +\begin{verbatim} + epix -lepix-nodes <file> +\end{verbatim} + +The user and internal interfaces of \ePiX-1.2 are not likely to +change. Still, it's prudent to rely only on the user interface in +contributed code whenever possible. Doing so also simplifies your work +as an author; your library can simply \code{include} the user header +file, and deal only with high-level objects and drawing attributes. + + +\subsection{User Interface} +\label{section:interface} + +These files (in order) comprise the global header \filename{epix.h}. + +\Header{enums.h} Marker, alignment, Riemann integral, and vector field +types. + +\Header{length.h} Physical lengths, conceptually a number and +two-letter \LaTeX\ length unit. + +\Header{interval.h} Closed, open, and half-open interval ranges for +data culling. + +\Header{triples.h} The \code{P} class. + +\Header{functions.h} Angle-sensitive trig functions, miscellaneous +utility functions, the \code{Deriv}~and \code{Integral} classes. + +\Header{pairs.h} Screen locations and displacements, with complex +arithmetic operations. + +\Header{Color.h} The Color class interface, named +primaries and constructors. + +\Header{state.h} Angle mode; clipping and cropping; label styles; +filling; arrow head style; dot and tick sizes, dash length; line +style; line and base pen attributes; color-setting commands. + +\Header{frame.h} Orthonormal bases. + +\Header{domain.h} Coordinate boxes for function plotting. + +\Header{camera.h} The camera. + +\Header{screen.h} The screen class. + +\Header{picture.h} Dimension-setting, offset, layout, decoration, +verbatim text, and output format commands. + +\Header{markers.h} Point markers, axis labels, and coordinate axes. + +\Header{axis.h} Coordinate axes and labels in various styles. + +\Header{legend.h} Plot legends. + +\Header{path.h} The path class. + +\Header{curves.h} Polygons, arrows, ellipses, arcs, splines, +coordinate grids, and recursive fractal curves. + +\Header{circle.h} The \code{Circle} shape object class. + +\Header{plane.h} The \code{Plane} shape object class. + +\Header{segment.h} The \code{Segment} shape object class. + +\Header{sphere.h} The \code{Sphere} shape object class. + +\Header{intersections.h} Shape object intersection operators. + +\Header{plots.h} Plotting commands. + +\Header{surface.h} Shaded surface plots. + +\Header{data\_mask.h} Helper class for data pruning. + +\Header{data\_file.h} Class for storing and representing data. + +\Header{data\_bins.h} Class for sorting and counting data. + +\Header{geometry.h} Latitudes and longitudes; spherical plotting, +arcs, polygons, and polyhedra; hyperbolic arcs. + + +\subsection{Implementation Classes} + +\Header{Color\_Base.h} The Color implementation interface. + +\Header{Color\_CMY.h} The CMY color model. + +\Header{Color\_CMYK.h} The CMYK color model. + +\Header{Color\_Gray.h} The Gray color model. + +\Header{Color\_Neutral.h} Each color class has a ``Neutral'' member +that converts colors to that model by filtering. This file defines the +unique ``model-less'' Neutral color for which filtering performs no +action. + +\Header{Color\_RGB.h} The RGB color model. + +\Header{Color\_Sep.h} Classes for CMYK separation. + +\Header{active\_screen.h} Simple manipulator for the active screen. + +\Header{picture\_data.h} Picture implementation: two \code{screen}s +(representing the \code{canvas}~and the output page), true dimensions +and offsets, pointer to output format, list of colors, and lists of +verbatim text to write before and after printing the \code{picture} +environment in the output file. For simplicity, the \code{screen}s and +dimensions are public; encapsulation from the user results from +``hiding'' this header. + + +\subsubsection*{Style Attributes} + +Declaration-style attributes are maintained with functions returning +static references: \code{the\_angle\_style()}, +\code{the\_arrowhead\_style()}, \code{the\_label\_style()}, +\code{the\_mark\_size()}, \code{the\_paint\_style()}, and +\code{the\_path\_style()}. Each function is declared in the +analogously-named header. + +\Header{angle\_units.h} Angular modes: \code{radians}, +\code{revolutions}, and \code{degrees}. + +\Header{arrow\_style.h} Arrow head style data: width, ratio, and +inset. + +\Header{label\_style.h} Text object style: Label and mask colors, +padding, border color and width, alignment, font size, font face, and +angle. + +\Header{marker\_style.h} Dot and tick sizes. + +\Header{paint\_style.h} Line and base pens, fill color. + +\Header{path\_style.h} Solid, dashed, dotted lines. + +\Header{pen\_data.h} The pen class. + + +\subsubsection*{Objects} + +\Header{arrow\_data.h} Arrow representation. + +\Header{facet.h} Shaded surface elements. + +\Header{label\_data.h} Text (label and marker) objects. + +\Header{legend\_item.h} Items for \code{legend}s. + +\Header{path\_data.h} Path implementation. + +\Header{spline.h} The natural spline class. + +\Header{spline\_data.h} Templates for quadratic and cubic splines. + + +\subsubsection*{Screen Representation} + +Elements in a \code{screen} are represented polymorphically as +``\code{tile}s'', of which there are six types: \code{glyph} (textual +elements), \code{pen\_arrow} (arrows), \code{pen\_fill} (filled +regions), \code{pen\_line} (path-like elements), \code{verbatim} +(raw text), and \code{legend\_tile} (legends). + +Border and background shape are dictated by the \code{screen\_mask} +class. The cropping algorithm assumes the contour of a screen mask is +convex. + +\Header{affine.h} Affine maps. + +\Header{cropping.h} Screen mask cropping. + +\Header{glyph.h} Markers and labels. + +\Header{legend\_tile.h} Screen representation of a \code{legend}. + +\Header{mask\_diamond.h} Screen diamond mask. + +\Header{mask\_ellipse.h} Screen elliptical mask. + +\Header{mask\_rectangle.h} Screen rectangular mask. + +\Header{pen\_arrow.h} Arrows. + +\Header{pen\_fill.h} Filled regions. + +\Header{pen\_line.h} Paths. + +\Header{screen\_data.h} Screen implementation class. + +\Header{screen\_mask.h} Screen mask interface. + +\Header{tile.h} Screen element interface. + +\Header{verbatim.h} Text in output stream. + + +\subsubsection*{Output} + +Output is divided into a couple of high-level operations and several +``atomic'' low-level operations. To create a new output +format, one need only implement the \code{format} interface for the +desired file type. Paths and filled regions may be implemented however +the output type dictates. + +\Header{eepic.h} eepic macros. + +\Header{fmt\_template.h} ``skeleton'' header for new output formats. + +\Header{format.h} The output interface. + +\Header{pst.h} PSTricks macros. + +\Header{tikz.h} tikz macros. + + +\subsubsection*{Utilities} + +\Header{Color\_Utils.h} Functions for setting color channel densities. + +\Header{clipping.h} The clip box. + +\Header{constants.h} Global constants: Line widths; dot, tick, and +dash sizes; arrowhead parameters; miscellaneous numerical constants +and internal parameters. + +\Header{crop\_algorithms.h} Path and loop clipping templates. + +\Header{deriv.h} Finite difference template. + +\Header{edge\_data.h} Path element representation template. + +\Header{errors.h} Warning and error messages. + +\Header{frac.h} Rational numbers and operators. + +\Header{halfspace.h} Halfspace cutting. + +\Header{hatching.h} Filling regions in eepic. + +\Header{lens.h} Camera lenses. + +\Header{map.h} Wrappers for templated plotting. + +\Header{plot\_algorithms.h} Plotting templates. + +\Header{screen\_crop.h} Crop paths and loops. + +\Header{utils.h} Truncation, date and time, line breaking. + + +\appendix +\texinfoappendix{A}{Software Freedom} +\index{Free software|(} + +Academics in general, and mathematicians in particular, depend on free +exchange of information. We prove theorems or establish experimental +results, write up formal accounts, place preprints on public file +servers, and submit papers to peer-reviewed journals. If accepted, the +results---data, techniques, methods of reasoning, citations, and +conclusions---are published in print and become part of the public +record, governed by copyright law. Libraries purchase journal +subscriptions, but researchers and scholars may use ideas from the +literature merely by giving appropriate citations in their own +work. ``Theft'' arises from false claims of authorship. + +Carried over to software, the academic process would guarantee rights +similar to those provided by the GNU General Public License (GPL): + +\begin{itemize} + +\item (GPL~0) To run a program for any purpose. + +\item (GPL~1) To study how the program works, and adapt it to your + needs. + +\item (GPL~2) To redistribute copies of the program. + +\item (GPL~3) To improve the program, and release improvements to the + public, so that the whole community benefits. + +\end{itemize} + +In reality, attitudes toward software differ markedly. Most academics +work on a proprietary platform, use proprietary software for research +and teaching, and share information with colleagues and students in +proprietary, even obfuscated, data formats. Contrary to the academic +ethic, proprietary software licenses restrict access to information: +preventing users from learning how a program works internally +(``reverse engineering''), limiting the number of users who may run a +piece of software, and forbidding users from running (or sometimes +even installing) a purchased copy on multiple machines. + +Restrictions on use aside, if one cannot examine a program's source +code, one cannot fully trust the output, any more than one can trust +(for purposes of scientific publication) results of a commercial +testing lab. + +\texicomment +\noindent$\phantom{.}$\hfil\vbox{\hrule width 4in}\hfil +\texicommentend + +Consider a hypothetical future world in which scholarly results are +disseminated like software. Instead of subscriptions, journals +sell licenses granting readership to a specified number of +individuals. Photocopying an article for a class or research seminar +constitutes ``piracy'', though if the institution has purchased a +sufficiently large site license the teacher or speaker may bring the +physical volume to class and project the pages onto a screen. + +Of course, reading an article is scarcely enlightening. Mathematics +papers contain only the statements of theorems. Merely opening the +journal binds the reader to a lengthy legal agreement, stating that +theorems be used only for specific purposes and threatening serious +legal consequences for attempting to discover the author's proofs. + +The actions of a single student, employee, or faculty member can +expose an institution to a costly ``journal audit'' from the +Mathematical Society of America (MSA), with the institution +responsible for legal costs if the audit reveals license violations +anywhere in the organization. + +Mathematicians who long for the Old Days when papers contained +proofs and were shared freely are dismissed as idealistic cranks +or labeled anti-business communists. Common knowledge asserts the +obvious superiority of proprietary journals, and the necessity of +licenses for keeping mathematicians gainfully employed. + +\texicomment +\noindent$\phantom{.}$\hfil\vbox{\hrule width 4in}\hfil +\texicommentend + +Back in our world, some vendors have attempted to placate opponents of +closed source with ``shared source'' licenses, under which one may +sign a non-disclosure agreement and subsequently examine source +code. In the future world analogy, a shared source agreement would +allow journal licensees to sign an NDA, then see the proofs of +theorems. Readers could thereby correct errors in proofs (benefitting +the publisher by improving the reliability of the journal), but would +be legally forbidden from using the ideas elsewhere (denying benefit +to other mathematicians). + +Legally and conceptually codifying software as a commodity ignores a +fundamental reality: Like an idea or recipe, software can be copied +without loss of the original. The perception of ``theft'' by copying +arises from an artificial belief that software has an owner who must +be monetarily compensated each time a person acquires a copy. The +nature of software does not enforce the ``sale'' model in the way +services and physical commodities do. It therefore seems +philosophically inappropriate to treat software as a commodity, and +perilous to conform the legal system to the enforcement of such a +model. + +At its best, software enhances our productivity and +creativity. Sharing software, like sharing ideas, benefits a larger +number of people without detriment to existing users. I hope this +modest program is, in conjunction with the much larger efforts of +others (especially Donald Knuth, Richard Stallman, and the many people +who have contributed to the authorship of \LaTeX\ and its packages), +useful to you in your mathematical work. + +Please visit the Free Software Foundation, at +\URL{www.fsf.org}, to learn more about free software and how +you can contribute to its development and adoption. +\index{Free software|)} + +\texinfoappendix{B}{Acknowledgments} + +\ePiX\ is built on the work of many people (unfortunately, most of +whom I am unaware). The following people have contributed, sometimes +unknowingly but always generously: + +\paragraph{Infrastructure} Donald Knuth, Conrad Kwok, Leslie Lamport, +Tim Morgan, Piet van~Oostrum, Sunil Podar, Richard Stallman, Till +Tantau, Herbert Voss, Timothy van~Zandt + +\paragraph{Enhancements} Jay Belanger, Robin Blume-Kohout, Julian +Gilbey, Marcus Hanwell, Yvon Henel, Svend Daug{\aa}rd Pedersen, Andrew +Sterian + +\paragraph{Porting and packaging} Julian Gilbey (Debian); Tsuguru Kato +(FreeBSD); Markus Dittrich, Danny van Dyk, Christian Faulhammer, +Olivier Fisette, Chris Gianelloni, Michael Hanselmann, Marcus Hanwell, +David Holm, Peter Johanson, Patrick Kursawe, Tobias Scherbaum, Markus +Ullmann (Gentoo); Guido Gonzato (RPM); Rene Rebe (T2) + +\paragraph{Debugging, advice, and other assistance} Jay Belanger, +Felipe Paulo Guazzi Bergo, Karl Berry, Robin Blume-Kohout, Patrick +Cousot, Stephen Gibson, Julian Gilbey, Dov Grobgeld, Bob Grover, Jim +Hefferon, Jacques L'helgoual, Yvon Henel, Hartmut Henkel, Herng-Jeng +Jou, Walter Kehowski, Kevin McCormick, Ross Moore, Thorsten Riess, +Alan Sill, Neel Smith, Michael Somos, Andrew Sterian, Ryszard Tanas, +Kai Trukenmueller, Torbjorn Vik, Wenguang Wang, Gabe Weaver, Mariusz +Wodzicki + +\texicomment +\begin{thebibliography}{9} +% +\bibitem{Cline} Marshall Cline, \emph{\CXX\ FAQ Lite}, \\ + \URL{http://www.parashift.com/c++-faq-lite/} +% +\bibitem{xcolor} Uwe Kern, \emph{Extending \LaTeX's color facilities: + the \code{xcolor} package}, white paper, Jan.~21, 2007 +% +\bibitem{KnR} Brian Kernighan and Dennis Ritchie, \emph{The \code{C} + Programming Language}, Second Ed., Prentice-Hall Software Series, + 1988 +% +\bibitem{GNUC} Sandra Loosemore, Richard M. Stallman, et.\ al., + \emph{The GNU \code{C}~Library Reference Manual}, GNU Press, + 2004 +% +\bibitem{Prata} Stephen Prata, \emph{\CXX\ Primer Plus}, Sams, 2002 +% +\bibitem{R} Keith Reckdahl, \emph{Using Imported Graphics in + \LaTeX2e}, Version~2.0, white paper, Dec.~15, 1997 +% +\bibitem{GNUCoding} Richard M. Stallman, et.\ al., \emph{The GNU + Coding Standards}, \\ + \URL{http://www.gnu.org/prep/standards/} +% +\bibitem{S} Bjarne Stroustrup, \emph{The \CXX\ Programming Language}, + Special Ed., Addison-Wesley, 1997 +% +\bibitem{Z} Timothy van~Zandt, \emph{PSTricks: PostScript Macros for + Generic \TeX}, Version~0.93a, white paper, Mar.~12, 1993 +% +\end{thebibliography} + +\clearpage + +\printindex + +\end{document} + +\texicommentend diff --git a/graphics/epix/doc/marker.eepic b/graphics/epix/doc/marker.eepic new file mode 100644 index 0000000000..5ee5923a3b --- /dev/null +++ b/graphics/epix/doc/marker.eepic @@ -0,0 +1,39 @@ +%% Generated from marker.xp on Tue Jan 4 15:32:18 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [0,5] x [0,1] +%% Actual size: 3.75in x 1in +%% Figure offset: right by 0in, up by 0in +%% +\setlength{\unitlength}{0.25in} +\begin{picture}(15,4)(-0,-0) +%% --- +\put(0.664176,3.77861){{\tt{CIRC}}} +\whiten\put(0,4){\makebox(0,0)[c]{{\circle{0.166044}}}} +\put(4.41418,3.77861){{\tt{SPOT}}} +\put(3.75,4){\makebox(0,0)[c]{{\circle*{0.249066}}}} +\put(8.16418,3.77861){{\tt{RING}}} +\put(7.5,4){\makebox(0,0)[c]{{\circle{0.249066}}}} +\put(11.9142,3.77861){{\tt{DOT}}} +\put(11.25,4){\makebox(0,0)[c]{{\circle*{0.166044}}}} +\put(15.6642,3.77861){{\tt{DDOT}}} +\put(15,4){\makebox(0,0)[c]{{\circle*{0.110696}}}} +\put(0.664176,1.77861){{\tt{PLUS}}} +\put(0,2){\makebox(0,0)[c]{+}} +\put(4.41418,1.77861){{\tt{OPLUS}}} +\put(3.75,2){\makebox(0,0)[c]{$\oplus$}} +\put(8.16418,1.77861){{\tt{TIMES}}} +\put(7.5,2){\makebox(0,0)[c]{$\times$}} +\put(11.9142,1.77861){{\tt{OTIMES}}} +\put(11.25,2){\makebox(0,0)[c]{$\otimes$}} +\put(0.664176,-0.221392){{\tt{DIAMOND}}} +\put(0,0){\makebox(0,0)[c]{$\diamond$}} +\put(4.41418,-0.221392){{\tt{UP}}} +\put(3.75,0){\makebox(0,0)[c]{$\bigtriangleup$}} +\put(8.16418,-0.221392){{\tt{DOWN}}} +\put(7.5,0){\makebox(0,0)[c]{$\bigtriangledown$}} +\put(11.9142,-0.221392){{\tt{BOX}}} +\put(11.25,0){\makebox(0,0)[c]{\rule{3pt}{3pt}}} +\put(15.6642,-0.221392){{\tt{BBOX}}} +\put(15,0){\makebox(0,0)[c]{\rule{2pt}{2pt}}} +\end{picture} diff --git a/graphics/epix/doc/marker.xp b/graphics/epix/doc/marker.xp new file mode 100644 index 0000000000..f1569c1476 --- /dev/null +++ b/graphics/epix/doc/marker.xp @@ -0,0 +1,68 @@ +/* -*-ePiX-*- */ +/* marker.c -- types of marker */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + unitlength("0.25in"); + picture(P(15,4)); + bounding_box(P(0,0), P(5,1)); + // offset(P(-1,0)); + + begin(); + + double x1 = x_min; + double x2 = x_min + x_size/4; + double x3 = x_min + 2*x_size/4; + double x4 = x_min + 3*x_size/4; + double x5 = x_max; + + double y1 = y_min; + double y2 = y_min + y_size/2; + double y3 = y_max; + + label(P(x1,y3), P(12,-4), "{\\tt{CIRC}}"); + circ(P(x1,y3)); + + label(P(x2,y3), P(12,-4), "{\\tt{SPOT}}"); + spot(P(x2,y3)); + + label(P(x3,y3), P(12,-4), "{\\tt{RING}}"); + ring(P(x3,y3)); + + label(P(x4,y3), P(12,-4), "{\\tt{DOT}}"); + dot(P(x4,y3)); + + label(P(x5,y3), P(12,-4), "{\\tt{DDOT}}"); + ddot(P(x5,y3)); + + label(P(x1,y2), P(12,-4), "{\\tt{PLUS}}"); + marker(P(x1,y2), PLUS); + + label(P(x2,y2), P(12,-4), "{\\tt{OPLUS}}"); + marker(P(x2,y2), OPLUS); + + label(P(x3,y2), P(12,-4), "{\\tt{TIMES}}"); + marker(P(x3,y2), TIMES); + + label(P(x4,y2), P(12,-4), "{\\tt{OTIMES}}"); + marker(P(x4,y2), OTIMES); + + label(P(x1,y1), P(12,-4), "{\\tt{DIAMOND}}"); + marker(P(x1,y1), DIAMOND); + + label(P(x2,y1), P(12,-4), "{\\tt{UP}}"); + marker(P(x2,y1),UP); + + label(P(x3,y1), P(12,-4), "{\\tt{DOWN}}"); + marker(P(x3,y1), DOWN); + + label(P(x4,y1), P(12,-4), "{\\tt{BOX}}"); + marker(P(x4,y1), BOX); + + label(P(x5,y1), P(12,-4), "{\\tt{BBOX}}"); + marker(P(x5,y1), BBOX); + + end(); +} diff --git a/graphics/epix/doc/my_code.cc b/graphics/epix/doc/my_code.cc new file mode 100644 index 0000000000..b7365fa63c --- /dev/null +++ b/graphics/epix/doc/my_code.cc @@ -0,0 +1,15 @@ +/* my_code.cc */ +#include "my_code.h" +using namespace ePiX; + +namespace Mine { + double lorentz_norm(P arg) + { + double x=arg.x1(), y=arg.x2(), z=arg.x3(); // extract coords + return -x*x + y*y + z*z; + } + bool spacelike(P arg) + { + return (lorentz_norm(arg) > 0); + } +} // end of namespace diff --git a/graphics/epix/doc/my_code.h b/graphics/epix/doc/my_code.h new file mode 100644 index 0000000000..229e80dbf4 --- /dev/null +++ b/graphics/epix/doc/my_code.h @@ -0,0 +1,10 @@ +/* my_code.h */ +#include <cmath> // standard library math header +#include "epix.h" // ePiX header +using ePiX::P; + +namespace Mine { // to avoid name conflicts + // functions for special relativity + double lorentz_norm(P); + bool spacelike(P); +} // end of namespace diff --git a/graphics/epix/doc/objects.eepic b/graphics/epix/doc/objects.eepic new file mode 100644 index 0000000000..9b17600895 --- /dev/null +++ b/graphics/epix/doc/objects.eepic @@ -0,0 +1,412 @@ +%% Generated from objects.xp on Thu Jun 28 14:55:45 EDT 2007 by +%% ePiX-1.1.6 +%% +%% Cartesian bounding box: [0,5] x [0,2] +%% Actual size: 3.75 x 1.5in +%% Figure offset: left by 0in, down by 0in +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0} +\xdefinecolor{rgb_e5e5e5}{rgb}{0.898039,0.898039,0.898039} +\xdefinecolor{rgb_ffffff}{rgb}{1,1,1} +\setlength{\unitlength}{1in} +\begin{picture}(3.75,1.5)(-0,-0) +\path(0.675,0.75)(2.325,0.75)(1.5,1.125)(0.675,0.75) +%% +\path(3.1875,1.125)(3.18724,1.13481)(3.18647,1.1446) + (3.18519,1.15433)(3.1834,1.16398)(3.18111,1.17353)(3.17832,1.18294) + (3.17505,1.19219)(3.17129,1.20126)(3.16706,1.21012) + (3.16238,1.21875)(3.15725,1.22712)(3.15169,1.23521)(3.14571,1.243) + (3.13934,1.25046)(3.13258,1.25758)(3.12546,1.26434)(3.118,1.27071) + (3.11021,1.27669)(3.10212,1.28225)(3.09375,1.28738) + (3.08512,1.29206)(3.07626,1.29629)(3.06719,1.30005) + (3.05794,1.30332)(3.04853,1.30611)(3.03898,1.3084)(3.02933,1.31019) + (3.0196,1.31147)(3.00981,1.31224)(3,1.3125)(2.99019,1.31224) + (2.9804,1.31147)(2.97067,1.31019)(2.96102,1.3084)(2.95147,1.30611) + (2.94206,1.30332)(2.93281,1.30005)(2.92374,1.29629) + (2.91488,1.29206)(2.90625,1.28738)(2.89788,1.28225) + (2.88979,1.27669)(2.882,1.27071)(2.87454,1.26434)(2.86742,1.25758) + (2.86066,1.25046)(2.85429,1.243)(2.84831,1.23521)(2.84275,1.22712) + (2.83762,1.21875)(2.83294,1.21012)(2.82871,1.20126) + (2.82495,1.19219)(2.82168,1.18294)(2.81889,1.17353)(2.8166,1.16398) + (2.81481,1.15433)(2.81353,1.1446)(2.81276,1.13481)(2.8125,1.125) + (2.81276,1.11519)(2.81353,1.1054)(2.81481,1.09567)(2.8166,1.08602) + (2.81889,1.07647)(2.82168,1.06706)(2.82495,1.05781) + (2.82871,1.04874)(2.83294,1.03988)(2.83762,1.03125) + (2.84275,1.02288)(2.84831,1.01479)(2.85429,1.007)(2.86066,0.999538) + (2.86742,0.992417)(2.87454,0.98566)(2.882,0.979285) + (2.88979,0.973309)(2.89788,0.967749)(2.90625,0.96262) + (2.91488,0.957936)(2.92374,0.95371)(2.93281,0.949954) + (2.94206,0.946677)(2.95147,0.943889)(2.96102,0.941597) + (2.97067,0.939808)(2.9804,0.938527)(2.99019,0.937757)(3,0.9375) + (3.00981,0.937757)(3.0196,0.938527)(3.02933,0.939808) + (3.03898,0.941597)(3.04853,0.943889)(3.05794,0.946677) + (3.06719,0.949954)(3.07626,0.95371)(3.08512,0.957936) + (3.09375,0.96262)(3.10212,0.967749)(3.11021,0.973309) + (3.118,0.979285)(3.12546,0.98566)(3.13258,0.992417) + (3.13934,0.999538)(3.14571,1.007)(3.15169,1.01479)(3.15725,1.02288) + (3.16238,1.03125)(3.16706,1.03988)(3.17129,1.04874) + (3.17505,1.05781)(3.17832,1.06706)(3.18111,1.07647)(3.1834,1.08602) + (3.18519,1.09567)(3.18647,1.1054)(3.18724,1.11519)(3.1875,1.125) +%% +\path(0.75,0)(2.25,0)(2.25,0.75)(0.75,0.75)(0.75,0) +%% +\color{rgb_e5e5e5}% +\path(2.025,0.00550459)(1.725,0.00550459) +\path(2.025,0.0110092)(1.725,0.0110092) +\path(2.025,0.0165138)(1.725,0.0165138) +\path(2.025,0.0220183)(1.725,0.0220183) +\path(2.025,0.0275229)(1.725,0.0275229) +\path(2.025,0.0330275)(1.725,0.0330275) +\path(2.025,0.0385321)(1.725,0.0385321) +\path(2.025,0.0440367)(1.725,0.0440367) +\path(2.025,0.0495413)(1.725,0.0495413) +\path(2.025,0.0550459)(1.725,0.0550459) +\path(2.025,0.0605505)(1.725,0.0605505) +\path(2.025,0.066055)(1.725,0.066055) +\path(2.025,0.0715596)(1.725,0.0715596) +\path(2.025,0.0770642)(1.725,0.0770642) +\path(2.025,0.0825688)(1.725,0.0825688) +\path(2.025,0.0880734)(1.725,0.0880734) +\path(2.025,0.093578)(1.725,0.093578) +\path(2.025,0.0990826)(1.725,0.0990826) +\path(2.025,0.104587)(1.725,0.104587) +\path(2.025,0.110092)(1.725,0.110092) +\path(2.025,0.115596)(1.725,0.115596) +\path(2.025,0.121101)(1.725,0.121101) +\path(2.025,0.126606)(1.725,0.126606) +\path(2.025,0.13211)(1.725,0.13211) +\path(2.025,0.137615)(1.725,0.137615) +\path(2.025,0.143119)(1.725,0.143119) +\path(2.025,0.148624)(1.725,0.148624) +\path(2.025,0.154128)(1.725,0.154128) +\path(2.025,0.159633)(1.725,0.159633) +\path(2.025,0.165138)(1.725,0.165138) +\path(2.025,0.170642)(1.725,0.170642) +\path(2.025,0.176147)(1.725,0.176147) +\path(2.025,0.181651)(1.725,0.181651) +\path(2.025,0.187156)(1.725,0.187156) +\path(2.025,0.192661)(1.725,0.192661) +\path(2.025,0.198165)(1.725,0.198165) +\path(2.025,0.20367)(1.725,0.20367) +\path(2.025,0.209174)(1.725,0.209174) +\path(2.025,0.214679)(1.725,0.214679) +\path(2.025,0.220183)(1.725,0.220183) +\path(2.025,0.225688)(1.725,0.225688) +\path(2.025,0.231193)(1.725,0.231193) +\path(2.025,0.236697)(1.725,0.236697) +\path(2.025,0.242202)(1.725,0.242202) +\path(2.025,0.247706)(1.725,0.247706) +\path(2.025,0.253211)(1.725,0.253211) +\path(2.025,0.258716)(1.725,0.258716) +\path(2.025,0.26422)(1.725,0.26422) +\path(2.025,0.269725)(1.725,0.269725) +\path(2.025,0.275229)(1.725,0.275229) +\path(2.025,0.280734)(1.725,0.280734) +\path(2.025,0.286239)(1.725,0.286239) +\path(2.025,0.291743)(1.725,0.291743) +\path(2.025,0.297248)(1.725,0.297248) +\path(2.025,0.302752)(1.725,0.302752) +\path(2.025,0.308257)(1.725,0.308257) +\path(2.025,0.313761)(1.725,0.313761) +\path(2.025,0.319266)(1.725,0.319266) +\path(2.025,0.324771)(1.725,0.324771) +\path(2.025,0.330275)(1.725,0.330275) +\path(2.025,0.33578)(1.725,0.33578) +\path(2.025,0.341284)(1.725,0.341284) +\path(2.025,0.346789)(1.725,0.346789) +\path(2.025,0.352294)(1.725,0.352294) +\path(2.025,0.357798)(1.725,0.357798) +\path(2.025,0.363303)(1.725,0.363303) +\path(2.025,0.368807)(1.725,0.368807) +\path(2.025,0.374312)(1.725,0.374312) +\path(2.025,0.379817)(1.725,0.379817) +\path(2.025,0.385321)(1.725,0.385321) +\path(2.025,0.390826)(1.725,0.390826) +\path(2.025,0.39633)(1.725,0.39633) +\path(2.025,0.401835)(1.725,0.401835) +\path(2.025,0.407339)(1.725,0.407339) +\path(2.025,0.412844)(1.725,0.412844) +\path(2.025,0.418349)(1.725,0.418349) +\path(2.025,0.423853)(1.725,0.423853) +\path(2.025,0.429358)(1.725,0.429358) +\path(2.025,0.434862)(1.725,0.434862) +\path(2.025,0.440367)(1.725,0.440367) +\path(2.025,0.445872)(1.725,0.445872) +\path(2.025,0.451376)(1.725,0.451376) +\path(2.025,0.456881)(1.725,0.456881) +\path(2.025,0.462385)(1.725,0.462385) +\path(2.025,0.46789)(1.725,0.46789) +\path(2.025,0.473394)(1.725,0.473394) +\path(2.025,0.478899)(1.725,0.478899) +\path(2.025,0.484404)(1.725,0.484404) +\path(2.025,0.489908)(1.725,0.489908) +\path(2.025,0.495413)(1.725,0.495413) +\path(2.025,0.500917)(1.725,0.500917) +\path(2.025,0.506422)(1.725,0.506422) +\path(2.025,0.511927)(1.725,0.511927) +\path(2.025,0.517431)(1.725,0.517431) +\path(2.025,0.522936)(1.725,0.522936) +\path(2.025,0.52844)(1.725,0.52844) +\path(2.025,0.533945)(1.725,0.533945) +\path(2.025,0.53945)(1.725,0.53945) +\path(2.025,0.544954)(1.725,0.544954) +\path(2.025,0.550459)(1.725,0.550459) +\path(2.025,0.555963)(1.725,0.555963) +\path(2.025,0.561468)(1.725,0.561468) +\path(2.025,0.566972)(1.725,0.566972) +\path(2.025,0.572477)(1.725,0.572477) +\path(2.025,0.577982)(1.725,0.577982) +\path(2.025,0.583486)(1.725,0.583486) +\path(2.025,0.588991)(1.725,0.588991) +\path(2.025,0.594495)(1.725,0.594495) +\path(2.01955,0.6)(2.01955,0) +\path(2.01409,0.6)(2.01409,0) +\path(2.00864,0.6)(2.00864,0) +\path(2.00318,0.6)(2.00318,0) +\path(1.99773,0.6)(1.99773,0) +\path(1.99227,0.6)(1.99227,0) +\path(1.98682,0.6)(1.98682,0) +\path(1.98136,0.6)(1.98136,0) +\path(1.97591,0.6)(1.97591,0) +\path(1.97045,0.6)(1.97045,0) +\path(1.965,0.6)(1.965,0) +\path(1.95955,0.6)(1.95955,0) +\path(1.95409,0.6)(1.95409,0) +\path(1.94864,0.6)(1.94864,0) +\path(1.94318,0.6)(1.94318,0) +\path(1.93773,0.6)(1.93773,0) +\path(1.93227,0.6)(1.93227,0) +\path(1.92682,0.6)(1.92682,0) +\path(1.92136,0.6)(1.92136,0) +\path(1.91591,0.6)(1.91591,0) +\path(1.91045,0.6)(1.91045,0) +\path(1.905,0.6)(1.905,0) +\path(1.89955,0.6)(1.89955,0) +\path(1.89409,0.6)(1.89409,0) +\path(1.88864,0.6)(1.88864,0) +\path(1.88318,0.6)(1.88318,0) +\path(1.87773,0.6)(1.87773,0) +\path(1.87227,0.6)(1.87227,0) +\path(1.86682,0.6)(1.86682,0) +\path(1.86136,0.6)(1.86136,0) +\path(1.85591,0.6)(1.85591,0) +\path(1.85045,0.6)(1.85045,0) +\path(1.845,0.6)(1.845,0) +\path(1.83955,0.6)(1.83955,0) +\path(1.83409,0.6)(1.83409,0) +\path(1.82864,0.6)(1.82864,0) +\path(1.82318,0.6)(1.82318,0) +\path(1.81773,0.6)(1.81773,0) +\path(1.81227,0.6)(1.81227,0) +\path(1.80682,0.6)(1.80682,0) +\path(1.80136,0.6)(1.80136,0) +\path(1.79591,0.6)(1.79591,0) +\path(1.79045,0.6)(1.79045,0) +\path(1.785,0.6)(1.785,0) +\path(1.77955,0.6)(1.77955,0) +\path(1.77409,0.6)(1.77409,0) +\path(1.76864,0.6)(1.76864,0) +\path(1.76318,0.6)(1.76318,0) +\path(1.75773,0.6)(1.75773,0) +\path(1.75227,0.6)(1.75227,0) +\path(1.74682,0.6)(1.74682,0) +\path(1.74136,0.6)(1.74136,0) +\path(1.73591,0.6)(1.73591,0) +\path(1.73045,0.6)(1.73045,0) +\color{rgb_000000}% +\path(1.725,0)(2.025,0)(2.025,0.6)(1.725,0.6)(1.725,0) +%% +\color{rgb_ffffff}% +\path(1.4941,0.45)(1.5,0.434819) +\path(1.48819,0.45)(1.5,0.419637) +\path(1.48229,0.45)(1.5,0.404456) +\path(1.47639,0.45)(1.5,0.389275) +\path(1.47049,0.45)(1.5,0.374093) +\path(1.46458,0.45)(1.5,0.358912) +\path(1.45868,0.45)(1.5,0.343731) +\path(1.45278,0.45)(1.5,0.32855) +\path(1.44688,0.45)(1.5,0.313368) +\path(1.44097,0.45)(1.5,0.298187) +\path(1.43507,0.45)(1.5,0.283006) +\path(1.42917,0.45)(1.5,0.267824) +\path(1.42327,0.45)(1.5,0.252643) +\path(1.41736,0.45)(1.5,0.237462) +\path(1.41146,0.45)(1.5,0.22228) +\path(1.40556,0.45)(1.5,0.207099) +\path(1.39966,0.45)(1.5,0.191918) +\path(1.39375,0.45)(1.5,0.176737) +\path(1.38785,0.45)(1.5,0.161555) +\path(1.38195,0.45)(1.49859,0.15) +\path(1.37605,0.45)(1.49269,0.15) +\path(1.37014,0.45)(1.48679,0.15) +\path(1.36424,0.45)(1.48088,0.15) +\path(1.35834,0.45)(1.47498,0.15) +\path(1.35244,0.45)(1.46908,0.15) +\path(1.34653,0.45)(1.46318,0.15) +\path(1.34063,0.45)(1.45727,0.15) +\path(1.33473,0.45)(1.45137,0.15) +\path(1.32883,0.45)(1.44547,0.15) +\path(1.32292,0.45)(1.43957,0.15) +\path(1.31702,0.45)(1.43366,0.15) +\path(1.31112,0.45)(1.42776,0.15) +\path(1.30522,0.45)(1.42186,0.15) +\path(1.29931,0.45)(1.41596,0.15) +\path(1.29341,0.45)(1.41005,0.15) +\path(1.28751,0.45)(1.40415,0.15) +\path(1.28161,0.45)(1.39825,0.15) +\path(1.2757,0.45)(1.39235,0.15) +\path(1.2698,0.45)(1.38644,0.15) +\path(1.2639,0.45)(1.38054,0.15) +\path(1.258,0.45)(1.37464,0.15) +\path(1.25209,0.45)(1.36874,0.15) +\path(1.24619,0.45)(1.36283,0.15) +\path(1.24029,0.45)(1.35693,0.15) +\path(1.23439,0.45)(1.35103,0.15) +\path(1.22848,0.45)(1.34513,0.15) +\path(1.22258,0.45)(1.33922,0.15) +\path(1.21668,0.45)(1.33332,0.15) +\path(1.21078,0.45)(1.32742,0.15) +\path(1.20487,0.45)(1.32152,0.15) +\path(1.19897,0.45)(1.31561,0.15) +\path(1.19307,0.45)(1.30971,0.15) +\path(1.18717,0.45)(1.30381,0.15) +\path(1.18126,0.45)(1.29791,0.15) +\path(1.17536,0.45)(1.292,0.15) +\path(1.16946,0.45)(1.2861,0.15) +\path(1.16356,0.45)(1.2802,0.15) +\path(1.15765,0.45)(1.2743,0.15) +\path(1.15175,0.45)(1.26839,0.15) +\path(1.14585,0.45)(1.26249,0.15) +\path(1.13995,0.45)(1.25659,0.15) +\path(1.13404,0.45)(1.25069,0.15) +\path(1.12814,0.45)(1.24478,0.15) +\path(1.12224,0.45)(1.23888,0.15) +\path(1.11634,0.45)(1.23298,0.15) +\path(1.11043,0.45)(1.22708,0.15) +\path(1.10453,0.45)(1.22117,0.15) +\path(1.09863,0.45)(1.21527,0.15) +\path(1.09273,0.45)(1.20937,0.15) +\path(1.08682,0.45)(1.20347,0.15) +\path(1.08092,0.45)(1.19756,0.15) +\path(1.07502,0.45)(1.19166,0.15) +\path(1.06912,0.45)(1.18576,0.15) +\path(1.06321,0.45)(1.17986,0.15) +\path(1.05731,0.45)(1.17395,0.15) +\path(1.05141,0.45)(1.16805,0.15) +\path(1.05,0.438445)(1.16215,0.15) +\path(1.05,0.423263)(1.15625,0.15) +\path(1.05,0.408082)(1.15034,0.15) +\path(1.05,0.392901)(1.14444,0.15) +\path(1.05,0.37772)(1.13854,0.15) +\path(1.05,0.362538)(1.13264,0.15) +\path(1.05,0.347357)(1.12673,0.15) +\path(1.05,0.332176)(1.12083,0.15) +\path(1.05,0.316994)(1.11493,0.15) +\path(1.05,0.301813)(1.10903,0.15) +\path(1.05,0.286632)(1.10312,0.15) +\path(1.05,0.27145)(1.09722,0.15) +\path(1.05,0.256269)(1.09132,0.15) +\path(1.05,0.241088)(1.08542,0.15) +\path(1.05,0.225907)(1.07951,0.15) +\path(1.05,0.210725)(1.07361,0.15) +\path(1.05,0.195544)(1.06771,0.15) +\path(1.05,0.180363)(1.06181,0.15) +\path(1.05,0.165181)(1.0559,0.15) +\path(1.05,0.444063)(1.06527,0.45) +\path(1.05,0.438126)(1.08054,0.45) +\path(1.05,0.432189)(1.09581,0.45) +\path(1.05,0.426252)(1.11108,0.45) +\path(1.05,0.420315)(1.12635,0.45) +\path(1.05,0.414378)(1.14162,0.45) +\path(1.05,0.408441)(1.15689,0.45) +\path(1.05,0.402504)(1.17216,0.45) +\path(1.05,0.396567)(1.18743,0.45) +\path(1.05,0.39063)(1.2027,0.45) +\path(1.05,0.384693)(1.21797,0.45) +\path(1.05,0.378756)(1.23324,0.45) +\path(1.05,0.372819)(1.24851,0.45) +\path(1.05,0.366882)(1.26378,0.45) +\path(1.05,0.360945)(1.27905,0.45) +\path(1.05,0.355008)(1.29432,0.45) +\path(1.05,0.349071)(1.30959,0.45) +\path(1.05,0.343134)(1.32486,0.45) +\path(1.05,0.337197)(1.34013,0.45) +\path(1.05,0.33126)(1.3554,0.45) +\path(1.05,0.325323)(1.37067,0.45) +\path(1.05,0.319386)(1.38594,0.45) +\path(1.05,0.313449)(1.40121,0.45) +\path(1.05,0.307512)(1.41648,0.45) +\path(1.05,0.301575)(1.43175,0.45) +\path(1.05,0.295638)(1.44702,0.45) +\path(1.05,0.289701)(1.46229,0.45) +\path(1.05,0.283764)(1.47756,0.45) +\path(1.05,0.277827)(1.49283,0.45) +\path(1.05,0.27189)(1.5,0.44685) +\path(1.05,0.265953)(1.5,0.440913) +\path(1.05,0.260016)(1.5,0.434976) +\path(1.05,0.254079)(1.5,0.429039) +\path(1.05,0.248142)(1.5,0.423102) +\path(1.05,0.242205)(1.5,0.417165) +\path(1.05,0.236268)(1.5,0.411228) +\path(1.05,0.230331)(1.5,0.405291) +\path(1.05,0.224394)(1.5,0.399354) +\path(1.05,0.218457)(1.5,0.393417) +\path(1.05,0.21252)(1.5,0.38748) +\path(1.05,0.206583)(1.5,0.381543) +\path(1.05,0.200646)(1.5,0.375606) +\path(1.05,0.194709)(1.5,0.369669) +\path(1.05,0.188772)(1.5,0.363732) +\path(1.05,0.182835)(1.5,0.357795) +\path(1.05,0.176898)(1.5,0.351858) +\path(1.05,0.170961)(1.5,0.345921) +\path(1.05,0.165024)(1.5,0.339984) +\path(1.05,0.159087)(1.5,0.334047) +\path(1.05,0.15315)(1.5,0.32811) +\path(1.05717,0.15)(1.5,0.322173) +\path(1.07244,0.15)(1.5,0.316236) +\path(1.08771,0.15)(1.5,0.310299) +\path(1.10298,0.15)(1.5,0.304362) +\path(1.11825,0.15)(1.5,0.298425) +\path(1.13352,0.15)(1.5,0.292488) +\path(1.14879,0.15)(1.5,0.286551) +\path(1.16406,0.15)(1.5,0.280614) +\path(1.17933,0.15)(1.5,0.274677) +\path(1.1946,0.15)(1.5,0.26874) +\path(1.20987,0.15)(1.5,0.262803) +\path(1.22514,0.15)(1.5,0.256866) +\path(1.24041,0.15)(1.5,0.250929) +\path(1.25568,0.15)(1.5,0.244992) +\path(1.27095,0.15)(1.5,0.239055) +\path(1.28622,0.15)(1.5,0.233118) +\path(1.30149,0.15)(1.5,0.227181) +\path(1.31676,0.15)(1.5,0.221244) +\path(1.33203,0.15)(1.5,0.215307) +\path(1.3473,0.15)(1.5,0.20937) +\path(1.36257,0.15)(1.5,0.203433) +\path(1.37784,0.15)(1.5,0.197496) +\path(1.39311,0.15)(1.5,0.191559) +\path(1.40838,0.15)(1.5,0.185622) +\path(1.42365,0.15)(1.5,0.179685) +\path(1.43892,0.15)(1.5,0.173748) +\path(1.45419,0.15)(1.5,0.167811) +\path(1.46946,0.15)(1.5,0.161874) +\path(1.48473,0.15)(1.5,0.155937) +\color{rgb_000000}% +\path(1.05,0.15)(1.5,0.15)(1.5,0.45)(1.05,0.45)(1.05,0.15) +%% +\allinethickness{0.8pt}% +\path(1.05,0.15)(1.05,0.45) +%% +\path(1.275,0.15)(1.275,0.45) +%% +\path(1.5,0.15)(1.5,0.45) +%% +\path(1.05,0.15)(1.5,0.15) +%% +\path(1.05,0.3)(1.5,0.3) +%% +\path(1.05,0.45)(1.5,0.45) +%% +\path(0,0)(3.75,0) +%% +\end{picture} diff --git a/graphics/epix/doc/objects.xp b/graphics/epix/doc/objects.xp new file mode 100644 index 0000000000..d0828f0b94 --- /dev/null +++ b/graphics/epix/doc/objects.xp @@ -0,0 +1,33 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + picture(P(0,0), P(5,2), "3.75 x 1.5in"); + + begin(); + + // roof + triangle(P(0.9, 1), P(3.1, 1), P(2, 1.5)); // vertices + + // sun + circle(P(4,1.5), 0.25); // center and radius + + // house + rect(P(1,0), P(3,1)); // opposite corners + // grid(P(1,0), P(3,1), 1, 10); // corners, numbers of subdivisions + + // door + fill(Black(0.1)); + rect(P(2.3,0), P(2.7,0.8)); // corners + + fill(White()); + // window + rect(P(1.4,0.2), P(2, 0.6)); + bold(); + grid(P(1.4,0.2), P(2, 0.6), 2, 2); + + line(P(xmin(),0), P(xmax(),0)); + end(); +} diff --git a/graphics/epix/doc/pathstyle.eepic b/graphics/epix/doc/pathstyle.eepic new file mode 100644 index 0000000000..531523bf45 --- /dev/null +++ b/graphics/epix/doc/pathstyle.eepic @@ -0,0 +1,225 @@ +%% Generated from pathstyle.xp on Tue Jul 17 15:01:22 EDT 2007 by +%% ePiX-1.1.8 +%% +%% Cartesian bounding box: [0,4] x [0,4] +%% Actual size: 4 x 1in +%% Figure offset: left by 0in, down by 0in +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0} +\setlength{\unitlength}{1in} +\begin{picture}(4,1)(-0,-0) +\path(0,1)(0.0394737,1) +\path(0.118421,1)(0.157895,1) +\path(0.157895,1)(0.197368,1) +\path(0.276316,1)(0.315789,1) +\path(0.315789,1)(0.355263,1) +\path(0.434211,1)(0.473684,1) +\path(0.473684,1)(0.513158,1) +\path(0.592105,1)(0.631579,1) +\path(0.631579,1)(0.671053,1) +\path(0.75,1)(0.789474,1) +\path(0.789474,1)(0.828947,1) +\path(0.907895,1)(0.947368,1) +\path(0.947368,1)(0.986842,1) +\path(1.06579,1)(1.10526,1) +\path(1.10526,1)(1.14474,1) +\path(1.22368,1)(1.26316,1) +\path(1.26316,1)(1.30263,1) +\path(1.38158,1)(1.42105,1) +\path(1.42105,1)(1.46053,1) +\path(1.53947,1)(1.57895,1) +\path(1.57895,1)(1.61842,1) +\path(1.69737,1)(1.73684,1) +\path(1.73684,1)(1.77632,1) +\path(1.85526,1)(1.89474,1) +\path(1.89474,1)(1.93421,1) +\path(2.01316,1)(2.05263,1) +\path(2.05263,1)(2.09211,1) +\path(2.17105,1)(2.21053,1) +\path(2.21053,1)(2.25,1) +\path(2.32895,1)(2.36842,1) +\path(2.36842,1)(2.40789,1) +\path(2.48684,1)(2.52632,1) +\path(2.52632,1)(2.56579,1) +\path(2.64474,1)(2.68421,1) +\path(2.68421,1)(2.72368,1) +\path(2.80263,1)(2.84211,1) +\path(2.84211,1)(2.88158,1) +\path(2.96053,1)(3,1) +\put(3.05535,1){\makebox(0,0)[l]{\code{line\_style("-\ \ -")}}} +\path(0,0.75)(0.0263158,0.75) +\path(0.131579,0.75)(0.157895,0.75) +\path(0.157895,0.75)(0.184211,0.75) +\path(0.289474,0.75)(0.315789,0.75) +\path(0.315789,0.75)(0.342105,0.75) +\path(0.447368,0.75)(0.473684,0.75) +\path(0.473684,0.75)(0.5,0.75) +\path(0.605263,0.75)(0.631579,0.75) +\path(0.631579,0.75)(0.657895,0.75) +\path(0.763158,0.75)(0.789474,0.75) +\path(0.789474,0.75)(0.815789,0.75) +\path(0.921053,0.75)(0.947368,0.75) +\path(0.947368,0.75)(0.973684,0.75) +\path(1.07895,0.75)(1.10526,0.75) +\path(1.10526,0.75)(1.13158,0.75) +\path(1.23684,0.75)(1.26316,0.75) +\path(1.26316,0.75)(1.28947,0.75) +\path(1.39474,0.75)(1.42105,0.75) +\path(1.42105,0.75)(1.44737,0.75) +\path(1.55263,0.75)(1.57895,0.75) +\path(1.57895,0.75)(1.60526,0.75) +\path(1.71053,0.75)(1.73684,0.75) +\path(1.73684,0.75)(1.76316,0.75) +\path(1.86842,0.75)(1.89474,0.75) +\path(1.89474,0.75)(1.92105,0.75) +\path(2.02632,0.75)(2.05263,0.75) +\path(2.05263,0.75)(2.07895,0.75) +\path(2.18421,0.75)(2.21053,0.75) +\path(2.21053,0.75)(2.23684,0.75) +\path(2.34211,0.75)(2.36842,0.75) +\path(2.36842,0.75)(2.39474,0.75) +\path(2.5,0.75)(2.52632,0.75) +\path(2.52632,0.75)(2.55263,0.75) +\path(2.65789,0.75)(2.68421,0.75) +\path(2.68421,0.75)(2.71053,0.75) +\path(2.81579,0.75)(2.84211,0.75) +\path(2.84211,0.75)(2.86842,0.75) +\path(2.97368,0.75)(3,0.75) +\put(3.05535,0.75){\makebox(0,0)[l]{\code{line\_style("-\ \ \ \ -")}}} +\put(0.0789474,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(0.236842,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(0.394737,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(0.552632,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(0.710526,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(0.868421,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(1.02632,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(1.18421,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(1.34211,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(1.5,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(1.65789,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(1.81579,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(1.97368,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(2.13158,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(2.28947,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(2.44737,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(2.60526,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(2.76316,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(2.92105,0.5){\makebox(0,0){\circle{0.0055348}}} +\put(3.05535,0.5){\makebox(0,0)[l]{\code{line\_style(" .\ ")}}} +\path(0,0.25)(0.0315789,0.25) +\put(0.0789474,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(0.126316,0.25)(0.157895,0.25) +\path(0.157895,0.25)(0.189474,0.25) +\put(0.236842,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(0.284211,0.25)(0.315789,0.25) +\path(0.315789,0.25)(0.347368,0.25) +\put(0.394737,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(0.442105,0.25)(0.473684,0.25) +\path(0.473684,0.25)(0.505263,0.25) +\put(0.552632,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(0.6,0.25)(0.631579,0.25) +\path(0.631579,0.25)(0.663158,0.25) +\put(0.710526,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(0.757895,0.25)(0.789474,0.25) +\path(0.789474,0.25)(0.821053,0.25) +\put(0.868421,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(0.915789,0.25)(0.947368,0.25) +\path(0.947368,0.25)(0.978947,0.25) +\put(1.02632,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(1.07368,0.25)(1.10526,0.25) +\path(1.10526,0.25)(1.13684,0.25) +\put(1.18421,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(1.23158,0.25)(1.26316,0.25) +\path(1.26316,0.25)(1.29474,0.25) +\put(1.34211,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(1.38947,0.25)(1.42105,0.25) +\path(1.42105,0.25)(1.45263,0.25) +\put(1.5,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(1.54737,0.25)(1.57895,0.25) +\path(1.57895,0.25)(1.61053,0.25) +\put(1.65789,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(1.70526,0.25)(1.73684,0.25) +\path(1.73684,0.25)(1.76842,0.25) +\put(1.81579,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(1.86316,0.25)(1.89474,0.25) +\path(1.89474,0.25)(1.92632,0.25) +\put(1.97368,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(2.02105,0.25)(2.05263,0.25) +\path(2.05263,0.25)(2.08421,0.25) +\put(2.13158,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(2.17895,0.25)(2.21053,0.25) +\path(2.21053,0.25)(2.24211,0.25) +\put(2.28947,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(2.33684,0.25)(2.36842,0.25) +\path(2.36842,0.25)(2.4,0.25) +\put(2.44737,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(2.49474,0.25)(2.52632,0.25) +\path(2.52632,0.25)(2.55789,0.25) +\put(2.60526,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(2.65263,0.25)(2.68421,0.25) +\path(2.68421,0.25)(2.71579,0.25) +\put(2.76316,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(2.81053,0.25)(2.84211,0.25) +\path(2.84211,0.25)(2.87368,0.25) +\put(2.92105,0.25){\makebox(0,0){\circle{0.0055348}}} +\path(2.96842,0.25)(3,0.25) +\put(3.05535,0.25){\makebox(0,0)[l]{\code{line\_style("-\ .\ -")}}} +\put(0.0157895,0){\makebox(0,0){\circle{0.0055348}}} +\path(0.0631579,0)(0.0947368,0) +\put(0.142105,0){\makebox(0,0){\circle{0.0055348}}} +\put(0.173684,0){\makebox(0,0){\circle{0.0055348}}} +\path(0.221053,0)(0.252632,0) +\put(0.3,0){\makebox(0,0){\circle{0.0055348}}} +\put(0.331579,0){\makebox(0,0){\circle{0.0055348}}} +\path(0.378947,0)(0.410526,0) +\put(0.457895,0){\makebox(0,0){\circle{0.0055348}}} +\put(0.489474,0){\makebox(0,0){\circle{0.0055348}}} +\path(0.536842,0)(0.568421,0) +\put(0.615789,0){\makebox(0,0){\circle{0.0055348}}} +\put(0.647368,0){\makebox(0,0){\circle{0.0055348}}} +\path(0.694737,0)(0.726316,0) +\put(0.773684,0){\makebox(0,0){\circle{0.0055348}}} +\put(0.805263,0){\makebox(0,0){\circle{0.0055348}}} +\path(0.852632,0)(0.884211,0) +\put(0.931579,0){\makebox(0,0){\circle{0.0055348}}} +\put(0.963158,0){\makebox(0,0){\circle{0.0055348}}} +\path(1.01053,0)(1.04211,0) +\put(1.08947,0){\makebox(0,0){\circle{0.0055348}}} +\put(1.12105,0){\makebox(0,0){\circle{0.0055348}}} +\path(1.16842,0)(1.2,0) +\put(1.24737,0){\makebox(0,0){\circle{0.0055348}}} +\put(1.27895,0){\makebox(0,0){\circle{0.0055348}}} +\path(1.32632,0)(1.35789,0) +\put(1.40526,0){\makebox(0,0){\circle{0.0055348}}} +\put(1.43684,0){\makebox(0,0){\circle{0.0055348}}} +\path(1.48421,0)(1.51579,0) +\put(1.56316,0){\makebox(0,0){\circle{0.0055348}}} +\put(1.59474,0){\makebox(0,0){\circle{0.0055348}}} +\path(1.64211,0)(1.67368,0) +\put(1.72105,0){\makebox(0,0){\circle{0.0055348}}} +\put(1.75263,0){\makebox(0,0){\circle{0.0055348}}} +\path(1.8,0)(1.83158,0) +\put(1.87895,0){\makebox(0,0){\circle{0.0055348}}} +\put(1.91053,0){\makebox(0,0){\circle{0.0055348}}} +\path(1.95789,0)(1.98947,0) +\put(2.03684,0){\makebox(0,0){\circle{0.0055348}}} +\put(2.06842,0){\makebox(0,0){\circle{0.0055348}}} +\path(2.11579,0)(2.14737,0) +\put(2.19474,0){\makebox(0,0){\circle{0.0055348}}} +\put(2.22632,0){\makebox(0,0){\circle{0.0055348}}} +\path(2.27368,0)(2.30526,0) +\put(2.35263,0){\makebox(0,0){\circle{0.0055348}}} +\put(2.38421,0){\makebox(0,0){\circle{0.0055348}}} +\path(2.43158,0)(2.46316,0) +\put(2.51053,0){\makebox(0,0){\circle{0.0055348}}} +\put(2.54211,0){\makebox(0,0){\circle{0.0055348}}} +\path(2.58947,0)(2.62105,0) +\put(2.66842,0){\makebox(0,0){\circle{0.0055348}}} +\put(2.7,0){\makebox(0,0){\circle{0.0055348}}} +\path(2.74737,0)(2.77895,0) +\put(2.82632,0){\makebox(0,0){\circle{0.0055348}}} +\put(2.85789,0){\makebox(0,0){\circle{0.0055348}}} +\path(2.90526,0)(2.93684,0) +\put(2.98421,0){\makebox(0,0){\circle{0.0055348}}} +\put(3.05535,0){\makebox(0,0)[l]{\code{line\_style(".\ - .")}}} +\end{picture} diff --git a/graphics/epix/doc/pathstyle.xp b/graphics/epix/doc/pathstyle.xp new file mode 100644 index 0000000000..47fe65e5e1 --- /dev/null +++ b/graphics/epix/doc/pathstyle.xp @@ -0,0 +1,24 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +void dash_sample(double ht, std::string pattern) +{ + line_style(pattern); + line(P(0,ht), P(3,ht)); + label(P(3, ht), P(4,0), "\\code{line\\_style(\""+pattern+"\")}", r); +} + +int main() { + picture(P(0,0), P(4,4), "4x1in"); + + begin(); + + dash_sample(4, "-\\ \\ -"); + dash_sample(3, "-\\ \\ \\ \\ -"); + dash_sample(2, " .\\ "); + dash_sample(1, "-\\ .\\ -"); + dash_sample(0, ".\\ - ."); + + end(); +} diff --git a/graphics/epix/doc/plot_a.eepic b/graphics/epix/doc/plot_a.eepic new file mode 100644 index 0000000000..bf0e6e787a --- /dev/null +++ b/graphics/epix/doc/plot_a.eepic @@ -0,0 +1,95 @@ +%% Generated from plot_a.xp on Tue Jul 3 00:20:34 EDT 2007 by +%% ePiX-1.0.25 +%% +%% Cartesian bounding box: [-1,1] x [-1,1] +%% Actual size: 1.5in x 1.5in +%% Figure offset: right by 0in, up by 0in +%% +\setlength{\unitlength}{1in} +\begin{picture}(1.5,1.5)(-0,-0) +%% --- +\path(0.75,0.75)(0.709403,0.666178)(0.666551,0.577699)(0.62125,0.484165) + (0.573284,0.385128)(0.522412,0.280089)(0.46836,0.168485) +\path(0.75,0.75)(0.749023,0.665974)(0.74798,0.585752)(0.746855,0.509046) + (0.745629,0.435587)(0.744277,0.365124)(0.742767,0.297412) +\path(0.75,0.75)(0.788831,0.67297)(0.830368,0.605884)(0.875481,0.548895) + (0.925286,0.502471)(0.981254,0.467495)(1.04539,0.445422) +\path(0.75,0.75)(0.824541,0.685618)(0.903621,0.632501)(0.988754,0.590989) + (1.08184,0.561798)(1.18533,0.546138)(1.30251,0.545884) +\path(0.75,0.75)(0.852385,0.702504)(0.959101,0.662234)(1.07131,0.62933) + (1.19037,0.604066)(1.31791,0.586882)(1.45594,0.578419) +\path(0.75,0.75)(0.869635,0.722554)(0.991406,0.694618)(1.11537,0.666178) + (1.24159,0.637221)(1.37013,0.607733)(1.50104,0.577699) +\path(0.75,0.75)(0.874862,0.74491)(0.998815,0.731016)(1.12092,0.708519) + (1.24029,0.677746)(1.35609,0.639142)(1.46759,0.593248) +\path(0.75,0.75)(0.867939,0.768582)(0.982511,0.77261)(1.09249,0.76265) + (1.19682,0.739556)(1.29466,0.704421)(1.38541,0.658506) +\path(0.75,0.75)(0.849863,0.792084)(0.945428,0.818543)(1.03584,0.830052) + (1.12046,0.827563)(1.1988,0.812243)(1.27061,0.785404) +\path(0.75,0.75)(0.822527,0.813279)(0.891435,0.864939)(0.956495,0.905455) + (1.01755,0.935412)(1.07452,0.955475)(1.12739,0.966366) +\path(0.75,0.75)(0.788515,0.829523)(0.825104,0.905071)(0.859908,0.976933) + (0.893055,1.04537)(0.924661,1.11063)(0.954829,1.17292) +\path(0.75,0.75)(0.750924,0.838139)(0.751807,0.93073)(0.752656,1.02814) + (0.753481,1.13079)(0.754288,1.23912)(0.755083,1.35363) +\path(0.75,0.75)(0.713174,0.837085)(0.677771,0.934566)(0.643292,1.043) + (0.609295,1.16316)(0.575368,1.29605)(0.541119,1.44293) +\path(0.75,0.75)(0.678756,0.825621)(0.609753,0.912727)(0.542063,1.01182) + (0.47484,1.12367)(0.40728,1.24929)(0.33859,1.39004) +\path(0.75,0.75)(0.650938,0.804706)(0.554306,0.866713)(0.459296,0.936218) + (0.365158,1.01352)(0.27118,1.09902)(0.176669,1.19323) +\path(0.75,0.75)(0.632446,0.776969)(0.516918,0.803473)(0.403366,0.829523) + (0.291738,0.855133)(0.181986,0.880311)(0.0740632,0.905071) +\path(0.75,0.75)(0.625191,0.746217)(0.501394,0.73363)(0.379543,0.712441) + (0.260522,0.68298)(0.145146,0.645689)(0.0341447,0.601107) +\path(0.75,0.75)(0.630074,0.71664)(0.509637,0.668642)(0.390202,0.606516) + (0.273258,0.531127)(0.160206,0.443655)(0.0523099,0.345536) +\path(0.75,0.75)(0.646869,0.69196)(0.541651,0.618018)(0.435639,0.528643) + (0.330189,0.424716)(0.22666,0.307508)(0.126363,0.178624) +\path(0.75,0.75)(0.674167,0.674761)(0.59542,0.587383)(0.514234,0.48787) + (0.431158,0.376427)(0.346809,0.253475)(0.261856,0.119648) +\path(0.75,0.75)(0.709403,0.666178)(0.666551,0.577699)(0.62125,0.484165) + (0.573284,0.385128)(0.522412,0.280089)(0.46836,0.168485) +\path(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75) +\path(0.709403,0.666178)(0.749023,0.665974)(0.788831,0.67297) + (0.824541,0.685618)(0.852385,0.702504)(0.869635,0.722554) + (0.874862,0.74491)(0.867939,0.768582)(0.849863,0.792084) + (0.822527,0.813279)(0.788515,0.829523)(0.750924,0.838139) + (0.713174,0.837085)(0.678756,0.825621)(0.650938,0.804706) + (0.632446,0.776969)(0.625191,0.746217)(0.630074,0.71664) + (0.646869,0.69196)(0.674167,0.674761)(0.709403,0.666178) +\path(0.666551,0.577699)(0.74798,0.585752)(0.830368,0.605884) + (0.903621,0.632501)(0.959101,0.662234)(0.991406,0.694618) + (0.998815,0.731016)(0.982511,0.77261)(0.945428,0.818543) + (0.891435,0.864939)(0.825104,0.905071)(0.751807,0.93073) + (0.677771,0.934566)(0.609753,0.912727)(0.554306,0.866713) + (0.516918,0.803473)(0.501394,0.73363)(0.509637,0.668642) + (0.541651,0.618018)(0.59542,0.587383)(0.666551,0.577699) +\path(0.62125,0.484165)(0.746855,0.509046)(0.875481,0.548895) + (0.988754,0.590989)(1.07131,0.62933)(1.11537,0.666178)(1.12092,0.708519) + (1.09249,0.76265)(1.03584,0.830052)(0.956495,0.905455)(0.859908,0.976933) + (0.752656,1.02814)(0.643292,1.043)(0.542063,1.01182)(0.459296,0.936218) + (0.403366,0.829523)(0.379543,0.712441)(0.390202,0.606516) + (0.435639,0.528643)(0.514234,0.48787)(0.62125,0.484165) +\path(0.573284,0.385128)(0.745629,0.435587)(0.925286,0.502471) + (1.08184,0.561798)(1.19037,0.604066)(1.24159,0.637221)(1.24029,0.677746) + (1.19682,0.739556)(1.12046,0.827563)(1.01755,0.935412)(0.893055,1.04537) + (0.753481,1.13079)(0.609295,1.16316)(0.47484,1.12367)(0.365158,1.01352) + (0.291738,0.855133)(0.260522,0.68298)(0.273258,0.531127) + (0.330189,0.424716)(0.431158,0.376427)(0.573284,0.385128) +\path(0.522412,0.280089)(0.744277,0.365124)(0.981254,0.467495) + (1.18533,0.546138)(1.31791,0.586882)(1.37013,0.607733)(1.35609,0.639142) + (1.29466,0.704421)(1.1988,0.812243)(1.07452,0.955475)(0.924661,1.11063) + (0.754288,1.23912)(0.575368,1.29605)(0.40728,1.24929)(0.27118,1.09902) + (0.181986,0.880311)(0.145146,0.645689)(0.160206,0.443655) + (0.22666,0.307508)(0.346809,0.253475)(0.522412,0.280089) +\path(0.46836,0.168485)(0.742767,0.297412)(1.04539,0.445422) + (1.30251,0.545884)(1.45594,0.578419)(1.50104,0.577699)(1.46759,0.593248) + (1.38541,0.658506)(1.27061,0.785404)(1.12739,0.966366)(0.954829,1.17292) + (0.755083,1.35363)(0.541119,1.44293)(0.33859,1.39004)(0.176669,1.19323) + (0.0740632,0.905071)(0.0341447,0.601107)(0.0523099,0.345536) + (0.126363,0.178624)(0.261856,0.119648)(0.46836,0.168485) +\end{picture} diff --git a/graphics/epix/doc/plot_a.xp b/graphics/epix/doc/plot_a.xp new file mode 100644 index 0000000000..4304d501d3 --- /dev/null +++ b/graphics/epix/doc/plot_a.xp @@ -0,0 +1,27 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; +P f(double u, double v) +{ + double x=u*Cos(v), y=u*Sin(v); + // return P(x, y, 0.25*x*(x*x-3*y*y)); + return P(x, y, x*y); +} + +domain R(P(0,0), P(1,1), mesh(6, 20), mesh(6, 20)); + +int main() +{ + bounding_box(P(-1,-1),P(1,1)); + unitlength("1in"); + picture(1.5,1.5); + + begin(); + revolutions(); + + camera.at(P(3, 1, 3)); + + plot(f, R); + + end(); +} diff --git a/graphics/epix/doc/plot_b.eepic b/graphics/epix/doc/plot_b.eepic new file mode 100644 index 0000000000..cf847bd346 --- /dev/null +++ b/graphics/epix/doc/plot_b.eepic @@ -0,0 +1,225 @@ +%% Generated from plot_b.xp on Tue Jul 3 00:20:46 EDT 2007 by +%% ePiX-1.0.25 +%% +%% Cartesian bounding box: [-1,1] x [-1,1] +%% Actual size: 1.5in x 1.5in +%% Figure offset: right by 0in, up by 0in +%% +\setlength{\unitlength}{1in} +\begin{picture}(1.5,1.5)(-0,-0) +%% --- +\path(0.75,0.75)(0.729972,0.708648)(0.709403,0.666178)(0.688271,0.622545) + (0.666551,0.577699)(0.64422,0.531591)(0.62125,0.484165) + (0.597615,0.435364)(0.573284,0.385128)(0.548228,0.333393) + (0.522412,0.280089)(0.495802,0.225146)(0.46836,0.168485) +\path(0.75,0.75)(0.749519,0.707493)(0.749023,0.665974)(0.74851,0.625406) + (0.74798,0.585752)(0.747429,0.546976)(0.746855,0.509046) + (0.746256,0.471927)(0.745629,0.435587)(0.744971,0.399997) + (0.744277,0.365124)(0.743544,0.330939)(0.742767,0.297412) +\path(0.75,0.75)(0.769125,0.71024)(0.788831,0.67297)(0.809212,0.638181) + (0.830368,0.605884)(0.852415,0.576107)(0.875481,0.548895) + (0.899715,0.524319)(0.925286,0.502471)(0.952389,0.483477) + (0.981254,0.467495)(1.01215,0.454726)(1.04539,0.445422) +\path(0.75,0.75)(0.786786,0.716409)(0.824541,0.685618)(0.863426,0.657638) + (0.903621,0.632501)(0.945323,0.610259)(0.988754,0.590989) + (1.03416,0.574791)(1.08184,0.561798)(1.1321,0.552178)(1.18533,0.546138) + (1.24196,0.543935)(1.30251,0.545884) +\path(0.75,0.75)(0.800717,0.725352)(0.852385,0.702504)(0.905133,0.68146) + (0.959101,0.662234)(1.01444,0.644848)(1.07131,0.62933)(1.12989,0.615719) + (1.19037,0.604066)(1.25297,0.594429)(1.31791,0.586882)(1.38547,0.581511) + (1.45594,0.578419) +\path(0.75,0.75)(0.809554,0.736337)(0.869635,0.722554)(0.93025,0.708648) + (0.991406,0.694618)(1.05311,0.680462)(1.11537,0.666178)(1.1782,0.651765) + (1.24159,0.637221)(1.30556,0.622545)(1.37013,0.607733)(1.43528,0.592786) + (1.50104,0.577699) +\path(0.75,0.75)(0.812485,0.748563)(0.874862,0.74491)(0.937011,0.739054) + (0.998815,0.731016)(1.06016,0.720825)(1.12092,0.708519)(1.181,0.694142) + (1.24029,0.677746)(1.29868,0.659392)(1.35609,0.639142)(1.41242,0.617069) + (1.46759,0.593248) +\path(0.75,0.75)(0.809307,0.761132)(0.867939,0.768582)(0.925727,0.772387) + (0.982511,0.77261)(1.03814,0.769331)(1.09249,0.76265)(1.14541,0.752681) + (1.19682,0.739556)(1.24659,0.723418)(1.29466,0.704421)(1.34095,0.682727) + (1.38541,0.658506) +\path(0.75,0.75)(0.800408,0.773024)(0.849863,0.792084)(0.89824,0.807232) + (0.945428,0.818543)(0.991325,0.826113)(1.03584,0.830052) + (1.07891,0.830488)(1.12046,0.827563)(1.16044,0.821428)(1.1988,0.812243) + (1.23553,0.800178)(1.27061,0.785404) +\path(0.75,0.75)(0.786698,0.783117)(0.822527,0.813279)(0.857449,0.840534) + (0.891435,0.864939)(0.924458,0.886556)(0.956495,0.905455) + (0.987531,0.921714)(1.01755,0.935412)(1.04655,0.946636)(1.07452,0.955475) + (1.10147,0.962021)(1.12739,0.966366) +\path(0.75,0.75)(0.769508,0.790278)(0.788515,0.829523)(0.807041,0.867775) + (0.825104,0.905071)(0.842721,0.941445)(0.859908,0.976933) + (0.876682,1.01156)(0.893055,1.04537)(0.909044,1.07838)(0.924661,1.11063) + (0.939918,1.14213)(0.954829,1.17292) +\path(0.75,0.75)(0.750468,0.793535)(0.750924,0.838139)(0.75137,0.883856) + (0.751807,0.93073)(0.752235,0.978809)(0.752656,1.02814)(0.753071,1.07878) + (0.753481,1.13079)(0.753886,1.18421)(0.754288,1.23912)(0.754687,1.29556) + (0.755083,1.35363) +\path(0.75,0.75)(0.731375,0.79227)(0.713174,0.837085)(0.695327,0.884497) + (0.677771,0.934566)(0.660445,0.98737)(0.643292,1.043)(0.62626,1.10155) + (0.609295,1.16316)(0.592347,1.22794)(0.575368,1.29605)(0.558309,1.36765) + (0.541119,1.44293) +\path(0.75,0.75)(0.714035,0.786396)(0.678756,0.825621)(0.644034,0.867713) + (0.609753,0.912727)(0.575798,0.960735)(0.542063,1.01182) + (0.508444,1.06609)(0.47484,1.12367)(0.441152,1.18468)(0.40728,1.24929) + (0.373126,1.31768)(0.33859,1.39004) +\path(0.75,0.75)(0.700112,0.776448)(0.650938,0.804706)(0.60237,0.834787) + (0.554306,0.866713)(0.506646,0.900512)(0.459296,0.936218) + (0.412163,0.973871)(0.365158,1.01352)(0.318192,1.05521)(0.27118,1.09902) + (0.224034,1.145)(0.176669,1.19323) +\path(0.75,0.75)(0.690966,0.763543)(0.632446,0.776969)(0.574432,0.790278) + (0.516918,0.803473)(0.459898,0.816554)(0.403366,0.829523) + (0.347314,0.842382)(0.291738,0.855133)(0.23663,0.867775) + (0.181986,0.880311)(0.127799,0.892743)(0.0740632,0.905071) +\path(0.75,0.75)(0.687529,0.749216)(0.625191,0.746217)(0.563106,0.741014) + (0.501394,0.73363)(0.440168,0.724093)(0.379543,0.712441) + (0.319626,0.69872)(0.260522,0.68298)(0.202331,0.665282) + (0.145146,0.645689)(0.089057,0.624272)(0.0341447,0.601107) +\path(0.75,0.75)(0.690195,0.735167)(0.630074,0.71664)(0.569825,0.694447) + (0.509637,0.668642)(0.4497,0.639299)(0.390202,0.606516) + (0.331328,0.570413)(0.273258,0.531127)(0.216163,0.488817) + (0.160206,0.443655)(0.105542,0.395829)(0.0523099,0.345536) +\path(0.75,0.75)(0.698772,0.72298)(0.646869,0.69196)(0.594442,0.656957) + (0.541651,0.618018)(0.488661,0.575214)(0.435639,0.528643) + (0.382758,0.478428)(0.330189,0.424716)(0.2781,0.367679)(0.22666,0.307508) + (0.176029,0.244413)(0.126363,0.178624) +\path(0.75,0.75)(0.712474,0.713891)(0.674167,0.674761)(0.63513,0.632594) + (0.59542,0.587383)(0.555099,0.539136)(0.514234,0.48787) + (0.472895,0.433619)(0.431158,0.376427)(0.389102,0.316355) + (0.346809,0.253475)(0.304364,0.187873)(0.261856,0.119648) +\path(0.75,0.75)(0.729972,0.708648)(0.709403,0.666178)(0.688271,0.622545) + (0.666551,0.577699)(0.64422,0.531591)(0.62125,0.484165) + (0.597615,0.435364)(0.573284,0.385128)(0.548228,0.333393) + (0.522412,0.280089)(0.495802,0.225146)(0.46836,0.168485) +\path(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75)(0.75,0.75) + (0.75,0.75) +\path(0.75,0.75) +\path(0.709403,0.666178)(0.722321,0.665223)(0.73558,0.665171) + (0.749023,0.665974)(0.762487,0.667581)(0.77581,0.669932) + (0.788831,0.67297)(0.801393,0.676634)(0.813343,0.680868) + (0.824541,0.685618)(0.834856,0.690836)(0.844172,0.696477) + (0.852385,0.702504)(0.859411,0.708879)(0.865178,0.715573) + (0.869635,0.722554)(0.872745,0.729792)(0.874488,0.737256) + (0.874862,0.74491)(0.873876,0.752715)(0.871555,0.760624) + (0.867939,0.768582)(0.863075,0.776527)(0.857026,0.784387) + (0.849863,0.792084)(0.841664,0.799529)(0.83252,0.806627) + (0.822527,0.813279)(0.811787,0.819381)(0.800411,0.82483) + (0.788515,0.829523)(0.776218,0.833364)(0.763645,0.836262) + (0.750924,0.838139)(0.738185,0.838931)(0.725558,0.83859) + (0.713174,0.837085)(0.701162,0.83441)(0.689648,0.830577) + (0.678756,0.825621)(0.668601,0.819601)(0.659294,0.812596) + (0.650938,0.804706)(0.643624,0.796048)(0.637436,0.786754) + (0.632446,0.776969)(0.628712,0.766846)(0.626283,0.756542) + (0.625191,0.746217)(0.625457,0.736026)(0.627088,0.72612) + (0.630074,0.71664)(0.634394,0.707713)(0.64001,0.699454)(0.646869,0.69196) + (0.654905,0.685309)(0.664036,0.679562)(0.674167,0.674761) + (0.685188,0.670929)(0.696978,0.668072)(0.709403,0.666178) +\path(0.709403,0.666178) +\path(0.666551,0.577699)(0.692974,0.578664)(0.720234,0.581422) + (0.74798,0.585752)(0.775839,0.591423)(0.80343,0.598206) + (0.830368,0.605884)(0.856279,0.614263)(0.880806,0.623178) + (0.903621,0.632501)(0.924433,0.642145)(0.942994,0.65206) + (0.959101,0.662234)(0.972601,0.672687)(0.98339,0.683461) + (0.991406,0.694618)(0.996632,0.706222)(0.999085,0.718337) + (0.998815,0.731016)(0.995896,0.74429)(0.990424,0.758164) + (0.982511,0.77261)(0.972282,0.787565)(0.959873,0.802924) + (0.945428,0.818543)(0.929098,0.834239)(0.911044,0.849789) + (0.891435,0.864939)(0.870449,0.879406)(0.848272,0.892888) + (0.825104,0.905071)(0.801155,0.915638)(0.776645,0.924286) + (0.751807,0.93073)(0.726882,0.934719)(0.702119,0.936048) + (0.677771,0.934566)(0.654093,0.930185)(0.631338,0.922887) + (0.609753,0.912727)(0.589573,0.899834)(0.571022,0.884408) + (0.554306,0.866713)(0.539611,0.847073)(0.527101,0.825857) + (0.516918,0.803473)(0.509181,0.780348)(0.503983,0.756921) + (0.501394,0.73363)(0.501461,0.710895)(0.504209,0.689112) + (0.509637,0.668642)(0.517723,0.649801)(0.528419,0.632855) + (0.541651,0.618018)(0.557321,0.605441)(0.575297,0.595218) + (0.59542,0.587383)(0.617495,0.581912)(0.641293,0.578726) + (0.666551,0.577699) +\path(0.666551,0.577699) +\path(0.62125,0.484165)(0.661714,0.489898)(0.703779,0.498369) + (0.746855,0.509046)(0.790294,0.521379)(0.833406,0.534828) + (0.875481,0.548895)(0.915825,0.563151)(0.953779,0.577259) + (0.988754,0.590989)(1.02025,0.604228)(1.04786,0.616974)(1.07131,0.62933) + (1.09041,0.641478)(1.10509,0.653667)(1.11537,0.666178)(1.12133,0.679307) + (1.12312,0.693337)(1.12092,0.708519)(1.11493,0.725052)(1.10538,0.743075) + (1.09249,0.76265)(1.07646,0.783756)(1.05751,0.806289)(1.03584,0.830052) + (1.01166,0.854761)(0.985141,0.880045)(0.956495,0.905455) + (0.925925,0.930468)(0.893649,0.954502)(0.859908,0.976933) + (0.824965,0.997111)(0.789108,1.01439)(0.752656,1.02814)(0.715955,1.0378) + (0.679371,1.04288)(0.643292,1.043)(0.608116,1.0379)(0.574243,1.02749) + (0.542063,1.01182)(0.511952,0.991116)(0.484258,0.965743) + (0.459296,0.936218)(0.437343,0.903175)(0.418635,0.867345) + (0.403366,0.829523)(0.391688,0.790542)(0.383719,0.751241) + (0.379543,0.712441)(0.379214,0.674923)(0.382764,0.639401) + (0.390202,0.606516)(0.401519,0.576814)(0.416683,0.550743) + (0.435639,0.528643)(0.458304,0.510741)(0.484558,0.497152) + (0.514234,0.48787)(0.547111,0.48278)(0.582903,0.481654)(0.62125,0.484165) +\path(0.62125,0.484165) +\path(0.573284,0.385128)(0.628255,0.398429)(0.685992,0.415579) + (0.745629,0.435587)(0.806153,0.457413)(0.866435,0.480025) + (0.925286,0.502471)(0.981521,0.523945)(1.03403,0.543843) + (1.08184,0.561798)(1.12417,0.577699)(1.16045,0.591675)(1.19037,0.604066) + (1.21379,0.615372)(1.23079,0.626204)(1.24159,0.637221)(1.24651,0.649085) + (1.24594,0.662413)(1.24029,0.677746)(1.22996,0.695523)(1.21536,0.716063) + (1.19682,0.739556)(1.17465,0.766054)(1.14912,0.795468)(1.12046,0.827563) + (1.08886,0.861958)(1.0545,0.89813)(1.01755,0.935412)(0.978193,0.973008) + (0.936617,1.01)(0.893055,1.04537)(0.847784,1.07804)(0.80113,1.10688) + (0.753481,1.13079)(0.705284,1.14872)(0.65704,1.15976)(0.609295,1.16316) + (0.562623,1.15839)(0.517613,1.14522)(0.47484,1.12367)(0.434852,1.09408) + (0.398146,1.05707)(0.365158,1.01352)(0.336248,0.964504) + (0.311704,0.911264)(0.291738,0.855133)(0.276497,0.797481) + (0.266074,0.739664)(0.260522,0.68298)(0.259863,0.628631) + (0.264107,0.577699)(0.273258,0.531127)(0.287318,0.489709) + (0.306294,0.454081)(0.330189,0.424716)(0.358995,0.401924) + (0.392679,0.38584)(0.431158,0.376427)(0.474277,0.373467) + (0.521781,0.37656)(0.573284,0.385128) +\path(0.573284,0.385128) +\path(0.522412,0.280089)(0.592255,0.303678)(0.666599,0.332557) + (0.744277,0.365124)(0.823805,0.399632)(0.903434,0.434308) + (0.981254,0.467495)(1.05533,0.497794)(1.12387,0.524191)(1.18533,0.546138) + (1.23857,0.563575)(1.28285,0.576899)(1.31791,0.586882)(1.34384,0.594557) + (1.36104,0.601102)(1.37013,0.607733)(1.37182,0.615613)(1.3669,0.625786) + (1.35609,0.639142)(1.34008,0.656388)(1.31944,0.67804)(1.29466,0.704421) + (1.26612,0.735658)(1.2341,0.771686)(1.1988,0.812243)(1.16038,0.856871) + (1.11892,0.904905)(1.07452,0.955475)(1.02726,1.0075)(0.977251,1.05971) + (0.924661,1.11063)(0.86973,1.15865)(0.812793,1.20206)(0.754288,1.23912) + (0.694765,1.26811)(0.634877,1.28752)(0.575368,1.29605)(0.517045,1.29277) + (0.460742,1.27718)(0.40728,1.24929)(0.35743,1.20959)(0.311875,1.15903) + (0.27118,1.09902)(0.235783,1.03125)(0.205991,0.95767)(0.181986,0.880311) + (0.163849,0.801232)(0.151584,0.722411)(0.145146,0.645689) + (0.144472,0.572724)(0.149503,0.504968)(0.160206,0.443655) + (0.17659,0.389804)(0.198709,0.344221)(0.22666,0.307508) + (0.260573,0.280059)(0.300586,0.26206)(0.346809,0.253475) + (0.39928,0.254024)(0.457909,0.263169)(0.522412,0.280089) +\path(0.522412,0.280089) +\path(0.46836,0.168485)(0.553304,0.204953)(0.645257,0.248719) + (0.742767,0.297412)(0.843765,0.348317)(0.945636,0.398569) + (1.04539,0.445422)(1.13995,0.486548)(1.22644,0.5203)(1.30251,0.545884) + (1.36653,0.563399)(1.41769,0.573743)(1.45594,0.578419)(1.48186,0.579303) + (1.49647,0.578408)(1.50104,0.577699)(1.49691,0.578964)(1.48538,0.583732) + (1.46759,0.593248)(1.44451,0.60847)(1.41692,0.63008)(1.38541,0.658506) + (1.35037,0.693935)(1.31206,0.736325)(1.27061,0.785404)(1.22604,0.840659) + (1.17832,0.901326)(1.12739,0.966366)(1.07317,1.03445)(1.01563,1.10395) + (0.954829,1.17292)(0.890909,1.23916)(0.824171,1.30025)(0.755083,1.35363) + (0.684297,1.39674)(0.612645,1.42719)(0.541119,1.44293)(0.470828,1.44243) + (0.402935,1.42483)(0.33859,1.39004)(0.278856,1.33875)(0.224644,1.27245) + (0.176669,1.19323)(0.135426,1.10367)(0.101196,1.00663) + (0.0740632,0.905071)(0.053964,0.801877)(0.0407306,0.699748) + (0.0341447,0.601107)(0.0339864,0.508057)(0.0400764,0.422378) + (0.0523099,0.345536)(0.0706802,0.278715)(0.0952918,0.222844) + (0.126363,0.178624)(0.164213,0.146543)(0.209236,0.126873) + (0.261856,0.119648)(0.322456,0.124628)(0.391288,0.141232) + (0.46836,0.168485) +\path(0.46836,0.168485) +\end{picture} diff --git a/graphics/epix/doc/plot_b.xp b/graphics/epix/doc/plot_b.xp new file mode 100644 index 0000000000..f7560071e9 --- /dev/null +++ b/graphics/epix/doc/plot_b.xp @@ -0,0 +1,27 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; +P f(double u, double v) +{ + double x=u*Cos(v), y=u*Sin(v); + // return P(x, y, 0.25*x*(x*x-3*y*y)); + return P(x, y, x*y); +} + +domain R(P(0,0), P(1,1), mesh(6, 20), mesh(12,60)); + +int main() +{ + bounding_box(P(-1,-1),P(1,1)); + unitlength("1in"); + picture(1.5,1.5); + + begin(); + revolutions(); + + camera.at(P(3, 1, 3)); + + plot(f, R); + + end(); +} diff --git a/graphics/epix/doc/plotting.eepic b/graphics/epix/doc/plotting.eepic new file mode 100644 index 0000000000..ca0911610b --- /dev/null +++ b/graphics/epix/doc/plotting.eepic @@ -0,0 +1,82 @@ +%% Generated from plotting.xp on Thu Jun 28 15:36:18 EDT 2007 by +%% ePiX-1.1.6 +%% +%% Cartesian bounding box: [-2,2] x [-1,1] +%% Actual size: 5 x 1in +%% Figure offset: left by 0in, down by 0in +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0} +\xdefinecolor{rgb_ff0000}{rgb}{1,0,0} +\setlength{\unitlength}{1in} +\begin{picture}(5,1)(-0,-0) +\path(0,0.5)(5,0.5) +%% +\put(0,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(0.3125,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(0.625,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(0.9375,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(1.25,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(1.5625,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(1.875,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(2.1875,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(2.5,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(2.8125,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(3.125,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(3.4375,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(3.75,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(4.0625,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(4.375,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(4.6875,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\put(5,0.5){\makebox(0,0){$\rule{0.5pt}{4pt}$}} +\path(2.5,0)(2.5,1) +%% +\put(2.5,0){\makebox(0,0){$\rule{4pt}{0.5pt}$}} +\put(2.5,0.25){\makebox(0,0){$\rule{4pt}{0.5pt}$}} +\put(2.5,0.5){\makebox(0,0){$\rule{4pt}{0.5pt}$}} +\put(2.5,0.75){\makebox(0,0){$\rule{4pt}{0.5pt}$}} +\put(2.5,1){\makebox(0,0){$\rule{4pt}{0.5pt}$}} +\put(0,0.444652){\makebox(0,0)[t]{$-2$}} +\put(1.25,0.444652){\makebox(0,0)[t]{$-1$}} +\put(2.5,0.444652){\makebox(0,0)[t]{$\phantom{-}0$}} +\put(3.75,0.444652){\makebox(0,0)[t]{$\phantom{-}1$}} +\put(5,0.444652){\makebox(0,0)[t]{$\phantom{-}2$}} +\color{rgb_ff0000}% +\path(0,0.5)(0.0416667,0.527125) + (0.0833333,0.559633)(0.125,0.601537)(0.166667,0.654364) + (0.208333,0.716506)(0.25,0.783173)(0.291667,0.846957) + (0.333333,0.898935)(0.375,0.930119)(0.416667,0.933013) + (0.458333,0.902995)(0.5,0.839302)(0.541667,0.745419) + (0.583333,0.628809)(0.625,0.5)(0.666667,0.371191) + (0.708333,0.254581)(0.75,0.160698)(0.791667,0.0970055) + (0.833333,0.0669873)(0.875,0.0698806)(0.916667,0.101065) + (0.958333,0.153043)(1,0.216827)(1.04167,0.283494)(1.08333,0.345636) + (1.125,0.398463)(1.16667,0.440367)(1.20833,0.472875)(1.25,0.5) + (1.29167,0.527125)(1.33333,0.559633)(1.375,0.601537) + (1.41667,0.654364)(1.45833,0.716506)(1.5,0.783173) + (1.54167,0.846957)(1.58333,0.898935)(1.625,0.930119) + (1.66667,0.933013)(1.70833,0.902995)(1.75,0.839302) + (1.79167,0.745419)(1.83333,0.628809)(1.875,0.5)(1.91667,0.371191) + (1.95833,0.254581)(2,0.160698)(2.04167,0.0970055) + (2.08333,0.0669873)(2.125,0.0698806)(2.16667,0.101065) + (2.20833,0.153043)(2.25,0.216827)(2.29167,0.283494) + (2.33333,0.345636)(2.375,0.398463)(2.41667,0.440367) + (2.45833,0.472875)(2.5,0.5)(2.54167,0.527125)(2.58333,0.559633) + (2.625,0.601537)(2.66667,0.654364)(2.70833,0.716506)(2.75,0.783173) + (2.79167,0.846957)(2.83333,0.898935)(2.875,0.930119) + (2.91667,0.933013)(2.95833,0.902995)(3,0.839302)(3.04167,0.745419) + (3.08333,0.628809)(3.125,0.5)(3.16667,0.371191)(3.20833,0.254581) + (3.25,0.160698)(3.29167,0.0970055)(3.33333,0.0669873) + (3.375,0.0698806)(3.41667,0.101065)(3.45833,0.153043)(3.5,0.216827) + (3.54167,0.283494)(3.58333,0.345636)(3.625,0.398463) + (3.66667,0.440367)(3.70833,0.472875)(3.75,0.5)(3.79167,0.527125) + (3.83333,0.559633)(3.875,0.601537)(3.91667,0.654364) + (3.95833,0.716506)(4,0.783173)(4.04167,0.846957)(4.08333,0.898935) + (4.125,0.930119)(4.16667,0.933013)(4.20833,0.902995)(4.25,0.839302) + (4.29167,0.745419)(4.33333,0.628809)(4.375,0.5)(4.41667,0.371191) + (4.45833,0.254581)(4.5,0.160698)(4.54167,0.0970055) + (4.58333,0.0669873)(4.625,0.0698806)(4.66667,0.101065) + (4.70833,0.153043)(4.75,0.216827)(4.79167,0.283494) + (4.83333,0.345636)(4.875,0.398463)(4.91667,0.440367) + (4.95833,0.472875)(5,0.5) +%% +\end{picture} diff --git a/graphics/epix/doc/plotting.xp b/graphics/epix/doc/plotting.xp new file mode 100644 index 0000000000..ad310f7b02 --- /dev/null +++ b/graphics/epix/doc/plotting.xp @@ -0,0 +1,26 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +double f(double x) +{ + return 0.75*Sin(x) - 0.25*Sin(2*x); +} + +int main() +{ + picture(P(-2,-1),P(2,1), "5x1in"); + + begin(); + + h_axis(16); + v_axis(4); + + h_axis_labels(4, P(0,-4), b); // shift labels down 4pt, align below + + revolutions(); // set angle units + red(); + plot(f, xmin(), xmax(), 120); // use 120 intervals + + end(); +} diff --git a/graphics/epix/doc/plotting2.eepic b/graphics/epix/doc/plotting2.eepic new file mode 100644 index 0000000000..5f56a743ec --- /dev/null +++ b/graphics/epix/doc/plotting2.eepic @@ -0,0 +1,1766 @@ +%% Generated from plotting2.xp on Tue Sep 25 00:02:47 EDT 2007 by +%% ePiX-1.2.0 +%% +%% Cartesian bounding box: [-1,1] x [-1,1] +%% Actual size: 2 x 1in +%% Figure offset: left by 0in, down by 0in +%% +%% usepackages pstricks +%% +\newcmykcolor{cmy_0000ff}{0 0 1 0}% +\newcmykcolor{cmy_0101ff}{0 0 0.996078 0.00392157}% +\newcmykcolor{cmy_0202ff}{0 0 0.992157 0.00784314}% +\newcmykcolor{cmy_0303ff}{0 0 0.988235 0.0117647}% +\newcmykcolor{cmy_0505ff}{0 0 0.980392 0.0196078}% +\newcmykcolor{cmy_0606ff}{0 0 0.976471 0.0235294}% +\newcmykcolor{cmy_0808ff}{0 0 0.968627 0.0313725}% +\newcmykcolor{cmy_0909ff}{0 0 0.964706 0.0352941}% +\newcmykcolor{cmy_0a0aff}{0 0 0.960784 0.0392157}% +\newcmykcolor{cmy_0b0bff}{0 0 0.956863 0.0431373}% +\newcmykcolor{cmy_0c0cff}{0 0 0.952941 0.0470588}% +\newcmykcolor{cmy_0d0dff}{0 0 0.94902 0.0509804}% +\newcmykcolor{cmy_0e0eff}{0 0 0.945098 0.054902}% +\newcmykcolor{cmy_0f0fff}{0 0 0.941176 0.0588235}% +\newcmykcolor{cmy_1111ff}{0 0 0.933333 0.0666667}% +\newcmykcolor{cmy_1313ff}{0 0 0.92549 0.0745098}% +\newcmykcolor{cmy_1515ff}{0 0 0.917647 0.0823529}% +\newcmykcolor{cmy_1616ff}{0 0 0.913725 0.0862745}% +\newcmykcolor{cmy_1818ff}{0 0 0.905882 0.0941176}% +\newcmykcolor{cmy_1919ff}{0 0 0.901961 0.0980392}% +\newcmykcolor{cmy_1b1bff}{0 0 0.894118 0.105882}% +\newcmykcolor{cmy_1c1cff}{0 0 0.890196 0.109804}% +\newcmykcolor{cmy_2020ff}{0 0 0.87451 0.12549}% +\newcmykcolor{cmy_2323ff}{0 0 0.862745 0.137255}% +\newcmykcolor{cmy_2525ff}{0 0 0.854902 0.145098}% +\newcmykcolor{cmy_2626ff}{0 0 0.85098 0.14902}% +\newcmykcolor{cmy_2828ff}{0 0 0.843137 0.156863}% +\newcmykcolor{cmy_2929ff}{0 0 0.839216 0.160784}% +\newcmykcolor{cmy_2a2aff}{0 0 0.835294 0.164706}% +\newcmykcolor{cmy_2d2dff}{0 0 0.823529 0.176471}% +\newcmykcolor{cmy_3030ff}{0 0 0.811765 0.188235}% +\newcmykcolor{cmy_3131ff}{0 0 0.807843 0.192157}% +\newcmykcolor{cmy_3232ff}{0 0 0.803922 0.196078}% +\newcmykcolor{cmy_3434ff}{0 0 0.796078 0.203922}% +\newcmykcolor{cmy_3535ff}{0 0 0.792157 0.207843}% +\newcmykcolor{cmy_3636ff}{0 0 0.788235 0.211765}% +\newcmykcolor{cmy_3737ff}{0 0 0.784314 0.215686}% +\newcmykcolor{cmy_3838ff}{0 0 0.780392 0.219608}% +\newcmykcolor{cmy_3939ff}{0 0 0.776471 0.223529}% +\newcmykcolor{cmy_3a3aff}{0 0 0.772549 0.227451}% +\newcmykcolor{cmy_3b3bff}{0 0 0.768627 0.231373}% +\newcmykcolor{cmy_3c3cff}{0 0 0.764706 0.235294}% +\newcmykcolor{cmy_3d3dff}{0 0 0.760784 0.239216}% +\newcmykcolor{cmy_3e3eff}{0 0 0.756863 0.243137}% +\newcmykcolor{cmy_3f3fff}{0 0 0.752941 0.247059}% +\newcmykcolor{cmy_4141ff}{0 0 0.745098 0.254902}% +\newcmykcolor{cmy_4343ff}{0 0 0.737255 0.262745}% +\newcmykcolor{cmy_4545ff}{0 0 0.729412 0.270588}% +\newcmykcolor{cmy_4848ff}{0 0 0.717647 0.282353}% +\newcmykcolor{cmy_4949ff}{0 0 0.713725 0.286275}% +\newcmykcolor{cmy_4a4aff}{0 0 0.709804 0.290196}% +\newcmykcolor{cmy_4b4bff}{0 0 0.705882 0.294118}% +\newcmykcolor{cmy_4c4cff}{0 0 0.701961 0.298039}% +\newcmykcolor{cmy_4d4dff}{0 0 0.698039 0.301961}% +\newcmykcolor{cmy_4e4eff}{0 0 0.694118 0.305882}% +\newcmykcolor{cmy_4f4fff}{0 0 0.690196 0.309804}% +\newcmykcolor{cmy_5050ff}{0 0 0.686275 0.313725}% +\newcmykcolor{cmy_5151ff}{0 0 0.682353 0.317647}% +\newcmykcolor{cmy_5252ff}{0 0 0.678431 0.321569}% +\newcmykcolor{cmy_5353ff}{0 0 0.67451 0.32549}% +\newcmykcolor{cmy_5454ff}{0 0 0.670588 0.329412}% +\newcmykcolor{cmy_5555ff}{0 0 0.666667 0.333333}% +\newcmykcolor{cmy_5656ff}{0 0 0.662745 0.337255}% +\newcmykcolor{cmy_5757ff}{0 0 0.658824 0.341176}% +\newcmykcolor{cmy_5858ff}{0 0 0.654902 0.345098}% +\newcmykcolor{cmy_5959ff}{0 0 0.65098 0.34902}% +\newcmykcolor{cmy_5a5aff}{0 0 0.647059 0.352941}% +\newcmykcolor{cmy_5b5bff}{0 0 0.643137 0.356863}% +\newcmykcolor{cmy_5c5cff}{0 0 0.639216 0.360784}% +\newcmykcolor{cmy_5d5dff}{0 0 0.635294 0.364706}% +\newcmykcolor{cmy_5e5eff}{0 0 0.631373 0.368627}% +\newcmykcolor{cmy_5f5fff}{0 0 0.627451 0.372549}% +\newcmykcolor{cmy_6060ff}{0 0 0.623529 0.376471}% +\newcmykcolor{cmy_6161ff}{0 0 0.619608 0.380392}% +\newcmykcolor{cmy_6262ff}{0 0 0.615686 0.384314}% +\newcmykcolor{cmy_6363ff}{0 0 0.611765 0.388235}% +\newcmykcolor{cmy_6464ff}{0 0 0.607843 0.392157}% +\newcmykcolor{cmy_6565ff}{0 0 0.603922 0.396078}% +\newcmykcolor{cmy_6666ff}{0 0 0.6 0.4}% +\newcmykcolor{cmy_6767ff}{0 0 0.596078 0.403922}% +\newcmykcolor{cmy_6868ff}{0 0 0.592157 0.407843}% +\newcmykcolor{cmy_6969ff}{0 0 0.588235 0.411765}% +\newcmykcolor{cmy_6a6aff}{0 0 0.584314 0.415686}% +\newcmykcolor{cmy_6b6bff}{0 0 0.580392 0.419608}% +\newcmykcolor{cmy_6c6cff}{0 0 0.576471 0.423529}% +\newcmykcolor{cmy_6d6dff}{0 0 0.572549 0.427451}% +\newcmykcolor{cmy_6e6eff}{0 0 0.568627 0.431373}% +\newcmykcolor{cmy_6f6fff}{0 0 0.564706 0.435294}% +\newcmykcolor{cmy_7070ff}{0 0 0.560784 0.439216}% +\newcmykcolor{cmy_7171ff}{0 0 0.556863 0.443137}% +\newcmykcolor{cmy_7272ff}{0 0 0.552941 0.447059}% +\newcmykcolor{cmy_7373ff}{0 0 0.54902 0.45098}% +\newcmykcolor{cmy_7474ff}{0 0 0.545098 0.454902}% +\newcmykcolor{cmy_7575ff}{0 0 0.541176 0.458824}% +\newcmykcolor{cmy_7676ff}{0 0 0.537255 0.462745}% +\newcmykcolor{cmy_7777ff}{0 0 0.533333 0.466667}% +\newcmykcolor{cmy_7878ff}{0 0 0.529412 0.470588}% +\newcmykcolor{cmy_7979ff}{0 0 0.52549 0.47451}% +\newcmykcolor{cmy_7a7aff}{0 0 0.521569 0.478431}% +\newcmykcolor{cmy_7b7bff}{0 0 0.517647 0.482353}% +\newcmykcolor{cmy_7c7cff}{0 0 0.513725 0.486275}% +\newcmykcolor{cmy_7d7dff}{0 0 0.509804 0.490196}% +\newcmykcolor{cmy_7e7eff}{0 0 0.505882 0.494118}% +\newcmykcolor{cmy_7f7fff}{0 0 0.501961 0.498039}% +\newrgbcolor{rgb_000000}{0 0 0}% +\newrgbcolor{rgb_19197f}{0.0980392 0.0980392 0.498039}% +\newrgbcolor{rgb_191980}{0.0980392 0.0980392 0.501961}% +\newrgbcolor{rgb_191981}{0.0980392 0.0980392 0.505882}% +\newrgbcolor{rgb_1a1a82}{0.101961 0.101961 0.509804}% +\newrgbcolor{rgb_1a1a83}{0.101961 0.101961 0.513725}% +\newrgbcolor{rgb_1a1a84}{0.101961 0.101961 0.517647}% +\newrgbcolor{rgb_1a1a85}{0.101961 0.101961 0.521569}% +\newrgbcolor{rgb_1a1a86}{0.101961 0.101961 0.52549}% +\newrgbcolor{rgb_1b1b87}{0.105882 0.105882 0.529412}% +\newrgbcolor{rgb_1b1b88}{0.105882 0.105882 0.533333}% +\newrgbcolor{rgb_1b1b89}{0.105882 0.105882 0.537255}% +\newrgbcolor{rgb_1b1b8a}{0.105882 0.105882 0.541176}% +\newrgbcolor{rgb_1b1b8b}{0.105882 0.105882 0.545098}% +\newrgbcolor{rgb_1c1c8c}{0.109804 0.109804 0.54902}% +\newrgbcolor{rgb_1c1c8d}{0.109804 0.109804 0.552941}% +\newrgbcolor{rgb_1c1c8e}{0.109804 0.109804 0.556863}% +\newrgbcolor{rgb_1c1c8f}{0.109804 0.109804 0.560784}% +\newrgbcolor{rgb_1c1c90}{0.109804 0.109804 0.564706}% +\newrgbcolor{rgb_1d1d91}{0.113725 0.113725 0.568627}% +\newrgbcolor{rgb_1d1d92}{0.113725 0.113725 0.572549}% +\newrgbcolor{rgb_1d1d93}{0.113725 0.113725 0.576471}% +\newrgbcolor{rgb_1d1d94}{0.113725 0.113725 0.580392}% +\newrgbcolor{rgb_1d1d95}{0.113725 0.113725 0.584314}% +\newrgbcolor{rgb_1e1e96}{0.117647 0.117647 0.588235}% +\newrgbcolor{rgb_1e1e97}{0.117647 0.117647 0.592157}% +\newrgbcolor{rgb_1e1e98}{0.117647 0.117647 0.596078}% +\newrgbcolor{rgb_1e1e99}{0.117647 0.117647 0.6}% +\newrgbcolor{rgb_1e1e9a}{0.117647 0.117647 0.603922}% +\newrgbcolor{rgb_1f1f9b}{0.121569 0.121569 0.607843}% +\newrgbcolor{rgb_1f1f9c}{0.121569 0.121569 0.611765}% +\newrgbcolor{rgb_1f1f9d}{0.121569 0.121569 0.615686}% +\newrgbcolor{rgb_1f1f9e}{0.121569 0.121569 0.619608}% +\newrgbcolor{rgb_1f1f9f}{0.121569 0.121569 0.623529}% +\newrgbcolor{rgb_2020a0}{0.12549 0.12549 0.627451}% +\newrgbcolor{rgb_2020a1}{0.12549 0.12549 0.631373}% +\newrgbcolor{rgb_2020a2}{0.12549 0.12549 0.635294}% +\newrgbcolor{rgb_2020a3}{0.12549 0.12549 0.639216}% +\newrgbcolor{rgb_2020a4}{0.12549 0.12549 0.643137}% +\newrgbcolor{rgb_2121a5}{0.129412 0.129412 0.647059}% +\newrgbcolor{rgb_2121a6}{0.129412 0.129412 0.65098}% +\newrgbcolor{rgb_2121a7}{0.129412 0.129412 0.654902}% +\newrgbcolor{rgb_2121a8}{0.129412 0.129412 0.658824}% +\newrgbcolor{rgb_2121a9}{0.129412 0.129412 0.662745}% +\newrgbcolor{rgb_2222aa}{0.133333 0.133333 0.666667}% +\newrgbcolor{rgb_2222ab}{0.133333 0.133333 0.670588}% +\newrgbcolor{rgb_2222ac}{0.133333 0.133333 0.67451}% +\newrgbcolor{rgb_2222ad}{0.133333 0.133333 0.678431}% +\newrgbcolor{rgb_2222ae}{0.133333 0.133333 0.682353}% +\newrgbcolor{rgb_2323af}{0.137255 0.137255 0.686275}% +\newrgbcolor{rgb_2323b0}{0.137255 0.137255 0.690196}% +\newrgbcolor{rgb_2323b1}{0.137255 0.137255 0.694118}% +\newrgbcolor{rgb_2323b2}{0.137255 0.137255 0.698039}% +\newrgbcolor{rgb_2323b3}{0.137255 0.137255 0.701961}% +\newrgbcolor{rgb_2424b4}{0.141176 0.141176 0.705882}% +\newrgbcolor{rgb_2424b5}{0.141176 0.141176 0.709804}% +\newrgbcolor{rgb_2424b6}{0.141176 0.141176 0.713725}% +\newrgbcolor{rgb_2525b9}{0.145098 0.145098 0.72549}% +\newrgbcolor{rgb_2525bb}{0.145098 0.145098 0.733333}% +\newrgbcolor{rgb_2525bd}{0.145098 0.145098 0.741176}% +\newrgbcolor{rgb_2626bf}{0.14902 0.14902 0.74902}% +\newrgbcolor{rgb_2626c0}{0.14902 0.14902 0.752941}% +\newrgbcolor{rgb_2626c1}{0.14902 0.14902 0.756863}% +\newrgbcolor{rgb_2626c2}{0.14902 0.14902 0.760784}% +\newrgbcolor{rgb_2727c3}{0.152941 0.152941 0.764706}% +\newrgbcolor{rgb_2727c4}{0.152941 0.152941 0.768627}% +\newrgbcolor{rgb_2727c5}{0.152941 0.152941 0.772549}% +\newrgbcolor{rgb_2727c6}{0.152941 0.152941 0.776471}% +\newrgbcolor{rgb_2727c7}{0.152941 0.152941 0.780392}% +\newrgbcolor{rgb_2828c8}{0.156863 0.156863 0.784314}% +\newrgbcolor{rgb_2828c9}{0.156863 0.156863 0.788235}% +\newrgbcolor{rgb_2828ca}{0.156863 0.156863 0.792157}% +\newrgbcolor{rgb_2828cc}{0.156863 0.156863 0.8}% +\newrgbcolor{rgb_2929cd}{0.160784 0.160784 0.803922}% +\newrgbcolor{rgb_2929ce}{0.160784 0.160784 0.807843}% +\newrgbcolor{rgb_2929d1}{0.160784 0.160784 0.819608}% +\newrgbcolor{rgb_2a2ad4}{0.164706 0.164706 0.831373}% +\newrgbcolor{rgb_2a2ad5}{0.164706 0.164706 0.835294}% +\newrgbcolor{rgb_2a2ad6}{0.164706 0.164706 0.839216}% +\newrgbcolor{rgb_2b2bd8}{0.168627 0.168627 0.847059}% +\newrgbcolor{rgb_2b2bd9}{0.168627 0.168627 0.85098}% +\newrgbcolor{rgb_2b2bdb}{0.168627 0.168627 0.858824}% +\newrgbcolor{rgb_2c2cde}{0.172549 0.172549 0.870588}% +\newrgbcolor{rgb_2d2de2}{0.176471 0.176471 0.886275}% +\newrgbcolor{rgb_2d2de3}{0.176471 0.176471 0.890196}% +\newrgbcolor{rgb_2d2de5}{0.176471 0.176471 0.898039}% +\newrgbcolor{rgb_2e2ee6}{0.180392 0.180392 0.901961}% +\newrgbcolor{rgb_2e2ee8}{0.180392 0.180392 0.909804}% +\newrgbcolor{rgb_2e2ee9}{0.180392 0.180392 0.913725}% +\newrgbcolor{rgb_2f2feb}{0.184314 0.184314 0.921569}% +\newrgbcolor{rgb_2f2fed}{0.184314 0.184314 0.929412}% +\newrgbcolor{rgb_2f2fef}{0.184314 0.184314 0.937255}% +\newrgbcolor{rgb_3030f0}{0.188235 0.188235 0.941176}% +\newrgbcolor{rgb_3030f1}{0.188235 0.188235 0.945098}% +\newrgbcolor{rgb_3030f2}{0.188235 0.188235 0.94902}% +\newrgbcolor{rgb_3030f3}{0.188235 0.188235 0.952941}% +\newrgbcolor{rgb_3030f4}{0.188235 0.188235 0.956863}% +\newrgbcolor{rgb_3131f5}{0.192157 0.192157 0.960784}% +\newrgbcolor{rgb_3131f6}{0.192157 0.192157 0.964706}% +\newrgbcolor{rgb_3131f8}{0.192157 0.192157 0.972549}% +\newrgbcolor{rgb_3131f9}{0.192157 0.192157 0.976471}% +\newrgbcolor{rgb_3232fb}{0.196078 0.196078 0.984314}% +\newrgbcolor{rgb_3232fc}{0.196078 0.196078 0.988235}% +\newrgbcolor{rgb_3232fd}{0.196078 0.196078 0.992157}% +\newrgbcolor{rgb_3232fe}{0.196078 0.196078 0.996078}% +\psset{unit=1in,linewidth=0.4pt}% +\begin{pspicture}(2,1)(0,0)% +\psline(1,0.5)(0.460099,0.0671161) +\psset{fillcolor=rgb_000000}% +\pspolygon[fillstyle=solid](0.513324,0.109791)(0.500341,0.125984) + (0.460099,0.0671161)(0.526308,0.093598)(0.513324,0.109791) +\psline(1,0.5)(2.30211,0.383998) +\pspolygon[fillstyle=solid](2.19255,0.39376)(2.1907,0.373086) + (2.30211,0.383998)(2.19439,0.414433)(2.19255,0.39376) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](1.21563,0.452275)(1.23301,0.375451) + (1.17732,0.388446)(1.12142,0.416397)(1.11204,0.483169) + (1.164,0.462409)(1.21563,0.452275) +\psset{fillcolor=cmy_5858ff}% +\psset{linecolor=rgb_2121a6}% +\pspolygon[fillstyle=solid](1.31978,0.464555)(1.34701,0.395075) + (1.28931,0.377672)(1.23301,0.375451)(1.21563,0.452275) + (1.26742,0.453019)(1.31978,0.464555) +\psset{fillcolor=cmy_6969ff}% +\psset{linecolor=rgb_1d1d95}% +\pspolygon[fillstyle=solid](1.11204,0.483169)(1.12142,0.416397) + (1.0645,0.458716)(1.0058,0.514406)(1.0053,0.553791) + (1.05928,0.513957)(1.11204,0.483169) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](1.42762,0.517893)(1.46924,0.473639) + (1.40679,0.427311)(1.34701,0.395075)(1.31978,0.464555) + (1.3731,0.486452)(1.42762,0.517893) +\psset{fillcolor=cmy_7676ff}% +\psset{linecolor=rgb_1b1b88}% +\pspolygon[fillstyle=solid](1.0053,0.553791)(1.0058,0.514406) + (0.944617,0.581935)(0.880444,0.659087)(0.892338,0.65446) + (0.949725,0.601259)(1.0053,0.553791) +\psset{fillcolor=cmy_6565ff}% +\psset{linecolor=rgb_1e1e99}% +\pspolygon[fillstyle=solid](1.19425,0.509734)(1.21563,0.452275) + (1.164,0.462409)(1.11204,0.483169)(1.10071,0.531856) + (1.14768,0.517332)(1.19425,0.509734) +\psset{fillcolor=cmy_6161ff}% +\psset{linecolor=rgb_1f1f9d}% +\pspolygon[fillstyle=solid](1.28699,0.515829)(1.31978,0.464555) + (1.26742,0.453019)(1.21563,0.452275)(1.19425,0.509734) + (1.24062,0.509263)(1.28699,0.515829) +\psset{fillcolor=cmy_6f6fff}% +\psset{linecolor=rgb_1c1c8f}% +\pspolygon[fillstyle=solid](1.10071,0.531856)(1.11204,0.483169) + (1.05928,0.513957)(1.0053,0.553791)(1.00473,0.579391) + (1.05312,0.552809)(1.10071,0.531856) +\psset{fillcolor=cmy_6666ff}% +\psset{linecolor=rgb_1e1e98}% +\pspolygon[fillstyle=solid](1.38015,0.548201)(1.42762,0.517893) + (1.3731,0.486452)(1.31978,0.464555)(1.28699,0.515829) + (1.33349,0.529041)(1.38015,0.548201) +\psset{fillcolor=cmy_6c6cff}% +\psset{linecolor=rgb_1d1d92}% +\pspolygon[fillstyle=solid](1.54036,0.603855)(1.60334,0.602838) + (1.53472,0.5328)(1.46924,0.473639)(1.42762,0.517893) + (1.48342,0.557617)(1.54036,0.603855) +\psset{fillcolor=cmy_7979ff}% +\psset{linecolor=rgb_1a1a85}% +\pspolygon[fillstyle=solid](1.00473,0.579391)(1.0053,0.553791) + (0.949725,0.601259)(0.892338,0.65446)(0.905094,0.644715) + (0.955399,0.610498)(1.00473,0.579391) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](0.892338,0.65446)(0.880444,0.659087) + (0.812994,0.742797)(0.742326,0.82905)(0.772133,0.767878) + (0.833083,0.710977)(0.892338,0.65446) +\psset{fillcolor=cmy_7070ff}% +\psset{linecolor=rgb_1c1c8e}% +\pspolygon[fillstyle=solid](1.1691,0.547312)(1.19425,0.509734) + (1.14768,0.517332)(1.10071,0.531856)(1.08754,0.562251) + (1.12854,0.552782)(1.1691,0.547312) +\psset{fillcolor=cmy_7777ff}% +\psset{linecolor=rgb_1b1b87}% +\pspolygon[fillstyle=solid](1.08754,0.562251)(1.10071,0.531856) + (1.05312,0.552809)(1.00473,0.579391)(1.00408,0.591586) + (1.04606,0.57537)(1.08754,0.562251) +\psset{fillcolor=cmy_6d6dff}% +\psset{linecolor=rgb_1d1d91}% +\pspolygon[fillstyle=solid](1.24902,0.548712)(1.28699,0.515829) + (1.24062,0.509263)(1.19425,0.509734)(1.1691,0.547312) + (1.20925,0.545979)(1.24902,0.548712) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](0.905094,0.644715)(0.892338,0.65446) + (0.833083,0.710977)(0.772133,0.767878)(0.801956,0.715411) + (0.853879,0.680337)(0.905094,0.644715) +\psset{fillcolor=cmy_7171ff}% +\psset{linecolor=rgb_1c1c8d}% +\pspolygon[fillstyle=solid](1.47358,0.599945)(1.54036,0.603855) + (1.48342,0.557617)(1.42762,0.517893)(1.38015,0.548201) + (1.42692,0.572286)(1.47358,0.599945) +\psset{fillcolor=cmy_7d7dff}% +\psset{linecolor=rgb_191981}% +\pspolygon[fillstyle=solid](1.00408,0.591586)(1.00473,0.579391) + (0.955399,0.610498)(0.905094,0.644715)(0.918709,0.630156) + (0.961612,0.610155)(1.00408,0.591586) +\psset{fillcolor=cmy_7171ff}% +\psset{linecolor=rgb_1c1c8d}% +\pspolygon[fillstyle=solid](1.32731,0.565028)(1.38015,0.548201) + (1.33349,0.529041)(1.28699,0.515829)(1.24902,0.548712) + (1.2884,0.555226)(1.32731,0.565028) +\psset{fillcolor=cmy_7878ff}% +\psset{linecolor=rgb_1a1a86}% +\pspolygon[fillstyle=solid](0.772133,0.767878)(0.742326,0.82905) + (0.668933,0.912872)(0.593817,0.988506)(0.647182,0.869075) + (0.709925,0.821791)(0.772133,0.767878) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](0.918709,0.630156)(0.905094,0.644715) + (0.853879,0.680337)(0.801956,0.715411)(0.832163,0.670073) + (0.875495,0.650521)(0.918709,0.630156) +\psset{fillcolor=cmy_7b7bff}% +\psset{linecolor=rgb_1a1a83}% +\pspolygon[fillstyle=solid](1.14055,0.565734)(1.1691,0.547312) + (1.12854,0.552782)(1.08754,0.562251)(1.07271,0.575185) + (1.10684,0.569509)(1.14055,0.565734) +\psset{fillcolor=cmy_7979ff}% +\psset{linecolor=rgb_1a1a85}% +\pspolygon[fillstyle=solid](1.65578,0.705915)(1.74819,0.763081) + (1.67477,0.680906)(1.60334,0.602838)(1.54036,0.603855) + (1.59806,0.654266)(1.65578,0.705915) +\psset{fillcolor=cmy_7d7dff}% +\psset{linecolor=rgb_191981}% +\pspolygon[fillstyle=solid](1.07271,0.575185)(1.08754,0.562251) + (1.04606,0.57537)(1.00408,0.591586)(1.00338,0.591308) + (1.0382,0.582558)(1.07271,0.575185) +\psset{fillcolor=cmy_7575ff}% +\psset{linecolor=rgb_1b1b89}% +\pspolygon[fillstyle=solid](0.801956,0.715411)(0.772133,0.767878) + (0.709925,0.821791)(0.647182,0.869075)(0.697531,0.775355) + (0.749674,0.74781)(0.801956,0.715411) +\psset{fillcolor=cmy_7a7aff}% +\psset{linecolor=rgb_1a1a84}% +\pspolygon[fillstyle=solid](1.2064,0.564093)(1.24902,0.548712) + (1.20925,0.545979)(1.1691,0.547312)(1.14055,0.565734) + (1.17375,0.563943)(1.2064,0.564093) +\psset{fillcolor=cmy_7878ff}% +\psset{linecolor=rgb_1a1a86}% +\pspolygon[fillstyle=solid](1.40315,0.59151)(1.47358,0.599945) + (1.42692,0.572286)(1.38015,0.548201)(1.32731,0.565028) + (1.36563,0.577419)(1.40315,0.59151) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](1.00338,0.591308)(1.00408,0.591586) + (0.961612,0.610155)(0.918709,0.630156)(0.933183,0.611153) + (0.968339,0.601011)(1.00338,0.591308) +\psset{fillcolor=cmy_6c6cff}% +\psset{linecolor=rgb_1d1d92}% +\pspolygon[fillstyle=solid](0.189032,0.289372)(0.105002,0.195832) + (0.106173,0.133184)(0.107102,0.0871823)(0.187635,0.204779) + (0.187646,0.241139)(0.189032,0.289372) +\psset{fillcolor=cmy_7c7cff}% +\psset{linecolor=rgb_1a1a82}% +\pspolygon[fillstyle=solid](1.26963,0.569425)(1.32731,0.565028) + (1.2884,0.555226)(1.24902,0.548712)(1.2064,0.564093) + (1.23839,0.566016)(1.26963,0.569425) +\psset{fillcolor=cmy_7171ff}% +\psset{linecolor=rgb_1c1c8d}% +\pspolygon[fillstyle=solid](0.832163,0.670073)(0.801956,0.715411) + (0.749674,0.74781)(0.697531,0.775355)(0.746272,0.701846) + (0.788976,0.687585)(0.832163,0.670073) +\psset{fillcolor=cmy_7c7cff}% +\psset{linecolor=rgb_1a1a82}% +\pspolygon[fillstyle=solid](1.56495,0.658972)(1.65578,0.705915) + (1.59806,0.654266)(1.54036,0.603855)(1.47358,0.599945) + (1.51977,0.629498)(1.56495,0.658972) +\psset{fillcolor=cmy_4949ff}% +\psset{linecolor=rgb_2424b5}% +\pspolygon[fillstyle=solid](0.19769,0.416171)(0.10474,0.365653) + (0.104222,0.273918)(0.105002,0.195832)(0.189032,0.289372) + (0.192187,0.348273)(0.19769,0.416171) +\psset{fillcolor=cmy_7b7bff}% +\psset{linecolor=rgb_1a1a83}% +\pspolygon[fillstyle=solid](0.933183,0.611153)(0.918709,0.630156) + (0.875495,0.650521)(0.832163,0.670073)(0.863092,0.630402) + (0.898045,0.621157)(0.933183,0.611153) +\psset{fillcolor=cmy_5656ff}% +\psset{linecolor=rgb_2121a8}% +\pspolygon[fillstyle=solid](0.647182,0.869075)(0.593817,0.988506) + (0.518501,1.04983)(0.444947,1.09101)(0.524261,0.929508) + (0.584894,0.90608)(0.647182,0.869075) +\psset{fillcolor=cmy_5353ff}% +\psset{linecolor=rgb_2222ab}% +\pspolygon[fillstyle=solid](0.697531,0.775355)(0.647182,0.869075) + (0.584894,0.90608)(0.524261,0.929508)(0.596275,0.807827) + (0.646156,0.795963)(0.697531,0.775355) +\psset{fillcolor=cmy_7d7dff}% +\psset{linecolor=rgb_191981}% +\pspolygon[fillstyle=solid](0.187635,0.204779)(0.107102,0.0871823) + (0.107428,0.0586308)(0.107074,0.0480454)(0.191172,0.170524) + (0.188802,0.181093)(0.187635,0.204779) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](1.32922,0.579024)(1.40315,0.59151) + (1.36563,0.577419)(1.32731,0.565028)(1.26963,0.569425) + (1.29996,0.573925)(1.32922,0.579024) +\psset{fillcolor=cmy_6c6cff}% +\psset{linecolor=rgb_1d1d92}% +\pspolygon[fillstyle=solid](0.863092,0.630402)(0.832163,0.670073) + (0.788976,0.687585)(0.746272,0.701846)(0.794552,0.644134) + (0.828519,0.638261)(0.863092,0.630402) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](1.109,0.566914)(1.14055,0.565734) + (1.10684,0.569509)(1.07271,0.575185)(1.05638,0.57247) + (1.08289,0.569392)(1.109,0.566914) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](1.05638,0.57247)(1.07271,0.575185) + (1.0382,0.582558)(1.00338,0.591308)(1.00261,0.579992) + (1.02959,0.576053)(1.05638,0.57247) +\pspolygon[fillstyle=solid](1.47456,0.620443)(1.56495,0.658972) + (1.51977,0.629498)(1.47358,0.599945)(1.40315,0.59151) + (1.43958,0.606246)(1.47456,0.620443) +\psset{fillcolor=cmy_5050ff}% +\psset{linecolor=rgb_2222ae}% +\pspolygon[fillstyle=solid](0.746272,0.701846)(0.697531,0.775355) + (0.646156,0.795963)(0.596275,0.807827)(0.663929,0.71633) + (0.704444,0.711739)(0.746272,0.701846) +\psset{fillcolor=cmy_2323ff}% +\psset{linecolor=rgb_2b2bdb}% +\pspolygon[fillstyle=solid](0.218731,0.569601)(0.114562,0.578881) + (0.107723,0.468479)(0.10474,0.365653)(0.19769,0.416171) + (0.206264,0.490868)(0.218731,0.569601) +\psset{fillcolor=cmy_7b7bff}% +\psset{linecolor=rgb_1a1a83}% +\pspolygon[fillstyle=solid](1.00261,0.579992)(1.00338,0.591308) + (0.968339,0.601011)(0.933183,0.611153)(0.948523,0.588133) + (0.975553,0.584095)(1.00261,0.579992) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](1.1597,0.563866)(1.2064,0.564093) + (1.17375,0.563943)(1.14055,0.565734)(1.109,0.566914) + (1.13464,0.565078)(1.1597,0.563866) +\psset{fillcolor=cmy_7474ff}% +\psset{linecolor=rgb_1b1b8a}% +\pspolygon[fillstyle=solid](0.948523,0.588133)(0.933183,0.611153) + (0.898045,0.621157)(0.863092,0.630402)(0.895059,0.594987) + (0.921647,0.591852)(0.948523,0.588133) +\psset{fillcolor=cmy_2828ff}% +\psset{linecolor=rgb_2a2ad6}% +\pspolygon[fillstyle=solid](0.524261,0.929508)(0.444947,1.09101) + (0.375363,1.10732)(0.311925,1.09597)(0.413159,0.926478) + (0.466591,0.936797)(0.524261,0.929508) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](1.20765,0.562964)(1.26963,0.569425) + (1.23839,0.566016)(1.2064,0.564093)(1.1597,0.563866) + (1.18407,0.563204)(1.20765,0.562964) +\psset{fillcolor=cmy_4f4fff}% +\psset{linecolor=rgb_2323af}% +\pspolygon[fillstyle=solid](0.794552,0.644134)(0.746272,0.701846) + (0.704444,0.711739)(0.663929,0.71633)(0.729448,0.647866) + (0.761441,0.647482)(0.794552,0.644134) +\psset{fillcolor=cmy_2828ff}% +\psset{linecolor=rgb_2a2ad6}% +\pspolygon[fillstyle=solid](0.596275,0.807827)(0.524261,0.929508) + (0.466591,0.936797)(0.413159,0.926478)(0.504048,0.800507) + (0.548656,0.809592)(0.596275,0.807827) +\psset{fillcolor=cmy_2929ff}% +\psset{linecolor=rgb_2a2ad5}% +\pspolygon[fillstyle=solid](0.663929,0.71633)(0.596275,0.807827) + (0.548656,0.809592)(0.504048,0.800507)(0.58863,0.707203) + (0.625178,0.714938)(0.663929,0.71633) +\psset{fillcolor=cmy_3f3fff}% +\psset{linecolor=rgb_2626bf}% +\pspolygon[fillstyle=solid](0.298804,0.454436)(0.19769,0.416171) + (0.192187,0.348273)(0.189032,0.289372)(0.285765,0.364096) + (0.29087,0.406486)(0.298804,0.454436) +\psset{fillcolor=cmy_6666ff}% +\psset{linecolor=rgb_1e1e98}% +\pspolygon[fillstyle=solid](0.895059,0.594987)(0.863092,0.630402) + (0.828519,0.638261)(0.794552,0.644134)(0.84333,0.598464) + (0.868903,0.597273)(0.895059,0.594987) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](1.38364,0.588709)(1.47456,0.620443) + (1.43958,0.606246)(1.40315,0.59151)(1.32922,0.579024) + (1.35719,0.584157)(1.38364,0.588709) +\psset{fillcolor=cmy_6464ff}% +\psset{linecolor=rgb_1e1e9a}% +\pspolygon[fillstyle=solid](0.285765,0.364096)(0.189032,0.289372) + (0.187646,0.241139)(0.187635,0.204779)(0.282956,0.300896) + (0.283191,0.328573)(0.285765,0.364096) +\psset{fillcolor=cmy_0909ff}% +\psset{linecolor=rgb_3131f5}% +\pspolygon[fillstyle=solid](0.258703,0.72553)(0.145957,0.803098) + (0.126792,0.692284)(0.114562,0.578881)(0.218731,0.569601) + (0.235947,0.649066)(0.258703,0.72553) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](1.2519,0.563022)(1.32922,0.579024) + (1.29996,0.573925)(1.26963,0.569425)(1.20765,0.562964) + (1.2303,0.562975)(1.2519,0.563022) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](1.76674,0.798575)(1.89443,0.91833) + (1.82212,0.844276)(1.74819,0.763081)(1.65578,0.705915) + (1.71247,0.755316)(1.76674,0.798575) +\psset{fillcolor=cmy_1b1bff}% +\psset{linecolor=rgb_2d2de3}% +\pspolygon[fillstyle=solid](0.324666,0.560164)(0.218731,0.569601) + (0.206264,0.490868)(0.19769,0.416171)(0.298804,0.454436) + (0.309934,0.506308)(0.324666,0.560164) +\psset{fillcolor=cmy_2d2dff}% +\psset{linecolor=rgb_2929d1}% +\pspolygon[fillstyle=solid](0.729448,0.647866)(0.663929,0.71633) + (0.625178,0.714938)(0.58863,0.707203)(0.669881,0.638666) + (0.698841,0.644979)(0.729448,0.647866) +\psset{fillcolor=cmy_0909ff}% +\psset{linecolor=rgb_3131f5}% +\pspolygon[fillstyle=solid](0.413159,0.926478)(0.311925,1.09597) + (0.256452,1.05661)(0.210141,0.991471)(0.323082,0.85378) + (0.36506,0.8984)(0.413159,0.926478) +\psset{fillcolor=cmy_0a0aff}% +\psset{linecolor=rgb_3030f4}% +\pspolygon[fillstyle=solid](0.504048,0.800507)(0.413159,0.926478) + (0.36506,0.8984)(0.323082,0.85378)(0.426348,0.750295) + (0.463108,0.78052)(0.504048,0.800507) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](1.6493,0.708781)(1.76674,0.798575) + (1.71247,0.755316)(1.65578,0.705915)(1.56495,0.658972) + (1.60841,0.686169)(1.6493,0.708781) +\psset{fillcolor=cmy_5050ff}% +\psset{linecolor=rgb_2222ae}% +\pspolygon[fillstyle=solid](0.84333,0.598464)(0.794552,0.644134) + (0.761441,0.647482)(0.729448,0.647866)(0.794573,0.596748) + (0.818499,0.598346)(0.84333,0.598464) +\psset{fillcolor=cmy_0d0dff}% +\psset{linecolor=rgb_3030f1}% +\pspolygon[fillstyle=solid](0.58863,0.707203)(0.504048,0.800507) + (0.463108,0.78052)(0.426348,0.750295)(0.523665,0.673044) + (0.554683,0.693119)(0.58863,0.707203) +\psset{fillcolor=cmy_0606ff}% +\psset{linecolor=rgb_3131f8}% +\pspolygon[fillstyle=solid](0.366464,0.664928)(0.258703,0.72553) + (0.235947,0.649066)(0.218731,0.569601)(0.324666,0.560164) + (0.343397,0.613816)(0.366464,0.664928) +\psset{fillcolor=cmy_0000ff}% +\psset{linecolor=rgb_3232fe}% +\pspolygon[fillstyle=solid](0.323082,0.85378)(0.210141,0.991471) + (0.173421,0.904998)(0.145957,0.803098)(0.258703,0.72553) + (0.287629,0.795046)(0.323082,0.85378) +\psset{fillcolor=cmy_7474ff}% +\psset{linecolor=rgb_1b1b8a}% +\pspolygon[fillstyle=solid](1.03875,0.556754)(1.05638,0.57247) + (1.02959,0.576053)(1.00261,0.579992)(1.00179,0.559495) + (1.02033,0.558175)(1.03875,0.556754) +\psset{fillcolor=cmy_7676ff}% +\psset{linecolor=rgb_1b1b88}% +\pspolygon[fillstyle=solid](1.07488,0.553783)(1.109,0.566914) + (1.08289,0.569392)(1.05638,0.57247)(1.03875,0.556754) + (1.05696,0.555279)(1.07488,0.553783) +\psset{fillcolor=cmy_7171ff}% +\psset{linecolor=rgb_1c1c8d}% +\pspolygon[fillstyle=solid](1.00179,0.559495)(1.00261,0.579992) + (0.975553,0.584095)(0.948523,0.588133)(0.964748,0.561577) + (0.983236,0.560652)(1.00179,0.559495) +\psset{fillcolor=cmy_0000ff}% +\psset{linecolor=rgb_3232fe}% +\pspolygon[fillstyle=solid](0.426348,0.750295)(0.323082,0.85378) + (0.287629,0.795046)(0.258703,0.72553)(0.366464,0.664928) + (0.394092,0.711151)(0.426348,0.750295) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](1.53831,0.642183)(1.6493,0.708781) + (1.60841,0.686169)(1.56495,0.658972)(1.47456,0.620443) + (1.50763,0.632843)(1.53831,0.642183) +\psset{fillcolor=cmy_7777ff}% +\psset{linecolor=rgb_1b1b87}% +\pspolygon[fillstyle=solid](1.10948,0.550772)(1.1597,0.563866) + (1.13464,0.565078)(1.109,0.566914)(1.07488,0.553783) + (1.09241,0.552281)(1.10948,0.550772) +\psset{fillcolor=cmy_6a6aff}% +\psset{linecolor=rgb_1d1d94}% +\pspolygon[fillstyle=solid](0.964748,0.561577)(0.948523,0.588133) + (0.921647,0.591852)(0.895059,0.594987)(0.92836,0.562423) + (0.946423,0.562194)(0.964748,0.561577) +\psset{fillcolor=cmy_1515ff}% +\psset{linecolor=rgb_2e2ee9}% +\pspolygon[fillstyle=solid](0.669881,0.638666)(0.58863,0.707203) + (0.554683,0.693119)(0.523665,0.673044)(0.617846,0.615994) + (0.642811,0.628942)(0.669881,0.638666) +\psset{fillcolor=cmy_0101ff}% +\psset{linecolor=rgb_3232fd}% +\pspolygon[fillstyle=solid](0.523665,0.673044)(0.426348,0.750295) + (0.394092,0.711151)(0.366464,0.664928)(0.471308,0.617992) + (0.495823,0.647676)(0.523665,0.673044) +\psset{fillcolor=cmy_3838ff}% +\psset{linecolor=rgb_2727c6}% +\pspolygon[fillstyle=solid](0.794573,0.596748)(0.729448,0.647866) + (0.698841,0.644979)(0.669881,0.638666)(0.750078,0.58872) + (0.771713,0.593556)(0.794573,0.596748) +\psset{fillcolor=cmy_7b7bff}% +\psset{linecolor=rgb_1a1a83}% +\pspolygon[fillstyle=solid](1.29137,0.562256)(1.38364,0.588709) + (1.35719,0.584157)(1.32922,0.579024)(1.2519,0.563022) + (1.27231,0.562867)(1.29137,0.562256) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](0.191172,0.170524)(0.107074,0.0480454) + (0.106268,0.0557124)(0.105573,0.08167)(0.20082,0.188793) + (0.195007,0.173177)(0.191172,0.170524) +\psset{fillcolor=cmy_7979ff}% +\psset{linecolor=rgb_1a1a85}% +\pspolygon[fillstyle=solid](0.282956,0.300896)(0.187635,0.204779) + (0.188802,0.181093)(0.191172,0.170524)(0.28937,0.271374) + (0.284992,0.281718)(0.282956,0.300896) +\psset{fillcolor=cmy_7676ff}% +\psset{linecolor=rgb_1b1b88}% +\pspolygon[fillstyle=solid](1.14185,0.547647)(1.20765,0.562964) + (1.18407,0.563204)(1.1597,0.563866)(1.10948,0.550772) + (1.12599,0.549239)(1.14185,0.547647) +\psset{fillcolor=cmy_0505ff}% +\psset{linecolor=rgb_3131f9}% +\pspolygon[fillstyle=solid](0.471308,0.617992)(0.366464,0.664928) + (0.343397,0.613816)(0.324666,0.560164)(0.432412,0.550565) + (0.450178,0.585184)(0.471308,0.617992) +\psset{fillcolor=cmy_6161ff}% +\psset{linecolor=rgb_1f1f9d}% +\pspolygon[fillstyle=solid](0.92836,0.562423)(0.895059,0.594987) + (0.868903,0.597273)(0.84333,0.598464)(0.893412,0.561425) + (0.910657,0.56219)(0.92836,0.562423) +\psset{fillcolor=cmy_1616ff}% +\psset{linecolor=rgb_2e2ee8}% +\pspolygon[fillstyle=solid](0.432412,0.550565)(0.324666,0.560164) + (0.309934,0.506308)(0.298804,0.454436)(0.406584,0.481275) + (0.417922,0.515489)(0.432412,0.550565) +\psset{fillcolor=cmy_7b7bff}% +\psset{linecolor=rgb_1a1a83}% +\pspolygon[fillstyle=solid](1.43089,0.593568)(1.53831,0.642183) + (1.50763,0.632843)(1.47456,0.620443)(1.38364,0.588709) + (1.40831,0.592049)(1.43089,0.593568) +\psset{fillcolor=cmy_0909ff}% +\psset{linecolor=rgb_3131f5}% +\pspolygon[fillstyle=solid](0.617846,0.615994)(0.523665,0.673044) + (0.495823,0.647676)(0.471308,0.617992)(0.574906,0.58195) + (0.595165,0.600168)(0.617846,0.615994) +\psset{fillcolor=cmy_3636ff}% +\psset{linecolor=rgb_2828c8}% +\pspolygon[fillstyle=solid](0.406584,0.481275)(0.298804,0.454436) + (0.29087,0.406486)(0.285765,0.364096)(0.392802,0.420142) + (0.398255,0.449137)(0.406584,0.481275) +\psset{fillcolor=cmy_2626ff}% +\psset{linecolor=rgb_2b2bd8}% +\pspolygon[fillstyle=solid](0.750078,0.58872)(0.669881,0.638666) + (0.642811,0.628942)(0.617846,0.615994)(0.711075,0.574268) + (0.729819,0.582261)(0.750078,0.58872) +\psset{fillcolor=cmy_5555ff}% +\psset{linecolor=rgb_2121a9}% +\pspolygon[fillstyle=solid](0.893412,0.561425)(0.84333,0.598464) + (0.818499,0.598346)(0.794573,0.596748)(0.860696,0.558086) + (0.876726,0.560071)(0.893412,0.561425) +\psset{fillcolor=cmy_7474ff}% +\psset{linecolor=rgb_1b1b8a}% +\pspolygon[fillstyle=solid](1.17127,0.54409)(1.2519,0.563022) + (1.2303,0.562975)(1.20765,0.562964)(1.14185,0.547647) + (1.15697,0.54595)(1.17127,0.54409) +\psset{fillcolor=cmy_0b0bff}% +\psset{linecolor=rgb_3030f3}% +\pspolygon[fillstyle=solid](0.574906,0.58195)(0.471308,0.617992) + (0.450178,0.585184)(0.432412,0.550565)(0.542015,0.540801) + (0.557169,0.561937)(0.574906,0.58195) +\psset{fillcolor=cmy_4848ff}% +\psset{linecolor=rgb_2424b6}% +\pspolygon[fillstyle=solid](0.860696,0.558086)(0.794573,0.596748) + (0.771713,0.593556)(0.750078,0.58872)(0.830997,0.552142) + (0.845422,0.555444)(0.860696,0.558086) +\psset{fillcolor=cmy_5a5aff}% +\psset{linecolor=rgb_2020a4}% +\pspolygon[fillstyle=solid](0.392802,0.420142)(0.285765,0.364096) + (0.283191,0.328573)(0.282956,0.300896)(0.390156,0.374904) + (0.390121,0.395173)(0.392802,0.420142) +\psset{fillcolor=cmy_7575ff}% +\psset{linecolor=rgb_1b1b89}% +\pspolygon[fillstyle=solid](1.32484,0.558669)(1.43089,0.593568) + (1.40831,0.592049)(1.38364,0.588709)(1.29137,0.562256) + (1.30893,0.560936)(1.32484,0.558669) +\psset{fillcolor=cmy_1c1cff}% +\psset{linecolor=rgb_2d2de2}% +\pspolygon[fillstyle=solid](0.711075,0.574268)(0.617846,0.615994) + (0.595165,0.600168)(0.574906,0.58195)(0.678618,0.554358) + (0.693971,0.564896)(0.711075,0.574268) +\psset{fillcolor=cmy_7171ff}% +\psset{linecolor=rgb_1c1c8d}% +\pspolygon[fillstyle=solid](1.19703,0.539628)(1.29137,0.562256) + (1.27231,0.562867)(1.2519,0.563022)(1.17127,0.54409) + (1.18465,0.542005)(1.19703,0.539628) +\psset{fillcolor=cmy_1818ff}% +\psset{linecolor=rgb_2e2ee6}% +\pspolygon[fillstyle=solid](0.542015,0.540801)(0.432412,0.550565) + (0.417922,0.515489)(0.406584,0.481275)(0.519554,0.497979) + (0.529474,0.519246)(0.542015,0.540801) +\psset{fillcolor=cmy_3d3dff}% +\psset{linecolor=rgb_2626c1}% +\pspolygon[fillstyle=solid](0.830997,0.552142)(0.750078,0.58872) + (0.729819,0.582261)(0.711075,0.574268)(0.805053,0.543639) + (0.817512,0.548194)(0.830997,0.552142) +\psset{fillcolor=cmy_6666ff}% +\psset{linecolor=rgb_1e1e98}% +\pspolygon[fillstyle=solid](1.01993,0.53134)(1.03875,0.556754) + (1.02033,0.558175)(1.00179,0.559495)(1.00092,0.532012) + (1.01046,0.531756)(1.01993,0.53134) +\psset{fillcolor=cmy_6565ff}% +\psset{linecolor=rgb_1e1e99}% +\pspolygon[fillstyle=solid](1.00092,0.532012)(1.00179,0.559495) + (0.983236,0.560652)(0.964748,0.561577)(0.98189,0.532011) + (0.991382,0.5321)(1.00092,0.532012) +\psset{fillcolor=cmy_6868ff}% +\psset{linecolor=rgb_1e1e96}% +\pspolygon[fillstyle=solid](1.03849,0.530055)(1.07488,0.553783) + (1.05696,0.555279)(1.03875,0.556754)(1.01993,0.53134) + (1.02929,0.53077)(1.03849,0.530055) +\psset{fillcolor=cmy_1c1cff}% +\psset{linecolor=rgb_2d2de2}% +\pspolygon[fillstyle=solid](0.678618,0.554358)(0.574906,0.58195) + (0.557169,0.561937)(0.542015,0.540801)(0.653524,0.530867) + (0.66511,0.542917)(0.678618,0.554358) +\psset{fillcolor=cmy_6262ff}% +\psset{linecolor=rgb_1f1f9c}% +\pspolygon[fillstyle=solid](0.98189,0.532011)(0.964748,0.561577) + (0.946423,0.562194)(0.92836,0.562423)(0.963262,0.531266) + (0.972499,0.531735)(0.98189,0.532011) +\psset{fillcolor=cmy_6868ff}% +\psset{linecolor=rgb_1e1e96}% +\pspolygon[fillstyle=solid](1.05617,0.528201)(1.10948,0.550772) + (1.09241,0.552281)(1.07488,0.553783)(1.03849,0.530055) + (1.04746,0.529197)(1.05617,0.528201) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](0.963262,0.531266)(0.92836,0.562423) + (0.910657,0.56219)(0.893412,0.561425)(0.945465,0.52972) + (0.954234,0.530596)(0.963262,0.531266) +\psset{fillcolor=cmy_3232ff}% +\psset{linecolor=rgb_2828cc}% +\pspolygon[fillstyle=solid](0.519554,0.497979)(0.406584,0.481275) + (0.398255,0.449137)(0.392802,0.420142)(0.507551,0.458909) + (0.512249,0.477666)(0.519554,0.497979) +\psset{fillcolor=cmy_7575ff}% +\psset{linecolor=rgb_1b1b89}% +\pspolygon[fillstyle=solid](1.59029,0.647141)(1.71949,0.731475) + (1.68666,0.724552)(1.6493,0.708781)(1.53831,0.642183) + (1.56604,0.647284)(1.59029,0.647141) +\psset{fillcolor=cmy_6868ff}% +\psset{linecolor=rgb_1e1e96}% +\pspolygon[fillstyle=solid](1.07258,0.525802)(1.14185,0.547647) + (1.12599,0.549239)(1.10948,0.550772)(1.05617,0.528201) + (1.06456,0.527069)(1.07258,0.525802) +\psset{fillcolor=cmy_7070ff}% +\psset{linecolor=rgb_1c1c8e}% +\pspolygon[fillstyle=solid](1.46867,0.589042)(1.59029,0.647141) + (1.56604,0.647284)(1.53831,0.642183)(1.43089,0.593568) + (1.45111,0.592716)(1.46867,0.589042) +\psset{fillcolor=cmy_3737ff}% +\psset{linecolor=rgb_2727c7}% +\pspolygon[fillstyle=solid](0.805053,0.543639)(0.711075,0.574268) + (0.693971,0.564896)(0.678618,0.554358)(0.783529,0.532958) + (0.793701,0.538535)(0.805053,0.543639) +\psset{fillcolor=cmy_6c6cff}% +\psset{linecolor=rgb_1d1d92}% +\pspolygon[fillstyle=solid](1.21844,0.533751)(1.32484,0.558669) + (1.30893,0.560936)(1.29137,0.562256)(1.19703,0.539628) + (1.20832,0.536895)(1.21844,0.533751) +\psset{fillcolor=cmy_5959ff}% +\psset{linecolor=rgb_2121a5}% +\pspolygon[fillstyle=solid](0.945465,0.52972)(0.893412,0.561425) + (0.876726,0.560071)(0.860696,0.558086)(0.928911,0.52734) + (0.937007,0.528634)(0.945465,0.52972) +\psset{fillcolor=cmy_7878ff}% +\psset{linecolor=rgb_1a1a86}% +\pspolygon[fillstyle=solid](1.71949,0.731475)(1.86122,0.850819) + (1.81692,0.831665)(1.76674,0.798575)(1.6493,0.708781) + (1.68666,0.724552)(1.71949,0.731475) +\psset{fillcolor=cmy_6868ff}% +\psset{linecolor=rgb_1e1e96}% +\pspolygon[fillstyle=solid](1.08732,0.52286)(1.17127,0.54409) + (1.15697,0.54595)(1.14185,0.547647)(1.07258,0.525802) + (1.08018,0.524399)(1.08732,0.52286) +\psset{fillcolor=cmy_6a6aff}% +\psset{linecolor=rgb_1d1d94}% +\pspolygon[fillstyle=solid](1.35106,0.550511)(1.46867,0.589042) + (1.45111,0.592716)(1.43089,0.593568)(1.32484,0.558669) + (1.33893,0.555247)(1.35106,0.550511) +\psset{fillcolor=cmy_2525ff}% +\psset{linecolor=rgb_2b2bd9}% +\pspolygon[fillstyle=solid](0.653524,0.530867)(0.542015,0.540801) + (0.529474,0.519246)(0.519554,0.497979)(0.636366,0.506205) + (0.643926,0.518523)(0.653524,0.530867) +\psset{fillcolor=cmy_5454ff}% +\psset{linecolor=rgb_2222aa}% +\pspolygon[fillstyle=solid](0.928911,0.52734)(0.860696,0.558086) + (0.845422,0.555444)(0.830997,0.552142)(0.913992,0.524138) + (0.921223,0.525839)(0.928911,0.52734) +\psset{fillcolor=cmy_7373ff}% +\psset{linecolor=rgb_1b1b8b}% +\pspolygon[fillstyle=solid](0.390156,0.374904)(0.282956,0.300896) + (0.284992,0.281718)(0.28937,0.271374)(0.398466,0.350056) + (0.392913,0.35979)(0.390156,0.374904) +\psset{fillcolor=cmy_3636ff}% +\psset{linecolor=rgb_2828c8}% +\pspolygon[fillstyle=solid](0.783529,0.532958)(0.678618,0.554358) + (0.66511,0.542917)(0.653524,0.530867)(0.76699,0.520758) + (0.774605,0.526998)(0.783529,0.532958) +\psset{fillcolor=cmy_7979ff}% +\psset{linecolor=rgb_1a1a85}% +\pspolygon[fillstyle=solid](1.86122,0.850819)(2.0226,1.01759) + (1.96232,0.978383)(1.89443,0.91833)(1.76674,0.798575) + (1.81692,0.831665)(1.86122,0.850819) +\psset{fillcolor=cmy_6666ff}% +\psset{linecolor=rgb_1e1e98}% +\pspolygon[fillstyle=solid](1.10005,0.519369)(1.19703,0.539628) + (1.18465,0.542005)(1.17127,0.54409)(1.08732,0.52286) + (1.09396,0.521183)(1.10005,0.519369) +\psset{fillcolor=cmy_5050ff}% +\psset{linecolor=rgb_2222ae}% +\pspolygon[fillstyle=solid](0.913992,0.524138)(0.830997,0.552142) + (0.817512,0.548194)(0.805053,0.543639)(0.90107,0.520175) + (0.90726,0.522245)(0.913992,0.524138) +\psset{fillcolor=cmy_5151ff}% +\psset{linecolor=rgb_2222ad}% +\pspolygon[fillstyle=solid](0.507551,0.458909)(0.392802,0.420142) + (0.390121,0.395173)(0.390156,0.374904)(0.50598,0.427985) + (0.505457,0.442216)(0.507551,0.458909) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](0.28937,0.271374)(0.191172,0.170524) + (0.195007,0.173177)(0.20082,0.188793)(0.306183,0.276904) + (0.296309,0.269877)(0.28937,0.271374) +\psset{fillcolor=cmy_6363ff}% +\psset{linecolor=rgb_1f1f9b}% +\pspolygon[fillstyle=solid](1.23484,0.526055)(1.35106,0.550511) + (1.33893,0.555247)(1.32484,0.558669)(1.21844,0.533751) + (1.2273,0.530147)(1.23484,0.526055) +\psset{fillcolor=cmy_3737ff}% +\psset{linecolor=rgb_2727c7}% +\pspolygon[fillstyle=solid](0.636366,0.506205)(0.519554,0.497979) + (0.512249,0.477666)(0.507551,0.458909)(0.62752,0.482848) + (0.630886,0.49422)(0.636366,0.506205) +\psset{fillcolor=cmy_4d4dff}% +\psset{linecolor=rgb_2323b1}% +\pspolygon[fillstyle=solid](0.90107,0.520175)(0.805053,0.543639) + (0.793701,0.538535)(0.783529,0.532958)(0.890469,0.515566) + (0.895461,0.517942)(0.90107,0.520175) +\psset{fillcolor=cmy_6363ff}% +\psset{linecolor=rgb_1f1f9b}% +\pspolygon[fillstyle=solid](1.11043,0.515333)(1.21844,0.533751) + (1.20832,0.536895)(1.19703,0.539628)(1.10005,0.519369) + (1.10555,0.517419)(1.11043,0.515333) +\psset{fillcolor=cmy_3a3aff}% +\psset{linecolor=rgb_2727c4}% +\pspolygon[fillstyle=solid](0.76699,0.520758)(0.653524,0.530867) + (0.643926,0.518523)(0.636366,0.506205)(0.755889,0.507874) + (0.760736,0.514347)(0.76699,0.520758) +\psset{fillcolor=cmy_3c3cff}% +\psset{linecolor=rgb_2626c2}% +\pspolygon[fillstyle=solid](1.6438,0.0321256)(1.71591,-0.120081) + (1.76775,-0.074723)(1.81976,-0.0100767)(1.73326,0.116772) + (1.68934,0.0674669)(1.6438,0.0321256) +\psset{fillcolor=cmy_4b4bff}% +\psset{linecolor=rgb_2323b3}% +\pspolygon[fillstyle=solid](0.890469,0.515566)(0.783529,0.532958) + (0.774605,0.526998)(0.76699,0.520758)(0.882464,0.510471) + (0.886127,0.513068)(0.890469,0.515566) +\psset{fillcolor=cmy_5858ff}% +\psset{linecolor=rgb_2121a6}% +\pspolygon[fillstyle=solid](1.36891,0.536746)(1.49483,0.572133) + (1.48332,0.582232)(1.46867,0.589042)(1.35106,0.550511) + (1.36109,0.544356)(1.36891,0.536746) +\psset{fillcolor=cmy_5f5fff}% +\psset{linecolor=rgb_1f1f9f}% +\pspolygon[fillstyle=solid](1.1182,0.510778)(1.23484,0.526055) + (1.2273,0.530147)(1.21844,0.533751)(1.11043,0.515333) + (1.11466,0.513118)(1.1182,0.510778) +\psset{fillcolor=cmy_5b5bff}% +\psset{linecolor=rgb_2020a3}% +\pspolygon[fillstyle=solid](1.49483,0.572133)(1.62644,0.6285) + (1.61057,0.641013)(1.59029,0.647141)(1.46867,0.589042) + (1.48332,0.582232)(1.49483,0.572133) +\psset{fillcolor=cmy_5858ff}% +\psset{linecolor=rgb_2121a6}% +\pspolygon[fillstyle=solid](1.24569,0.516371)(1.36891,0.536746) + (1.36109,0.544356)(1.35106,0.550511)(1.23484,0.526055) + (1.24099,0.52146)(1.24569,0.516371) +\psset{fillcolor=cmy_5d5dff}% +\psset{linecolor=rgb_2020a1}% +\pspolygon[fillstyle=solid](1,0.5)(1.01993,0.53134) + (1.01046,0.531756)(1.00092,0.532012)(1,0.5) +\pspolygon[fillstyle=solid](1,0.5)(1.00092,0.532012) + (0.991382,0.5321)(0.98189,0.532011)(1,0.5) +\pspolygon[fillstyle=solid](1,0.5)(1.03849,0.530055) + (1.02929,0.53077)(1.01993,0.53134)(1,0.5) +\pspolygon[fillstyle=solid](1,0.5)(0.98189,0.532011) + (0.972499,0.531735)(0.963262,0.531266)(1,0.5) +\pspolygon[fillstyle=solid](1,0.5)(1.05617,0.528201) + (1.04746,0.529197)(1.03849,0.530055)(1,0.5) +\psset{fillcolor=cmy_5c5cff}% +\psset{linecolor=rgb_2020a2}% +\pspolygon[fillstyle=solid](1,0.5)(0.963262,0.531266) + (0.954234,0.530596)(0.945465,0.52972)(1,0.5) +\psset{fillcolor=cmy_4343ff}% +\psset{linecolor=rgb_2525bb}% +\pspolygon[fillstyle=solid](0.755889,0.507874)(0.636366,0.506205) + (0.630886,0.49422)(0.62752,0.482848)(0.750565,0.495176) + (0.752488,0.50145)(0.755889,0.507874) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](1,0.5)(1.07258,0.525802) + (1.06456,0.527069)(1.05617,0.528201)(1,0.5) +\psset{fillcolor=cmy_5c5cff}% +\psset{linecolor=rgb_2020a2}% +\pspolygon[fillstyle=solid](1,0.5)(0.945465,0.52972) + (0.937007,0.528634)(0.928911,0.52734)(1,0.5) +\psset{fillcolor=cmy_4c4cff}% +\psset{linecolor=rgb_2323b2}% +\pspolygon[fillstyle=solid](0.882464,0.510471)(0.76699,0.520758) + (0.760736,0.514347)(0.755889,0.507874)(0.877275,0.505078) + (0.879506,0.507799)(0.882464,0.510471) +\pspolygon[fillstyle=solid](0.62752,0.482848)(0.507551,0.458909) + (0.505457,0.442216)(0.50598,0.427985)(0.627253,0.462871) + (0.6263,0.472334)(0.62752,0.482848) +\psset{fillcolor=cmy_5f5fff}% +\psset{linecolor=rgb_1f1f9f}% +\pspolygon[fillstyle=solid](1,0.5)(1.08732,0.52286) + (1.08018,0.524399)(1.07258,0.525802)(1,0.5) +\psset{fillcolor=cmy_5a5aff}% +\psset{linecolor=rgb_2020a4}% +\pspolygon[fillstyle=solid](1,0.5)(0.928911,0.52734) + (0.921223,0.525839)(0.913992,0.524138)(1,0.5) +\pspolygon[fillstyle=solid](1.12312,0.505768)(1.24569,0.516371) + (1.24099,0.52146)(1.23484,0.526055)(1.1182,0.510778) + (1.12103,0.508324)(1.12312,0.505768) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](1.62644,0.6285)(1.76797,0.713246) + (1.74686,0.728005)(1.71949,0.731475)(1.59029,0.647141) + (1.61057,0.641013)(1.62644,0.6285) +\psset{fillcolor=cmy_6a6aff}% +\psset{linecolor=rgb_1d1d94}% +\pspolygon[fillstyle=solid](0.50598,0.427985)(0.390156,0.374904) + (0.392913,0.35979)(0.398466,0.350056)(0.515019,0.407859) + (0.509149,0.416487)(0.50598,0.427985) +\psset{fillcolor=cmy_5959ff}% +\psset{linecolor=rgb_2121a5}% +\pspolygon[fillstyle=solid](1,0.5)(0.913992,0.524138) + (0.90726,0.522245)(0.90107,0.520175)(1,0.5) +\psset{fillcolor=cmy_5f5fff}% +\psset{linecolor=rgb_1f1f9f}% +\pspolygon[fillstyle=solid](1,0.5)(1.10005,0.519369) + (1.09396,0.521183)(1.08732,0.52286)(1,0.5) +\psset{fillcolor=cmy_5252ff}% +\psset{linecolor=rgb_2222ac}% +\pspolygon[fillstyle=solid](1.54709,0.00607935)(1.61087,-0.15044) + (1.66387,-0.145468)(1.71591,-0.120081)(1.6438,0.0321256) + (1.59652,0.0115261)(1.54709,0.00607935) +\psset{fillcolor=cmy_5757ff}% +\psset{linecolor=rgb_2121a7}% +\pspolygon[fillstyle=solid](1,0.5)(0.90107,0.520175) + (0.895461,0.517942)(0.890469,0.515566)(1,0.5) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](1,0.5)(1.11043,0.515333) + (1.10555,0.517419)(1.10005,0.519369)(1,0.5) +\psset{fillcolor=cmy_5050ff}% +\psset{linecolor=rgb_2222ae}% +\pspolygon[fillstyle=solid](0.877275,0.505078)(0.755889,0.507874) + (0.752488,0.50145)(0.750565,0.495176)(0.875059,0.499586) + (0.875788,0.502332)(0.877275,0.505078) +\psset{fillcolor=cmy_5656ff}% +\psset{linecolor=rgb_2121a8}% +\pspolygon[fillstyle=solid](1,0.5)(0.890469,0.515566) + (0.886127,0.513068)(0.882464,0.510471)(1,0.5) +\psset{fillcolor=cmy_5d5dff}% +\psset{linecolor=rgb_2020a1}% +\pspolygon[fillstyle=solid](1,0.5)(1.1182,0.510778) + (1.11466,0.513118)(1.11043,0.515333)(1,0.5) +\psset{fillcolor=cmy_2626ff}% +\psset{linecolor=rgb_2b2bd8}% +\pspolygon[fillstyle=solid](1.73326,0.116772)(1.81976,-0.0100767) + (1.87193,0.0727816)(1.92376,0.172159)(1.81542,0.25192) + (1.77544,0.178833)(1.73326,0.116772) +\psset{fillcolor=cmy_4b4bff}% +\psset{linecolor=rgb_2323b3}% +\pspolygon[fillstyle=solid](1.25055,0.504845)(1.37753,0.517385) + (1.37441,0.527719)(1.36891,0.536746)(1.24569,0.516371) + (1.24889,0.510816)(1.25055,0.504845) +\psset{fillcolor=cmy_5656ff}% +\psset{linecolor=rgb_2121a8}% +\pspolygon[fillstyle=solid](1,0.5)(0.882464,0.510471) + (0.879506,0.507799)(0.877275,0.505078)(1,0.5) +\psset{fillcolor=cmy_5b5bff}% +\psset{linecolor=rgb_2020a3}% +\pspolygon[fillstyle=solid](1,0.5)(1.12312,0.505768) + (1.12103,0.508324)(1.1182,0.510778)(1,0.5) +\psset{fillcolor=cmy_5454ff}% +\psset{linecolor=rgb_2222aa}% +\pspolygon[fillstyle=solid](1.12505,0.500414)(1.25055,0.504845) + (1.24889,0.510816)(1.24569,0.516371)(1.12312,0.505768) + (1.12447,0.503125)(1.12505,0.500414) +\psset{fillcolor=cmy_4f4fff}% +\psset{linecolor=rgb_2323af}% +\pspolygon[fillstyle=solid](0.750565,0.495176)(0.62752,0.482848) + (0.6263,0.472334)(0.627253,0.462871)(0.751245,0.483425) + (0.750144,0.489142)(0.750565,0.495176) +\psset{fillcolor=cmy_4141ff}% +\psset{linecolor=rgb_2525bd}% +\pspolygon[fillstyle=solid](1.37753,0.517385)(1.50776,0.542368) + (1.50301,0.558773)(1.49483,0.572133)(1.36891,0.536746) + (1.37441,0.527719)(1.37753,0.517385) +\psset{fillcolor=cmy_5757ff}% +\psset{linecolor=rgb_2121a7}% +\pspolygon[fillstyle=solid](1,0.5)(0.877275,0.505078) + (0.875788,0.502332)(0.875059,0.499586)(1,0.5) +\psset{fillcolor=cmy_5858ff}% +\psset{linecolor=rgb_2121a6}% +\pspolygon[fillstyle=solid](1,0.5)(1.12505,0.500414) + (1.12447,0.503125)(1.12312,0.505768)(1,0.5) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](0.398466,0.350056)(0.28937,0.271374) + (0.296309,0.269877)(0.306183,0.276904)(0.418616,0.346439) + (0.406961,0.34569)(0.398466,0.350056) +\psset{fillcolor=cmy_5454ff}% +\psset{linecolor=rgb_2222aa}% +\pspolygon[fillstyle=solid](0.875059,0.499586)(0.750565,0.495176) + (0.750144,0.489142)(0.751245,0.483425)(0.875906,0.494186) + (0.875097,0.496864)(0.875059,0.499586) +\psset{fillcolor=cmy_5858ff}% +\psset{linecolor=rgb_2121a6}% +\pspolygon[fillstyle=solid](1,0.5)(0.875059,0.499586) + (0.875097,0.496864)(0.875906,0.494186)(1,0.5) +\psset{fillcolor=cmy_6161ff}% +\psset{linecolor=rgb_1f1f9d}% +\pspolygon[fillstyle=solid](1.76797,0.713246)(1.92548,0.836328) + (1.8979,0.852992)(1.86122,0.850819)(1.71949,0.731475) + (1.74686,0.728005)(1.76797,0.713246) +\psset{fillcolor=cmy_5656ff}% +\psset{linecolor=rgb_2121a8}% +\pspolygon[fillstyle=solid](1,0.5)(1.1239,0.494874) + (1.12486,0.497656)(1.12505,0.500414)(1,0.5) +\psset{fillcolor=cmy_3b3bff}% +\psset{linecolor=rgb_2727c3}% +\pspolygon[fillstyle=solid](1.50776,0.542368)(1.64384,0.584677) + (1.63759,0.609591)(1.62644,0.6285)(1.49483,0.572133) + (1.50301,0.558773)(1.50776,0.542368) +\psset{fillcolor=cmy_6161ff}% +\psset{linecolor=rgb_1f1f9d}% +\pspolygon[fillstyle=solid](0.627253,0.462871)(0.50598,0.427985) + (0.509149,0.416487)(0.515019,0.407859)(0.635784,0.447596) + (0.630406,0.4546)(0.627253,0.462871) +\psset{fillcolor=cmy_5a5aff}% +\psset{linecolor=rgb_2020a4}% +\pspolygon[fillstyle=solid](1,0.5)(0.875906,0.494186) + (0.877488,0.491574)(0.879836,0.489043)(1,0.5) +\psset{fillcolor=cmy_4e4eff}% +\psset{linecolor=rgb_2323b0}% +\pspolygon[fillstyle=solid](1.1239,0.494874)(1.24918,0.491962) + (1.25065,0.498531)(1.25055,0.504845)(1.12505,0.500414) + (1.12486,0.497656)(1.1239,0.494874) +\psset{fillcolor=cmy_5555ff}% +\psset{linecolor=rgb_2121a9}% +\pspolygon[fillstyle=solid](1,0.5)(1.11965,0.48934) + (1.12216,0.492093)(1.1239,0.494874)(1,0.5) +\psset{fillcolor=cmy_5c5cff}% +\psset{linecolor=rgb_2020a2}% +\pspolygon[fillstyle=solid](1,0.5)(0.879836,0.489043) + (0.882942,0.486608)(0.886789,0.484281)(1,0.5) +\psset{fillcolor=cmy_5555ff}% +\psset{linecolor=rgb_2121a9}% +\pspolygon[fillstyle=solid](1,0.5)(1.11239,0.484027) + (1.11639,0.486643)(1.11965,0.48934)(1,0.5) +\psset{fillcolor=cmy_3e3eff}% +\psset{linecolor=rgb_2626c0}% +\pspolygon[fillstyle=solid](1.24918,0.491962)(1.37644,0.493576) + (1.37822,0.505923)(1.37753,0.517385)(1.25055,0.504845) + (1.25065,0.498531)(1.24918,0.491962) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](1,0.5)(0.886789,0.484281) + (0.89136,0.482071)(0.896629,0.479987)(1,0.5) +\psset{fillcolor=cmy_5959ff}% +\psset{linecolor=rgb_2121a5}% +\pspolygon[fillstyle=solid](0.875906,0.494186)(0.751245,0.483425) + (0.753877,0.478082)(0.758047,0.473156)(0.879836,0.489043) + (0.877488,0.491574)(0.875906,0.494186) +\psset{fillcolor=cmy_5656ff}% +\psset{linecolor=rgb_2121a8}% +\pspolygon[fillstyle=solid](1,0.5)(1.10226,0.479146) + (1.10767,0.48152)(1.11239,0.484027)(1,0.5) +\psset{fillcolor=cmy_5a5aff}% +\psset{linecolor=rgb_2020a4}% +\pspolygon[fillstyle=solid](0.751245,0.483425)(0.627253,0.462871) + (0.630406,0.4546)(0.635784,0.447596)(0.758047,0.473156) + (0.753877,0.478082)(0.751245,0.483425) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](1,0.5)(0.896629,0.479987) + (0.902567,0.478033)(0.909139,0.476214)(1,0.5) +\psset{fillcolor=cmy_5757ff}% +\psset{linecolor=rgb_2121a7}% +\pspolygon[fillstyle=solid](1,0.5)(1.08949,0.474885) + (1.09619,0.476928)(1.10226,0.479146)(1,0.5) +\psset{fillcolor=cmy_4a4aff}% +\psset{linecolor=rgb_2424b4}% +\pspolygon[fillstyle=solid](1.11965,0.48934)(1.24148,0.478487) + (1.24612,0.485243)(1.24918,0.491962)(1.1239,0.494874) + (1.12216,0.492093)(1.11965,0.48934) +\psset{fillcolor=cmy_2a2aff}% +\psset{linecolor=rgb_2a2ad4}% +\pspolygon[fillstyle=solid](1.37644,0.493576)(1.50673,0.502132) + (1.50899,0.523306)(1.50776,0.542368)(1.37753,0.517385) + (1.37822,0.505923)(1.37644,0.493576) +\psset{fillcolor=cmy_5959ff}% +\psset{linecolor=rgb_2121a5}% +\pspolygon[fillstyle=solid](1,0.5)(1.07439,0.47139) + (1.08221,0.473035)(1.08949,0.474885)(1,0.5) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](1,0.5)(0.909139,0.476214) + (0.916306,0.474532)(0.924023,0.47299)(1,0.5) +\psset{fillcolor=cmy_7878ff}% +\psset{linecolor=rgb_1a1a86}% +\pspolygon[fillstyle=solid](0.20082,0.188793)(0.105573,0.08167) + (0.105946,0.125602)(0.108805,0.186635)(0.221782,0.25564) + (0.209394,0.216686)(0.20082,0.188793) +\psset{fillcolor=cmy_3939ff}% +\psset{linecolor=rgb_2727c5}% +\pspolygon[fillstyle=solid](1.64384,0.584677)(1.78949,0.650223) + (1.78228,0.687084)(1.76797,0.713246)(1.62644,0.6285) + (1.63759,0.609591)(1.64384,0.584677) +\psset{fillcolor=cmy_5a5aff}% +\psset{linecolor=rgb_2020a4}% +\pspolygon[fillstyle=solid](1,0.5)(1.05734,0.468753) + (1.06608,0.469961)(1.07439,0.47139)(1,0.5) +\psset{fillcolor=cmy_5d5dff}% +\psset{linecolor=rgb_2020a1}% +\pspolygon[fillstyle=solid](1,0.5)(0.924023,0.47299) + (0.932243,0.471589)(0.940912,0.470334)(1,0.5) +\psset{fillcolor=cmy_5b5bff}% +\psset{linecolor=rgb_2020a3}% +\pspolygon[fillstyle=solid](1,0.5)(1.03876,0.46701) + (1.04821,0.467769)(1.05734,0.468753)(1,0.5) +\psset{fillcolor=cmy_5c5cff}% +\psset{linecolor=rgb_2020a2}% +\pspolygon[fillstyle=solid](1,0.5)(0.940912,0.470334) + (0.949975,0.469227)(0.959372,0.468273)(1,0.5) +\psset{fillcolor=cmy_6363ff}% +\psset{linecolor=rgb_1f1f9b}% +\pspolygon[fillstyle=solid](1.92548,0.836328)(2.1079,1.01222) + (2.07205,1.03012)(2.0226,1.01759)(1.86122,0.850819) + (1.8979,0.852992)(1.92548,0.836328) +\psset{fillcolor=cmy_5b5bff}% +\psset{linecolor=rgb_2020a3}% +\pspolygon[fillstyle=solid](1,0.5)(1.01915,0.466147) + (1.02906,0.466471)(1.03876,0.46701)(1,0.5) +\psset{fillcolor=cmy_5e5eff}% +\psset{linecolor=rgb_2020a0}% +\pspolygon[fillstyle=solid](0.879836,0.489043)(0.758047,0.473156) + (0.763749,0.468665)(0.770971,0.464613)(0.886789,0.484281) + (0.882942,0.486608)(0.879836,0.489043) +\psset{fillcolor=cmy_5b5bff}% +\psset{linecolor=rgb_2020a3}% +\pspolygon[fillstyle=solid](1,0.5)(0.959372,0.468273) + (0.969041,0.467478)(0.978917,0.466848)(1,0.5) +\psset{fillcolor=cmy_7878ff}% +\psset{linecolor=rgb_1a1a86}% +\pspolygon[fillstyle=solid](0.515019,0.407859)(0.398466,0.350056) + (0.406961,0.34569)(0.418616,0.346439)(0.535179,0.399064) + (0.523664,0.402099)(0.515019,0.407859) +\psset{fillcolor=cmy_5b5bff}% +\psset{linecolor=rgb_2020a3}% +\pspolygon[fillstyle=solid](1,0.5)(0.999023,0.466116) + (1.00912,0.466032)(1.01915,0.466147)(1,0.5) +\pspolygon[fillstyle=solid](1,0.5)(0.978917,0.466848) + (0.988933,0.466391)(0.999023,0.466116)(1,0.5) +\psset{fillcolor=cmy_3535ff}% +\psset{linecolor=rgb_2828c9}% +\pspolygon[fillstyle=solid](1.24148,0.478487)(1.36555,0.467434) + (1.37221,0.480637)(1.37644,0.493576)(1.24918,0.491962) + (1.24612,0.485243)(1.24148,0.478487) +\psset{fillcolor=cmy_4848ff}% +\psset{linecolor=rgb_2424b6}% +\pspolygon[fillstyle=solid](1.11239,0.484027)(1.22757,0.465351) + (1.23529,0.471816)(1.24148,0.478487)(1.11965,0.48934) + (1.11639,0.486643)(1.11239,0.484027) +\psset{fillcolor=cmy_1b1bff}% +\psset{linecolor=rgb_2d2de3}% +\pspolygon[fillstyle=solid](1.50673,0.502132)(1.64155,0.520244) + (1.64513,0.55453)(1.64384,0.584677)(1.50776,0.542368) + (1.50899,0.523306)(1.50673,0.502132) +\psset{fillcolor=cmy_2d2dff}% +\psset{linecolor=rgb_2929d1}% +\pspolygon[fillstyle=solid](1.56058,0.160334)(1.6438,0.0321256) + (1.68934,0.0674669)(1.73326,0.116772)(1.6364,0.222327) + (1.59977,0.186629)(1.56058,0.160334) +\psset{fillcolor=cmy_6464ff}% +\psset{linecolor=rgb_1e1e9a}% +\pspolygon[fillstyle=solid](0.758047,0.473156)(0.635784,0.447596) + (0.64341,0.441874)(0.653304,0.437383)(0.770971,0.464613) + (0.763749,0.468665)(0.758047,0.473156) +\psset{fillcolor=cmy_6f6fff}% +\psset{linecolor=rgb_1c1c8f}% +\pspolygon[fillstyle=solid](0.635784,0.447596)(0.515019,0.407859) + (0.523664,0.402099)(0.535179,0.399064)(0.653304,0.437383) + (0.64341,0.441874)(0.635784,0.447596) +\psset{fillcolor=cmy_1b1bff}% +\psset{linecolor=rgb_2d2de3}% +\pspolygon[fillstyle=solid](1.36555,0.467434)(1.49191,0.456177) + (1.501,0.479507)(1.50673,0.502132)(1.37644,0.493576) + (1.37221,0.480637)(1.36555,0.467434) +\psset{fillcolor=cmy_1919ff}% +\psset{linecolor=rgb_2d2de5}% +\pspolygon[fillstyle=solid](1.6364,0.222327)(1.73326,0.116772) + (1.77544,0.178833)(1.81542,0.25192)(1.7012,0.317458) + (1.67032,0.266403)(1.6364,0.222327) +\psset{fillcolor=cmy_6161ff}% +\psset{linecolor=rgb_1f1f9d}% +\pspolygon[fillstyle=solid](0.886789,0.484281)(0.770971,0.464613) + (0.779692,0.460981)(0.78988,0.457739)(0.896629,0.479987) + (0.89136,0.482071)(0.886789,0.484281) +\psset{fillcolor=cmy_4949ff}% +\psset{linecolor=rgb_2424b5}% +\pspolygon[fillstyle=solid](1.10226,0.479146)(1.20772,0.4535) + (1.21837,0.45921)(1.22757,0.465351)(1.11239,0.484027) + (1.10767,0.48152)(1.10226,0.479146) +\psset{fillcolor=cmy_1111ff}% +\psset{linecolor=rgb_2f2fed}% +\pspolygon[fillstyle=solid](1.81542,0.25192)(1.92376,0.172159) + (1.97421,0.285475)(2.02166,0.408983)(1.88544,0.421119) + (1.85244,0.33369)(1.81542,0.25192) +\psset{fillcolor=cmy_3030ff}% +\psset{linecolor=rgb_2929ce}% +\pspolygon[fillstyle=solid](1.22757,0.465351)(1.34511,0.441628) + (1.3565,0.454315)(1.36555,0.467434)(1.24148,0.478487) + (1.23529,0.471816)(1.22757,0.465351) +\psset{fillcolor=cmy_1313ff}% +\psset{linecolor=rgb_2f2feb}% +\pspolygon[fillstyle=solid](1.64155,0.520244)(1.78302,0.550882) + (1.78963,0.60413)(1.78949,0.650223)(1.64384,0.584677) + (1.64513,0.55453)(1.64155,0.520244) +\psset{fillcolor=cmy_3939ff}% +\psset{linecolor=rgb_2727c5}% +\pspolygon[fillstyle=solid](1.78949,0.650223)(1.94995,0.746725) + (1.94296,0.80048)(1.92548,0.836328)(1.76797,0.713246) + (1.78228,0.687084)(1.78949,0.650223) +\psset{fillcolor=cmy_0808ff}% +\psset{linecolor=rgb_3131f6}% +\pspolygon[fillstyle=solid](1.49191,0.456177)(1.62063,0.44471) + (1.63329,0.483148)(1.64155,0.520244)(1.50673,0.502132) + (1.501,0.479507)(1.49191,0.456177) +\psset{fillcolor=cmy_4c4cff}% +\psset{linecolor=rgb_2323b2}% +\pspolygon[fillstyle=solid](1.08949,0.474885)(1.18236,0.443736) + (1.1957,0.448317)(1.20772,0.4535)(1.10226,0.479146) + (1.09619,0.476928)(1.08949,0.474885) +\psset{fillcolor=cmy_6464ff}% +\psset{linecolor=rgb_1e1e9a}% +\pspolygon[fillstyle=solid](0.896629,0.479987)(0.78988,0.457739) + (0.801491,0.454842)(0.81447,0.452238)(0.909139,0.476214) + (0.902567,0.478033)(0.896629,0.479987) +\psset{fillcolor=cmy_7c7cff}% +\psset{linecolor=rgb_1a1a82}% +\pspolygon[fillstyle=solid](0.306183,0.276904)(0.20082,0.188793) + (0.209394,0.216686)(0.221782,0.25564)(0.336923,0.313416) + (0.319506,0.291774)(0.306183,0.276904) +\psset{fillcolor=cmy_1515ff}% +\psset{linecolor=rgb_2e2ee9}% +\pspolygon[fillstyle=solid](1.34511,0.441628)(1.46416,0.410519) + (1.47958,0.432922)(1.49191,0.456177)(1.36555,0.467434) + (1.3565,0.454315)(1.34511,0.441628) +\psset{fillcolor=cmy_0808ff}% +\psset{linecolor=rgb_3131f6}% +\pspolygon[fillstyle=solid](1.7012,0.317458)(1.81542,0.25192) + (1.85244,0.33369)(1.88544,0.421119)(1.75179,0.433026) + (1.72856,0.373711)(1.7012,0.317458) +\psset{fillcolor=cmy_5050ff}% +\psset{linecolor=rgb_2222ae}% +\pspolygon[fillstyle=solid](1.07439,0.47139)(1.15207,0.436591) + (1.16779,0.439816)(1.18236,0.443736)(1.08949,0.474885) + (1.08221,0.473035)(1.07439,0.47139) +\psset{fillcolor=cmy_6b6bff}% +\psset{linecolor=rgb_1d1d93}% +\pspolygon[fillstyle=solid](0.770971,0.464613)(0.653304,0.437383) + (0.665477,0.434016)(0.679931,0.431611)(0.78988,0.457739) + (0.779692,0.460981)(0.770971,0.464613) +\psset{fillcolor=cmy_3131ff}% +\psset{linecolor=rgb_2929cd}% +\pspolygon[fillstyle=solid](1.20772,0.4535)(1.31566,0.418861) + (1.33147,0.429708)(1.34511,0.441628)(1.22757,0.465351) + (1.21837,0.45921)(1.20772,0.4535) +\psset{fillcolor=cmy_4545ff}% +\psset{linecolor=rgb_2525b9}% +\pspolygon[fillstyle=solid](1.4744,0.138283)(1.54709,0.00607935) + (1.59652,0.0115261)(1.6438,0.0321256)(1.56058,0.160334) + (1.51884,0.144112)(1.4744,0.138283) +\psset{fillcolor=cmy_0101ff}% +\psset{linecolor=rgb_3232fd}% +\pspolygon[fillstyle=solid](1.62063,0.44471)(1.75179,0.433026) + (1.77018,0.49296)(1.78302,0.550882)(1.64155,0.520244) + (1.63329,0.483148)(1.62063,0.44471) +\psset{fillcolor=cmy_6464ff}% +\psset{linecolor=rgb_1e1e9a}% +\pspolygon[fillstyle=solid](0.909139,0.476214)(0.81447,0.452238) + (0.828748,0.449869)(0.844242,0.44768)(0.924023,0.47299) + (0.916306,0.474532)(0.909139,0.476214) +\psset{fillcolor=cmy_0505ff}% +\psset{linecolor=rgb_3131f9}% +\pspolygon[fillstyle=solid](1.46416,0.410519)(1.58342,0.369794) + (1.6039,0.406438)(1.62063,0.44471)(1.49191,0.456177) + (1.47958,0.432922)(1.46416,0.410519) +\psset{fillcolor=cmy_0202ff}% +\psset{linecolor=rgb_3232fc}% +\pspolygon[fillstyle=solid](1.58342,0.369794)(1.7012,0.317458) + (1.72856,0.373711)(1.75179,0.433026)(1.62063,0.44471) + (1.6039,0.406438)(1.58342,0.369794) +\psset{fillcolor=cmy_0e0eff}% +\psset{linecolor=rgb_3030f0}% +\pspolygon[fillstyle=solid](1.53245,0.306569)(1.6364,0.222327) + (1.67032,0.266403)(1.7012,0.317458)(1.58342,0.369794) + (1.55951,0.336116)(1.53245,0.306569) +\psset{fillcolor=cmy_6969ff}% +\psset{linecolor=rgb_1d1d95}% +\pspolygon[fillstyle=solid](1.43923,0.040527)(1.49747,-0.0982892) + (1.55585,-0.134733)(1.61087,-0.15044)(1.54709,0.00607935) + (1.49491,0.0158499)(1.43923,0.040527) +\psset{fillcolor=cmy_5555ff}% +\psset{linecolor=rgb_2121a9}% +\pspolygon[fillstyle=solid](1.05734,0.468753)(1.11756,0.432255) + (1.13529,0.434074)(1.15207,0.436591)(1.07439,0.47139) + (1.06608,0.469961)(1.05734,0.468753) +\psset{fillcolor=cmy_6464ff}% +\psset{linecolor=rgb_1e1e9a}% +\pspolygon[fillstyle=solid](0.924023,0.47299)(0.844242,0.44768) + (0.860857,0.44562)(0.878483,0.443646)(0.940912,0.470334) + (0.932243,0.471589)(0.924023,0.47299) +\psset{fillcolor=cmy_1818ff}% +\psset{linecolor=rgb_2e2ee6}% +\pspolygon[fillstyle=solid](1.31566,0.418861)(1.42461,0.371119) + (1.44579,0.3897)(1.46416,0.410519)(1.34511,0.441628) + (1.33147,0.429708)(1.31566,0.418861) +\psset{fillcolor=cmy_5959ff}% +\psset{linecolor=rgb_2121a5}% +\pspolygon[fillstyle=solid](1.03876,0.46701)(1.07968,0.43057) + (1.09898,0.431103)(1.11756,0.432255)(1.05734,0.468753) + (1.04821,0.467769)(1.03876,0.46701) +\psset{fillcolor=cmy_1111ff}% +\psset{linecolor=rgb_2f2fed}% +\pspolygon[fillstyle=solid](1.78302,0.550882)(1.93401,0.597589) + (1.94669,0.677812)(1.94995,0.746725)(1.78949,0.650223) + (1.78963,0.60413)(1.78302,0.550882) +\psset{fillcolor=cmy_7777ff}% +\psset{linecolor=rgb_1b1b87}% +\pspolygon[fillstyle=solid](0.653304,0.437383)(0.535179,0.399064) + (0.549666,0.398476)(0.567233,0.399933)(0.679931,0.431611) + (0.665477,0.434016)(0.653304,0.437383) +\psset{fillcolor=cmy_0101ff}% +\psset{linecolor=rgb_3232fd}% +\pspolygon[fillstyle=solid](1.75179,0.433026)(1.88544,0.421119) + (1.91311,0.510505)(1.93401,0.597589)(1.78302,0.550882) + (1.77018,0.49296)(1.75179,0.433026) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](0.418616,0.346439)(0.306183,0.276904) + (0.319506,0.291774)(0.336923,0.313416)(0.452538,0.361054) + (0.433703,0.351806)(0.418616,0.346439) +\psset{fillcolor=cmy_3737ff}% +\psset{linecolor=rgb_2727c7}% +\pspolygon[fillstyle=solid](1.18236,0.443736)(1.27784,0.401367) + (1.29775,0.409345)(1.31566,0.418861)(1.20772,0.4535) + (1.1957,0.448317)(1.18236,0.443736) +\psset{fillcolor=cmy_0c0cff}% +\psset{linecolor=rgb_3030f2}% +\pspolygon[fillstyle=solid](1.42461,0.371119)(1.53245,0.306569) + (1.55951,0.336116)(1.58342,0.369794)(1.46416,0.410519) + (1.44579,0.3897)(1.42461,0.371119) +\psset{fillcolor=cmy_2020ff}% +\psset{linecolor=rgb_2c2cde}% +\pspolygon[fillstyle=solid](1.46963,0.263451)(1.56058,0.160334) + (1.59977,0.186629)(1.6364,0.222327)(1.53245,0.306569) + (1.50244,0.282108)(1.46963,0.263451) +\psset{fillcolor=cmy_6363ff}% +\psset{linecolor=rgb_1f1f9b}% +\pspolygon[fillstyle=solid](0.940912,0.470334)(0.878483,0.443646) + (0.896998,0.44173)(0.916271,0.43986)(0.959372,0.468273) + (0.949975,0.469227)(0.940912,0.470334) +\psset{fillcolor=cmy_5d5dff}% +\psset{linecolor=rgb_2020a1}% +\pspolygon[fillstyle=solid](1.01915,0.466147)(1.03945,0.431091) + (1.05979,0.43059)(1.07968,0.43057)(1.03876,0.46701) + (1.02906,0.466471)(1.01915,0.466147) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](0.535179,0.399064)(0.418616,0.346439) + (0.433703,0.351806)(0.452538,0.361054)(0.567233,0.399933) + (0.549666,0.398476)(0.535179,0.399064) +\psset{fillcolor=cmy_3939ff}% +\psset{linecolor=rgb_2727c5}% +\pspolygon[fillstyle=solid](1.94995,0.746725)(2.13284,0.884999) + (2.12834,0.963057)(2.1079,1.01222)(1.92548,0.836328) + (1.94296,0.80048)(1.94995,0.746725) +\psset{fillcolor=cmy_6262ff}% +\psset{linecolor=rgb_1f1f9c}% +\pspolygon[fillstyle=solid](0.959372,0.468273)(0.916271,0.43986) + (0.936157,0.438041)(0.956509,0.436296)(0.978917,0.466848) + (0.969041,0.467478)(0.959372,0.468273) +\psset{fillcolor=cmy_5f5fff}% +\psset{linecolor=rgb_1f1f9f}% +\pspolygon[fillstyle=solid](0.999023,0.466116)(0.997986,0.433208) + (1.0188,0.431991)(1.03945,0.431091)(1.01915,0.466147) + (1.00912,0.466032)(0.999023,0.466116) +\psset{fillcolor=cmy_6f6fff}% +\psset{linecolor=rgb_1c1c8f}% +\pspolygon[fillstyle=solid](0.78988,0.457739)(0.679931,0.431611) + (0.696648,0.429965)(0.71559,0.428845)(0.81447,0.452238) + (0.801491,0.454842)(0.78988,0.457739) +\psset{fillcolor=cmy_6161ff}% +\psset{linecolor=rgb_1f1f9d}% +\pspolygon[fillstyle=solid](0.978917,0.466848)(0.956509,0.436296) + (0.977171,0.434667)(0.997986,0.433208)(0.999023,0.466116) + (0.988933,0.466391)(0.978917,0.466848) +\psset{fillcolor=cmy_0303ff}% +\psset{linecolor=rgb_3232fb}% +\pspolygon[fillstyle=solid](1.88544,0.421119)(2.02166,0.408983) + (2.06392,0.537585)(2.09838,0.664828)(1.93401,0.597589) + (1.91311,0.510505)(1.88544,0.421119) +\psset{fillcolor=cmy_4141ff}% +\psset{linecolor=rgb_2525bd}% +\pspolygon[fillstyle=solid](1.15207,0.436591)(1.23246,0.39052) + (1.25605,0.395068)(1.27784,0.401367)(1.18236,0.443736) + (1.16779,0.439816)(1.15207,0.436591) +\psset{fillcolor=cmy_2323ff}% +\psset{linecolor=rgb_2b2bdb}% +\pspolygon[fillstyle=solid](1.27784,0.401367)(1.37438,0.342743) + (1.40077,0.355325)(1.42461,0.371119)(1.31566,0.418861) + (1.29775,0.409345)(1.27784,0.401367) +\psset{fillcolor=cmy_1b1bff}% +\psset{linecolor=rgb_2d2de3}% +\pspolygon[fillstyle=solid](1.37438,0.342743)(1.46963,0.263451) + (1.50244,0.282108)(1.53245,0.306569)(1.42461,0.371119) + (1.40077,0.355325)(1.37438,0.342743) +\psset{fillcolor=cmy_7171ff}% +\psset{linecolor=rgb_1c1c8d}% +\pspolygon[fillstyle=solid](0.81447,0.452238)(0.71559,0.428845) + (0.736691,0.427999)(0.759855,0.427181)(0.844242,0.44768) + (0.828748,0.449869)(0.81447,0.452238) +\psset{fillcolor=cmy_3939ff}% +\psset{linecolor=rgb_2727c5}% +\pspolygon[fillstyle=solid](1.39584,0.245193)(1.4744,0.138283) + (1.51884,0.144112)(1.56058,0.160334)(1.46963,0.263451) + (1.43409,0.251074)(1.39584,0.245193) +\psset{fillcolor=cmy_0f0fff}% +\psset{linecolor=rgb_2f2fef}% +\pspolygon[fillstyle=solid](1.93401,0.597589)(2.09838,0.664828) + (2.12222,0.783232)(2.13284,0.884999)(1.94995,0.746725) + (1.94669,0.677812)(1.93401,0.597589) +\psset{fillcolor=cmy_4e4eff}% +\psset{linecolor=rgb_2323b0}% +\pspolygon[fillstyle=solid](1.11756,0.432255)(1.18041,0.386614) + (1.20721,0.387725)(1.23246,0.39052)(1.15207,0.436591) + (1.13529,0.434074)(1.11756,0.432255) +\psset{fillcolor=cmy_7b7bff}% +\psset{linecolor=rgb_1a1a83}% +\pspolygon[fillstyle=solid](0.679931,0.431611)(0.567233,0.399933) + (0.587968,0.402922)(0.611934,0.40685)(0.71559,0.428845) + (0.696648,0.429965)(0.679931,0.431611) +\psset{fillcolor=cmy_3434ff}% +\psset{linecolor=rgb_2828ca}% +\pspolygon[fillstyle=solid](1.23246,0.39052)(1.31435,0.328195) + (1.34554,0.333655)(1.37438,0.342743)(1.27784,0.401367) + (1.25605,0.395068)(1.23246,0.39052) +\psset{fillcolor=cmy_3131ff}% +\psset{linecolor=rgb_2929cd}% +\pspolygon[fillstyle=solid](1.31435,0.328195)(1.39584,0.245193) + (1.43409,0.251074)(1.46963,0.263451)(1.37438,0.342743) + (1.34554,0.333655)(1.31435,0.328195) +\psset{fillcolor=cmy_5a5aff}% +\psset{linecolor=rgb_2020a4}% +\pspolygon[fillstyle=solid](1.07968,0.43057)(1.1228,0.388846) + (1.15222,0.387052)(1.18041,0.386614)(1.11756,0.432255) + (1.09898,0.431103)(1.07968,0.43057) +\psset{fillcolor=cmy_7272ff}% +\psset{linecolor=rgb_1c1c8c}% +\pspolygon[fillstyle=solid](0.844242,0.44768)(0.759855,0.427181) + (0.784951,0.42616)(0.811811,0.424741)(0.878483,0.443646) + (0.860857,0.44562)(0.844242,0.44768) +\psset{fillcolor=cmy_6060ff}% +\psset{linecolor=rgb_1f1f9e}% +\pspolygon[fillstyle=solid](1.3764,0.157338)(1.43923,0.040527) + (1.49491,0.0158499)(1.54709,0.00607935)(1.4744,0.138283) + (1.42703,0.142821)(1.3764,0.157338) +\psset{fillcolor=cmy_6363ff}% +\psset{linecolor=rgb_1f1f9b}% +\pspolygon[fillstyle=solid](1.03945,0.431091)(1.06103,0.395505) + (1.09234,0.391756)(1.1228,0.388846)(1.07968,0.43057) + (1.05979,0.43059)(1.03945,0.431091) +\psset{fillcolor=cmy_7272ff}% +\psset{linecolor=rgb_1c1c8c}% +\pspolygon[fillstyle=solid](0.878483,0.443646)(0.811811,0.424741) + (0.840235,0.422779)(0.869988,0.42019)(0.916271,0.43986) + (0.896998,0.44173)(0.878483,0.443646) +\psset{fillcolor=cmy_4a4aff}% +\psset{linecolor=rgb_2424b4}% +\pspolygon[fillstyle=solid](1.18041,0.386614)(1.24529,0.327916) + (1.2809,0.32634)(1.31435,0.328195)(1.23246,0.39052) + (1.20721,0.387725)(1.18041,0.386614) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](0.567233,0.399933)(0.452538,0.361054) + (0.47545,0.373217)(0.502743,0.387128)(0.611934,0.40685) + (0.587968,0.402922)(0.567233,0.399933) +\psset{fillcolor=cmy_6a6aff}% +\psset{linecolor=rgb_1d1d94}% +\pspolygon[fillstyle=solid](0.997986,0.433208)(0.996875,0.404353) + (1.02913,0.399802)(1.06103,0.395505)(1.03945,0.431091) + (1.0188,0.431991)(0.997986,0.433208) +\psset{fillcolor=cmy_7171ff}% +\psset{linecolor=rgb_1c1c8d}% +\pspolygon[fillstyle=solid](0.916271,0.43986)(0.869988,0.42019) + (0.900811,0.41696)(0.932427,0.413148)(0.956509,0.436296) + (0.936157,0.438041)(0.916271,0.43986) +\psset{fillcolor=cmy_6e6eff}% +\psset{linecolor=rgb_1c1c90}% +\pspolygon[fillstyle=solid](0.956509,0.436296)(0.932427,0.413148) + (0.964546,0.408882)(0.996875,0.404353)(0.997986,0.433208) + (0.977171,0.434667)(0.956509,0.436296) +\psset{fillcolor=cmy_7d7dff}% +\psset{linecolor=rgb_191981}% +\pspolygon[fillstyle=solid](0.71559,0.428845)(0.611934,0.40685) + (0.639145,0.411067)(0.669551,0.414914)(0.759855,0.427181) + (0.736691,0.427999)(0.71559,0.428845) +\psset{fillcolor=cmy_5656ff}% +\psset{linecolor=rgb_2121a8}% +\pspolygon[fillstyle=solid](1.31112,0.252497)(1.3764,0.157338) + (1.42703,0.142821)(1.4744,0.138283)(1.39584,0.245193) + (1.35487,0.24577)(1.31112,0.252497) +\psset{fillcolor=cmy_4e4eff}% +\psset{linecolor=rgb_2323b0}% +\pspolygon[fillstyle=solid](1.24529,0.327916)(1.31112,0.252497) + (1.35487,0.24577)(1.39584,0.245193)(1.31435,0.328195) + (1.2809,0.32634)(1.24529,0.327916) +\psset{fillcolor=cmy_5f5fff}% +\psset{linecolor=rgb_1f1f9f}% +\pspolygon[fillstyle=solid](1.1228,0.388846)(1.16806,0.339925) + (1.20762,0.332598)(1.24529,0.327916)(1.18041,0.386614) + (1.15222,0.387052)(1.1228,0.388846) +\psset{fillcolor=cmy_7c7cff}% +\psset{linecolor=rgb_1a1a82}% +\pspolygon[fillstyle=solid](0.452538,0.361054)(0.336923,0.313416) + (0.359168,0.34034)(0.38701,0.370633)(0.502743,0.387128) + (0.47545,0.373217)(0.452538,0.361054) +\psset{fillcolor=cmy_7d7dff}% +\psset{linecolor=rgb_191981}% +\pspolygon[fillstyle=solid](0.759855,0.427181)(0.669551,0.414914) + (0.703026,0.417762)(0.739356,0.419062)(0.811811,0.424741) + (0.784951,0.42616)(0.759855,0.427181) +\psset{fillcolor=cmy_6e6eff}% +\psset{linecolor=rgb_1c1c90}% +\pspolygon[fillstyle=solid](1.06103,0.395505)(1.08409,0.360109) + (1.1268,0.349318)(1.16806,0.339925)(1.1228,0.388846) + (1.09234,0.391756)(1.06103,0.395505) +\psset{fillcolor=cmy_7474ff}% +\psset{linecolor=rgb_1b1b8a}% +\pspolygon[fillstyle=solid](0.336923,0.313416)(0.221782,0.25564) + (0.239289,0.303779)(0.263419,0.358433)(0.38701,0.370633) + (0.359168,0.34034)(0.336923,0.313416) +\psset{fillcolor=cmy_6767ff}% +\psset{linecolor=rgb_1e1e97}% +\pspolygon[fillstyle=solid](1.16806,0.339925)(1.21527,0.281861) + (1.26458,0.264805)(1.31112,0.252497)(1.24529,0.327916) + (1.20762,0.332598)(1.16806,0.339925) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](0.611934,0.40685)(0.502743,0.387128) + (0.53466,0.401467)(0.571331,0.414834)(0.669551,0.414914) + (0.639145,0.411067)(0.611934,0.40685) +\psset{fillcolor=cmy_6d6dff}% +\psset{linecolor=rgb_1d1d91}% +\pspolygon[fillstyle=solid](0.221782,0.25564)(0.108805,0.186635) + (0.116083,0.263023)(0.130252,0.351753)(0.263419,0.358433) + (0.239289,0.303779)(0.221782,0.25564) +\psset{fillcolor=cmy_7d7dff}% +\psset{linecolor=rgb_191981}% +\pspolygon[fillstyle=solid](0.811811,0.424741)(0.739356,0.419062) + (0.778241,0.418391)(0.819298,0.415485)(0.869988,0.42019) + (0.840235,0.422779)(0.811811,0.424741) +\psset{fillcolor=cmy_7676ff}% +\psset{linecolor=rgb_1b1b88}% +\pspolygon[fillstyle=solid](0.996875,0.404353)(0.99567,0.382977) + (1.04025,0.371574)(1.08409,0.360109)(1.06103,0.395505) + (1.02913,0.399802)(0.996875,0.404353) +\psset{fillcolor=cmy_7a7aff}% +\psset{linecolor=rgb_1a1a84}% +\pspolygon[fillstyle=solid](1.31393,0.130943)(1.36413,0.0350099) + (1.43413,-0.0414045)(1.49747,-0.0982892)(1.43923,0.040527) + (1.3792,0.0793428)(1.31393,0.130943) +\psset{fillcolor=cmy_7d7dff}% +\psset{linecolor=rgb_191981}% +\pspolygon[fillstyle=solid](0.869988,0.42019)(0.819298,0.415485) + (0.862077,0.410271)(0.906078,0.402876)(0.932427,0.413148) + (0.900811,0.41696)(0.869988,0.42019) +\psset{fillcolor=cmy_7b7bff}% +\psset{linecolor=rgb_1a1a83}% +\pspolygon[fillstyle=solid](0.932427,0.413148)(0.906078,0.402876) + (0.950781,0.393616)(0.99567,0.382977)(0.996875,0.404353) + (0.964546,0.408882)(0.932427,0.413148) +\psset{fillcolor=cmy_7070ff}% +\psset{linecolor=rgb_1c1c8e}% +\pspolygon[fillstyle=solid](1.21527,0.281861)(1.26407,0.212769) + (1.32218,0.181056)(1.3764,0.157338)(1.31112,0.252497) + (1.26458,0.264805)(1.21527,0.281861) +\psset{fillcolor=cmy_7676ff}% +\psset{linecolor=rgb_1b1b88}% +\pspolygon[fillstyle=solid](1.26407,0.212769)(1.31393,0.130943) + (1.3792,0.0793428)(1.43923,0.040527)(1.3764,0.157338) + (1.32218,0.181056)(1.26407,0.212769) +\psset{fillcolor=cmy_7777ff}% +\psset{linecolor=rgb_1b1b87}% +\pspolygon[fillstyle=solid](1.08409,0.360109)(1.10888,0.325677) + (1.1633,0.302583)(1.21527,0.281861)(1.16806,0.339925) + (1.1268,0.349318)(1.08409,0.360109) +\psset{fillcolor=cmy_7d7dff}% +\psset{linecolor=rgb_191981}% +\pspolygon[fillstyle=solid](0.669551,0.414914)(0.571331,0.414834) + (0.612735,0.425841)(0.658661,0.43323)(0.739356,0.419062) + (0.703026,0.417762)(0.669551,0.414914) +\psset{fillcolor=cmy_7676ff}% +\psset{linecolor=rgb_1b1b88}% +\pspolygon[fillstyle=solid](0.502743,0.387128)(0.38701,0.370633) + (0.42117,0.401992)(0.462221,0.431813)(0.571331,0.414834) + (0.53466,0.401467)(0.502743,0.387128) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](0.99567,0.382977)(0.994341,0.37309) + (1.05238,0.34969)(1.10888,0.325677)(1.08409,0.360109) + (1.04025,0.371574)(0.99567,0.382977) +\psset{fillcolor=cmy_7d7dff}% +\psset{linecolor=rgb_191981}% +\pspolygon[fillstyle=solid](0.739356,0.419062)(0.658661,0.43323) + (0.708693,0.435991)(0.762219,0.433471)(0.819298,0.415485) + (0.778241,0.418391)(0.739356,0.419062) +\pspolygon[fillstyle=solid](1.10888,0.325677)(1.13571,0.293061) + (1.20191,0.250812)(1.26407,0.212769)(1.21527,0.281861) + (1.1633,0.302583)(1.10888,0.325677) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](0.906078,0.402876)(0.87651,0.412187) + (0.935442,0.394373)(0.994341,0.37309)(0.99567,0.382977) + (0.950781,0.393616)(0.906078,0.402876) +\psset{fillcolor=cmy_7e7eff}% +\psset{linecolor=rgb_191980}% +\pspolygon[fillstyle=solid](0.819298,0.415485)(0.762219,0.433471) + (0.818456,0.425453)(0.87651,0.412187)(0.906078,0.402876) + (0.862077,0.410271)(0.819298,0.415485) +\psset{fillcolor=cmy_6a6aff}% +\psset{linecolor=rgb_1d1d94}% +\pspolygon[fillstyle=solid](0.38701,0.370633)(0.263419,0.358433) + (0.295756,0.416063)(0.337777,0.472291)(0.462221,0.431813) + (0.42117,0.401992)(0.38701,0.370633) +\psset{fillcolor=cmy_7272ff}% +\psset{linecolor=rgb_1c1c8c}% +\pspolygon[fillstyle=solid](0.571331,0.414834)(0.462221,0.431813) + (0.51047,0.457371)(0.565855,0.476055)(0.658661,0.43323) + (0.612735,0.425841)(0.571331,0.414834) +\psset{fillcolor=cmy_7f7fff}% +\psset{linecolor=rgb_19197f}% +\pspolygon[fillstyle=solid](1.13571,0.293061)(1.16504,0.263219) + (1.2427,0.193231)(1.31393,0.130943)(1.26407,0.212769) + (1.20191,0.250812)(1.13571,0.293061) +\pspolygon[fillstyle=solid](0.994341,0.37309)(0.99284,0.379708) + (1.0658,0.336973)(1.13571,0.293061)(1.10888,0.325677) + (1.05238,0.34969)(0.994341,0.37309) +\pspolygon[fillstyle=solid](1.16504,0.263219)(1.19745,0.237271) + (1.28572,0.129037)(1.36413,0.0350099)(1.31393,0.130943) + (1.2427,0.193231)(1.16504,0.263219) +\psset{fillcolor=cmy_7272ff}% +\psset{linecolor=rgb_1c1c8c}% +\pspolygon[fillstyle=solid](0.658661,0.43323)(0.565855,0.476055) + (0.62787,0.485674)(0.695551,0.484744)(0.762219,0.433471) + (0.708693,0.435991)(0.658661,0.43323) +\psset{fillcolor=cmy_5d5dff}% +\psset{linecolor=rgb_2020a1}% +\pspolygon[fillstyle=solid](0.263419,0.358433)(0.130252,0.351753) + (0.154241,0.448121)(0.191195,0.545437)(0.337777,0.472291) + (0.295756,0.416063)(0.263419,0.358433) +\psset{fillcolor=cmy_7b7bff}% +\psset{linecolor=rgb_1a1a83}% +\pspolygon[fillstyle=solid](0.87651,0.412187)(0.842212,0.450088) + (0.917852,0.418332)(0.99284,0.379708)(0.994341,0.37309) + (0.935442,0.394373)(0.87651,0.412187) +\psset{fillcolor=cmy_7676ff}% +\psset{linecolor=rgb_1b1b88}% +\pspolygon[fillstyle=solid](0.762219,0.433471)(0.695551,0.484744) + (0.767541,0.472718)(0.842212,0.450088)(0.87651,0.412187) + (0.818456,0.425453)(0.762219,0.433471) +\psset{fillcolor=cmy_6262ff}% +\psset{linecolor=rgb_1f1f9c}% +\pspolygon[fillstyle=solid](0.462221,0.431813)(0.337777,0.472291) + (0.390602,0.522128)(0.454699,0.560441)(0.565855,0.476055) + (0.51047,0.457371)(0.462221,0.431813) +\psset{fillcolor=cmy_7c7cff}% +\psset{linecolor=rgb_1a1a82}% +\pspolygon[fillstyle=solid](0.99284,0.379708)(0.991097,0.4096) + (1.08095,0.336955)(1.16504,0.263219)(1.13571,0.293061) + (1.0658,0.336973)(0.99284,0.379708) +\psset{fillcolor=cmy_6262ff}% +\psset{linecolor=rgb_1f1f9c}% +\pspolygon[fillstyle=solid](0.565855,0.476055)(0.454699,0.560441) + (0.52964,0.582636)(0.613978,0.585437)(0.695551,0.484744) + (0.62787,0.485674)(0.565855,0.476055) +\psset{fillcolor=cmy_7474ff}% +\psset{linecolor=rgb_1b1b8a}% +\pspolygon[fillstyle=solid](0.842212,0.450088)(0.800716,0.529938) + (0.896933,0.475736)(0.991097,0.4096)(0.99284,0.379708) + (0.917852,0.418332)(0.842212,0.450088) +\psset{fillcolor=cmy_6a6aff}% +\psset{linecolor=rgb_1d1d94}% +\pspolygon[fillstyle=solid](0.695551,0.484744)(0.613978,0.585437) + (0.705338,0.567542)(0.800716,0.529938)(0.842212,0.450088) + (0.767541,0.472718)(0.695551,0.484744) +\psset{fillcolor=cmy_7878ff}% +\psset{linecolor=rgb_1a1a86}% +\pspolygon[fillstyle=solid](0.991097,0.4096)(0.989001,0.47266) + (1.09845,0.354344)(1.19745,0.237271)(1.16504,0.263219) + (1.08095,0.336955)(0.991097,0.4096) +\psset{fillcolor=cmy_4f4fff}% +\psset{linecolor=rgb_2323af}% +\pspolygon[fillstyle=solid](0.337777,0.472291)(0.191195,0.545437) + (0.244003,0.635089)(0.314618,0.707241)(0.454699,0.560441) + (0.390602,0.522128)(0.337777,0.472291) +\psset{fillcolor=cmy_6b6bff}% +\psset{linecolor=rgb_1d1d93}% +\pspolygon[fillstyle=solid](0.800716,0.529938)(0.747762,0.67368) + (0.870898,0.582631)(0.989001,0.47266)(0.991097,0.4096) + (0.896933,0.475736)(0.800716,0.529938) +\psset{fillcolor=cmy_4f4fff}% +\psset{linecolor=rgb_2323af}% +\pspolygon[fillstyle=solid](0.454699,0.560441)(0.314618,0.707241) + (0.403301,0.752297)(0.50809,0.762937)(0.613978,0.585437) + (0.52964,0.582636)(0.454699,0.560441) +\psset{fillcolor=cmy_5c5cff}% +\psset{linecolor=rgb_2020a2}% +\pspolygon[fillstyle=solid](0.613978,0.585437)(0.50809,0.762937) + (0.624809,0.736041)(0.747762,0.67368)(0.800716,0.529938) + (0.705338,0.567542)(0.613978,0.585437) +\end{pspicture}% diff --git a/graphics/epix/doc/plotting2.xp b/graphics/epix/doc/plotting2.xp new file mode 100644 index 0000000000..2a0ed661e5 --- /dev/null +++ b/graphics/epix/doc/plotting2.xp @@ -0,0 +1,29 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +P f(double r, double th) +{ + return P(r*Cos(th), r*Sin(th), pow(r, 3)*Cos(3*th)); +} + +int main() +{ + picture(P(-1,-1),P(1,1), "2x1in"); + + begin(); + + domain R(P(0,0), P(1, 2*M_PI), mesh(8,40), mesh(8,80)); + + camera.at(3,1,2); // set the viewpoint + + arrow(P(0,0,0), P(1.25,0,0)); + arrow(P(0,0,0), P(0,1.25,0)); + + plain(Blue(1.2)); + fill(Yellow()); // shade + surface(f, R); + + pst_format(); + end(); +} diff --git a/graphics/epix/doc/plotting3.eepic b/graphics/epix/doc/plotting3.eepic new file mode 100644 index 0000000000..d61bee76c4 --- /dev/null +++ b/graphics/epix/doc/plotting3.eepic @@ -0,0 +1,146 @@ +%% Generated from plotting3.xp on Tue Sep 25 18:08:09 EDT 2007 by +%% ePiX-1.2.0 +%% +%% Cartesian bounding box: [0,18.8496] x [-1,1] +%% Actual size: 5 x 1in +%% Figure offset: left by 0in, down by 0in +%% +%% usepackages epic,eepic,xcolor +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0}% +\xdefinecolor{rgb_0000ff}{rgb}{0,0,1}% +\xdefinecolor{rgb_00ff00}{rgb}{0,1,0}% +\xdefinecolor{rgb_3f00bf}{rgb}{0.247059,0,0.74902}% +\xdefinecolor{rgb_7f007f}{rgb}{0.498039,0,0.498039}% +\xdefinecolor{rgb_bf003f}{rgb}{0.74902,0,0.247059}% +\setlength{\unitlength}{1in}% +\begin{picture}(5,1)(0,0)% +\path(0,0.5)(2.5,0.5)(5,0.5) +\put(0,0.5){\makebox(0,0){\hbox{\color{rgb_000000}$\rule{0.5pt}{6pt}$}}} +\put(1.25,0.5){\makebox(0,0){\hbox{\color{rgb_000000}$\rule{0.5pt}{6pt}$}}} +\put(2.5,0.5){\makebox(0,0){\hbox{\color{rgb_000000}$\rule{0.5pt}{6pt}$}}} +\put(3.75,0.5){\makebox(0,0){\hbox{\color{rgb_000000}$\rule{0.5pt}{6pt}$}}} +\put(5,0.5){\makebox(0,0){\hbox{\color{rgb_000000}$\rule{0.5pt}{6pt}$}}} +\path(0,0)(0,0.5)(0,1) +\put(0,0){\makebox(0,0){\hbox{\color{rgb_000000}$\rule{6pt}{0.5pt}$}}} +\put(0,1){\makebox(0,0){\hbox{\color{rgb_000000}$\rule{6pt}{0.5pt}$}}} +\allinethickness{0.8pt}% +\color{rgb_00ff00}% +\path(0,0.5)(0.0416667,0.578217)(0.0833333,0.654508) + (0.125,0.726995)(0.166667,0.793893)(0.208333,0.853553) + (0.25,0.904508)(0.291667,0.945503)(0.333333,0.975528) + (0.375,0.993844)(0.416667,1)(0.458333,0.993844)(0.5,0.975528) + (0.541667,0.945503)(0.583333,0.904508)(0.625,0.853553) + (0.666667,0.793893)(0.708333,0.726995)(0.75,0.654508) + (0.791667,0.578217)(0.833333,0.5)(0.875,0.421783) + (0.916667,0.345492)(0.958333,0.273005)(1,0.206107) + (1.04167,0.146447)(1.08333,0.0954915)(1.125,0.0544967) + (1.16667,0.0244717)(1.20833,0.00615583)(1.25,0)(1.29167,0.00615583) + (1.33333,0.0244717)(1.375,0.0544967)(1.41667,0.0954915) + (1.45833,0.146447)(1.5,0.206107)(1.54167,0.273005) + (1.58333,0.345492)(1.625,0.421783)(1.66667,0.5)(1.70833,0.578217) + (1.75,0.654508)(1.79167,0.726995)(1.83333,0.793893)(1.875,0.853553) + (1.91667,0.904508)(1.95833,0.945503)(2,0.975528)(2.04167,0.993844) + (2.08333,1)(2.125,0.993844)(2.16667,0.975528)(2.20833,0.945503) + (2.25,0.904508)(2.29167,0.853553)(2.33333,0.793893)(2.375,0.726995) + (2.41667,0.654508)(2.45833,0.578217)(2.5,0.5)(2.54167,0.421783) + (2.58333,0.345492)(2.625,0.273005)(2.66667,0.206107) + (2.70833,0.146447)(2.75,0.0954915)(2.79167,0.0544967) + (2.83333,0.0244717)(2.875,0.00615583)(2.91667,0) + (2.95833,0.00615583)(3,0.0244717)(3.04167,0.0544967) + (3.08333,0.0954915)(3.125,0.146447)(3.16667,0.206107) + (3.20833,0.273005)(3.25,0.345492)(3.29167,0.421783)(3.33333,0.5) + (3.375,0.578217)(3.41667,0.654508)(3.45833,0.726995)(3.5,0.793893) + (3.54167,0.853553)(3.58333,0.904508)(3.625,0.945503) + (3.66667,0.975528)(3.70833,0.993844)(3.75,1)(3.79167,0.993844) + (3.83333,0.975528)(3.875,0.945503)(3.91667,0.904508) + (3.95833,0.853553)(4,0.793893)(4.04167,0.726995)(4.08333,0.654508) + (4.125,0.578217)(4.16667,0.5)(4.20833,0.421783)(4.25,0.345492) + (4.29167,0.273005)(4.33333,0.206107)(4.375,0.146447) + (4.41667,0.0954915)(4.45833,0.0544967)(4.5,0.0244717) + (4.54167,0.00615583)(4.58333,0)(4.625,0.00615583) + (4.66667,0.0244717)(4.70833,0.0544967)(4.75,0.0954915) + (4.79167,0.146447)(4.83333,0.206107)(4.875,0.273005) + (4.91667,0.345492)(4.95833,0.421783)(5,0.5) +\color{rgb_bf003f}% +\path(0,0.5)(0.0416667,0.578217)(0.0833333,0.654508) + (0.125,0.726995)(0.166667,0.793893)(0.208333,0.853553) + (0.25,0.904508)(0.291667,0.945503)(0.333333,0.975528) + (0.375,0.993844)(0.416667,1)(0.458333,0.993844)(0.5,0.975528) + (0.541667,0.945503)(0.583333,0.904508)(0.625,0.853553) + (0.666667,0.793893)(0.708333,0.726995)(0.75,0.654508) + (0.791667,0.578217)(0.833333,0.5)(0.875,0.421783) + (0.916667,0.345492)(0.958333,0.273005)(1,0.206107) + (1.04167,0.146447)(1.08333,0.0954915)(1.125,0.0544967) + (1.16667,0.0244717)(1.20833,0.00615583)(1.25,0)(1.29167,0.00615583) + (1.33333,0.0244717)(1.375,0.0544967)(1.41667,0.0954915) + (1.45833,0.146447)(1.5,0.206107)(1.54167,0.273005) + (1.58333,0.345492)(1.625,0.421783)(1.66667,0.5)(1.70833,0.578217) + (1.75,0.654508)(1.79167,0.726995)(1.83333,0.793893)(1.875,0.853553) + (1.91667,0.904508)(1.95833,0.945503)(2,0.975528)(2.04167,0.993844) + (2.08333,1)(2.125,0.993844)(2.16667,0.975528)(2.20833,0.945503) + (2.25,0.904508)(2.29167,0.853553)(2.33333,0.793893)(2.375,0.726995) + (2.41667,0.654508)(2.45833,0.578217)(2.5,0.5)(2.54167,0.421783) + (2.58333,0.345491)(2.625,0.273005)(2.66667,0.206107) + (2.70833,0.146446)(2.75,0.0954902)(2.79167,0.0544945) + (2.83333,0.0244679)(2.875,0.00614921)(2.91667,0) + (2.95833,0.00613686)(3,0.02444)(3.04167,0.054444) + (3.08333,0.0954044)(3.125,0.146304)(3.16667,0.205875) + (3.20833,0.272628)(3.25,0.344886)(3.29167,0.420815) + (3.33333,0.498463)(3.375,0.57579)(3.41667,0.650696) + (3.45833,0.721039)(3.5,0.78464)(3.54167,0.839253)(3.58333,0.882522) + (3.625,0.911868)(3.66667,0.924325)(3.70833,0.916271)(3.75,0.883026) + (3.79167,0.818266)(3.83333,0.713166)(3.875,0.555181) + (3.91667,0.326308)(3.95833,0.000641819)(3.95839,0) +\color{rgb_7f007f}% +\path(0,0.5)(0.0416667,0.578217)(0.0833333,0.654508) + (0.125,0.726995)(0.166667,0.793893)(0.208333,0.853553) + (0.25,0.904508)(0.291667,0.945503)(0.333333,0.975528) + (0.375,0.993844)(0.416667,1)(0.458333,0.993844)(0.5,0.975528) + (0.541667,0.945503)(0.583333,0.904508)(0.625,0.853553) + (0.666667,0.793893)(0.708333,0.726995)(0.75,0.654508) + (0.791667,0.578217)(0.833333,0.5)(0.875,0.421783) + (0.916667,0.345492)(0.958333,0.273005)(1,0.206107) + (1.04167,0.146447)(1.08333,0.0954915)(1.125,0.0544967) + (1.16667,0.0244717)(1.20833,0.00615583)(1.25,0)(1.29167,0.00615583) + (1.33333,0.0244717)(1.375,0.0544967)(1.41667,0.0954915) + (1.45833,0.146447)(1.5,0.206107)(1.54167,0.273005) + (1.58333,0.345492)(1.625,0.421783)(1.66667,0.5)(1.70833,0.578218) + (1.75,0.654509)(1.79167,0.726996)(1.83333,0.793895)(1.875,0.853557) + (1.91667,0.904515)(1.95833,0.945515)(2,0.975549)(2.04167,0.993881) + (2.08291,1) +\path(2.08376,1)(2.125,0.993951)(2.16667,0.975708) + (2.20833,0.945803)(2.25,0.905003)(2.29167,0.854363) + (2.33333,0.795206)(2.375,0.729106)(2.41667,0.657874) + (2.45833,0.583539)(2.5,0.50835)(2.54167,0.434785)(2.58333,0.365591) + (2.625,0.303858)(2.66667,0.253144)(2.70833,0.21768)(2.75,0.202677) + (2.79167,0.214776)(2.83333,0.262697)(2.875,0.358157) + (2.91667,0.51715)(2.95833,0.761732)(2.98586,1) +\color{rgb_3f00bf}% +\path(0,0.5)(0.0416667,0.578217)(0.0833333,0.654508) + (0.125,0.726995)(0.166667,0.793893)(0.208333,0.853553) + (0.25,0.904508)(0.291667,0.945503)(0.333333,0.975528) + (0.375,0.993844)(0.416667,1)(0.458333,0.993844)(0.5,0.975528) + (0.541667,0.945503)(0.583333,0.904508)(0.625,0.853553) + (0.666667,0.793893)(0.708333,0.726995)(0.75,0.654508) + (0.791667,0.578217)(0.833333,0.5)(0.875,0.421782)(0.916667,0.34549) + (0.958333,0.273001)(1,0.206099)(1.04167,0.14643)(1.08333,0.0954587) + (1.125,0.0544347)(1.16667,0.0243571)(1.20833,0.00594841) + (1.24757,0) +\path(1.2526,0)(1.29167,0.00551665)(1.33333,0.02338) + (1.375,0.0526628)(1.41667,0.0924591)(1.45833,0.141506) + (1.5,0.198171)(1.54167,0.260422)(1.58333,0.325792)(1.625,0.391305) + (1.66667,0.453377)(1.70833,0.507659)(1.75,0.548813) + (1.79167,0.570203)(1.83333,0.563454)(1.875,0.517876) + (1.91667,0.419672)(1.95833,0.250906)(1.99812,0) +\color{rgb_0000ff}% +\path(0,0.5)(0.0416667,0.578217)(0.0833333,0.654509) + (0.125,0.726996)(0.166667,0.793896)(0.208333,0.853572) + (0.25,0.904573)(0.291667,0.945693)(0.333333,0.976009) + (0.375,0.994933)(0.403805,1) +\path(0.439996,1)(0.458333,0.998222) + (0.5,0.983515)(0.541667,0.959373)(0.583333,0.927598) + (0.625,0.890616)(0.666667,0.851521)(0.708333,0.814127) + (0.75,0.783009)(0.791667,0.763557)(0.833333,0.762022) + (0.875,0.785563)(0.916667,0.842295)(0.958333,0.941339)(0.974464,1) +\end{picture}% diff --git a/graphics/epix/doc/plotting3.xp b/graphics/epix/doc/plotting3.xp new file mode 100644 index 0000000000..e5d1088978 --- /dev/null +++ b/graphics/epix/doc/plotting3.xp @@ -0,0 +1,43 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +P sin_n(double x, double n) // Taylor polynomial of sin x +{ + const int N((int) floor(n)); // convert y to an index bound + const double sqx(-pow(x, 2)); // store -x^2 for efficiency + double val(x), summand(x); // places to store results of evaluation + + // step through odd numbers from 1 to 2N+1 + for (int i=1; i <= 2*N+1; i += 2) + { + summand *= (sqx/((i+1)*(i+2))); // (-1)^i x^{2i+1}/(2i+1)! + val += summand; + } + + return P(x, val); +} + +int main() +{ + picture(P(0,-1),P(6*M_PI, 1), "5x1in"); + + begin(); + + set_crop(); + h_axis(4); + v_axis(1); + + bold(); + green(); + plot(Sin, 0, xmax(), 120); + + domain R(P(0,1), P(6*M_PI, 41), mesh(60, 40), mesh(120, 40)); + for (int i=3; 0 <= i; --i) + { + rgb(0.25*i, 0, 1-0.25*i); + plot(sin_n, R.slice2(5*i+1)); + } + + end(); +} diff --git a/graphics/epix/doc/scaling.eepic b/graphics/epix/doc/scaling.eepic new file mode 100644 index 0000000000..0b6231c4ee --- /dev/null +++ b/graphics/epix/doc/scaling.eepic @@ -0,0 +1,56 @@ +%% Generated from scaling.xp on Sat Sep 1 14:17:35 EDT 2007 by +%% ePiX-1.1.15 +%% +%% Cartesian bounding box: [0,4] x [0,1] +%% Actual size: 4 x 0.75in +%% Figure offset: left by 0in, down by 0in +%% +%% usepackages epic,eepic,xcolor +%% +\xdefinecolor{rgb_000000}{rgb}{0,0,0}% +\setlength{\unitlength}{1in}% +\begin{picture}(4,0.75)(0,0)% +\path(1.75,0.375)(2.75,0.375) +\path(2.63584,0.359433)(2.66438,0.359433) +\path(2.63584,0.364622)(2.69292,0.364622) +\path(2.63584,0.369811)(2.72146,0.369811) +\path(2.63584,0.375)(2.75,0.375) +\path(2.63584,0.380189)(2.72146,0.380189) +\path(2.63584,0.385378)(2.69292,0.385378) +\path(2.63584,0.390567)(2.66438,0.390567) +\path(2.74456,0.374012)(2.74456,0.375988) +\path(2.73913,0.373023)(2.73913,0.376977) +\path(2.73369,0.372035)(2.73369,0.377965) +\path(2.72826,0.371047)(2.72826,0.378953) +\path(2.72282,0.370058)(2.72282,0.379942) +\path(2.71738,0.36907)(2.71738,0.38093) +\path(2.71195,0.368081)(2.71195,0.381919) +\path(2.70651,0.367093)(2.70651,0.382907) +\path(2.70108,0.366105)(2.70108,0.383895) +\path(2.69564,0.365116)(2.69564,0.384884) +\path(2.6902,0.364128)(2.6902,0.385872) +\path(2.68477,0.36314)(2.68477,0.38686) +\path(2.67933,0.362151)(2.67933,0.387849) +\path(2.6739,0.361163)(2.6739,0.388837) +\path(2.66846,0.360175)(2.66846,0.389825) +\path(2.66302,0.359186)(2.66302,0.390814) +\path(2.65759,0.358198)(2.65759,0.391802) +\path(2.65215,0.35721)(2.65215,0.39279) +\path(2.64672,0.356221)(2.64672,0.393779) +\path(2.64128,0.355233)(2.64128,0.394767) +\path(2.63584,0.354244)(2.63584,0.395756) +\path(2.63584,0.375)(2.63584,0.354244)(2.75,0.375) + (2.63584,0.395756)(2.63584,0.375) +\put(0.027674,0.121424){\makebox(0,0)[bl]{\hbox{\color{rgb_000000}\scriptsize \hbox{\color{rgb_000000}\scriptsize $(x_\mathrm{min},y_\mathrm{min})$}}}} +\put(0,0.09375){\makebox(0,0){\hbox{\color{rgb_000000}\scriptsize $\circle{0.0069185}\circle{0.013837}\circle{0.0207555}\circle{0.027674}$}}} +\put(1.47233,0.722326){\makebox(0,0)[tr]{\hbox{\color{rgb_000000}\scriptsize \hbox{\color{rgb_000000}\scriptsize $(x_\mathrm{max},y_\mathrm{max})$}}}} +\put(1.5,0.75){\makebox(0,0){\hbox{\color{rgb_000000}\scriptsize $\circle{0.0069185}\circle{0.013837}\circle{0.0207555}\circle{0.027674}$}}} +\put(0.75,0.038402){\makebox(0,0)[t]{\hbox{\color{rgb_000000}\scriptsize \hbox{\color{rgb_000000}\scriptsize Canvas (virtual)}}}} +\path(1.5,0.09375)(1.5,0.75)(0,0.75)(0,0.09375)(1.5,0.09375) +\put(3.02767,0.121424){\makebox(0,0)[bl]{\hbox{\color{rgb_000000}\scriptsize \hbox{\color{rgb_000000}\scriptsize $(0,0)$}}}} +\put(3,0.09375){\makebox(0,0){\hbox{\color{rgb_000000}\scriptsize $\circle{0.0069185}\circle{0.013837}\circle{0.0207555}\circle{0.027674}$}}} +\put(3.97233,0.628576){\makebox(0,0)[tr]{\hbox{\color{rgb_000000}\scriptsize \hbox{\color{rgb_000000}\scriptsize $(h_\mathrm{size}, v_\mathrm{size})$}}}} +\put(4,0.65625){\makebox(0,0){\hbox{\color{rgb_000000}\scriptsize $\circle{0.0069185}\circle{0.013837}\circle{0.0207555}\circle{0.027674}$}}} +\put(3.5,0.038402){\makebox(0,0)[t]{\hbox{\color{rgb_000000}\scriptsize \hbox{\color{rgb_000000}\scriptsize Page (actual)}}}} +\path(4,0.09375)(4,0.65625)(3,0.65625)(3,0.09375)(4,0.09375) +\end{picture}% diff --git a/graphics/epix/doc/scaling.xp b/graphics/epix/doc/scaling.xp new file mode 100644 index 0000000000..7d243caabc --- /dev/null +++ b/graphics/epix/doc/scaling.xp @@ -0,0 +1,37 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + picture(P(0,0), P(4,1), "4x0.75in"); + + begin(); + + font_size("scriptsize"); + + screen canv(P(0,0), P(1,1)); + activate(canv); + + border(); + ddot(canv.bl(), P(2,2), "$(x_\\mathrm{min},y_\\mathrm{min})$", tr); + ddot(canv.tr(), P(-2,-2), "$(x_\\mathrm{max},y_\\mathrm{max})$", bl); + label(canv.b(), P(0,-4), "Canvas (virtual)", b); + deactivate(canv); + + screen pg(P(0,0), P(1,1)); + activate(pg); + + border(); + ddot(pg.bl(), P(2,2), "$(0,0)$", tr); + ddot(pg.tr(), P(-2,-2), "$(h_\\mathrm{size}, v_\\mathrm{size})$", bl); + label(pg.b(), P(0,-4), "Page (actual)", b); + deactivate(pg); + + arrow(P(1.75, 0.5), P(2.75,0.5)); + + inset(canv, P(0,0.125), P(1.5, 1)); + inset(pg, P(3,0.125), P(4,0.875)); + + end(); +} diff --git a/graphics/epix/doc/sgn.eepic b/graphics/epix/doc/sgn.eepic new file mode 100644 index 0000000000..0aafc5d5af --- /dev/null +++ b/graphics/epix/doc/sgn.eepic @@ -0,0 +1,30 @@ +%% Generated from sgn.xp on Tue Jan 4 15:32:30 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [-2,2] x [-1,1] +%% Actual size: 1.5in x 0.75in +%% Figure offset: right by 0in, up by 0in +%% +\setlength{\unitlength}{1in} +\begin{picture}(1.5,0.75)(-0,-0) +%% --- +\path(0,0.375)(1.5,0.375) +\put(0,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(0.375,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(0.75,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(1.125,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(1.5,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +%% --- +\path(0.75,0)(0.75,0.75) +\put(0.75,0){\makebox(0,0)[c]{\rule{4pt}{0.5pt}}} +\put(0.75,0.75){\makebox(0,0)[c]{\rule{4pt}{0.5pt}}} +%% --- +\thicklines +\path(0,0)(0.75,0) +\path(1.5,0.75)(0.75,0.75) +\thinlines +\put(0.75,0.375){\makebox(0,0)[c]{{\circle*{0.041511}}}} +\whiten\put(0.75,0){\makebox(0,0)[c]{{\circle{0.041511}}}} +\whiten\put(0.75,0.75){\makebox(0,0)[c]{{\circle{0.041511}}}} +\put(0.75,-0.055348){\makebox(0,0)[t]{\code{sgn}}} +\end{picture} diff --git a/graphics/epix/doc/sgn.xp b/graphics/epix/doc/sgn.xp new file mode 100644 index 0000000000..5296973ba4 --- /dev/null +++ b/graphics/epix/doc/sgn.xp @@ -0,0 +1,28 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + bounding_box(P(-2,-1),P(2,1)); + unitlength("1in"); + picture(1.5,0.75); + + begin(); + + h_axis(4); + v_axis(1); + + bold(); + line(P(x_min,-1), P(0,-1)); + line(P(x_max, 1), P(0, 1)); + + plain(); + dot(P(0,0)); + circ(P(0,-1)); + circ(P(0,1)); + + label(P(0,y_min), P(0,-4), "\\code{sgn}", b); + + end(); +} diff --git a/graphics/epix/doc/sinx.eepic b/graphics/epix/doc/sinx.eepic new file mode 100644 index 0000000000..c62bf19e00 --- /dev/null +++ b/graphics/epix/doc/sinx.eepic @@ -0,0 +1,40 @@ +%% Generated from sinx.xp on Tue Jan 4 15:32:32 EST 2005 by +%% ePiX-1.0.3 +%% +%% Cartesian bounding box: [-2,2] x [-1,1] +%% Actual size: 1.5in x 0.75in +%% Figure offset: right by 0in, up by 0in +%% +\setlength{\unitlength}{1in} +\begin{picture}(1.5,0.75)(-0,-0) +%% --- +\path(0,0.375)(1.5,0.375) +\put(0,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(0.375,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(0.75,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(1.125,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +\put(1.5,0.375){\makebox(0,0)[c]{\rule{0.5pt}{4pt}}} +%% --- +\path(0.75,0)(0.75,0.75) +\put(0.75,0){\makebox(0,0)[c]{\rule{4pt}{0.5pt}}} +\put(0.75,0.75){\makebox(0,0)[c]{\rule{4pt}{0.5pt}}} +%% --- +\thicklines +\path(0,0.375)(0.025,0.362444)(0.05,0.351239)(0.075,0.343466)(0.1,0.340756) + (0.125,0.343988)(0.15,0.353074)(0.175,0.366907)(0.2,0.383461) + (0.225,0.400058)(0.25,0.413765)(0.275,0.42186)(0.3,0.422302) + (0.325,0.414135)(0.35,0.397758)(0.375,0.375)(0.4,0.348991) + (0.425,0.323823)(0.45,0.304047)(0.475,0.29406)(0.5,0.297469) + (0.525,0.316532)(0.55,0.351733)(0.575,0.40159)(0.6,0.462702) + (0.625,0.530061)(0.65,0.597586)(0.675,0.65881)(0.7,0.707649) + (0.725,0.73913)(0.75,0.75)(0.775,0.73913)(0.8,0.707649)(0.825,0.65881) + (0.85,0.597586)(0.875,0.530061)(0.9,0.462702)(0.925,0.40159) + (0.95,0.351733)(0.975,0.316532)(1,0.297469)(1.025,0.29406)(1.05,0.304047) + (1.075,0.323823)(1.1,0.348991)(1.125,0.375)(1.15,0.397758) + (1.175,0.414135)(1.2,0.422302)(1.225,0.42186)(1.25,0.413765) + (1.275,0.400058)(1.3,0.383461)(1.325,0.366907)(1.35,0.353074) + (1.375,0.343988)(1.4,0.340756)(1.425,0.343466)(1.45,0.351239) + (1.475,0.362444)(1.5,0.375) +\path(1.5,0.375) +\put(0.75,-0.055348){\makebox(0,0)[t]{\code{sinx}}} +\end{picture} diff --git a/graphics/epix/doc/sinx.xp b/graphics/epix/doc/sinx.xp new file mode 100644 index 0000000000..62c08bbc48 --- /dev/null +++ b/graphics/epix/doc/sinx.xp @@ -0,0 +1,23 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +int main() +{ + bounding_box(P(-2,-1),P(2,1)); + unitlength("1in"); + picture(1.5,0.75); + + begin(); + revolutions(); + + h_axis(4); + v_axis(1); + + bold(); + plot(sinx, x_min, x_max, 60); + + label(P(0,y_min), P(0,-4), "\\code{sinx}", b); + + end(); +} diff --git a/graphics/epix/doc/slices.eepic b/graphics/epix/doc/slices.eepic new file mode 100644 index 0000000000..4aebe69de4 --- /dev/null +++ b/graphics/epix/doc/slices.eepic @@ -0,0 +1,45 @@ +%% Generated from slices.xp on Sun Dec 31 13:11:11 EST 2006 by +%% ePiX-1.0.22 +%% +%% Cartesian bounding box: [0,7] x [0,2] +%% Actual size: 5in x 0.75in +%% Figure offset: right by 0in, up by 0in +%% +\setlength{\unitlength}{1in} +\begin{picture}(5,0.75)(-0,-0) +%% --- +\thicklines +\path(0,0)(0,0.75) +\path(0.178571,0)(0.178571,0.75) +\path(0.357143,0)(0.357143,0.75) +\path(0.535714,0)(0.535714,0.75) +\path(0.714286,0)(0.714286,0.75) +\path(0.892857,0)(0.892857,0.75) +\path(1.07143,0)(1.07143,0.75) +\path(1.25,0)(1.25,0.75) +\path(1.42857,0)(1.42857,0.75) +\path(0,0)(1.42857,0) +\path(0,0.107143)(1.42857,0.107143) +\path(0,0.214286)(1.42857,0.214286) +\path(0,0.321429)(1.42857,0.321429) +\path(0,0.428571)(1.42857,0.428571) +\path(0,0.535714)(1.42857,0.535714) +\path(0,0.642857)(1.42857,0.642857) +\path(0,0.75)(1.42857,0.75) +\put(0.714286,-0.055348){\makebox(0,0)[t]{\code{R}}} +\path(1.78571,0)(1.78571,0.75) +\path(1.96429,0)(1.96429,0.75) +\path(2.14286,0)(2.14286,0.75) +\path(2.32143,0)(2.32143,0.75) +\path(2.5,0)(2.5,0.75) +\path(2.67857,0)(2.67857,0.75) +\path(2.85714,0)(2.85714,0.75) +\path(3.03571,0)(3.03571,0.75) +\path(3.21429,0)(3.21429,0.75) +\put(2.5,-0.055348){\makebox(0,0)[t]{\code{R.slices1()}}} +\path(3.57143,0)(5,0) +\path(3.57143,0.25)(5,0.25) +\path(3.57143,0.5)(5,0.5) +\path(3.57143,0.75)(5,0.75) +\put(4.28571,-0.055348){\makebox(0,0)[t]{\code{R.slices2(3)}}} +\end{picture} diff --git a/graphics/epix/doc/slices.xp b/graphics/epix/doc/slices.xp new file mode 100644 index 0000000000..c67dddf876 --- /dev/null +++ b/graphics/epix/doc/slices.xp @@ -0,0 +1,39 @@ +/* -*-ePiX-*- */ +#include "epix.h" +using namespace ePiX; + +void my_grid(const P& loc, int N1, int N2, std::string lab) +{ + if (0 < N1) + { + const double dx(1.0/N1); + for (int i=-N1; i<= N1; ++i) + line(loc+P(i*dx,0), loc+P(i*dx,2)); + } + + if (0 < N2) + { + const double dy(1.0/N2); + for (int i=0; i<= N2; ++i) + line(loc+P(-1,2*i*dy), loc+P(1,2*i*dy)); + } + + label(loc, P(0,-4), "\\code{"+lab+"}", b); +} + +int main() +{ + bounding_box(P(0,0),P(7,2)); + unitlength("1in"); + picture(5,0.75); + + begin(); + + bold(); + + my_grid(P(1,0), 4, 7, "R"); + my_grid(P(3.5,0), 4, 0, "R.slices1()"); + my_grid(P(6,0), 0, 3, "R.slices2(3)"); + + end(); +} |