1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 08:34:22 +03:00
inform7/docs/if-module/3-sg.html
2020-03-28 19:42:53 +00:00

398 lines
53 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/mcr</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '3/sg' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">if</a></li><li><a href="index.html#3">Chapter 3: Space and Time</a></li><li><b>Spatial Geometry</b></li></ul><p class="purpose">To deal with vectors and cuboids in a three-dimensional integer lattice.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Definitions</a></li><li><a href="#SP5">&#167;5. Vectors</a></li><li><a href="#SP8">&#167;8. Lengths</a></li><li><a href="#SP9">&#167;9. Angles</a></li><li><a href="#SP10">&#167;10. Cuboids</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Definitions. </b></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>We will store 3-vectors in the obvious way:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">vector</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">, </span><span class="identifier">y</span><span class="plain">, </span><span class="identifier">z</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">vector</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure vector is accessed in 3/sm2, 3/hm, 3/em and here.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Some useful constant vectors, including those pointing in each direction.
Note that these are not of unit length &mdash; rather, they are the ideal grid
offsets on the map we will eventually draw.
</p>
<pre class="display">
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">Zero_vector</span><span class="plain"> = {0, 0, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">N_vector</span><span class="plain"> = {0, 1, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">NE_vector</span><span class="plain"> = {1, 1, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">NW_vector</span><span class="plain"> = {-1, 1, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">S_vector</span><span class="plain"> = {0, -1, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">SE_vector</span><span class="plain"> = {1, -1, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">SW_vector</span><span class="plain"> = {-1, -1, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">E_vector</span><span class="plain"> = {1, 0, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">W_vector</span><span class="plain"> = {-1, 0, 0};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">U_vector</span><span class="plain"> = {0, 0, 1};</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">D_vector</span><span class="plain"> = {0, 0, -1};</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>A cuboid is a volume of space with opposing corners at integer grid
positions which form a tightest-possible bounding box around a finite
number of points (of size <code class="display"><span class="extract">population</span></code>); when this is 0, of course, the
corners are meaningless and are by convention at the origin.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">cuboid</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">population</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">corner0</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">corner1</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">cuboid</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure cuboid is accessed in 3/sm2, 3/hm, 3/em and here.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Vectors. </b></p>
<pre class="display">
<span class="reserved">vector</span><span class="plain"> </span><span class="functiontext">Geometry::vec</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">y</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">z</span><span class="plain">) {</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">R</span><span class="element">.x</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">y</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> = </span><span class="identifier">z</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::vec is used in 3/sm2 (<a href="3-sm2.html#SP16_1">&#167;16.1</a>, <a href="3-sm2.html#SP8_31">&#167;8.31</a>, <a href="3-sm2.html#SP8_32_1_1">&#167;8.32.1.1</a>, <a href="3-sm2.html#SP8_32_1_2">&#167;8.32.1.2</a>, <a href="3-sm2.html#SP8_32_1_3">&#167;8.32.1.3</a>), 3/hm (<a href="3-hm.html#SP9">&#167;9</a>, <a href="3-hm.html#SP9_3_1_1">&#167;9.3.1.1</a>, <a href="3-hm.html#SP9_3_2_1">&#167;9.3.2.1</a>, <a href="3-hm.html#SP9_3_3_1">&#167;9.3.3.1</a>).</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>A vector is "lateral" if lies in the x-y plane.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Geometry::vec_eq</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">U</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">U</span><span class="element">.x</span><span class="plain"> == </span><span class="identifier">V</span><span class="element">.x</span><span class="plain">) &amp;&amp; (</span><span class="identifier">U</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> == </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">) &amp;&amp; (</span><span class="identifier">U</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> == </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Geometry::vec_lateral</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">V</span><span class="element">.x</span><span class="plain"> == 0) &amp;&amp; (</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> == 0)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::vec_eq is used in 3/sm2 (<a href="3-sm2.html#SP8_11">&#167;8.11</a>, <a href="3-sm2.html#SP21">&#167;21</a>, <a href="3-sm2.html#SP22">&#167;22</a>, <a href="3-sm2.html#SP33">&#167;33</a>), 3/hm (<a href="3-hm.html#SP1_3_4">&#167;1.3.4</a>, <a href="3-hm.html#SP1_3_4_1">&#167;1.3.4.1</a>, <a href="3-hm.html#SP1_3_4_2">&#167;1.3.4.2</a>, <a href="3-hm.html#SP2_1">&#167;2.1</a>).</p>
<p class="endnote">The function Geometry::vec_lateral is used in 3/sm2 (<a href="3-sm2.html#SP8_10">&#167;8.10</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The vector space operations:
</p>
<pre class="display">
<span class="reserved">vector</span><span class="plain"> </span><span class="functiontext">Geometry::vec_plus</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">U</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">R</span><span class="element">.x</span><span class="plain"> = </span><span class="identifier">U</span><span class="element">.x</span><span class="plain"> + </span><span class="identifier">V</span><span class="element">.x</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">U</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> + </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> = </span><span class="identifier">U</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> + </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="functiontext">Geometry::vec_minus</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">U</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">R</span><span class="element">.x</span><span class="plain"> = </span><span class="identifier">U</span><span class="element">.x</span><span class="plain"> - </span><span class="identifier">V</span><span class="element">.x</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">U</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> - </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> = </span><span class="identifier">U</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> - </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="functiontext">Geometry::vec_negate</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">R</span><span class="element">.x</span><span class="plain"> = -</span><span class="identifier">V</span><span class="element">.x</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> = -</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> = -</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="functiontext">Geometry::vec_scale</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">lambda</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">R</span><span class="element">.x</span><span class="plain"> = </span><span class="identifier">lambda</span><span class="plain">*</span><span class="identifier">V</span><span class="element">.x</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">lambda</span><span class="plain">*</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">; </span><span class="identifier">R</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> = </span><span class="identifier">lambda</span><span class="plain">*</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::vec_plus is used in <a href="#SP12">&#167;12</a>, <a href="#SP15">&#167;15</a>, 3/sm2 (<a href="3-sm2.html#SP8_21">&#167;8.21</a>, <a href="3-sm2.html#SP8_26">&#167;8.26</a>, <a href="3-sm2.html#SP8_27">&#167;8.27</a>, <a href="3-sm2.html#SP21">&#167;21</a>, <a href="3-sm2.html#SP23_1_4_1">&#167;23.1.4.1</a>, <a href="3-sm2.html#SP33">&#167;33</a>, <a href="3-sm2.html#SP37_1">&#167;37.1</a>, <a href="3-sm2.html#SP8_31">&#167;8.31</a>, <a href="3-sm2.html#SP8_32_1_2">&#167;8.32.1.2</a>, <a href="3-sm2.html#SP8_32_1_3">&#167;8.32.1.3</a>), 3/hm (<a href="3-hm.html#SP1_3_4_2">&#167;1.3.4.2</a>, <a href="3-hm.html#SP2">&#167;2</a>, <a href="3-hm.html#SP2_1">&#167;2.1</a>, <a href="3-hm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Geometry::vec_minus is used in <a href="#SP14">&#167;14</a>, <a href="#SP15">&#167;15</a>, 3/sm2 (<a href="3-sm2.html#SP21">&#167;21</a>, <a href="3-sm2.html#SP22">&#167;22</a>, <a href="3-sm2.html#SP23_1_4_1">&#167;23.1.4.1</a>, <a href="3-sm2.html#SP35_1">&#167;35.1</a>, <a href="3-sm2.html#SP8_32_1_2">&#167;8.32.1.2</a>, <a href="3-sm2.html#SP8_32_1_3">&#167;8.32.1.3</a>, <a href="3-sm2.html#SP8_33">&#167;8.33</a>), 3/hm (<a href="3-hm.html#SP1_3_4_1">&#167;1.3.4.1</a>).</p>
<p class="endnote">The function Geometry::vec_negate is used in 3/sm2 (<a href="3-sm2.html#SP8_32_1_3_1">&#167;8.32.1.3.1</a>).</p>
<p class="endnote">The function Geometry::vec_scale is used in 3/sm2 (<a href="3-sm2.html#SP23_1_4_1">&#167;23.1.4.1</a>, <a href="3-sm2.html#SP33">&#167;33</a>, <a href="3-sm2.html#SP37_1">&#167;37.1</a>), 3/hm (<a href="3-hm.html#SP1_3_4_1">&#167;1.3.4.1</a>).</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Lengths. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Geometry::vec_length_squared</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="element">.x</span><span class="plain">*</span><span class="identifier">V</span><span class="element">.x</span><span class="plain"> + </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">*</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> + </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">*</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">float</span><span class="plain"> </span><span class="functiontext">Geometry::vec_length</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">float</span><span class="plain">) (</span><span class="identifier">sqrt</span><span class="plain">(</span><span class="functiontext">Geometry::vec_length_squared</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)));</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::vec_length_squared is used in 3/sm2 (<a href="3-sm2.html#SP21">&#167;21</a>).</p>
<p class="endnote">The function Geometry::vec_length is used in <a href="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Angles. </b>We compute unit vectors in the D and E directions and then the squared
length of their difference. This is a fairly sharply increasing function of
the absolute value of the angular difference between D and E, and is such
that if the angles are equal then the result is zero; and it's cheap to
compute. So although it might seem nicer to calculate actual angles, this
is better.
</p>
<pre class="display">
<span class="reserved">float</span><span class="plain"> </span><span class="functiontext">Geometry::vec_angular_separation</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">D</span><span class="plain">) {</span>
<span class="reserved">float</span><span class="plain"> </span><span class="identifier">E_distance</span><span class="plain"> = </span><span class="functiontext">Geometry::vec_length</span><span class="plain">(</span><span class="identifier">E</span><span class="plain">);</span>
<span class="reserved">float</span><span class="plain"> </span><span class="identifier">uex</span><span class="plain"> = </span><span class="identifier">E</span><span class="element">.x</span><span class="plain">/</span><span class="identifier">E_distance</span><span class="plain">, </span><span class="identifier">uey</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">/</span><span class="identifier">E_distance</span><span class="plain">, </span><span class="identifier">uez</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">/</span><span class="identifier">E_distance</span><span class="plain">;</span>
<span class="reserved">float</span><span class="plain"> </span><span class="identifier">D_distance</span><span class="plain"> = </span><span class="functiontext">Geometry::vec_length</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">);</span>
<span class="reserved">float</span><span class="plain"> </span><span class="identifier">udx</span><span class="plain"> = </span><span class="identifier">D</span><span class="element">.x</span><span class="plain">/</span><span class="identifier">D_distance</span><span class="plain">, </span><span class="identifier">udy</span><span class="plain"> = </span><span class="identifier">D</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">/</span><span class="identifier">D_distance</span><span class="plain">, </span><span class="identifier">udz</span><span class="plain"> = </span><span class="identifier">D</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">/</span><span class="identifier">D_distance</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">uex</span><span class="plain">-</span><span class="identifier">udx</span><span class="plain">)*(</span><span class="identifier">uex</span><span class="plain">-</span><span class="identifier">udx</span><span class="plain">) + (</span><span class="identifier">uey</span><span class="plain">-</span><span class="identifier">udy</span><span class="plain">)*(</span><span class="identifier">uey</span><span class="plain">-</span><span class="identifier">udy</span><span class="plain">) + (</span><span class="identifier">uez</span><span class="plain">-</span><span class="identifier">udz</span><span class="plain">)*(</span><span class="identifier">uez</span><span class="plain">-</span><span class="identifier">udz</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::vec_angular_separation is used in 3/sm2 (<a href="3-sm2.html#SP21">&#167;21</a>, <a href="3-sm2.html#SP22">&#167;22</a>).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Cuboids. </b>To form a populated cuboid, first request an empty one, and then adjust it
for each vector to join the population.
</p>
<pre class="display">
<span class="reserved">cuboid</span><span class="plain"> </span><span class="functiontext">Geometry::empty_cuboid</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">cuboid</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">C</span><span class="element">.population</span><span class="plain"> = 0;</span>
<span class="identifier">C</span><span class="element">.corner0</span><span class="plain"> = </span><span class="identifier">Zero_vector</span><span class="plain">; </span><span class="identifier">C</span><span class="element">.corner1</span><span class="plain"> = </span><span class="identifier">Zero_vector</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Geometry::adjust_cuboid</span><span class="plain">(</span><span class="reserved">cuboid</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;population</span><span class="plain">++ == 0) {</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="element">.x</span><span class="plain"> &lt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0.x</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0.x</span><span class="plain"> = </span><span class="identifier">V</span><span class="element">.x</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="element">.x</span><span class="plain"> &gt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1.x</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1.x</span><span class="plain"> = </span><span class="identifier">V</span><span class="element">.x</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> &lt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> &gt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> &lt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> &gt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::empty_cuboid is used in 3/sm2 (<a href="3-sm2.html#SP8">&#167;8</a>, <a href="3-sm2.html#SP12">&#167;12</a>, <a href="3-sm2.html#SP8_18">&#167;8.18</a>, <a href="3-sm2.html#SP19">&#167;19</a>, <a href="3-sm2.html#SP8_32">&#167;8.32</a>, <a href="3-sm2.html#SP8_34">&#167;8.34</a>).</p>
<p class="endnote">The function Geometry::adjust_cuboid is used in <a href="#SP11">&#167;11</a>, 3/sm2 (<a href="3-sm2.html#SP19">&#167;19</a>, <a href="3-sm2.html#SP8_34">&#167;8.34</a>).</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>The following expands C minimally so that it contains X.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Geometry::merge_cuboid</span><span class="plain">(</span><span class="reserved">cuboid</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">cuboid</span><span class="plain"> </span><span class="identifier">X</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">X</span><span class="element">.population</span><span class="plain"> &gt; 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;population</span><span class="plain"> == 0) {</span>
<span class="plain">*</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">X</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Geometry::adjust_cuboid</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">X</span><span class="element">.corner0</span><span class="plain">);</span>
<span class="functiontext">Geometry::adjust_cuboid</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">X</span><span class="element">.corner1</span><span class="plain">);</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;population</span><span class="plain"> += </span><span class="identifier">X</span><span class="element">.population</span><span class="plain"> - 2;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::merge_cuboid is used in 3/sm2 (<a href="3-sm2.html#SP8_32_1">&#167;8.32.1</a>).</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>Here we shift an entire cuboid over (assuming all of the points inside
it have made the same shift).
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Geometry::cuboid_translate</span><span class="plain">(</span><span class="reserved">cuboid</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">D</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;population</span><span class="plain"> &gt; 0) {</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain"> = </span><span class="functiontext">Geometry::vec_plus</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">);</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain"> = </span><span class="functiontext">Geometry::vec_plus</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain">, </span><span class="identifier">D</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::cuboid_translate is used in 3/sm2 (<a href="3-sm2.html#SP8_21">&#167;8.21</a>).</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Geometry::within_cuboid</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">cuboid</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="element">.population</span><span class="plain"> == 0) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="element">.x</span><span class="plain"> &lt; </span><span class="identifier">C</span><span class="element">.corner0.x</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="element">.x</span><span class="plain"> &gt; </span><span class="identifier">C</span><span class="element">.corner1.x</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> &lt; </span><span class="identifier">C</span><span class="element">.corner0</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> &gt; </span><span class="identifier">C</span><span class="element">.corner1</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> &lt; </span><span class="identifier">C</span><span class="element">.corner0</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> &gt; </span><span class="identifier">C</span><span class="element">.corner1</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::within_cuboid is used in <a href="#SP14">&#167;14</a>, 3/sm2 (<a href="3-sm2.html#SP16">&#167;16</a>), 3/hm (<a href="3-hm.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP14"></a><b>&#167;14. </b>Suppose we have a one-dimensional array whose entries correspond to the
integer grid positions within a cuboid (including its faces and corners).
The following returns -1 if a point is outside the cuboid, or returns
the index if it is.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Geometry::cuboid_index</span><span class="plain">(</span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">cuboid</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Geometry::within_cuboid</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> -1;</span>
<span class="reserved">vector</span><span class="plain"> </span><span class="identifier">O</span><span class="plain"> = </span><span class="functiontext">Geometry::vec_minus</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">C</span><span class="element">.corner0</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">width</span><span class="plain"> = </span><span class="identifier">C</span><span class="element">.corner1.x</span><span class="plain"> - </span><span class="identifier">C</span><span class="element">.corner0.x</span><span class="plain"> + 1;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">height</span><span class="plain"> = </span><span class="identifier">C</span><span class="element">.corner1</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> - </span><span class="identifier">C</span><span class="element">.corner0</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> + 1;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">O</span><span class="element">.x</span><span class="plain"> + </span><span class="identifier">O</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">*</span><span class="identifier">width</span><span class="plain"> + </span><span class="identifier">O</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">*</span><span class="identifier">width</span><span class="plain">*</span><span class="identifier">height</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Geometry::cuboid_volume</span><span class="plain">(</span><span class="reserved">cuboid</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="element">.population</span><span class="plain"> == 0) </span><span class="reserved">return</span><span class="plain"> 0;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">width</span><span class="plain"> = </span><span class="identifier">C</span><span class="element">.corner1.x</span><span class="plain"> - </span><span class="identifier">C</span><span class="element">.corner0.x</span><span class="plain"> + 1;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">height</span><span class="plain"> = </span><span class="identifier">C</span><span class="element">.corner1</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> - </span><span class="identifier">C</span><span class="element">.corner0</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> + 1;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain"> = </span><span class="identifier">C</span><span class="element">.corner1</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> - </span><span class="identifier">C</span><span class="element">.corner0</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> + 1;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">width</span><span class="plain">*</span><span class="identifier">height</span><span class="plain">*</span><span class="identifier">depth</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::cuboid_index is used in 3/sm2 (<a href="3-sm2.html#SP14">&#167;14</a>, <a href="3-sm2.html#SP16">&#167;16</a>, <a href="3-sm2.html#SP16_1">&#167;16.1</a>), 3/hm (<a href="3-hm.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Geometry::cuboid_volume is used in 3/sm2 (<a href="3-sm2.html#SP16_1">&#167;16.1</a>), 3/hm (<a href="3-hm.html#SP1_1">&#167;1.1</a>).</p>
<p class="inwebparagraph"><a id="SP15"></a><b>&#167;15. </b>Thickening a cuboid is a little more than adjusting; we give it some
extra room. (The result is thus no longer minimally bounding, but we
sacrifice that.)
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Geometry::thicken_cuboid</span><span class="plain">(</span><span class="reserved">cuboid</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">vector</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;population</span><span class="plain">++ == 0) {</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain"> = </span><span class="functiontext">Geometry::vec_minus</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain"> = </span><span class="functiontext">Geometry::vec_plus</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="element">.x</span><span class="plain"> &lt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0.x</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0.x</span><span class="plain"> = </span><span class="identifier">V</span><span class="element">.x</span><span class="plain"> - </span><span class="identifier">S</span><span class="element">.x</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="element">.x</span><span class="plain"> &gt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1.x</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1.x</span><span class="plain"> = </span><span class="identifier">V</span><span class="element">.x</span><span class="plain"> + </span><span class="identifier">S</span><span class="element">.x</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> &lt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> - </span><span class="identifier">S</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> &gt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">y</span><span class="plain"> + </span><span class="identifier">S</span><span class="plain">.</span><span class="identifier">y</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> &lt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner0</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> - </span><span class="identifier">S</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> &gt; </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;corner1</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">.</span><span class="identifier">z</span><span class="plain"> + </span><span class="identifier">S</span><span class="plain">.</span><span class="identifier">z</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Geometry::thicken_cuboid is used in 3/sm2 (<a href="3-sm2.html#SP16_1">&#167;16.1</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-mcr.html">Back to 'Map Connection Relations'</a></li><li><a href="3-sm2.html">Continue with 'Spatial Map'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>