2019-03-17 14:40:57 +02:00
<!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 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 >
<!-- Weave of '3/sg' generated by 7 -->
< ul class = "crumbs" > < li > < a href = "../webs.html" > ★ < / 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" >
2019-03-18 02:41:42 +02:00
<!-- End of weave -->
2019-03-17 14:40:57 +02:00
< / body >
< / html >