mirror of
https://github.com/ganelson/inform.git
synced 2024-07-05 08:34:22 +03:00
398 lines
53 KiB
HTML
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</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">§1. Definitions</a></li><li><a href="#SP5">§5. Vectors</a></li><li><a href="#SP8">§8. Lengths</a></li><li><a href="#SP9">§9. Angles</a></li><li><a href="#SP10">§10. Cuboids</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Definitions. </b></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§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>§3. </b>Some useful constant vectors, including those pointing in each direction.
|
|
Note that these are not of unit length — 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>§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>§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">§16.1</a>, <a href="3-sm2.html#SP8_31">§8.31</a>, <a href="3-sm2.html#SP8_32_1_1">§8.32.1.1</a>, <a href="3-sm2.html#SP8_32_1_2">§8.32.1.2</a>, <a href="3-sm2.html#SP8_32_1_3">§8.32.1.3</a>), 3/hm (<a href="3-hm.html#SP9">§9</a>, <a href="3-hm.html#SP9_3_1_1">§9.3.1.1</a>, <a href="3-hm.html#SP9_3_2_1">§9.3.2.1</a>, <a href="3-hm.html#SP9_3_3_1">§9.3.3.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§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">) && (</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">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) && (</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">§8.11</a>, <a href="3-sm2.html#SP21">§21</a>, <a href="3-sm2.html#SP22">§22</a>, <a href="3-sm2.html#SP33">§33</a>), 3/hm (<a href="3-hm.html#SP1_3_4">§1.3.4</a>, <a href="3-hm.html#SP1_3_4_1">§1.3.4.1</a>, <a href="3-hm.html#SP1_3_4_2">§1.3.4.2</a>, <a href="3-hm.html#SP2_1">§2.1</a>).</p>
|
|
|
|
<p class="endnote">The function Geometry::vec_lateral is used in 3/sm2 (<a href="3-sm2.html#SP8_10">§8.10</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP7"></a><b>§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">§12</a>, <a href="#SP15">§15</a>, 3/sm2 (<a href="3-sm2.html#SP8_21">§8.21</a>, <a href="3-sm2.html#SP8_26">§8.26</a>, <a href="3-sm2.html#SP8_27">§8.27</a>, <a href="3-sm2.html#SP21">§21</a>, <a href="3-sm2.html#SP23_1_4_1">§23.1.4.1</a>, <a href="3-sm2.html#SP33">§33</a>, <a href="3-sm2.html#SP37_1">§37.1</a>, <a href="3-sm2.html#SP8_31">§8.31</a>, <a href="3-sm2.html#SP8_32_1_2">§8.32.1.2</a>, <a href="3-sm2.html#SP8_32_1_3">§8.32.1.3</a>), 3/hm (<a href="3-hm.html#SP1_3_4_2">§1.3.4.2</a>, <a href="3-hm.html#SP2">§2</a>, <a href="3-hm.html#SP2_1">§2.1</a>, <a href="3-hm.html#SP3">§3</a>).</p>
|
|
|
|
<p class="endnote">The function Geometry::vec_minus is used in <a href="#SP14">§14</a>, <a href="#SP15">§15</a>, 3/sm2 (<a href="3-sm2.html#SP21">§21</a>, <a href="3-sm2.html#SP22">§22</a>, <a href="3-sm2.html#SP23_1_4_1">§23.1.4.1</a>, <a href="3-sm2.html#SP35_1">§35.1</a>, <a href="3-sm2.html#SP8_32_1_2">§8.32.1.2</a>, <a href="3-sm2.html#SP8_32_1_3">§8.32.1.3</a>, <a href="3-sm2.html#SP8_33">§8.33</a>), 3/hm (<a href="3-hm.html#SP1_3_4_1">§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">§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">§23.1.4.1</a>, <a href="3-sm2.html#SP33">§33</a>, <a href="3-sm2.html#SP37_1">§37.1</a>), 3/hm (<a href="3-hm.html#SP1_3_4_1">§1.3.4.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP8"></a><b>§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">§21</a>).</p>
|
|
|
|
<p class="endnote">The function Geometry::vec_length is used in <a href="#SP9">§9</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP9"></a><b>§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">§21</a>, <a href="3-sm2.html#SP22">§22</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP10"></a><b>§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">>population</span><span class="plain">++ == 0) {</span>
|
|
<span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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"> < </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>corner0.x</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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"> > </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>corner1.x</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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"> < </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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"> > </span><span class="identifier">C</span><span class="plain">-</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="plain">-</span><span class="element">>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"> < </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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"> > </span><span class="identifier">C</span><span class="plain">-</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="plain">-</span><span class="element">>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">§8</a>, <a href="3-sm2.html#SP12">§12</a>, <a href="3-sm2.html#SP8_18">§8.18</a>, <a href="3-sm2.html#SP19">§19</a>, <a href="3-sm2.html#SP8_32">§8.32</a>, <a href="3-sm2.html#SP8_34">§8.34</a>).</p>
|
|
|
|
<p class="endnote">The function Geometry::adjust_cuboid is used in <a href="#SP11">§11</a>, 3/sm2 (<a href="3-sm2.html#SP19">§19</a>, <a href="3-sm2.html#SP8_34">§8.34</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP11"></a><b>§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"> > 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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">§8.32.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP12"></a><b>§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">>population</span><span class="plain"> > 0) {</span>
|
|
<span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">§8.21</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP13"></a><b>§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"> < </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"> > </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"> < </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"> > </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"> < </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"> > </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">§14</a>, 3/sm2 (<a href="3-sm2.html#SP16">§16</a>), 3/hm (<a href="3-hm.html#SP2">§2</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP14"></a><b>§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">§14</a>, <a href="3-sm2.html#SP16">§16</a>, <a href="3-sm2.html#SP16_1">§16.1</a>), 3/hm (<a href="3-hm.html#SP1">§1</a>).</p>
|
|
|
|
<p class="endnote">The function Geometry::cuboid_volume is used in 3/sm2 (<a href="3-sm2.html#SP16_1">§16.1</a>), 3/hm (<a href="3-hm.html#SP1_1">§1.1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP15"></a><b>§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">>population</span><span class="plain">++ == 0) {</span>
|
|
<span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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"> < </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>corner0.x</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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"> > </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>corner1.x</span><span class="plain">) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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"> < </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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"> > </span><span class="identifier">C</span><span class="plain">-</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="plain">-</span><span class="element">>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"> < </span><span class="identifier">C</span><span class="plain">-</span><span class="element">>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">>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"> > </span><span class="identifier">C</span><span class="plain">-</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="plain">-</span><span class="element">>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">§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>
|
|
|