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/sketch/Doc/sketch.html |
Initial commit
Diffstat (limited to 'graphics/sketch/Doc/sketch.html')
-rw-r--r-- | graphics/sketch/Doc/sketch.html | 3858 |
1 files changed, 3858 insertions, 0 deletions
diff --git a/graphics/sketch/Doc/sketch.html b/graphics/sketch/Doc/sketch.html new file mode 100644 index 0000000000..59c51f46de --- /dev/null +++ b/graphics/sketch/Doc/sketch.html @@ -0,0 +1,3858 @@ +<html lang="en"> +<head> +<title>Sketch</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="Sketch"> +<meta name="generator" content="makeinfo 4.7"> +<link title="Top" rel="top" href="#Top"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<!-- +Copyright (C) 2005, 2006, 2007, 2008 Eugene K. Ressler. + +This manual is for `sketch', version 0.2 (build 131), +Saturday, August 09, 2008, a program that converts descriptions of simple +three-dimensional scenes into static drawings. This version generates +`PSTricks' or `PGF/TikZ' code suitable for use with the +TeX document processing system. + +`Sketch' is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +Sketch is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with `sketch'; see the file COPYING.txt. If not, see +http://www.gnu.org/copyleft.--> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family: serif; font-weight: normal; } +--></style> +</head> +<body> +<h1 class="settitle">Sketch</h1> + <div class="contents"> +<h2>Table of Contents</h2> +<ul> +<li><a name="toc_Top" href="#Top">Sketch</a> +<li><a name="toc_About-sketch" href="#About-sketch">1 About sketch</a> +<ul> +<li><a href="#Reporting-bugs">1.1 Reporting bugs and recommending improvements.</a> +<li><a href="#Contributions">1.2 Contributions</a> +</li></ul> +<li><a name="toc_Introduction-by-example" href="#Introduction-by-example">2 Introduction by example</a> +<ul> +<li><a href="#Hello-world">2.1 Hello world</a> +<li><a href="#Drawing-options">2.2 Options</a> +<li><a href="#Drawing-a-solid">2.3 Drawing a solid</a> +<li><a href="#Special-objects">2.4 Special objects</a> +<li><a href="#Object-transforms">2.5 Transforms</a> +<li><a href="#Repeated-objects">2.6 Repeated objects</a> +<li><a href="#Swept-objects">2.7 Swept objects</a> +<ul> +<li><a href="#Point-sweeps">2.7.1 Point sweeps</a> +<li><a href="#Polyline-sweeps">2.7.2 Polyline sweeps</a> +<li><a href="#Nested-sweeps">2.7.3 Nested sweeps</a> +<li><a href="#Polygon-sweeps">2.7.4 Polygon sweeps</a> +<li><a href="#Polyline-sweeps-with-closure">2.7.5 Polyline sweeps with closure</a> +<li><a href="#Affine-arithmetic">2.7.6 Affine arithmetic</a> +<li><a href="#More-to-learn">2.7.7 More to learn</a> +</li></ul> +</li></ul> +<li><a name="toc_Input-language" href="#Input-language">3 Input language</a> +<ul> +<li><a href="#Language-basics">3.1 Basics</a> +<ul> +<li><a href="#Identifiers">3.1.1 Identifiers</a> +<li><a href="#Key-and-reserved-words">3.1.2 Key and reserved words</a> +<li><a href="#Literals">3.1.3 Literals</a> +<ul> +<li><a href="#Scalar-literals">3.1.3.1 Scalar literals</a> +<li><a href="#Point-and-vector-literals">3.1.3.2 Point and vector literals</a> +<li><a href="#Transform-literals">3.1.3.3 Transform literals</a> +</li></ul> +<li><a href="#Arithmetic">3.1.4 Arithmetic expressions</a> +<ul> +<li><a href="#Two_002doperand-_0028binary_0029-forms">3.1.4.1 Two-operand (binary) forms and precedence</a> +<li><a href="#Unary-forms">3.1.4.2 Unary forms</a> +</li></ul> +<li><a href="#Options">3.1.5 Options</a> +<ul> +<li><a href="#PSTricks-options">3.1.5.1 <code>PSTricks</code> options</a> +<li><a href="#TikZ_002fPGF-options">3.1.5.2 <code>TikZ/PGF</code> options</a> +<li><a href="#Dots-in-TikZ_002fPGF">3.1.5.3 Dots in <code>TikZ/PGF</code></a> +<li><a href="#TikZ_002fPGF-user_002ddefined-styles">3.1.5.4 <code>TikZ/PGF</code> user-defined styles</a> +<li><a href="#Transparency">3.1.5.5 Transparency</a> +<li><a href="#Internal-options">3.1.5.6 Internal options</a> +</li></ul> +<li><a href="#Internal-options">3.1.6 Point lists</a> +</li></ul> +<li><a href="#Drawables">3.2 Drawables</a> +<ul> +<li><a href="#Dots">3.2.1 Dots</a> +<li><a href="#Lines">3.2.2 Lines</a> +<li><a href="#Curves">3.2.3 Curves</a> +<li><a href="#Polygons">3.2.4 Polygons</a> +<li><a href="#Specials">3.2.5 Specials</a> +<li><a href="#Sweeps">3.2.6 Sweeps</a> +<ul> +<li><a href="#Swept-points">3.2.6.1 Swept points</a> +<li><a href="#Swept-lines">3.2.6.2 Swept lines</a> +<li><a href="#Swept-polygons">3.2.6.3 Swept polygons</a> +<li><a href="#Swept-blocks">3.2.6.4 Swept blocks</a> +<li><a href="#Sweep-face-splitting">3.2.6.5 Sweep face splitting</a> +</li></ul> +<li><a href="#Blocks">3.2.7 Blocks</a> +<li><a href="#Repeats">3.2.8 Repeats</a> +<li><a href="#Puts">3.2.9 Puts</a> +</li></ul> +<li><a href="#Definitions">3.3 Definitions</a> +<ul> +<li><a href="#Forms-of-definitions">3.3.1 Forms of definitions</a> +<li><a href="#Forms-of-references">3.3.2 Forms of references</a> +</li></ul> +<li><a href="#Global-environment">3.4 Global environment</a> +<ul> +<li><a href="#Global-options">3.4.1 Global options</a> +<li><a href="#Camera">3.4.2 Camera</a> +<li><a href="#Picture-box">3.4.3 Picture box</a> +<li><a href="#Frame">3.4.4 Frame</a> +<li><a href="#Language">3.4.5 Language</a> +</li></ul> +</li></ul> +<li><a name="toc_Building-a-drawing" href="#Building-a-drawing">4 Building a drawing</a> +<ul> +<li><a href="#Overview">4.1 Overview</a> +<li><a href="#A-technical-drawing">4.2 A technical drawing</a> +<li><a href="#A-hierarchical-model">4.3 A hierarchical model</a> +<li><a href="#Caveats">4.4 Caveats</a> +<ul> +<li><a href="#Limits-on-error-detection">4.4.1 Limits on <code>sketch</code> error detection</a> +<li><a href="#Clipping">4.4.2 Clipping</a> +<li><a href="#Hidden-surface-removal">4.4.3 Hidden surface removal and polygon splitting</a> +<ul> +<li><a href="#Statistics">4.4.3.1 Statistics</a> +<li><a href="#Bugs-and-anomalies">4.4.3.2 Bugs and anomalies</a> +</li></ul> +</li></ul> +</li></ul> +<li><a name="toc_Command-line" href="#Command-line">5 Command line</a> +<li><a name="toc_Installing-sketch" href="#Installing-sketch">6 Building and installing <code>sketch</code></a> +<li><a name="toc_Index-of-syntax" href="#Index-of-syntax">Index of syntax</a> +<li><a name="toc_Index" href="#Index">Index of concepts</a> +</li></ul> +</div> + + + +<div class="node"> +<p><hr> +<a name="Top"></a>Next: <a rel="next" accesskey="n" href="#About-sketch">About sketch</a>, +Previous: <a rel="previous" accesskey="p" href="#dir">(dir)</a>, +Up: <a rel="up" accesskey="u" href="#dir">(dir)</a> +<br> +</div> + +<h2 class="unnumbered">Sketch</h2> + +<p>Copyright © 2005, 2006, 2007, 2008 Eugene K. Ressler. + + <p>This manual is for <code>sketch</code>, version 0.2 (build 131), +Saturday, August 09, 2008, a program that converts descriptions of simple +three-dimensional scenes into static drawings. This version generates +<code>PSTricks</code> or <code>PGF/TikZ</code> code suitable for use with the +TeX document processing system. + + <p><code>Sketch</code> is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + + <p>Sketch is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + + <p>You should have received a copy of the GNU General Public License +along with <code>sketch</code>; see the file COPYING.txt. If not, see +<tt>http://www.gnu.org/copyleft</tt>. + +<ul class="menu"> +<li><a accesskey="1" href="#About-sketch">About sketch</a>: Why sketch exists and what it does. +<li><a accesskey="2" href="#Introduction-by-example">Introduction by example</a>: Most features shown as working code. +<li><a accesskey="3" href="#Input-language">Input language</a>: Syntax and semantics of <code>sketch</code> commands. +<li><a accesskey="4" href="#Building-a-drawing">Building a drawing</a>: How to use <code>sketch</code> productively. +<li><a accesskey="5" href="#Command-line">Command line</a>: Options and their usage. +<li><a accesskey="6" href="#Installing-sketch">Installing sketch</a>: Building and installing from sources. +<li><a accesskey="7" href="#Index-of-syntax">Index of syntax</a> +<li><a accesskey="8" href="#Index">Index</a> + +</li></ul> +<p>--- The Detailed Node Listing --- + +<p>About sketch + +</p> +<ul class="menu"> +<li><a accesskey="9" href="#Reporting-bugs">Reporting bugs</a>: Let use know what's wrong! +<li><a href="#Contributions">Contributions</a>: How you can help.... + +</li></ul> +<p>Introduction by example + +</p> +<ul class="menu"> +<li><a href="#Hello-world">Hello world</a>: Simplest possible <code>sketch</code> program. +<li><a href="#Drawing-options">Drawing options</a>: Controlling object appearance. +<li><a href="#Drawing-a-solid">Drawing a solid</a>: Drawing an object with 3d appearance. +<li><a href="#Special-objects">Special objects</a>: Laying TeX over, in, or under drawings. +<li><a href="#Object-transforms">Object transforms</a>: Rotate, translate, scale, and others. +<li><a href="#Repeated-objects">Repeated objects</a>: Making transformed copies. +<li><a href="#Swept-objects">Swept objects</a>: Sweeping objects in space to make new shapes. + +</li></ul> +<p>Swept objects + +</p> +<ul class="menu"> +<li><a href="#Point-sweeps">Point sweeps</a>: Swept points make lines and polygons. +<li><a href="#Polyline-sweeps">Polyline sweeps</a>: Swept lines make surfaces. +<li><a href="#Nested-sweeps">Nested sweeps</a>: Swept sweeps are useful! +<li><a href="#Polygon-sweeps">Polygon sweeps</a>: Swept polygons make solids... +<li><a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a>: and so do closed polyline sweeps. +<li><a href="#Affine-arithmetic">Affine arithmetic</a>: Sketch useful math expression. +<li><a href="#More-to-learn">More to learn</a>: Check out the Mobius strip! + +</li></ul> +<p>Input language + +</p> +<ul class="menu"> +<li><a href="#Language-basics">Language basics</a>: Case, space, comments, include files. +<li><a href="#Drawables">Drawables</a>: Things that can be drawn. +<li><a href="#Definitions">Definitions</a>: Giving things names. +<li><a href="#Global-environment">Global environment</a>: Affect the entire drawing. + +</li></ul> +<p>Basics + +</p> +<ul class="menu"> +<li><a href="#Identifiers">Identifiers</a>: Names for things. +<li><a href="#Key-and-reserved-words">Key and reserved words</a>: Names you shouldn't use. +<li><a href="#Literals">Literals</a>: Constants and constructors. +<li><a href="#Arithmetic">Arithmetic</a>: Rules for expressions. +<li><a href="#Options">Options</a>: Modifying object appearance. + +</li></ul> +<p>Literals + +</p> +<ul class="menu"> +<li><a href="#Scalar-literals">Scalar literals</a>: Just the numbers. +<li><a href="#Point-and-vector-literals">Point and vector literals</a>: 3d quantities. +<li><a href="#Transform-literals">Transform literals</a>: Matrix form. + +</li></ul> +<p>Arithmetic expressions + +</p> +<ul class="menu"> +<li><a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a>: A op B +<li><a href="#Unary-forms">Unary forms</a>: op A (and others) + +</li></ul> +<p>Options + +</p> +<ul class="menu"> +<li><a href="#PSTricks-options">PSTricks options</a>: Options inherited from <code>PSTricks</code>. +<li><a href="#TikZ_002fPGF-options">TikZ/PGF options</a>: Options inherited from <code>TikZ/PGF</code>. +<li><a href="#Dots-in-TikZ_002fPGF">Dots in TikZ/PGF</a>: Sketch uses <code>TikZ/PGF</code> circles for dots. +<li><a href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a>: Support for <code>TikZ/PGF</code> named, user-defined styles. +<li><a href="#Transparency">Transparency</a>: See-through polygons. +<li><a href="#Internal-options">Internal options</a>: Options used by <code>sketch</code>. + +</li></ul> +<p>Point lists + +</p> +<ul class="menu"> +<li><a href="#Drawables">Drawables</a>: Things that are drawn. +<li><a href="#Definitions">Definitions</a>: Things with names. + +</li></ul> +<p>Drawables + +</p> +<ul class="menu"> +<li><a href="#Dots">Dots</a>: Draw dots. +<li><a href="#Lines">Lines</a>: Draw polylines. +<li><a href="#Curves">Curves</a>: Draw curves. +<li><a href="#Polygons">Polygons</a>: Draw polygons. +<li><a href="#Specials">Specials</a>: Embed raw LaTeX and <code>PSTricks</code>. +<li><a href="#Sweeps">Sweeps</a>: Draw sweeps of dots and polylines. +<li><a href="#Blocks">Blocks</a>: Group other drawables. +<li><a href="#Repeats">Repeats</a>: Draw transformed copies of objects. +<li><a href="#Puts">Puts</a>: Draw one object transformed. + +</li></ul> +<p>Sweeps + +</p> +<ul class="menu"> +<li><a href="#Swept-points">Swept points</a>: Swept points make lines or polygons. +<li><a href="#Swept-lines">Swept lines</a>: Swept lines make open or closed surfaces. +<li><a href="#Swept-polygons">Swept polygons</a>: Swept polygons make closed surfaces. +<li><a href="#Swept-blocks">Swept blocks</a>: Swept block == block of sweeps. +<li><a href="#Sweep-face-splitting">Sweep face splitting</a>: Fixing warped faces with triangles. + +</li></ul> +<p>Definitions + +</p> +<ul class="menu"> +<li><a href="#Forms-of-definitions">Forms of definitions</a>: Different defs for different purposes. +<li><a href="#Forms-of-references">Forms of references</a>: How references denote types. + +</li></ul> +<p>Global environment + +</p> +<ul class="menu"> +<li><a href="#Global-options">Global options</a>: Attributes of the entire drawing. +<li><a href="#Camera">Camera</a>: A final camera transformation of the scene. +<li><a href="#Picture-box">Picture box</a>: Setting the bounding box and 2d clipping. +<li><a href="#Frame">Frame</a>: Adding a box around the drawing. +<li><a href="#Language">Language</a>: Setting the output language. + +</li></ul> +<p>Building a drawing + +</p> +<ul class="menu"> +<li><a href="#Overview">Overview</a>: Building a substantial drawing. +<li><a href="#A-technical-drawing">A technical drawing</a>: An example with fine placement. +<li><a href="#A-hierarchical-model">A hierarchical model</a>: An example with sweeps and puts. +<li><a href="#Caveats">Caveats</a>: Where trouble can occur. + +</li></ul> +<p>Caveats + +</p> +<ul class="menu"> +<li><a href="#Limits-on-error-detection">Limits on error detection</a>: What sketch doesn't do. +<li><a href="#Clipping">Clipping</a>: No clipping at present. +<li><a href="#Hidden-surface-removal">Hidden surface removal</a>: Imperfections to fix. + +</li></ul> +<p>Hidden surface removal and polygon splitting + +</p> +<ul class="menu"> +<li><a href="#Statistics">Statistics</a>: Performance numbers on depth sort. +<li><a href="#Bugs-and-anomalies">Bugs and anomalies</a>: Imperfections in this implementation. + + </ul> + +<div class="node"> +<p><hr> +<a name="About-sketch"></a>Next: <a rel="next" accesskey="n" href="#Introduction-by-example">Introduction by example</a>, +Previous: <a rel="previous" accesskey="p" href="#Top">Top</a>, +Up: <a rel="up" accesskey="u" href="#Top">Top</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h2 class="chapter">1 About sketch</h2> + +<ul class="menu"> +<li><a accesskey="1" href="#Reporting-bugs">Reporting bugs</a>: Let use know what's wrong! +<li><a accesskey="2" href="#Contributions">Contributions</a>: How you can help.... +</ul> + +<p><code>Sketch</code> is a small, simple system for producing line drawings of +two- or three-dimensional objects and scenes. It began as a way to +make illustrations for a textbook after we could find no suitable +tool for this purpose. Existing scene processors emphasized GUIs +and/or photo-realism, both un-useful to us. We wanted to produce +finely wrought, mathematically-based illustrations with no extraneous +detail. + + <p><code>Sketch</code> accepts a tiny scene description language and generates +<code>PSTricks</code> or <code>TikZ/PGF</code> code for LaTeX. The +<code>sketch</code> language is similar to <code>PSTricks</code>, making it easy +to learn for current <code>PSTricks</code> users. See +<a name="index-PSTricks-1"></a><tt>www.pstricks.de</tt> for information on <code>PSTricks</code>. +<code>TikZ/PGF</code> are also very similar except for details of syntax. +See +<a name="index-TikZ_002fPGF-2"></a><tt>http://sourceforge.net/projects/pgf</tt>. One can easily lay raw +<code>PSTricks</code> or <code>TikZ/PGF</code> output over, in, or under +<code>sketch</code> drawings, providing the full power of LaTeX text and +mathematics formatting in a three-dimensional setting. + +<div class="node"> +<p><hr> +<a name="Reporting-bugs"></a>Next: <a rel="next" accesskey="n" href="#Contributions">Contributions</a>, +Previous: <a rel="previous" accesskey="p" href="#About-sketch">About sketch</a>, +Up: <a rel="up" accesskey="u" href="#About-sketch">About sketch</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">1.1 Reporting bugs and recommending improvements.</h3> + +<p>Send bug reports and suggestions to <tt>sketch@frontiernet.net</tt>. +We will try to respond, but can't promise. In any event, don't be +offended if a reply is not forthcoming. We're just busy and will get +to your suggestion eventually. + + <p>For bugs, attach a <code>sketch</code> input file that causes the bad +behavior. Embed comments that explain what to look for in +the behavior of <code>sketch</code> or its output. + + <p>A recommendation for improvement from one unknown person counts as one +vote. We use overall vote tallies to decide what to do next as +resources permit. We reserve the right to a assign any number of votes +to suggestions from people who have been helpful and supportive in the +past. + +<div class="node"> +<p><hr> +<a name="Contributions"></a>Previous: <a rel="previous" accesskey="p" href="#Reporting-bugs">Reporting bugs</a>, +Up: <a rel="up" accesskey="u" href="#About-sketch">About sketch</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">1.2 Contributions</h3> + +<p>If you intend to implement an enhancement of your own, that's +terrific! Consider collaborating with us first to see if we're +already working on your idea or if we can use your work in the +official release. + +<div align="center"><img src="ex000.png" alt="ex000.png"></div> + <p><a name="Solid-coil-example"></a> + +<div class="node"> +<p><hr> +<a name="Introduction-by-example"></a>Next: <a rel="next" accesskey="n" href="#Input-language">Input language</a>, +Previous: <a rel="previous" accesskey="p" href="#About-sketch">About sketch</a>, +Up: <a rel="up" accesskey="u" href="#Top">Top</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h2 class="chapter">2 Introduction by example</h2> + +<p>The <code>sketch</code> input language will seem familiar to users of the +<code>PSTricks</code> package for LaTeX. The following program draws a +triangular polygon pierced by a line. +<pre class="verbatim"> + polygon(0,0,1)(1,0,0)(0,1,0) + line(-1,-1,-1)(2,2,2) +</pre> +The coordinate system +<a name="index-coordinate-system_002c-right_002dhanded-3"></a><a name="index-right_002dhand-coordinate-system-4"></a>is a standard right-handed Cartesian one. + +<div align="center"><img src="ex010.png" alt="ex010.png"></div> + +<ul class="menu"> +<li><a accesskey="1" href="#Hello-world">Hello world</a>: Simplest possible <code>sketch</code> program. +<li><a accesskey="2" href="#Drawing-options">Drawing options</a>: Controlling object appearance. +<li><a accesskey="3" href="#Drawing-a-solid">Drawing a solid</a>: Drawing an object with 3d appearance. +<li><a accesskey="4" href="#Special-objects">Special objects</a>: Laying TeX over, in, or under drawings. +<li><a accesskey="5" href="#Object-transforms">Object transforms</a>: Rotate, translate, scale, and others. +<li><a accesskey="6" href="#Repeated-objects">Repeated objects</a>: Making transformed copies. +<li><a accesskey="7" href="#Swept-objects">Swept objects</a>: Sweeping objects in space to make new shapes. +</ul> + +<div class="node"> +<p><hr> +<a name="Hello-world"></a>Next: <a rel="next" accesskey="n" href="#Drawing-options">Drawing options</a>, +Previous: <a rel="previous" accesskey="p" href="#Introduction-by-example">Introduction by example</a>, +Up: <a rel="up" accesskey="u" href="#Introduction-by-example">Introduction by example</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">2.1 Hello world</h3> + +<p>The <code>sketch</code> program above is nearly the simplest one possible, +the equivalent of a “hello world” +<a name="index-hello-world-5"></a><a name="index-program_002c-hello-world-6"></a>program you might find at the start of a programming language text. +If it is saved in the file <span class="file">simple.sk</span>, then the command +<a name="index-command-line_002c-_0040code_007bsketch_007d-7"></a><a name="index-running-_0040code_007bsketch_007d-8"></a> +<pre class="verbatim"> + sketch simple.sk -o simple.tex +</pre> +creates a file <span class="file">simple.tex</span> containing <code>PSTricks</code> commands to +draw these objects on paper. The contents of <span class="file">simple.tex</span> +look like this. +<pre class="verbatim"> + \begin{pspicture}(-1,-1)(2,2) + \pstVerb{1 setlinejoin} + \psline(-1,-1)(.333,.333) + \pspolygon[fillstyle=solid,fillcolor=white](0,0)(1,0)(0,1) + \psline(.333,.333)(2,2) + \end{pspicture} +</pre> +The hidden surface algorithm +<a name="index-hidden-surface-algorithm-9"></a>of <code>sketch</code> has split +<a name="index-splitting_002c-line-and-surface-10"></a>the line into +two pieces and ordered the three resulting objects so that the correct +portion of the line is hidden. + + <p>If you've noticed that the projection we are using seems equivalent to +erasing the z-coordinate of the three-dimensional input points, +pat yourself on the back. You are correct. This is called a +<dfn>parallel projection</dfn>. +<a name="index-parallel-projection-11"></a><a name="index-projection_002c-parallel-12"></a>The z-coordinate axis is pointing straight out of the paper at +us, while the x- and y-axes point to the right and up as +usual. + + <p>The resulting picture file can be included in a LaTeX document with +<tt>\input{simple}</tt>. Alternately, adding the command line option +<span class="option">-T</span><a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a> +<a name="index-command-line-option-13"></a><a name="index-option_002c-command-line-14"></a>causes the <code>pspicture</code> to be wrapped in a short +but complete document, ready to run though LaTeX. +<a name="index-document-template-15"></a><a name="index-template_002c-document-16"></a>In a finished, typeset document, the picture looks like this. (The +axes have been added in light gray.) + +<div align="center"><img src="ex020.png" alt="ex020.png"></div> + +<p class="noindent">It is important to know that only the “outside” +<a name="index-outside-of-a-polygon-17"></a><a name="index-polygon_002c-outside-of-18"></a>of a polygon is +normally drawn. The <dfn>outside</dfn> is where the vertices given in the +<code>polygon</code> +<a name="index-polygon-19"></a>command appear in <em>counter-clockwise</em> +<a name="index-counter_002dclockwise-polygon-vertex-order-20"></a><a name="index-polygon-vertex-order-21"></a><a name="index-order_002c-polygon-vertex-22"></a>order. Thus, if the command above had been +<pre class="verbatim"> + polygon(0,1,0)(1,0,0)(0,0,1) +</pre> +the polygon would not appear in the picture at all. It would have +been <dfn>culled</dfn> +<a name="index-culling-23"></a>from the scene. This culling behavior may seem +strange, but stay tuned. + +<div class="node"> +<p><hr> +<a name="Drawing-options"></a>Next: <a rel="next" accesskey="n" href="#Drawing-a-solid">Drawing a solid</a>, +Previous: <a rel="previous" accesskey="p" href="#Hello-world">Hello world</a>, +Up: <a rel="up" accesskey="u" href="#Introduction-by-example">Introduction by example</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">2.2 Options</h3> + +<p>Many <code>PSTricks</code> and <code>TikZ/PGF</code> options +<a name="index-option-24"></a>work just fine in <code>sketch</code>. If generating <code>PSTricks</code>, the code +<a name="index-line-25"></a> +<pre class="verbatim"> + polygon[fillcolor=lightgray,linewidth=3pt](0,0,1)(1,0,0)(0,1,0) + line[linestyle=dotted](-1,-1,-1)(2,2,2) +</pre> +produces + +<div align="center"><img src="ex030.png" alt="ex030.png"></div> + + <p>To produce <code>TikZ/PGF</code>, the corresponding code is +<pre class="verbatim"> + polygon[fill=lightgray,line width=3pt](0,0,1)(1,0,0)(0,1,0) + line[style=dotted](-1,-1,-1)(2,2,2) + global { language tikz } +</pre> +The final <code>global</code> +<a name="index-options_002c-global-26"></a><a name="index-global-options-27"></a>instructs <code>sketch</code> to produce <code>TikZ/PGF</code> code as output +rather than the default, <code>PSTricks</code>. Note that <code>polygon</code> +fill color and <code>line</code> style options both conform to <code>TikZ</code> +syntax rules. The remaining examples of this manual are in PSTricks +style. + +<div class="node"> +<p><hr> +<a name="Drawing-a-solid"></a>Next: <a rel="next" accesskey="n" href="#Special-objects">Special objects</a>, +Previous: <a rel="previous" accesskey="p" href="#Drawing-options">Drawing options</a>, +Up: <a rel="up" accesskey="u" href="#Introduction-by-example">Introduction by example</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">2.3 Drawing a solid</h3> + +<p>Let's try something more exciting. <code>Sketch</code> has no notion of a +solid, +<a name="index-solid-28"></a>but polygonal <dfn>faces</dfn> +<a name="index-faces-29"></a>can be used to represent the +boundary of a solid. To the previous example, let's add three more +triangular polygons to make the faces of an irregular tetrahedron. +<a name="index-tetrahedron-30"></a><a name="index-def-31"></a><a name="index-polygon-32"></a> +<pre class="verbatim"> + % vertices of the tetrahedron + def p1 (0,0,1) def p2 (1,0,0) + def p3 (0,1,0) def p4 (-.3,-.5,-.8) + + % faces of the tetrahedron. + polygon(p1)(p2)(p3) % original front polygon + polygon(p1)(p4)(p2) % bottom + polygon(p1)(p3)(p4) % left + polygon(p3)(p2)(p4) % rear + + % line to pierce the tetrahedron + line[linecolor=red](-1,-1,-1)(2,2,2) +</pre> +This example uses <dfn>definitions</dfn>, +<a name="index-definition-33"></a>which begin with +<code>def</code>. +<a name="index-def-34"></a>These <dfn>define</dfn> or give names to points, +<a name="index-definition_002c-point-35"></a><a name="index-point-definition-36"></a>which are then available +as <dfn>references</dfn> +<a name="index-reference_002c-point-37"></a>by enclosing the names in parentheses, +e.g. <tt>(foo)</tt>. +<a name="index-_0028foo_0029_0040r_007b_002c-point-reference_007d-38"></a>The parentheses denote that the names refer to points; they are +required. There can be no +<a name="index-white-space-39"></a>white space between them and the name. + + <p>As you can see, comments +<a name="index-comments-40"></a>start with <tt>%</tt> as in TeX and extend +to the end of the line (though <tt>#</tt> will work as well). White +space, +<a name="index-white-space-41"></a>including spaces, tabs and blank lines, has no effect in the <code>sketch</code> +language. + +<div align="center"><img src="ex040.png" alt="ex040.png"></div> + +<p class="noindent">If we look inside the TeX file produced by <code>sketch</code>, there +will be only three polygons. The fourth has been +<a name="index-culling-42"></a>culled because it is +a “back face” +<a name="index-back-face-43"></a>of the tetrahedron, invisible to our view. It is +unnecessary, and so it is removed. + + <p>In some drawings, polygons act as zero-thickness solid surfaces with +both sides visible rather than as the faces of solid objects, where +back faces can be culled. For zero-thickness solids, culling +<a name="index-culling-44"></a>is a +problem. One solution is to use a pair of <code>sketch</code> polygons for +each zero-thickness face, identical except with opposite vertex +orders. This is unwieldy and expensive. A better way is to +set the <code>sketch</code> internal option <code>cull</code> to <code>false</code> in +the usual <code>PSTricks</code> manner. +<a name="index-cull-45"></a> +<pre class="verbatim"> + polygon[cull=false](p1)(p2)(p3) +</pre> +The following shows the same helix +<a name="index-helix-46"></a>shape drawn first with +<tt>cull=true</tt> (the default) and then <tt>cull=false</tt>. + +<div align="center"><img src="ex045.png" alt="ex045.png"> <a name="Helix-with-cull-set-false-then-true"></a></div> + +<p class="noindent">We'll soon see how to produce these helixes with a few lines +of <code>sketch</code> language code. + + <p>It may be tempting to turn culling off gratuitously so that vertex order +can be ignored. This is not a good idea because output file size and +TeX and Postscript processing time both depend on the number of +output polygons. Culling usually improves performance by a factor of +two. On the other hand, globally setting <code>cull=false</code> is +reasonable while debugging. See <a href="#Global-options">Global options</a> and +<a href="#Limits-on-error-detection">Limits on error detection</a>. + +<div class="node"> +<p><hr> +<a name="Special-objects"></a>Next: <a rel="next" accesskey="n" href="#Object-transforms">Object transforms</a>, +Previous: <a rel="previous" accesskey="p" href="#Drawing-a-solid">Drawing a solid</a>, +Up: <a rel="up" accesskey="u" href="#Introduction-by-example">Introduction by example</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">2.4 Special objects</h3> + +<p>We can add labels +<a name="index-labels-47"></a>to a drawing by using <tt>special</tt> +<a name="index-special-48"></a><a name="index-special-object-49"></a>objects, which provide a way to embed raw LaTeX and <code>PSTricks</code> +code. Adding this to the tetrahedron does the trick. +<pre class="verbatim"> + special |\footnotesize + \uput{2pt}[ur]#1{$P1$} + \uput[r]#2{$P2$} + \uput[u]#3{$P3$} + \uput[d]#4{$P4$}| + (p1)(p2)(p3)(p4) +</pre> +Here is the result. + +<div align="center"><img src="ex042.png" alt="ex042.png"></div> + + <p>There are several details to note here. First, the quoting convention +<a name="index-quoting_002c-special-50"></a>for the raw code is similar to the LaTeX <tt>\verb</tt> command. The +first non-white space character following <tt>special</tt> is +understood to be the quote character, +in this case <span class="samp">|</span>. The raw +text continues until this character recurs. + + <p>Second, the argument references +<a name="index-argument_002c-special-51"></a><tt>#1</tt>, <tt>#2</tt>, <tt>#3</tt>, +and <tt>#4</tt> refer to points in the list that follow. This is +similar to TeX macro syntax. The transformed and two-dimensional +projections of these three-dimensional points are substituted +<a name="index-substitution_002c-special-52"></a><a name="index-special-argument-substitution-53"></a>in the final output. An argument reference of the form <tt>#1-2</tt> +is replaced with the angle in degrees of the two-dimensional vector +that connects the projections of the two respective argument points, +here <tt>#1</tt> and <tt>#2</tt>. The substituted angle is enclosed +in curly braces <code>{ }</code> + + <p>By default, <code>special</code> objects are printed last, overlaying all +other objects in the scene. If you specify the internal option +<a name="index-internal-option-54"></a><a name="index-option_002c-internal-55"></a><code>lay=in</code>, the hidden surface algorithm +<a name="index-lay-56"></a><a name="index-hidden-surface-algorithm-57"></a>considers the entire special object to be the first point +(<tt>#1</tt>) in the argument list. If that point is behind (of +smaller z-component than) any drawable, then the entire special +object is drawn before that drawable, so the drawable obscures parts of +the special object that overlaps it. In our example, <tt>p1</tt> is +the front-most point in the scene (has the largest +z-component), so adding <code>lay=in</code> has no effect. + + <p>With option <code>lay=under</code>, a special is drawn <em>before</em>, hence +appears <em>under</em> any of the objects handled by the hidden surface +algorithm. This is how the light gray axes were added to the “hello +world” example <a href="#Hello-world">Hello world</a>. + + <p><tt>Special</tt> objects are powerful, with many possible uses. + +<div class="node"> +<p><hr> +<a name="Object-transforms"></a>Next: <a rel="next" accesskey="n" href="#Repeated-objects">Repeated objects</a>, +Previous: <a rel="previous" accesskey="p" href="#Special-objects">Special objects</a>, +Up: <a rel="up" accesskey="u" href="#Introduction-by-example">Introduction by example</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">2.5 Transforms</h3> + +<p><a name="index-transform-58"></a>Now let's add a second copy of the pierced tetrahedron. We'll rotate +the copy 90 degrees about the x-axis with the origin as +<dfn>center of rotation</dfn> +<a name="index-center-of-rotation-59"></a><a name="index-rotation_002c-center-of-60"></a>so we can see the back, +then translate it to the right—in the positive +x-direction—so it doesn't collide with the original. To help +us see what's going on, make the back side gray. +<a name="index-def-61"></a><a name="index-put-62"></a><a name="index-line-63"></a><a name="index-polygon-64"></a><a name="index-linecolor-65"></a><a name="index-fillcolor-66"></a><a name="index-rotate-67"></a><a name="index-translate-68"></a><a name="index-then-69"></a> +<pre class="verbatim"> + def pierced_tetrahedron { + def p1 (0,0,1) def p2 (1,0,0) + def p3 (0,1,0) def p4 (-.3,-.5,-.8) + polygon(p1)(p2)(p3) % original + polygon(p1)(p4)(p2) % bottom + polygon(p1)(p3)(p4) % left + polygon[fillcolor=lightgray](p3)(p2)(p4) % rear + line[linecolor=red](-1,-1,-1)(2,2,2) + } + {pierced_tetrahedron} % tetrahedron in original position + put { rotate(90, (0,0,0), [1,0,0]) % copy in new position + then translate([2.5,0,0]) } {pierced_tetrahedron} +</pre> +Here the entire code of the previous example has been wrapped in a +definition by forming a <dfn>block</dfn> +<a name="index-block-70"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-71"></a>with braces (a single item would not need them). The point +definitions nested inside the braces are <dfn>lexically scoped</dfn>. +<a name="index-lexical-scope-72"></a><a name="index-scope_002c-identifier-73"></a>Their meaning extends only to the end of the block. The outer +<tt>def</tt> is called a <dfn>drawable</dfn> +<a name="index-drawable-74"></a>definition +<a name="index-definition_002c-drawable-75"></a><a name="index-drawable-definition-76"></a>because it describes something that can be drawn. + + <p>A drawable definition by itself causes nothing to happen until its +name is referenced. Drawable references must be enclosed in curly +braces, e.g. <tt>{foo}</tt>, with no intervening +<a name="index-white-space-77"></a>white space. In the code +above, the first reference +<a name="index-reference_002c-drawable-78"></a><tt>{pierced_tetrahedron}</tt> +<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-79"></a>is a plain +one. Its effect is merely to duplicate the earlier drawing. Almost +any series of <code>sketch</code> commands <tt>stuff</tt> may be replaced +with <tt>def foo { stuff } {foo}</tt> without changing its meaning. + + <p>The <tt>put</tt> command supplies a second reference, this time with +a <dfn>transform</dfn> applied first. The <tt>rotate</tt> +<a name="index-rotate-80"></a><a name="index-rotation-81"></a>transform turns the tetrahedron 90 degrees about the origin. The +axis of rotation +<a name="index-axis_002c-rotation-82"></a>is the vector [1,0,0]. By the <dfn>right +hand rule</dfn>, +<a name="index-right-hand-rule-83"></a>this causes the top of the tetrahedron to rotate toward +the viewer and the bottom away. The rule receives its name from the +following definition: +<blockquote> +<a name="Right-hand-rule"></a> +<strong>Right hand rule.</strong> If the right hand is wrapped around any +axis with the thumb pointing in the axis direction, then the fingers +curl in the direction of positive rotation about that axis. +</blockquote> + The <tt>translate</tt> +<a name="index-translate-84"></a><a name="index-translation-transform-85"></a><a name="index-transform_002c-translation-86"></a>transform moves the pyramid laterally to +the right by adding the vector +<a name="index-vector-87"></a>[2.5,0,0] to each vertex +coordinate. The result is shown here. + +<div align="center"><img src="ex050.png" alt="ex050.png"></div> + +<div class="node"> +<p><hr> +<a name="Repeated-objects"></a>Next: <a rel="next" accesskey="n" href="#Swept-objects">Swept objects</a>, +Previous: <a rel="previous" accesskey="p" href="#Object-transforms">Object transforms</a>, +Up: <a rel="up" accesskey="u" href="#Introduction-by-example">Introduction by example</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">2.6 Repeated objects</h3> + +<p>To draw seven instances of the tetrahedron, each differing from the +last by the same transform, replace the last two commands of the +previous example with +<a name="index-repeat-88"></a><a name="index-rotate-89"></a><a name="index-translate-90"></a> +<pre class="verbatim"> + repeat { 7, rotate(15, (0,0,0), [1,0,0]) % copy in new position + then translate([2,0,0]) } {pierced_tetrahedron} +</pre> +And the result<small class="enddots">....</small> + +<div align="center"><img src="ex060.png" alt="ex060.png"></div> + +<div class="node"> +<p><hr> +<a name="Swept-objects"></a>Previous: <a rel="previous" accesskey="p" href="#Repeated-objects">Repeated objects</a>, +Up: <a rel="up" accesskey="u" href="#Introduction-by-example">Introduction by example</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">2.7 Swept objects</h3> + +<p><a name="index-swept-object-91"></a><a name="index-sweep-92"></a>Many familiar shapes can be generated by sweeping simpler ones through +space and considering the resulting path, surface, or volume. +<code>Sketch</code> implements this idea in the <tt>sweep</tt> command. +<a name="index-sweep-93"></a><a name="index-rotate-94"></a> +<pre class="verbatim"> + def n_segs 8 + sweep { n_segs, rotate(180 / n_segs, (0,0,0), [0,0,1]) } (1,0,0) +</pre> +This code sweeps the point (1,0,0) +<a name="index-point-sweep-95"></a><a name="index-swept-point-96"></a>eight times by rotating it +180/8 = 22.5 degrees each time and connecting the resulting +points with line segments. The <tt>def</tt> used here is a +<dfn>scalar</dfn> definition. +<a name="index-definition_002c-scalar-97"></a><a name="index-scalar-definition-98"></a>References to +<a name="index-reference_002c-scalar-99"></a>scalars have no enclosing brackets at all. + +<ul class="menu"> +<li><a accesskey="1" href="#Point-sweeps">Point sweeps</a>: Swept points make lines and polygons. +<li><a accesskey="2" href="#Polyline-sweeps">Polyline sweeps</a>: Swept lines make surfaces. +<li><a accesskey="3" href="#Nested-sweeps">Nested sweeps</a>: Swept sweeps are useful! +<li><a accesskey="4" href="#Polygon-sweeps">Polygon sweeps</a>: Swept polygons make solids... +<li><a accesskey="5" href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a>: and so do closed polyline sweeps. +<li><a accesskey="6" href="#Affine-arithmetic">Affine arithmetic</a>: Sketch useful math expression. +<li><a accesskey="7" href="#More-to-learn">More to learn</a>: Check out the Mobius strip! +</ul> + +<div class="node"> +<p><hr> +<a name="Point-sweeps"></a>Next: <a rel="next" accesskey="n" href="#Polyline-sweeps">Polyline sweeps</a>, +Previous: <a rel="previous" accesskey="p" href="#Swept-objects">Swept objects</a>, +Up: <a rel="up" accesskey="u" href="#Swept-objects">Swept objects</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">2.7.1 Point sweeps</h4> + +<p>Sweeping a point makes a one-dimensional path, which is a polyline. +Since we have swept with a rotation, the result is a circular arc. +Here is what it looks like. + +<div align="center"><img src="ex070.png" alt="ex070.png"></div> + + <p>This is the first example we have seen of <code>sketch</code> arithmetic. +The expression <tt>180 / n_segs</tt> causes the eight rotations to add +to 180. If you're paying attention, you'll have already noted that +there are <em>nine</em> points, producing eight line segments. + + <p>You can cause the swept point to generate a single polygon rather than +a polyline by using the <dfn>closure tag</dfn> <tt><></tt> +<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-100"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-101"></a>after the number +of swept objects. Code and result follow +<a name="index-def-102"></a><a name="index-rotate-103"></a><a name="index-sweep-104"></a> +<pre class="verbatim"> + def n_segs 8 + sweep { n_segs<>, rotate(180 / n_segs, (0,0,0), [0,0,1]) } (1,0,0) +</pre> +<div align="center"><img src="ex080.png" alt="ex080.png"></div> + +<div class="node"> +<p><hr> +<a name="Polyline-sweeps"></a>Next: <a rel="next" accesskey="n" href="#Nested-sweeps">Nested sweeps</a>, +Previous: <a rel="previous" accesskey="p" href="#Point-sweeps">Point sweeps</a>, +Up: <a rel="up" accesskey="u" href="#Swept-objects">Swept objects</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">2.7.2 Polyline sweeps</h4> + +<p>Sweeping a polyline produces a +<a name="index-line-sweep-105"></a><a name="index-swept-line-106"></a><a name="index-surface-107"></a>surface composed of many faces. +<a name="index-faces-108"></a>The unbroken helix in the +example <a href="#Helix-with-cull-set-false-then-true">Helix with cull set false then true</a> is produced by this +code (plus a surrounding <tt>put</tt> rotation to make an interesting +view; this has been omitted). +<a name="index-def-109"></a><a name="index-sweep-110"></a><a name="index-rotate-111"></a><a name="index-translate-112"></a><a name="index-cull-113"></a><a name="index-linewidth-114"></a> +<pre class="verbatim"> + def K [0,0,1] + sweep[cull=false] { + 60, + rotate(10, (0,0,0), [K]) then translate(1/6 * [K]) + } line[linewidth=2pt](-1,0)(1,0) +</pre> +Again, 60 segments of the helix +<a name="index-helix-115"></a>are produced by connecting 61 +instances of the swept line. Options +<a name="index-options_002c-sweep-116"></a>applied to the sweep, here +<tt>cull=false</tt>, are treated as options for the generated polygon +or polyline. Options of the swept line itself, here +<tt>linewidth=2pt</tt>, are ignored, though with a warning. This +<tt>def</tt> is a <dfn>vector</dfn> definition, +<a name="index-definition_002c-vector-117"></a><a name="index-vector-definition-118"></a>which must be referenced +with square brackets, e.g. <tt>[foo]</tt>. +<a name="index-reference_002c-vector-119"></a><a name="index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-120"></a> +<div class="node"> +<p><hr> +<a name="Nested-sweeps"></a>Next: <a rel="next" accesskey="n" href="#Polygon-sweeps">Polygon sweeps</a>, +Previous: <a rel="previous" accesskey="p" href="#Polyline-sweeps">Polyline sweeps</a>, +Up: <a rel="up" accesskey="u" href="#Swept-objects">Swept objects</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">2.7.3 Nested sweeps</h4> + +<p>When the center point of rotation is omitted, +<a name="index-center-of-rotation-121"></a><a name="index-rotation_002c-center-of-122"></a>the origin is assumed. +When a point has only two coordinates, they are taken as +x <!-- /@w -->and y, <!-- /@w -->with z=0 assumed. A toroid +<a name="index-toroid-123"></a>is therefore obtained with this code. +<a name="index-def-124"></a><a name="index-sweep-125"></a><a name="index-rotate-126"></a> +<pre class="verbatim"> + def n_toroid_segs 20 def n_circle_segs 16 + def r_minor 1 def r_major 1.5 + sweep { n_toroid_segs, rotate(360 / n_toroid_segs, [0,1,0]) } + sweep { n_circle_segs, rotate(360 / n_circle_segs, (r_major,0,0)) } + (r_major + r_minor, 0) +</pre> + + For intuition, the idea of the code is to sketch a circle to the right +of the origin in the xy-plane, then rotate that circle “out of +the plane” about the y-axis to make the final figure. This +produces the following. (A view rotation and some axes have been +added.) + +<div align="center"><img src="ex090.png" alt="ex090.png"></div> + + <p>This example also shows that the swept object may itself be another +<code>sweep</code>. +<a name="index-sweep-127"></a><a name="index-nesting_002c-swept-object-128"></a>In fact, it may be <em>any</em> <code>sketch</code> expression that results in +a list of one or more points or, alternately, a list of one or more +polylines and polygons. The latter kind of list can be created with a +<tt>{ }</tt>-enclosed block, perhaps following a +<a name="index-put-129"></a><tt>put</tt> or +<a name="index-repeat-130"></a><tt>repeat</tt>. +<a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-131"></a> +<div class="node"> +<p><hr> +<a name="Polygon-sweeps"></a>Next: <a rel="next" accesskey="n" href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a>, +Previous: <a rel="previous" accesskey="p" href="#Nested-sweeps">Nested sweeps</a>, +Up: <a rel="up" accesskey="u" href="#Swept-objects">Swept objects</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">2.7.4 Polygon sweeps</h4> + +<p>Sweeping a polygon +<a name="index-polygon-sweep-132"></a><a name="index-swept-polygon-133"></a>creates a closed surface with polygons at the ends, +which are just copies of the original, appropriately +positioned. See <a href="#Solid-coil-example">Solid coil example</a>. +<a name="index-options_002c-swept-object-134"></a>Options on the swept polygon, +if they exist, are applied to the ends. Otherwise the sweep options +<a name="index-options_002c-sweep-135"></a>are used throughout. + +<div class="node"> +<p><hr> +<a name="Polyline-sweeps-with-closure"></a>Next: <a rel="next" accesskey="n" href="#Affine-arithmetic">Affine arithmetic</a>, +Previous: <a rel="previous" accesskey="p" href="#Polygon-sweeps">Polygon sweeps</a>, +Up: <a rel="up" accesskey="u" href="#Swept-objects">Swept objects</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">2.7.5 Polyline sweeps with closure</h4> + +<p>A polyline sweep with a closure tag +<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-136"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-137"></a>creates another kind of closed +surface. First, the polyline segments are connected by faces, just as +without the closure tag. Then, each set of end points is joined to +make a polygon, one for each end. A code for several views of a +cylindrical prism follows. +<a name="index-def-138"></a><a name="index-repeat-139"></a><a name="index-rotate-140"></a><a name="index-then-141"></a><a name="index-translate-142"></a><a name="index-sweep-143"></a><a name="index-line-144"></a><a name="index-fillcolor-145"></a> +<pre class="verbatim"> + def n_cyl_segs 20 def n_views 5 def I [1,0,0] + def endopts [fillcolor=lightgray] + repeat { n_views, rotate(180/n_views, [I]) then translate([I] * 2.1) } + sweep[endopts]{ n_cyl_segs<>, rotate(360/n_cyl_segs, [0,1,0]) } + line[fillcolor=white](1,-1)(1,1) +</pre> +It produces this drawing. + +<div align="center"><img src="ex110.png" alt="ex110.png"></div> + +<p class="noindent">The options of the swept line, if any, are applied to the faces +produced by sweeping the line, but not the end polygons. Otherwise, +the sweep options are applied throughout. +<a name="index-options_002c-swept-object-146"></a>The <tt>def</tt> in this example is an <dfn>option</dfn> definition. +<a name="index-definition_002c-options-147"></a><a name="index-options-definition-148"></a>References to options must be enclosed in square brackets, e.g. <!-- /@w --> +<tt>[foo]</tt>. +<a name="index-reference_002c-options-149"></a><a name="index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-150"></a>Happily, the syntax of <code>sketch</code> is such that +options references can never be confused with vector references. While +not apparent in this example, options references are useful when +defining many objects with a similar appearance. + +<div class="node"> +<p><hr> +<a name="Affine-arithmetic"></a>Next: <a rel="next" accesskey="n" href="#More-to-learn">More to learn</a>, +Previous: <a rel="previous" accesskey="p" href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a>, +Up: <a rel="up" accesskey="u" href="#Swept-objects">Swept objects</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">2.7.6 Affine arithmetic</h4> + +<p>The arithmetic <tt>[I] * 2.1</tt> above hints at a larger truth. +<code>Sketch</code> operators work on scalars, vectors, points, and +transforms according to the general rules of <dfn>affine algebra</dfn>. +<a name="index-affine-arithmetic-151"></a>This can be helpful for setting up diagrams with computed geometry. +For example, if you have triangle vertices <tt>(p1)</tt> through +<tt>(p3)</tt> and need to draw a unit normal vector pointing out of +the center of the triangle, this code does the trick. +<a name="index-def-152"></a><a name="index-polygon-153"></a><a name="index-line-154"></a><a name="index-arrows-155"></a> +<pre class="verbatim"> + def p1 (1,0,0) def p2 (0,0.5,0) def p3 (-0.5,-1,2) + def O (0,0,0) + def N unit( ((p3) - (p2)) * ((p1) - (p2)) ) + def n1 ((p1)-(O) + (p2)-(O) + (p3)-(O)) / 3 + (O) + def n2 (n1)+[N] + polygon(p1)(p2)(p3) + line[arrows=*->](n1)(n2) +</pre> +The first line computes the cross product of two edge vectors of the +triangle and scales it to unit length. The second computes the +average of the vertices. Note that subtraction and addition of the +origin effectively convert vectors to points and <em>vice versa</em>. +The line command draws the normal at the correct spot. + +<div align="center"><img src="ex100.png" alt="ex100.png"></div> + + <p>Two caveats regarding this example remain. First, the only way to use +<code>PSTricks</code>-style arrows is with <tt>arrows=</tt>. +<a name="index-arrows-156"></a>The alternative syntax for <code>PSTricks</code> arrows is not allowed in +<tt>sketch</tt>. Second, you might like to eliminate the third +<tt>def</tt> and write instead the following. +<pre class="verbatim"> + line[arrows=*->](n1) (n1)+[N] +</pre> +This is not allowed. The point lists in drawables may consist only of +explicit points or point references. You may, however, use arithmetic +to calculate point components. The following works, though it's +a little cumbersome. +<pre class="verbatim"> + line[arrows=*->](n1)((n1)'x+(N)'x, (n1)'y+(N)'y, (n1)'z+(N)'z) +</pre> +Obviously, the <dfn>tick operator</dfn> +<a name="index-tick-operator-_0028_0040code_007b_0027_007d_0029-157"></a><a name="index-_0027x_0040r_007b_002c_007d-_0027y_0040r_007b_002c-and-_007d_0027z-158"></a><span class="samp">'x</span> extracts components of points and +vectors. + +<div class="node"> +<p><hr> +<a name="More-to-learn"></a>Previous: <a rel="previous" accesskey="p" href="#Affine-arithmetic">Affine arithmetic</a>, +Up: <a rel="up" accesskey="u" href="#Swept-objects">Swept objects</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">2.7.7 More to learn</h4> + +<p>This is not the end of the story on sweeps! We invite the reader into +the main body of this documentation <a href="#Sweeps">Sweeps</a> to learn more. + +<div align="center"><img src="ex120.png" alt="ex120.png"></div> + +<p class="noindent">Who knows where you'll finish? + +<div class="node"> +<p><hr> +<a name="Input-language"></a>Next: <a rel="next" accesskey="n" href="#Building-a-drawing">Building a drawing</a>, +Previous: <a rel="previous" accesskey="p" href="#Introduction-by-example">Introduction by example</a>, +Up: <a rel="up" accesskey="u" href="#Top">Top</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h2 class="chapter">3 Input language</h2> + +<p>This chapter describes the <code>sketch</code> input language in detail. + +<ul class="menu"> +<li><a accesskey="1" href="#Language-basics">Language basics</a>: Case, space, comments, include files. +<li><a accesskey="2" href="#Drawables">Drawables</a>: Things that can be drawn. +<li><a accesskey="3" href="#Definitions">Definitions</a>: Giving things names. +<li><a accesskey="4" href="#Global-environment">Global environment</a>: Affect the entire drawing. +</ul> + +<div class="node"> +<p><hr> +<a name="Language-basics"></a>Next: <a rel="next" accesskey="n" href="#Drawables">Drawables</a>, +Previous: <a rel="previous" accesskey="p" href="#Input-language">Input language</a>, +Up: <a rel="up" accesskey="u" href="#Input-language">Input language</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">3.1 Basics</h3> + +<p><code>Sketch</code> input is plain ASCII text, usually stored in an input +file. +<a name="index-input-file-159"></a><a name="index-file_002c-input-160"></a>It describes a <dfn>scene</dfn>, +so the sketch language is a <dfn>scene description +language</dfn>. +<a name="index-scene-description-language-161"></a><a name="index-language_002c-scene-description-162"></a><code>Sketch</code> input is also <dfn>declarative</dfn>. +<a name="index-declarative-language-163"></a><a name="index-language_002c-declarative-164"></a>It merely +declares what the scene ought to look like when drawing is complete +and says very little about how <code>sketch</code> should do its work. +<code>Sketch</code> commands are not executed sequentially as in the usual +programming language. They merely contribute to that declaration. + + <p>A few syntactic details are important. Case is significant in the +<code>sketch</code> language. With a few exceptions, white space is not. +This includes line breaks. +<a name="index-white-space-165"></a>Comments begin with <code>%</code> or <code>#</code> and extend to the end of the +line. You can disable a chunk of syntactically correct <code>sketch</code> +code by enclosing it in a <code>def</code>. +<a name="index-comments-166"></a>There is a simple “include file” mechanism. +<a name="index-include-file-167"></a><a name="index-file_002c-include-168"></a>The command +<a name="index-input-169"></a> +<pre class="verbatim"> + input{otherfile.sk} +</pre> +causes the contents of <span class="file">otherfile.sk</span> to be inserted as though +they were part of the current file. + +<ul class="menu"> +<li><a accesskey="1" href="#Identifiers">Identifiers</a>: Names for things. +<li><a accesskey="2" href="#Key-and-reserved-words">Key and reserved words</a>: Names you shouldn't use. +<li><a accesskey="3" href="#Literals">Literals</a>: Constants and constructors. +<li><a accesskey="4" href="#Arithmetic">Arithmetic</a>: Rules for expressions. +<li><a accesskey="5" href="#Options">Options</a>: Modifying object appearance. +</ul> + +<div class="node"> +<p><hr> +<a name="Identifiers"></a>Next: <a rel="next" accesskey="n" href="#Key-and-reserved-words">Key and reserved words</a>, +Previous: <a rel="previous" accesskey="p" href="#Language-basics">Language basics</a>, +Up: <a rel="up" accesskey="u" href="#Language-basics">Language basics</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.1.1 Identifiers</h4> + +<p>Identifiers in <code>sketch</code> are references to earlier-defined +options, scalars, points, vectors, transforms, drawables, and tags. +<a name="index-identifiers-170"></a>Definitions are explained in <a href="#Definitions">Definitions</a>. + + <p>An identifier consists of a leading letter followed by letters, +numbers and underscores. The last character may <em>not</em> be an +underscore. Keywords cannot be used as identifiers, and reserved +words ought to be avoided. See <a href="#Key-and-reserved-words">Key and reserved words</a>. + +<div class="node"> +<p><hr> +<a name="Key-and-reserved-words"></a>Next: <a rel="next" accesskey="n" href="#Literals">Literals</a>, +Previous: <a rel="previous" accesskey="p" href="#Identifiers">Identifiers</a>, +Up: <a rel="up" accesskey="u" href="#Language-basics">Language basics</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.1.2 Key and reserved words</h4> + +<p><a name="index-keywords-171"></a>The keywords of <code>sketch</code> are <code>picturebox</code> <code>curve</code> +<code>def</code> <code>dots</code> <code>frame</code> <code>global</code> <code>input</code> +<code>line</code> <code>polygon</code> <code>put</code> <code>repeat</code> <code>set</code> +<code>sweep</code> and <code>then</code>. The <code>sketch</code> parser will note a +syntax error if any of these are used in place of a proper identifier. + + <p>In addition, there are reserved words +<a name="index-reserved-words-172"></a>that can currently be defined by the user, but with the risk that +future versions of <code>sketch</code> will reject those definitions. The +reserved words are <code>atan2</code> <code>cos</code> <code>inverse</code> +<code>perspective</code> <code>project</code> <code>rotate</code> <code>scale</code> +<code>sin</code> <code>special</code> <code>sqrt</code> <code>translate</code> <code>unit</code> and +<code>view</code>. + +<div class="node"> +<p><hr> +<a name="Literals"></a>Next: <a rel="next" accesskey="n" href="#Arithmetic">Arithmetic</a>, +Previous: <a rel="previous" accesskey="p" href="#Key-and-reserved-words">Key and reserved words</a>, +Up: <a rel="up" accesskey="u" href="#Language-basics">Language basics</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.1.3 Literals</h4> + +<p>Literals in <code>sketch</code> include scalars, points, vectors, and +transforms. Literals, along with defined object references, +are used in arithmetic expressions. See <a href="#Arithmetic">Arithmetic</a>. + +<ul class="menu"> +<li><a accesskey="1" href="#Scalar-literals">Scalar literals</a>: Just the numbers. +<li><a accesskey="2" href="#Point-and-vector-literals">Point and vector literals</a>: 3d quantities. +<li><a accesskey="3" href="#Transform-literals">Transform literals</a>: Matrix form. +</ul> + +<div class="node"> +<p><hr> +<a name="Scalar-literals"></a>Next: <a rel="next" accesskey="n" href="#Point-and-vector-literals">Point and vector literals</a>, +Previous: <a rel="previous" accesskey="p" href="#Literals">Literals</a>, +Up: <a rel="up" accesskey="u" href="#Literals">Literals</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.3.1 Scalar literals</h5> + +<p><a name="index-scalar-literal-173"></a><a name="index-literal_002c-scalar-174"></a>Scalar literals are positive floating point numbers with syntax +according to C conventions. The following are some examples. +<pre class="example"> 0 1004 .001 8.3143 3. 1.60E-19 6.02e+23 +</pre> + <p class="noindent">Scalar literals may not contain embedded spaces. + +<div class="node"> +<p><hr> +<a name="Point-and-vector-literals"></a>Next: <a rel="next" accesskey="n" href="#Transform-literals">Transform literals</a>, +Previous: <a rel="previous" accesskey="p" href="#Scalar-literals">Scalar literals</a>, +Up: <a rel="up" accesskey="u" href="#Literals">Literals</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.3.2 Point and vector literals</h5> + +<p><a name="index-point-literal-175"></a><a name="index-literal_002c-point-176"></a><a name="index-vector-literal-177"></a><a name="index-literal_002c-vector-178"></a>Points and vector literals have these forms respectively. +<pre class="example"> (<i>X</i>,<i>Y</i>,<i>Z</i>) [<i>X</i>,<i>Y</i>,<i>Z</i>] +</pre> + <p class="noindent">Each of the components is itself a scalar expression. The +z-components are optional and default to zero. + +<div class="node"> +<p><hr> +<a name="Transform-literals"></a>Previous: <a rel="previous" accesskey="p" href="#Point-and-vector-literals">Point and vector literals</a>, +Up: <a rel="up" accesskey="u" href="#Literals">Literals</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.3.3 Transform literals</h5> + +<p><a name="index-transform-literal-179"></a><a name="index-literal_002c-transform-180"></a>Most transform literals are formed by <dfn>constructors</dfn>. +<a name="index-constructor-181"></a>These are summarized in the following table. + <p><table summary=""><tr align="left"><th valign="top">Constructor </th><th valign="top">Param types </th><th valign="top">Description +<br></th></tr><tr align="left"><td valign="top"><code>rotate(A,P,X)</code> + <a name="index-rotate-182"></a> <a name="index-rotation-transform-183"></a> <a name="index-transform_002c-rotation-184"></a> </td><td valign="top">scalar,point,vector + </td><td valign="top">Rotate <code>A</code> degrees about point <code>P</code> with axis <code>X</code> + according to the right hand rule. See <a href="#Right-hand-rule">Right hand rule</a>. + <code>P</code> and <code>X</code> are both optional and default to the origin and + the z-axis respectively. +<br></td></tr><tr align="left"><td valign="top"><code>translate(X)</code> + <a name="index-translate-185"></a> <a name="index-translation-transform-186"></a> <a name="index-transform_002c-translation-187"></a> </td><td valign="top">vector + </td><td valign="top">Translate by <code>X</code>. +<br></td></tr><tr align="left"><td valign="top"><code>scale(S)</code> + <a name="index-scale-188"></a> <a name="index-scale-transform-189"></a> <a name="index-transform_002c-scale-190"></a> </td><td valign="top">scalar + </td><td valign="top">Scale uniformly by factor <code>S</code>. +<br></td></tr><tr align="left"><td valign="top"><code>scale(V)</code> + <a name="index-scale-191"></a> <a name="index-scale-transform-192"></a> <a name="index-transform_002c-scale-193"></a> </td><td valign="top">vector + </td><td valign="top">Scale along each axis by components of <code>V</code>. +<br></td></tr><tr align="left"><td valign="top"><code>project()</code> + <a name="index-project-194"></a> <a name="index-parallel-projection-195"></a> <a name="index-projection_002c-parallel-196"></a> </td><td valign="top">— + </td><td valign="top">Same as <code>scale([1,1,0])</code>. +<br></td></tr><tr align="left"><td valign="top"><code>project(S)</code> + <a name="index-project-197"></a> <a name="index-perspective-projection-198"></a> <a name="index-projection_002c-perspective-199"></a> </td><td valign="top">scalar + </td><td valign="top">Perspective projection with view center at origin and projection + plane z=-<code>S</code>. +<br></td></tr><tr align="left"><td valign="top"><code>perspective(S)</code> + <a name="index-perspective-200"></a> <a name="index-perspective-projection-201"></a> <a name="index-projection_002c-perspective-202"></a> </td><td valign="top">scalar + </td><td valign="top">Perspective <em>transform</em> identical to <code>project(S)</code> + except that the z-coordinate of the transformed result is + <dfn>pseudodepth</dfn>, usable by the hidden surface algorithm. + <a name="index-hidden-surface-algorithm-203"></a><br></td></tr><tr align="left"><td valign="top"><code>view(E,D,U)</code> + <a name="index-view-204"></a> <a name="index-view-transform-205"></a> <a name="index-transform_002c-view-206"></a> </td><td valign="top">point,vector,vector + </td><td valign="top">View transform similar to that of <code>OpenGL</code>'s. The +<em>eye point</em> <code>E</code> is translated to the origin while a rotation +is also applied that makes the <em>view direction vector</em> <code>D</code> +and the <em>view “up” vector</em> <code>U</code> point in the negative +z- and the y-directions respectively. If <code>U</code> is +omitted, it defaults to [0,1,0]. When <code>U</code> is omitted, +<code>D</code> may be also; it defaults to <code>(0,0,0)-(E)</code>, a vector +pointing from the eye toward the origin. +<br></td></tr><tr align="left"><td valign="top"><code>view(E,L,U)</code> + <a name="index-view-207"></a> <a name="index-view-transform-208"></a> <a name="index-transform_002c-view-209"></a> </td><td valign="top">point,point,vector + </td><td valign="top">An alternate form of <code>view(E,D,U)</code> above where + the view direction parameter <code>D</code> is replaced with a +“look at” point <code>L</code>, i.e., a point where the viewer is focusing +her attention. This form of view is equivalent to +<code>view(E, (L)-(E), U)</code>, where <code>(L)-(E)</code> is a direction +vector. <code>U</code> is optional and defaults to [0,1,0]. +<br></td></tr><tr align="left"><td valign="top"><code>[[a_11,a_12,a_13,a_14]</code><br> +<code> <!-- /@w -->[a_21,a_22,a_23,a_24]</code><br> +<code> <!-- /@w -->[a_31,a_32,a_33,a_34]</code><br> +<code> <!-- /@w -->[a_41,a_42,a_43,a_44]]</code><br> + <a name="index-_005b_005b-_005d_005b-_005d_005b-_005d_005b-_005d_005d_0040r_007b_002c-transform-literal_007d-210"></a> </td><td valign="top">16 scalars + </td><td valign="top">Direct transform matrix definition. Each + of the a_ij is a scalar expression. If you don't know what + this is about, you don't need it. + <br></td></tr></table> +The <code>project</code> +<a name="index-project-211"></a>constructor is not generally useful because it +defeats hidden surface removal by collapsing the scene onto a single +plane. It is a special purpose transform for drawing pictures of +scenes where three-dimensional objects are being projected onto +planes. See, for example, <a href="#Overview">Overview</a>. + +<div class="node"> +<p><hr> +<a name="Arithmetic"></a>Next: <a rel="next" accesskey="n" href="#Options">Options</a>, +Previous: <a rel="previous" accesskey="p" href="#Literals">Literals</a>, +Up: <a rel="up" accesskey="u" href="#Language-basics">Language basics</a> +<br> +</div> + +<h4 class="subsection">3.1.4 Arithmetic expressions</h4> + +<p>Arithmetic expressions over <code>sketch</code> literals and +defined identifiers are summarized in the following tables. + +<ul class="menu"> +<li><a accesskey="1" href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a>: A op B +<li><a accesskey="2" href="#Unary-forms">Unary forms</a>: op A (and others) +</ul> + +<div class="node"> +<p><hr> +<a name="Two_002doperand-_0028binary_0029-forms"></a>Next: <a rel="next" accesskey="n" href="#Unary-forms">Unary forms</a>, +Previous: <a rel="previous" accesskey="p" href="#Arithmetic">Arithmetic</a>, +Up: <a rel="up" accesskey="u" href="#Arithmetic">Arithmetic</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.4.1 Two-operand (binary) forms and precedence</h5> + +<p>Most two-operand binary +<a name="index-binary-form-212"></a><a name="index-two_002doperand-form-213"></a>forms have meanings dependent on the types of +their arguments. An exhaustive summary of the possibilities is given +in the following table. + <p><table summary=""><tr align="left"><th valign="top">Left </th><th valign="top">Op </th><th valign="top">Right </th><th valign="top">Result </th><th valign="top">Description +<br></th></tr><tr align="left"><td valign="top">scalar </td><td valign="top"><code>+</code> </td><td valign="top">scalar +<a name="index-_002b_0040r_007b_002c-plus-operator_007d-214"></a></td><td valign="top">scalar </td><td valign="top">Scalar sum. +<br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>+</code> </td><td valign="top">vector +</td><td valign="top">vector </td><td valign="top">Vector sum. +<br></td></tr><tr align="left"><td valign="top">point </td><td valign="top"><code>+</code> </td><td valign="top">vector +</td><td valign="top">point </td><td valign="top">Point-vector affine sum. +<br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>+</code> </td><td valign="top">point +</td><td valign="top">" </td><td valign="top">" +<br></td></tr><tr align="left"><td valign="top">scalar </td><td valign="top"><code>-</code> </td><td valign="top">scalar +<a name="index-_002d_0040r_007b_002c-minus-operator_007d-215"></a></td><td valign="top">scalar </td><td valign="top">Scalar difference. +<br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>-</code> </td><td valign="top">vector +</td><td valign="top">vector </td><td valign="top">Vector difference. +<br></td></tr><tr align="left"><td valign="top">point </td><td valign="top"><code>-</code> </td><td valign="top">point +</td><td valign="top">vector </td><td valign="top">Point-point affine difference. +<br></td></tr><tr align="left"><td valign="top">point </td><td valign="top"><code>-</code> </td><td valign="top">vector +</td><td valign="top">point </td><td valign="top">Point-vector affine difference. +<br></td></tr><tr align="left"><td valign="top">scalar </td><td valign="top"><code>*</code> or + <code>.</code> </td><td valign="top">scalar +<a name="index-_002a_0040r_007b_002c-multiplication-operator_007d-216"></a><a name="index-_002e_0040r_007b_002c-dot-operator_007d-217"></a></td><td valign="top">scalar </td><td valign="top">Scalar product. +<br></td></tr><tr align="left"><td valign="top">scalar </td><td valign="top"><code>*</code> or + <code>.</code> </td><td valign="top">vector +</td><td valign="top">vector </td><td valign="top">Scalar-vector product. +<br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>*</code> or + <code>.</code> </td><td valign="top">scalar +</td><td valign="top">" </td><td valign="top">" +<br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>*</code> </td><td valign="top">vector +</td><td valign="top">vector </td><td valign="top">Vector cross-product. +<br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>.</code> </td><td valign="top">vector +</td><td valign="top">scalar </td><td valign="top">Vector dot product. +<br></td></tr><tr align="left"><td valign="top">scalar </td><td valign="top"><code>^</code> </td><td valign="top">scalar +<a name="index-_005e_0040r_007b_002c-exponentiation-operator_007d-218"></a></td><td valign="top">scalar </td><td valign="top">Raise scalar to scalar power. +<br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>^</code> </td><td valign="top">integer +</td><td valign="top">transform </td><td valign="top">Raise transform or integer power. +<a name="index-transform-219"></a><br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>*</code> or + <code>.</code> </td><td valign="top">point +</td><td valign="top">point </td><td valign="top">Affine point transform (right-to-left). +<br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>*</code> or + <code>.</code> </td><td valign="top">vector +</td><td valign="top">vector </td><td valign="top">Affine vector transform (right-to-left). +<br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>*</code> or + <code>.</code> </td><td valign="top">transform +</td><td valign="top">transform </td><td valign="top">Transform composition (right-to-left). +<br></td></tr><tr align="left"><td valign="top">point </td><td valign="top"><code>then</code> </td><td valign="top">transform +<a name="index-then-220"></a></td><td valign="top">point </td><td valign="top">Affine point transform (left-to-right). +<br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>then</code> </td><td valign="top">transform +</td><td valign="top">vector </td><td valign="top">Affine vector transform (left-to-right). +<br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>then</code> </td><td valign="top">transform +</td><td valign="top">transform </td><td valign="top">Transform composition (left-to-right). +<br></td></tr><tr align="left"><td valign="top">scalar </td><td valign="top"><code>/</code> </td><td valign="top">scalar +<a name="index-_002f_0040r_007b_002c-division-operator_007d-221"></a></td><td valign="top">scalar </td><td valign="top">Scalar division. +<br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>/</code> </td><td valign="top">scalar +</td><td valign="top">vector </td><td valign="top">Vector component-wise division by scalar. +<br></td></tr><tr align="left"><td valign="top">point </td><td valign="top"><code>'</code> </td><td valign="top"><code>x</code>, <code>y</code>, or <code>z</code> +<a name="index-tick-operator-_0028_0040code_007b_0027_007d_0029-222"></a><a name="index-_0027x_0040r_007b_002c_007d-_0027y_0040r_007b_002c-and-_007d_0027z-223"></a></td><td valign="top">scalar </td><td valign="top">Point component extraction. +<br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>'</code> </td><td valign="top"><code>x</code>, <code>y</code>, or <code>z</code> +</td><td valign="top">scalar </td><td valign="top">Vector component extraction. + <br></td></tr></table> + <pre class="sp"> + +</pre> +Operator precedence +<a name="index-precedence_002c-operator-224"></a><a name="index-operator-precedence-225"></a>is shown in this table. + <p><table summary=""><tr align="left"><th valign="top">Op </th><th valign="top">Precedence +<br></th></tr><tr align="left"><td valign="top"><code>'</code> </td><td valign="top">highest (most tightly binding) +<br></td></tr><tr align="left"><td valign="top"><code>^</code> </td><td valign="top"> +<br></td></tr><tr align="left"><td valign="top"><code>-</code> </td><td valign="top">(unary negation) +<br></td></tr><tr align="left"><td valign="top"><code>*</code> + <code>.</code> + <code>/</code> </td><td valign="top"> +<br></td></tr><tr align="left"><td valign="top"><code>+</code> + <code>-</code> </td><td valign="top"> +<br></td></tr><tr align="left"><td valign="top"><code>then</code> </td><td valign="top">lowest (least tightly binding) + <br></td></tr></table> + <pre class="sp"> + +</pre> +All operations are left-associative +<a name="index-operator-associativity-226"></a><a name="index-associativity_002c-operator-227"></a>except for <span class="samp">^</span>. +Parentheses <span class="samp">( )</span> +<a name="index-parentheses-228"></a><a name="index-_0028-_0029_0040r_007b_002c-grouping_007d-229"></a>are used for grouping to override precedence in the usual way. + + <p>As you can see, the dot operator <span class="samp">.</span> +<a name="index-_002e_0040r_007b_002c-dot-operator_007d-230"></a>is usually a synonym for run-of-the-mill multiplication, <span class="samp">*</span>. +The meanings differ only for vector operands. The <code>then</code> +operator +<a name="index-then-231"></a>merely reverses the operand +order with respect to normal multiplication <span class="samp">*</span>. The intent +here is to make compositions read more naturally. The code +<pre class="example"> (1,2,3) then scale(2) then rotate(30) then translate([1,3,0]) +</pre> + <p class="noindent">expresses a series of successive modifications to the point, +whereas the equivalent form +<a name="index-_002a_0040r_007b_002c-multiplication-operator_007d-232"></a> +<pre class="example"> translate([1,3,0]) * rotate(30) * scale(2) * (1,2,3) +</pre> + <p class="noindent">will be intuitive only to mathematicians (and perhaps Arabic +language readers). + +<div class="node"> +<p><hr> +<a name="Unary-forms"></a>Previous: <a rel="previous" accesskey="p" href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a>, +Up: <a rel="up" accesskey="u" href="#Arithmetic">Arithmetic</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.4.2 Unary forms</h5> + +<p>Unary or one-operand forms +<a name="index-unary-form-233"></a><a name="index-one_002doperand-form-234"></a>are summarized in the following table, where <code>X</code> +stands for the operand. + <p><table summary=""><tr align="left"><th valign="top">Op </th><th valign="top">Operand + </th><th valign="top">Result </th><th valign="top">Description +<br></th></tr><tr align="left"><td valign="top"><code>-X</code> </td><td valign="top">scalar +<a name="index-_002d_0040r_007b_002c-unary-minus-operator_007d-235"></a> </td><td valign="top">scalar </td><td valign="top">Unary scalar negation. +<br></td></tr><tr align="left"><td valign="top"><code>-X</code> </td><td valign="top">vector + </td><td valign="top">vector </td><td valign="top">Unary vector negation. +<br></td></tr><tr align="left"><td valign="top"><code>|X|</code> </td><td valign="top">vector + <a name="index-_007c_0040math_007bX_007d_007c_0040r_007b_002c-magnitude-operator_007d-236"></a> </td><td valign="top">scalar </td><td valign="top">Vector length. +<br></td></tr><tr align="left"><td valign="top"><code>unit(X)</code> </td><td valign="top">vector + <a name="index-unit-237"></a> </td><td valign="top">vector </td><td valign="top">Unit vector with same direction. +<br></td></tr><tr align="left"><td valign="top"><code>sqrt(X)</code> </td><td valign="top">scalar + <a name="index-sqrt-238"></a> </td><td valign="top">scalar </td><td valign="top">Scalar square root. +<br></td></tr><tr align="left"><td valign="top"><code>sin(X)</code> </td><td valign="top">scalar + <a name="index-sin-239"></a> </td><td valign="top">scalar </td><td valign="top">Trigonometric sine (<code>X</code> in degrees). +<br></td></tr><tr align="left"><td valign="top"><code>cos(X)</code> </td><td valign="top">scalar + <a name="index-cos-240"></a> </td><td valign="top">scalar </td><td valign="top">Trigonometric cosine (<code>X</code> in degrees). +<br></td></tr><tr align="left"><td valign="top"><code>atan2(X,Y)</code> </td><td valign="top">scalar + <a name="index-atan2-241"></a> </td><td valign="top">scalar </td><td valign="top">Polar angle in degrees of vector [X,Y]. +<br></td></tr><tr align="left"><td valign="top"><code>inverse(X)</code> </td><td valign="top">transform + <a name="index-inverse-242"></a> </td><td valign="top">transform </td><td valign="top">Inverse transform. + <br></td></tr></table> + <pre class="sp"> + +</pre> +Errors are reported when <code>|X|</code>, <code>unit</code>, <code>sqrt</code>, +<code>atan2</code>, and <code>inverse</code> fail due to bad parameters. + +<div class="node"> +<p><hr> +<a name="Options"></a>Previous: <a rel="previous" accesskey="p" href="#Arithmetic">Arithmetic</a>, +Up: <a rel="up" accesskey="u" href="#Language-basics">Language basics</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.1.5 Options</h4> + +<p><a name="index-options-243"></a><strong>Syntax:</strong> +<pre class="example"> [<var>key1</var>=<var>val1</var>,<var>key2</var>=<var>val2</var>,...] +</pre> + <p class="noindent">Options are used to specify details of the appearance of drawables. +As shown above, they are given as comma-separated key-value +pairs. + +<ul class="menu"> +<li><a accesskey="1" href="#PSTricks-options">PSTricks options</a>: Options inherited from <code>PSTricks</code>. +<li><a accesskey="2" href="#TikZ_002fPGF-options">TikZ/PGF options</a>: Options inherited from <code>TikZ/PGF</code>. +<li><a accesskey="3" href="#Dots-in-TikZ_002fPGF">Dots in TikZ/PGF</a>: Sketch uses <code>TikZ/PGF</code> circles for dots. +<li><a accesskey="4" href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a>: Support for <code>TikZ/PGF</code> named, user-defined styles. +<li><a accesskey="5" href="#Transparency">Transparency</a>: See-through polygons. +<li><a accesskey="6" href="#Internal-options">Internal options</a>: Options used by <code>sketch</code>. +</ul> + +<div class="node"> +<p><hr> +<a name="PSTricks-options"></a>Next: <a rel="next" accesskey="n" href="#TikZ_002fPGF-options">TikZ/PGF options</a>, +Previous: <a rel="previous" accesskey="p" href="#Options">Options</a>, +Up: <a rel="up" accesskey="u" href="#Options">Options</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.5.1 <code>PSTricks</code> options</h5> + +<p>When <code>language pstricks</code> is selected (the default), permissible +key-value pairs include all those for similar <code>PSTricks</code> objects. +For example, a polygon might have the options +<pre class="verbatim"> + [linewidth=1pt,linecolor=blue,fillcolor=cyan] +</pre> +<code>Sketch</code> merely passes these on to <code>PSTricks</code> without +checking or modification. Option lists are always optional. A +missing options list is equivalent to an empty one <span class="samp">[]</span>. + + <p>When a <code>polygon</code> has options for both its face and its edges, and +the polygon is split by the hidden surface algorithm, <code>sketch</code> +must copy the edge options to <code>psline</code>s for the edge segments and +the face options to <code>pspolygon</code>s. Options known to <code>sketch</code> +for purposes of this splitting operation include <code>arrows</code>, +<code>dash</code>, <code>dotsep</code>, <code>fillcolor</code>, <code>fillstyle</code>, +<code>linecolor</code>, <code>linestyle</code>, <code>linewidth</code>, <code>opacity</code>, +<code>showpoints</code>, <code>strokeopacity</code>, and <code>transpalpha</code>. + +<div class="node"> +<p><hr> +<a name="TikZ_002fPGF-options"></a>Next: <a rel="next" accesskey="n" href="#Dots-in-TikZ_002fPGF">Dots in TikZ/PGF</a>, +Previous: <a rel="previous" accesskey="p" href="#PSTricks-options">PSTricks options</a>, +Up: <a rel="up" accesskey="u" href="#Options">Options</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.5.2 <code>TikZ/PGF</code> options</h5> + +<p><code>TikZ/PGF</code> options are handled much as for <code>PSTricks</code>. +Though <code>TikZ/PGF</code> often allows colors and styles to be given +without corresponding keys, for example, +<pre class="verbatim"> + \draw[red,ultra thick](0,0)--(1,1); +</pre> +this is not permitted in <code>sketch</code>. To draw a red, ultra-thick +line in <code>sketch</code>, the form is +<pre class="verbatim"> + line[draw=red,style=ultra thick](0,0)(1,1) +</pre> + + <p>Just as for <code>PSTricks</code>, when a <code>polygon</code> has options for +both its face and its edges, and the polygon is split by the hidden +surface algorithm, <code>sketch</code> must copy the edge options to +<code>psline</code>s for the edge segments and the face options to +<code>pspolygon</code>s. <code>TikZ/PGF</code> options known to <code>sketch</code> for +purposes of this splitting operation include <code>arrows</code>, +<code>cap</code>, <code>color</code>, <code>dash pattern</code>, <code>dash phase</code>, +<code>double distance, draw</code>, <code>draw opacity</code>, <code>fill</code>, +<code>fill opacity</code>, <code>join</code>, <code>line width</code>, <code>miter +limit</code>, <code>pattern</code>, <code>pattern color</code>, and <code>style</code>. + + <p>The <code>style</code> option can contain both face and edge information, so +<code>sketch</code> must check the style value. Values known to +<code>sketch</code> include <code>dashed</code>, <code>densely dashed</code>, +<code>densely dotted</code>, <code>dotted</code>, <code>double</code>, <code>loosely +dashed</code>, <code>loosely dotted</code>, <code>nearly opaque</code>, <code>nearly +transparent</code>, <code>semithick</code>, <code>semitransparent</code>, <code>solid</code>, +<code>thick</code>, <code>thin</code>, <code>transparent</code>, +<code>ultra nearly transparent</code>, <code>ultra thick</code>, <code>ultra thin</code>, +<code>very nearly transparent</code>, <code>very thick</code>, and <code>very thin</code>. + +<div class="node"> +<p><hr> +<a name="Dots-in-TikZ_002fPGF"></a>Next: <a rel="next" accesskey="n" href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a>, +Previous: <a rel="previous" accesskey="p" href="#TikZ_002fPGF-options">TikZ/PGF options</a>, +Up: <a rel="up" accesskey="u" href="#Options">Options</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.5.3 Dots in <code>TikZ/PGF</code></h5> + +<p><code>TikZ/PGF</code> does not have a <code>dots</code> command as does PSTricks. +Instead, <code>Sketch</code> emits dots as <code>filldraw</code> circles. The +diameter may be set using the option <code>dotsize</code> borrowed from +PSTricks. The <code>dotsize</code> option will be removed from the option +list in the output <code>filldraw</code> command. Other options work in the +expected way. For example, <code>fill</code> sets fill color and +<code>color</code> sets line color of the circles. + +<div class="node"> +<p><hr> +<a name="TikZ_002fPGF-user_002ddefined-styles"></a>Next: <a rel="next" accesskey="n" href="#Transparency">Transparency</a>, +Previous: <a rel="previous" accesskey="p" href="#Dots-in-TikZ_002fPGF">Dots in TikZ/PGF</a>, +Up: <a rel="up" accesskey="u" href="#Options">Options</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.5.4 <code>TikZ/PGF</code> user-defined styles</h5> + +<p><code>TikZ/PGF</code> allows named styles defined by the user, for +example +<pre class="verbatim"> + \tikzstyle{mypolygonstyle} = [fill=blue!20,fill opacity=0.8] + \tikzstyle{mylinestyle} = [red!20,dashed] +</pre> +Since <code>sketch</code> has no information on the contents of such styles, +it omits them entirely from lines, polygons, and their edges during +option splitting. For example, +<pre class="verbatim"> + polygon[style=mypolygonstyle,style=thick](0,0,1)(1,0,0)(0,1,0) + line[style=mylinestyle](-1,-1,-1)(2,2,2) +</pre> +produces the <code>TikZ</code> output +<pre class="verbatim"> + \draw(-1,-1)--(.333,.333); + \filldraw[thick,fill=white](0,0)--(1,0)--(0,1)--cycle; + \draw(.333,.333)--(2,2); +</pre> +Note that the user-defined styles are not present. Sketch also issues +warnings: +<pre class="verbatim"> + warning, unknown polygon option style=mypolygonstyle will be ignored + warning, unknown line option style=mylinestyle will be ignored +</pre> + + <p>The remedy is to state explicitly whether a user-defined style should +be attched to polygons or lines in the <code>TikZ</code> output using +<em>pseudo-options</em> <code>fill style</code> and <code>line style</code>, +<a name="index-pseudo_002doptions-244"></a><a name="index-fill-style-245"></a><a name="index-line-style-246"></a> +<pre class="verbatim"> + polygon[fill style=mypolygonstyle,style=thick](0,0,1)(1,0,0)(0,1,0) + line[line style=mylinestyle](-1,-1,-1)(2,2,2) +</pre> +Now, the output is +<pre class="verbatim"> + \draw[mylinestyle](-1,-1)--(.333,.333); + \filldraw[mypolygonstyle,thick](0,0)--(1,0)--(0,1)--cycle; + \draw[mylinestyle](.333,.333)--(2,2); +</pre> + + <p>A useful technique is to include user-defined style definitions in +<code>sketch</code> code as <code>special</code>s with option <code>[lay=under]</code> +to ensure that the styles are emitted first in the output, before +any uses of the style names. +<a rel="footnote" href="#fn-2" name="fnd-2"><sup>2</sup></a> For +example, +<pre class="verbatim"> + special|\tikzstyle{mypolygonstyle} = [fill=blue!20,fill opacity=0.8]|[lay=under] + special|\tikzstyle{mylinestyle} = [red!20,dashed]|[lay=under] +</pre> +The author is responsible for using the key, <code>line style</code> +or <code>fill style</code>, that matches the content of the style +definition. + +<div class="node"> +<p><hr> +<a name="Transparency"></a>Next: <a rel="next" accesskey="n" href="#Internal-options">Internal options</a>, +Previous: <a rel="previous" accesskey="p" href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a>, +Up: <a rel="up" accesskey="u" href="#Options">Options</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.5.5 Transparency</h5> + +<p><a name="index-transparency-247"></a>Both <code>PSTricks</code> and <code>TikZ/PGF</code> support polygon options that +have the effect of making the polygon appear transparent. For +<code>PSTricks</code>, keywords <code>opacity</code> and <code>transpalpha</code> have +both been used, with the correct one depending on version. +<code>TikZ/PGF</code> uses <code>opacity</code> only. +<a name="index-transpalpha-248"></a><a name="index-opacity-249"></a><a name="index-fill-opacity-250"></a>When transparent polygons are in the foreground, objects behind them +(drawn earlier) are visible with color subdued and tinted. The hidden +surface algorithm of <code>sketch</code> works well with such transparent +polygons. + + <p>Note that <tt>cull=false</tt> +<a name="index-cull-251"></a>must be used for rear-facing polygons to be visible when positioned +behind other transparent surfaces. + +<div class="node"> +<p><hr> +<a name="Internal-options"></a>Previous: <a rel="previous" accesskey="p" href="#Transparency">Transparency</a>, +Up: <a rel="up" accesskey="u" href="#Options">Options</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.1.5.6 Internal options</h5> + +<p>There are also <em>internal</em> options +<a name="index-options_002c-internal-252"></a><a name="index-internal-options-253"></a>used only by <code>sketch</code> and not +passed on to <code>PSTricks</code>. These are summarized in the following +table. +<a name="index-cull-254"></a><a name="index-lay-255"></a><a name="index-split-256"></a> + <p><table summary=""><tr align="left"><th valign="top">Key </th><th valign="top">Possible values </th><th valign="top">Description +<br></th></tr><tr align="left"><td valign="top"><code>cull</code> +</td><td valign="top"><code>true</code>, <code>false</code> +</td><td valign="top">Turn culling of backfaces on and off respectively for this object. +The default value is <code>true</code>. +<br></td></tr><tr align="left"><td valign="top"><code>lay</code> +</td><td valign="top"><code>over</code>, <code>in</code>, <code>under</code> +</td><td valign="top">Force this object to be <code>under</code> or +<code>over</code> all other objects in the depth sort +<a name="index-depth-sort-257"></a>order created by the hidden surface algorithm. The default value +<code>over</code> guarantees that output due to the <code>special</code> will be +visible. +<br></td></tr><tr align="left"><td valign="top"><code>split</code> +</td><td valign="top"><code>true</code>, <code>false</code> +</td><td valign="top">Turn splitting of sweep-generated body polygons +<a name="index-body-polygon-258"></a><a name="index-polygon_002c-body-259"></a>on and off respectively. See <a href="#Sweeps">Sweeps</a>. The default value <code>true</code> +causes “warped” polygons to be split into triangles, which avoids +mistakes by the hidden surface algorithm. + <br></td></tr></table> + +<h4 class="subsection">3.1.6 Point lists</h4> + +<p><a name="index-point-list-260"></a><strong>Syntax:</strong> +<pre class="example"> (<var>x1</var>,<var>y1</var>,<var>z1</var>)(<var>x2</var>,<var>y2</var>,<var>z2</var>)... +</pre> + <p class="noindent">A sequence of one or more points makes a point list, a feature +common to all drawables. Each of the point components is a scalar +arithmetic expression. Any point may have the z-component +omitted; it will default to z=0. + +<ul class="menu"> +<li><a accesskey="1" href="#Drawables">Drawables</a>: Things that are drawn. +<li><a accesskey="2" href="#Definitions">Definitions</a>: Things with names. +</ul> + +<div class="node"> +<p><hr> +<a name="Drawables"></a>Next: <a rel="next" accesskey="n" href="#Definitions">Definitions</a>, +Previous: <a rel="previous" accesskey="p" href="#Language-basics">Language basics</a>, +Up: <a rel="up" accesskey="u" href="#Input-language">Input language</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">3.2 Drawables</h3> + +<p><a name="index-drawable-261"></a>Drawables are simply <code>sketch</code> objects that might appear in the +drawing. They include dots, polylines, curves, polygons, and more +complex objects that are built up from simpler ones in various ways. +Finally, <dfn>special</dfn> objects are those composed of LaTeX or +<code>PSTricks</code> code, perhaps including coordinates and angles +computed by <code>sketch</code>. + +<ul class="menu"> +<li><a accesskey="1" href="#Dots">Dots</a>: Draw dots. +<li><a accesskey="2" href="#Lines">Lines</a>: Draw polylines. +<li><a accesskey="3" href="#Curves">Curves</a>: Draw curves. +<li><a accesskey="4" href="#Polygons">Polygons</a>: Draw polygons. +<li><a accesskey="5" href="#Specials">Specials</a>: Embed raw LaTeX and <code>PSTricks</code>. +<li><a accesskey="6" href="#Sweeps">Sweeps</a>: Draw sweeps of dots and polylines. +<li><a accesskey="7" href="#Blocks">Blocks</a>: Group other drawables. +<li><a accesskey="8" href="#Repeats">Repeats</a>: Draw transformed copies of objects. +<li><a accesskey="9" href="#Puts">Puts</a>: Draw one object transformed. +</ul> + +<div class="node"> +<p><hr> +<a name="Dots"></a>Next: <a rel="next" accesskey="n" href="#Lines">Lines</a>, +Previous: <a rel="previous" accesskey="p" href="#Drawables">Drawables</a>, +Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.2.1 Dots</h4> + +<p><a name="index-dots-262"></a><strong>Syntax:</strong> +<pre class="example"> dots[<var>options</var>] <var>point_list</var> +</pre> + <p class="noindent">This command is the three-dimensional equivalent of the +<code>PSTricks</code> command <code>\psdots</code>. + +<div class="node"> +<p><hr> +<a name="Lines"></a>Next: <a rel="next" accesskey="n" href="#Curves">Curves</a>, +Previous: <a rel="previous" accesskey="p" href="#Dots">Dots</a>, +Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.2.2 Lines</h4> + +<p><a name="index-line-263"></a><strong>Syntax:</strong> +<pre class="example"> line[<var>options</var>] <var>point_list</var> +</pre> + <p class="noindent">This command is the three-dimensional equivalent of the +<code>PSTricks</code> command <code>\psline</code>. + +<div class="node"> +<p><hr> +<a name="Curves"></a>Next: <a rel="next" accesskey="n" href="#Polygons">Polygons</a>, +Previous: <a rel="previous" accesskey="p" href="#Lines">Lines</a>, +Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.2.3 Curves</h4> + +<p><a name="index-curve-264"></a><strong>Syntax:</strong> +<pre class="example"> curve[<var>options</var>] <var>point_list</var> +</pre> + <p class="noindent">This command is the three-dimensional equivalent of the +<code>PSTricks</code> command <code>\pscurve</code>. <b>It is not +implemented in the current version of </b><code>sketch</code>. + +<div class="node"> +<p><hr> +<a name="Polygons"></a>Next: <a rel="next" accesskey="n" href="#Specials">Specials</a>, +Previous: <a rel="previous" accesskey="p" href="#Curves">Curves</a>, +Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.2.4 Polygons</h4> + +<p><a name="index-polygon-265"></a><strong>Syntax:</strong> +<pre class="example"> polygon[<var>options</var>] <var>point_list</var> +</pre> + <p class="noindent">This command is the three-dimensional equivalent of the +<code>PSTricks</code> command <code>\pspolygon</code>. The <code>sketch</code> hidden +surface algorithm assumes that polygons are convex and planar. +<a name="index-polygon_002c-planar-266"></a><a name="index-planarity-of-polygons-267"></a>In practice, drawings may well turn out correctly even if these +assumptions are violated. + +<div class="node"> +<p><hr> +<a name="Specials"></a>Next: <a rel="next" accesskey="n" href="#Sweeps">Sweeps</a>, +Previous: <a rel="previous" accesskey="p" href="#Polygons">Polygons</a>, +Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.2.5 Specials</h4> + +<p><a name="index-special-268"></a><strong>Syntax:</strong> +<pre class="example"> special $<var>raw_text</var>$[lay=<var>lay_value</var>] <var>point_list</var> +</pre> + <p class="noindent">Here <code>$</code> +<a name="index-quoting_002c-special-269"></a>can be any character and is used to delimit the start +and end of <var>raw_text</var>. The command embeds <var>raw_text</var> in the +<code>sketch</code> output after performing substitutions as follows. +<a name="index-special-argument-substitution-270"></a><a name="index-argument_002c-special-271"></a> + <ul> +<li><code>#</code><var>i</var> where <var>i</var> is a positive integer is replaced by +the <var>i</var>'th point in <var>point_list</var>. +<li><code>#{</code><var>i</var><code>}</code> is also replaced as above. +<li><code>#</code><var>i</var><code>-</code><var>j</var> where <var>i</var> and <var>j</var> are positive +integers is replaced by a string <code>{</code><var>angle</var><code>}</code> where +<var>angle</var> is the polar angle of a vector from the <var>i</var>'th point +in <var>point_list</var> to the <var>j</var>'th. +<li><code>#{</code><var>i</var><code>-</code><var>j</var><code>}</code> is also replaced as above. +<li><code>##</code> is replaced with <code>#</code>. +</ul> + The forms with braces <span class="samp">{ }</span> are useful when the argument is +immediately followed by a digit that is part of the TeX code. + + <p>The only useful option of <code>special</code> is <code>lay</code>. +<a name="index-lay-272"></a>See <a href="#Internal-options">Internal options</a>. + +<div class="node"> +<p><hr> +<a name="Sweeps"></a>Next: <a rel="next" accesskey="n" href="#Blocks">Blocks</a>, +Previous: <a rel="previous" accesskey="p" href="#Specials">Specials</a>, +Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.2.6 Sweeps</h4> + +<p><a name="index-sweep-273"></a><strong>Syntax:</strong> +<pre class="example"> sweep { <var>n</var>, <var>T_1</var>, <var>T_2</var>, ..., <var>T_r</var> }[<var>options</var>] <var>swept_object</var> + sweep { <var>n</var><>, <var>T_1</var>, <var>T_2</var>, ..., <var>T_r</var> }[<var>options</var>] <var>swept_object</var> +</pre> + <p class="noindent">The sweep connects <var>n</var> (or perhaps <var>n</var>+1) copies of +<var>swept_object</var> +<a name="index-swept-object-274"></a>in order to create a new object of higher +dimension. The <var>T_i</var> (for i between 1 and +r) are transforms. +<a name="index-transform-275"></a>The k'th copy of <var>swept_object</var> is produced by applying the +following transform to the original. +<pre class="example"> <var>T_1</var>^k then <var>T_2</var>^k then ... then <var>T_r</var>^k +</pre> + <p class="noindent">Here <var>T</var>^k means “transform <var>T</var> applied k +times.” The original object is the zero'th copy, with k=0 and +effectively no transform applied (T^0=I, the identity +transform). + + <p>The method of connecting the copies depends on the type of +<var>swept_object</var> and on whether the closure tag +<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-276"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-277"></a><span class="samp"><></span> is present +or not. + + <p>An example of a sweep where r=2 is the Mobius figure at +<a href="#More-to-learn">More to learn</a>. + +<ul class="menu"> +<li><a accesskey="1" href="#Swept-points">Swept points</a>: Swept points make lines or polygons. +<li><a accesskey="2" href="#Swept-lines">Swept lines</a>: Swept lines make open or closed surfaces. +<li><a accesskey="3" href="#Swept-polygons">Swept polygons</a>: Swept polygons make closed surfaces. +<li><a accesskey="4" href="#Swept-blocks">Swept blocks</a>: Swept block == block of sweeps. +<li><a accesskey="5" href="#Sweep-face-splitting">Sweep face splitting</a>: Fixing warped faces with triangles. +</ul> + +<div class="node"> +<p><hr> +<a name="Swept-points"></a>Next: <a rel="next" accesskey="n" href="#Swept-lines">Swept lines</a>, +Previous: <a rel="previous" accesskey="p" href="#Sweeps">Sweeps</a>, +Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.2.6.1 Swept points</h5> + +<p><a name="index-swept-point-278"></a><a name="index-point-sweep-279"></a>If <var>swept_object</var> is a point list and there is no closure tag, +<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-280"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-281"></a>then <code>sweep</code> connects <var>n</var>+1 successive copies of each +point (including the original) with straight line segments to form a +polyline. If there are m points in the original point list, +<a name="index-point-list-282"></a>then m polylines with <var>n</var> segments each are formed by the +sweep. In this manner, <code>sweep</code> forms a set of one-dimensional +objects (polylines) from zero-dimensional ones (points). + + <p>When there <em>is</em> a closure tag, +<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-283"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-284"></a><code>sweep</code> connects <var>n</var> +successive copies of each point (including the original) with straight +line segments and finally connects the last copy back to the original +to form a polygon with <var>n</var> sides. If there are m points in +the original point list, then m polygons with <var>n</var> sides +each are formed by the sweep. In this manner, <code>sweep</code> forms a +set of two-dimensional objects (polygons) from zero-dimensional ones +(points). + + <p>Options +<a name="index-options_002c-sweep-285"></a>of the <code>sweep</code> are copied directly to the resulting +polyline(s). + +<div class="node"> +<p><hr> +<a name="Swept-lines"></a>Next: <a rel="next" accesskey="n" href="#Swept-polygons">Swept polygons</a>, +Previous: <a rel="previous" accesskey="p" href="#Swept-points">Swept points</a>, +Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.2.6.2 Swept lines</h5> + +<p><a name="index-swept-line-286"></a><a name="index-line-sweep-287"></a>If <var>swept_object</var> is a polyline and there is no closure tag, +<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-288"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-289"></a>then +<code>sweep</code> connects <var>n</var>+1 successive copies of the +polyline (including the original) with four-sided polygons, each pair +of copies giving rise to a “polygon strip.” If there are m +points in the original polyline, then (m-1)<var>n</var> polygons are +formed by the sweep. We call these <dfn>body polygons</dfn>. +<a name="index-body-polygon-290"></a><a name="index-polygon_002c-body-291"></a>In this manner, <code>sweep</code> forms a +two-dimensional surface from from a one-dimensional polyline. + + <p>The order of vertices +<a name="index-polygon-vertex-order-292"></a><a name="index-order_002c-polygon-vertex-293"></a>produced by <code>sweep</code> is important. If a +polygon's vertices do not appear in counter-clockwise order in the +final image, the polygon will be culled +<a name="index-culling-294"></a>(unless <code>cull=false</code> is +set). If the points in the k'th copy of the polyline are +P_1, P_2, <small class="dots">...</small>, P_m, and the points in the +next copy, the (k+1)st, are P_1', P_2', <small class="dots">...</small>, +P_m', then the vertex order of the generated polygons is +<pre class="display"> Body polygon 1: P_2 P_1 P_1' P_2' + Body polygon 2: P_3 P_2 P_2' P_3' + <small class="dots">...</small> + Body polygon m-1: P_m P_m-1 P_m-1' P_m' +</pre> + <p>Options of unclosed line sweeps +<a name="index-options_002c-sweep-295"></a>are copied to each output polygon. +Options of the swept line are ignored. +<a name="index-options_002c-swept-object-296"></a> +When there <em>is</em> a closure tag, +<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-297"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-298"></a>then <code>sweep</code> connects <var>n</var> +successive copies of the polyline (including the original) with +four-sided body polygons just as the case with no closure tag. It then +connects the last copy back to the original to form a ribbon-shaped +surface that closes on itself with two holes remaining. + + <p>Finally, the sweep adds two more polygons to seal the holes and form a +closed surface that, depending on the sweep transforms, may +represent the boundary of a solid. In this manner, <code>sweep</code> forms +the boundary of a three-dimensional object from a one-dimensional +polyline. We call these hole-filling polygons <dfn>ends</dfn>. +<a name="index-end-polygon-299"></a><a name="index-polygon_002c-end-300"></a> +The order of vertices of end polygons +<a name="index-polygon-vertex-order-301"></a><a name="index-order_002c-polygon-vertex-302"></a>is important for correct culling +as described above. If P_1^1, P_1^2, <small class="dots">...</small>, +P_1^n are the <var>n</var> copies of the first polyline point and +P_m^1, P_m^2, <small class="dots">...</small> ,P_m^n are the <var>n</var> +copies of the last polyline point, then the end polygon vertex order +is +<pre class="display"> End polygon 1: P_1^n, P_1^n-1, <small class="dots">...</small> ,P_1^1 + End polygon 2: P_m^1, P_m^2, <small class="dots">...</small> ,P_m^n +</pre> + <p>If there are no options on the swept line, +<a name="index-options_002c-swept-object-303"></a>then the <span class="samp">sweep</span> +options +<a name="index-options_002c-sweep-304"></a>are copied to each output polygon. If the swept line does +have options, these are copied to corresponding body polygons; the +sweep options are copied to the end polygons. In this manner, body +and ends may be drawn with different characteristics such as +<code>fillcolor</code>. + +<div class="node"> +<p><hr> +<a name="Swept-polygons"></a>Next: <a rel="next" accesskey="n" href="#Swept-blocks">Swept blocks</a>, +Previous: <a rel="previous" accesskey="p" href="#Swept-lines">Swept lines</a>, +Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.2.6.3 Swept polygons</h5> + +<p><a name="index-polygon-sweep-305"></a>If <var>swept_object</var> is a polygon, the <code>sweep</code> connects +<var>n</var>+1 successive copies of the closed polyline border of +the polygon to form body polygons exactly as though the border were a +swept polyline as described in <a href="#Swept-lines">Swept lines</a>. +<a name="index-body-polygon-306"></a><a name="index-polygon_002c-body-307"></a>If there are m points in the +original polygon, then m<var>n</var> body polygons are formed by +this sweep. The body polygons form an <dfn>extrusion</dfn> of the boundary of the +original polygon with two holes at the open ends. + + <p>Finally, the sweep adds two copies of the original polygon to cover +the holes. We call these hole-filling polygons <dfn>ends</dfn>. +<a name="index-end-polygon-308"></a><a name="index-polygon_002c-end-309"></a>In this manner, <code>sweep</code> forms the boundary of a three-dimensional +object from a two-dimensional polygon. + + <p>The order of vertices +<a name="index-polygon-vertex-order-310"></a><a name="index-order_002c-polygon-vertex-311"></a>of end polygons is important for correct culling as described above. +An exact copy of the original polygon with vertex order intact forms +the first end polygon. The other end polygon results from +transforming and the reversing the order of vertices in the original. +The transform places the original polygon at the uncovered hole; +it is +<pre class="example"> <var>T_1</var>^n then <var>T_2</var>^n then ... then <var>T_r</var>^n. +</pre> + <p class="noindent">If there are no options on the swept polygon, then the <span class="samp">sweep</span> +options are copied to each output polygon. If the swept polygon does +have options, these are copied to the ends; the sweep options are +copied to the body polygons. In this manner, body and ends may be +drawn with different characteristics such as <code>fillcolor</code>. + +<div class="node"> +<p><hr> +<a name="Swept-blocks"></a>Next: <a rel="next" accesskey="n" href="#Sweep-face-splitting">Sweep face splitting</a>, +Previous: <a rel="previous" accesskey="p" href="#Swept-polygons">Swept polygons</a>, +Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.2.6.4 Swept blocks</h5> + +<p><a name="index-swept-bock-312"></a><a name="index-block-sweep-313"></a>The swept object <var>swept_object</var> may also be any collection of +polylines and polygons. This may be a block +<a name="index-block-314"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-315"></a>composed of <code>line</code> +<a name="index-line-316"></a>and/or <code>polygon</code> +<a name="index-polygon-317"></a>commands in braces +<span class="samp">{ }</span>, or it may be the result of a <code>repeat</code>, another +<code>sweep</code>, etc. The sweep acts independently on each object in the +block exactly as if it were a single swept object described above in +<a href="#Swept-lines">Swept lines</a> and <a href="#Swept-polygons">Swept polygons</a>. + +<div class="node"> +<p><hr> +<a name="Sweep-face-splitting"></a>Previous: <a rel="previous" accesskey="p" href="#Swept-blocks">Swept blocks</a>, +Up: <a rel="up" accesskey="u" href="#Sweeps">Sweeps</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">3.2.6.5 Sweep face splitting</h5> + +<p>Before sending each four-sided body polygon of a <code>sweep</code> +to the output, <code>sketch</code> tests to see if it is roughly planar. +<a name="index-polygon_002c-planar-318"></a><a name="index-planarity-of-polygons-319"></a>Since planarity is necessary for proper functioning of the hidden +surface algorithm, “warped” polygons are automatically split into +two triangles. + + <p>Hole-filling polygons produced by closure-tagged +<a name="index-_003c_003e_0040r_007b_002c-closure-tag_007d-320"></a><a name="index-closure-tag_002c-_0040code_007b_003c_003e_007d-321"></a>line sweeps are not +split. Nor are original polygons in polygon sweeps. It is the user's +responsibility to ensure these are planar. + +<div class="node"> +<p><hr> +<a name="Blocks"></a>Next: <a rel="next" accesskey="n" href="#Repeats">Repeats</a>, +Previous: <a rel="previous" accesskey="p" href="#Sweeps">Sweeps</a>, +Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.2.7 Blocks</h4> + +<p><a name="index-block-322"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-323"></a>Any sequence of drawables may be grouped in a <dfn>block</dfn> merely by +enclosing them in braces <span class="samp">{ }</span>. A block is itself drawable. A +key use of blocks is to extend the effect of a single <code>def</code>, +<a href="#Definitions">Definitions</a>, <code>put</code> <a href="#Puts">Puts</a>, <code>sweep</code> <a href="#Sweeps">Sweeps</a>, +or <code>repeat</code> <a href="#Repeats">Repeats</a> to include several objects rather than +one. + + <p>Definitions (See <a href="#Definitions">Definitions</a>.) inside a block have <dfn>lexical +scope</dfn> +<a name="index-lexical-scope-324"></a><a name="index-scope_002c-identifier-325"></a>extending from the place of definition to the end of the block. + +<div class="node"> +<p><hr> +<a name="Repeats"></a>Next: <a rel="next" accesskey="n" href="#Puts">Puts</a>, +Previous: <a rel="previous" accesskey="p" href="#Blocks">Blocks</a>, +Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.2.8 Repeats</h4> + +<p><a name="index-repeat-326"></a><a name="index-repeated-object-327"></a><strong>Syntax:</strong> +<pre class="example"> repeat { <var>n</var>, <var>T_1</var>, <var>T_2</var>, ..., <var>T_r</var> } <var>repeated_object</var> +</pre> + <p class="noindent">The repeat makes <var>n</var> transformed copies of <var>repeated_object</var> +(including the original). The <var>T_i</var> are transforms. +<a name="index-transform-328"></a>The k'th copy of the <var>repeated_object</var> (for +k=0,1,...,n-1) is produced in the +same manner as for <code>sweep</code>s described in <a href="#Sweeps">Sweeps</a>. This is +repeated here (no pun intended) for convenience. To make the +k'th copy, the following transform is applied to the +original object. +<pre class="example"> <var>T_1</var>^k then <var>T_2</var>^k then ... then <var>T_r</var>^k +</pre> + <p class="noindent">Here <var>T</var>^k means “transform <var>T</var> applied k +times.” + +<div class="node"> +<p><hr> +<a name="Puts"></a>Previous: <a rel="previous" accesskey="p" href="#Repeats">Repeats</a>, +Up: <a rel="up" accesskey="u" href="#Drawables">Drawables</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.2.9 Puts</h4> + +<p><a name="index-put-329"></a><strong>Syntax:</strong> +<pre class="example"> put { <var>T</var> } <var>put_object</var> +</pre> + <p class="noindent">Put merely applies transform <var>T</var> to the drawable <var>put_object</var>. + +<div class="node"> +<p><hr> +<a name="Definitions"></a>Next: <a rel="next" accesskey="n" href="#Global-environment">Global environment</a>, +Previous: <a rel="previous" accesskey="p" href="#Drawables">Drawables</a>, +Up: <a rel="up" accesskey="u" href="#Input-language">Input language</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">3.3 Definitions</h3> + +<p><a name="index-definition-330"></a>Definitions give names to <code>sketch</code> objects. Definitions alone +are benign. A <code>sketch</code> input file consisting entirely of +definitions will generate no drawing. Only when definitions are +<dfn>referenced</dfn> do they potentially lead to ink on the drawing. + + <p>The intent of definitions is to make <code>sketch</code> code more concise +and readable. There is no input file employing definitions +that could not be re-written without them. + + <p>Definable objects include any result of an affine arithmetic +expression (scalar, point, vector, or transform), any drawable +object (dots, line, curve, polygon, block, sweep, put, repeat, or +special), and option strings. In addition, <dfn>tag definitions</dfn>, +<a name="index-definition_002c-tag-331"></a><a name="index-tag-definition-332"></a>which have no associated object at all, allow the meaning of other +definitions to be selected from a set of alternatives. Since tags may +be defined (and undefined) in the command line of <code>sketch</code>, they +can be an aid in the script-driven preparation of documents. + +<ul class="menu"> +<li><a accesskey="1" href="#Forms-of-definitions">Forms of definitions</a>: Different defs for different purposes. +<li><a accesskey="2" href="#Forms-of-references">Forms of references</a>: How references denote types. +</ul> + +<div class="node"> +<p><hr> +<a name="Forms-of-definitions"></a>Next: <a rel="next" accesskey="n" href="#Forms-of-references">Forms of references</a>, +Previous: <a rel="previous" accesskey="p" href="#Definitions">Definitions</a>, +Up: <a rel="up" accesskey="u" href="#Definitions">Definitions</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.3.1 Forms of definitions</h4> + +<p>Definitions have three possible forms, <dfn>simple</dfn>, +<a name="index-simple-definition-333"></a><a name="index-definition_002c-simple-334"></a><dfn>with alternatives</dfn>, +<a name="index-definition-with-alternatives-335"></a><a name="index-alternatives_002c-definition-336"></a>and <dfn>tag</dfn> +<a name="index-tag-definition-337"></a><a name="index-definition_002c-tag-338"></a>as shown here in order. + +<p class="noindent"><strong>Syntax:</strong> +<pre class="example"> def <var>id</var> <var>object</var> % simple def + def <var>id</var> <<var>tag_1</var>> <var>object_1</var> % def with alternatives + <<var>tag_2</var>> <var>object_2</var> + ... + <> <var>default_object</var> + def <var>id</var> <> % tag def +</pre> + <p class="noindent">The simple definition merely associates <var>object</var> with the +identifier <var>id</var>. + + <p>The definition with alternatives associates +<var>object_i</var> with <var>id</var>, where <var>tag_i</var> is the +first defined tag in the list of alternative tag references. +<a name="index-tag-reference-339"></a><a name="index-reference_002c-tag-340"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-341"></a>If no tag in the list is defined, then <var>default_object</var> is +associated with identifier <var>id</var>. + + <p>The final form defines <var>id</var> as a tag. Another way to define a tag +is with the <span class="option">-D</span> command line option. See <a href="#Command-line">Command line</a>. + +<div class="node"> +<p><hr> +<a name="Forms-of-references"></a>Previous: <a rel="previous" accesskey="p" href="#Forms-of-definitions">Forms of definitions</a>, +Up: <a rel="up" accesskey="u" href="#Definitions">Definitions</a> +<br> +</div> + +<h4 class="subsection">3.3.2 Forms of references</h4> + +<p>References to defined names are enclosed in bracketing delimiters. +The delimiter characters imply the type of the associated value as +shown in the table below. A type error is raised if the type of a +reference does not match the type of the defined value. The intent of +this mechanism is, again, to make <code>sketch</code> input files more +readable. + <p><table summary=""><tr align="left"><th valign="top">Type </th><th valign="top">Reference +<br></th></tr><tr align="left"><td valign="top">scalar </td><td valign="top"><var>id</var> +<a name="index-scalar-reference-342"></a><a name="index-reference_002c-scalar-343"></a><br></td></tr><tr align="left"><td valign="top">point </td><td valign="top"><code>(</code><var>id</var><code>)</code> +<a name="index-point-reference-344"></a><a name="index-reference_002c-point-345"></a><a name="index-_0028foo_0029_0040r_007b_002c-point-reference_007d-346"></a><br></td></tr><tr align="left"><td valign="top">vector </td><td valign="top"><code>[</code><var>id</var><code>]</code> +<a name="index-vector-reference-347"></a><a name="index-reference_002c-vector-348"></a><a name="index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-349"></a><br></td></tr><tr align="left"><td valign="top">transform </td><td valign="top"><code>[[</code><var>id</var><code>]]</code> +<a name="index-transform-reference-350"></a><a name="index-reference_002c-transform-351"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-352"></a><br></td></tr><tr align="left"><td valign="top">drawable </td><td valign="top"><code>{</code><var>id</var><code>}</code> +<a name="index-drawable-reference-353"></a><a name="index-reference_002c-drawable-354"></a><a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-355"></a><br></td></tr><tr align="left"><td valign="top">options </td><td valign="top"><code>[</code><var>id</var><code>]</code> or <code>[</code><var>id1</var><code>,...,</code><var>idN</var><code>]</code> +<a name="index-options-reference-356"></a><a name="index-reference_002c-options-357"></a><a name="index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-358"></a><a name="index-options-multiple-reference-359"></a><a name="index-reference_002c-multiple-options-360"></a><a name="index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-361"></a><br></td></tr><tr align="left"><td valign="top">tag </td><td valign="top"><code><</code><var>id</var><code>></code> +<a name="index-tag-reference-362"></a><a name="index-reference_002c-tag-363"></a><a name="index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-364"></a> + <br></td></tr></table> + <pre class="sp"> + +</pre> +Note that square brackets <span class="samp">[ ]</span> are used both for vector and for +options references. Details of <code>sketch</code> syntax make it +impossible for these two reference types to be confused. The +special multiple reference <code>[</code><var>id1</var><code>,</code><var>id2</var><code>,...,</code><var>idN</var><code>]</code> +acts as if the respective lists of options were concatenated. + +<div class="node"> +<p><hr> +<a name="Global-environment"></a>Previous: <a rel="previous" accesskey="p" href="#Definitions">Definitions</a>, +Up: <a rel="up" accesskey="u" href="#Input-language">Input language</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">3.4 Global environment</h3> + +<p>An optional global environment block provides a few ways to affect the +entire scene. The block must appear as the last text in the +<code>sketch</code> input file. It may include definitions, but note +that previous definitions at the top level (not nested inside +blocks) are also available. + +<p class="noindent"><strong>Syntax:</strong> +<a name="index-global-365"></a> +<pre class="example"> global { <var>environment_settings</var> } +</pre> + <p class="noindent">The contents of <var>environment_settings</var> are discussed in the +sections that follow. + +<ul class="menu"> +<li><a accesskey="1" href="#Global-options">Global options</a>: Attributes of the entire drawing. +<li><a accesskey="2" href="#Camera">Camera</a>: A final camera transformation of the scene. +<li><a accesskey="3" href="#Picture-box">Picture box</a>: Setting the bounding box and 2d clipping. +<li><a accesskey="4" href="#Frame">Frame</a>: Adding a box around the drawing. +<li><a accesskey="5" href="#Language">Language</a>: Setting the output language. +</ul> + +<div class="node"> +<p><hr> +<a name="Global-options"></a>Next: <a rel="next" accesskey="n" href="#Camera">Camera</a>, +Previous: <a rel="previous" accesskey="p" href="#Global-environment">Global environment</a>, +Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.4.1 Global options</h4> + +<p><a name="index-options_002c-global-366"></a><a name="index-global-options-367"></a><a name="index-set-368"></a><strong>Syntax:</strong> +<pre class="example"> set [ <var>options</var> ] +</pre> + <p class="noindent">The contents of <var>options</var>, except for <code>sketch</code> internal +options, are copied as-is to a <tt>\psset</tt> that appears before +anything else in the output file. This is a good place to set +<code>unit</code>, a default <code>linewidth</code>, etc. + + <p>Internal options +<a name="index-options_002c-internal-369"></a><a name="index-internal-options-370"></a>work on all objects where they make sense. +This includes +<a name="index-cull-371"></a><a name="index-split-372"></a><a name="index-lay-373"></a><code>cull</code> and <code>split</code> (but not <code>lay</code>). +See <a href="#Internal-options">Internal options</a>. + +<div class="node"> +<p><hr> +<a name="Camera"></a>Next: <a rel="next" accesskey="n" href="#Picture-box">Picture box</a>, +Previous: <a rel="previous" accesskey="p" href="#Global-options">Global options</a>, +Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.4.2 Camera</h4> + +<p><a name="index-camera-374"></a><strong>Syntax:</strong> +<a name="index-camera-375"></a> +<pre class="example"> camera <var>transform_expression</var> +</pre> + <p>The <var>transform_expression</var> is applied after all other +transformations of the scene. This is currently only useful for +transforming the bounding box. See <a href="#Picture-box">Picture box</a>. It will play a +role in any future implementation of clipping. + +<div class="node"> +<p><hr> +<a name="Picture-box"></a>Next: <a rel="next" accesskey="n" href="#Frame">Frame</a>, +Previous: <a rel="previous" accesskey="p" href="#Camera">Camera</a>, +Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.4.3 Picture box</h4> + +<p><a name="index-picture-box-376"></a><strong>Syntax:</strong> +<a name="index-picturebox-377"></a> +<pre class="example"> picturebox[<var>baseline</var>] + picturebox[<var>baseline</var>] (<var>p1</var>)(<var>p2</var>) +</pre> + <p class="noindent">The first form of <code>picturebox</code> causes a scalar <var>baseline</var> +fraction to be emitted in the <code>pspicture</code> +<a name="index-_0040code_007bpspicture_007d-378"></a><a name="index-baseline-fraction-379"></a>environment of the output. See +<code>PSTricks</code> documentation for <code>pspicture</code>. + + <p>In the second form, the <var>baseline</var> fraction is optional, and the +two points that follow define the diagonal of a three-dimensional +bounding box +<a name="index-bounding-box-380"></a>for the completed scene. The parallel projection +<a name="index-parallel-projection-381"></a><a name="index-projection_002c-parallel-382"></a>of the bounding box +determines the corners of the drawing's <code>pspicture*</code> environment, +which is used in place of <code>pspicture</code>. This causes PostScript to +clip +<a name="index-clipping-383"></a>the final drawing to the bounding box in 2d. If there is a +<code>camera</code> specified, the camera tranformation is applied to the +bounding box, and the <code>pspicture</code> is set just large +enough to include the transformed box. + + <p>When no bounding box is given, <code>sketch</code> computes one +automatically. + +<div class="node"> +<p><hr> +<a name="Frame"></a>Next: <a rel="next" accesskey="n" href="#Language">Language</a>, +Previous: <a rel="previous" accesskey="p" href="#Picture-box">Picture box</a>, +Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.4.4 Frame</h4> + +<p><a name="index-frame-box-384"></a><strong>Syntax:</strong> +<a name="index-frame-385"></a> +<pre class="example"> frame [<var>options</var>] +</pre> + <p class="noindent">Causes a <tt>\psframebox</tt> +<a name="index-_0040code_007bpsframebox_007d-386"></a>to surround the <code>pspicture</code> +environment in the output. If <var>options</var> are present, they are +copied as-is. Normally one would want to set +<a name="index-linewidth-387"></a><code>linewidth</code>, +<a name="index-linestyle-388"></a><code>linestyle</code>, +<a name="index-linecolor-389"></a><code>linecolor</code>, etc. +If omitted, then +<a name="index-framesep-390"></a><code>framesep=0pt</code> is +added so that the frame tightly hugs the <code>pspicture</code>. + +<div class="node"> +<p><hr> +<a name="Language"></a>Previous: <a rel="previous" accesskey="p" href="#Frame">Frame</a>, +Up: <a rel="up" accesskey="u" href="#Global-environment">Global environment</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">3.4.5 Language</h4> + +<p><a name="index-language_002c-output-391"></a><a name="index-output-language-392"></a><a name="index-language-393"></a> +<pre class="example"> language tikz + language tikz, context + language pstricks + language pstricks, latex +</pre> + <p class="noindent">Sets the output language generated by <code>sketch</code>. +<a name="index-pstricks-394"></a><a name="index-tikz-395"></a>The set of options understood by sketch also changes. For example, +the <code>PSTricks</code> option <code>linewidth</code> will not be properly +handled if <code>language</code> is set to <code>tikz</code>. Similarly, the +<code>TikZ</code> option <code>line style</code> (note the space) will not be +properly handled if <code>language</code> is set to <code>pstricks</code>. If no +language is specified, the default <code>pstricks</code> is used. + + <p>An optional comma followed by +<code>latex</code> +<a name="index-latex-396"></a>or +<code>context</code> +<a name="index-context-397"></a>specifies the macro package that the output should assume. This +affects the <code>picture</code> environment commands emitted and the +document template used with the <span class="option">-T</span> option. See <a href="#Command-line">Command line</a>. Note that at the time this manual was generated, +<code>PSTricks</code> was not supported by LaTeX or by <code>ConTeXt</code>. + +<div class="node"> +<p><hr> +<a name="Building-a-drawing"></a>Next: <a rel="next" accesskey="n" href="#Command-line">Command line</a>, +Previous: <a rel="previous" accesskey="p" href="#Input-language">Input language</a>, +Up: <a rel="up" accesskey="u" href="#Top">Top</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h2 class="chapter">4 Building a drawing</h2> + +<p>Successful drawings with <code>sketch</code> and with any scene description +language +<a name="index-scene-description-language-398"></a>require that the user develop an accurate mental picture of her code +and its meaning. This image is best built in small pieces. +Therefore, <code>sketch</code> inputs are best created in small increments +with frequent pauses to compile and view the results. Careful +comments in the input often help as a scene grows in complexity. + +<ul class="menu"> +<li><a accesskey="1" href="#Overview">Overview</a>: Building a substantial drawing. +<li><a accesskey="2" href="#A-technical-drawing">A technical drawing</a>: An example with fine placement. +<li><a accesskey="3" href="#A-hierarchical-model">A hierarchical model</a>: An example with sweeps and puts. +<li><a accesskey="4" href="#Caveats">Caveats</a>: Where trouble can occur. +</ul> + +<div class="node"> +<p><hr> +<a name="Overview"></a>Next: <a rel="next" accesskey="n" href="#A-technical-drawing">A technical drawing</a>, +Previous: <a rel="previous" accesskey="p" href="#Building-a-drawing">Building a drawing</a>, +Up: <a rel="up" accesskey="u" href="#Building-a-drawing">Building a drawing</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">4.1 Overview</h3> + +<p>As an overview, let's develop a diagram that shows how a perspective +projection transform +<a name="index-perspective-projection-399"></a><a name="index-transform-400"></a><a name="index-projection_002c-perspective-401"></a>works. We'll start with the traditional reference object +used in computer graphics textbooks, a house-shaped prism. Begin +by defining the points of the house. Rather than defining the faces +of the house as polygons and transforming those, we are going to +transform the points themselves with <code>sketch</code> arithmetic so that +we have names for the transformed points later. +<a name="index-def-402"></a> +<pre class="verbatim"> + % right side (outside to right) + def R1 (1,1,1) def R2 (1,-1,1) def R3 (1,-1,-1) def R4 (1,1,-1) + def R5 (1,1.5,0) + + % left side (outside to right--backward) + def W [2,0,0] + def L1 (R1)-[W] def L2 (R2)-[W] def L3 (R3)-[W] def L4 (R4)-[W] + def L5 (R5)-[W] +</pre> +To add a door to the house, we use a polygon slightly in +front of the foremost face of the house. +<pre class="verbatim"> + % door + def e .01 + def D1 (0,-1,1+e) def D2 (.5,-1,1+e) def D3 (.5,0,1+e) def D4 (0,0,1+e) +</pre> +Now let's create a new set of points that are a to-be-determined +transform of the originals. +<pre class="verbatim"> + def hp scale(1) % house positioner + def pR1 [[hp]]*(R1) def pR2 [[hp]]*(R2) def pR3 [[hp]]*(R3) + def pR4 [[hp]]*(R4) def pR5 [[hp]]*(R5) + def pL1 [[hp]]*(L1) def pL2 [[hp]]*(L2) def pL3 [[hp]]*(L3) + def pL4 [[hp]]*(L4) def pL5 [[hp]]*(L5) + def pD1 [[hp]]*(D1) def pD2 [[hp]]*(D2) def pD3 [[hp]]*(D3) + def pD4 [[hp]]*(D4) +</pre> +Note the use of a <dfn>transform definition</dfn> +<a name="index-transform-definition-403"></a><a name="index-definition_002c-transform-404"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-405"></a>and +<dfn>transform references</dfn>. +<a name="index-transform-reference-406"></a><a name="index-reference_002c-transform-407"></a><a name="index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-408"></a>Now define the seven polygonal faces of the house and the door using +the transformed points as vertices. Be careful with vertex order! +<a name="index-polygon-vertex-order-409"></a><a name="index-order_002c-polygon-vertex-410"></a><a name="index-fillcolor-411"></a><a name="index-def-412"></a><a name="index-polygon-413"></a><a name="index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-414"></a> +<pre class="verbatim"> + def rgt polygon (pR1)(pR2)(pR3)(pR4)(pR5) + def lft polygon (pL5)(pL4)(pL3)(pL2)(pL1) + def frt polygon (pR2)(pR1)(pL1)(pL2) + def bck polygon (pR4)(pR3)(pL3)(pL4) + def tfr polygon (pR1)(pR5)(pL5)(pL1) + def tbk polygon (pR5)(pR4)(pL4)(pL5) + def bot polygon (pR2)(pL2)(pL3)(pR3) + def door polygon[fillcolor=brown] (pD1)(pD2)(pD3)(pD4) + def house { {rgt}{lft}{frt}{bck}{tfr}{tbk}{bot}{door} } +</pre> +Time for a sanity check. Add the line +<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-415"></a><a name="index-reference_002c-drawable-416"></a> +<pre class="verbatim"> + {house} +</pre> +and this is what we get. + +<div align="center"><img src="ex130.png" alt="ex130.png"></div> + +<p class="noindent">This is correct, but does not reveal very much. Common errors are +misplaced vertices and polygons missing entirely due to incorrect +vertex order. +<a name="index-polygon-vertex-order-417"></a><a name="index-order_002c-polygon-vertex-418"></a>To rule these out, let's inspect all sides of the +house. This is not hard. Merely replace the reference +<tt>{house}</tt> with a <code>repeat</code>. See <a href="#Repeats">Repeats</a>. +<a name="index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-419"></a><a name="index-reference_002c-drawable-420"></a><a name="index-repeat-421"></a><a name="index-rotate-422"></a><a name="index-translate-423"></a> +<pre class="verbatim"> + repeat { 13, rotate(30, [1,2,3]), translate([3,0,0]) } {house} +</pre> +<div align="center"><img src="ex140.png" alt="ex140.png"></div> + +<p class="noindent">Again things look correct. Note that the hidden surface algorithm +handles intersecting polygons correctly where some copies of the house +overlap. + + <p>Let's lay out the geometry of perspective projection of the house onto +a plane with rays passing through the origin. Begin by positioning the +house twelve units back on the negative z-axis and adding a set +of coordinate axes. To move the house we need only change the “house +positioning” transform defined earlier. +<a name="index-def-424"></a><a name="index-rotate-425"></a><a name="index-translate-426"></a><a name="index-arrows-427"></a><a name="index-linewidth-428"></a><a name="index-linecolor-429"></a><a name="index-linestyle-430"></a><a name="index-special-431"></a><a name="index-line-432"></a> +<pre class="verbatim"> + def hp rotate(-40, [0,1,0]) then translate([0,0,-12]) + def axes { + def sz 1 + line [arrows=<->] (sz,0,0)(O)(0,sz,0) + line [arrows=->] (O)(0,0,sz) + line [linewidth=.2pt,linecolor=blue,linestyle=dashed] (O)(0,0,-10) + special |\uput[r]#1{$x$}\uput[u]#2{$y$}\uput[l]#3{$z$}| + (sz,0,0)(0,sz,0)(0,0,sz) + } +</pre> + + <p>Time for another test. Let's build a real view transform, +creating a <dfn>virtual camera</dfn> +<a name="index-virtual-camera-433"></a>to look at the scene we are constructing. Replace the <code>repeat</code> +with +<pre class="verbatim"> + def eye (10,4,10) + def look_at (0,0,-5) + put { view((eye), (look_at)) } { {house}{axes} } +</pre> +The <dfn>view transform</dfn> repositions the scene so that the point +<code>eye</code> is at the origin and the direction from <code>eye</code> to +<code>look_at</code> is the negative z-axis. This requires a +rotation and a translation that are all packed into the constructor +<code>view</code>. + +<div align="center"><img src="ex150.png" alt="ex150.png"></div> + +<p class="noindent">This is starting to look good! Add the projection plane half way +between the origin and the house at z=-5. We'll try +the angle argument feature of <code>special</code> to position a label. +<pre class="verbatim"> + def p 5 % projection distance (plane at z=-p) + def projection_plane { + def sz 1.5 + polygon (-sz,-sz,-p)(sz,-sz,-p)(sz,sz,-p)(-sz,sz,-p) + special |\rput[b]#1-2#3{\footnotesize\sf projection plane}| + (-sz,-sz,-p)(sz,-sz,-p)(0,-sz+.1,-p) + } +</pre> +Add <tt>{projection_plane}</tt> to the list of objects in the +<code>put</code> above. + +<div align="center"><img src="ex160.png" alt="ex160.png"></div> + + <p class="indent">The way we constructed the points of the house now makes it easy to +draw rays of projection. We'll cast one ray from every visible vertex +of the house and define options so the appearance of +all rays can be changed at the same time. +<pre class="verbatim"> + def projection_rays { + def rayopt [linewidth=.3pt,linecolor=lightgray] + line [rayopt](O)(pR1) line [rayopt](O)(pR2) line[rayopt](O)(pR3) + line [rayopt](O)(pR4) line [rayopt](O)(pR5) + line [rayopt](O)(pL1) line [rayopt](O)(pL2) line[rayopt](O)(pL5) + line [rayopt](O)(pD1) line [rayopt](O)(pD2) + line [rayopt](O)(pD3) line [rayopt](O)(pD4) + } +</pre> +The result is shown here. + +<div align="center"><img src="ex170.png" alt="ex170.png"></div> + +<p class="noindent">The rays pierce the projection plane at the corresponding points on +the perspective image we are trying to draw. Albrecht Dürer and his +Renaissance contemporaries had the same idea in the early 1500's. + +<div align="center"><img src="duerer.png" alt="duerer.png"></div> + + <p>All that's left is to find a way to connect the points of the house +on the projection plane. We could pull out a good computer graphics +text, find the necessary matrix, and enter it ourselves as a +transform literal. See <a href="#Transform-literals">Transform literals</a>. That work is +already done, however. We can use the <code>project(p)</code> constructor. + + <p>There are still some details that require care. Projection will +flatten whatever is transformed onto the plane z=-p. Therefore +any part of the house could disappear behind the projection plane (the +hidden surface algorithm orders objects at the same depth +arbitrarily). The door may also disappear behind the front of the +house. To make sure everything remains visible, we'll place the house +a tiny bit in front of the projection plane and a second copy of the +door in front of the house. +<pre class="verbatim"> + def projection { + % e is a small number defined above + put { project(p) then translate([0,0,1*e]) } {house} + put { project(p) then translate([0,0,2*e]) } {door} + } +</pre> + +<div align="center"><img src="ex180.png" alt="ex180.png"></div> + + <p>If you have studied and understand all this, you are well on the way +to success with <code>sketch</code>. Not shown are the 20 or so iterations +that were required to find a reasonable viewing angle and house +position, etc. Nonetheless, this drawing was completed in about an +hour. While a GUI tool may have been a little faster, it is unlikely +that a new drawing, itself a perspective projection of the scene, +could be generated with two more minutes' work! Just change the view +transform to +<pre class="verbatim"> + put { view((eye), (look_at)) then perspective(9) } { ... +</pre> +and produce this. + +<div align="center"><img src="ex190.png" alt="ex190.png"></div> + +<div class="node"> +<p><hr> +<a name="A-technical-drawing"></a>Next: <a rel="next" accesskey="n" href="#A-hierarchical-model">A hierarchical model</a>, +Previous: <a rel="previous" accesskey="p" href="#Overview">Overview</a>, +Up: <a rel="up" accesskey="u" href="#Building-a-drawing">Building a drawing</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">4.2 A technical drawing</h3> + +<p>Let's look at a drawing that represents the kind of problem +<code>sketch</code> was meant to solve—a pair of textbook figures +regarding a polygonal approximation of a truncated cone. Here are the +pictures we will produce. + +<div align="center"><img src="ex250.png" alt="ex250.png"> <img src="ex260.png" alt="ex260.png"></div> + + <p>The cone shape is just a swept line with no closure tag and culling +turned off. Begin by setting up some useful constants. +<a name="index-def-434"></a><a name="index-rotate-435"></a> +<pre class="verbatim"> + def O (0,0,0) def I [1,0,0] def J [0,1,0] def K [0,0,1] + def p0 (1,2) def p1 (1.5,0) def N 8 + def seg_rot rotate(360 / N, [J]) +</pre> +The points <code>p0</code> and <code>p1</code> are the end points of the line to +be swept. The definition <code>seg_rot</code> is the sweep transformation. +With these, the cone itself is simple. +<a name="index-sweep-436"></a><a name="index-cull-437"></a><a name="index-line-438"></a><a name="index-swept-line-439"></a><a name="index-line-sweep-440"></a> +<pre class="verbatim"> + sweep[cull=false] { N, [[seg_rot]] } line(p0)(p1) +</pre> + + <p>The axes are next and include an interesing trick that shows the +hidden parts as dotted lines. The secret is draw the axes +twice—solid lines with the normal +<a name="index-hidden-surface-algorithm-441"></a>hidden surface algorithm in effect, and then dotted with the +option +<a name="index-lay-442"></a><code>lay=over</code> so that no polygons can hide them. +<a name="index-def-443"></a><a name="index-line-444"></a><a name="index-arrows-445"></a><a name="index-linewidth-446"></a><a name="index-lay-447"></a><a name="index-linestyle-448"></a><a name="index-special-449"></a> +<pre class="verbatim"> + def ax (dx,0,0) % tips of the axes + def ay (0,dy,0) + def az (0,0,dz) + line[arrows=<->,linewidth=.4pt](ax)(O)(ay) + line[arrows=->,linewidth=.4pt](O)(az) + % repeat dotted as an overlay to hint at the hidden lines + line[lay=over,linestyle=dotted,linewidth=.4pt](ax)(O)(ay) + line[lay=over,linestyle=dotted,linewidth=.4pt](O)(az) + special|\footnotesize + \uput[d]#1{$x$}\uput[u]#2{$y$}\uput[l]#3{$z$}| + (ax)(ay)(az) +</pre> +The labels are applied with <code>PSTricks</code> special objects +<a name="index-special-objects-450"></a>as usual. + + <p>For the height dimension mark, the power of affine +<a name="index-affine-arithmetic-451"></a>arithetic is very helpful. +<a name="index-def-452"></a><a name="index-unit-453"></a><a name="index-scale-454"></a><a name="index-line-455"></a><a name="index-special-456"></a> +<pre class="verbatim"> + def hdim_ref unit((p1) - (O)) then [[seg_rot]]^2 + def c0 (p0) then scale([J]) + def h00 (c0) + 1.1 * [hdim_ref] + def h01 (c0) + 1.9 * [hdim_ref] + def h02 (c0) + 1.8 * [hdim_ref] + line(h00)(h01) + def h10 (O) + 1.6 * [hdim_ref] + def h11 (O) + 1.9 * [hdim_ref] + def h12 (O) + 1.8 * [hdim_ref] + line(h10)(h11) + line[arrows=<->](h02)(h12) + def hm2 ((h02) - (O) + (h12) - (O)) / 2 + (O) + special|\footnotesize\rput*#1{$h$}|(hm2) +</pre> +The general idea employed here is to compute a unit “reference +vector” parallel to the xz-plane in the desired direction of +the dimension from the origin. The transformation +<code>[[seg_rot]]^2</code> rotates two segments about the y-axis. +When applied to <code>(p1) - (O)</code>, the resulting vector points to the +right as shown. In this manner, we can pick any vertex as the +location of the height dimension lines by varying the exponent of +<code>[[seg_rot]]</code>. This is only one of many possible strategies. + + <p>The computation of <code>hm2</code> is a useful idiom for finding the +<a name="index-centroid-457"></a>centroid of a set of points. + + <p>The two radius marks are done similarly, so we present the code +without comment. +<a name="index-def-458"></a><a name="index-line-459"></a><a name="index-special-460"></a><a name="index-scale-461"></a><a name="index-arrows-462"></a> +<pre class="verbatim"> + % radius measurement marks + def gap [0,.2,0] % used to create small vertical gaps + + % first r1 + def up1 [0,3.1,0] % tick rises above dimension a little + def r1 ((p1) then [[seg_rot]]^-2) + [up1] + def r1c (r1) then scale([J]) + def r1t (r1) + [gap] + def r1b ((r1t) then scale([1,0,1])) + [gap] + line[arrows=<->](r1c)(r1) % dimension line + line(r1b)(r1t) % tick + def r1m ((r1) - (O) + (r1c) - (O)) / 2 + (O) % label position + special |\footnotesize\rput*#1{$r_1$}|(r1m) % label + + % same drill for r0, but must project down first + def up0 [0,2.7,0] + def r0 ((p0) then scale([1,0,1]) then [[seg_rot]]^-2) + [up0] + def r0c (r0) then scale([J]) + def r0t (r0) + [gap] + def r0b ((p0) then [[seg_rot]]^-2) + [gap] + line[arrows=<->](r0c)(r0) + line(r0b)(r0t) + def r0m ((r0) - (O) + (r0c) - (O)) / 2 + (O) + special |\footnotesize\rput*#1{$r_0$}|(r0m) +</pre> + + <p>The second drawing uses the same techniques. Only the method for +drawing the elliptical arc is new. Here is the code. +<a name="index-def-463"></a><a name="index-special-464"></a><a name="index-lay-465"></a> +<pre class="verbatim"> + def mid ((p00)-(O)+(p10)-(O)+(p11)-(O)+(p01)-(O))/4+(O) + special|\rput#1{\pscustom{ + \scale{1 1.3} + \psarc[arrowlength=.5]{->}{.25}{-60}{240}}}| + [lay=over](mid) +</pre> +We could have swept a point to make the arc with <code>sketch</code>, but +using a <code>PSTricks</code> custom graphic was simpler. Again we computed +the +<a name="index-centroid-466"></a>centroid of the quadrilateral by averaging points. Note that scaling +in Postscript distorts the arrowhead, but in this case the distortion +actually looks better in the projection of the slanted face. A +<code>sketch</code> arrowhead would not have been distorted. + + <p>The complete code for this example, which draws either figure +depending on the definition of the tag <code><labeled></code>, is included +in the <code>sketch</code> distribution in the file <span class="file">truncatedcone.sk</span>. + +<div class="node"> +<p><hr> +<a name="A-hierarchical-model"></a>Next: <a rel="next" accesskey="n" href="#Caveats">Caveats</a>, +Previous: <a rel="previous" accesskey="p" href="#A-technical-drawing">A technical drawing</a>, +Up: <a rel="up" accesskey="u" href="#Building-a-drawing">Building a drawing</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">4.3 A hierarchical model</h3> + +<p><a name="index-hierarchical-model-467"></a>While <code>sketch</code> was never meant to be a geometric modeling +language, it comes fairly close. The following example puts all we +have seen to work in a very simple model of the human hand. Start by +sweeping a line to make a truncated cone, which will be copied over +and over again to make the segments of fingers. +<a name="index-def-468"></a><a name="index-sweep-469"></a><a name="index-rotate-470"></a><a name="index-line-471"></a> +<pre class="verbatim"> + def O (0,0,0) % origin + def I [1,0,0] def J [0,1,0] def K [0,0,1] % canonical unit vectors + def segment { + def n_faces 8 + sweep { n_faces<>, rotate(360 / n_faces, [J]) } + line(proximal_rad, 0)(distal_rad, distal_len) + } +</pre> +In hand anatomy, <em>distal</em> is “at the tip” and <em>proximal</em> +is “in the area of the palm.” We have omitted all the scalar +constants. You can find them in <span class="file">hand.sk</span>, which is provided +in the <code>sketch</code> distribution. + + <p>We also need a prototypical sphere to use for the joints themselves. +<a name="index-def-472"></a><a name="index-sweep-473"></a><a name="index-rotate-474"></a> +<pre class="verbatim"> + def joint_sphere { + def n_joint_faces 8 + sweep [fillcolor=red] { n_joint_faces, rotate(360 / n_joint_faces, [J]) } + sweep { n_joint_faces, rotate(180 / n_joint_faces) } + (0, -joint_rad) + } +</pre> + + <p>We'll now design the index finger (number <!-- /@w -->1 in our notational +convention; finger <!-- /@w -->0 is the thumb). The distal rotation for the +finger applies only to the tip, so we define the following. +<a name="index-def-475"></a><a name="index-put-476"></a><a name="index-translate-477"></a><a name="index-rotate-478"></a><a name="index-scale-479"></a> +<pre class="verbatim"> + def distal_1 { + put { translate(joint_gap * joint_rad * [J]) + then rotate(distal_1_rot, [I]) + then translate((distal_len + joint_gap * joint_rad) * [J]) } + {segment} + put { rotate(distal_1_rot / 2, [I]) + then translate((distal_len + joint_gap * joint_rad) * [J]) } + {joint_sphere} + put { scale( [J] + proximal_distal_ratio * ([I]+[K]) ) } + {segment} + } +</pre> +The identifiers here are for size and location constants. The +exception is <code>distal_rot_1</code>. This rotation parameter models the +flexing of the finger tip. The first <code>put</code> makes a copy of the +finger segment that is translated upward +<a name="index-translation-transform-480"></a><a name="index-transform_002c-translation-481"></a>just far enough to make room +for the spherical joint. Then it applies the distal rotation. +<a name="index-rotation-transform-482"></a><a name="index-transform_002c-rotation-483"></a>Finally it translates the whole assembly upward again to make room for +the middle phlanges (the next bone toward the palm). The second +<code>put</code> positions the sphere. There is a rotation to place the +grid on the sphere surface at an nice angle, then a translation to the +base of the distal phlanges, which is also center of its rotation. +Finally, the last <code>put</code> positions the middle segment itself. + + <p>The middle joint is the next one down, with rotation angle +<code>middle_rot_1</code>. When this angle changes, we need all the objects +in <code>distal_1</code> to rotate as a unit. +<a name="index-rotation-transform-484"></a><a name="index-transform_002c-rotation-485"></a>This is the reasoning behind +the next definition. +<pre class="verbatim"> + def finger_1 { + put { translate(joint_gap * joint_rad * [J]) + then rotate(middle_1_rot, [I]) + then translate((middle_ratio * distal_len + + joint_gap * joint_rad) * [J]) } + {distal_1} + put { scale(proximal_distal_ratio) + then rotate(middle_1_rot / 2, [I]) + then translate((middle_ratio * distal_len + + joint_gap * joint_rad) * [J]) } + {joint_sphere} + put { scale( middle_ratio * [J] + + proximal_distal_ratio^2 * ([I]+[K]) ) } + {segment} + } +</pre> +This looks very similar to the previous definition, and it is. The +important difference is that rather than positioning and rotating a +single segment, we position and rotate the entire “assembly” defined +as <code>distal_1</code>. +<a name="index-rotation-transform-486"></a><a name="index-transform_002c-rotation-487"></a>The rest is just arithmetic to compute sizes and +positions that look nice. The last <code>put</code> places an appropriately +shaped segment that is the <em>proximal phlanges</em>, the bone that +joins the palm of the hand. This completes the finger itself. + + <p>All the other fingers are described identically to this one. We +account for the fact that real fingers are different sizes in the next +step, which is to build the entire hand. + + <p>The <code>hand</code> definition that follows includes a section for each +finger. We'll continue with finger <!-- /@w -->1 and omit all the others. +(Of note is that the thumb needs slightly special treatment—an extra +rotation to account for its opposing angle. This is clear in the full +source code.) Not surprisingly, the <code>hand</code> definition looks very +much like the previous two. It should be no surprise that when the +rotation parameter <code>meta_1_rot</code> changes, the entire finger +rotates! +<a name="index-rotation-transform-488"></a><a name="index-transform_002c-rotation-489"></a>There is an additional rotation that allows the fingers to spread +laterally. We say these joints of the proximal phlanges have two +<em>degrees of freedom</em>. The joints higher on the finger have only +one. Finally, each finger is scaled by a factor to lend it proportion. +<pre class="verbatim"> + def hand { + % finger 1 [all other fingers omitted] + def scale_1 .85 + put { scale(scale_1) + then translate((joint_gap * joint_rad) * [J]) + then rotate(meta_1_rot, [I]) + then rotate(-spread_rot, [K]) + then translate((proximal_1_loc) - (O)) } + {finger_1} + put { scale(scale_1 * proximal_distal_ratio^2) + then rotate(meta_1_rot / 2, [I]) + then rotate(-spread_rot, [K]) + then translate((proximal_1_loc) - (O)) } + {joint_sphere} + + % palm + sweep { 1, rotate(6, (0,15,0), [I]) } + put { rotate(-3, (0,15,0), [I]) } { + polygon(proximal_1_loc)(proximal_2_loc) + (proximal_3_loc)(proximal_4_loc) + (h5)(h6)(h6a)(h9)(h10) + polygon(h6a)(h7)(h8)(h9) + } } +</pre> +The last section of the definition creates the polytope for the palm +of the hand by <code>sweep</code>ing +<a name="index-swept-polygon-490"></a><a name="index-polygon-sweep-491"></a>a 10-sided polygon through a very short +arc (9 <!-- /@w -->degrees). This provides a wedge-shaped profile when viewed +from the side. The thick end of the wedge is the wrist. Because the +polygon is concave, it is split into into two convex shapes with nine +and four vertices. + + <p>We can now have fun positioning the hand by adjusting the various +rotation angles. The complete source includes definitions with +alternatives that include the following views and more. + +<div align="center"><img src="ex210.png" alt="ex210.png"><img src="ex220.png" alt="ex220.png"><img src="ex230.png" alt="ex230.png"><img src="ex240.png" alt="ex240.png"></div> + +<div class="node"> +<p><hr> +<a name="Caveats"></a>Previous: <a rel="previous" accesskey="p" href="#A-hierarchical-model">A hierarchical model</a>, +Up: <a rel="up" accesskey="u" href="#Building-a-drawing">Building a drawing</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">4.4 Caveats</h3> + +<p><code>Sketch</code> is a fairly powerful tool for drawing, but, just as with +TeX, the power to create beautiful results comes along with the +power to make mistakes. The following are some points where care is +necessary and where the current version of <code>sketch</code> is limited or +has known bugs. + +<ul class="menu"> +<li><a accesskey="1" href="#Limits-on-error-detection">Limits on error detection</a>: What sketch doesn't do. +<li><a accesskey="2" href="#Clipping">Clipping</a>: No clipping at present. +<li><a accesskey="3" href="#Hidden-surface-removal">Hidden surface removal</a>: Imperfections to fix. +</ul> + +<div class="node"> +<p><hr> +<a name="Limits-on-error-detection"></a>Next: <a rel="next" accesskey="n" href="#Clipping">Clipping</a>, +Previous: <a rel="previous" accesskey="p" href="#Caveats">Caveats</a>, +Up: <a rel="up" accesskey="u" href="#Caveats">Caveats</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">4.4.1 Limits on <code>sketch</code> error detection</h4> + +<p><code>Sketch</code> catches many kinds of errors, but not all. For example, +options that sketch does not recognize, even incorrect ones, are +quietly copied to <code>PSTricks</code> commands in the output. It is also +unfortunately easy to produce <code>sketch</code> inputs that lead to no +picture at all (improper vertex ordering causes everything to be +culled), to pictures that are too big or too small for <code>PSTricks</code> +to draw (due to limits of TeX math), and pictures that look nothing +like what was intended. A picture with one of these problems can be +difficult to “debug.” We offer the following suggestions. + <ul> +<li>Follow the suggested incremental development method described in +<a href="#Overview">Overview</a>. +<li>Always maintain one or two back-versions of a drawing so that it is +easy to fall back to a known-good increment. +<li>When using <code>perspective</code>, ensure all finally transformed objects +satisfy z<0 and, in fact, do not come very close to the origin +at all. +<li>Temporarily use <code>cull=false</code> to see where vertex ordering +problems lie. +<li>Use temporary changes of color of one or more objects to ensure that +your understanding of the scene geometry is correct. +<li>If <code>PSTricks</code> complains about something, inspect the output +directly for clues. +</ul> + +<div class="node"> +<p><hr> +<a name="Clipping"></a>Next: <a rel="next" accesskey="n" href="#Hidden-surface-removal">Hidden surface removal</a>, +Previous: <a rel="previous" accesskey="p" href="#Limits-on-error-detection">Limits on error detection</a>, +Up: <a rel="up" accesskey="u" href="#Caveats">Caveats</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">4.4.2 Clipping</h4> + +<p>The current version of <code>sketch</code> has no clipping +<a name="index-clipping-492"></a>operations. The entire scene is always drawn. This means that when a +perspective transform is employed, it is the user's responsibility to +make sure the entire scene remains in front of the viewer, the region +z<0. + +<div class="node"> +<p><hr> +<a name="Hidden-surface-removal"></a>Previous: <a rel="previous" accesskey="p" href="#Clipping">Clipping</a>, +Up: <a rel="up" accesskey="u" href="#Caveats">Caveats</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h4 class="subsection">4.4.3 Hidden surface removal and polygon splitting</h4> + +<p><code>Sketch</code> uses the <dfn>depth sort algorithm</dfn> +<a name="index-depth-sort-493"></a><a name="index-hidden-surface-algorithm-494"></a>for hidden surface removal. This is a very old technique due to +Newell.<a rel="footnote" href="#fn-3" name="fnd-3"><sup>3</sup></a> It is +generally regarded as too slow for real time graphics, but it is +ideal for our purpose where speed is not very important.<a rel="footnote" href="#fn-4" name="fnd-4"><sup>4</sup></a> + + <p>The depth sort algorithm merely sorts objects on a key of increasing +z-coordinate, equivalent to decreasing depth. Objects are then +drawn in the sorted sequence so that those at the rear of the scene +are overwritten by those closer to the viewer. Since this is also +how oil painters practice their art, depth sort is sometimes called +“the painter's algorithm.” + + <p>In some cases it is impossible to strictly order polygons according to +depth. Moreover, even if a correct depth ordering exists, the +computation needed to find it may be too complex and slow. In these +cases, <code>sketch</code> splits +<a name="index-splitting_002c-line-and-surface-495"></a>one or more polygons into pieces. The +expectation is that the new, smaller polygons will be simpler to +order. <code>Sketch</code> uses a <acronym title="binary space partition">BSP</acronym> (binary space partition) +<a name="index-binary-space-partition-496"></a><a name="index-BSP_002c-binary-space-partition-497"></a>to handle the splitting operation. + +<ul class="menu"> +<li><a accesskey="1" href="#Statistics">Statistics</a>: Performance numbers on depth sort. +<li><a accesskey="2" href="#Bugs-and-anomalies">Bugs and anomalies</a>: Imperfections in this implementation. +</ul> + +<div class="node"> +<p><hr> +<a name="Statistics"></a>Next: <a rel="next" accesskey="n" href="#Bugs-and-anomalies">Bugs and anomalies</a>, +Previous: <a rel="previous" accesskey="p" href="#Hidden-surface-removal">Hidden surface removal</a>, +Up: <a rel="up" accesskey="u" href="#Hidden-surface-removal">Hidden surface removal</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">4.4.3.1 Statistics</h5> + +<p>For the curious, <code>sketch</code> writes one line of depth sort +statistics. Here is an example for a large collection of triangles. +<pre class="verbatim"> + remark, node=34824 probe=581.9 swap=5 split=2 (in=4 out=6) ols=24851/0 +</pre> +It means that 34,824 objects were depth sorted after culling. +For each, an average of 581.9 others had to be checked to +ensure that the initial, approximate ordering was correct. Among all +these checks, only 5 resulted in swaps to reorder the initial +sort. In two cases, a correct ordering could not be determined, so +binary space partitions +<a name="index-binary-space-partition-498"></a>were constructed for splitting. A total of 4 +objects (triangles in this case) were inserted in the partitions, and +6 polygons were produced. Finally, 24,851 “last +resort” polygon overlap checks were performed after simpler, faster +checks failed to yield conclusive results. The final /0 is for +line-polygon overlap checks. For comparison, the statistics for the +last figure in <a href="#Overview">Overview</a> follow. +<pre class="verbatim"> + remark, node=27 probe=14.6 swap=36 split=15 (in=30 out=45) ols=0/69 +</pre> +Note that there was proportionally much more swapping and splitting +activity in this highly connected scene. + +<div class="node"> +<p><hr> +<a name="Bugs-and-anomalies"></a>Previous: <a rel="previous" accesskey="p" href="#Statistics">Statistics</a>, +Up: <a rel="up" accesskey="u" href="#Hidden-surface-removal">Hidden surface removal</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h5 class="subsubsection">4.4.3.2 Bugs and anomalies</h5> + +<p>Polygon and line splitting can both cause anomalies in the output. +<code>PSTricks</code> dash patterns, specified with <code>linestyle=dashed</code>, +<a name="index-linestyle-499"></a>can be disrupted by splitting. This occurs when the depth sort +<a name="index-depth-sort-500"></a>gives up too early and splits a line where it is not really +necessary. +A workaround is to use gray or finely dotted +lines instead. If your drawing is small, you can also edit the +<code>sketch</code> output by hand to merge the pieces of the offending +line. + + <p>Another anomaly is tiny (or in degenerate cases not-so-tiny) notches +in the lines that border split polygons. These derive from the way +each polygon is painted: first, all pixels within the boundary are +<dfn>filled</dfn> with color (perhaps white), then the same boundary is +<dfn>stroked</dfn> (a Postscript term) with a line. The result is that +half the line lies inside the boundary and half outside, while the +Painter's algorithm assumes the polygon lies entirely within its +boundary. The notches are due to one polygon fill operation +overwriting the already-drawn inside of the border of another +polygon.<a rel="footnote" href="#fn-5" name="fnd-5"><sup>5</sup></a> One workaround is to make +border lines very thin. In fact <code>linewidth=0pt</code> is guaranteed to +eliminate this problem, though this results in the thinnest line your +output device can draw, which is usually too thin. You might get +lucky by merely reordering things in the input file, which is likely +to move the splits to different places. The only sure-fire solution +is pretty terrible: custom fit <code>special</code> overlay lines (with +<code>\psline</code>) to cover the notches. + + <p>Polygon splitting also breaks <code>PSTricks</code> hatch patterns. The +only known workaround is to substitute a solid fill for the hatch. + +<div class="node"> +<p><hr> +<a name="Command-line"></a>Next: <a rel="next" accesskey="n" href="#Installing-sketch">Installing sketch</a>, +Previous: <a rel="previous" accesskey="p" href="#Building-a-drawing">Building a drawing</a>, +Up: <a rel="up" accesskey="u" href="#Top">Top</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h2 class="chapter">5 Command line</h2> + +<p><a name="index-command-line_002c-_0040code_007bsketch_007d-501"></a><strong>Synopsis:</strong> +<pre class="example"> sketch [-h][-V x.y][-v][-b][-d][t doctmp][-T[u|e][p[P|T][L|C]]][-o output.tex] + [-D <var>tag</var> ...] input1.sk [-U <var>tag</var> ...] input2.sk ... +</pre> + <p class="noindent"><strong>Description</strong> +Processes the <code>sketch</code> input files in order to produce +<code>PSTricks</code> output code suitable for inclusion in a TeX or +LaTeX document. + +<p class="noindent"><strong>Options:</strong> +<a name="index-options_002c-command-line-502"></a><a name="index-command-line-options-503"></a> + <dl> +<dt><code>-h</code><dd>Print a short catalog of options. +<br><dt><code>-V</code><dd>Set the <code>PSTricks</code> version assumed for output purposes to +<code>x.y</code>, for example 1.19. Usually needed only if your +<code>PSTricks</code> is old compared to your <code>sketch</code>. Use +<code>-v</code> to see what <code>sketch</code> assumes by default. +<br><dt><code>-v</code><dd>Print version information to standard output, including the version +of <code>PSTricks</code> assumed for output (can be changed with <code>-V</code> above). +<br><dt><code>-b</code><dd>Use a BSP +<a name="index-binary-space-partition-504"></a><a name="index-BSP_002c-binary-space-partition-505"></a>(See <a href="#Hidden-surface-removal">Hidden surface removal</a>.) for +<em>all</em> hidden surface removal rather than the default, which is +the depth sort algorithm with BSPs used only for cycle resolution. +This may produce correct output in certain degenerate cases where the +depth sort cannot, but it also leads to many gratuitous splits, hence +more anomalies <a href="#Bugs-and-anomalies">Bugs and anomalies</a> and big output files. +<br><dt><code>-d</code><dd>Run <code>sketch</code>'s parser in debugging mode. This is primarily for +development. +<br><dt><code>-t</code><dd>Use contents of file <span class="file">doctmp</span> as a document template +<a name="index-document-template-506"></a><a name="index-template_002c-document-507"></a>in which to enclose <code>PSTricks</code> output code. The code is inserted +in place of the first instance of the escape string +<tt>%%SKETCH_OUTPUT%%</tt>. +<br><dt><code>-T</code><dd>Causes <code>PSTricks</code> output to be enclosed in default US document +template text. Option <span class="option">-Tu</span> is a synonym. Option <span class="option">-Te</span> +causes the Euro standard document template to be used. A <span class="option">p</span> +appended to any of these options causes the respective default +<code>PSTricks</code> document template to be printed to standard output. An +appended <span class="option">P</span> is a synonym. An appended <span class="option">T</span> causes the +the <code>TikZ/PGF</code> template to be printed. An appended <span class="option">L</span> +prints the LaTeX version of the document template, a synonym for +the default. A <span class="option">C</span> prints the <code>ConTeXt</code> template. +<br><dt><code>-o</code><dd>Use <span class="file">output.tex</span> as the output file. The default is standard output. +<br><dt><code>-D</code><dd>Define a tag +<a name="index-tag-definition-508"></a><a name="index-definition_002c-tag-509"></a>for purposes of selecting definition alternatives. +See <a href="#Definitions">Definitions</a>. The definition applies for all input files that +follow unless the tag is undefined with <span class="option">-U</span>. +<br><dt><code>inputi.sk</code><dd>Input files, read in the sequence they are given. +<br><dt><code>-U</code><dd>Un-define a tag for purposes of selecting definition alternatives. +</dl> + +<div class="node"> +<p><hr> +<a name="Installing-sketch"></a>Next: <a rel="next" accesskey="n" href="#Index-of-syntax">Index of syntax</a>, +Previous: <a rel="previous" accesskey="p" href="#Command-line">Command line</a>, +Up: <a rel="up" accesskey="u" href="#Top">Top</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h2 class="chapter">6 Building and installing <code>sketch</code></h2> + +<p><code>Sketch</code> is so small that compiling by brute force is probably +best. The following command ought to do the trick on any +systems where <code>gcc</code> is installed. Make sure to first change +current directories to the place where you have unpacked the sources. +<pre class="example"> gcc *.c -o sketch.exe -lm +</pre> + <p class="noindent">The <span class="samp">.exe</span> at the end is necessary for Windows systems. Drop it +if your system is some version of Unix. Other C compilers ought +to work as just as well. For example, +<pre class="example"> cl *.c -o sketch.exe +</pre> + <p class="noindent">is the correct command for many versions of MS Visual C. In the +latest versions, Microsoft has deprecated the <code>-o</code> option and, by +default, does not define the <code>__STDC__</code> macro. This causes +problems with some versions of <code>flex</code>, <code>bison</code>, <code>lex</code>, +and <code>yacc</code>, which are used to create the <code>sketch</code> scanner +and parser. It's nearly always possible to find a set of options that +compiles with no errors or warnings, and this means <code>sketch</code> is +<em>very</em> likely to work correctly. For example, the Visual C++ +2005 Express Edition compiler (available free of charge from the +Microsoft web site), <code>flex</code> version 2.5.4, and <code>bison</code> +version 2.1 build error-free with +<pre class="example"> cl -DYY_NEVER_INTERACTIVE=1 -Za -Ox -Fesketch.exe *.c +</pre> + <p>For purists, there is also a <code>makefile</code> compatible with GNU +<code>make</code> and <code>gcc</code>. The command +<pre class="example"> make +</pre> + <p class="noindent">will build the executable, including the rebuilding of the scanner and +parser with <code>flex</code> and <code>bison</code> if you have changed +<span class="file">sketch.l</span> or <code>sketch.y</code> respectively. + + <p>To build this document in all its myriad forms (assuming you have the +necessary conversion programs on your system), use +<pre class="example"> make docs +</pre> + <p class="noindent">The possibilities are listed in this following table. + <p><table summary=""><tr align="left"><th valign="top">Format </th><th valign="top">Converter </th><th valign="top">Pictures </th><th valign="top">Description +<br></th></tr><tr align="left"><td valign="top">manual.info + </td><td valign="top">makeinfo </td><td valign="top"><span class="file">.txt</span> </td><td valign="top"><acronym>GNU</acronym> Info. +<br></td></tr><tr align="left"><td valign="top">manual.dvi + </td><td valign="top">texi2dvi </td><td valign="top"><span class="file">.eps</span> </td><td valign="top">TeX typeset output. +<br></td></tr><tr align="left"><td valign="top">manual.ps + </td><td valign="top">texi2dvi,dvips </td><td valign="top"><span class="file">.eps</span> </td><td valign="top">Postscript. +<br></td></tr><tr align="left"><td valign="top">manual.pdf + </td><td valign="top">texi2dvi </td><td valign="top"><span class="file">.pdf</span> </td><td valign="top">Adobe PDF. +<br></td></tr><tr align="left"><td valign="top">manual.html + </td><td valign="top">makeinfo </td><td valign="top"><span class="file">.png</span> </td><td valign="top">A single web page. +<br></td></tr><tr align="left"><td valign="top">manual/index.html + </td><td valign="top">makeinfo </td><td valign="top"><span class="file">.png</span> </td><td valign="top">Linked web pages, one per node. + <br></td></tr></table> + +<div class="node"> +<p><hr> +<a name="Index-of-syntax"></a>Next: <a rel="next" accesskey="n" href="#Index">Index</a>, +Previous: <a rel="previous" accesskey="p" href="#Installing-sketch">Installing sketch</a>, +Up: <a rel="up" accesskey="u" href="#Top">Top</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h2 class="unnumbered">Index of syntax</h2> + +<ul class="index-sx" compact> +<li><a href="#index-_0027x_0040r_007b_002c_007d-_0027y_0040r_007b_002c-and-_007d_0027z-223"><code>'x</code><span class="roman">,</span><code> 'y</code><span class="roman">, and </span><code>'z</code></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-_0027x_0040r_007b_002c_007d-_0027y_0040r_007b_002c-and-_007d_0027z-158"><code>'x</code><span class="roman">,</span><code> 'y</code><span class="roman">, and </span><code>'z</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li> +<li><a href="#index-_0028-_0029_0040r_007b_002c-grouping_007d-229"><code>( )</code><span class="roman">, grouping</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-_0028foo_0029_0040r_007b_002c-point-reference_007d-346"><code>(foo)</code><span class="roman">, point reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-_0028foo_0029_0040r_007b_002c-point-reference_007d-38"><code>(foo)</code><span class="roman">, point reference</span></a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-_002a_0040r_007b_002c-multiplication-operator_007d-232"><code>*</code><span class="roman">, multiplication operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-_002b_0040r_007b_002c-plus-operator_007d-214"><code>+</code><span class="roman">, plus operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-_002d_0040r_007b_002c-minus-operator_007d-215"><code>-</code><span class="roman">, minus operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-_002d_0040r_007b_002c-unary-minus-operator_007d-235"><code>-</code><span class="roman">, unary minus operator</span></a>: <a href="#Unary-forms">Unary forms</a></li> +<li><a href="#index-_002e_0040r_007b_002c-dot-operator_007d-217"><code>.</code><span class="roman">, dot operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-_002f_0040r_007b_002c-division-operator_007d-221"><code>/</code><span class="roman">, division operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-288"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-320"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li> +<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-297"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-136"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-100"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Point-sweeps">Point sweeps</a></li> +<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-276"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Sweeps">Sweeps</a></li> +<li><a href="#index-_003c_003e_0040r_007b_002c-closure-tag_007d-280"><code><></code><span class="roman">, closure tag</span></a>: <a href="#Swept-points">Swept points</a></li> +<li><a href="#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-341"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="#Forms-of-definitions">Forms of definitions</a></li> +<li><a href="#index-_003cfoo_003e_0040r_007b_002c-tag-reference_007d-364"><code><foo></code><span class="roman">, tag reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-_005b_005b-_005d_005b-_005d_005b-_005d_005b-_005d_005d_0040r_007b_002c-transform-literal_007d-210"><code>[[ ][ ][ ][ ]]</code><span class="roman">, transform literal</span></a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-405"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-352"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-_005b_005bfoo_005d_005d_0040r_007b_002c-transform-reference_007d-408"><code>[[foo]]</code><span class="roman">, transform reference</span></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-_005bfoo_002c_002e_002e_002e_002cbar_005d_0040r_007b_002c-multiple-options-reference_007d-361"><code>[foo,...,bar]</code><span class="roman">, multiple options reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-358"><code>[foo]</code><span class="roman">, options reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-_005bfoo_005d_0040r_007b_002c-options-reference_007d-150"><code>[foo]</code><span class="roman">, options reference</span></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-349"><code>[foo]</code><span class="roman">, vector reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-_005bfoo_005d_0040r_007b_002c-vector-reference_007d-120"><code>[foo]</code><span class="roman">, vector reference</span></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-_005e_0040r_007b_002c-exponentiation-operator_007d-218"><code>^</code><span class="roman">, exponentiation operator</span></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-arrows-155"><code>arrows</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li> +<li><a href="#index-arrows-462"><code>arrows</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-arrows-427"><code>arrows</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-arrows-445"><code>arrows</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-atan2-241"><code>atan2</code></a>: <a href="#Unary-forms">Unary forms</a></li> +<li><a href="#index-camera-375"><code>camera</code></a>: <a href="#Camera">Camera</a></li> +<li><a href="#index-context-397"><code>context</code></a>: <a href="#Language">Language</a></li> +<li><a href="#index-cos-240"><code>cos</code></a>: <a href="#Unary-forms">Unary forms</a></li> +<li><a href="#index-cull-254"><code>cull</code></a>: <a href="#Internal-options">Internal options</a></li> +<li><a href="#index-cull-437"><code>cull</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-cull-45"><code>cull</code></a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-cull-251"><code>cull</code></a>: <a href="#Transparency">Transparency</a></li> +<li><a href="#index-cull-113"><code>cull</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-cull-371"><code>cull</code></a>: <a href="#Global-options">Global options</a></li> +<li><a href="#index-curve-264"><code>curve</code></a>: <a href="#Curves">Curves</a></li> +<li><a href="#index-def-152"><code>def</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li> +<li><a href="#index-def-424"><code>def</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-def-109"><code>def</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-def-34"><code>def</code></a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-def-475"><code>def</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-def-412"><code>def</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-def-472"><code>def</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-def-61"><code>def</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-def-468"><code>def</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-def-402"><code>def</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-def-463"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-def-138"><code>def</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-def-458"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-def-102"><code>def</code></a>: <a href="#Point-sweeps">Point sweeps</a></li> +<li><a href="#index-def-124"><code>def</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-def-443"><code>def</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-dots-262"><code>dots</code></a>: <a href="#Dots">Dots</a></li> +<li><a href="#index-fill-opacity-250"><code>fill opacity</code></a>: <a href="#Transparency">Transparency</a></li> +<li><a href="#index-fill-style-245"><code>fill style</code></a>: <a href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li> +<li><a href="#index-fillcolor-66"><code>fillcolor</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-fillcolor-411"><code>fillcolor</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-fillcolor-145"><code>fillcolor</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-frame-385"><code>frame</code></a>: <a href="#Frame">Frame</a></li> +<li><a href="#index-framesep-390"><code>framesep</code></a>: <a href="#Frame">Frame</a></li> +<li><a href="#index-global-365"><code>global</code></a>: <a href="#Global-environment">Global environment</a></li> +<li><a href="#index-input-169"><code>input</code></a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-inverse-242"><code>inverse</code></a>: <a href="#Unary-forms">Unary forms</a></li> +<li><a href="#index-language-393"><code>language</code></a>: <a href="#Language">Language</a></li> +<li><a href="#index-latex-396"><code>latex</code></a>: <a href="#Language">Language</a></li> +<li><a href="#index-lay-272"><code>lay</code></a>: <a href="#Specials">Specials</a></li> +<li><a href="#index-lay-373"><code>lay</code></a>: <a href="#Global-options">Global options</a></li> +<li><a href="#index-lay-255"><code>lay</code></a>: <a href="#Internal-options">Internal options</a></li> +<li><a href="#index-lay-56"><code>lay</code></a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-lay-442"><code>lay</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-line-63"><code>line</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-line-432"><code>line</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-line-316"><code>line</code></a>: <a href="#Swept-blocks">Swept blocks</a></li> +<li><a href="#index-line-471"><code>line</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-line-263"><code>line</code></a>: <a href="#Lines">Lines</a></li> +<li><a href="#index-line-25"><code>line</code></a>: <a href="#Drawing-options">Drawing options</a></li> +<li><a href="#index-line-444"><code>line</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-line-144"><code>line</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-line-438"><code>line</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-line-154"><code>line</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li> +<li><a href="#index-line-style-246"><code>line style</code></a>: <a href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li> +<li><a href="#index-linecolor-389"><code>linecolor</code></a>: <a href="#Frame">Frame</a></li> +<li><a href="#index-linecolor-65"><code>linecolor</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-linecolor-429"><code>linecolor</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-linestyle-448"><code>linestyle</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-linestyle-388"><code>linestyle</code></a>: <a href="#Frame">Frame</a></li> +<li><a href="#index-linestyle-499"><code>linestyle</code></a>: <a href="#Bugs-and-anomalies">Bugs and anomalies</a></li> +<li><a href="#index-linestyle-430"><code>linestyle</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-linewidth-387"><code>linewidth</code></a>: <a href="#Frame">Frame</a></li> +<li><a href="#index-linewidth-114"><code>linewidth</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-linewidth-446"><code>linewidth</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-linewidth-428"><code>linewidth</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-opacity-249"><code>opacity</code></a>: <a href="#Transparency">Transparency</a></li> +<li><a href="#index-perspective-200"><code>perspective</code></a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-picturebox-377"><code>picturebox</code></a>: <a href="#Picture-box">Picture box</a></li> +<li><a href="#index-point-list-260"><code>point list</code></a>: <a href="#Internal-options">Internal options</a></li> +<li><a href="#index-polygon-265"><code>polygon</code></a>: <a href="#Polygons">Polygons</a></li> +<li><a href="#index-polygon-317"><code>polygon</code></a>: <a href="#Swept-blocks">Swept blocks</a></li> +<li><a href="#index-polygon-32"><code>polygon</code></a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-polygon-19"><code>polygon</code></a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-polygon-413"><code>polygon</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-polygon-153"><code>polygon</code></a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li> +<li><a href="#index-polygon-64"><code>polygon</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-project-211"><code>project</code></a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-pstricks-394"><code>pstricks</code></a>: <a href="#Language">Language</a></li> +<li><a href="#index-put-129"><code>put</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-put-329"><code>put</code></a>: <a href="#Puts">Puts</a></li> +<li><a href="#index-put-62"><code>put</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-put-476"><code>put</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-repeat-130"><code>repeat</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-repeat-326"><code>repeat</code></a>: <a href="#Repeats">Repeats</a></li> +<li><a href="#index-repeat-139"><code>repeat</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-repeat-421"><code>repeat</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-repeat-88"><code>repeat</code></a>: <a href="#Repeated-objects">Repeated objects</a></li> +<li><a href="#index-rotate-67"><code>rotate</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-rotate-478"><code>rotate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-rotate-435"><code>rotate</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-rotate-474"><code>rotate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-rotate-140"><code>rotate</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-rotate-111"><code>rotate</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-rotate-89"><code>rotate</code></a>: <a href="#Repeated-objects">Repeated objects</a></li> +<li><a href="#index-rotate-182"><code>rotate</code></a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-rotate-94"><code>rotate</code></a>: <a href="#Swept-objects">Swept objects</a></li> +<li><a href="#index-rotate-103"><code>rotate</code></a>: <a href="#Point-sweeps">Point sweeps</a></li> +<li><a href="#index-rotate-422"><code>rotate</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-rotate-470"><code>rotate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-rotate-126"><code>rotate</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-scale-479"><code>scale</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-scale-461"><code>scale</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-scale-188"><code>scale</code></a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-scale-454"><code>scale</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-set-368"><code>set</code></a>: <a href="#Global-options">Global options</a></li> +<li><a href="#index-sin-239"><code>sin</code></a>: <a href="#Unary-forms">Unary forms</a></li> +<li><a href="#index-special-48"><code>special</code></a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-special-268"><code>special</code></a>: <a href="#Specials">Specials</a></li> +<li><a href="#index-special-464"><code>special</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-special-431"><code>special</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-special-456"><code>special</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-split-256"><code>split</code></a>: <a href="#Internal-options">Internal options</a></li> +<li><a href="#index-split-372"><code>split</code></a>: <a href="#Global-options">Global options</a></li> +<li><a href="#index-sqrt-238"><code>sqrt</code></a>: <a href="#Unary-forms">Unary forms</a></li> +<li><a href="#index-sweep-273"><code>sweep</code></a>: <a href="#Sweeps">Sweeps</a></li> +<li><a href="#index-sweep-436"><code>sweep</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-sweep-125"><code>sweep</code></a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-sweep-469"><code>sweep</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-sweep-110"><code>sweep</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-sweep-143"><code>sweep</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-sweep-104"><code>sweep</code></a>: <a href="#Point-sweeps">Point sweeps</a></li> +<li><a href="#index-sweep-93"><code>sweep</code></a>: <a href="#Swept-objects">Swept objects</a></li> +<li><a href="#index-then-69"><code>then</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-then-141"><code>then</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-then-231"><code>then</code></a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-tikz-395"><code>tikz</code></a>: <a href="#Language">Language</a></li> +<li><a href="#index-translate-185"><code>translate</code></a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-translate-477"><code>translate</code></a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-translate-84"><code>translate</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-translate-112"><code>translate</code></a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-translate-142"><code>translate</code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-translate-423"><code>translate</code></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-translate-68"><code>translate</code></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-translate-90"><code>translate</code></a>: <a href="#Repeated-objects">Repeated objects</a></li> +<li><a href="#index-transpalpha-248"><code>transpalpha</code></a>: <a href="#Transparency">Transparency</a></li> +<li><a href="#index-unit-453"><code>unit</code></a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-unit-237"><code>unit</code></a>: <a href="#Unary-forms">Unary forms</a></li> +<li><a href="#index-view-207"><code>view</code></a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-414"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-315"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Swept-blocks">Swept blocks</a></li> +<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-323"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Blocks">Blocks</a></li> +<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-71"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-_0040_007b-_0040_007d_0040r_007b_002c-block-drawable_007d-131"><code>{ }</code><span class="roman">, block drawable</span></a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-419"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-355"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-415"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-_0040_007bfoo_0040_007d_0040r_007b_002c-drawable-reference_007d-79"><code>{foo}</code><span class="roman">, drawable reference</span></a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-_007c_0040math_007bX_007d_007c_0040r_007b_002c-magnitude-operator_007d-236"><code>|X|</code><span class="roman">, magnitude operator</span></a>: <a href="#Unary-forms">Unary forms</a></li> + </ul><div class="node"> +<p><hr> +<a name="Index"></a>Previous: <a rel="previous" accesskey="p" href="#Index-of-syntax">Index of syntax</a>, +Up: <a rel="up" accesskey="u" href="#Top">Top</a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h2 class="unnumbered">Index of concepts</h2> + + + +<ul class="index-cp" compact> +<li><a href="#index-affine-arithmetic-151">affine arithmetic</a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li> +<li><a href="#index-affine-arithmetic-451">affine arithmetic</a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-alternatives_002c-definition-336">alternatives, definition</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li> +<li><a href="#index-argument_002c-special-51">argument, special</a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-argument_002c-special-271">argument, special</a>: <a href="#Specials">Specials</a></li> +<li><a href="#index-associativity_002c-operator-227">associativity, operator</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-axis_002c-rotation-82">axis, rotation</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-back-face-43">back face</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-baseline-fraction-379">baseline fraction</a>: <a href="#Picture-box">Picture box</a></li> +<li><a href="#index-binary-form-212">binary form</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-binary-space-partition-504">binary space partition</a>: <a href="#Command-line">Command line</a></li> +<li><a href="#index-binary-space-partition-496">binary space partition</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li> +<li><a href="#index-binary-space-partition-498">binary space partition</a>: <a href="#Statistics">Statistics</a></li> +<li><a href="#index-block-314">block</a>: <a href="#Swept-blocks">Swept blocks</a></li> +<li><a href="#index-block-322">block</a>: <a href="#Blocks">Blocks</a></li> +<li><a href="#index-block-70">block</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-block-sweep-313">block sweep</a>: <a href="#Swept-blocks">Swept blocks</a></li> +<li><a href="#index-body-polygon-290">body polygon</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-body-polygon-306">body polygon</a>: <a href="#Swept-polygons">Swept polygons</a></li> +<li><a href="#index-body-polygon-258">body polygon</a>: <a href="#Internal-options">Internal options</a></li> +<li><a href="#index-bounding-box-380">bounding box</a>: <a href="#Picture-box">Picture box</a></li> +<li><a href="#index-BSP_002c-binary-space-partition-505">BSP, binary space partition</a>: <a href="#Command-line">Command line</a></li> +<li><a href="#index-BSP_002c-binary-space-partition-497">BSP, binary space partition</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li> +<li><a href="#index-camera-374">camera</a>: <a href="#Camera">Camera</a></li> +<li><a href="#index-center-of-rotation-121">center of rotation</a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-center-of-rotation-59">center of rotation</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-centroid-457">centroid</a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-clipping-492">clipping</a>: <a href="#Clipping">Clipping</a></li> +<li><a href="#index-clipping-383">clipping</a>: <a href="#Picture-box">Picture box</a></li> +<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-284">closure tag, <code><></code></a>: <a href="#Swept-points">Swept points</a></li> +<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-101">closure tag, <code><></code></a>: <a href="#Point-sweeps">Point sweeps</a></li> +<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-298">closure tag, <code><></code></a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-137">closure tag, <code><></code></a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-277">closure tag, <code><></code></a>: <a href="#Sweeps">Sweeps</a></li> +<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-281">closure tag, <code><></code></a>: <a href="#Swept-points">Swept points</a></li> +<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-289">closure tag, <code><></code></a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-closure-tag_002c-_0040code_007b_003c_003e_007d-321">closure tag, <code><></code></a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li> +<li><a href="#index-command-line-option-13">command line option</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-command-line-options-503">command line options</a>: <a href="#Command-line">Command line</a></li> +<li><a href="#index-command-line_002c-_0040code_007bsketch_007d-7">command line, <code>sketch</code></a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-command-line_002c-_0040code_007bsketch_007d-501">command line, <code>sketch</code></a>: <a href="#Command-line">Command line</a></li> +<li><a href="#index-comments-166">comments</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-comments-40">comments</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-constructor-181">constructor</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-coordinate-system_002c-right_002dhanded-3">coordinate system, right-handed</a>: <a href="#Introduction-by-example">Introduction by example</a></li> +<li><a href="#index-counter_002dclockwise-polygon-vertex-order-20">counter-clockwise polygon vertex order</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-culling-42">culling</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-culling-23">culling</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-culling-294">culling</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-culling-44">culling</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-declarative-language-163">declarative language</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-definition-330">definition</a>: <a href="#Definitions">Definitions</a></li> +<li><a href="#index-definition-33">definition</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-definition-with-alternatives-335">definition with alternatives</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li> +<li><a href="#index-definition_002c-drawable-75">definition, drawable</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-definition_002c-options-147">definition, options</a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-definition_002c-point-35">definition, point</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-definition_002c-scalar-97">definition, scalar</a>: <a href="#Swept-objects">Swept objects</a></li> +<li><a href="#index-definition_002c-simple-334">definition, simple</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li> +<li><a href="#index-definition_002c-tag-331">definition, tag</a>: <a href="#Definitions">Definitions</a></li> +<li><a href="#index-definition_002c-tag-509">definition, tag</a>: <a href="#Command-line">Command line</a></li> +<li><a href="#index-definition_002c-tag-338">definition, tag</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li> +<li><a href="#index-definition_002c-transform-404">definition, transform</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-definition_002c-vector-117">definition, vector</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-depth-sort-257">depth sort</a>: <a href="#Internal-options">Internal options</a></li> +<li><a href="#index-depth-sort-500">depth sort</a>: <a href="#Bugs-and-anomalies">Bugs and anomalies</a></li> +<li><a href="#index-depth-sort-493">depth sort</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li> +<li><a href="#index-document-template-15">document template</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-document-template-506">document template</a>: <a href="#Command-line">Command line</a></li> +<li><a href="#index-drawable-261">drawable</a>: <a href="#Drawables">Drawables</a></li> +<li><a href="#index-drawable-74">drawable</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-drawable-definition-76">drawable definition</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-drawable-reference-353">drawable reference</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-end-polygon-308">end polygon</a>: <a href="#Swept-polygons">Swept polygons</a></li> +<li><a href="#index-end-polygon-299">end polygon</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-faces-29">faces</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-faces-108">faces</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-file_002c-include-168">file, include</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-file_002c-input-160">file, input</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-frame-box-384">frame box</a>: <a href="#Frame">Frame</a></li> +<li><a href="#index-global-options-367">global options</a>: <a href="#Global-options">Global options</a></li> +<li><a href="#index-global-options-27">global options</a>: <a href="#Drawing-options">Drawing options</a></li> +<li><a href="#index-helix-115">helix</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-helix-46">helix</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-hello-world-5">hello world</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-hidden-surface-algorithm-441">hidden surface algorithm</a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-hidden-surface-algorithm-9">hidden surface algorithm</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-hidden-surface-algorithm-57">hidden surface algorithm</a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-hidden-surface-algorithm-494">hidden surface algorithm</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li> +<li><a href="#index-hidden-surface-algorithm-203">hidden surface algorithm</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-hierarchical-model-467">hierarchical model</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-identifiers-170">identifiers</a>: <a href="#Identifiers">Identifiers</a></li> +<li><a href="#index-include-file-167">include file</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-input-file-159">input file</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-internal-option-54">internal option</a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-internal-options-253">internal options</a>: <a href="#Internal-options">Internal options</a></li> +<li><a href="#index-internal-options-370">internal options</a>: <a href="#Global-options">Global options</a></li> +<li><a href="#index-keywords-171">keywords</a>: <a href="#Key-and-reserved-words">Key and reserved words</a></li> +<li><a href="#index-labels-47">labels</a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-language_002c-declarative-164">language, declarative</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-language_002c-output-391">language, output</a>: <a href="#Language">Language</a></li> +<li><a href="#index-language_002c-scene-description-162">language, scene description</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-lexical-scope-324">lexical scope</a>: <a href="#Blocks">Blocks</a></li> +<li><a href="#index-lexical-scope-72">lexical scope</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-line-sweep-287">line sweep</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-line-sweep-105">line sweep</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-line-sweep-440">line sweep</a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-literal_002c-point-176">literal, point</a>: <a href="#Point-and-vector-literals">Point and vector literals</a></li> +<li><a href="#index-literal_002c-scalar-174">literal, scalar</a>: <a href="#Scalar-literals">Scalar literals</a></li> +<li><a href="#index-literal_002c-transform-180">literal, transform</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-literal_002c-vector-178">literal, vector</a>: <a href="#Point-and-vector-literals">Point and vector literals</a></li> +<li><a href="#index-nesting_002c-swept-object-128">nesting, swept object</a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-one_002doperand-form-234">one-operand form</a>: <a href="#Unary-forms">Unary forms</a></li> +<li><a href="#index-operator-associativity-226">operator associativity</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-operator-precedence-225">operator precedence</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-option-24">option</a>: <a href="#Drawing-options">Drawing options</a></li> +<li><a href="#index-option_002c-command-line-14">option, command line</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-option_002c-internal-55">option, internal</a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-options-243">options</a>: <a href="#Options">Options</a></li> +<li><a href="#index-options-definition-148">options definition</a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-options-multiple-reference-359">options multiple reference</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-options-reference-356">options reference</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-options_002c-command-line-502">options, command line</a>: <a href="#Command-line">Command line</a></li> +<li><a href="#index-options_002c-global-366">options, global</a>: <a href="#Global-options">Global options</a></li> +<li><a href="#index-options_002c-global-26">options, global</a>: <a href="#Drawing-options">Drawing options</a></li> +<li><a href="#index-options_002c-internal-369">options, internal</a>: <a href="#Global-options">Global options</a></li> +<li><a href="#index-options_002c-internal-252">options, internal</a>: <a href="#Internal-options">Internal options</a></li> +<li><a href="#index-options_002c-sweep-295">options, sweep</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-options_002c-sweep-285">options, sweep</a>: <a href="#Swept-points">Swept points</a></li> +<li><a href="#index-options_002c-sweep-304">options, sweep</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-options_002c-sweep-135">options, sweep</a>: <a href="#Polygon-sweeps">Polygon sweeps</a></li> +<li><a href="#index-options_002c-sweep-116">options, sweep</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-options_002c-swept-object-146">options, swept object</a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-options_002c-swept-object-134">options, swept object</a>: <a href="#Polygon-sweeps">Polygon sweeps</a></li> +<li><a href="#index-options_002c-swept-object-296">options, swept object</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-order_002c-polygon-vertex-410">order, polygon vertex</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-order_002c-polygon-vertex-293">order, polygon vertex</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-order_002c-polygon-vertex-311">order, polygon vertex</a>: <a href="#Swept-polygons">Swept polygons</a></li> +<li><a href="#index-order_002c-polygon-vertex-22">order, polygon vertex</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-order_002c-polygon-vertex-302">order, polygon vertex</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-output-language-392">output language</a>: <a href="#Language">Language</a></li> +<li><a href="#index-outside-of-a-polygon-17">outside of a polygon</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-parallel-projection-195">parallel projection</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-parallel-projection-11">parallel projection</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-parallel-projection-381">parallel projection</a>: <a href="#Picture-box">Picture box</a></li> +<li><a href="#index-parentheses-228">parentheses</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-perspective-projection-399">perspective projection</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-perspective-projection-201">perspective projection</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-picture-box-376">picture box</a>: <a href="#Picture-box">Picture box</a></li> +<li><a href="#index-planarity-of-polygons-267">planarity of polygons</a>: <a href="#Polygons">Polygons</a></li> +<li><a href="#index-planarity-of-polygons-319">planarity of polygons</a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li> +<li><a href="#index-point-definition-36">point definition</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-point-list-282">point list</a>: <a href="#Swept-points">Swept points</a></li> +<li><a href="#index-point-literal-175">point literal</a>: <a href="#Point-and-vector-literals">Point and vector literals</a></li> +<li><a href="#index-point-reference-344">point reference</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-point-sweep-95">point sweep</a>: <a href="#Swept-objects">Swept objects</a></li> +<li><a href="#index-point-sweep-279">point sweep</a>: <a href="#Swept-points">Swept points</a></li> +<li><a href="#index-polygon-sweep-305">polygon sweep</a>: <a href="#Swept-polygons">Swept polygons</a></li> +<li><a href="#index-polygon-sweep-132">polygon sweep</a>: <a href="#Polygon-sweeps">Polygon sweeps</a></li> +<li><a href="#index-polygon-sweep-491">polygon sweep</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-polygon-vertex-order-21">polygon vertex order</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-polygon-vertex-order-292">polygon vertex order</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-polygon-vertex-order-417">polygon vertex order</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-polygon-vertex-order-301">polygon vertex order</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-polygon-vertex-order-310">polygon vertex order</a>: <a href="#Swept-polygons">Swept polygons</a></li> +<li><a href="#index-polygon-vertex-order-409">polygon vertex order</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-polygon_002c-body-291">polygon, body</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-polygon_002c-body-259">polygon, body</a>: <a href="#Internal-options">Internal options</a></li> +<li><a href="#index-polygon_002c-body-307">polygon, body</a>: <a href="#Swept-polygons">Swept polygons</a></li> +<li><a href="#index-polygon_002c-end-309">polygon, end</a>: <a href="#Swept-polygons">Swept polygons</a></li> +<li><a href="#index-polygon_002c-end-300">polygon, end</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-polygon_002c-outside-of-18">polygon, outside of</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-polygon_002c-planar-318">polygon, planar</a>: <a href="#Sweep-face-splitting">Sweep face splitting</a></li> +<li><a href="#index-polygon_002c-planar-266">polygon, planar</a>: <a href="#Polygons">Polygons</a></li> +<li><a href="#index-precedence_002c-operator-224">precedence, operator</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-program_002c-hello-world-6">program, hello world</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-projection_002c-parallel-12">projection, parallel</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-projection_002c-parallel-196">projection, parallel</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-projection_002c-parallel-382">projection, parallel</a>: <a href="#Picture-box">Picture box</a></li> +<li><a href="#index-projection_002c-perspective-202">projection, perspective</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-projection_002c-perspective-401">projection, perspective</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-pseudo_002doptions-244">pseudo-options</a>: <a href="#TikZ_002fPGF-user_002ddefined-styles">TikZ/PGF user-defined styles</a></li> +<li><a href="#index-_0040code_007bpsframebox_007d-386"><code>psframebox</code></a>: <a href="#Frame">Frame</a></li> +<li><a href="#index-_0040code_007bpspicture_007d-378"><code>pspicture</code></a>: <a href="#Picture-box">Picture box</a></li> +<li><a href="#index-PSTricks-1">PSTricks</a>: <a href="#About-sketch">About sketch</a></li> +<li><a href="#index-quoting_002c-special-50">quoting, special</a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-quoting_002c-special-269">quoting, special</a>: <a href="#Specials">Specials</a></li> +<li><a href="#index-reference_002c-drawable-416">reference, drawable</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-reference_002c-drawable-78">reference, drawable</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-reference_002c-drawable-354">reference, drawable</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-reference_002c-multiple-options-360">reference, multiple options</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-reference_002c-options-357">reference, options</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-reference_002c-options-149">reference, options</a>: <a href="#Polyline-sweeps-with-closure">Polyline sweeps with closure</a></li> +<li><a href="#index-reference_002c-point-37">reference, point</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-reference_002c-point-345">reference, point</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-reference_002c-scalar-343">reference, scalar</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-reference_002c-scalar-99">reference, scalar</a>: <a href="#Swept-objects">Swept objects</a></li> +<li><a href="#index-reference_002c-tag-340">reference, tag</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li> +<li><a href="#index-reference_002c-tag-363">reference, tag</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-reference_002c-transform-407">reference, transform</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-reference_002c-transform-351">reference, transform</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-reference_002c-vector-119">reference, vector</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-reference_002c-vector-348">reference, vector</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-repeated-object-327">repeated object</a>: <a href="#Repeats">Repeats</a></li> +<li><a href="#index-reserved-words-172">reserved words</a>: <a href="#Key-and-reserved-words">Key and reserved words</a></li> +<li><a href="#index-right-hand-rule-83">right hand rule</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-right_002dhand-coordinate-system-4">right-hand coordinate system</a>: <a href="#Introduction-by-example">Introduction by example</a></li> +<li><a href="#index-rotation-81">rotation</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-rotation-transform-482">rotation transform</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-rotation-transform-183">rotation transform</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-rotation-transform-488">rotation transform</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-rotation_002c-center-of-60">rotation, center of</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-rotation_002c-center-of-122">rotation, center of</a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-running-_0040code_007bsketch_007d-8">running <code>sketch</code></a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-scalar-definition-98">scalar definition</a>: <a href="#Swept-objects">Swept objects</a></li> +<li><a href="#index-scalar-literal-173">scalar literal</a>: <a href="#Scalar-literals">Scalar literals</a></li> +<li><a href="#index-scalar-reference-342">scalar reference</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-scale-transform-192">scale transform</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-scene-description-language-398">scene description language</a>: <a href="#Building-a-drawing">Building a drawing</a></li> +<li><a href="#index-scene-description-language-161">scene description language</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-scope_002c-identifier-73">scope, identifier</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-scope_002c-identifier-325">scope, identifier</a>: <a href="#Blocks">Blocks</a></li> +<li><a href="#index-simple-definition-333">simple definition</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li> +<li><a href="#index-solid-28">solid</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-special-argument-substitution-53">special argument substitution</a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-special-argument-substitution-270">special argument substitution</a>: <a href="#Specials">Specials</a></li> +<li><a href="#index-special-object-49">special object</a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-special-objects-450">special objects</a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-splitting_002c-line-and-surface-495">splitting, line and surface</a>: <a href="#Hidden-surface-removal">Hidden surface removal</a></li> +<li><a href="#index-splitting_002c-line-and-surface-10">splitting, line and surface</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-substitution_002c-special-52">substitution, special</a>: <a href="#Special-objects">Special objects</a></li> +<li><a href="#index-surface-107">surface</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-sweep-92">sweep</a>: <a href="#Swept-objects">Swept objects</a></li> +<li><a href="#index-swept-bock-312">swept bock</a>: <a href="#Swept-blocks">Swept blocks</a></li> +<li><a href="#index-swept-line-439">swept line</a>: <a href="#A-technical-drawing">A technical drawing</a></li> +<li><a href="#index-swept-line-286">swept line</a>: <a href="#Swept-lines">Swept lines</a></li> +<li><a href="#index-swept-line-106">swept line</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-swept-object-91">swept object</a>: <a href="#Swept-objects">Swept objects</a></li> +<li><a href="#index-swept-object-274">swept object</a>: <a href="#Sweeps">Sweeps</a></li> +<li><a href="#index-swept-point-96">swept point</a>: <a href="#Swept-objects">Swept objects</a></li> +<li><a href="#index-swept-point-278">swept point</a>: <a href="#Swept-points">Swept points</a></li> +<li><a href="#index-swept-polygon-133">swept polygon</a>: <a href="#Polygon-sweeps">Polygon sweeps</a></li> +<li><a href="#index-swept-polygon-490">swept polygon</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-tag-definition-332">tag definition</a>: <a href="#Definitions">Definitions</a></li> +<li><a href="#index-tag-definition-508">tag definition</a>: <a href="#Command-line">Command line</a></li> +<li><a href="#index-tag-definition-337">tag definition</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li> +<li><a href="#index-tag-reference-339">tag reference</a>: <a href="#Forms-of-definitions">Forms of definitions</a></li> +<li><a href="#index-tag-reference-362">tag reference</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-template_002c-document-507">template, document</a>: <a href="#Command-line">Command line</a></li> +<li><a href="#index-template_002c-document-16">template, document</a>: <a href="#Hello-world">Hello world</a></li> +<li><a href="#index-tetrahedron-30">tetrahedron</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-tick-operator-_0028_0040code_007b_0027_007d_0029-157">tick operator (<code>'</code>)</a>: <a href="#Affine-arithmetic">Affine arithmetic</a></li> +<li><a href="#index-tick-operator-_0028_0040code_007b_0027_007d_0029-222">tick operator (<code>'</code>)</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-TikZ_002fPGF-2">TikZ/PGF</a>: <a href="#About-sketch">About sketch</a></li> +<li><a href="#index-toroid-123">toroid</a>: <a href="#Nested-sweeps">Nested sweeps</a></li> +<li><a href="#index-transform-328">transform</a>: <a href="#Repeats">Repeats</a></li> +<li><a href="#index-transform-58">transform</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-transform-275">transform</a>: <a href="#Sweeps">Sweeps</a></li> +<li><a href="#index-transform-400">transform</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-transform-219">transform</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-transform-definition-403">transform definition</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-transform-literal-179">transform literal</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-transform-reference-406">transform reference</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-transform-reference-350">transform reference</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-transform_002c-rotation-485">transform, rotation</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-transform_002c-rotation-184">transform, rotation</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-transform_002c-rotation-489">transform, rotation</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-transform_002c-scale-193">transform, scale</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-transform_002c-translation-187">transform, translation</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-transform_002c-translation-481">transform, translation</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-transform_002c-translation-86">transform, translation</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-transform_002c-view-209">transform, view</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-translation-transform-480">translation transform</a>: <a href="#A-hierarchical-model">A hierarchical model</a></li> +<li><a href="#index-translation-transform-186">translation transform</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-translation-transform-85">translation transform</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-transparency-247">transparency</a>: <a href="#Transparency">Transparency</a></li> +<li><a href="#index-two_002doperand-form-213">two-operand form</a>: <a href="#Two_002doperand-_0028binary_0029-forms">Two-operand (binary) forms</a></li> +<li><a href="#index-unary-form-233">unary form</a>: <a href="#Unary-forms">Unary forms</a></li> +<li><a href="#index-vector-87">vector</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-vector-definition-118">vector definition</a>: <a href="#Polyline-sweeps">Polyline sweeps</a></li> +<li><a href="#index-vector-literal-177">vector literal</a>: <a href="#Point-and-vector-literals">Point and vector literals</a></li> +<li><a href="#index-vector-reference-347">vector reference</a>: <a href="#Forms-of-references">Forms of references</a></li> +<li><a href="#index-view-transform-205">view transform</a>: <a href="#Transform-literals">Transform literals</a></li> +<li><a href="#index-virtual-camera-433">virtual camera</a>: <a href="#Overview">Overview</a></li> +<li><a href="#index-white-space-41">white space</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> +<li><a href="#index-white-space-165">white space</a>: <a href="#Language-basics">Language basics</a></li> +<li><a href="#index-white-space-77">white space</a>: <a href="#Object-transforms">Object transforms</a></li> +<li><a href="#index-white-space-39">white space</a>: <a href="#Drawing-a-solid">Drawing a solid</a></li> + </ul><div class="footnote"> +<hr> +<a name="texinfo-footnotes-in-document"></a><h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> Or for European users of A4 size paper, +<span class="option">-Te</span>.</p> + + <p class="footnote"><small>[<a name="fn-2" href="#fnd-2">2</a>]</small> This clever trick is due to Kjell Magne Fauske.</p> + + <p class="footnote"><small>[<a name="fn-3" href="#fnd-3">3</a>]</small> Newell, M.E., R.G. Newell, and T.L. Sancha, A +solution to the hidden surface problem. <i>Proceedings of the ACM +annual conference - Volume 1</i>, page 443–450, ACM Press, 1972.</p> + + <p class="footnote"><small>[<a name="fn-4" href="#fnd-4">4</a>]</small> We +have run <code>sketch</code> on the famous Stanford Bunny, which consists +of nearly 70,000 triangles. Run time was about 6 seconds. +Most of this was spent writing the output file rather than in the +hidden surface algorithm. LaTeX took much longer to process the +resulting <code>PSTricks</code> code. The obvious conclusion is that the +speed of the depth sort algorithm is not a worry.</p> + + <p class="footnote"><small>[<a name="fn-5" href="#fnd-5">5</a>]</small> I know how to fix this problem, but I don't like my +solution, and I'm interested in yours.</p> + + <p><hr></div> + +</body></html> + |