├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── README.md ├── images ├── att1.gif ├── att3.gif ├── att4.gif ├── att6.gif ├── att7.gif ├── sc_plane.png ├── sc_ray.png ├── sc_tri1.png ├── sc_tri2.png └── sc_vec_halves.png ├── src ├── line.rs ├── main.rs ├── shapes.rs ├── surface.rs ├── tmp.rs └── vector.rs └── test └── tower.obj /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .idea 3 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "adler" 5 | version = "0.2.3" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" 8 | 9 | [[package]] 10 | name = "adler32" 11 | version = "1.2.0" 12 | source = "registry+https://github.com/rust-lang/crates.io-index" 13 | checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" 14 | 15 | [[package]] 16 | name = "autocfg" 17 | version = "1.0.1" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 20 | 21 | [[package]] 22 | name = "bitflags" 23 | version = "1.2.1" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 26 | 27 | [[package]] 28 | name = "bytemuck" 29 | version = "1.5.0" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "5a4bad0c5981acc24bc09e532f35160f952e35422603f0563cd7a73c2c2e65a0" 32 | 33 | [[package]] 34 | name = "byteorder" 35 | version = "1.4.2" 36 | source = "registry+https://github.com/rust-lang/crates.io-index" 37 | checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" 38 | 39 | [[package]] 40 | name = "cfg-if" 41 | version = "1.0.0" 42 | source = "registry+https://github.com/rust-lang/crates.io-index" 43 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 44 | 45 | [[package]] 46 | name = "color_quant" 47 | version = "1.1.0" 48 | source = "registry+https://github.com/rust-lang/crates.io-index" 49 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 50 | 51 | [[package]] 52 | name = "const_fn" 53 | version = "0.4.5" 54 | source = "registry+https://github.com/rust-lang/crates.io-index" 55 | checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" 56 | 57 | [[package]] 58 | name = "crc32fast" 59 | version = "1.2.1" 60 | source = "registry+https://github.com/rust-lang/crates.io-index" 61 | checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" 62 | dependencies = [ 63 | "cfg-if", 64 | ] 65 | 66 | [[package]] 67 | name = "crossbeam-channel" 68 | version = "0.5.0" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" 71 | dependencies = [ 72 | "cfg-if", 73 | "crossbeam-utils", 74 | ] 75 | 76 | [[package]] 77 | name = "crossbeam-deque" 78 | version = "0.8.0" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "94af6efb46fef72616855b036a624cf27ba656ffc9be1b9a3c931cfc7749a9a9" 81 | dependencies = [ 82 | "cfg-if", 83 | "crossbeam-epoch", 84 | "crossbeam-utils", 85 | ] 86 | 87 | [[package]] 88 | name = "crossbeam-epoch" 89 | version = "0.9.1" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" 92 | dependencies = [ 93 | "cfg-if", 94 | "const_fn", 95 | "crossbeam-utils", 96 | "lazy_static", 97 | "memoffset", 98 | "scopeguard", 99 | ] 100 | 101 | [[package]] 102 | name = "crossbeam-utils" 103 | version = "0.8.1" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" 106 | dependencies = [ 107 | "autocfg", 108 | "cfg-if", 109 | "lazy_static", 110 | ] 111 | 112 | [[package]] 113 | name = "deflate" 114 | version = "0.8.6" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" 117 | dependencies = [ 118 | "adler32", 119 | "byteorder", 120 | ] 121 | 122 | [[package]] 123 | name = "either" 124 | version = "1.6.1" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 127 | 128 | [[package]] 129 | name = "gif" 130 | version = "0.11.1" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "02efba560f227847cb41463a7395c514d127d4f74fff12ef0137fff1b84b96c4" 133 | dependencies = [ 134 | "color_quant", 135 | "weezl", 136 | ] 137 | 138 | [[package]] 139 | name = "hermit-abi" 140 | version = "0.1.18" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" 143 | dependencies = [ 144 | "libc", 145 | ] 146 | 147 | [[package]] 148 | name = "image" 149 | version = "0.23.12" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "7ce04077ead78e39ae8610ad26216aed811996b043d47beed5090db674f9e9b5" 152 | dependencies = [ 153 | "bytemuck", 154 | "byteorder", 155 | "color_quant", 156 | "gif", 157 | "jpeg-decoder", 158 | "num-iter", 159 | "num-rational", 160 | "num-traits", 161 | "png", 162 | "scoped_threadpool", 163 | "tiff", 164 | ] 165 | 166 | [[package]] 167 | name = "jpeg-decoder" 168 | version = "0.1.21" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "d6187dc218616c3a222bae7b78938f5af5e7c27d9cbef4c30ebca709cd680bf8" 171 | dependencies = [ 172 | "rayon", 173 | ] 174 | 175 | [[package]] 176 | name = "lazy_static" 177 | version = "1.4.0" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 180 | 181 | [[package]] 182 | name = "libc" 183 | version = "0.2.82" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "89203f3fba0a3795506acaad8ebce3c80c0af93f994d5a1d7a0b1eeb23271929" 186 | 187 | [[package]] 188 | name = "memoffset" 189 | version = "0.6.1" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" 192 | dependencies = [ 193 | "autocfg", 194 | ] 195 | 196 | [[package]] 197 | name = "miniz_oxide" 198 | version = "0.3.7" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" 201 | dependencies = [ 202 | "adler32", 203 | ] 204 | 205 | [[package]] 206 | name = "miniz_oxide" 207 | version = "0.4.3" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" 210 | dependencies = [ 211 | "adler", 212 | "autocfg", 213 | ] 214 | 215 | [[package]] 216 | name = "num-integer" 217 | version = "0.1.44" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" 220 | dependencies = [ 221 | "autocfg", 222 | "num-traits", 223 | ] 224 | 225 | [[package]] 226 | name = "num-iter" 227 | version = "0.1.42" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" 230 | dependencies = [ 231 | "autocfg", 232 | "num-integer", 233 | "num-traits", 234 | ] 235 | 236 | [[package]] 237 | name = "num-rational" 238 | version = "0.3.2" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" 241 | dependencies = [ 242 | "autocfg", 243 | "num-integer", 244 | "num-traits", 245 | ] 246 | 247 | [[package]] 248 | name = "num-traits" 249 | version = "0.2.14" 250 | source = "registry+https://github.com/rust-lang/crates.io-index" 251 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 252 | dependencies = [ 253 | "autocfg", 254 | ] 255 | 256 | [[package]] 257 | name = "num_cpus" 258 | version = "0.2.13" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "cee7e88156f3f9e19bdd598f8d6c9db7bf4078f99f8381f43a55b09648d1a6e3" 261 | dependencies = [ 262 | "libc", 263 | ] 264 | 265 | [[package]] 266 | name = "num_cpus" 267 | version = "1.13.0" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" 270 | dependencies = [ 271 | "hermit-abi", 272 | "libc", 273 | ] 274 | 275 | [[package]] 276 | name = "obj-rs" 277 | version = "0.6.2" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "cf37dd242b0636bf442a539738f54330b0db9ad9758a89de154e9d3866a7847e" 280 | dependencies = [ 281 | "num-traits", 282 | "serde", 283 | "vec_map", 284 | ] 285 | 286 | [[package]] 287 | name = "png" 288 | version = "0.16.8" 289 | source = "registry+https://github.com/rust-lang/crates.io-index" 290 | checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" 291 | dependencies = [ 292 | "bitflags", 293 | "crc32fast", 294 | "deflate", 295 | "miniz_oxide 0.3.7", 296 | ] 297 | 298 | [[package]] 299 | name = "proc-macro2" 300 | version = "1.0.24" 301 | source = "registry+https://github.com/rust-lang/crates.io-index" 302 | checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" 303 | dependencies = [ 304 | "unicode-xid", 305 | ] 306 | 307 | [[package]] 308 | name = "quote" 309 | version = "1.0.8" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" 312 | dependencies = [ 313 | "proc-macro2", 314 | ] 315 | 316 | [[package]] 317 | name = "rayon" 318 | version = "1.5.0" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" 321 | dependencies = [ 322 | "autocfg", 323 | "crossbeam-deque", 324 | "either", 325 | "rayon-core", 326 | ] 327 | 328 | [[package]] 329 | name = "rayon-core" 330 | version = "1.9.0" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" 333 | dependencies = [ 334 | "crossbeam-channel", 335 | "crossbeam-deque", 336 | "crossbeam-utils", 337 | "lazy_static", 338 | "num_cpus 1.13.0", 339 | ] 340 | 341 | [[package]] 342 | name = "scoped_threadpool" 343 | version = "0.1.9" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" 346 | 347 | [[package]] 348 | name = "scopeguard" 349 | version = "1.1.0" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 352 | 353 | [[package]] 354 | name = "serde" 355 | version = "1.0.123" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" 358 | dependencies = [ 359 | "serde_derive", 360 | ] 361 | 362 | [[package]] 363 | name = "serde_derive" 364 | version = "1.0.123" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" 367 | dependencies = [ 368 | "proc-macro2", 369 | "quote", 370 | "syn", 371 | ] 372 | 373 | [[package]] 374 | name = "simplerays-test" 375 | version = "0.1.0" 376 | dependencies = [ 377 | "image", 378 | "num_cpus 0.2.13", 379 | "obj-rs", 380 | "scoped_threadpool", 381 | "stackvec", 382 | ] 383 | 384 | [[package]] 385 | name = "stackvec" 386 | version = "0.2.1" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "a28337dadadf1f595e7472e02ed7e27cbc790828b10336f144b5790d21152c16" 389 | 390 | [[package]] 391 | name = "syn" 392 | version = "1.0.60" 393 | source = "registry+https://github.com/rust-lang/crates.io-index" 394 | checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" 395 | dependencies = [ 396 | "proc-macro2", 397 | "quote", 398 | "unicode-xid", 399 | ] 400 | 401 | [[package]] 402 | name = "tiff" 403 | version = "0.6.1" 404 | source = "registry+https://github.com/rust-lang/crates.io-index" 405 | checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" 406 | dependencies = [ 407 | "jpeg-decoder", 408 | "miniz_oxide 0.4.3", 409 | "weezl", 410 | ] 411 | 412 | [[package]] 413 | name = "unicode-xid" 414 | version = "0.2.1" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" 417 | 418 | [[package]] 419 | name = "vec_map" 420 | version = "0.8.2" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 423 | 424 | [[package]] 425 | name = "weezl" 426 | version = "0.1.3" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "3e2bb9fc8309084dd7cd651336673844c1d47f8ef6d2091ec160b27f5c4aa277" 429 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "simplerays-test" 3 | version = "0.1.0" 4 | authors = ["dranikpg"] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | image = "*" 11 | num_cpus = "0.2" 12 | scoped_threadpool = "0.1.9" 13 | stackvec="*" 14 | obj-rs = "0.6" 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Simple ray tracer written in Rust from scratch 2 | 3 | I've just finished my first semester at the Faculty of ~~Applied~~ 4 | Mathematics ~~and Computer Science~~ at the Belarusian SU. I missed conventional 5 | programming a bit and I'm curious to see how I can apply any of my new 6 | knowledge. Finding exciting yet widely applied and simple topic for a side 7 | project turned out to be not that simple. Linear algebra is broadly used in 8 | computer graphics, where I previously came across matrices, transformations and 9 | projections when working with OpenGL, but back then I had only a somewhat 10 | shallow understanding of those topics. I've never done any *ray tracing*, so my 11 | choice simply fell on it. Besides that it somewhat overhyped now and has very 12 | little to almost no theory - just vectors and geometry. I haven't read any posts 13 | or books specifically on ray tracing, so my approach surely won't be the fastest 14 | or most optimal, but I think it will be quite interesting to come up with a 15 | working one. 16 | 17 | I've chosen Rust 🦀 because it's my favourite programming language and I haven't 18 | used it for a while. So let's start! 19 | 20 | ### Everything starts with a ray 21 | 22 | I've defined some utils for working with floating point numbers, a Point and 23 | Vector struct and some ~~ugly~~ convenient macros for creating vectors and 24 | points. I first used `f32` for all calculations, but then found out that 25 | precision degrades very quickly, especially for extremely sharp angles. At that 26 | point I had already marked the Point struct as `Copy`, so I kept the marker, 27 | even though its new size of 24 bytes exceeded twice the machine word. This is 28 | just a general rule of thumb and I bet it has almost no effect in this case, as 29 | the average number of arguments in generally low. 30 | 31 | Raytracing has obviously something to do with casting rays. A ray is just a line 32 | with a positive direction. A line in space can be defined by a point and a 33 | direction vector. What matters is that we can describe every point on this line 34 | with a single number. 35 | 36 | ```rust 37 | impl Line { 38 | pub fn at(&self, t: f64) -> Point { 39 | self.origin + t * self.direction 40 | } 41 | } 42 | ``` 43 | 44 | To create an image we have to find out how to intersect rays with objects in 45 | space. Many might associate ray tracing with spheres, because they nicely 46 | demonstrate many visual effects. But I won't cover any of those effects. So 47 | we'll focus just on triangles. Besides that triangles can be used to approximate 48 | almost any shape and 3d models consists of them. 49 | **But how do we find the intersection of a line and a triangle?** 50 | 51 | ### The plane 52 | 53 | First, we have to define the plane which contains the triangle. A plane can be 54 | defined by a single point and a _normal vector_. The normal vector is actually 55 | the cross product of any two vectors in the plane. 56 | 57 |
58 | 59 | ![Plane](images/sc_plane.png) 60 | 61 | 62 |
63 | 64 | So lets implement the _cross product_ for vectors: 65 | 66 | ```rust 67 | impl Vector { 68 | pub fn cross(&self, v2: Vector) -> Vector { 69 | Vector { 70 | x: (self.y * v2.z - self.z * v2.y), 71 | y: -(self.x * v2.z - self.z * v2.x), 72 | z: (self.x * v2.y - self.y * v2.x), 73 | } 74 | } 75 | } 76 | ``` 77 | 78 | Then we can turn our point-normal pair into a well known equation 79 | `Ax + By + Cz + D = 0`, so our Plane constructor looks like: 80 | 81 | ```rust 82 | impl Plane { 83 | pub fn new(p: Point, v1: Vector, v2: Vector) -> MathResult { 84 | match v1.cross(v2) { 85 | v if v.is_zero() => Err(MathError::CollinearVectors), 86 | Vector { x, y, z } => Ok(Plane { 87 | a: x, 88 | b: y, 89 | c: z, 90 | d: -(x * p.x + y * p.y + z * p.z), 91 | }) 92 | } 93 | } 94 | } 95 | ``` 96 | 97 | To find the intersection of a line and a plane, we can express the coordinates 98 | of all points on the line in terms of our "line parameter", and then substitute 99 | those relations into the planes equation. By solving the equation for the "line 100 | parameter" we get the point of intersection. 101 | 102 | ### Does the triangle contain it? 103 | 104 | There are many ways to determine whether a triangle contains a point in two 105 | dimensions, so I first thought of equivalent approaches: introducing a two 106 | dimensional coordinate system on the plane or looking for intersections with the 107 | triangles sides. 108 | 109 | One approach is based on the fact, that if a point lies inside a triangle, then 110 | it lies in the same half plane for each side of the triangle (right or left half 111 | plane, depends on the order of traversal). We can generalize this property for 112 | the third dimension be reviewing one other property for vectors on the plane: 113 | the cross product of a vector with all vectors pointing right of it will point 114 | upwards, and for all vectors left of it - downwards (or downwards/upwards if the 115 | order of vectors in the cross product is flipped). 116 | 117 |
118 | 119 | ![vector halves](images/sc_vec_halves.png) 120 | 121 |
122 | 123 | So if a point lies inside a triangle, then all cross products of each side with 124 | the corresponding vector, connecting the vertex and the point of intersection, 125 | point in the same direction: 126 | 127 |
128 | 129 |
130 | 131 | ![triangle 1](images/sc_tri1.png) 132 | 133 |
134 | 135 | 136 |
137 | 138 | ![triangle 2](images/sc_tri2.png) 139 | 140 |
141 | 142 |
143 | 144 | 145 | That results in a simple implementation using the cross product that we already 146 | defined: 147 | 148 | ```rust 149 | impl Triangle { 150 | fn is_inside(&self, pt: Point) -> bool { 151 | self.vertices.iter().enumerate() 152 | // calculate the cross products for each vertex 153 | .map(|(pos, vertex)| -> Vector { 154 | let next_vertex = self.vertices[(pos + 1) % 3]; 155 | vector!(cross vector!(vertex, pt), 156 | vector!(vertex, next_vertex)) 157 | }) 158 | // check if each vector is codirectional with the sum of the previous ones 159 | // that is equivalent to all of them being pairwise codirectional 160 | .fold(Some(vector!()), |last_opt, v| -> Option { 161 | match last_opt { 162 | Some(last) => if v.is_codirectional(last) { Some(v + last) } else { None } 163 | None => None, 164 | } 165 | }).is_some() 166 | } 167 | } 168 | ``` 169 | 170 | A ray intersects a triangle only if it intersects the plane containing the 171 | triangle and the point of intersection lies inside the triangle. Now we know how 172 | to verify both conditions, so lets move on to *casting rays*. 173 | 174 | ### How to cast rays? 175 | 176 | To create an image, we have to cast rays from an "eye" (or camera, or origin) 177 | through an imaginary grid. Finding the best approach to generate such a grid 178 | turned out to be an interesting task. For the sake of simplicity we'll say that 179 | our eye always looks at the origin and its rotation is locked. If it were to be 180 | an airplane, we'd say that its roll is always zero :) 181 | 182 | ![Airplane](https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/Yaw_Axis_Corrected.svg/250px-Yaw_Axis_Corrected.svg.png) 183 | 184 | Lets also say, that the global Y axis is the one that points "up". That means, 185 | that if the angle between the eye and the Oxz plane is not 90 degrees (a 186 | top-down projection), then "up" on the image always points "up" in the 3d world. 187 | Now we can see that the plane formed by the "eye" ray and the Y axis will always 188 | be perpendicular to the Oxz plane. 189 | 190 | Given those relations, there is a simple way to define the imaginary grid plane 191 | with a 2d coordinate system fixed at the global origin: 192 | 193 | * Because our rotation is always zero, our grid will be perpendicular to the 194 | "eye"-Y axis plane, so we can define our *local X axis* (Vx on the image) as 195 | the cross product of the Y axis and the "eye" ray. 196 | * Our *local Y axis* (Vy on the image) can be defined as the cross product 197 | between the "eye" ray and the local X axis. 198 | 199 | ![](images/sc_ray.png) 200 | 201 | Because I want the axes to point how I'm used to, ~~we~~ I have to "flip" x and 202 | y when converting image coordinates into rays: 203 | 204 | ```rust 205 | fn create_ray(env: &Environment, (x, y): (u32, u32)) -> Line { 206 | let interpolated = |cur: u32, max: u32| -> f64 { 207 | 2f64 * (cur as f64 / max as f64) - 1f64 208 | }; 209 | let vx = vector!(cross env.origin, vector!(axis y)).normalized(); 210 | let vy = vector!(cross env.origin, vx).normalized(); 211 | let pt = vector!() 212 | + interpolated(y, IMAGE_SIZE.1) * env.grid_size * vx 213 | + interpolated(x, IMAGE_SIZE.0) * env.grid_size * vy; 214 | Line { 215 | direction: vector!(env.origin, pt), 216 | origin: env.origin, 217 | } 218 | } 219 | ``` 220 | 221 | ### Turn the lights on! 222 | 223 | We already know how to find intersections of lines and triangles. But what about 224 | the _brightness_? In our world all objects will be opaque and there will be only 225 | one source of light - the sun. To find out whether a point on a triangle is lit 226 | by the sun, we have to cast another ray. If the ray from the intersection point 227 | to the sun intersects any other triangle, then our pixel is covered by a shadow. 228 | Because we don't consider on which side the "eye" ray intersected the plane, we 229 | have to make sure that both the sun and the "eye" are in the same half-space, 230 | bounded by the surface plane. Without this check both sides of each triangle 231 | would have the exact same lighting, which is obviously not true for 232 | non-transparent shapes. Two points are in the same half-space if their 233 | corresponding values for the plane formula are of the same sign. 234 | 235 | As far as I know, real raytracing casts many more rays to compute reflections, 236 | refractions, scattering etc. Instead, I decided to implement something *similar* 237 | to the _Phong shading_ model, which I'm familiar with from OpenGL. In this 238 | model, the brightness of a "pixel" consists of its _ambient_, _diffuse_ and 239 | specular components: 240 | 241 | * Every pixel is at least as bright as the _ambient_ brightness, even if it lies 242 | in a shadow 243 | * A pixel is brighter if it directly faces the sun, and darker if the angle 244 | between the surface normal and the sun ray is greater. How much this 245 | brightness varies in relation to the angle is the defined by the _diffuse_ 246 | part. 247 | * Specular lighting indicates how rough or even a material is 248 | (the small bright spot on spheres), but it won't be used here 249 | 250 | Instead of finding the angle between the surface normal and the "sun" ray, we'll 251 | find just the cosine. The closer the absolute value is to 1, the closer the 252 | normal is to being aligned with the "sun" ray. We can find the cosine using the 253 | dot product. 254 | 255 | In our case we will use the ambient color only for covered pixels. 256 | 257 | ```rust 258 | fn compute_lights(env: &Environment, surface: &Triangle, pt: Point) -> f32 { 259 | let sun_ray = Line { 260 | direction: vector!(pt, env.sun), 261 | origin: pt, 262 | }; 263 | let covered = env.surfaces.iter() 264 | .filter(|sf| !sf.triangle.contains(pt)) 265 | .map(|sf| sf.triangle.intersect(&sun_ray)) 266 | // check if any intersection lies on the positive direction of the ray 267 | .any(|opt| opt.map(|t| t >= -FLOAT_EPS).unwrap_or(false)); 268 | let different_halves = surface.plane.subs(env.origin) 269 | * surface.plane.subs(env.sun) <= 0.0; 270 | if covered || different_halves { 271 | env.ambient_light 272 | } else { 273 | let normal = surface.plane.normal(); 274 | let cos = sun_ray.direction.cos(normal).abs() as f32; 275 | (1.0 - env.diffuse_light) + cos * env.diffuse_light 276 | } 277 | } 278 | ``` 279 | 280 | ### Lets cast finally 281 | 282 | It's pretty clear that from all the intersections, we have to discard those, 283 | which are behind our "eye", and choose the closest one from the remaining. Then 284 | we compute the brightness at the point of intersection and multiply it by the 285 | surface color: 286 | 287 | ```rust 288 | fn cast_ray(env: &Environment, ray: &Line) -> [u8; 3] { 289 | let intersection_opt = env.surfaces.iter() 290 | .map(|sf: &ColoredSurface| sf.triangle.intersect(ray).map(|t| (t, sf))) 291 | .filter(Option::is_some).map(Option::unwrap) 292 | // check if it lies on the positive direction of the ray 293 | .filter(|is| is.0 >= -FLOAT_EPS) 294 | // find closest to the origin 295 | .min_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); 296 | if let Some((ray_param, surface)) = intersection_opt { 297 | let brightness = compute_lights(&env, &surface.triangle, ray.at(ray_param)); 298 | surface.color.iter() 299 | .map(|c| (*c as f32 * brightness) as u8).try_collect().unwrap() 300 | } else { 301 | VOID_COLOR 302 | } 303 | } 304 | ``` 305 | 306 | ### Last steps 307 | 308 | Now we know how to cast rays, but how do we generate an image? The easiest way 309 | is just to save the ray casting results in an byte array (RBG, 3 bytes per 310 | pixel) and then convert it into a png. We'd also like to import 3d models to 311 | build more complex shapes. Oh, and using Rust and not going multi-threaded would 312 | be kind of lame. 313 | 314 | I'm using: 315 | 316 | * The [image ](https://crates.io/crates/image) crate to write the color array to 317 | a png file. 318 | * [obj-rs](https://crates.io/crates/obj-rs) to parse wavefront obj files and 319 | turn them into triangles. 320 | * [scoped_threadpool](https://crates.io/crates/scoped_threadpool) to avoid 321 | cluttering the code with `Arc`s when they're unnecessary 322 | * And of course the good old [num_cpus](https://crates.io/crates/num_cpus) 323 | 324 | ### Results: 325 | 326 | The results might seem not that impressive visually, but we're actually 327 | rendering 3d models (with shadows!) in less than just 400 lines of pure Rust 328 | without any graphics or maths libraries. 329 | 330 | Low poly wavefront from [Kenney](https://kenney.nl/assets/pirate-kit): 331 | 332 | ![Example](images/att7.gif) 333 | 334 | Moving sun: 335 | 336 | ![Example 1](images/att3.gif) 337 | 338 | By using sine in the interpolation function in `create_ray`, we can create some 339 | space curvature :) 340 | 341 | ![Example 2](images/att4.gif) 342 | 343 | My first three triangles (and an odd rotation bug): 344 | 345 | ![Example 4](images/att1.gif) 346 | -------------------------------------------------------------------------------- /images/att1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/att1.gif -------------------------------------------------------------------------------- /images/att3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/att3.gif -------------------------------------------------------------------------------- /images/att4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/att4.gif -------------------------------------------------------------------------------- /images/att6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/att6.gif -------------------------------------------------------------------------------- /images/att7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/att7.gif -------------------------------------------------------------------------------- /images/sc_plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/sc_plane.png -------------------------------------------------------------------------------- /images/sc_ray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/sc_ray.png -------------------------------------------------------------------------------- /images/sc_tri1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/sc_tri1.png -------------------------------------------------------------------------------- /images/sc_tri2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/sc_tri2.png -------------------------------------------------------------------------------- /images/sc_vec_halves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dranikpg/simple-rays/edc9ef21c1d9dd95edad1b1a828a27295fcd35a4/images/sc_vec_halves.png -------------------------------------------------------------------------------- /src/line.rs: -------------------------------------------------------------------------------- 1 | use crate::vector::*; 2 | 3 | #[derive(Debug)] 4 | pub struct Line { 5 | pub direction: Vector, 6 | pub origin: Point, 7 | } 8 | 9 | impl Line { 10 | pub fn at(&self, t: f64) -> Point { 11 | self.origin + t * self.direction 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | extern crate image; 2 | extern crate num_cpus; 3 | extern crate scoped_threadpool; 4 | extern crate stackvec; 5 | 6 | #[macro_use] 7 | mod vector; 8 | mod line; 9 | mod surface; 10 | mod shapes; 11 | 12 | use std::path::Path; 13 | use std::fs::File; 14 | use std::io::BufReader; 15 | use obj::{load_obj, Obj}; 16 | 17 | use stackvec::prelude::*; 18 | use scoped_threadpool::Pool; 19 | 20 | use vector::{Point, Vector}; 21 | use line::Line; 22 | use surface::{Triangle}; 23 | use shapes::*; 24 | 25 | // ========================== Float & Wrapper ====================================================== 26 | 27 | const FLOAT_EPS: f64 = 1e-8; 28 | 29 | pub fn is_zero(f: f64) -> bool { 30 | f.abs() <= FLOAT_EPS 31 | } 32 | 33 | #[derive(Copy, Clone, Debug)] 34 | pub enum MathError { 35 | CollinearVectors 36 | } 37 | 38 | pub type MathResult = Result; 39 | 40 | // ========================== Color & Environment ================================================== 41 | 42 | type Color = [u8; 3]; 43 | 44 | struct ColoredSurface { 45 | triangle: Triangle, 46 | color: Color, 47 | } 48 | 49 | struct Environment { 50 | origin: Vector, 51 | sun: Vector, 52 | ambient_light: f32, 53 | diffuse_light: f32, 54 | grid_size: f64, 55 | surfaces: Vec, 56 | } 57 | 58 | const IMAGE_SIZE: (u32, u32) = (500, 500); 59 | const VOID_COLOR: [u8; 3] = [30, 30, 30]; 60 | 61 | // ========================== Ray casting ========================================================== 62 | 63 | fn compute_lights(env: &Environment, surface: &Triangle, pt: Point) -> f32 { 64 | let sun_ray = Line { 65 | direction: vector!(pt, env.sun), 66 | origin: pt, 67 | }; 68 | let covered = env.surfaces.iter() 69 | .filter(|sf| !sf.triangle.contains(pt)) 70 | .map(|sf| sf.triangle.intersect(&sun_ray)) 71 | // check if any intersection lies on the positive direction of the ray 72 | .any(|opt| opt.map(|t| t >= -FLOAT_EPS).unwrap_or(false)); 73 | let different_halves = surface.plane.subs(env.origin) 74 | * surface.plane.subs(env.sun) <= 0.0; 75 | if covered || different_halves { 76 | env.ambient_light 77 | } else { 78 | let normal = surface.plane.normal(); 79 | let cos = sun_ray.direction.cos(normal).abs() as f32; 80 | (1.0 - env.diffuse_light) + cos * env.diffuse_light 81 | } 82 | } 83 | 84 | fn cast_ray(env: &Environment, ray: &Line) -> [u8; 3] { 85 | let intersection_opt = env.surfaces.iter() 86 | .map(|sf: &ColoredSurface| sf.triangle.intersect(ray).map(|t| (t, sf))) 87 | .filter(Option::is_some).map(Option::unwrap) 88 | // check if it lies on the positive direction of the ray 89 | .filter(|is| is.0 >= -FLOAT_EPS) 90 | // find closest to the origin 91 | .min_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); 92 | if let Some((ray_param, surface)) = intersection_opt { 93 | let brightness = compute_lights(&env, &surface.triangle, ray.at(ray_param)); 94 | surface.color.iter() 95 | .map(|c| (*c as f32 * brightness) as u8).try_collect().unwrap() 96 | } else { 97 | VOID_COLOR 98 | } 99 | } 100 | 101 | fn create_ray(env: &Environment, (x, y): (u32, u32)) -> Line { 102 | let interpolated = |cur: u32, max: u32| -> f64 { 103 | 2f64 * (cur as f64 / max as f64) - 1f64 104 | }; 105 | let vx = vector!(cross env.origin, vector!(axis y)).normalized(); 106 | let vy = vector!(cross env.origin, vx).normalized(); 107 | let pt = vector!() 108 | + interpolated(y, IMAGE_SIZE.1) * env.grid_size * vx 109 | + interpolated(x, IMAGE_SIZE.0) * env.grid_size * vy; 110 | Line { 111 | direction: vector!(env.origin, pt), 112 | origin: env.origin, 113 | } 114 | } 115 | 116 | fn cast_rays(env: &Environment, pool: &mut Pool) -> Vec { 117 | let pixel_count: usize = (IMAGE_SIZE.0 * IMAGE_SIZE.1) as usize; 118 | let chunks_size = pixel_count / num_cpus::get(); 119 | let mut buff: Vec<[u8; 3]> = vec![[0, 0, 0]; pixel_count]; 120 | pool.scoped(|scope| { 121 | let mut offset = 0; 122 | for chunk in buff.chunks_mut(chunks_size) { 123 | let chunk_len = chunk.len(); 124 | scope.execute(move || { 125 | let rays = (0..chunk.len() as u32) 126 | .map(|i| i + offset) 127 | .map(|i| (i / IMAGE_SIZE.1, i % IMAGE_SIZE.1)) 128 | .map(|cords| create_ray(&env, cords)); 129 | for (pixel, ray) in chunk.iter_mut().zip(rays) { 130 | *pixel = cast_ray(&env, &ray); 131 | } 132 | }); 133 | offset += chunk_len as u32; 134 | } 135 | }); 136 | 137 | // dirty but fast cast from Vec<[u8;3]> to Vec 138 | unsafe { 139 | buff.set_len(buff.len() * 3); 140 | std::mem::transmute(buff) 141 | } 142 | } 143 | 144 | // ========================== Helper =============================================================== 145 | 146 | fn parse_wavefront(filename: &str) -> Vec { 147 | let mut out = vec![]; 148 | let mut min_y = 0.0; 149 | let mut max_dim = 0.0; 150 | let y_offset = 10.0; 151 | let input = BufReader::new(File::open(filename).unwrap()); 152 | let model: Obj = load_obj(input).unwrap(); 153 | let color = [255, 100, 100]; 154 | 155 | for tri_indices_chunk in model.indices.chunks(3) { 156 | let vertices: [obj::Vertex; 3] = tri_indices_chunk 157 | .iter().map(|idx| model.vertices[*idx as usize]) 158 | .try_collect().unwrap(); 159 | let points: [Point; 3] = vertices.into_iter() 160 | .inspect(|vert| { 161 | vert.position.iter() 162 | .for_each(|coord| { 163 | max_dim = if coord.abs() > max_dim { coord.abs() } else { max_dim } 164 | }) 165 | }) 166 | .map(|vert| point!(vert.position[0], vert.position[1] - y_offset, vert.position[2])) 167 | .inspect(|vert| { 168 | min_y = if vert.y < min_y { vert.y } else { min_y } 169 | }) 170 | .try_collect().unwrap(); 171 | match triangle(points[0], points[1], points[2]) { 172 | Ok(triangle) => { 173 | out.push(ColoredSurface { 174 | triangle, 175 | color, 176 | }) 177 | } 178 | Err(err) => { 179 | eprintln!("{:?}", err); 180 | } 181 | } 182 | } 183 | // push plane at minimum height 184 | { 185 | let size = 60.0; 186 | let (tri1, tri2) = plane(point!(0, min_y - 2.0 * FLOAT_EPS, 0), size, size) 187 | .unwrap(); 188 | out.push(ColoredSurface { triangle: tri1, color: [200, 200, 200] }); 189 | out.push(ColoredSurface { triangle: tri2, color: [200, 200, 200] }); 190 | } 191 | out 192 | } 193 | 194 | fn main() { 195 | let mut env = Environment { 196 | origin: vector!(-5, 70, 0), 197 | sun: vector!(-80, 150, 80), 198 | ambient_light: 0.4, 199 | diffuse_light: 0.2, 200 | grid_size: 40.0, 201 | surfaces: parse_wavefront("test/tower.obj"), 202 | }; 203 | let mut thread_pool = Pool::new(num_cpus::get() as u32); 204 | let origin_radius = 160f64; 205 | let steps: usize = 65; 206 | 207 | for step in 0..20 { 208 | let percent = step as f64 / steps as f64; 209 | let angle: f64 = percent * 2.0 * std::f64::consts::PI; 210 | env.origin.x = angle.sin() * origin_radius; 211 | env.origin.z = angle.cos() * origin_radius; 212 | 213 | let buffer = cast_rays(&env, &mut thread_pool); 214 | image::save_buffer(&Path::new(&format!("test/output{}.png", step)), 215 | &buffer, IMAGE_SIZE.0, IMAGE_SIZE.1, image::ColorType::Rgb8) 216 | .expect("failed to write image"); 217 | } 218 | } 219 | -------------------------------------------------------------------------------- /src/shapes.rs: -------------------------------------------------------------------------------- 1 | use super::surface::{Triangle}; 2 | use super::vector::Point; 3 | use crate::MathResult; 4 | 5 | pub fn triangle(p1: Point, p2: Point, p3: Point) -> MathResult { 6 | Triangle::new(p1, p2, p3) 7 | } 8 | 9 | pub fn quad(p1: Point, p2: Point, p3: Point, p4: Point) -> MathResult<(Triangle, Triangle)> { 10 | Ok(( 11 | triangle(p1, p2, p3)?, 12 | triangle(p1, p2, p4)? 13 | )) 14 | } 15 | 16 | pub fn plane(center: Point, length: f32, width: f32) -> MathResult<(Triangle, Triangle)> { 17 | let p1 = center + point!(length / 2f32, 0, width / 2f32); 18 | let p2 = center + point!(-length / 2f32, 0, -width / 2f32); 19 | quad(p1, p2, center + point!(length / 2f32, 0, - width / 2f32), 20 | center + point!(- length / 2f32, 0, width / 2f32)) 21 | } 22 | 23 | pub fn tetrahedron(p1: Point, p2: Point, p3: Point, h: Point) -> MathResult> { 24 | Ok(vec![ 25 | triangle(p1, p2, h)?, 26 | triangle(p2, p3, h)?, 27 | triangle(p3, p1, h)?, 28 | triangle(p1, p2, p3)? 29 | ]) 30 | } 31 | 32 | pub fn cube(center: Point, size: f64) -> MathResult> { 33 | let mut out = vec![]; 34 | for dim in 0..3 { 35 | for side in &[-1, 1] { 36 | let mut vs = vec![]; 37 | for pt in 0..4 { 38 | let mut diff = vector!(); 39 | diff[dim] = *side as f64 * size / 2.0; 40 | let (d1, d2) = { 41 | let mut idx_id = (0..3).filter(|i| *i != dim); 42 | (idx_id.next().unwrap(), idx_id.next().unwrap()) 43 | }; 44 | let (ds1, ds2) = match pt { 45 | 0 => (-size / 2.0, -size / 2.0), 46 | 1 => (size / 2.0, size / 2.0), 47 | 2 => (size / 2.0, -size / 2.0), 48 | 3 => (-size / 2.0, size / 2.0), 49 | _ => unreachable!() 50 | }; 51 | diff[d1] = ds1; 52 | diff[d2] = ds2; 53 | vs.push(center + diff); 54 | } 55 | let qd = quad(vs[0], vs[1], vs[2], vs[3])?; 56 | out.push(qd.0); 57 | out.push(qd.1); 58 | } 59 | } 60 | Ok(out) 61 | } 62 | 63 | -------------------------------------------------------------------------------- /src/surface.rs: -------------------------------------------------------------------------------- 1 | use super::*; 2 | use super::vector::*; 3 | use super::line::Line; 4 | 5 | #[derive(Debug)] 6 | pub struct Plane { 7 | a: f64, 8 | b: f64, 9 | c: f64, 10 | d: f64, 11 | } 12 | 13 | impl Plane { 14 | pub fn new(p: Point, v1: Vector, v2: Vector) -> MathResult { 15 | match v1.cross(v2) { 16 | v if v.is_zero() => Err(MathError::CollinearVectors), 17 | Vector { x, y, z } => Ok(Plane { 18 | a: x, 19 | b: y, 20 | c: z, 21 | d: -(x * p.x + y * p.y + z * p.z), 22 | }) 23 | } 24 | } 25 | pub fn intersect(&self, line: &Line) -> Option { 26 | let Line { direction, origin } = line; 27 | let sum_t = self.a * direction.x + self.b * direction.y + self.c * direction.z; 28 | let sum_rhs = -self.d - self.a * origin.x - self.b * origin.y - self.c * origin.z; 29 | if is_zero(sum_t) { 30 | None 31 | } else { 32 | Some(sum_rhs / sum_t) 33 | } 34 | } 35 | pub fn contains(&self, pt: Point) -> bool { 36 | is_zero(self.subs(pt)) 37 | } 38 | pub fn subs(&self, pt: Point) -> f64 { 39 | self.a * pt.x + self.b * pt.y + self.c * pt.z + self.d 40 | } 41 | pub fn normal(&self) -> Vector { 42 | vector!(self.a, self.b, self.c) 43 | } 44 | } 45 | 46 | #[derive(Debug)] 47 | pub struct Triangle { 48 | pub vertices: [Point; 3], 49 | pub plane: Plane, 50 | } 51 | 52 | impl Triangle { 53 | pub fn new(p1: Point, p2: Point, p3: Point) -> MathResult { 54 | let plane = Plane::new(p1, vector!(p1, p2), vector!(p1, p3))?; 55 | Ok(Triangle { 56 | vertices: [p1, p2, p3], 57 | plane, 58 | }) 59 | } 60 | pub fn intersect(&self, line: &Line) -> Option { 61 | let (intersection, param) = match self.plane.intersect(line) { 62 | Some(t) => (line.at(t), t), 63 | None => return None, 64 | }; 65 | if self.is_inside(intersection) { 66 | Some(param) 67 | } else { 68 | None 69 | } 70 | } 71 | pub fn contains(&self, pt: Point) -> bool { 72 | self.plane.contains(pt) && self.is_inside(pt) 73 | } 74 | fn is_inside(&self, pt: Point) -> bool { 75 | self.vertices.iter().enumerate() 76 | // for each vertex calculate the cross product of 77 | // 1) the segment between the vertex and the intersection point 78 | // 2) the next triangle side 79 | .map(|(pos, vertex)| -> Vector { 80 | let next_vertex = self.vertices[(pos + 1) % 3]; 81 | vector!(cross vector!(vertex, pt), 82 | vector!(vertex, next_vertex)) 83 | }) 84 | // check if each vector `v` is codirectional with the sum of the previous ones 85 | // that is equivalent to all of them being pairwise codirectional 86 | .fold(Some(vector!()), |last_opt, v| -> Option { 87 | match last_opt { 88 | Some(last) => if v.is_codirectional(last) { Some(v + last) } else { None } 89 | None => None, 90 | } 91 | }).is_some() 92 | } 93 | } -------------------------------------------------------------------------------- /src/tmp.rs: -------------------------------------------------------------------------------- 1 | fn tmp1() { 2 | let tri1 = Surface::new(point!(10,-3,-1), point!(0,-3,-5), point!(0,-3,10)) 3 | .unwrap(); 4 | let tri2 = Surface::new(point!(4,2,0), point!(1,-2,0), point!(2,-2,3)) 5 | .unwrap(); 6 | let tri3 = Surface::new(point!(20,-4,-10), point!(20,-4,10), point!(-2,-4,-1)) 7 | .unwrap(); 8 | } 9 | 10 | fn tmp2() -> Vec { 11 | let mut env = Environment { 12 | origin: vector!(-5, 3, 1.25), 13 | sun: vector!(0, 5, 0), 14 | ambient_light: 0.4, 15 | phong_shading: 0.2, 16 | surfaces: build_shapes(), 17 | }; 18 | let mut shapes = vec![]; 19 | { 20 | let (tri1, tri2) = plane(point!(0.3,0,0), 5f32, 5f32); 21 | shapes.push(ColoredSurface { surface: tri1, color: (0, 255, 0) }); 22 | shapes.push(ColoredSurface { surface: tri2, color: (0, 255, 0) }); 23 | } 24 | { 25 | let vs = tetrahedron(point!(-1,0,0.25), point!(1,0,0.25), 26 | point!(-1,0,2.25), point!(0,1,1.25)); 27 | shapes.extend(vs.into_iter().map(|sf| 28 | ColoredSurface { surface: sf, color: (0, 0, 255) } 29 | )) 30 | } 31 | { 32 | let vs = cube(point!(0.25,0,-0.8), 1.0); 33 | shapes.extend(vs.into_iter().map(|sf| 34 | ColoredSurface { surface: sf, color: (255, 0, 0) } 35 | )) 36 | } 37 | shapes 38 | } 39 | 40 | fn tmp3() { 41 | let mut shapes = vec![]; 42 | { 43 | let (tri1, tri2) = plane(point!(0,0,0), 5f32, 5f32); 44 | shapes.push(ColoredSurface { triangle: tri1, color: [0, 255, 0] }); 45 | shapes.push(ColoredSurface { triangle: tri2, color: [0, 255, 0] }); 46 | } 47 | for step in 0..10 { 48 | let radius = 2.0; 49 | let percent = step as f32 / 10.0; 50 | let angle = percent * 2.0 * std::f32::consts::PI; 51 | let x = angle.cos() * radius; 52 | let z = angle.sin() * radius; 53 | let x2 = (angle + 0.3).cos() * radius; 54 | let z2 = (angle + 0.3).sin() * radius; 55 | let surface = triangle(point!(0,2,0), point!(x,0,z), point!(x2,0,z2)); 56 | let color = [(percent * 255.0) as u8, 0, 255]; 57 | shapes.push(ColoredSurface { triangle: surface, color }); 58 | } 59 | } -------------------------------------------------------------------------------- /src/vector.rs: -------------------------------------------------------------------------------- 1 | use super::*; 2 | use std::ops::{Add, Mul, Index, IndexMut}; 3 | 4 | // Point & Vector 5 | #[derive(Copy, Clone, Debug)] 6 | pub struct Point { 7 | pub x: f64, 8 | pub y: f64, 9 | pub z: f64, 10 | } 11 | 12 | pub type Vector = Point; 13 | 14 | macro_rules! point { 15 | ($x:expr, $y: expr, $z: expr) => 16 | {crate::vector::Point{x: $x as f64, y: $y as f64, z: $z as f64}} 17 | } 18 | 19 | macro_rules! vector { 20 | (axis x) => {vector!(1, 0, 0)}; 21 | (axis y) => {vector!(0, 1, 0)}; 22 | (axis z) => {vector!(0, 0, 1)}; 23 | () => {vector!(0,0,0)}; 24 | ($a: expr, $b: expr) => {vector!($b.x-$a.x, $b.y-$a.y, $b.z-$a.z)}; 25 | ($x:expr, $y: expr, $z: expr) => {point!($x, $y, $z) as crate::vector::Vector}; 26 | (cross $a:expr, $b: expr) => {$a.cross($b)}; 27 | } 28 | 29 | impl Vector { 30 | pub fn len(&self) -> f64 { 31 | let Vector { x, y, z } = self; 32 | (x * x + y * y + z * z).sqrt() 33 | } 34 | pub fn normalized(&self) -> Self { 35 | if !self.is_zero() { 36 | let len = self.len(); 37 | vector!(self.x / len, self.y / len, self.z / len) 38 | } else { 39 | vector!() 40 | } 41 | } 42 | pub fn dot(&self, v2: Vector) -> f64 { 43 | let Vector { x, y, z } = self; 44 | x * v2.x + y * v2.y + z * v2.z 45 | } 46 | pub fn cos(&self, v2: Vector) -> f64 { 47 | self.dot(v2) / (self.len() * v2.len()) 48 | } 49 | pub fn cross(&self, v2: Vector) -> Vector { 50 | Vector { 51 | x: (self.y * v2.z - self.z * v2.y), 52 | y: -(self.x * v2.z - self.z * v2.x), 53 | z: (self.x * v2.y - self.y * v2.x), 54 | } 55 | } 56 | pub fn is_zero(&self) -> bool { 57 | return is_zero(self.x) && is_zero(self.y) && is_zero(self.z); 58 | } 59 | pub fn is_collinear(&self, v2: Vector) -> bool { 60 | self.cross(v2).is_zero() 61 | } 62 | pub fn is_codirectional(&self, v2: Vector) -> bool { 63 | return self.is_collinear(v2) && self.x * v2.x >= -FLOAT_EPS 64 | && self.y * v2.y >= -FLOAT_EPS && self.z * v2.z >= -FLOAT_EPS; 65 | } 66 | } 67 | 68 | impl Add for Point { 69 | type Output = Point; 70 | fn add(self, rhs: Point) -> Self::Output { 71 | Point { 72 | x: self.x + rhs.x, 73 | y: self.y + rhs.y, 74 | z: self.z + rhs.z, 75 | } 76 | } 77 | } 78 | 79 | impl Mul for Vector { 80 | type Output = Vector; 81 | fn mul(self, rhs: f64) -> Self::Output { 82 | Vector { x: rhs * self.x, y: rhs * self.y, z: rhs * self.z } 83 | } 84 | } 85 | 86 | impl Mul for f64 { 87 | type Output = Vector; 88 | fn mul(self, rhs: Vector) -> Self::Output { 89 | rhs * self 90 | } 91 | } 92 | 93 | impl Index for Vector { 94 | type Output = f64; 95 | fn index(&self, index: usize) -> &Self::Output { 96 | match index { 97 | 0 => &self.x, 98 | 1 => &self.y, 99 | 2 => &self.z, 100 | _ => unreachable!() 101 | } 102 | } 103 | } 104 | 105 | impl IndexMut for Vector { 106 | fn index_mut(&mut self, index: usize) -> &mut Self::Output { 107 | match index { 108 | 0 => &mut self.x, 109 | 1 => &mut self.y, 110 | 2 => &mut self.z, 111 | _ => unreachable!() 112 | } 113 | } 114 | } -------------------------------------------------------------------------------- /test/tower.obj: -------------------------------------------------------------------------------- 1 | # exported usin 2 | 3 | 4 | g main 5 | 6 | v 1.937737 12.0899 -10.99677 7 | v 0.7877367 12.0899 -9.004911 8 | v 2.375365 12.74846 -10.7441 9 | v 1.225365 12.74846 -8.752247 10 | v 5.035323 13.57145 -9.208378 11 | v 4.322589 13.6798 -9.619875 12 | v 3.885323 13.57145 -7.216519 13 | v 3.172589 13.6798 -7.628016 14 | v 2.945694 13.25379 -10.41483 15 | v 1.795694 13.25379 -8.422967 16 | v 1.558462 10.40934 -11.21574 17 | v 1.558462 -1.443823e-14 -11.21574 18 | v 0.4084617 10.40934 -9.223886 19 | v 0.4084617 -1.443823e-14 -9.223886 20 | v 1.662632 11.32299 -11.1556 21 | v 0.5126319 11.32299 -9.163744 22 | v 5.699485 13.25379 -8.824924 23 | v 4.549485 13.25379 -6.833065 24 | v 0.3605232 -1.263345e-14 -11.90738 25 | v 0.3605232 10.5 -11.90738 26 | v 0.4955273 11.6841 -11.82943 27 | v 0.8913394 12.7875 -11.60091 28 | v 1.520985 13.73501 -11.23738 29 | v 3.609856 13.57145 -10.03137 30 | v 7.124193 13.73501 -8.002368 31 | v 6.303623 14.46207 -8.476125 32 | v 2.341556 14.46207 -10.76363 33 | v 3.297131 14.91911 -10.21192 34 | v 5.348048 14.91911 -9.027825 35 | v 4.322589 15.075 -9.619875 36 | v 7.753839 12.7875 -7.638842 37 | v 6.269813 12.74846 -8.495645 38 | v 6.707442 12.0899 -8.242979 39 | v 8.149652 11.6841 -7.410319 40 | v 6.982547 11.32299 -8.084147 41 | v 8.284656 10.5 -7.332375 42 | v 7.086717 10.40934 -8.024005 43 | v 8.284656 -1.443823e-14 -7.332375 44 | v 7.086717 -1.443823e-14 -8.024005 45 | v 5.99993 10.5 -3.375115 46 | v 6.517124 3.609557e-15 -4.27092 47 | v 5.557442 12.0899 -6.251121 48 | v 5.832547 11.32299 -6.092289 49 | v 2.845653 14.91911 -4.693551 50 | v 1.812516 15.075 -5.2723 51 | v 5.35644 12.7875 -3.486424 52 | v 5.806602 11.6841 -3.352039 53 | v 0.7947363 14.91911 -5.877648 54 | v -0.1383262 14.46207 -6.468342 55 | v 2.459856 13.57145 -8.039514 56 | v 5.119814 12.74846 -6.503786 57 | v 5.936717 10.40934 -6.032146 58 | v 5.936717 -1.443823e-14 -6.032146 59 | v -0.07250007 -1.804779e-15 -11.15736 60 | v -1.924202 10.5 -7.950115 61 | v -0.1042472 0.146064 -11.10237 62 | v -1.295037 5.7 -9.039861 63 | v -1.68777 5.7 -8.359627 64 | v -1.50606 12.7875 -7.44849 65 | v -0.9230849 13.73501 -7.004127 66 | v 4.680123 13.73501 -3.769114 67 | v 1.840596 17.00226 10.14533 68 | v 2.098145 17.22841 11.18921 69 | v 2.363066 17.1052 11.05028 70 | v 1.575674 17.12547 10.28427 71 | v 1.020107 17.12547 10.60502 72 | v 1.289794 17.1052 11.66993 73 | v 1.542578 17.22841 11.50997 74 | v 0.7673235 17.00226 10.76498 75 | v 0.9885922 12.32545 12.38754 76 | v 2.612665 12.22251 10.24329 77 | v 3.135136 12.32545 11.14823 78 | v 0.4661213 12.22251 11.48259 79 | v 2.952313 16.03709 10.83157 80 | v 2.429842 15.93415 9.926626 81 | v 2.255677 16.55082 9.957033 82 | v 2.900019 16.35631 10.82545 83 | v 2.377548 16.25336 9.920507 84 | v 2.778147 16.65376 10.86198 85 | v 2.072532 16.80626 10.03372 86 | v 2.595003 16.9092 10.93866 87 | v 1.818292 17.27043 11.34601 88 | v 1.295821 17.16749 10.44106 89 | v 0.2832985 15.93415 11.16593 90 | v 0.8266169 16.35631 12.02253 91 | v 0.3041461 16.25336 11.11759 92 | v 0.8057693 16.03709 12.07088 93 | v 0.8988715 12.74963 11.17278 94 | v 2.127986 12.74963 10.46315 95 | v 0.7437149 15.8996 10.90404 96 | v 0.7578319 16.11576 10.8713 97 | v 0.8104954 16.28498 10.82165 98 | v 0.3967147 16.55082 11.03031 99 | v 0.900373 16.43031 10.75323 100 | v 1.02134 16.54181 10.6707 101 | v 1.165152 16.61191 10.5797 102 | v 0.5546959 16.80626 10.91004 103 | v 1.322009 16.63582 10.48642 104 | v 1.481221 16.61191 10.39722 105 | v 1.631939 16.54181 10.31817 106 | v 1.763891 16.43031 10.25467 107 | v 1.868084 16.28498 10.21105 108 | v 1.937419 16.11576 10.19027 109 | v 1.97283 15.8996 10.19441 110 | v 0.9191856 16.65376 11.93525 111 | v 1.077167 16.9092 11.81499 112 | v 3.82374 14.46207 -4.180842 113 | v -3.209539 5.7 -9.238218 114 | v -3.209539 20.65 -7.537612 115 | v -1.847522 11.6841 -7.771149 116 | v 6.057799 20.65 -2.187112 117 | v 8.092093 2.346212e-14 -3.361612 118 | v -8.772689 29.20946 -4.325726 119 | v -8.077127 29.46613 -3.514874 120 | v -8.602126 29.46613 -4.424201 121 | v -8.247689 29.20946 -3.416399 122 | v -8.120991 29.78689 -4.701983 123 | v -7.854844 29.66308 -3.643208 124 | v -7.595992 29.78689 -3.792657 125 | v -8.379844 29.66308 -4.552535 126 | v -8.391479 24.86019 -3.333381 127 | v -8.91648 28.58981 -4.242707 128 | v -8.91648 24.86019 -4.242707 129 | v -8.391479 28.58981 -3.333381 130 | v -7.565425 29.78689 -5.02274 131 | v -7.318208 29.82912 -3.953035 132 | v -7.040425 29.78689 -4.113413 133 | v -7.843208 29.82912 -4.862361 134 | v -8.87991 28.91056 -4.263822 135 | v -8.35491 28.91056 -3.354495 136 | v -7.306571 29.66308 -5.172189 137 | v -6.781572 29.66308 -4.262862 138 | v -6.244936 24.86019 -4.572689 139 | v -6.703651 25.38987 -4.30785 140 | v -6.244936 28.58981 -4.572689 141 | v -6.703651 28.55509 -4.30785 142 | v -6.728415 28.77229 -4.293552 143 | v -6.281507 28.91056 -4.551575 144 | v -6.789413 28.94234 -4.258335 145 | v -6.388727 29.20946 -4.489671 146 | v -6.886449 29.08836 -4.202312 147 | v -7.012908 29.20041 -4.1293 148 | v -7.160173 29.27084 -4.044276 149 | v -6.55929 29.46613 -4.391197 150 | v -7.318208 29.29487 -3.953035 151 | v -7.932765 25.38987 -3.59822 152 | v -7.932765 28.55509 -3.59822 153 | v -7.908001 28.77229 -3.612518 154 | v -7.847003 28.94234 -3.647735 155 | v -7.749967 29.08836 -3.703759 156 | v -7.623507 29.20041 -3.77677 157 | v -7.476243 29.27084 -3.861794 158 | v -7.08429 29.46613 -5.300523 159 | v -6.913727 29.20946 -5.398998 160 | v -6.806507 28.91056 -5.460902 161 | v -6.769936 24.86019 -5.482016 162 | v -6.769936 28.58981 -5.482016 163 | v 3.628346 34.55 5.646564 164 | v 6.057799 34.55 5.646564 165 | v 3.628346 37.15 5.646564 166 | v 6.057799 37.15 5.646564 167 | v -4.477989 34.55 10.32676 168 | v -5.692715 34.55 12.43073 169 | v -6.628482 34.55 9.085171 170 | v -7.843208 34.55 11.18914 171 | v -8.778975 34.55 7.843583 172 | v -9.993701 34.55 9.947551 173 | v 6.057799 34.55 0.6802126 174 | v 6.057799 34.55 3.163388 175 | v 3.628346 34.55 0.6802126 176 | v 3.628346 34.55 3.163388 177 | v -4.477989 34.55 -3.999982 178 | v -6.628482 34.55 -2.758394 179 | v -5.692715 34.55 -6.10395 180 | v -7.843208 34.55 -4.862361 181 | v -8.778975 34.55 -1.516806 182 | v -9.993701 34.55 -3.620774 183 | v -1.94109 37.15 10.32676 184 | v -1.94109 34.55 10.32676 185 | v -0.7263635 37.15 12.43073 186 | v -0.7263635 34.55 12.43073 187 | v -12.47688 32.8 -2.187112 188 | v -12.47688 37.15 -2.187112 189 | v -9.993701 37.15 -3.620774 190 | v -3.209539 32.8 -7.537612 191 | v -3.209539 37.15 -7.537612 192 | v -5.692715 37.15 -6.10395 193 | v -4.477989 37.15 10.32676 194 | v -5.692715 37.15 12.43073 195 | v 3.628346 37.15 -0.7844667 196 | v 3.628346 32.65 -0.7844667 197 | v 3.628346 32.65 7.111243 198 | v 3.628346 37.15 7.111243 199 | v 3.628346 37.15 0.6802126 200 | v -12.47688 34.55 0.6802126 201 | v -12.47688 32.8 8.513888 202 | v -12.47688 34.55 3.163388 203 | v -12.47688 34.55 5.646564 204 | v -12.47688 37.15 5.646564 205 | v -12.47688 37.15 8.513888 206 | v -12.47688 37.15 0.6802126 207 | v -8.778975 37.15 7.843583 208 | v -9.993701 37.15 9.947551 209 | v -10.04742 37.15 5.646564 210 | v -10.04742 34.55 5.646564 211 | v -10.04742 37.15 7.111243 212 | v -10.04742 32.65 7.111243 213 | v -10.04742 34.55 3.163388 214 | v -10.04742 34.55 0.6802126 215 | v -10.04742 32.65 -0.7844667 216 | v -10.04742 37.15 0.6802126 217 | v -10.04742 37.15 -0.7844667 218 | v -3.209539 32.65 11.0591 219 | v -3.209539 37.15 11.0591 220 | v 2.359897 34.55 7.843583 221 | v 0.2094035 34.55 9.085171 222 | v 2.359897 37.15 7.843583 223 | v -3.209539 32.65 -4.732322 224 | v -3.209539 37.15 -4.732322 225 | v -4.477989 37.15 -3.999982 226 | v -8.778975 37.15 -1.516806 227 | v -0.7263635 37.15 -6.10395 228 | v -1.94109 37.15 -3.999982 229 | v 3.574623 34.55 9.947551 230 | v 3.574623 37.15 9.947551 231 | v 1.42413 34.55 11.18914 232 | v -3.209539 37.15 13.86439 233 | v 6.057799 37.15 8.513888 234 | v -3.209539 32.8 13.86439 235 | v 6.057799 32.8 -2.187112 236 | v -0.7263635 34.55 -6.10395 237 | v 3.574623 34.55 -3.620774 238 | v 6.057799 37.15 -2.187112 239 | v 1.42413 34.55 -4.862361 240 | v 3.574623 37.15 -3.620774 241 | v 6.057799 32.8 8.513888 242 | v 2.359897 34.55 -1.516806 243 | v 2.359897 37.15 -1.516806 244 | v 0.2094035 34.55 -2.758394 245 | v -1.94109 34.55 -3.999982 246 | v 6.057799 37.15 0.6802126 247 | v 7.530568 5.7 9.364192 248 | v 6.057799 20.65 8.513888 249 | v 5.227818 5.7 10.69368 250 | v -3.209539 2.52669e-14 16.21339 251 | v 4.619342 1.804779e-14 11.69338 252 | v -3.209539 20.65 13.86439 253 | v 12.9 1.804779e-14 5.676361 254 | v 10.71414 1.443823e-14 8.833142 255 | v 10.07735 2.165734e-14 -0.2950022 256 | v 7.464141 1.263345e-14 13.33583 257 | v 10.71414 1.082867e-14 11.45944 258 | v 8.092093 2.165734e-14 -0.4582201 259 | v -3.270965 9.023893e-15 -13.00399 260 | v -9.215218 1.443823e-14 12.74601 261 | v -3.484773 1.263345e-14 -12.88055 262 | v -5.228055 1.985256e-14 -15.9 263 | v -11.83294 2.346212e-14 -15.9 264 | v -12.70369 2.346212e-14 -4.405159 265 | v -14.96017 5.414336e-15 15.33996 266 | v -14.51117 1.804779e-14 2.58515 267 | v -14.51117 2.707168e-14 -3.361612 268 | v -19.6679 7.219114e-15 4.913502 269 | v -20.32389 7.219114e-15 11.48573 270 | v -13.74227 2.165734e-14 -7.767055 271 | v -15.13538 2.346212e-14 -10.18 272 | v -14.19348 2.165734e-14 -6.98554 273 | v 1.942002 22.59874 11.35203 274 | v 1.742002 22.59874 11.00561 275 | v 0.5407436 22.59874 12.16104 276 | v 0.3407436 22.59874 11.81463 277 | v 0.3407436 23.59874 11.81463 278 | v 0.5407436 23.59874 12.16104 279 | v -12.47688 28.03858 3.54715 280 | v -12.47688 28.03858 5.569692 281 | v -12.87688 28.03858 3.54715 282 | v -12.87688 28.03858 5.569692 283 | v -12.47688 20.65 -2.187112 284 | v -12.47688 20.65 8.513888 285 | v -14.29375 2.20704 4.746354 286 | v -14.29375 2.20704 9.562859 287 | v -12.87688 29.05615 5.578849 288 | v -12.87688 30.05615 5.578849 289 | v -12.87688 29.05615 7.196884 290 | v -12.87688 30.05615 7.196884 291 | v 1.742002 23.59874 11.00561 292 | v 1.942002 23.59874 11.35203 293 | v 2.474757 24.15882 -4.717662 294 | v 2.474757 25.40882 -4.717662 295 | v 2.274757 24.15882 -4.371252 296 | v 2.274757 25.40882 -4.371252 297 | v -12.87688 26.78858 3.54715 298 | v -12.87688 26.78858 5.569692 299 | v 6.057799 31.45 -2.187112 300 | v 6.057799 22 -2.187112 301 | v 6.057799 31.45 8.513888 302 | v 6.057799 22 8.513888 303 | v -12.47688 29.05615 5.578849 304 | v -12.47688 29.05615 7.196884 305 | v -12.47688 26.78858 5.569692 306 | v -12.47688 30.05615 7.196884 307 | v -12.47688 30.05615 5.578849 308 | v 0.532813 24.63117 12.16562 309 | v 0.3328131 24.63117 11.81921 310 | v -1.21876 24.63117 13.17689 311 | v -1.41876 24.63117 12.83048 312 | v -1.41876 25.88117 12.83048 313 | v -1.21876 25.88117 13.17689 314 | v 0.3328131 25.88117 11.81921 315 | v 0.532813 25.88117 12.16562 316 | v 4.226331 24.15882 -3.706391 317 | v 4.02633 24.15882 -3.35998 318 | v -12.47688 26.78858 3.54715 319 | v -3.209539 22 13.86439 320 | v -3.209539 31.45 13.86439 321 | v -12.47688 22 8.513888 322 | v -12.47688 31.45 8.513888 323 | v 4.226331 25.40882 -3.706391 324 | v 4.02633 25.40882 -3.35998 325 | v -3.209539 22 -7.537612 326 | v -3.209539 31.45 -7.537612 327 | v -12.47688 22 -2.187112 328 | v -12.47688 31.45 -2.187112 329 | v -11.16718 2.20704 11.36798 330 | v 7.975913 1.17933 0.6362727 331 | v 7.932203 1.623028 2.566747 332 | v 7.87467 2.20704 5.249041 333 | v 7.87467 2.20704 5.27373 334 | v 7.911412 1.834076 6.523213 335 | v 7.530568 5.7 7.219625 336 | v -11.12892 11.4 -4.017571 337 | v -7.526254 11.4 -6.09757 338 | v -5.350965 5.7 -8.001866 339 | v -6.067941 2.20704 -7.985255 340 | v -7.161982 2.20704 -7.353611 341 | v 1.317939 1.050174 -8.698799 342 | v 1.317939 5.170252 -8.698799 343 | v 1.317939 6.220426 -8.698799 344 | v 5.02724 5.170252 -6.557233 345 | v 5.02724 6.220426 -6.557233 346 | v 1.317939 10.3405 -8.698799 347 | v 1.3987 11.04884 -8.652172 348 | v 1.582163 11.56028 -8.546249 349 | v 1.874012 11.99947 -8.37775 350 | v 2.254357 12.33647 -8.158158 351 | v 2.697277 12.54831 -7.902438 352 | v 3.172589 12.62057 -7.628016 353 | v 3.647902 12.54831 -7.353595 354 | v 4.090822 12.33647 -7.097874 355 | v 4.471167 11.99947 -6.878282 356 | v 4.763016 11.56028 -6.709783 357 | v 4.946479 11.04884 -6.60386 358 | v 5.02724 10.3405 -6.557233 359 | v 5.02724 1.050174 -6.557233 360 | v 1.035671 6.380429 -7.995741 361 | v 4.559507 6.380429 -5.961253 362 | v 1.035671 10.2945 -7.995741 363 | v 4.559507 10.2945 -5.961253 364 | v 1.112394 10.96743 -7.951445 365 | v 4.482785 10.96743 -6.005549 366 | v 4.308495 11.45329 -6.106176 367 | v 1.286685 11.45329 -7.850819 368 | v 4.031238 11.87052 -6.26625 369 | v 1.563941 11.87052 -7.690744 370 | v 1.925268 12.19067 -7.482132 371 | v 3.669911 12.19067 -6.474863 372 | v 2.346043 12.39192 -7.239198 373 | v 3.249136 12.39192 -6.717797 374 | v 2.797589 12.46056 -6.978498 375 | v 1.035671 5.06725 -7.995741 376 | v 1.035671 1.153176 -7.995741 377 | v 4.559507 1.153176 -5.961253 378 | v 4.559507 5.06725 -5.961253 379 | v -16.67688 31.45 8.513888 380 | v -16.67688 31.45 -2.187112 381 | v -16.67688 32.8 8.513888 382 | v -16.67688 32.8 -2.187112 383 | v 8.157799 32.8 12.15119 384 | v 8.157799 31.45 12.15119 385 | v -1.109539 31.45 17.5017 386 | v -1.109539 32.8 17.5017 387 | v 8.157799 20.65 -5.824418 388 | v -1.109539 20.65 -11.17492 389 | v -1.109539 22 -11.17492 390 | v 8.157799 22 -5.824418 391 | v -5.309539 20.65 17.5017 392 | v -14.57688 20.65 12.15119 393 | v -5.309539 22 17.5017 394 | v -14.57688 22 12.15119 395 | v -3.270965 5.7 -10.14287 396 | v -0.0209651 9.023893e-15 -11.1276 397 | v -1.190965 5.7 -8.981765 398 | v -5.350965 5.7 -8.981765 399 | v -1.190965 5.7 -8.072795 400 | v -15.37844 2.20704 5.236108 401 | v -15.73446 2.20704 9.413525 402 | v -12.36549 2.20704 11.90904 403 | v 10.5442 0.3964554 7.702512 404 | v 8.27079 5.7 7.646993 405 | v 8.178321 1.686314 6.642291 406 | v 7.881367 2.20704 5.263754 407 | v -9.013893 2.20704 -9.755838 408 | v -8.552761 2.20704 -9.762507 409 | v -10.88653 11.4 -7.75774 410 | v -8.504643 11.4 -7.792191 411 | v -12.29148 1.391456 -9.683432 412 | v -12.10731 11.4 -5.71219 413 | v -12.82054 1.391456 -8.767073 414 | v -12.14217 1.393885 -9.932579 415 | v -11.5534 1.671037 -9.872339 416 | v -10.37939 2.20704 -9.755838 417 | v -5.123036 2.20704 -11.5997 418 | v -9.315158 2.20704 -11.53907 419 | v 6.190791 5.7 11.24966 420 | v -6.067941 2.20704 -10.29673 421 | v -4.795061 2.20704 -11.03163 422 | v 8.236341 5.7 10.02888 423 | 424 | vn 0.75 -0.5 0.4330127 425 | vn 0.6123725 -0.7071068 0.3535534 426 | vn -0.2241438 -0.9659258 -0.1294095 427 | vn 0 -1 0 428 | vn 0.4330127 -0.8660254 0.25 429 | vn 0.8660254 0 0.5 430 | vn 0.8365163 -0.258819 0.4829629 431 | vn -0.4330127 -0.8660254 -0.25 432 | vn 0.5 0 -0.8660254 433 | vn -0.75 -0.5 -0.4330127 434 | vn -0.8365163 -0.258819 -0.4829629 435 | vn 0.2241438 0.9659258 0.1294095 436 | vn 0.2223576 0.9664761 0.1283782 437 | vn 0 1 0 438 | vn 0.75 0.5 0.4330127 439 | vn 0.8365163 0.258819 0.4829629 440 | vn 0.7469063 0.5061369 0.4312266 441 | vn 0.8347195 0.2664417 0.4819255 442 | vn -0.2241438 0.9659258 -0.1294095 443 | vn -0.2223576 0.9664761 -0.1283782 444 | vn -0.4330127 0.8660254 -0.25 445 | vn -0.4299203 0.8680772 -0.2482146 446 | vn 0.2241438 -0.9659258 0.1294095 447 | vn -0.6123725 -0.7071068 -0.3535534 448 | vn -0.8586164 -0.1305262 -0.4957224 449 | vn -0.8660254 0 -0.5 450 | vn 0.8586164 -0.1305262 0.4957224 451 | vn -0.75 0.5 -0.4330127 452 | vn -0.6123725 0.7071068 -0.3535534 453 | vn -0.7469063 0.5061369 -0.4312266 454 | vn -0.6088029 0.7112046 -0.3514926 455 | vn 0.6123725 0.7071068 0.3535534 456 | vn 0.6088029 0.7112046 0.3514926 457 | vn 0.8586164 0.1305262 0.4957224 458 | vn -0.3905608 -0.8618534 0.3235288 459 | vn -0.1767949 -0.9612726 0.2114203 460 | vn 0.2714928 -0.9612726 -0.04739877 461 | vn 0.4754646 -0.8618534 -0.1764712 462 | vn -0.04901921 0.9951826 -0.08490377 463 | vn -0.8660254 0 0.5 464 | vn -0.7254904 -0.4975913 0.4754646 465 | vn -0.8238291 -0.2575722 0.5049376 466 | vn -0.5777107 -0.7037004 0.4135894 467 | vn -0.8522182 -0.1298974 0.5068046 468 | vn 0.04901921 -0.9951826 0.08490377 469 | vn 0.8650148 -0.1298974 -0.4846403 470 | vn 0.8492034 -0.2575722 -0.4609882 471 | vn 0.4975913 0.09803843 0.8618534 472 | vn 0.7745096 -0.4975913 -0.3905608 473 | vn 0.6470342 -0.7037004 -0.2935174 474 | vn 0.8660254 0 -0.5 475 | vn 0.4330127 0.8660254 0.25 476 | vn 0.4299203 0.8680772 0.2482146 477 | vn 0.4975913 0.09803843 -0.8618534 478 | vn -0.8586164 0.1305262 -0.4957224 479 | vn -0.8365163 0.258819 -0.4829629 480 | vn -0.8347195 0.2664417 -0.4819255 481 | vn 0.75 -0.5 -0.4330127 482 | vn 0.6123725 -0.7071068 -0.3535534 483 | vn 0.2241438 -0.9659258 -0.1294095 484 | vn 0.4330127 -0.8660254 -0.25 485 | vn -0.2241438 -0.9659258 0.1294095 486 | vn 0.8365163 -0.258819 -0.4829629 487 | vn -0.4330127 -0.8660254 0.25 488 | vn 0.8586164 -0.1305262 -0.4957224 489 | vn -0.5 0 -0.8660254 490 | vn -0.6123725 -0.7071068 0.3535534 491 | vn -0.75 -0.5 0.4330127 492 | vn -0.8365163 -0.258819 0.4829629 493 | vn -0.8586164 -0.1305262 0.4957224 494 | vn 0 0 -1 495 | vn -1 0 0 496 | vn 1 0 0 497 | vn 0.5 0 0.8660254 498 | vn -0.5 0 0.8660254 499 | vn 0 0 1 500 | vn -0.9951826 0.09803843 0 501 | vn -0.4975913 0.09803843 0.8618534 502 | vn 0.9951826 0.09803843 0 503 | vn -0.4975913 0.09803843 -0.8618534 504 | vn 0.3905608 0.8618534 -0.3235288 505 | vn 0.1767949 0.9612726 -0.2114203 506 | vn -0.2714928 0.9612726 0.04739877 507 | vn -0.4754646 0.8618534 0.1764712 508 | vn 0.8238291 0.2575722 -0.5049376 509 | vn 0.7254904 0.4975913 -0.4754646 510 | vn 0.5777107 0.7037004 -0.4135894 511 | vn 0.8522182 0.1298974 -0.5068046 512 | vn -0.4975913 -0.09803843 -0.8618534 513 | vn -0.8492034 0.2575722 0.4609882 514 | vn -0.8650148 0.1298974 0.4846403 515 | vn -0.7745096 0.4975913 0.3905608 516 | vn -0.6470342 0.7037004 0.2935174 517 | vn -0.6123725 0.7071068 0.3535534 518 | vn -0.75 0.5 0.4330127 519 | vn -0.2241438 0.9659258 0.1294095 520 | vn -0.4330127 0.8660254 0.25 521 | vn 0.2241438 0.9659258 -0.1294095 522 | vn -0.8365163 0.258819 0.4829629 523 | vn 0.4330127 0.8660254 -0.25 524 | vn -0.8586164 0.1305262 0.4957224 525 | vn 0.6123725 0.7071068 -0.3535534 526 | vn 0.8365163 0.258819 -0.4829629 527 | vn 0.75 0.5 -0.4330127 528 | vn 0.8586164 0.1305262 -0.4957224 529 | vn -0.7866628 0 -0.6173829 530 | vn 0.9280006 0 0.3725785 531 | vn -0.114923 -0.9455058 -0.3046497 532 | vn 0.1043215 -0.9779919 -0.1806901 533 | vn -0.1174325 -0.9447489 -0.3060375 534 | vn 0.8237633 -0.4965369 0.2736151 535 | vn 0.8278846 -0.4879005 0.2766949 536 | vn 0.6933903 -0.6971737 0.1820956 537 | vn 0.6982296 -0.6914623 0.1853518 538 | vn 0.06802942 -0.9907007 -0.1178304 539 | vn 0.06802942 0.9907007 -0.1178304 540 | vn 0.321296 -0.9455058 -0.0527986 541 | vn 0.5220349 -0.8499796 0.07081078 542 | vn 0.3237525 -0.944749 -0.0513192 543 | vn 0.5262603 -0.8471427 0.07347948 544 | vn 0.9231275 -0.1290905 0.3621758 545 | vn 0.9038911 -0.2608779 0.3390038 546 | vn 0.9061326 -0.2500418 0.3411786 547 | vn -0.6488392 -0.496537 -0.5765923 548 | vn -0.5043945 -0.6971737 -0.5094457 549 | vn -0.6535671 -0.4879005 -0.5786217 550 | vn -0.5096342 -0.6914623 -0.5120087 551 | vn -0.3223414 -0.8499796 -0.4166902 552 | vn -0.3267652 -0.8471427 -0.419015 553 | vn -0.7455314 -0.2608779 -0.6132908 554 | vn -0.7485356 -0.2500418 -0.6141446 555 | vn 0.1043215 0.9779919 -0.1806901 556 | vn -0.7752171 -0.1290905 -0.618364 557 | vn 0.4585485 0.3986638 -0.7942294 558 | vn 0.4573504 0.3981448 -0.79518 559 | vn 0.4514354 0.3955753 -0.7998289 560 | vn 0.4561015 0.3976033 -0.7961677 561 | vn 0.4479815 0.3940692 -0.8025098 562 | vn 0.4491888 0.3945962 -0.8015755 563 | vn -0.2670244 0.8937271 0.3604858 564 | vn -0.266687 0.891338 0.3665989 565 | vn -0.2666997 0.8914276 0.3663716 566 | vn -0.3008876 0.6821936 -0.6663922 567 | vn -0.4548661 0.8897156 -0.03876682 568 | vn -0.4516767 0.8911796 -0.04227264 569 | vn -0.4518283 0.8911107 -0.04210635 570 | vn -0.2664478 0.8896695 0.3708013 571 | vn 0.4897883 0.201071 -0.8483384 572 | vn 0.3712459 0.8922417 0.2570629 573 | vn 0.3745512 0.8911796 0.2559497 574 | vn 0.3733873 0.8915552 0.2563423 575 | vn -0.007960862 0.2108364 -0.9774889 576 | vn -0.01414051 0.2096193 -0.9776808 577 | vn -0.01147535 0.2101453 -0.9776029 578 | vn 0.3008876 0.6821936 0.6663922 579 | vn -0.4493256 0.8922417 -0.04484865 580 | vn -0.8420265 0.2122673 -0.4959172 581 | vn -0.8403984 0.2131763 -0.4982834 582 | vn -0.8467942 0.2095695 -0.4888969 583 | vn 0 0.2123919 -0.9771845 584 | vn -0.002977317 0.8911106 -0.4537762 585 | vn -0.006602034 0.8897156 -0.4564673 586 | vn -0.002796784 0.8911796 -0.4536419 587 | vn -0.838799 0.2140632 -0.5005929 588 | vn -0.4897883 0.201071 0.8483384 589 | vn -0.4595581 0.3939864 -0.795978 590 | vn -0.4509782 0.3988635 -0.7984526 591 | vn -0.4563945 0.3957927 -0.7969016 592 | vn 0.3790403 0.8897156 0.2544297 593 | vn 0.9157971 0.4014229 0.01324545 594 | vn 0.9169694 0.3988635 0.008667684 595 | vn 0.9183342 0.3957926 0.003201588 596 | vn 0.8615001 0.1020953 -0.4973873 597 | vn -0.4464276 0.4014229 -0.7997262 598 | vn 0.4108813 0.8914276 -0.1911372 599 | vn 0.4111923 0.8911458 -0.1917812 600 | vn 0.4128085 0.8896695 -0.1951337 601 | vn 0.4614508 0.3976033 0.7930793 602 | vn 0.4710032 0.3940691 0.7892182 603 | vn 0.4669545 0.3955754 0.790869 604 | vn 0.9191163 0.3939864 0 605 | vn -0.3895458 0.8920249 -0.2292284 606 | vn -0.3954314 0.8896695 -0.2283024 607 | vn -0.3910486 0.8914276 -0.2289931 608 | vn 0.4585485 0.3986638 0.7942294 609 | vn -0.8615001 0.1020953 0.4973873 610 | vn 0.6332132 0.6821936 -0.3655858 611 | vn -0.6332132 0.6821936 0.3655858 612 | vn -0.9795767 0.201071 0 613 | vn 0.05991111 0.6821936 -0.728713 614 | vn 0 0.8922417 -0.4515582 615 | vn 0.4083117 0.8937271 -0.1858321 616 | vn -0.3852243 0.8937271 -0.2299007 617 | 618 | vt 82.61694 57.21212 619 | vt 64.5067 57.21212 620 | vt 82.61694 63.74831 621 | vt 64.5067 63.74831 622 | vt -82.61694 15.84897 623 | vt -82.61694 22.38515 624 | vt -64.5067 15.84897 625 | vt -64.5067 22.38515 626 | vt 82.61694 46.93668 627 | vt 82.61694 40.4005 628 | vt 64.5067 46.93668 629 | vt 64.5067 40.4005 630 | vt 82.61694 81.96328 631 | vt 82.61694 -1.136868e-13 632 | vt 64.5067 81.96328 633 | vt 64.5067 -1.136868e-13 634 | vt 82.61694 69.90211 635 | vt 64.5067 69.90211 636 | vt 82.61694 76.4383 637 | vt 64.5067 76.4383 638 | vt -82.61694 36.12924 639 | vt -82.61694 42.66542 640 | vt -64.5067 36.12924 641 | vt -64.5067 42.66542 642 | vt 33.52917 -1.312356e-13 643 | vt 33.52917 81.96328 644 | vt 44.42099 -1.170247e-13 645 | vt 44.42099 82.67716 646 | vt 32.58204 89.15743 647 | vt 43.19351 92.00076 648 | vt 30.08076 95.19608 649 | vt 39.59473 100.689 650 | vt 26.10178 100.3816 651 | vt 20.91628 104.3606 652 | vt 33.86991 108.1497 653 | vt 14.87763 106.8618 654 | vt 8.397364 107.715 655 | vt -17.07518 108.1497 656 | vt -9.614448 113.8745 657 | vt 26.40917 113.8745 658 | vt 17.72096 117.4733 659 | vt -0.9262361 117.4733 660 | vt 8.397364 118.7008 661 | vt 1.917098 106.8618 662 | vt -4.121549 104.3606 663 | vt -22.80001 100.689 664 | vt -9.307052 100.3816 665 | vt -13.28603 95.19608 666 | vt -26.39878 92.00076 667 | vt -15.78732 89.15743 668 | vt -27.62626 82.67716 669 | vt -16.73445 81.96328 670 | vt -27.62626 -1.312356e-13 671 | vt -16.73445 -1.312356e-13 672 | vt 82.61694 82.67716 673 | vt 82.61694 -1.203816e-13 674 | vt 46.63701 82.67716 675 | vt 54.78179 2.172692e-14 676 | vt -82.61694 82.86536 677 | vt -64.5067 82.86536 678 | vt -82.61694 76.32918 679 | vt -64.5067 76.32918 680 | vt 82.61694 14.41503 681 | vt 43.20914 14.41503 682 | vt 82.61694 23.81908 683 | vt 43.08822 23.81908 684 | vt 82.61694 84.2993 685 | vt 82.61694 74.89525 686 | vt 44.86262 84.2993 687 | vt 45.71852 74.89525 688 | vt -82.61694 28.58306 689 | vt -43.20914 28.58306 690 | vt -82.61694 19.179 691 | vt -43.56367 19.179 692 | vt 82.61694 5.734105 693 | vt 82.61694 -0.802079 694 | vt 64.5067 5.734105 695 | vt 64.5067 -0.802079 696 | vt -82.61694 73.97229 697 | vt -64.5067 73.97229 698 | vt -82.61694 67.4361 699 | vt -64.5067 67.4361 700 | vt -82.61694 86.33401 701 | vt -64.5067 86.33401 702 | vt -82.61694 79.07779 703 | vt -64.5067 79.07779 704 | vt -82.61694 -1.136868e-13 705 | vt -82.61694 81.96328 706 | vt -64.5067 -1.136868e-13 707 | vt -64.5067 81.96328 708 | vt 82.61694 27.14912 709 | vt 82.61694 20.61294 710 | vt 64.5067 27.14912 711 | vt 64.5067 20.61294 712 | vt -82.61694 53.72466 713 | vt -82.61694 60.26084 714 | vt -64.5067 53.72466 715 | vt -64.5067 60.26084 716 | vt -82.61694 -5.763527e-14 717 | vt -82.61694 82.67716 718 | vt -75.79767 2.762986e-14 719 | vt -46.63701 82.67716 720 | vt -75.29771 1.15011 721 | vt -56.54512 44.88189 722 | vt -50.36034 44.88189 723 | vt 82.61694 76.88564 724 | vt 64.5067 76.88564 725 | vt 82.61694 84.14187 726 | vt 64.5067 84.14187 727 | vt -82.61694 55.77819 728 | vt -82.61694 65.18224 729 | vt -44.86262 55.77819 730 | vt -44.12764 65.18224 731 | vt 82.61694 75.40622 732 | vt 82.61694 66.00217 733 | vt 44.12764 75.40622 734 | vt 44.86262 66.00217 735 | vt 82.61694 87.76795 736 | vt 82.61694 78.3639 737 | vt 45.71852 87.76795 738 | vt 46.63701 78.3639 739 | vt -68.06483 93.33949 740 | vt -75.43644 97.86762 741 | vt -76.07151 95.40062 742 | vt -67.42976 95.80649 743 | vt 82.29486 38.06158 744 | vt 90.93661 37.6557 745 | vt 90.30154 40.12271 746 | vt 82.92993 35.59457 747 | vt -42.02853 97.45296 748 | vt -22.51188 89.18524 749 | vt -22.51188 97.45296 750 | vt -42.02853 89.18524 751 | vt -85.48483 126.2763 752 | vt -80.13605 96.2402 753 | vt -77.25695 125.4658 754 | vt -88.36394 97.05076 755 | vt -75.74889 130.7508 756 | vt -84.24011 129.0944 757 | vt -76.019 128.2178 758 | vt -83.97001 131.6274 759 | vt -74.46154 124.0902 760 | vt -82.98016 122.5809 761 | vt -74.77545 121.5621 762 | vt -82.66624 125.109 763 | vt -72.74767 108.7456 764 | vt -80.50226 112.5811 765 | vt -80.9092 110.0664 766 | vt -72.34072 111.2604 767 | vt -84.9353 130.8087 768 | vt -76.95998 127.4563 769 | vt -76.7081 129.9912 770 | vt -85.18718 128.2738 771 | vt -43.45704 90.46659 772 | vt -48.52156 97.48052 773 | vt -50.05618 95.4472 774 | vt -41.92242 92.49991 775 | vt 80.47005 41.42568 776 | vt 88.60381 44.37298 777 | vt 87.06919 46.4063 778 | vt 82.00468 39.39236 779 | vt 77.79293 119.0733 780 | vt 85.76825 122.4258 781 | vt 77.54105 121.6083 782 | vt 86.02013 119.8908 783 | vt 42.02853 87.92017 784 | vt 37.85784 92.09086 785 | vt 22.51188 87.92017 786 | vt 42.02853 117.2872 787 | vt 26.68257 92.09086 788 | vt 37.85784 117.0139 789 | vt 37.63268 118.7241 790 | vt 41.69603 119.8129 791 | vt 37.07807 120.063 792 | vt 40.72116 122.1664 793 | vt 36.19581 121.2128 794 | vt 35.04603 122.0951 795 | vt 33.70708 122.6497 796 | vt 39.17038 124.1874 797 | vt 32.2702 122.8389 798 | vt 25.37002 124.1874 799 | vt 27.39104 125.7382 800 | vt 37.14937 125.7382 801 | vt 34.79585 126.713 802 | vt 29.74456 126.713 803 | vt 32.2702 127.0455 804 | vt 30.83333 122.6497 805 | vt 23.81924 122.1664 806 | vt 29.49438 122.0951 807 | vt 28.3446 121.2128 808 | vt 27.46234 120.063 809 | vt 22.84438 119.8129 810 | vt 26.90772 118.7241 811 | vt 22.51188 117.2872 812 | vt 26.68257 117.0139 813 | vt 78.63775 103.6584 814 | vt 86.58876 107.0681 815 | vt 78.36765 106.1915 816 | vt 86.85886 104.535 817 | vt 80.52031 60.71457 818 | vt 89.08879 59.52059 819 | vt 88.68185 62.03531 820 | vt 80.92725 58.19984 821 | vt 80.13605 96.2402 822 | vt 85.48483 126.2763 823 | vt 77.25695 125.4658 824 | vt 88.36394 97.05076 825 | vt 79.61699 82.57188 826 | vt 87.50778 86.1187 827 | vt 79.30308 85.09989 828 | vt 87.82169 83.59068 829 | vt 82.61694 52.29072 830 | vt 44.12764 52.29072 831 | vt 82.61694 61.69477 832 | vt 43.56367 61.69477 833 | vt -82.61694 7.168039 834 | vt -43.08822 7.168039 835 | vt -82.61694 -2.236013 836 | vt -43.20914 -2.236013 837 | vt -82.61694 48.37062 838 | vt -43.56367 48.37062 839 | vt -82.61694 38.96657 840 | vt -44.12764 38.96657 841 | vt 58.2571 39.72843 842 | vt 44.42099 39.72843 843 | vt 51.5618 158.0148 844 | vt 44.42099 77.70666 845 | vt 43.19351 87.07539 846 | vt 39.59473 95.80566 847 | vt 33.86991 103.3025 848 | vt 26.40917 109.055 849 | vt 17.72096 112.6712 850 | vt 8.397364 113.9047 851 | vt -32.69804 158.0148 852 | vt -0.9262361 112.6712 853 | vt -9.614448 109.055 854 | vt -17.07518 103.3025 855 | vt -22.80001 95.80566 856 | vt -26.39878 87.07539 857 | vt -27.62626 77.70666 858 | vt -41.94608 -5.370721 859 | vt -27.62626 -5.370721 860 | vt -82.61694 76.17175 861 | vt -82.61694 85.5758 862 | vt -46.63701 76.17175 863 | vt -45.71852 85.5758 864 | vt 82.61694 34.69531 865 | vt 43.56367 34.69531 866 | vt 82.61694 44.09936 867 | vt 43.20914 44.09936 868 | vt -82.61694 68.46819 869 | vt -82.61694 77.87224 870 | vt -45.71852 68.46819 871 | vt -44.86262 77.87224 872 | vt -64.03569 156.4182 873 | vt -55.76797 158.9656 874 | vt -64.03569 158.9656 875 | vt -55.76797 156.4182 876 | vt -64.03569 55.69567 877 | vt -55.76797 53.14824 878 | vt -55.76797 55.69567 879 | vt -64.03569 53.14824 880 | vt -55.76797 195.7495 881 | vt -64.03569 225.1166 882 | vt -64.03569 195.7495 883 | vt -55.76797 225.1166 884 | vt 64.03569 62.15655 885 | vt 55.76797 64.70399 886 | vt 55.76797 62.15655 887 | vt 64.03569 64.70399 888 | vt -64.03569 193.5654 889 | vt -55.76797 196.1128 890 | vt -64.03569 196.1128 891 | vt -55.76797 193.5654 892 | vt -64.03569 111.0719 893 | vt -55.76797 108.5245 894 | vt -55.76797 111.0719 895 | vt -64.03569 108.5245 896 | vt 64.03569 116.6011 897 | vt 55.76797 119.1485 898 | vt 55.76797 116.6011 899 | vt 64.03569 119.1485 900 | vt -64.03569 -3.389329 901 | vt -55.76797 -5.936764 902 | vt -55.76797 -3.389329 903 | vt -64.03569 -5.936764 904 | vt -64.03569 217.4346 905 | vt -55.76797 219.9821 906 | vt -64.03569 219.9821 907 | vt -55.76797 217.4346 908 | vt -24.58212 195.7495 909 | vt -28.75281 199.9202 910 | vt -44.09877 195.7495 911 | vt -24.58212 225.1166 912 | vt -28.75281 224.8432 913 | vt -28.97797 226.5535 914 | vt -24.91462 227.6422 915 | vt -29.53258 227.8924 916 | vt -25.88948 229.9958 917 | vt -30.41484 229.0422 918 | vt -31.56462 229.9245 919 | vt -32.90357 230.4791 920 | vt -27.44027 232.0168 921 | vt -34.34045 230.6682 922 | vt -39.92808 199.9202 923 | vt -44.09877 225.1166 924 | vt -39.92808 224.8432 925 | vt -39.70293 226.5535 926 | vt -43.76627 227.6422 927 | vt -39.14831 227.8924 928 | vt -42.7914 229.9958 929 | vt -38.26605 229.0422 930 | vt -37.11627 229.9245 931 | vt -35.77732 230.4791 932 | vt -41.24063 232.0168 933 | vt -29.46128 233.5676 934 | vt -39.21961 233.5676 935 | vt -31.8148 234.5424 936 | vt -36.86609 234.5424 937 | vt -34.34045 234.8749 938 | vt 64.03569 163.0127 939 | vt 55.76797 165.5601 940 | vt 55.76797 163.0127 941 | vt 64.03569 165.5601 942 | vt 64.03569 222.3959 943 | vt 55.76797 219.8484 944 | vt 64.03569 219.8484 945 | vt 55.76797 222.3959 946 | vt 55.76797 225.1166 947 | vt 64.03569 195.7495 948 | vt 64.03569 225.1166 949 | vt 55.76797 195.7495 950 | vt -66.07465 -26.2471 951 | vt -53.30658 -43.16548 952 | vt -49.17273 -36.00542 953 | vt -70.2085 -33.40715 954 | vt 64.03569 200.7759 955 | vt 55.76797 198.2284 956 | vt 64.03569 198.2284 957 | vt 55.76797 200.7759 958 | vt 64.03569 228.9467 959 | vt 55.76797 226.3993 960 | vt 64.03569 226.3993 961 | vt 55.76797 228.9467 962 | vt -28.56966 272.0472 963 | vt -47.6992 272.0472 964 | vt -28.56966 292.5197 965 | vt -47.6992 292.5197 966 | vt 35.25975 81.31306 967 | vt 44.82453 97.87973 968 | vt 52.19277 71.53678 969 | vt 61.75755 88.10345 970 | vt 69.12579 61.76049 971 | vt 78.69056 78.32717 972 | vt -47.6992 5.356005 973 | vt -47.6992 24.90857 974 | vt -28.56966 5.356005 975 | vt -47.6992 44.46113 976 | vt -28.56966 44.46113 977 | vt -28.56966 24.90857 978 | vt 35.25975 -31.49592 979 | vt 52.19277 -21.71964 980 | vt 44.82453 -48.0626 981 | vt 61.75755 -38.28631 982 | vt 69.12579 -11.94336 983 | vt 78.69056 -28.51003 984 | vt -62.77709 292.5197 985 | vt -62.77709 272.0472 986 | vt -81.90664 292.5197 987 | vt -81.90664 272.0472 988 | vt 34.34045 272.0472 989 | vt 53.89301 272.0472 990 | vt 76.47037 258.2677 991 | vt 76.47037 292.5197 992 | vt 53.89301 292.5197 993 | vt 14.78788 272.0472 994 | vt -7.789475 258.2677 995 | vt -7.789475 292.5197 996 | vt 14.78788 292.5197 997 | vt 88.04905 272.0472 998 | vt 88.04905 292.5197 999 | vt 107.1786 272.0472 1000 | vt 107.1786 292.5197 1001 | vt -6.176903 292.5197 1002 | vt 5.356005 272.0472 1003 | vt -6.176903 257.0866 1004 | vt 55.99404 257.0866 1005 | vt 24.90857 272.0472 1006 | vt 44.46113 272.0472 1007 | vt 44.46113 292.5197 1008 | vt 55.99404 292.5197 1009 | vt 5.356005 292.5197 1010 | vt -17.22135 292.5197 1011 | vt -17.22135 258.2677 1012 | vt 67.03849 258.2677 1013 | vt 67.03849 292.5197 1014 | vt -88.04905 292.5197 1015 | vt -88.04905 272.0472 1016 | vt -107.1786 292.5197 1017 | vt -107.1786 272.0472 1018 | vt -44.46113 292.5197 1019 | vt -44.46113 272.0472 1020 | vt -55.99404 292.5197 1021 | vt -55.99404 257.0866 1022 | vt -24.90857 272.0472 1023 | vt -5.356005 272.0472 1024 | vt 6.176903 257.0866 1025 | vt -5.356005 292.5197 1026 | vt 6.176903 292.5197 1027 | vt 65.42592 257.0866 1028 | vt 65.42592 292.5197 1029 | vt 3.254973 257.0866 1030 | vt 3.254973 292.5197 1031 | vt -65.42592 257.0866 1032 | vt -14.78788 272.0472 1033 | vt -3.254973 257.0866 1034 | vt -3.254973 292.5197 1035 | vt -14.78788 292.5197 1036 | vt -53.89301 272.0472 1037 | vt -65.42592 292.5197 1038 | vt -34.34045 272.0472 1039 | vt -53.89301 292.5197 1040 | vt 5.719398 -48.0626 1041 | vt 15.28417 -31.49592 1042 | vt 25.27196 -59.35127 1043 | vt 25.27196 -37.26237 1044 | vt 79.11358 -6.176903 1045 | vt 98.24313 -17.22135 1046 | vt 79.11358 5.356005 1047 | vt 98.24313 5.356005 1048 | vt 62.77709 272.0472 1049 | vt 62.77709 292.5197 1050 | vt 81.90664 272.0472 1051 | vt 81.90664 292.5197 1052 | vt -28.14664 78.32717 1053 | vt -11.21362 88.10345 1054 | vt -18.58187 61.76049 1055 | vt -1.648847 71.53678 1056 | vt 5.719398 97.87973 1057 | vt 15.28417 81.31306 1058 | vt 64.03569 292.5197 1059 | vt 64.03569 272.0472 1060 | vt 44.90615 292.5197 1061 | vt 44.90615 272.0472 1062 | vt 25.27196 109.1684 1063 | vt 25.27196 87.07951 1064 | vt -47.6992 67.03849 1065 | vt -28.56966 55.99404 1066 | vt 79.11358 272.0472 1067 | vt 79.11358 292.5197 1068 | vt 98.24313 272.0472 1069 | vt 98.24313 292.5197 1070 | vt 79.11358 24.90857 1071 | vt 79.11358 44.46113 1072 | vt 98.24313 44.46113 1073 | vt 98.24313 24.90857 1074 | vt -51.5618 258.2677 1075 | vt 10.12069 272.0472 1076 | vt 32.69804 258.2677 1077 | vt 32.69804 292.5197 1078 | vt 10.12069 292.5197 1079 | vt -28.98444 272.0472 1080 | vt -51.5618 292.5197 1081 | vt -9.431876 272.0472 1082 | vt -28.98444 292.5197 1083 | vt -32.69804 258.2677 1084 | vt 28.98444 272.0472 1085 | vt 51.5618 258.2677 1086 | vt 51.5618 292.5197 1087 | vt 28.98444 292.5197 1088 | vt -10.12069 272.0472 1089 | vt -32.69804 292.5197 1090 | vt 9.431876 272.0472 1091 | vt -10.12069 292.5197 1092 | vt -76.47037 258.2677 1093 | vt 7.789475 258.2677 1094 | vt 7.789475 292.5197 1095 | vt -76.47037 292.5197 1096 | vt -40.51735 257.0866 1097 | vt 21.6536 257.0866 1098 | vt 21.6536 292.5197 1099 | vt -40.51735 292.5197 1100 | vt -64.03569 272.0472 1101 | vt -64.03569 292.5197 1102 | vt -44.90615 272.0472 1103 | vt -44.90615 292.5197 1104 | vt 79.11358 55.99404 1105 | vt 98.24313 67.03849 1106 | vt -47.6992 -17.22135 1107 | vt -28.14664 -28.51003 1108 | vt -28.56966 -6.176903 1109 | vt -18.58187 -11.94336 1110 | vt 47.6992 272.0472 1111 | vt 28.56966 272.0472 1112 | vt 47.6992 292.5197 1113 | vt 28.56966 292.5197 1114 | vt 14.48478 35.49876 1115 | vt -22.51188 87.92017 1116 | vt 7.789475 153.7851 1117 | vt -22.51188 117.2872 1118 | vt -22.84438 119.8129 1119 | vt -23.81924 122.1664 1120 | vt -25.37002 124.1874 1121 | vt -27.39104 125.7382 1122 | vt -29.74456 126.713 1123 | vt -32.2702 127.0455 1124 | vt -42.02853 87.92017 1125 | vt -6.452126 35.49876 1126 | vt -85.7184 -9.600385 1127 | vt -14.53719 -9.600385 1128 | vt -76.47037 153.7851 1129 | vt -42.02853 117.2872 1130 | vt -41.69603 119.8129 1131 | vt -40.72116 122.1664 1132 | vt -39.17038 124.1874 1133 | vt -37.14937 125.7382 1134 | vt -34.79585 126.713 1135 | vt -101.5748 44.69576 1136 | vt -84.36331 69.5523 1137 | vt -79.34921 -2.322852 1138 | vt -58.77276 105.0065 1139 | vt -84.36331 90.2318 1140 | vt -63.71726 -3.608032 1141 | vt -51.31594 -33.62929 1142 | vt -63.71726 -26.46938 1143 | vt -36.37277 92.07387 1144 | vt -46.7458 -47.49722 1145 | vt -55.80092 -63.18114 1146 | vt -65.23351 -57.73523 1147 | vt -3.216234 -72.62903 1148 | vt 25.27196 127.6645 1149 | vt -2.838765 -93.75886 1150 | vt -12.27135 -88.31295 1151 | vt 0.5708667 -87.8532 1152 | vt 25.75563 -102.3936 1153 | vt 72.56077 100.3623 1154 | vt 27.43916 -101.4216 1155 | vt 41.16578 -125.1969 1156 | vt 93.17277 -125.1969 1157 | vt 100.0291 -34.68629 1158 | vt 117.7966 120.7871 1159 | vt 114.2612 20.35551 1160 | vt 114.2612 -26.46938 1161 | vt 154.8653 38.689 1162 | vt 160.0307 90.43884 1163 | vt 108.2069 -61.15791 1164 | vt 119.1763 -80.15748 1165 | vt 111.7597 -55.00426 1166 | vt -67.03849 292.5197 1167 | vt -67.03849 258.2677 1168 | vt 17.22135 258.2677 1169 | vt 17.22135 292.5197 1170 | vt -21.6536 257.0866 1171 | vt 40.51735 257.0866 1172 | vt 40.51735 292.5197 1173 | vt -21.6536 292.5197 1174 | vt 38.76373 292.5197 1175 | vt 38.76373 272.0472 1176 | vt 19.63418 292.5197 1177 | vt 19.63418 272.0472 1178 | vt -79.11358 272.0472 1179 | vt -98.24313 272.0472 1180 | vt -79.11358 292.5197 1181 | vt -98.24313 292.5197 1182 | vt 15.29136 89.38602 1183 | vt 13.71655 86.65838 1184 | vt 4.257824 95.75623 1185 | vt 2.683021 93.02859 1186 | vt 81.90664 177.9428 1187 | vt 81.90664 185.8168 1188 | vt 85.05624 177.9428 1189 | vt 85.05624 185.8168 1190 | vt 98.24313 27.93031 1191 | vt 98.24313 43.85584 1192 | vt 101.3927 27.93031 1193 | vt 101.3927 43.85584 1194 | vt -26.46938 -11.20199 1195 | vt -17.22135 152.1835 1196 | vt 20.35551 -11.20199 1197 | vt 67.03849 152.1835 1198 | vt 37.37286 6.260402 1199 | vt 75.2981 6.260402 1200 | vt 43.92795 228.7886 1201 | vt 43.92795 236.6626 1202 | vt 56.66837 228.7886 1203 | vt 56.66837 236.6626 1204 | vt -81.90664 185.8168 1205 | vt -81.90664 177.9428 1206 | vt -85.05624 185.8168 1207 | vt -85.05624 177.9428 1208 | vt -41.91334 190.227 1209 | vt -41.91334 200.0695 1210 | vt -38.76373 190.227 1211 | vt -38.76373 200.0695 1212 | vt -15.29136 89.38602 1213 | vt -4.257824 95.75623 1214 | vt -13.71655 86.65838 1215 | vt -2.683021 93.02859 1216 | vt 27.93031 210.9337 1217 | vt 27.93031 220.7762 1218 | vt 43.85584 210.9337 1219 | vt 43.85584 220.7762 1220 | vt 17.22135 247.6378 1221 | vt 17.22135 173.2283 1222 | vt -67.03849 247.6378 1223 | vt -67.03849 173.2283 1224 | vt -98.24313 43.92795 1225 | vt -101.3927 43.92795 1226 | vt -98.24313 56.66837 1227 | vt -101.3927 56.66837 1228 | vt -98.24313 210.9337 1229 | vt -101.3927 210.9337 1230 | vt -98.24313 220.7762 1231 | vt -101.3927 220.7762 1232 | vt -98.24313 228.7886 1233 | vt -101.3927 228.7886 1234 | vt -98.24313 236.6626 1235 | vt -101.3927 236.6626 1236 | vt 98.24313 43.92795 1237 | vt 98.24313 56.66837 1238 | vt 101.3927 43.92795 1239 | vt 101.3927 56.66837 1240 | vt 4.195378 95.79229 1241 | vt 2.620575 93.06465 1242 | vt -9.596537 103.7551 1243 | vt -11.17134 101.0274 1244 | vt -31.45031 177.9428 1245 | vt -44.19073 177.9428 1246 | vt -31.45031 185.8168 1247 | vt -44.19073 185.8168 1248 | vt 81.90664 193.9462 1249 | vt 81.90664 203.7887 1250 | vt 85.05624 193.9462 1251 | vt 85.05624 203.7887 1252 | vt -81.90664 203.7887 1253 | vt -81.90664 193.9462 1254 | vt -85.05624 203.7887 1255 | vt -85.05624 193.9462 1256 | vt 33.27819 -29.18418 1257 | vt 19.48628 -37.14694 1258 | vt 31.70339 -26.45654 1259 | vt 17.91148 -34.4193 1260 | vt 101.3927 210.9337 1261 | vt 98.24313 210.9337 1262 | vt 101.3927 220.7762 1263 | vt 98.24313 220.7762 1264 | vt -76.47037 173.2283 1265 | vt 7.789475 173.2283 1266 | vt 7.789475 247.6378 1267 | vt -44.26284 193.9462 1268 | vt -44.26284 203.7887 1269 | vt -60.18837 203.7887 1270 | vt -60.18837 193.9462 1271 | vt -76.47037 247.6378 1272 | vt 32.69804 173.2283 1273 | vt -51.5618 173.2283 1274 | vt 32.69804 247.6378 1275 | vt -51.5618 247.6378 1276 | vt 41.91334 200.0695 1277 | vt 41.91334 190.227 1278 | vt 38.76373 200.0695 1279 | vt 38.76373 190.227 1280 | vt -4.195378 95.79229 1281 | vt 9.596537 103.7551 1282 | vt -2.620575 93.06465 1283 | vt 11.17134 101.0274 1284 | vt 101.3927 228.7886 1285 | vt 98.24313 228.7886 1286 | vt 101.3927 236.6626 1287 | vt 98.24313 236.6626 1288 | vt -98.24313 27.93031 1289 | vt -101.3927 27.93031 1290 | vt -98.24313 43.85584 1291 | vt -101.3927 43.85584 1292 | vt -33.27819 -29.18418 1293 | vt -31.70339 -26.45654 1294 | vt -19.48628 -37.14694 1295 | vt -17.91148 -34.4193 1296 | vt 1.697859 190.227 1297 | vt -14.22767 190.227 1298 | vt 1.697859 200.0695 1299 | vt -14.22767 200.0695 1300 | vt -32.69804 173.2283 1301 | vt 51.5618 173.2283 1302 | vt 51.5618 247.6378 1303 | vt -32.69804 247.6378 1304 | vt -17.22135 173.2283 1305 | vt -17.22135 247.6378 1306 | vt 67.03849 173.2283 1307 | vt 67.03849 247.6378 1308 | vt 76.47037 173.2283 1309 | vt 44.09877 195.7495 1310 | vt 76.47037 247.6378 1311 | vt 44.09877 225.1166 1312 | vt 43.76627 227.6422 1313 | vt 42.7914 229.9958 1314 | vt 41.24063 232.0168 1315 | vt 39.21961 233.5676 1316 | vt 36.86609 234.5424 1317 | vt 34.34045 234.8749 1318 | vt -7.789475 247.6378 1319 | vt 24.58212 195.7495 1320 | vt -7.789475 173.2283 1321 | vt 24.58212 225.1166 1322 | vt 24.91462 227.6422 1323 | vt 25.88948 229.9958 1324 | vt 27.44027 232.0168 1325 | vt 29.46128 233.5676 1326 | vt 31.8148 234.5424 1327 | vt -12.65833 -12.07801 1328 | vt -31.39429 5.384383 1329 | vt 41.94608 -12.07801 1330 | vt 32.69804 151.3075 1331 | vt -51.5618 151.3075 1332 | vt -59.82141 5.384383 1333 | vt 26.46938 -6.246741 1334 | vt 3.608032 -6.246741 1335 | vt 17.22135 157.1388 1336 | vt -67.03849 157.1388 1337 | vt -5.010021 3.084274 1338 | vt -20.21061 6.594869 1339 | vt -41.33103 11.21565 1340 | vt -41.52544 11.21565 1341 | vt -51.36389 8.264707 1342 | vt -56.84744 38.85241 1343 | vt -73.7338 38.85241 1344 | vt 69.28458 -7.848345 1345 | vt 60.07198 82.34995 1346 | vt 85.7184 -7.848345 1347 | vt 76.47037 155.5372 1348 | vt -7.789475 155.5372 1349 | vt 27.31608 82.34995 1350 | vt -14.48478 37.2508 1351 | vt 4.985342 37.2508 1352 | vt 9.939871 9.614046 1353 | vt 19.88704 9.614046 1354 | vt -38.76373 272.0472 1355 | vt -38.76373 292.5197 1356 | vt -19.63418 272.0472 1357 | vt -19.63418 292.5197 1358 | vt -11.21362 -38.28631 1359 | vt -1.648847 -21.71964 1360 | vt -16.73445 -6.805461e-14 1361 | vt 25.26009 8.269083 1362 | vt 33.52917 -6.805461e-14 1363 | vt 25.26009 40.71065 1364 | vt 25.26009 48.97973 1365 | vt -8.465362 40.71065 1366 | vt -8.465362 48.97973 1367 | vt 25.26009 81.4213 1368 | vt 24.5258 86.99876 1369 | vt 22.85773 91.02586 1370 | vt 20.2042 94.484 1371 | vt 16.74606 97.13753 1372 | vt 12.71896 98.8056 1373 | vt 8.397364 99.37455 1374 | vt 4.075762 98.8056 1375 | vt 0.04867006 97.13753 1376 | vt -3.409472 94.484 1377 | vt -6.062998 91.02586 1378 | vt -7.731073 86.99876 1379 | vt -8.465362 81.4213 1380 | vt -8.465362 8.269083 1381 | vt 24.41695 50.2396 1382 | vt -7.622226 50.2396 1383 | vt 24.41695 81.05909 1384 | vt -7.622226 81.05909 1385 | vt 23.71938 86.35769 1386 | vt -6.924652 86.35769 1387 | vt -5.33998 90.18343 1388 | vt 22.13471 90.18343 1389 | vt -2.81913 93.46866 1390 | vt 19.61386 93.46866 1391 | vt 16.32862 95.98951 1392 | vt 0.4661047 95.98951 1393 | vt 12.50288 97.57418 1394 | vt 4.291842 97.57418 1395 | vt 8.397364 98.11469 1396 | vt -65.05562 48.97973 1397 | vt -65.05562 81.4213 1398 | vt -59.09022 50.2396 1399 | vt -59.09022 81.05909 1400 | vt 67.42935 40.71065 1401 | vt 67.42935 8.269083 1402 | vt 61.46395 39.89961 1403 | vt 61.46395 9.080123 1404 | vt -30.40788 79.35002 1405 | vt -26.73018 81.68978 1406 | vt -27.12265 74.28588 1407 | vt -23.62884 76.50866 1408 | vt -65.05562 8.269083 1409 | vt -65.05562 40.71065 1410 | vt -59.09022 9.080123 1411 | vt -59.09022 39.89961 1412 | vt 68.00278 68.30128 1413 | vt 62.08659 67.2495 1414 | vt 67.40335 72.61877 1415 | vt 61.51713 71.35111 1416 | vt -8.465362 69.44588 1417 | vt 25.26009 69.44588 1418 | vt -7.622226 63.48493 1419 | vt 24.41695 63.48493 1420 | vt -8.465362 -62.78175 1421 | vt -7.622226 -56.82081 1422 | vt 25.26009 -62.78175 1423 | vt 24.41695 -56.82081 1424 | vt 62.80314 59.68863 1425 | vt 64.71661 55.77219 1426 | vt 57.50418 56.79739 1427 | vt 59.32199 53.07677 1428 | vt 67.55283 78.75774 1429 | vt 61.58763 78.39248 1430 | vt 67.44331 84.38227 1431 | vt 61.48358 83.73579 1432 | vt -64.20888 78.0966 1433 | vt -63.60946 82.41408 1434 | vt -58.29269 77.04482 1435 | vt -57.72324 81.14642 1436 | vt -56.73658 69.14254 1437 | vt -54.8231 73.05898 1438 | vt -51.34195 66.44713 1439 | vt -49.52414 70.16775 1440 | vt -62.41652 72.27185 1441 | vt -61.35054 76.49839 1442 | vt -56.6166 70.65461 1443 | vt -55.60392 74.66982 1444 | vt -64.55239 86.39075 1445 | vt -58.6127 85.48103 1446 | vt -64.85031 82.04205 1447 | vt -58.89572 81.34977 1448 | vt -8.465362 -52.86775 1449 | vt -7.622226 -46.82935 1450 | vt 25.26009 -52.86775 1451 | vt 24.41695 -46.82935 1452 | vt 67.42935 81.4213 1453 | vt 67.42935 48.97973 1454 | vt 61.46395 81.05909 1455 | vt 61.46395 50.2396 1456 | vt -64.93824 86.52606 1457 | vt -58.9785 85.87957 1458 | vt -65.04776 80.90153 1459 | vt -59.08255 80.53626 1460 | vt 41.02254 73.13459 1461 | vt 44.70024 70.79482 1462 | vt 37.9212 67.95346 1463 | vt 41.41502 65.73069 1464 | vt 66.52753 64.06268 1465 | vt 67.59351 59.83614 1466 | vt 60.78092 62.23412 1467 | vt 61.79359 58.2189 1468 | vt 67.84987 75.80541 1469 | vt 61.89528 75.11313 1470 | vt 67.55195 80.15411 1471 | vt 61.61226 79.24439 1472 | vt -7.622226 9.080123 1473 | vt -7.622226 39.89961 1474 | vt 24.41695 9.080123 1475 | vt 24.41695 39.89961 1476 | vt -98.24313 67.03849 1477 | vt -98.24313 -17.22135 1478 | vt -131.314 67.03849 1479 | vt -131.314 -17.22135 1480 | vt -98.24313 247.6378 1481 | vt -131.314 247.6378 1482 | vt -98.24313 258.2677 1483 | vt -131.314 258.2677 1484 | vt 131.314 247.6378 1485 | vt 98.24313 247.6378 1486 | vt 131.314 258.2677 1487 | vt 98.24313 258.2677 1488 | vt 131.314 -17.22135 1489 | vt 131.314 67.03849 1490 | vt -81.90664 258.2677 1491 | vt -81.90664 247.6378 1492 | vt -114.9775 258.2677 1493 | vt -114.9775 247.6378 1494 | vt 81.90664 247.6378 1495 | vt 81.90664 258.2677 1496 | vt 114.9775 247.6378 1497 | vt 114.9775 258.2677 1498 | vt 64.23463 95.6787 1499 | vt 47.6992 67.03849 1500 | vt -8.736529 137.8086 1501 | vt -25.27196 109.1684 1502 | vt -64.23463 95.6787 1503 | vt 8.736529 137.8086 1504 | vt 64.23463 -45.86156 1505 | vt -8.736529 -87.99149 1506 | vt 47.6992 -17.22135 1507 | vt -25.27196 -59.35127 1508 | vt -71.83459 162.5984 1509 | vt -71.83459 173.2283 1510 | vt -38.76373 162.5984 1511 | vt -38.76373 173.2283 1512 | vt 71.83459 173.2283 1513 | vt 71.83459 162.5984 1514 | vt 38.76373 173.2283 1515 | vt 38.76373 162.5984 1516 | vt -32.69804 162.5984 1517 | vt 51.5618 162.5984 1518 | vt -64.23463 -45.86156 1519 | vt 8.736529 -87.99149 1520 | vt 7.789475 162.5984 1521 | vt -76.47037 162.5984 1522 | vt -17.22135 162.5984 1523 | vt 67.03849 162.5984 1524 | vt 17.22135 162.5984 1525 | vt -67.03849 162.5984 1526 | vt 76.47037 162.5984 1527 | vt -7.789475 162.5984 1528 | vt 32.69804 162.5984 1529 | vt -51.5618 162.5984 1530 | vt -41.8074 137.8086 1531 | vt -114.7786 95.6787 1532 | vt 41.8074 137.8086 1533 | vt 114.7786 95.6787 1534 | vt 107.1786 162.5984 1535 | vt 107.1786 173.2283 1536 | vt 140.2495 162.5984 1537 | vt 140.2495 173.2283 1538 | vt -107.1786 173.2283 1539 | vt -107.1786 162.5984 1540 | vt -140.2495 173.2283 1541 | vt -140.2495 162.5984 1542 | vt 44.42099 -30.21778 1543 | vt 44.42099 -28.96371 1544 | vt 73.50185 -30.21778 1545 | vt 62.23761 18.72129 1546 | vt 43.95242 -30.21778 1547 | vt 42.85165 -30.11688 1548 | vt 42.6601 18.71657 1549 | vt 43.3274 -28.86551 1550 | vt 43.59859 18.71657 1551 | vt 61.41708 18.71657 1552 | vt 10.19714 -71.18001 1553 | vt 13.28953 -65.82383 1554 | vt 25.75563 -79.86515 1555 | vt 25.27196 -72.74188 1556 | vt 42.13358 -63.00682 1557 | vt 42.13358 -70.72256 1558 | vt 9.377678 -63.56532 1559 | vt 9.377678 -70.72256 1560 | vt 112.5492 37.37286 1561 | vt 112.5492 75.2981 1562 | vt 121.09 41.2292 1563 | vt 123.8934 74.12224 1564 | vt 97.36607 93.77196 1565 | vt 87.93059 89.51167 1566 | vt -55.43637 -111.3431 1567 | vt -22.42409 -111.3431 1568 | vt -74.76277 -150.081 1569 | vt 117.9572 4.346988 1570 | vt 127.3283 4.346988 1571 | vt 112.5146 -19.42071 1572 | vt 157.0659 -19.42071 1573 | vt 51.36312 -96.29808 1574 | vt 84.37541 -96.29808 1575 | vt 51.70026 -134.3653 1576 | vt -24.34959 -110.3624 1577 | vt -25.1765 -148.4221 1578 | vt -77.18348 -148.4221 1579 | vt -102.2268 5.272053 1580 | vt -86.5056 47.90291 1581 | vt -81.91953 15.64017 1582 | vt -79.63064 16.82791 1583 | vt -79.7754 47.90291 1584 | vt -9.155703 -97.21284 1585 | vt -2.598257 -90.29968 1586 | vt 21.07811 -97.21284 1587 | vt 1.253044 -58.72774 1588 | vt -6.33992 -67.80787 1589 | vt -62.00528 41.33103 1590 | vt -62.05801 41.44688 1591 | vt -62.00528 41.52544 1592 | vt 69.8572 0.676241 1593 | vt 66.22585 0.676241 1594 | vt 84.82835 74.70647 1595 | vt 66.07137 74.70647 1596 | vt -107.4326 -42.03043 1597 | vt -157.0659 -42.03043 1598 | vt -116.9756 -18.26273 1599 | vt -127.3283 -18.26273 1600 | vt 53.87889 -134.0656 1601 | vt 86.06081 -95.58048 1602 | vt 105.8859 -134.0656 1603 | vt -17.6406 -14.84198 1604 | vt 8.714583 65.75522 1605 | vt -9.308948 -14.84198 1606 | vt 1.139123 -26.04715 1607 | vt 8.244748 -26.04715 1608 | vt 95.60767 -5.88596 1609 | vt 90.97162 -3.652703 1610 | vt 85.72071 74.74191 1611 | vt 81.72746 0.6663314 1612 | vt 70.97554 0.6663314 1613 | vt 39.35091 -111.9076 1614 | vt 39.01377 -73.84039 1615 | vt 72.02605 -73.84039 1616 | vt -18.16236 -15.43291 1617 | vt -8.524097 65.22507 1618 | vt -15.87527 -15.45249 1619 | vt 10.23288 65.22507 1620 | vt 103.402 -12.37631 1621 | vt 77.53668 -12.37631 1622 | vt 86.5056 33.44133 1623 | vt 77.75012 33.44133 1624 | vt 0.8395587 -21.10304 1625 | vt -10.73364 -21.10304 1626 | vt 1.127474 8.820947 1627 | vt -26.94781 -40.01062 1628 | vt -28.89178 -40.01062 1629 | vt -7.535496 -67.44384 1630 | vt -7.928308 -64.89523 1631 | vt 0.173838 -58.4623 1632 | vt 0.07922841 -58.4623 1633 | vt -78.02141 14.61778 1634 | vt -59.26443 14.61778 1635 | vt -89.00232 -34.38564 1636 | vt 37.75638 -86.86325 1637 | vt 47.77906 -81.07664 1638 | vt 40.33887 -91.33625 1639 | vt 73.3477 -90.85883 1640 | vt 47.77906 -62.87603 1641 | vt 56.39356 -57.90244 1642 | vt 67.34457 -76.87014 1643 | vt 70.97554 -76.81763 1644 | vt 81.72746 -76.81763 1645 | vt 100.2438 19.31783 1646 | vt 78.34177 19.31783 1647 | vt 86.61856 92.08357 1648 | vt 71.21085 92.08357 1649 | vt 2.31777 8.07415 1650 | vt -27.42012 -40.92928 1651 | vt -16.43921 8.07415 1652 | vt -83.81744 -64.70649 1653 | vt -44.9641 -36.71786 1654 | vt -31.81046 -64.70649 1655 | vt -31.3686 -44.36929 1656 | vt -3.344496 -47.40215 1657 | vt -3.536053 1.431306 1658 | vt 15.22093 1.431306 1659 | vt -65.12434 60.21254 1660 | vt -64.85308 78.96756 1661 | vt -59.29581 56.84744 1662 | vt -59.29581 73.7338 1663 | vt -48.74639 88.57999 1664 | vt -41.16392 84.20225 1665 | vt -60.21254 15.59357 1666 | vt -60.6497 -29.84159 1667 | vt -90.2318 -33.238 1668 | vt -69.5523 -33.238 1669 | vt -21.83464 -98.6628 1670 | vt -19.92739 -103.4422 1671 | vt -61.83727 -127.4793 1672 | vt -9.830284 -127.4793 1673 | vt -17.6406 -103.4841 1674 | vt -9.308948 -103.4841 1675 | vt 27.94487 -47.96909 1676 | vt -1.604552 -47.96909 1677 | vt 16.68063 0.969986 1678 | vt -103.5149 -7.073629 1679 | vt -86.61856 83.16167 1680 | vt -80.05375 -7.073629 1681 | vt -71.21085 83.16167 1682 | vt 101.5533 -18.38363 1683 | vt 94.10397 5.384077 1684 | vt 129.0065 -18.38363 1685 | vt 99.26895 5.384077 1686 | vt -110.2581 -28.08287 1687 | vt -107.0677 -43.06752 1688 | vt -129.0065 -43.06752 1689 | vt -81.07664 7.416361 1690 | vt -70.72256 35.49341 1691 | vt -62.87603 7.416361 1692 | vt -63.00682 35.49341 1693 | vt -63.20737 -6.014762 1694 | vt -78.89206 -6.014762 1695 | vt -63.0018 6.68549 1696 | vt 41.16578 -111.7058 1697 | vt 73.3477 -73.22073 1698 | vt 93.17277 -111.7058 1699 | vt -82.75686 -66.07813 1700 | vt -63.43046 -27.3402 1701 | vt -44.26768 -37.59077 1702 | vt -63.30317 -27.3402 1703 | vt 59.26184 -48.01237 1704 | vt 87.62929 -31.63442 1705 | vt 66.9657 -61.35583 1706 | vt 85.72071 -61.08457 1707 | vt 95.33314 -44.97788 1708 | vt -40.43219 -90.10864 1709 | vt -24.08057 -90.10864 1710 | vt -59.75859 -128.8466 1711 | vt -20.13091 -99.51656 1712 | 1713 | 1714 | 1715 | 1716 | f 2/2/1 1/1/1 3/3/2 1717 | f 3/3/2 4/4/2 2/2/1 1718 | f 6/6/4 5/5/3 7/7/3 1719 | f 7/7/3 8/8/4 6/6/4 1720 | f 3/10/2 9/9/5 10/11/5 1721 | f 10/11/5 4/12/2 3/10/2 1722 | f 12/14/6 11/13/6 13/15/6 1723 | f 13/15/6 14/16/6 12/14/6 1724 | f 16/18/7 15/17/7 1/19/1 1725 | f 1/19/1 2/20/1 16/18/7 1726 | f 5/22/3 17/21/8 18/23/8 1727 | f 18/23/8 7/24/3 5/22/3 1728 | f 11/26/9 12/25/9 19/27/9 1729 | f 19/27/9 20/28/9 11/26/9 1730 | f 20/28/9 15/29/9 11/26/9 1731 | f 20/28/9 21/30/9 15/29/9 1732 | f 21/30/9 1/31/9 15/29/9 1733 | f 21/30/9 22/32/9 1/31/9 1734 | f 22/32/9 3/33/9 1/31/9 1735 | f 22/32/9 9/34/9 3/33/9 1736 | f 22/32/9 23/35/9 9/34/9 1737 | f 23/35/9 24/36/9 9/34/9 1738 | f 23/35/9 6/37/9 24/36/9 1739 | f 23/35/9 25/38/9 6/37/9 1740 | f 23/35/9 26/39/9 25/38/9 1741 | f 23/35/9 27/40/9 26/39/9 1742 | f 27/40/9 28/41/9 26/39/9 1743 | f 28/41/9 29/42/9 26/39/9 1744 | f 28/41/9 30/43/9 29/42/9 1745 | f 5/44/9 6/37/9 25/38/9 1746 | f 17/45/9 5/44/9 25/38/9 1747 | f 17/45/9 25/38/9 31/46/9 1748 | f 32/47/9 17/45/9 31/46/9 1749 | f 33/48/9 32/47/9 31/46/9 1750 | f 33/48/9 31/46/9 34/49/9 1751 | f 35/50/9 33/48/9 34/49/9 1752 | f 35/50/9 34/49/9 36/51/9 1753 | f 37/52/9 35/50/9 36/51/9 1754 | f 37/52/9 36/51/9 38/53/9 1755 | f 38/53/9 39/54/9 37/52/9 1756 | f 38/56/6 36/55/6 40/57/6 1757 | f 40/57/6 41/58/6 38/56/6 1758 | f 42/60/10 33/59/10 35/61/11 1759 | f 35/61/11 43/62/11 42/60/10 1760 | f 44/64/13 29/63/12 30/65/14 1761 | f 30/65/14 45/66/14 44/64/13 1762 | f 34/68/16 31/67/15 46/69/17 1763 | f 46/69/17 47/70/18 34/68/16 1764 | f 48/72/20 28/71/19 27/73/21 1765 | f 27/73/21 49/74/22 48/72/20 1766 | f 24/76/23 6/75/4 8/77/4 1767 | f 8/77/4 50/78/23 24/76/23 1768 | f 51/80/24 32/79/24 33/81/10 1769 | f 33/81/10 42/82/10 51/80/24 1770 | f 43/84/11 35/83/11 37/85/25 1771 | f 37/85/25 52/86/25 43/84/11 1772 | f 37/88/26 39/87/26 53/89/26 1773 | f 53/89/26 52/90/26 37/88/26 1774 | f 9/92/5 24/91/23 50/93/23 1775 | f 50/93/23 10/94/5 9/92/5 1776 | f 17/96/8 32/95/24 51/97/24 1777 | f 51/97/24 18/98/8 17/96/8 1778 | f 20/100/26 19/99/26 54/101/26 1779 | f 54/101/26 55/102/26 20/100/26 1780 | f 54/101/26 56/103/26 55/102/26 1781 | f 56/103/26 57/104/26 55/102/26 1782 | f 57/104/26 58/105/26 55/102/26 1783 | f 13/107/27 11/106/27 15/108/7 1784 | f 15/108/7 16/109/7 13/107/27 1785 | f 23/111/29 22/110/28 59/112/30 1786 | f 59/112/30 60/113/31 23/111/29 1787 | f 31/115/15 25/114/32 61/116/33 1788 | f 61/116/33 46/117/17 31/115/15 1789 | f 36/119/34 34/118/16 47/120/18 1790 | f 47/120/18 40/121/34 36/119/34 1791 | f 63/123/36 62/122/35 64/124/35 1792 | f 62/122/35 63/123/36 65/125/36 1793 | f 67/127/38 66/126/37 68/128/37 1794 | f 66/126/37 67/127/38 69/129/38 1795 | f 71/131/39 70/130/39 72/132/39 1796 | f 70/130/39 71/131/39 73/133/39 1797 | f 71/135/40 74/134/40 75/136/40 1798 | f 74/134/40 71/135/40 72/137/40 1799 | f 77/139/42 76/138/41 78/140/42 1800 | f 76/138/41 77/139/42 79/141/41 1801 | f 79/143/41 80/142/43 76/144/41 1802 | f 80/142/43 79/143/41 81/145/43 1803 | f 64/147/35 80/146/43 81/148/43 1804 | f 80/146/43 64/147/35 62/149/35 1805 | f 75/151/44 77/150/42 78/152/42 1806 | f 77/150/42 75/151/44 74/153/44 1807 | f 82/155/45 65/154/36 63/156/36 1808 | f 65/154/36 82/155/45 83/157/45 1809 | f 68/159/37 83/158/45 82/160/45 1810 | f 83/158/45 68/159/37 66/161/37 1811 | f 85/163/47 84/162/46 86/164/47 1812 | f 84/162/46 85/163/47 87/165/46 1813 | f 88/167/48 73/166/48 71/168/48 1814 | f 73/166/48 88/167/48 84/169/48 1815 | f 88/167/48 71/168/48 89/170/48 1816 | f 84/169/48 88/167/48 90/171/48 1817 | f 84/169/48 90/171/48 91/172/48 1818 | f 84/169/48 91/172/48 86/173/48 1819 | f 86/173/48 91/172/48 92/174/48 1820 | f 86/173/48 92/174/48 93/175/48 1821 | f 93/175/48 92/174/48 94/176/48 1822 | f 93/175/48 94/176/48 95/177/48 1823 | f 93/175/48 95/177/48 96/178/48 1824 | f 93/175/48 96/178/48 97/179/48 1825 | f 97/179/48 96/178/48 98/180/48 1826 | f 97/179/48 98/180/48 80/181/48 1827 | f 97/179/48 80/181/48 62/182/48 1828 | f 97/179/48 62/182/48 69/183/48 1829 | f 69/183/48 62/182/48 66/184/48 1830 | f 66/184/48 62/182/48 65/185/48 1831 | f 66/184/48 65/185/48 83/186/48 1832 | f 99/187/48 80/181/48 98/180/48 1833 | f 99/187/48 76/188/48 80/181/48 1834 | f 100/189/48 76/188/48 99/187/48 1835 | f 101/190/48 76/188/48 100/189/48 1836 | f 102/191/48 76/188/48 101/190/48 1837 | f 102/191/48 78/192/48 76/188/48 1838 | f 103/193/48 78/192/48 102/191/48 1839 | f 103/193/48 75/194/48 78/192/48 1840 | f 104/195/48 75/194/48 103/193/48 1841 | f 89/170/48 75/194/48 104/195/48 1842 | f 75/194/48 89/170/48 71/168/48 1843 | f 105/197/49 86/196/47 93/198/49 1844 | f 86/196/47 105/197/49 85/199/47 1845 | f 106/201/50 69/200/38 67/202/38 1846 | f 69/200/38 106/201/50 97/203/50 1847 | f 87/205/51 73/204/51 84/206/51 1848 | f 73/204/51 87/205/51 70/207/51 1849 | f 106/209/50 93/208/49 97/210/50 1850 | f 93/208/49 106/209/50 105/211/49 1851 | f 61/213/33 25/212/32 26/214/52 1852 | f 26/214/52 107/215/53 61/213/33 1853 | f 45/217/14 30/216/14 28/218/19 1854 | f 28/218/19 48/219/20 45/217/14 1855 | f 49/221/22 27/220/21 23/222/29 1856 | f 23/222/29 60/223/31 49/221/22 1857 | f 58/225/54 108/224/54 109/226/54 1858 | f 109/226/54 55/227/54 58/225/54 1859 | f 109/226/54 110/228/54 55/227/54 1860 | f 109/226/54 59/229/54 110/228/54 1861 | f 109/226/54 60/230/54 59/229/54 1862 | f 109/226/54 49/231/54 60/230/54 1863 | f 109/226/54 48/232/54 49/231/54 1864 | f 109/226/54 45/233/54 48/232/54 1865 | f 109/226/54 111/234/54 45/233/54 1866 | f 44/235/54 45/233/54 111/234/54 1867 | f 107/236/54 44/235/54 111/234/54 1868 | f 61/237/54 107/236/54 111/234/54 1869 | f 46/238/54 61/237/54 111/234/54 1870 | f 47/239/54 46/238/54 111/234/54 1871 | f 40/240/54 47/239/54 111/234/54 1872 | f 40/240/54 111/234/54 112/241/54 1873 | f 112/241/54 41/242/54 40/240/54 1874 | f 21/244/56 20/243/55 55/245/55 1875 | f 55/245/55 110/246/57 21/244/56 1876 | f 107/248/53 26/247/52 29/249/12 1877 | f 29/249/12 44/250/13 107/248/53 1878 | f 22/252/28 21/251/56 110/253/57 1879 | f 110/253/57 59/254/30 22/252/28 1880 | f 114/256/59 113/255/58 115/257/59 1881 | f 113/255/58 114/256/59 116/258/58 1882 | f 118/260/61 117/259/60 119/261/60 1883 | f 117/259/60 118/260/61 120/262/61 1884 | f 122/264/51 121/263/51 123/265/51 1885 | f 121/263/51 122/264/51 124/266/51 1886 | f 126/268/4 125/267/62 127/269/62 1887 | f 125/267/62 126/268/4 128/270/4 1888 | f 116/272/58 129/271/63 113/273/58 1889 | f 129/271/63 116/272/58 130/274/63 1890 | f 114/276/59 120/275/61 118/277/61 1891 | f 120/275/61 114/276/59 115/278/59 1892 | f 127/280/62 131/279/64 132/281/64 1893 | f 131/279/64 127/280/62 125/282/62 1894 | f 119/284/60 128/283/4 126/285/4 1895 | f 128/283/4 119/284/60 117/286/60 1896 | f 130/288/63 122/287/65 129/289/63 1897 | f 122/287/65 130/288/63 124/290/65 1898 | f 134/292/66 133/291/66 121/293/66 1899 | f 133/291/66 134/292/66 135/294/66 1900 | f 135/294/66 134/292/66 136/295/66 1901 | f 135/294/66 136/295/66 137/296/66 1902 | f 135/294/66 137/296/66 138/297/66 1903 | f 138/297/66 137/296/66 139/298/66 1904 | f 138/297/66 139/298/66 140/299/66 1905 | f 140/299/66 139/298/66 141/300/66 1906 | f 140/299/66 141/300/66 142/301/66 1907 | f 140/299/66 142/301/66 143/302/66 1908 | f 140/299/66 143/302/66 144/303/66 1909 | f 144/303/66 143/302/66 145/304/66 1910 | f 121/293/66 146/305/66 134/292/66 1911 | f 146/305/66 121/293/66 124/306/66 1912 | f 146/305/66 124/306/66 147/307/66 1913 | f 147/307/66 124/306/66 148/308/66 1914 | f 148/308/66 124/306/66 130/309/66 1915 | f 148/308/66 130/309/66 149/310/66 1916 | f 149/310/66 130/309/66 116/311/66 1917 | f 149/310/66 116/311/66 150/312/66 1918 | f 150/312/66 116/311/66 151/313/66 1919 | f 151/313/66 116/311/66 152/314/66 1920 | f 152/314/66 116/311/66 114/315/66 1921 | f 152/314/66 114/315/66 145/304/66 1922 | f 145/304/66 114/315/66 144/303/66 1923 | f 144/303/66 114/315/66 132/316/66 1924 | f 132/316/66 114/315/66 118/317/66 1925 | f 132/316/66 118/317/66 127/318/66 1926 | f 127/318/66 118/317/66 119/319/66 1927 | f 127/318/66 119/319/66 126/320/66 1928 | f 132/322/64 153/321/67 144/323/67 1929 | f 153/321/67 132/322/64 131/324/64 1930 | f 138/326/69 154/325/68 155/327/69 1931 | f 154/325/68 138/326/69 140/328/68 1932 | f 156/330/40 135/329/40 157/331/40 1933 | f 135/329/40 156/330/40 133/332/40 1934 | f 156/334/14 121/333/14 133/335/14 1935 | f 121/333/14 156/334/14 123/336/14 1936 | f 140/338/68 153/337/67 154/339/68 1937 | f 153/337/67 140/338/68 144/340/67 1938 | f 135/342/70 155/341/69 157/343/70 1939 | f 155/341/69 135/342/70 138/344/69 1940 | f 159/346/71 158/345/71 160/347/71 1941 | f 160/347/71 161/348/71 159/346/71 1942 | f 163/350/14 162/349/14 164/351/14 1943 | f 164/351/14 165/352/14 163/350/14 1944 | f 164/351/14 166/353/14 165/352/14 1945 | f 166/353/14 167/354/14 165/352/14 1946 | f 169/356/14 168/355/14 170/357/14 1947 | f 170/357/14 159/358/14 169/356/14 1948 | f 170/357/14 158/359/14 159/358/14 1949 | f 170/357/14 171/360/14 158/359/14 1950 | f 173/362/14 172/361/14 174/363/14 1951 | f 174/363/14 175/364/14 173/362/14 1952 | f 175/364/14 176/365/14 173/362/14 1953 | f 175/364/14 177/366/14 176/365/14 1954 | f 179/368/51 178/367/51 180/369/51 1955 | f 180/369/51 181/370/51 179/368/51 1956 | f 177/372/66 175/371/66 182/373/66 1957 | f 182/373/66 183/374/66 177/372/66 1958 | f 183/374/66 184/375/66 177/372/66 1959 | f 182/373/66 175/371/66 174/376/66 1960 | f 185/377/66 182/373/66 174/376/66 1961 | f 174/376/66 186/378/66 185/377/66 1962 | f 174/376/66 187/379/66 186/378/66 1963 | f 188/381/26 162/380/26 163/382/26 1964 | f 163/382/26 189/383/26 188/381/26 1965 | f 170/385/72 190/384/72 191/386/72 1966 | f 191/386/72 192/387/72 170/385/72 1967 | f 192/387/72 171/388/72 170/385/72 1968 | f 192/387/72 158/389/72 171/388/72 1969 | f 192/387/72 160/390/72 158/389/72 1970 | f 192/387/72 193/391/72 160/390/72 1971 | f 190/384/72 170/385/72 194/392/72 1972 | f 195/385/72 183/393/72 182/394/72 1973 | f 182/394/72 196/395/72 195/385/72 1974 | f 196/395/72 197/388/72 195/385/72 1975 | f 196/395/72 198/389/72 197/388/72 1976 | f 196/395/72 199/390/72 198/389/72 1977 | f 196/395/72 200/396/72 199/390/72 1978 | f 183/393/72 195/385/72 201/392/72 1979 | f 166/398/6 202/397/6 203/399/6 1980 | f 203/399/6 167/400/6 166/398/6 1981 | f 205/402/73 204/401/73 206/403/73 1982 | f 205/402/73 206/403/73 207/404/73 1983 | f 208/405/73 205/402/73 207/404/73 1984 | f 209/406/73 208/405/73 207/404/73 1985 | f 209/406/73 207/404/73 210/407/73 1986 | f 211/408/73 209/406/73 210/407/73 1987 | f 210/407/73 212/409/73 211/408/73 1988 | f 179/372/66 213/410/66 214/411/66 1989 | f 214/411/66 178/375/66 179/372/66 1990 | f 213/410/66 179/372/66 215/376/66 1991 | f 192/412/66 213/410/66 215/376/66 1992 | f 215/376/66 193/413/66 192/412/66 1993 | f 179/372/66 216/371/66 215/376/66 1994 | f 215/376/66 217/379/66 193/413/66 1995 | f 172/415/74 210/414/74 218/416/74 1996 | f 218/416/74 219/417/74 172/415/74 1997 | f 219/417/74 220/418/74 172/415/74 1998 | f 210/414/74 172/415/74 176/419/74 1999 | f 176/419/74 212/420/74 210/414/74 2000 | f 172/415/74 173/421/74 176/419/74 2001 | f 176/419/74 221/422/74 212/420/74 2002 | f 223/424/14 222/423/14 186/425/14 2003 | f 186/425/14 219/426/14 223/424/14 2004 | f 186/425/14 187/363/14 219/426/14 2005 | f 187/363/14 220/361/14 219/426/14 2006 | f 212/427/14 221/365/14 184/366/14 2007 | f 184/366/14 183/428/14 212/427/14 2008 | f 183/428/14 211/429/14 212/427/14 2009 | f 183/428/14 201/430/14 211/429/14 2010 | f 217/432/40 215/431/40 224/433/40 2011 | f 224/433/40 225/434/40 217/432/40 2012 | f 226/436/14 224/435/14 215/437/14 2013 | f 215/437/14 216/438/14 226/436/14 2014 | f 216/438/14 181/439/14 226/436/14 2015 | f 216/438/14 179/440/14 181/439/14 2016 | f 177/442/51 184/441/51 221/443/51 2017 | f 221/443/51 176/444/51 177/442/51 2018 | f 227/445/14 180/439/14 178/440/14 2019 | f 178/440/14 214/446/14 227/445/14 2020 | f 214/446/14 188/349/14 227/445/14 2021 | f 188/349/14 189/350/14 227/445/14 2022 | f 228/447/14 161/358/14 160/359/14 2023 | f 160/359/14 193/448/14 228/447/14 2024 | f 193/448/14 225/435/14 228/447/14 2025 | f 193/448/14 217/437/14 225/435/14 2026 | f 204/450/71 205/449/71 198/451/71 2027 | f 198/451/71 199/452/71 204/450/71 2028 | f 208/453/14 209/429/14 195/430/14 2029 | f 195/430/14 205/454/14 208/453/14 2030 | f 195/430/14 198/455/14 205/454/14 2031 | f 195/430/14 197/456/14 198/455/14 2032 | f 163/458/75 196/457/75 229/459/75 2033 | f 229/459/75 227/460/75 163/458/75 2034 | f 227/460/75 189/461/75 163/458/75 2035 | f 196/457/75 163/458/75 167/462/75 2036 | f 167/462/75 200/463/75 196/457/75 2037 | f 163/458/75 165/464/75 167/462/75 2038 | f 167/462/75 203/465/75 200/463/75 2039 | f 231/467/9 230/466/9 185/468/9 2040 | f 185/468/9 186/469/9 231/467/9 2041 | f 186/469/9 222/470/9 231/467/9 2042 | f 230/466/9 231/467/9 232/471/9 2043 | f 232/471/9 233/472/9 230/466/9 2044 | f 231/467/9 234/473/9 232/471/9 2045 | f 232/471/9 235/474/9 233/472/9 2046 | f 224/415/74 229/475/74 236/476/74 2047 | f 236/476/74 228/477/74 224/415/74 2048 | f 228/477/74 225/418/74 224/415/74 2049 | f 229/475/74 224/415/74 181/419/74 2050 | f 181/419/74 227/478/74 229/475/74 2051 | f 224/415/74 226/421/74 181/419/74 2052 | f 181/419/74 180/422/74 227/478/74 2053 | f 237/458/75 218/479/75 191/480/75 2054 | f 191/480/75 190/481/75 237/458/75 2055 | f 190/481/75 238/461/75 237/458/75 2056 | f 218/479/75 237/458/75 239/464/75 2057 | f 218/479/75 239/464/75 240/462/75 2058 | f 240/462/75 219/482/75 218/479/75 2059 | f 240/462/75 223/465/75 219/482/75 2060 | f 187/484/40 174/483/40 172/485/40 2061 | f 172/485/40 220/486/40 187/484/40 2062 | f 206/487/14 204/454/14 199/455/14 2063 | f 206/487/14 199/455/14 200/488/14 2064 | f 206/487/14 200/488/14 203/354/14 2065 | f 203/354/14 202/353/14 206/487/14 2066 | f 241/355/14 233/489/14 235/490/14 2067 | f 235/490/14 190/491/14 241/355/14 2068 | f 235/490/14 238/492/14 190/491/14 2069 | f 241/355/14 190/491/14 194/357/14 2070 | f 170/494/76 168/493/76 241/495/76 2071 | f 241/495/76 194/496/76 170/494/76 2072 | f 72/498/48 242/497/48 243/499/48 2073 | f 243/499/48 74/500/48 72/498/48 2074 | f 243/499/48 77/501/48 74/500/48 2075 | f 243/499/48 79/502/48 77/501/48 2076 | f 243/499/48 81/503/48 79/502/48 2077 | f 243/499/48 64/504/48 81/503/48 2078 | f 243/499/48 63/505/48 64/504/48 2079 | f 243/499/48 82/506/48 63/505/48 2080 | f 242/497/48 72/498/48 70/507/48 2081 | f 244/508/48 242/497/48 70/507/48 2082 | f 244/508/48 70/507/48 245/509/48 2083 | f 245/509/48 246/510/48 244/508/48 2084 | f 70/507/48 247/511/48 245/509/48 2085 | f 82/506/48 243/499/48 247/511/48 2086 | f 70/507/48 87/512/48 247/511/48 2087 | f 87/512/48 85/513/48 247/511/48 2088 | f 85/513/48 105/514/48 247/511/48 2089 | f 105/514/48 106/515/48 247/511/48 2090 | f 106/515/48 67/516/48 247/511/48 2091 | f 67/516/48 68/517/48 247/511/48 2092 | f 68/517/48 82/506/48 247/511/48 2093 | f 249/519/14 248/518/14 250/520/14 2094 | f 249/519/14 250/520/14 251/521/14 2095 | f 251/521/14 252/522/14 249/519/14 2096 | f 250/520/14 253/523/14 251/521/14 2097 | f 41/524/14 251/521/14 253/523/14 2098 | f 253/523/14 112/525/14 41/524/14 2099 | f 41/524/14 246/526/14 251/521/14 2100 | f 41/524/14 53/527/14 246/526/14 2101 | f 39/528/14 53/527/14 41/524/14 2102 | f 41/524/14 38/529/14 39/528/14 2103 | f 53/527/14 14/530/14 246/526/14 2104 | f 14/530/14 245/531/14 246/526/14 2105 | f 14/530/14 19/532/14 245/531/14 2106 | f 14/530/14 12/533/14 19/532/14 2107 | f 19/532/14 54/534/14 245/531/14 2108 | f 54/534/14 254/535/14 245/531/14 2109 | f 254/535/14 255/536/14 245/531/14 2110 | f 254/535/14 256/537/14 255/536/14 2111 | f 256/537/14 257/538/14 255/536/14 2112 | f 257/538/14 258/539/14 255/536/14 2113 | f 258/539/14 259/540/14 255/536/14 2114 | f 259/540/14 260/541/14 255/536/14 2115 | f 259/540/14 261/542/14 260/541/14 2116 | f 259/540/14 262/543/14 261/542/14 2117 | f 261/542/14 263/544/14 260/541/14 2118 | f 263/544/14 264/545/14 260/541/14 2119 | f 265/546/14 259/540/14 258/539/14 2120 | f 258/539/14 266/547/14 265/546/14 2121 | f 259/540/14 265/546/14 267/548/14 2122 | f 159/402/73 161/401/73 228/549/73 2123 | f 159/402/73 228/549/73 236/550/73 2124 | f 169/405/73 159/402/73 236/550/73 2125 | f 168/406/73 169/405/73 236/550/73 2126 | f 168/406/73 236/550/73 230/551/73 2127 | f 241/408/73 168/406/73 230/551/73 2128 | f 230/551/73 233/552/73 241/408/73 2129 | f 166/467/9 213/553/9 207/554/9 2130 | f 207/554/9 206/555/9 166/467/9 2131 | f 206/555/9 202/470/9 166/467/9 2132 | f 213/553/9 166/467/9 162/471/9 2133 | f 162/471/9 214/556/9 213/553/9 2134 | f 166/467/9 164/473/9 162/471/9 2135 | f 162/471/9 188/474/9 214/556/9 2136 | f 231/558/6 222/557/6 223/559/6 2137 | f 223/559/6 240/560/6 231/558/6 2138 | f 195/562/76 209/561/76 211/563/76 2139 | f 211/563/76 201/564/76 195/562/76 2140 | f 269/566/4 268/565/4 270/567/4 2141 | f 270/567/4 271/568/4 269/566/4 2142 | f 272/570/40 271/569/40 270/571/40 2143 | f 270/571/40 273/572/40 272/570/40 2144 | f 275/574/14 274/573/14 276/575/14 2145 | f 276/575/14 277/576/14 275/574/14 2146 | f 278/578/77 262/577/77 261/579/77 2147 | f 261/579/77 279/580/77 278/578/77 2148 | f 261/579/77 280/581/77 279/580/77 2149 | f 280/581/77 281/582/77 279/580/77 2150 | f 283/584/72 282/583/72 284/585/72 2151 | f 284/585/72 285/586/72 283/584/72 2152 | f 269/588/51 286/587/51 287/589/51 2153 | f 287/589/51 268/590/51 269/588/51 2154 | f 289/592/26 288/591/26 290/593/26 2155 | f 290/593/26 291/594/26 289/592/26 2156 | f 273/596/14 287/595/14 286/597/14 2157 | f 286/597/14 272/598/14 273/596/14 2158 | f 276/600/72 292/599/72 293/601/72 2159 | f 293/601/72 277/602/72 276/600/72 2160 | f 295/604/73 294/603/73 296/605/73 2161 | f 296/605/73 297/606/73 295/604/73 2162 | f 282/608/4 298/607/4 299/609/4 2163 | f 299/609/4 284/610/4 282/608/4 2164 | f 293/612/76 300/611/76 275/613/76 2165 | f 275/613/76 277/614/76 293/612/76 2166 | f 284/616/76 299/615/76 301/617/76 2167 | f 301/617/76 285/618/76 284/616/76 2168 | f 301/620/14 302/619/14 283/621/14 2169 | f 283/621/14 285/622/14 301/620/14 2170 | f 304/624/4 303/623/4 305/625/4 2171 | f 305/625/4 306/626/4 304/624/4 2172 | f 270/628/74 268/627/74 287/629/74 2173 | f 287/629/74 273/630/74 270/628/74 2174 | f 307/632/40 306/631/40 305/633/40 2175 | f 305/633/40 308/634/40 307/632/40 2176 | f 304/636/51 309/635/51 310/637/51 2177 | f 310/637/51 303/638/51 304/636/51 2178 | f 288/640/4 311/639/4 312/641/4 2179 | f 312/641/4 290/642/4 288/640/4 2180 | f 313/644/71 292/643/71 276/645/71 2181 | f 276/645/71 274/646/71 313/644/71 2182 | f 269/627/74 314/647/74 297/648/74 2183 | f 297/648/74 296/649/74 269/627/74 2184 | f 296/649/74 286/629/74 269/627/74 2185 | f 296/649/74 272/630/74 286/629/74 2186 | f 296/649/74 304/650/74 272/630/74 2187 | f 296/649/74 309/651/74 304/650/74 2188 | f 296/649/74 307/652/74 309/651/74 2189 | f 314/647/74 269/627/74 271/628/74 2190 | f 314/647/74 271/628/74 306/653/74 2191 | f 271/628/74 272/630/74 306/653/74 2192 | f 272/630/74 304/650/74 306/653/74 2193 | f 306/653/74 315/654/74 314/647/74 2194 | f 306/653/74 307/652/74 315/654/74 2195 | f 307/652/74 296/649/74 315/654/74 2196 | f 316/656/75 314/655/75 315/657/75 2197 | f 315/657/75 317/658/75 316/656/75 2198 | f 305/653/74 303/650/74 310/651/74 2199 | f 310/651/74 308/652/74 305/653/74 2200 | f 311/660/6 318/659/6 319/661/6 2201 | f 319/661/6 312/662/6 311/660/6 2202 | f 308/664/14 310/663/14 309/665/14 2203 | f 309/665/14 307/666/14 308/664/14 2204 | f 298/668/71 282/667/71 283/669/71 2205 | f 283/669/71 302/670/71 298/668/71 2206 | f 292/672/4 313/671/4 300/673/4 2207 | f 300/673/4 293/674/4 292/672/4 2208 | f 319/676/14 318/675/14 289/677/14 2209 | f 289/677/14 291/678/14 319/676/14 2210 | f 311/680/9 288/679/9 289/681/9 2211 | f 289/681/9 318/682/9 311/680/9 2212 | f 290/679/9 295/683/9 320/684/9 2213 | f 320/684/9 321/685/9 290/679/9 2214 | f 321/685/9 291/681/9 290/679/9 2215 | f 321/685/9 319/682/9 291/681/9 2216 | f 295/683/9 290/679/9 312/680/9 2217 | f 312/680/9 294/686/9 295/683/9 2218 | f 312/680/9 319/682/9 294/686/9 2219 | f 319/682/9 321/685/9 294/686/9 2220 | f 323/688/72 322/687/72 316/689/72 2221 | f 316/689/72 313/599/72 323/688/72 2222 | f 316/689/72 300/601/72 313/599/72 2223 | f 316/689/72 275/602/72 300/601/72 2224 | f 316/689/72 298/583/72 275/602/72 2225 | f 316/689/72 299/585/72 298/583/72 2226 | f 316/689/72 301/586/72 299/585/72 2227 | f 323/688/72 313/599/72 274/600/72 2228 | f 323/688/72 274/600/72 302/584/72 2229 | f 274/600/72 275/602/72 302/584/72 2230 | f 275/602/72 298/583/72 302/584/72 2231 | f 302/584/72 317/690/72 323/688/72 2232 | f 302/584/72 301/586/72 317/690/72 2233 | f 301/586/72 316/689/72 317/690/72 2234 | f 123/692/66 322/691/66 323/693/66 2235 | f 323/693/66 122/694/66 123/692/66 2236 | f 323/693/66 129/695/66 122/694/66 2237 | f 323/693/66 113/696/66 129/695/66 2238 | f 323/693/66 115/697/66 113/696/66 2239 | f 323/693/66 120/698/66 115/697/66 2240 | f 323/693/66 117/699/66 120/698/66 2241 | f 323/693/66 128/700/66 117/699/66 2242 | f 323/693/66 321/701/66 128/700/66 2243 | f 322/691/66 123/692/66 156/702/66 2244 | f 156/702/66 321/701/66 320/703/66 2245 | f 320/703/66 322/691/66 156/702/66 2246 | f 156/702/66 157/704/66 321/701/66 2247 | f 157/704/66 155/705/66 321/701/66 2248 | f 155/705/66 154/706/66 321/701/66 2249 | f 154/706/66 153/707/66 321/701/66 2250 | f 153/707/66 131/708/66 321/701/66 2251 | f 131/708/66 125/709/66 321/701/66 2252 | f 125/709/66 128/700/66 321/701/66 2253 | f 324/711/78 255/710/78 245/712/78 2254 | f 245/712/78 247/713/78 324/711/78 2255 | f 324/711/78 247/713/78 279/714/78 2256 | f 279/714/78 281/715/78 324/711/78 2257 | f 253/717/79 112/716/79 111/718/79 2258 | f 111/718/79 243/719/79 253/717/79 2259 | f 243/719/79 325/720/79 253/717/79 2260 | f 243/719/79 326/721/79 325/720/79 2261 | f 243/719/79 327/722/79 326/721/79 2262 | f 243/719/79 328/723/79 327/722/79 2263 | f 243/719/79 329/724/79 328/723/79 2264 | f 243/719/79 330/725/79 329/724/79 2265 | f 243/719/79 242/726/79 330/725/79 2266 | f 331/728/80 259/727/80 262/729/80 2267 | f 262/729/80 278/730/80 331/728/80 2268 | f 331/728/80 278/730/80 109/731/80 2269 | f 332/732/80 331/728/80 109/731/80 2270 | f 332/732/80 109/731/80 108/733/80 2271 | f 332/732/80 108/733/80 333/734/80 2272 | f 332/732/80 333/734/80 334/735/80 2273 | f 334/735/80 335/736/80 332/732/80 2274 | f 235/738/26 232/737/26 237/739/26 2275 | f 237/739/26 238/740/26 235/738/26 2276 | f 237/492/14 232/490/14 234/741/14 2277 | f 234/741/14 239/742/14 237/492/14 2278 | f 234/741/14 231/423/14 239/742/14 2279 | f 231/423/14 240/424/14 239/742/14 2280 | 2281 | 2282 | 2283 | 2284 | f 336/744/9 53/743/9 14/745/9 2285 | f 14/745/9 13/26/9 336/744/9 2286 | f 13/26/9 337/746/9 336/744/9 2287 | f 13/26/9 338/747/9 337/746/9 2288 | f 338/747/9 339/748/9 337/746/9 2289 | f 338/747/9 340/749/9 339/748/9 2290 | f 13/26/9 341/750/9 338/747/9 2291 | f 13/26/9 342/751/9 341/750/9 2292 | f 13/26/9 16/29/9 342/751/9 2293 | f 16/29/9 343/752/9 342/751/9 2294 | f 16/29/9 2/31/9 343/752/9 2295 | f 2/31/9 344/753/9 343/752/9 2296 | f 2/31/9 345/754/9 344/753/9 2297 | f 2/31/9 4/33/9 345/754/9 2298 | f 4/33/9 346/755/9 345/754/9 2299 | f 4/33/9 347/756/9 346/755/9 2300 | f 4/33/9 51/47/9 347/756/9 2301 | f 4/33/9 18/45/9 51/47/9 2302 | f 4/33/9 10/34/9 18/45/9 2303 | f 10/34/9 7/44/9 18/45/9 2304 | f 10/34/9 50/36/9 7/44/9 2305 | f 50/36/9 8/37/9 7/44/9 2306 | f 348/757/9 347/756/9 51/47/9 2307 | f 349/758/9 348/757/9 51/47/9 2308 | f 349/758/9 51/47/9 42/48/9 2309 | f 350/759/9 349/758/9 42/48/9 2310 | f 351/760/9 350/759/9 42/48/9 2311 | f 351/760/9 42/48/9 43/50/9 2312 | f 352/761/9 351/760/9 43/50/9 2313 | f 352/761/9 43/50/9 52/52/9 2314 | f 353/762/9 352/761/9 52/52/9 2315 | f 340/749/9 353/762/9 52/52/9 2316 | f 339/748/9 340/749/9 52/52/9 2317 | f 354/763/9 339/748/9 52/52/9 2318 | f 354/763/9 52/52/9 53/743/9 2319 | f 53/743/9 336/744/9 354/763/9 2320 | 2321 | 2322 | 2323 | 2324 | f 63/123/82 64/124/81 62/122/81 2325 | f 62/122/81 65/125/82 63/123/82 2326 | f 67/127/84 68/128/83 66/126/83 2327 | f 66/126/83 69/129/84 67/127/84 2328 | f 71/131/45 72/132/45 70/130/45 2329 | f 70/130/45 73/133/45 71/131/45 2330 | f 71/135/51 75/136/51 74/134/51 2331 | f 74/134/51 72/137/51 71/135/51 2332 | f 77/139/85 78/140/85 76/138/86 2333 | f 76/138/86 79/141/86 77/139/85 2334 | f 79/143/86 76/144/86 80/142/87 2335 | f 80/142/87 81/145/87 79/143/86 2336 | f 64/147/81 81/148/87 80/146/87 2337 | f 80/146/87 62/149/81 64/147/81 2338 | f 75/151/88 78/152/85 77/150/85 2339 | f 77/150/85 74/153/88 75/151/88 2340 | f 82/155/39 63/156/82 65/154/82 2341 | f 65/154/82 83/157/39 82/155/39 2342 | f 68/159/83 82/160/39 83/158/39 2343 | f 83/158/39 66/161/83 68/159/83 2344 | f 104/195/89 89/170/89 88/167/89 2345 | f 88/167/89 90/171/89 104/195/89 2346 | f 90/171/89 103/193/89 104/195/89 2347 | f 90/171/89 91/172/89 103/193/89 2348 | f 91/172/89 92/174/89 103/193/89 2349 | f 92/174/89 102/191/89 103/193/89 2350 | f 92/174/89 101/190/89 102/191/89 2351 | f 92/174/89 94/176/89 101/190/89 2352 | f 94/176/89 95/177/89 101/190/89 2353 | f 95/177/89 100/189/89 101/190/89 2354 | f 95/177/89 99/187/89 100/189/89 2355 | f 95/177/89 96/178/89 99/187/89 2356 | f 96/178/89 98/180/89 99/187/89 2357 | f 88/167/89 89/170/89 71/168/89 2358 | f 88/167/89 71/168/89 73/166/89 2359 | f 73/166/89 84/169/89 88/167/89 2360 | f 84/169/89 90/171/89 88/167/89 2361 | f 84/169/89 91/172/89 90/171/89 2362 | f 84/169/89 86/173/89 91/172/89 2363 | f 86/173/89 92/174/89 91/172/89 2364 | f 86/173/89 93/175/89 92/174/89 2365 | f 93/175/89 94/176/89 92/174/89 2366 | f 93/175/89 95/177/89 94/176/89 2367 | f 93/175/89 96/178/89 95/177/89 2368 | f 93/175/89 97/179/89 96/178/89 2369 | f 97/179/89 98/180/89 96/178/89 2370 | f 97/179/89 80/181/89 98/180/89 2371 | f 99/187/89 98/180/89 80/181/89 2372 | f 97/179/89 62/182/89 80/181/89 2373 | f 97/179/89 69/183/89 62/182/89 2374 | f 69/183/89 66/184/89 62/182/89 2375 | f 66/184/89 65/185/89 62/182/89 2376 | f 66/184/89 83/186/89 65/185/89 2377 | f 100/189/89 99/187/89 76/188/89 2378 | f 99/187/89 80/181/89 76/188/89 2379 | f 75/194/89 71/168/89 89/170/89 2380 | f 89/170/89 104/195/89 75/194/89 2381 | f 104/195/89 103/193/89 75/194/89 2382 | f 103/193/89 78/192/89 75/194/89 2383 | f 103/193/89 102/191/89 78/192/89 2384 | f 102/191/89 76/188/89 78/192/89 2385 | f 102/191/89 101/190/89 76/188/89 2386 | f 101/190/89 100/189/89 76/188/89 2387 | f 85/163/90 86/164/90 84/162/91 2388 | f 84/162/91 87/165/91 85/163/90 2389 | f 105/197/92 93/198/92 86/196/90 2390 | f 86/196/90 85/199/90 105/197/92 2391 | f 106/201/93 67/202/84 69/200/84 2392 | f 69/200/84 97/203/93 106/201/93 2393 | f 87/205/40 84/206/40 73/204/40 2394 | f 73/204/40 70/207/40 87/205/40 2395 | f 106/209/93 97/210/93 93/208/92 2396 | f 93/208/92 105/211/92 106/209/93 2397 | f 114/256/94 115/257/94 113/255/95 2398 | f 113/255/95 116/258/95 114/256/94 2399 | f 118/260/97 119/261/96 117/259/96 2400 | f 117/259/96 120/262/97 118/260/97 2401 | f 122/264/40 123/265/40 121/263/40 2402 | f 121/263/40 124/266/40 122/264/40 2403 | f 126/268/14 127/269/98 125/267/98 2404 | f 125/267/98 128/270/14 126/268/14 2405 | f 116/272/95 113/273/95 129/271/99 2406 | f 129/271/99 130/274/99 116/272/95 2407 | f 114/276/94 118/277/97 120/275/97 2408 | f 120/275/97 115/278/94 114/276/94 2409 | f 127/280/98 132/281/100 131/279/100 2410 | f 131/279/100 125/282/98 127/280/98 2411 | f 119/284/96 126/285/14 128/283/14 2412 | f 128/283/14 117/286/96 119/284/96 2413 | f 130/288/99 129/289/99 122/287/101 2414 | f 122/287/101 124/290/101 130/288/99 2415 | f 134/292/74 121/293/74 133/291/74 2416 | f 133/291/74 135/294/74 134/292/74 2417 | f 135/294/74 136/295/74 134/292/74 2418 | f 135/294/74 137/296/74 136/295/74 2419 | f 135/294/74 138/297/74 137/296/74 2420 | f 138/297/74 139/298/74 137/296/74 2421 | f 138/297/74 140/299/74 139/298/74 2422 | f 140/299/74 141/300/74 139/298/74 2423 | f 140/299/74 142/301/74 141/300/74 2424 | f 140/299/74 143/302/74 142/301/74 2425 | f 140/299/74 144/303/74 143/302/74 2426 | f 144/303/74 145/304/74 143/302/74 2427 | f 121/293/74 134/292/74 146/305/74 2428 | f 146/305/74 134/292/74 136/295/74 2429 | f 146/305/74 124/306/74 121/293/74 2430 | f 146/305/74 147/307/74 124/306/74 2431 | f 136/295/74 147/307/74 146/305/74 2432 | f 147/307/74 148/308/74 124/306/74 2433 | f 136/295/74 148/308/74 147/307/74 2434 | f 136/295/74 137/296/74 148/308/74 2435 | f 137/296/74 139/298/74 148/308/74 2436 | f 148/308/74 130/309/74 124/306/74 2437 | f 148/308/74 149/310/74 130/309/74 2438 | f 139/298/74 149/310/74 148/308/74 2439 | f 139/298/74 141/300/74 149/310/74 2440 | f 149/310/74 116/311/74 130/309/74 2441 | f 149/310/74 150/312/74 116/311/74 2442 | f 141/300/74 150/312/74 149/310/74 2443 | f 141/300/74 142/301/74 150/312/74 2444 | f 150/312/74 151/313/74 116/311/74 2445 | f 142/301/74 151/313/74 150/312/74 2446 | f 142/301/74 143/302/74 151/313/74 2447 | f 151/313/74 152/314/74 116/311/74 2448 | f 143/302/74 152/314/74 151/313/74 2449 | f 143/302/74 145/304/74 152/314/74 2450 | f 152/314/74 114/315/74 116/311/74 2451 | f 152/314/74 145/304/74 114/315/74 2452 | f 145/304/74 144/303/74 114/315/74 2453 | f 144/303/74 132/316/74 114/315/74 2454 | f 132/316/74 118/317/74 114/315/74 2455 | f 132/316/74 127/318/74 118/317/74 2456 | f 127/318/74 119/319/74 118/317/74 2457 | f 127/318/74 126/320/74 119/319/74 2458 | f 132/322/100 144/323/102 153/321/102 2459 | f 153/321/102 131/324/100 132/322/100 2460 | f 138/326/103 155/327/103 154/325/104 2461 | f 154/325/104 140/328/104 138/326/103 2462 | f 156/330/51 157/331/51 135/329/51 2463 | f 135/329/51 133/332/51 156/330/51 2464 | f 156/334/4 133/335/4 121/333/4 2465 | f 121/333/4 123/336/4 156/334/4 2466 | f 140/338/104 154/339/104 153/337/102 2467 | f 153/337/102 144/340/102 140/338/104 2468 | f 135/342/105 157/343/105 155/341/103 2469 | f 155/341/103 138/344/103 135/342/105 2470 | 2471 | 2472 | 2473 | 2474 | f 104/195/48 88/167/48 89/170/48 2475 | f 88/167/48 104/195/48 90/171/48 2476 | f 90/171/48 104/195/48 103/193/48 2477 | f 90/171/48 103/193/48 91/172/48 2478 | f 91/172/48 103/193/48 92/174/48 2479 | f 92/174/48 103/193/48 102/191/48 2480 | f 92/174/48 102/191/48 101/190/48 2481 | f 92/174/48 101/190/48 94/176/48 2482 | f 94/176/48 101/190/48 95/177/48 2483 | f 95/177/48 101/190/48 100/189/48 2484 | f 95/177/48 100/189/48 99/187/48 2485 | f 95/177/48 99/187/48 96/178/48 2486 | f 96/178/48 99/187/48 98/180/48 2487 | f 146/305/66 136/295/66 134/292/66 2488 | f 136/295/66 146/305/66 147/307/66 2489 | f 136/295/66 147/307/66 148/308/66 2490 | f 136/295/66 148/308/66 137/296/66 2491 | f 137/296/66 148/308/66 139/298/66 2492 | f 139/298/66 148/308/66 149/310/66 2493 | f 139/298/66 149/310/66 141/300/66 2494 | f 141/300/66 149/310/66 150/312/66 2495 | f 141/300/66 150/312/66 142/301/66 2496 | f 142/301/66 150/312/66 151/313/66 2497 | f 142/301/66 151/313/66 143/302/66 2498 | f 143/302/66 151/313/66 152/314/66 2499 | f 143/302/66 152/314/66 145/304/66 2500 | 2501 | 2502 | 2503 | 2504 | f 356/765/9 355/764/9 357/766/9 2505 | f 357/766/9 358/767/9 356/765/9 2506 | f 357/766/9 359/768/9 358/767/9 2507 | f 359/768/9 360/769/9 358/767/9 2508 | f 359/768/9 361/770/9 360/769/9 2509 | f 359/768/9 362/771/9 361/770/9 2510 | f 362/771/9 363/772/9 361/770/9 2511 | f 362/771/9 364/773/9 363/772/9 2512 | f 364/773/9 365/774/9 363/772/9 2513 | f 365/774/9 366/775/9 363/772/9 2514 | f 365/774/9 367/776/9 366/775/9 2515 | f 367/776/9 368/777/9 366/775/9 2516 | f 367/776/9 369/778/9 368/777/9 2517 | f 353/780/106 340/779/106 356/781/106 2518 | f 356/781/106 358/782/106 353/780/106 2519 | f 336/784/107 337/783/107 370/785/107 2520 | f 370/785/107 371/786/107 336/784/107 2521 | f 347/788/109 348/787/108 368/789/110 2522 | f 368/789/110 369/790/109 347/788/109 2523 | f 339/792/106 354/791/106 372/793/106 2524 | f 372/793/106 373/794/106 339/792/106 2525 | f 362/796/112 343/795/111 344/797/113 2526 | f 344/797/113 364/798/114 362/796/112 2527 | f 337/800/115 339/799/115 373/801/115 2528 | f 373/801/115 370/802/115 337/800/115 2529 | f 372/804/116 354/803/116 336/805/116 2530 | f 336/805/116 371/806/116 372/804/116 2531 | f 345/808/118 346/807/117 367/809/119 2532 | f 367/809/119 365/810/120 345/808/118 2533 | f 357/812/121 341/811/121 342/813/122 2534 | f 342/813/122 359/814/123 357/812/121 2535 | f 350/816/125 351/815/124 361/817/126 2536 | f 361/817/126 363/818/127 350/816/125 2537 | f 348/820/108 349/819/128 366/821/129 2538 | f 366/821/129 368/822/110 348/820/108 2539 | f 349/824/128 350/823/125 363/825/127 2540 | f 363/825/127 366/826/129 349/824/128 2541 | f 361/828/126 351/827/124 352/829/130 2542 | f 352/829/130 360/830/131 361/828/126 2543 | f 356/832/132 340/831/132 338/833/132 2544 | f 338/833/132 355/834/132 356/832/132 2545 | f 338/836/107 341/835/107 357/837/107 2546 | f 357/837/107 355/838/107 338/836/107 2547 | f 360/840/131 352/839/130 353/841/133 2548 | f 353/841/133 358/842/133 360/840/131 2549 | f 346/844/117 347/843/109 369/845/109 2550 | f 369/845/109 367/846/119 346/844/117 2551 | f 344/848/113 345/847/118 365/849/120 2552 | f 365/849/120 364/850/114 344/848/113 2553 | f 359/852/123 342/851/122 343/853/111 2554 | f 343/853/111 362/854/112 359/852/123 2555 | f 373/856/9 372/855/9 371/857/9 2556 | f 371/857/9 370/858/9 373/856/9 2557 | f 323/860/4 317/859/4 374/861/4 2558 | f 374/861/4 375/862/4 323/860/4 2559 | f 374/864/76 317/863/76 196/865/76 2560 | f 196/865/76 376/866/76 374/864/76 2561 | f 377/394/72 375/688/72 374/690/72 2562 | f 374/690/72 376/395/72 377/394/72 2563 | f 323/868/71 375/867/71 377/869/71 2564 | f 377/869/71 182/870/71 323/868/71 2565 | f 196/488/14 182/428/14 377/871/14 2566 | f 377/871/14 376/872/14 196/488/14 2567 | f 296/874/51 236/873/51 378/875/51 2568 | f 378/875/51 379/876/51 296/874/51 2569 | f 229/878/40 315/877/40 380/879/40 2570 | f 380/879/40 381/880/40 229/878/40 2571 | f 296/882/4 379/881/4 380/883/4 2572 | f 380/883/4 315/884/4 296/882/4 2573 | f 381/886/14 378/885/14 236/447/14 2574 | f 236/447/14 229/445/14 381/886/14 2575 | f 380/654/74 379/649/74 378/476/74 2576 | f 378/476/74 381/475/74 380/654/74 2577 | f 383/888/4 382/887/4 111/889/4 2578 | f 111/889/4 109/890/4 383/888/4 2579 | f 384/892/26 383/891/26 109/893/26 2580 | f 109/893/26 320/894/26 384/892/26 2581 | f 382/896/6 385/895/6 295/897/6 2582 | f 295/897/6 111/898/6 382/896/6 2583 | f 385/683/9 382/899/9 383/900/9 2584 | f 383/900/9 384/684/9 385/683/9 2585 | f 295/489/14 385/901/14 384/902/14 2586 | f 384/902/14 320/425/14 295/489/14 2587 | f 294/686/9 321/685/9 185/468/9 2588 | f 185/468/9 230/466/9 294/686/9 2589 | f 247/904/74 243/903/74 297/648/74 2590 | f 297/648/74 314/647/74 247/904/74 2591 | f 322/687/72 278/905/72 279/906/72 2592 | f 279/906/72 316/689/72 322/687/72 2593 | f 111/907/73 295/604/73 297/606/73 2594 | f 297/606/73 243/908/73 111/907/73 2595 | f 109/910/66 278/909/66 322/691/66 2596 | f 322/691/66 320/703/66 109/910/66 2597 | f 294/603/73 230/551/73 236/550/73 2598 | f 236/550/73 296/605/73 294/603/73 2599 | f 317/658/75 315/657/75 229/459/75 2600 | f 229/459/75 196/457/75 317/658/75 2601 | f 185/377/66 321/701/66 323/693/66 2602 | f 323/693/66 182/373/66 185/377/66 2603 | f 387/912/75 386/911/75 388/655/75 2604 | f 388/655/75 389/656/75 387/912/75 2605 | f 279/859/4 247/884/4 386/913/4 2606 | f 386/913/4 387/914/4 279/859/4 2607 | f 388/915/14 314/445/14 316/488/14 2608 | f 316/488/14 389/916/14 388/915/14 2609 | f 316/918/26 279/917/26 387/919/26 2610 | f 387/919/26 389/920/26 316/918/26 2611 | f 247/922/6 314/921/6 388/923/6 2612 | f 388/923/6 386/924/6 247/922/6 2613 | 2614 | 2615 | 2616 | 2617 | f 56/926/135 54/925/134 254/927/134 2618 | f 254/927/134 390/928/136 56/926/135 2619 | f 391/929/137 54/925/134 56/926/135 2620 | f 392/931/138 391/930/137 56/932/139 2621 | f 56/932/139 57/933/138 392/931/138 2622 | f 57/933/138 56/932/139 390/934/136 2623 | f 58/936/14 57/935/14 390/937/14 2624 | f 390/937/14 108/938/14 58/936/14 2625 | f 390/937/14 333/939/14 108/938/14 2626 | f 390/937/14 393/940/14 333/939/14 2627 | f 57/935/14 58/936/14 394/941/14 2628 | f 394/941/14 392/942/14 57/935/14 2629 | f 281/944/14 280/943/14 395/945/14 2630 | f 281/944/14 395/945/14 396/946/14 2631 | f 281/944/14 396/946/14 397/947/14 2632 | f 397/947/14 324/948/14 281/944/14 2633 | f 397/950/141 396/949/140 264/951/142 2634 | f 395/953/143 280/952/143 261/954/143 2635 | f 261/954/143 263/955/143 395/953/143 2636 | f 396/957/145 395/956/144 263/958/146 2637 | f 249/519/4 250/520/4 248/518/4 2638 | f 249/519/4 251/521/4 250/520/4 2639 | f 251/521/4 249/519/4 252/522/4 2640 | f 250/520/4 251/521/4 253/523/4 2641 | f 41/524/4 253/523/4 251/521/4 2642 | f 253/523/4 41/524/4 112/525/4 2643 | f 41/524/4 251/521/4 246/526/4 2644 | f 41/524/4 246/526/4 53/527/4 2645 | f 39/528/4 41/524/4 53/527/4 2646 | f 41/524/4 39/528/4 38/529/4 2647 | f 53/527/4 246/526/4 14/530/4 2648 | f 14/530/4 246/526/4 245/531/4 2649 | f 14/530/4 245/531/4 19/532/4 2650 | f 14/530/4 19/532/4 12/533/4 2651 | f 19/532/4 245/531/4 54/534/4 2652 | f 54/534/4 245/531/4 254/535/4 2653 | f 254/535/4 245/531/4 255/536/4 2654 | f 254/535/4 255/536/4 256/537/4 2655 | f 256/537/4 255/536/4 257/538/4 2656 | f 257/538/4 255/536/4 258/539/4 2657 | f 258/539/4 255/536/4 259/540/4 2658 | f 259/540/4 255/536/4 260/541/4 2659 | f 259/540/4 260/541/4 261/542/4 2660 | f 259/540/4 261/542/4 262/543/4 2661 | f 261/542/4 260/541/4 263/544/4 2662 | f 263/544/4 260/541/4 264/545/4 2663 | f 265/546/4 258/539/4 259/540/4 2664 | f 258/539/4 265/546/4 266/547/4 2665 | f 259/540/4 267/548/4 265/546/4 2666 | f 260/960/147 397/959/141 264/961/142 2667 | f 399/963/148 398/962/148 400/964/148 2668 | f 400/964/148 329/965/148 399/963/148 2669 | f 329/965/148 330/966/148 399/963/148 2670 | f 398/968/149 249/967/149 248/969/149 2671 | f 248/969/149 401/970/150 398/968/149 2672 | f 401/970/150 400/971/151 398/968/149 2673 | f 401/973/14 327/972/14 328/974/14 2674 | f 403/976/153 402/975/152 404/977/154 2675 | f 404/977/154 405/978/153 403/976/153 2676 | f 260/980/155 255/979/155 324/981/155 2677 | f 324/981/155 397/982/155 260/980/155 2678 | f 396/984/145 263/983/146 264/985/156 2679 | f 407/987/158 406/986/157 408/988/159 2680 | f 408/988/159 265/989/159 407/987/158 2681 | f 265/989/159 267/990/159 407/987/158 2682 | f 410/992/160 409/991/160 404/993/154 2683 | f 404/993/154 411/994/160 410/992/160 2684 | f 404/993/154 402/995/152 411/994/160 2685 | f 412/997/162 257/996/161 413/998/163 2686 | f 404/1000/164 409/999/164 406/1001/157 2687 | f 406/1001/157 407/1002/158 404/1000/164 2688 | f 246/1004/165 251/1003/165 414/1005/165 2689 | f 414/1005/165 244/1006/165 246/1004/165 2690 | f 416/1008/166 415/1007/166 393/1009/167 2691 | f 256/1010/166 416/1008/166 393/1009/167 2692 | f 393/1009/167 254/1011/168 256/1010/166 2693 | f 329/1013/169 400/1012/151 401/1014/150 2694 | f 401/1014/150 328/1015/169 329/1013/169 2695 | f 399/1017/171 417/1016/170 252/1018/172 2696 | f 415/1020/14 416/1019/14 412/1021/14 2697 | f 412/1021/14 413/1022/14 415/1020/14 2698 | f 413/1022/14 334/1023/14 415/1020/14 2699 | f 413/1022/14 335/1024/14 334/1023/14 2700 | f 413/1022/14 403/1025/14 335/1024/14 2701 | f 413/1022/14 402/1026/14 403/1025/14 2702 | f 413/1022/14 411/1027/14 402/1026/14 2703 | f 335/1029/173 403/1028/173 405/1030/173 2704 | f 405/1030/173 332/1031/173 335/1029/173 2705 | f 254/1033/168 393/1032/167 390/1034/174 2706 | f 326/1036/176 248/1035/175 250/1037/177 2707 | f 250/1037/177 325/1038/177 326/1036/176 2708 | f 414/1040/179 251/1039/178 417/1041/180 2709 | f 417/1043/14 399/1042/14 330/1044/14 2710 | f 330/1044/14 242/1045/14 417/1043/14 2711 | f 242/1045/14 414/1046/14 417/1043/14 2712 | f 242/1045/14 244/1047/14 414/1046/14 2713 | f 398/1049/181 399/1048/171 252/1050/172 2714 | f 252/1050/172 249/1051/181 398/1049/181 2715 | f 409/1053/183 410/1052/182 258/1054/184 2716 | f 258/1054/184 266/1055/183 409/1053/183 2717 | f 266/1055/183 406/1056/183 409/1053/183 2718 | f 266/1055/183 408/1057/183 406/1056/183 2719 | f 251/1059/178 252/1058/185 417/1060/180 2720 | f 407/1062/186 267/1061/186 259/1063/186 2721 | f 259/1063/186 331/1064/186 407/1062/186 2722 | f 416/1066/187 256/1065/187 257/1067/187 2723 | f 257/1067/187 412/1068/187 416/1066/187 2724 | f 265/1070/188 408/1069/188 266/1071/188 2725 | f 393/1073/189 415/1072/189 334/1074/189 2726 | f 334/1074/189 333/1075/189 393/1073/189 2727 | f 250/1077/190 253/1076/190 325/1078/190 2728 | f 413/1080/163 257/1079/161 258/1081/191 2729 | f 401/1083/192 248/1082/175 326/1084/176 2730 | f 326/1084/176 327/1085/192 401/1083/192 2731 | f 331/1087/14 332/1086/14 405/1088/14 2732 | f 405/1088/14 404/1089/14 331/1087/14 2733 | f 404/1089/14 407/1090/14 331/1087/14 2734 | f 411/1092/193 413/1091/193 258/1093/184 2735 | f 258/1093/184 410/1094/182 411/1092/193 2736 | 2737 | 2738 | 2739 | 2740 | f 192/448/14 191/491/14 218/426/14 2741 | f 218/426/14 213/446/14 192/448/14 2742 | f 218/426/14 207/487/14 213/446/14 2743 | f 218/426/14 210/427/14 207/487/14 2744 | --------------------------------------------------------------------------------