 bondscell_results 1$ca7d2270-193d-11eb-3dd6-e1f6d2678a21queued¤logsrunning¦outputbodyـ<div class="markdown"><p>High resolution: <bond def="highres" unique_id="d06MJ09AkxKl"><input type="checkbox"></bond></p>
</div>mimetext/htmlrootassigneelast_run_timestampAK8persist_js_state·has_pluto_hook_features§cell_id$ca7d2270-193d-11eb-3dd6-e1f6d2678a21depends_on_disabled_cells§runtime2Opublished_object_keysdepends_on_skipped_cells§errored$8cc03530-1910-11eb-3404-15f5c8f69f8fqueued¤logsrunning¦outputbody+propagate (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAi+persist_js_state·has_pluto_hook_features§cell_id$8cc03530-1910-11eb-3404-15f5c8f69f8fdepends_on_disabled_cells§runtime 3&published_object_keysdepends_on_skipped_cells§errored$45a028a0-190f-11eb-355d-ad3c55fb1e2fqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampA\persist_js_state·has_pluto_hook_features§cell_id$45a028a0-190f-11eb-355d-ad3c55fb1e2fdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8c36e0f0-1910-11eb-1a50-6526ea1a9663queued¤logsrunning¦outputbody(refract (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA.opersist_js_state·has_pluto_hook_features§cell_id$8c36e0f0-1910-11eb-1a50-6526ea1a9663depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8c67b4f0-1910-11eb-0efe-5f123cc14d53queued¤logsrunning¦outputbody(reflect (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampArpersist_js_state·has_pluto_hook_features§cell_id$8c67b4f0-1910-11eb-0efe-5f123cc14d53depends_on_disabled_cells§runtime 棵published_object_keysdepends_on_skipped_cells§errored$8cd93b70-1910-11eb-050a-5713b545f28equeued¤logsrunning¦outputbody,pixel_color (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAhdpersist_js_state·has_pluto_hook_features§cell_id$8cd93b70-1910-11eb-050a-5713b545f28edepends_on_disabled_cells§runtime ygpublished_object_keysdepends_on_skipped_cells§errored$8d1e5abe-1910-11eb-2a84-79f43f4a7e65queued¤logsrunning¦outputbody(objects (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAmpersist_js_state·has_pluto_hook_features§cell_id$8d1e5abe-1910-11eb-2a84-79f43f4a7e65depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8e89388e-1914-11eb-0f2f-619c7fe79430queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAi8spersist_js_state·has_pluto_hook_features§cell_id$8e89388e-1914-11eb-0f2f-619c7fe79430depends_on_disabled_cells§runtime#published_object_keysdepends_on_skipped_cells§errored$c1f06690-1914-11eb-2426-29e3027f4f32queued¤logsrunning¦outputbodyprefixFloat64elements10002.0text/plain0.0text/plain0.0text/plaintypeArrayprefix_shortobjectid17e098aeedf4a4a1mime!application/vnd.pluto.tree+objectrootassigneelast_run_timestampAMZWpersist_js_state·has_pluto_hook_features§cell_id$c1f06690-1914-11eb-2426-29e3027f4f32depends_on_disabled_cells§runtimez
published_object_keysdepends_on_skipped_cells§errored$8c1acd70-1910-11eb-24e6-333b3aa1e91fqueued¤logsrunning¦outputbody1sphere_normal_at (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8c1acd70-1910-11eb-24e6-333b3aa1e91fdepends_on_disabled_cells§runtime ӵpublished_object_keysdepends_on_skipped_cells§errored$8c99c170-1910-11eb-2e24-49ed98b4dd2cqueued¤logsrunning¦outputbody-intersection (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampArpersist_js_state·has_pluto_hook_features§cell_id$8c99c170-1910-11eb-2e24-49ed98b4dd2cdepends_on_disabled_cells§runtime (;published_object_keysdepends_on_skipped_cells§errored$8989d43e-190e-11eb-3e48-7d10df903b5dqueued¤logslinemsgE[32m[1m  Activating[22m[39m new project at `/tmp/jl_UC5bFu`
[32m[1m    Updating[22m[39m registry at `~/.julia/registries/General.toml`
[32m[1m   Resolving[22m[39m package versions...
[32m[1m   Installed[22m[39m ImageMagick ────── v1.3.0
[32m[1m   Installed[22m[39m Accessors ──────── v0.1.41
[32m[1m   Installed[22m[39m Referenceables ─── v0.1.3
[32m[1m   Installed[22m[39m InitialValues ──── v0.3.1
[32m[1m   Installed[22m[39m GR_jll ─────────── v0.72.8+0
[32m[1m   Installed[22m[39m Images ─────────── v0.23.3
[32m[1m   Installed[22m[39m DefineSingletons ─ v0.1.2
[32m[1m   Installed[22m[39m SpecialFunctions ─ v1.8.8
[32m[1m   Installed[22m[39m MicroCollections ─ v0.2.0
[32m[1m   Installed[22m[39m StatsBase ──────── v0.33.21
[32m[1m   Installed[22m[39m BangBang ───────── v0.4.3
[32m[1m   Installed[22m[39m ArgCheck ───────── v2.4.0
[32m[1m   Installed[22m[39m Libtiff_jll ────── v4.4.0+0
[32m[1m   Installed[22m[39m ImageShow ──────── v0.2.3
[32m[1m   Installed[22m[39m ColorVectorSpace ─ v0.8.7
[32m[1m   Installed[22m[39m CompositionsBase ─ v0.1.2
[32m[1m   Installed[22m[39m ThreadsX ───────── v0.1.12
[32m[1m   Installed[22m[39m OpenSSL_jll ────── v1.1.23+1
[32m[1m   Installed[22m[39m ColorTypes ─────── v0.10.12
[32m[1m   Installed[22m[39m Transducers ────── v0.4.84
[32m[1m   Installed[22m[39m Plots ──────────── v1.40.7
[32m[1m   Installed[22m[39m WoodburyMatrices ─ v0.5.6
[32m[1m   Installed[22m[39m SplittablesBase ── v0.1.15
[32m[1m   Installed[22m[39m Baselet ────────── v0.1.1
[32m[1m   Installed[22m[39m Interpolations ─── v0.13.6
[32m[1m   Installed[22m[39m GR ─────────────── v0.72.8
[32m[1m   Installed[22m[39m FFMPEG_jll ─────── v4.4.2+2
[32m[1m    Updating[22m[39m `/tmp/jl_UC5bFu/Project.toml`
 [90m [6218d12a] [39m[92m+ ImageMagick v1.3.0[39m
 [90m [916415d5] [39m[92m+ Images v0.23.3[39m
 [90m [91a5bcdd] [39m[92m+ Plots v1.40.7[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.6.11[39m
 [90m [ac1d9e8a] [39m[92m+ ThreadsX v0.1.12[39m
[32m[1m    Updating[22m[39m `/tmp/jl_UC5bFu/Manifest.toml`
 [90m [621f4979] [39m[92m+ AbstractFFTs v1.5.0[39m
 [90m [7d9f7c33] [39m[92m+ Accessors v0.1.41[39m
 [90m [79e6a3ab] [39m[92m+ Adapt v4.3.0[39m
 [90m [dce04be8] [39m[92m+ ArgCheck v2.4.0[39m
 [90m [13072b0f] [39m[92m+ AxisAlgorithms v1.0.1[39m
 [90m [39de3d68] [39m[92m+ AxisArrays v0.4.7[39m
 [90m [198e06fe] [39m[92m+ BangBang v0.4.3[39m
 [90m [9718e550] [39m[92m+ Baselet v0.1.1[39m
 [90m [d1d4a3ce] [39m[92m+ BitFlags v0.1.9[39m
 [90m [aafaddc9] [39m[92m+ CatIndices v0.2.2[39m
 [90m [d360d2e6] [39m[92m+ ChainRulesCore v1.25.1[39m
 [90m [9e997f8a] [39m[92m+ ChangesOfVariables v0.1.10[39m
 [90m [944b1d66] [39m[92m+ CodecZlib v0.7.8[39m
 [90m [35d6a980] [39m[92m+ ColorSchemes v3.26.0[39m
 [90m [3da002f7] [39m[92m+ ColorTypes v0.10.12[39m
 [90m [c3611d14] [39m[92m+ ColorVectorSpace v0.8.7[39m
 [90m [5ae59095] [39m[92m+ Colors v0.12.11[39m
 [90m [34da2185] [39m[92m+ Compat v4.16.0[39m
 [90m [a33af91c] [39m[92m+ CompositionsBase v0.1.2[39m
 [90m [ed09eef8] [39m[92m+ ComputationalResources v0.3.2[39m
 [90m [f0e56b4a] [39m[92m+ ConcurrentUtilities v2.5.0[39m
 [90m [187b0558] [39m[92m+ ConstructionBase v1.5.8[39m
 [90m [d38c429a] [39m[92m+ Contour v0.6.3[39m
 [90m [150eb455] [39m[92m+ CoordinateTransformations v0.6.3[39m
 [90m [dc8bdbbb] [39m[92m+ CustomUnitRanges v1.0.2[39m
 [90m [9a962f9c] [39m[92m+ DataAPI v1.16.0[39m
 [90m [864edb3b] [39m[92m+ DataStructures v0.18.22[39m
 [90m [e2d170a0] [39m[92m+ DataValueInterfaces v1.0.0[39m
 [90m [244e2a9f] [39m[92m+ DefineSingletons v0.1.2[39m
 [90m [b4f34e82] [39m[92m+ Distances v0.10.12[39m
 [90m [ffbed154] [39m[92m+ DocStringExtensions v0.9.5[39m
 [90m [460bff9d] [39m[92m+ ExceptionUnwrapping v0.1.11[39m
 [90m [c87230d0] [39m[92m+ FFMPEG v0.4.2[39m
 [90m [4f61f5a4] [39m[92m+ FFTViews v0.3.2[39m
 [90m [7a1cc6ca] [39m[92m+ FFTW v1.9.0[39m
 [90m [5789e2e9] [39m[92m+ FileIO v1.17.0[39m
 [90m [53c48c17] [39m[92m+ FixedPointNumbers v0.8.5[39m
 [90m [1fa38f19] [39m[92m+ Format v1.3.7[39m
 [90m [28b8d3ca] [39m[92m+ GR v0.72.8[39m
 [90m [a2bd30eb] [39m[92m+ Graphics v1.1.3[39m
 [90m [42e2da0e] [39m[92m+ Grisu v1.0.2[39m
 [90m [cd3eb016] [39m[92m+ HTTP v1.10.16[39m
 [90m [bbac6d45] [39m[92m+ IdentityRanges v0.3.1[39m
 [90m [2803e5a7] [39m[92m+ ImageAxes v0.6.9[39m
 [90m [f332f351] [39m[92m+ ImageContrastAdjustment v0.3.7[39m
 [90m [a09fc81d] [39m[92m+ ImageCore v0.8.22[39m
 [90m [51556ac3] [39m[92m+ ImageDistances v0.2.13[39m
 [90m [6a3955dd] [39m[92m+ ImageFiltering v0.6.21[39m
 [90m [6218d12a] [39m[92m+ ImageMagick v1.3.0[39m
 [90m [bc367c6b] [39m[92m+ ImageMetadata v0.9.5[39m
 [90m [787d08f9] [39m[92m+ ImageMorphology v0.2.11[39m
 [90m [2996bd0c] [39m[92m+ ImageQualityIndexes v0.2.2[39m
 [90m [4e3cecfd] [39m[92m+ ImageShow v0.2.3[39m
 [90m [02fcd773] [39m[92m+ ImageTransformations v0.8.13[39m
 [90m [916415d5] [39m[92m+ Images v0.23.3[39m
 [90m [9b13fd28] [39m[92m+ IndirectArrays v0.5.1[39m
 [90m [22cec73e] [39m[92m+ InitialValues v0.3.1[39m
 [90m [a98d9a8b] [39m[92m+ Interpolations v0.13.6[39m
 [90m [8197267c] [39m[92m+ IntervalSets v0.7.11[39m
 [90m [3587e190] [39m[92m+ InverseFunctions v0.1.17[39m
 [90m [92d709cd] [39m[92m+ IrrationalConstants v0.1.1[39m
 [90m [c8e1da08] [39m[92m+ IterTools v1.4.0[39m
 [90m [82899510] [39m[92m+ IteratorInterfaceExtensions v1.0.0[39m
 [90m [1019f520] [39m[92m+ JLFzf v0.1.11[39m
 [90m [692b3bcd] [39m[92m+ JLLWrappers v1.7.0[39m
 [90m [682c06a0] [39m[92m+ JSON v0.21.4[39m
 [90m [b964fa9f] [39m[92m+ LaTeXStrings v1.4.0[39m
 [90m [23fbe1c1] [39m[92m+ Latexify v0.16.8[39m
 [90m [2ab3a3ac] [39m[92m+ LogExpFunctions v0.3.28[39m
 [90m [e6f89c97] [39m[92m+ LoggingExtras v1.1.0[39m
 [90m [1914dd2f] [39m[92m+ MacroTools v0.5.16[39m
 [90m [dbb5928d] [39m[92m+ MappedArrays v0.4.2[39m
 [90m [739be429] [39m[92m+ MbedTLS v1.1.9[39m
 [90m [442fdcdd] [39m[92m+ Measures v0.3.2[39m
 [90m [128add7d] [39m[92m+ MicroCollections v0.2.0[39m
 [90m [e1d29d7a] [39m[92m+ Missings v1.2.0[39m
 [90m [e94cdb99] [39m[92m+ MosaicViews v0.3.4[39m
 [90m [77ba4419] [39m[92m+ NaNMath v1.0.3[39m
 [90m [6fe1bfb0] [39m[92m+ OffsetArrays v1.17.0[39m
 [90m [4d8831e6] [39m[92m+ OpenSSL v1.5.0[39m
 [90m [bac558e1] [39m[92m+ OrderedCollections v1.8.1[39m
 [90m [5432bcbf] [39m[92m+ PaddedViews v0.5.12[39m
 [90m [d96e819e] [39m[92m+ Parameters v0.12.3[39m
 [90m [69de0a69] [39m[92m+ Parsers v2.8.3[39m
 [90m [ccf2f8ad] [39m[92m+ PlotThemes v3.3.0[39m
 [90m [995b91a9] [39m[92m+ PlotUtils v1.4.3[39m
 [90m [91a5bcdd] [39m[92m+ Plots v1.40.7[39m
 [90m [7f904dfe] [39m[92m+ PlutoUI v0.6.11[39m
 [90m [aea7be01] [39m[92m+ PrecompileTools v1.2.1[39m
 [90m [21216c6a] [39m[92m+ Preferences v1.4.3[39m
 [90m [94ee1d12] [39m[92m+ Quaternions v0.7.6[39m
 [90m [b3c3ace0] [39m[92m+ RangeArrays v0.3.2[39m
 [90m [c84ed2f1] [39m[92m+ Ratios v0.4.5[39m
 [90m [c1ae055f] [39m[92m+ RealDot v0.1.0[39m
 [90m [3cdcf5f2] [39m[92m+ RecipesBase v1.3.4[39m
 [90m [01d81517] [39m[92m+ RecipesPipeline v0.6.12[39m
 [90m [189a3867] [39m[92m+ Reexport v1.2.2[39m
 [90m [42d2dcc6] [39m[92m+ Referenceables v0.1.3[39m
 [90m [05181044] [39m[92m+ RelocatableFolders v1.0.1[39m
 [90m [ae029012] [39m[92m+ Requires v1.3.1[39m
 [90m [6038ab10] [39m[92m+ Rotations v1.7.1[39m
 [90m [6c6a2e73] [39m[92m+ Scratch v1.2.1[39m
 [90m [efcf1570] [39m[92m+ Setfield v1.1.2[39m
 [90m [992d4aef] [39m[92m+ Showoff v1.0.3[39m
 [90m [777ac1f9] [39m[92m+ SimpleBufferStream v1.2.0[39m
 [90m [699a6c99] [39m[92m+ SimpleTraits v0.9.4[39m
 [90m [a2af1166] [39m[92m+ SortingAlgorithms v1.2.1[39m
 [90m [276daf66] [39m[92m+ SpecialFunctions v1.8.8[39m
 [90m [171d559e] [39m[92m+ SplittablesBase v0.1.15[39m
 [90m [860ef19b] [39m[92m+ StableRNGs v1.0.3[39m
 [90m [cae243ae] [39m[92m+ StackViews v0.1.2[39m
 [90m [90137ffa] [39m[92m+ StaticArrays v1.9.13[39m
 [90m [1e83bf80] [39m[92m+ StaticArraysCore v1.4.3[39m
 [90m [82ae8749] [39m[92m+ StatsAPI v1.7.1[39m
 [90m [2913bbd2] [39m[92m+ StatsBase v0.33.21[39m
 [90m [fd094767] [39m[92m+ Suppressor v0.2.8[39m
 [90m [3783bdb8] [39m[92m+ TableTraits v1.0.1[39m
 [90m [bd369af6] [39m[92m+ Tables v1.12.1[39m
 [90m [ac1d9e8a] [39m[92m+ ThreadsX v0.1.12[39m
 [90m [06e1c1a7] [39m[92m+ TiledIteration v0.3.1[39m
 [90m [3bb67fe8] [39m[92m+ TranscodingStreams v0.11.3[39m
 [90m [28d57a85] [39m[92m+ Transducers v0.4.84[39m
 [90m [5c2747f8] [39m[92m+ URIs v1.5.2[39m
 [90m [3a884ed6] [39m[92m+ UnPack v1.0.2[39m
 [90m [1cfade01] [39m[92m+ UnicodeFun v0.4.1[39m
 [90m [1986cc42] [39m[92m+ Unitful v1.23.1[39m
 [90m [45397f5d] [39m[92m+ UnitfulLatexify v1.7.0[39m
 [90m [41fe7b60] [39m[92m+ Unzip v0.2.0[39m
 [90m [efce3f68] [39m[92m+ WoodburyMatrices v0.5.6[39m
 [90m [6e34b625] [39m[92m+ Bzip2_jll v1.0.9+0[39m
 [90m [83423d85] [39m[92m+ Cairo_jll v1.18.5+0[39m
 [90m [ee1fde0b] [39m[92m+ Dbus_jll v1.16.2+0[39m
 [90m [2702e6a9] [39m[92m+ EpollShim_jll v0.0.20230411+1[39m
 [90m [2e619515] [39m[92m+ Expat_jll v2.6.5+0[39m
 [90m [b22a6f82] [39m[92m+ FFMPEG_jll v4.4.2+2[39m
 [90m [f5851436] [39m[92m+ FFTW_jll v3.3.11+0[39m
 [90m [a3f928ae] [39m[92m+ Fontconfig_jll v2.16.0+0[39m
 [90m [d7e528f0] [39m[92m+ FreeType2_jll v2.13.4+0[39m
 [90m [559328eb] [39m[92m+ FriBidi_jll v1.0.17+0[39m
 [90m [0656b61e] [39m[92m+ GLFW_jll v3.4.0+2[39m
 [90m [d2c73de3] [39m[92m+ GR_jll v0.72.8+0[39m
 [90m [78b55507] [39m[92m+ Gettext_jll v0.21.0+0[39m
 [90m [7746bdde] [39m[92m+ Glib_jll v2.84.0+0[39m
 [90m [3b182d85] [39m[92m+ Graphite2_jll v1.3.15+0[39m
 [90m [2e76f6c2] [39m[92m+ HarfBuzz_jll v8.5.1+0[39m
 [90m [c73af94c] [39m[92m+ ImageMagick_jll v6.9.10-12+3[39m
 [90m [1d5cc7b8] [39m[92m+ IntelOpenMP_jll v2025.0.4+0[39m
 [90m [aacddb02] [39m[92m+ JpegTurbo_jll v3.1.1+0[39m
 [90m [c1c5ebd0] [39m[92m+ LAME_jll v3.100.2+0[39m
 [90m [88015f11] [39m[92m+ LERC_jll v3.0.0+1[39m
 [90m [1d63c593] [39m[92m+ LLVMOpenMP_jll v18.1.8+0[39m
 [90m [dd4b983a] [39m[92m+ LZO_jll v2.10.3+0[39m
 [90m [e9f186c6] [39m[92m+ Libffi_jll v3.4.7+0[39m
 [90m [7e76a0d4] [39m[92m+ Libglvnd_jll v1.7.1+1[39m
 [90m [94ce4f54] [39m[92m+ Libiconv_jll v1.18.0+0[39m
 [90m [4b2f31a3] [39m[92m+ Libmount_jll v2.41.0+0[39m
 [90m [89763e89] [39m[92m+ Libtiff_jll v4.4.0+0[39m
 [90m [38a345b3] [39m[92m+ Libuuid_jll v2.41.0+0[39m
 [90m [856f044c] [39m[92m+ MKL_jll v2025.0.1+1[39m
 [90m [e7412a2a] [39m[92m+ Ogg_jll v1.3.5+1[39m
 [90m [458c3c95] [39m[92m+ OpenSSL_jll v1.1.23+1[39m
 [90m [efe28fd5] [39m[92m+ OpenSpecFun_jll v0.5.6+0[39m
 [90m [91d4177d] [39m[92m+ Opus_jll v1.3.3+0[39m
 [90m [36c8627f] [39m[92m+ Pango_jll v1.56.3+0[39m
 [90m [30392449] [39m[92m+ Pixman_jll v0.44.2+0[39m
 [90m [ea2cea3b] [39m[92m+ Qt5Base_jll v5.15.3+2[39m
 [90m [a2964d1f] [39m[92m+ Wayland_jll v1.23.1+0[39m
 [90m [2381bf8a] [39m[92m+ Wayland_protocols_jll v1.44.0+0[39m
 [90m [02c8fc9c] [39m[92m+ XML2_jll v2.13.6+1[39m
 [90m [4f6342f7] [39m[92m+ Xorg_libX11_jll v1.8.12+0[39m
 [90m [0c0b7dd1] [39m[92m+ Xorg_libXau_jll v1.0.13+0[39m
 [90m [935fb764] [39m[92m+ Xorg_libXcursor_jll v1.2.4+0[39m
 [90m [a3789734] [39m[92m+ Xorg_libXdmcp_jll v1.1.6+0[39m
 [90m [1082639a] [39m[92m+ Xorg_libXext_jll v1.3.7+0[39m
 [90m [d091e8ba] [39m[92m+ Xorg_libXfixes_jll v6.0.1+0[39m
 [90m [a51aa0fd] [39m[92m+ Xorg_libXi_jll v1.8.3+0[39m
 [90m [d1454406] [39m[92m+ Xorg_libXinerama_jll v1.1.6+0[39m
 [90m [ec84b674] [39m[92m+ Xorg_libXrandr_jll v1.5.5+0[39m
 [90m [ea2f1a96] [39m[92m+ Xorg_libXrender_jll v0.9.12+0[39m
 [90m [c7cfdc94] [39m[92m+ Xorg_libxcb_jll v1.17.1+0[39m
 [90m [cc61e674] [39m[92m+ Xorg_libxkbfile_jll v1.1.3+0[39m
 [90m [12413925] [39m[92m+ Xorg_xcb_util_image_jll v0.4.1+0[39m
 [90m [2def613f] [39m[92m+ Xorg_xcb_util_jll v0.4.1+0[39m
 [90m [975044d2] [39m[92m+ Xorg_xcb_util_keysyms_jll v0.4.1+0[39m
 [90m [0d47668e] [39m[92m+ Xorg_xcb_util_renderutil_jll v0.3.10+0[39m
 [90m [c22f9ab0] [39m[92m+ Xorg_xcb_util_wm_jll v0.4.2+0[39m
 [90m [35661453] [39m[92m+ Xorg_xkbcomp_jll v1.4.7+0[39m
 [90m [33bec58e] [39m[92m+ Xorg_xkeyboard_config_jll v2.44.0+0[39m
 [90m [c5fb5394] [39m[92m+ Xorg_xtrans_jll v1.6.0+0[39m
 [90m [3161d3a3] [39m[92m+ Zstd_jll v1.5.7+1[39m
 [90m [214eeab7] [39m[92m+ fzf_jll v0.61.1+0[39m
 [90m [a4ae2306] [39m[92m+ libaom_jll v3.11.0+0[39m
 [90m [0ac62f75] [39m[92m+ libass_jll v0.15.2+0[39m
 [90m [1183f4f0] [39m[92m+ libdecor_jll v0.2.2+0[39m
 [90m [f638f0a6] [39m[92m+ libfdk_aac_jll v2.0.3+0[39m
 [90m [b53b4c65] [39m[92m+ libpng_jll v1.6.49+0[39m
 [90m [f27f6e37] [39m[92m+ libvorbis_jll v1.3.7+2[39m
 [90m [1317d2d5] [39m[92m+ oneTBB_jll v2022.0.0+0[39m
 [90m [1270edf5] [39m[92m+ x264_jll v2021.5.5+0[39m
 [90m [dfaa095f] [39m[92m+ x265_jll v3.5.0+0[39m
 [90m [d8fb68d0] [39m[92m+ xkbcommon_jll v1.8.1+0[39m
 [90m [0dad84c5] [39m[92m+ ArgTools[39m
 [90m [56f22d72] [39m[92m+ Artifacts[39m
 [90m [2a0f44e3] [39m[92m+ Base64[39m
 [90m [ade2ca70] [39m[92m+ Dates[39m
 [90m [8bb1440f] [39m[92m+ DelimitedFiles[39m
 [90m [8ba89e20] [39m[92m+ Distributed[39m
 [90m [f43a241f] [39m[92m+ Downloads[39m
 [90m [7b1f6079] [39m[92m+ FileWatching[39m
 [90m [9fa8497b] [39m[92m+ Future[39m
 [90m [b77e0a4c] [39m[92m+ InteractiveUtils[39m
 [90m [4af54fe1] [39m[92m+ LazyArtifacts[39m
 [90m [b27032c2] [39m[92m+ LibCURL[39m
 [90m [76f85450] [39m[92m+ LibGit2[39m
 [90m [8f399da3] [39m[92m+ Libdl[39m
 [90m [37e2e46d] [39m[92m+ LinearAlgebra[39m
 [90m [56ddb016] [39m[92m+ Logging[39m
 [90m [d6f4376e] [39m[92m+ Markdown[39m
 [90m [a63ad114] [39m[92m+ Mmap[39m
 [90m [ca575930] [39m[92m+ NetworkOptions[39m
 [90m [44cfe95a] [39m[92m+ Pkg[39m
 [90m [de0858da] [39m[92m+ Printf[39m
 [90m [3fa0cd96] [39m[92m+ REPL[39m
 [90m [9a3f8284] [39m[92m+ Random[39m
 [90m [ea8e919c] [39m[92m+ SHA[39m
 [90m [9e88b42a] [39m[92m+ Serialization[39m
 [90m [1a1011a3] [39m[92m+ SharedArrays[39m
 [90m [6462fe0b] [39m[92m+ Sockets[39m
 [90m [2f01184e] [39m[92m+ SparseArrays[39m
 [90m [10745b16] [39m[92m+ Statistics[39m
 [90m [fa267f1f] [39m[92m+ TOML[39m
 [90m [a4e569a6] [39m[92m+ Tar[39m
 [90m [8dfed614] [39m[92m+ Test[39m
 [90m [cf7118a7] [39m[92m+ UUIDs[39m
 [90m [4ec0a83e] [39m[92m+ Unicode[39m
 [90m [e66e0078] [39m[92m+ CompilerSupportLibraries_jll[39m
 [90m [deac9b47] [39m[92m+ LibCURL_jll[39m
 [90m [29816b5a] [39m[92m+ LibSSH2_jll[39m
 [90m [c8ffd9c3] [39m[92m+ MbedTLS_jll[39m
 [90m [14a3606d] [39m[92m+ MozillaCACerts_jll[39m
 [90m [4536629a] [39m[92m+ OpenBLAS_jll[39m
 [90m [05823500] [39m[92m+ OpenLibm_jll[39m
 [90m [efcefdf7] [39m[92m+ PCRE2_jll[39m
 [90m [83775a58] [39m[92m+ Zlib_jll[39m
 [90m [8e850b90] [39m[92m+ libblastrampoline_jll[39m
 [90m [8e850ede] [39m[92m+ nghttp2_jll[39m
 [90m [3f19e933] [39m[92m+ p7zip_jll[39m
[32m[1mPrecompiling[22m[39m project...
[32m  ✓ [39m[90mCompositionsBase[39m
[32m  ✓ [39m[90mArgCheck[39m
[32m  ✓ [39m[90mWoodburyMatrices[39m
[32m  ✓ [39m[90mDefineSingletons[39m
[32m  ✓ [39m[90mInitialValues[39m
[32m  ✓ [39m[90mReferenceables[39m
[32m  ✓ [39m[90mOpenSSL_jll[39m
[32m  ✓ [39m[90mBaselet[39m
[32m  ✓ [39m[90mSplittablesBase[39m
[32m  ✓ [39m[90mLibtiff_jll[39m
[32m  ✓ [39m[90mAxisAlgorithms[39m
[32m  ✓ [39m[90mOpenSSL[39m
[32m  ✓ [39m[90mAccessors[39m
[32m  ✓ [39m[90mQt5Base_jll[39m
[32m  ✓ [39m[90mFFMPEG_jll[39m
[32m  ✓ [39m[90mStatsBase[39m
[32m  ✓ [39m[90mImageMagick_jll[39m
[32m  ✓ [39m[90mBangBang[39m
[32m  ✓ [39m[90mFFMPEG[39m
[32m  ✓ [39m[90mSpecialFunctions[39m
[32m  ✓ [39m[90mGR_jll[39m
[32m  ✓ [39m[90mMicroCollections[39m
[32m  ✓ [39m[90mHTTP[39m
[32m  ✓ [39m[90mInterpolations[39m
[32m  ✓ [39m[90mColorTypes[39m
[32m  ✓ [39m[90mTransducers[39m
[32m  ✓ [39m[90mGR[39m
[32m  ✓ [39mThreadsX
[32m  ✓ [39m[90mColors[39m
[32m  ✓ [39m[90mGraphics[39m
[32m  ✓ [39m[90mColorVectorSpace[39m
[32m  ✓ [39m[90mImageCore[39m
[32m  ✓ [39m[90mImageShow[39m
[32m  ✓ [39m[90mImageAxes[39m
[32m  ✓ [39m[90mImageMorphology[39m
[32m  ✓ [39mImageMagick
[32m  ✓ [39m[90mImageMetadata[39m
[32m  ✓ [39m[90mImageTransformations[39m
[32m  ✓ [39m[90mImageDistances[39m
[32m  ✓ [39m[90mColorSchemes[39m
[32m  ✓ [39m[90mImageContrastAdjustment[39m
[32m  ✓ [39m[90mPlotUtils[39m
[32m  ✓ [39m[90mPlotThemes[39m
[32m  ✓ [39m[90mRecipesPipeline[39m
[32m  ✓ [39m[90mImageFiltering[39m
[32m  ✓ [39m[90mImageQualityIndexes[39m
[32m  ✓ [39mImages
[32m  ✓ [39mPlots
  48 dependencies successfully precompiled in 81 seconds (161 already precompiled)
text/plaincell_id$8989d43e-190e-11eb-3e48-7d10df903b5dkwargsidPlutoRunner_d1acb81efileP/home/runner/.julia/packages/Pluto/6smog/src/runner/PlutoRunner/src/io/stdout.jlgroupstdoutlevelLogLevel(-555)running¦outputbodymimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8989d43e-190e-11eb-3e48-7d10df903b5ddepends_on_disabled_cells§runtime   %-published_object_keysdepends_on_skipped_cells§errored$8cd93b70-1910-11eb-39eb-a7dd6c180bcfqueued¤logsrunning¦outputbody/convert_to_img (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAuxpersist_js_state·has_pluto_hook_features§cell_id$8cd93b70-1910-11eb-39eb-a7dd6c180bcfdepends_on_disabled_cells§runtime |published_object_keysdepends_on_skipped_cells§errored$8c09b670-1910-11eb-378a-7b49a6e0e0faqueued¤logsrunning¦outputbody.ColoredSphere (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8c09b670-1910-11eb-378a-7b49a6e0e0fadepends_on_disabled_cells§runtime 8published_object_keysdepends_on_skipped_cells§errored$8d079e70-1910-11eb-01df-e5817d349353queued¤logsrunning¦outputbodyprefixMain.workspace#5.SkyBoxelementsprefixSkyBoxelementspprefixFloat64elements0.0text/plain0.0text/plain0.0text/plaintypeArrayprefix_shortobjectid484a4b5d1bcb92f!application/vnd.pluto.tree+objectr1000.0text/plaintypestructprefix_shortSkyBoxobjectidcf5e8602622a825d!application/vnd.pluto.tree+objecttypeArrayprefix_shortobjectid783619af33af81a4mime!application/vnd.pluto.tree+objectrootassigneeskylast_run_timestampAČpersist_js_state·has_pluto_hook_features§cell_id$8d079e70-1910-11eb-01df-e5817d349353depends_on_disabled_cells§runtimeCepublished_object_keysdepends_on_skipped_cells§errored$8c29e89e-1910-11eb-0ab3-bd8039bb7f10queued¤logsrunning¦outputbody+inside_of (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8c29e89e-1910-11eb-0ab3-bd8039bb7f10depends_on_disabled_cells§runtime }ϵpublished_object_keysdepends_on_skipped_cells§errored$8c45ae00-1910-11eb-0726-79ba8d8e8085queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampA߰persist_js_state·has_pluto_hook_features§cell_id$8c45ae00-1910-11eb-0726-79ba8d8e8085depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAi9WKpersist_js_state·has_pluto_hook_features§cell_id$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8bccfb90-1910-11eb-07e2-89c2354c0ec5queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAdLpersist_js_state·has_pluto_hook_features§cell_id$8bccfb90-1910-11eb-07e2-89c2354c0ec5depends_on_disabled_cells§runtime ߵpublished_object_keysdepends_on_skipped_cells§errored$0bc3e570-1939-11eb-1e86-e97a9b07ea7cqueued¤logsrunning¦outputbodymsgUndefVarError: t not definedstacktracecall_shorttop-level scopeinlined£urlpathn/home/runner/work/disorganised-mess/disorganised-mess/raytracing_3d.jl#==#0bc3e570-1939-11eb-1e86-e97a9b07ea7csource_packagecalltop-level scopelinfo_typeCore.CodeInfolinefile8raytracing_3d.jl#==#0bc3e570-1939-11eb-1e86-e97a9b07ea7cfunctop-level scopeparent_modulefrom_c¤mime'application/vnd.pluto.stacktrace+objectrootassigneelast_run_timestampAk°persist_js_state·has_pluto_hook_features§cell_id$0bc3e570-1939-11eb-1e86-e97a9b07ea7cdepends_on_disabled_cells§runtimepublished_object_keysdepends_on_skipped_cells§errored$b766c970-1910-11eb-1457-9f5986c4807fqueued¤logsrunning¦outputbody)as_image (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA.persist_js_state·has_pluto_hook_features§cell_id$b766c970-1910-11eb-1457-9f5986c4807fdepends_on_disabled_cells§runtime dpublished_object_keysdepends_on_skipped_cells§errored$8bfbfad0-1910-11eb-1c82-17966c89f2b2queued¤logsrunning¦outputbody1ReflectingSphere (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA8persist_js_state·has_pluto_hook_features§cell_id$8bfbfad0-1910-11eb-1c82-17966c89f2b2depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$b1537ff0-1911-11eb-01c4-39237e7c8123queued¤logsrunning¦outputbodyCartesianIndex(1, 2)mimetext/plainrootassigneelast_run_timestampAkpersist_js_state·has_pluto_hook_features§cell_id$b1537ff0-1911-11eb-01c4-39237e7c8123depends_on_disabled_cells§runtime-published_object_keysdepends_on_skipped_cells§errored$0bba2172-1939-11eb-3822-95510610cd6fqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAi8persist_js_state·has_pluto_hook_features§cell_id$0bba2172-1939-11eb-3822-95510610cd6fdepends_on_disabled_cells§runtime 8published_object_keysdepends_on_skipped_cells§errored$8c63e460-1910-11eb-3a9f-cf493ae0a063queued¤logsrunning¦outputbody*is_behind (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8c63e460-1910-11eb-3a9f-cf493ae0a063depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8c7f3490-1910-11eb-3e86-d36bf13976d0queued¤logsrunning¦outputbody,draw_circle (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAkpersist_js_state·has_pluto_hook_features§cell_id$8c7f3490-1910-11eb-3e86-d36bf13976d0depends_on_disabled_cells§runtime Xpublished_object_keysdepends_on_skipped_cells§errored$8cf0e220-1910-11eb-1237-23da08615addqueued¤logsrunning¦outputbody*ray_trace (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8cf0e220-1910-11eb-1237-23da08615adddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8cb27992-1910-11eb-3602-1ba932c81088queued¤logsrunning¦outputbody.intersection (generic function with 2 methods)mimetext/plainrootassigneelast_run_timestampAհpersist_js_state·has_pluto_hook_features§cell_id$8cb27992-1910-11eb-3602-1ba932c81088depends_on_disabled_cells§runtime ӵpublished_object_keysdepends_on_skipped_cells§errored$8d079e70-1910-11eb-0f98-95762a22a7f2queued¤logsrunning¦outputbody(spheres (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8d079e70-1910-11eb-0f98-95762a22a7f2depends_on_disabled_cells§runtime epublished_object_keysdepends_on_skipped_cells§errored$8bc95210-1910-11eb-1617-6553c4a38187queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAdpersist_js_state·has_pluto_hook_features§cell_id$8bc95210-1910-11eb-1617-6553c4a38187depends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8c0b3d10-1910-11eb-26cc-234b48fb81b7queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampA	persist_js_state·has_pluto_hook_features§cell_id$8c0b3d10-1910-11eb-26cc-234b48fb81b7depends_on_disabled_cells§runtime Bpublished_object_keysdepends_on_skipped_cells§errored$8bec1c50-1910-11eb-2f63-9151c9c3cb3bqueued¤logsrunning¦outputbody%Lens (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAv@>persist_js_state·has_pluto_hook_features§cell_id$8bec1c50-1910-11eb-2f63-9151c9c3cb3bdepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8c99c170-1910-11eb-054a-1b007276a744queued¤logsrunning¦outputbody%step (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA`persist_js_state·has_pluto_hook_features§cell_id$8c99c170-1910-11eb-054a-1b007276a744depends_on_disabled_cells§runtime zopublished_object_keysdepends_on_skipped_cells§errored$8c45ae00-1910-11eb-2908-ede9e1c04a53queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampA[persist_js_state·has_pluto_hook_features§cell_id$8c45ae00-1910-11eb-2908-ede9e1c04a53depends_on_disabled_cells§runtime `̵published_object_keysdepends_on_skipped_cells§errored$210789e0-1912-11eb-11b6-bdb806bee14dqueued¤logsrunning¦outputbody.PNG

   IHDR      P      gAMA  a    cHRM  z&         u0  `  :  pQ<   bKGD     ."IDATxڵ}y5GYTu!d#	(Pс Y ѐP#"p2 
	D͗o_]3T]1S}yo> 
 


%"A]/$ yd-( !lULn([31C	h@\Xg4C#"U)_eq7B7( QydQj	1O$ DKVvEy_Q͜OiKn3ܚ+،AhTйjqReZ	*)ew5
($zie:E͡ov6꘨e2֠E6Gn7`փV%VIڇlmC
S[mbXSNi%zw[t[J[ٶ#E Օq0,%Uj%oB-ʢ)SX>"lWP5 MVQ5l&-]@*,43\WcL^U{`k[ !@6M6jay3Щ tm_e@bP>i3YYodkBFzB;ha*^)bGNjyaz& :S(!ZA<UscW"d@ע
(pPzPUZ®-67<oL;Ю>mZjM@!!`l9 k>ll0bR	\3grUizFAz7{X֩aJ["n՚=}Cu҄K8GUG/^4"Ibk
@?ZǢjT\Rդ kkm]P(OUw f+mc5ॽgW
ܯBϭLvM-^lTaæiN=BdW͚
CW!GW^*%AjNǰnRf2yoCRڪuWX2졅WөVDhw]谰m#A*5Smϧպl:<۳:	[]0SA`s}W-g*So: ?H`eVsgюY6:xtWf U>Bya'{;~(G`ȢiJ, l_kЇB+Ge2BY+IW!T-r!"%ic'dS2P-1jcVݽ|K;auqlʢ k{T|%DO83ibzYB)C-!1q1CyNhvRJQR+Wvd_Xڎ\[8v駮j-c05XKo-cq]ߡFWp+j/z۞s]|Fw)%rPPJ*$jԝw=鯏ײ*nVW	m
hguV^V&z[@9VYBIB<aKn^͘O<QtpL3̣
Qs(AUߨPÖ8#%٦_N#ob!˺&8 ̲l?f*ͯ*4HltmA6Dr1
gf5gݐܻb6OS!*@C椅NdTLԥYW[	m`lZO6{ !e4LjսY{1u'ǖ̖)s)?rȵ-VD̹T4o]8]ly&0l}Ys-M5 4ѯ:p.P
7P%<%49gxbhʜesUAW3?-8q"ι,fx>zmP:
k472ŅaB%XLOjpO%T~W8i3N#ň2Efk#9 (o_oɞf8U:Wu{bpUR!USKվ[VV_PDS234ZA+Ƥq.݅n)Xw\qsb|qPt	X(]w={(X(V -%5V89Z܅7W :.«'T?+Yox6(#:4BFQ`@   *TCjY5YE.Nh%_8#/VrCuQGV'7iKl&32C+`"U^g;}Pf7DvK[Z [ZM^Hg X79L(QB09QcD±8L>=7"kuOM69rBdY(bvɷ34\E3c7b:y1-DKFn.]6郿^ryax͌xF&#84QV!@"ddr9{ׯ[X5uhk,dq
t	;~we\Y@h0+QNgbfSǛ#{ӽxe;Axt"1[gL)QF*ATQ}ڌb%`)gw=JǗ'\~bEUU%UPQu Ρdĳ#@E݆+ ྗݨt*o2S]F Q ?
]F~<F4Lu ToHiR3r\? hA0LZjљT.W<h/oM<xFQQVtFL̒57ZQ##q$8LfoaAY'"=rbP W$52bđĉ-eK{?%c7f̌Mq9W!KXF jA"%&[{ͮ%#ZTPvaҰ~,.; ^;Ǽ#K+x'i99k5j=lX</0+{=İlev~K{M#;̘,0}KI:{!ؽlwa쪵+&Zv%kƎ9s4x	F˲o̝?O;;wNx.͘"J-e3CAgYtA1kAf-O{'ڊ@9h]6	6m}?$)GQb d@F$B$B@Ĝ/y E81?^0$b_c^>԰׀~Ħ
<|qsIF{	vX\!EH
- @K`ȌxtriTTA$W$.6)=NymMcKniuB2) TB?TT :<t|_wܒr0./]pxe+O8X+6k59?snbOPf5&3C}KdFScSc3a}Ϲ'+2phVmE(G6ll-ǖƱ,驓	sFd"FܷTnKXK|L[M#J-2K!ᒟH)2*0	<o|R	
^YBݵx3xS" " JUF"%-la[V~7SFc24cʘ`i~wN}yw)"$KgAEQQ)d 3`!4QPATQթHF.7I+^}_1mAF!8T <W	 xROZ'2uH*jDԝ:j1P4ֵ^ֽgxjlFFY< 1W9 	@ʿ)Pb+U 9s/cYxfko3zD[qi(A,眓;P  S0F{D)>lk!VUUQAGB*M_fQ쁱ݰ0aHRց*GxTTUs,P3Teno5.A:,0ڈD\~^zȣ#QH  _  n  UBib2U:<k~m}C޽=슨}RDKqihY"D z ʠ@ꀢ(e`f`7rk_̷*ܔSmKc ?	Ì!%pyWlyRĖ: Stݗ}dA/ ,gTd^bQ21QF1R*`U!'&mH[B	n21H|D3`>yriph	iD4"-!#R+2( PmD)dJS0r^|+UTH:E!o׀q&W>4("xO[AΞ44TϗBGk^f"XRKjQ-jjPA0XĂXpj4䧯rU=-˾C.ĠO=fJBK#(Q4hDvDf&AI$`FOHm6Q@4dG8c.biUaTdM>nVI`3YY΂P,z"i՘W՚zWQVԈQ:e.d+~eK`c!~P IqBu	-ȥP	 L 
5W=(ew/$%QEH "7M
:.ѩͫ
Xqx(7BT<odԹ'^bF=QPVVf :R'9S\58>!يMF,D$XVPx0ʡT"*!GV<L`sX
p̐bL>s+v[^%+&bDd!b|_9ڿj+w^{Vǖ
ӭˊo_OO(*!B2Z#U}P'f<B-Ch;t7t\]42.Wb׀
B 'v^rbU,dL垠*_w=\n%KތI9!}K|
dϘT|lϣͿ`%ʱ?`ҵыphm7)x#A9GbtMSf:.k<V`Go^F.Q
jQ(M?⾇
B|:6rRDo=<D,G>lϿ|tn^)Sgr=ɚ1OH+wY駿ȣh*)/)Z]9TAI 8$*jtĹO~&^߆)KT3[: #pԀ%KYt-BDUDEҟ|ph[U!;߿T?#zvhߜOi<ݜ|7rJKs4;51<Q!'H1R|L9GB[S	pBeF2: cHscKg[(|6xϋ|iXm^NENЬP>Oj]ܡy>"~>,@slTާ~hs8;` Pr)Ds8Iΐȇ&9Ǚht dDkf+;f %Sϣ8^ܘQ̳]R|'IU25^@bdUME4}`
NlhAgS$[LKt/r2Kϫ0; h#߳6;	)@ԼO7|x9Yh*<`i Haj)EDJ3w0>dp XCo, RSf3S:(Lu~ <#Ć#$ W̿,lXb9knmnؓB<QO펀  e6բ99g.1DK0ݝ rԼ"e]T4X[X
'X	rIڬ/@TN]6R!3\ajL,dTb=CXwGbo..hw2sH!"AR)oϱEx'iJ;@5h;Is<z{DJl®!wB_PRwOrvT&Ym;PHI
<YOi2,Tg^CXz'p	K~	7J147Z)0PWAUwP1Xk!*Fӟ}bUXFz켺D>L{;)&0UedkG>\NTHT8'Yn9ixy~ =Ho@dRhlT\( B<K{O)cNۧyUg[/:g2¦~Ar֦?zMU3ͱGN! 0Ͳdrl	x|X	͎ /??+[2=rŬ7篑$#~>RX|,5j¡，QZB~xéBm'>^[IA'~ A[YM2[%Q*&p|Co_:SIU2QTP>Lv ˲drb>9E	*R69	nݝ=U˟۾:کh-VO]܏onY4QU%kXL""&}~B1 (&e"$BjjP }Pz*n BQ@L`"#,(P_?r.ҝDԪ/xMBzс(D7Noc?R!)an]3709caG
~]}:eJPyh+AUĄp04\PLMn dzΉ8b[+KflUQH*Kco]kO",JDT@]m\.%XŨJzԇ\)(q0AD]WwV֏9@*D$$Bb"KphS#OX^9skaIvoWv8qXB%'Y2
*%X=rmXVXdF41fX67S!R%QEtvEpa-Zt 1Saˣ
N rQͭ$+a^4S3`*X%~J-xT&]!_@,'#~/
iqc\;ڀ}i:,V@D+l	sy+mETSZ|MQᣢtlܾh`#2:[L&--EQRUݽ1YWvYX2a,PE6Z}2=p<HOdgOmX\yb"CdG{Y/Ha4u	\'l\uoL)$$UrnZio݀P}/&?}efH&xlIV)*)&0!fٿ}X+ozUn+TԉeĿ;J"](*W| f)qz4d'\zqeXU`Ldc6LњxgoaB9pXj"e3[~KUd8e10XI7o\}VY:|7ԁ0JPNZ~WO*G%UnWAºjoZȖ#An$s^(x	mD($*VĨpaA>cB0C"l!lC=Ko#rۮb"C1K`.diYN["(9R);A䩠+DRb@bUcӟ)A͍KF&'.ZNM#,3N΃*;}uĺjӋ〆.xtdIFDEOcNP#u)dZUBC.W@
0C lxɹ9|̐)*D&d$lccw`^3 @uQhHH %-ĀYhdv=,]efV|j0ę
 ?~⎿2Af$o˔i?gF""͌d4Rd)h)µD/W7n	{ܣCb%"ER"'NFcȨ5bYYZZ3̚5kٴfÚs>E +a6ư1&Jl^[<E^vGJ"f"`Rj'f,b4lXeM4Q{i8l7m*~F{n5 Nb!BH#bDSbČ!k*x|og4KCwG>dȒ/ud U^fr<͌4fݚ֜5|w4/=﹇`cldDv;
|X p׾SH	'UeUK6bhGxy_A<xaP 
ÖU
f7<tdB9G"Bmt~!1(K,i̚,[e]o9򤻓lJ9q,"ao;|<UWѥjjA	UԩTmHv6 2®"DCd"5{;w=wH31CD/$E@(@D@~/Bd h,Q̜X^N}ћ|g=1P>W_ߎ~'tǪ]]+k,e.U"jb[h<}bK&&1/31>Wh#.IĊbQ0}#̾x-JƜ82 $IΜ=GO%Rl9)Ei5"})x33S31L9?VZ@Q##qdVZN
eZ!H0*LQ'JAUdqL<6jz=fϤɦ.J:ΣJΪ%5wDKqqDnLCw "2_6f-5bNF<ZKE7}Rf_S)odLx&&8mV!"hdx91;wF[jq &u_,k// x3meywR><2dĴb܅Qz˯m5^>Of2'("(TE"G_Ɵ*,P"9al|WGr^7(s߈Stfx&&SqZln0Kٱf7½2Ow\KiZTT(M_'%j7rL4&k~7O@ T}|oeTL+jē_WU`\z/6Sd)8J8Y6}ѻ>lQKWeV +)=4uS135ZQ+RZOv]1+Z/Дl[>2;>E&δlCZF6찚V6?tQRӪyR	»ir.'Y4u2Z-܎cZL+*k)'&^6}m5LԀ/R_yG-y(ݵhдodU}
P9	k#ٶ~Q@x?|A~/Hʽk~"	<y?ac&llREp	n7g1 ?(SbV*,2/31#?27Gibx2ny |Y)ofn8͜3
	ؚbq<2f~Gsv7P҅*HlӾJW35ѯZF|'eռs@hW&^UO{=z榎f2Q'[drB<6vGg{kGC2`:9cj4E +#ϴTh>i@ʡ^Wx |9oS)of2u~:QiZՠ."GGƬ>nuN!!\
TG\'|*Vc4d;ʴYBpUViR?*W6:򦓙Tʥ;Z`&KhG;vO"F1"誌A`pQTlk0ՐQW~\\nЏSx_?w|:Ӊxxˎ?~ʱ Q-/=S	=tY\bG3/R|Oۙh a1]m_2eW!nq*\_RqLjMhNwc{fVU=&g5骞tT^Qk)I%?U|n"Ul9 +WINe%}t3n^aW :`Uyh4*F5ТZ&<Ń.N
իLk`1]z0( 0fڭ!E!xLc<gauuP`Kn>{QUjn4HFC~j$|c4n_AWDoU{ZaK6ۮ#jߴ.0h68{X*[5pެzVh7`ϱGo~i=껧a4ؖ][tV0QW{:롫}N\3ǖje;=lnLun>
id akwmV` BV߾U%y˺xya;slH,a;]*>|AGzMS=n׳B <a$7zd݆Ædͦ	MtKVUq4sXqAhKYyg!@PEHbSox{)j0yMQϢK*

)Ryd1J0oOqveZ߿P@Y{(0P;-ڕ+mPG]UCOPE!z,Bճa>-k@a)
DN8кApSb$تN[-nSZbnX RNY[9> n4+3JCTo:FOmh7H؇/c7%p?8_C%BUaGu`{Hv"D[=DZw 2æv̦f߭y6`u0:z0cdڝp]T5_]aiԂN Z>V:    IENDB`mimeimage/pngrootassigneelast_run_timestampA*%persist_js_state·has_pluto_hook_features§cell_id$210789e0-1912-11eb-11b6-bdb806bee14ddepends_on_disabled_cells§runtime68published_object_keysdepends_on_skipped_cells§errored$8d20cbc0-1910-11eb-0d98-31a55e7becdequeued¤logsrunning¦outputbody%doit (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8d20cbc0-1910-11eb-0d98-31a55e7becdedepends_on_disabled_cells§runtime \Apublished_object_keysdepends_on_skipped_cells§errored$f4c96d10-190e-11eb-0e8e-11ded1c8830equeued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampA]+persist_js_state·has_pluto_hook_features§cell_id$f4c96d10-190e-11eb-0e8e-11ded1c8830edepends_on_disabled_cells§runtime #published_object_keysdepends_on_skipped_cells§errored$8c809420-1910-11eb-2f0d-e17ea7a04a51queued¤logsrunning¦outputbody*plot_rays (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAwpersist_js_state·has_pluto_hook_features§cell_id$8c809420-1910-11eb-2f0d-e17ea7a04a51depends_on_disabled_cells§runtime )ǵpublished_object_keysdepends_on_skipped_cells§errored$25ab9680-1912-11eb-0650-6361aaf781ecqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAi93fpersist_js_state·has_pluto_hook_features§cell_id$25ab9680-1912-11eb-0650-6361aaf781ecdepends_on_disabled_cells§runtime!lpublished_object_keysdepends_on_skipped_cells§errored$8c1d3e70-1910-11eb-10af-7dd208f70eddqueued¤logsrunning¦outputbody*inside_of (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampApersist_js_state·has_pluto_hook_features§cell_id$8c1d3e70-1910-11eb-10af-7dd208f70edddepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$8be2dea0-193e-11eb-0591-c3dcc4c84403queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAi9E԰persist_js_state·has_pluto_hook_features§cell_id$8be2dea0-193e-11eb-0591-c3dcc4c84403depends_on_disabled_cells§runtime bpublished_object_keysdepends_on_skipped_cells§errored$8cc03530-1910-11eb-107e-3db62b460115queued¤logsrunning¦outputbody*propagate (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampA^@:persist_js_state·has_pluto_hook_features§cell_id$8cc03530-1910-11eb-107e-3db62b460115depends_on_disabled_cells§runtimeČصpublished_object_keysdepends_on_skipped_cells§errored$8bc95210-1910-11eb-2af9-cb247912835aqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAcΰpersist_js_state·has_pluto_hook_features§cell_id$8bc95210-1910-11eb-2af9-cb247912835adepends_on_disabled_cells§runtime published_object_keysdepends_on_skipped_cells§errored$4417b3e0-190f-11eb-1efe-53d279a306e6queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampA[mpersist_js_state·has_pluto_hook_features§cell_id$4417b3e0-190f-11eb-1efe-53d279a306e6depends_on_disabled_cells§runtime ^published_object_keysdepends_on_skipped_cells§errored$853789be-1911-11eb-1121-679f89fe62dbqueued¤logsrunning¦outputbody<div class="markdown"><h1>0123456789 www</h1>
<p>Pluto notebook adaptation of https://github.com/leios/simuleios/tree/master/raytracing</p>
<p>See https://www.youtube.com/watch?v&#61;JwyQezsQkkw</p>
</div>mimetext/htmlrootassigneelast_run_timestampA[>persist_js_state÷has_pluto_hook_features§cell_id$853789be-1911-11eb-1121-679f89fe62dbdepends_on_disabled_cells§runtime Wzpublished_object_keysdepends_on_skipped_cells§errored$8bea95b0-1910-11eb-3850-9f624fa3e6c0queued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAfq2persist_js_state·has_pluto_hook_features§cell_id$8bea95b0-1910-11eb-3850-9f624fa3e6c0depends_on_disabled_cells§runtime 
published_object_keysdepends_on_skipped_cells§errored$88865f70-1939-11eb-2941-c538b8c9175bqueued¤logsrunning¦outputbodyn<bond def="T" unique_id="qdbK1I2tpFuS"><input 
type="range" 
min="1" 
step="1" 
max="200" 
value="1"

></bond>mimetext/htmlrootassigneelast_run_timestampADHpersist_js_state·has_pluto_hook_features§cell_id$88865f70-1939-11eb-2941-c538b8c9175bdepends_on_disabled_cells§runtimenpublished_object_keysdepends_on_skipped_cells§errored$8bdfe750-1910-11eb-1eb6-c9c61b3333cfqueued¤logsrunning¦outputbodymimetext/plainrootassigneelast_run_timestampAdhpersist_js_state·has_pluto_hook_features§cell_id$8bdfe750-1910-11eb-1eb6-c9c61b3333cfdepends_on_disabled_cells§runtime ҵpublished_object_keysdepends_on_skipped_cells§errored$8cf0e220-1910-11eb-0933-b168f7031f46queued¤logsrunning¦outputbody*init_rays (generic function with 1 method)mimetext/plainrootassigneelast_run_timestampAEpersist_js_state·has_pluto_hook_features§cell_id$8cf0e220-1910-11eb-0933-b168f7031f46depends_on_disabled_cells§runtime  ͵published_object_keysdepends_on_skipped_cells§errored±cell_dependencies 1$ca7d2270-193d-11eb-3dd6-e1f6d2678a21precedence_heuristic	cell_id$ca7d2270-193d-11eb-3dd6-e1f6d2678a21downstream_cells_maphighres$210789e0-1912-11eb-11b6-bdb806bee14dupstream_cells_mapCore@md_strBasePlutoRunner.create_bondPlutoRunnerCheckBoxCore.applicable@bindBase.getgetindex$8cc03530-1910-11eb-3404-15f5c8f69f8fprecedence_heuristic	cell_id$8cc03530-1910-11eb-3404-15f5c8f69f8fdownstream_cells_mappropagate$8cf0e220-1910-11eb-1237-23da08615addupstream_cells_map sumisapproxSphere$8bea95b0-1910-11eb-3850-9f624fa3e6c0!>RGBObject$8bdfe750-1910-11eb-1eb6-c9c61b3333cfislessprintlnintersection$8c99c170-1910-11eb-2e24-49ed98b4dd2c$8cb27992-1910-11eb-3602-1ba932c81088nothinglength<dotVectorrefract$8c36e0f0-1910-11eb-1a50-6526ea1a9663/^!=reflect$8c67b4f0-1910-11eb-0efe-5f123cc14d53Ray$8bc95210-1910-11eb-1617-6553c4a38187SkyBox$8c0b3d10-1910-11eb-26cc-234b48fb81b7==:Infzerossphere_normal_at$8c1acd70-1910-11eb-24e6-333b3aa1e91fMirror$8c45ae00-1910-11eb-0726-79ba8d8e8085pixel_color$8cd93b70-1910-11eb-050a-5713b545f28eisa+$45a028a0-190f-11eb-355d-ad3c55fb1e2fprecedence_heuristiccell_id$45a028a0-190f-11eb-355d-ad3c55fb1e2fdownstream_cells_mapTestupstream_cells_map$8c36e0f0-1910-11eb-1a50-6526ea1a9663precedence_heuristic	cell_id$8c36e0f0-1910-11eb-1a50-6526ea1a9663downstream_cells_maprefract$8cc03530-1910-11eb-3404-15f5c8f69f8fupstream_cells_mapSphere$8bea95b0-1910-11eb-3850-9f624fa3e6c0sqrt>islesssphere_normal_at$8c1acd70-1910-11eb-24e6-333b3aa1e91freflect!<dot-^+*Ray$8bc95210-1910-11eb-1617-6553c4a38187$8c67b4f0-1910-11eb-0efe-5f123cc14d53precedence_heuristic	cell_id$8c67b4f0-1910-11eb-0efe-5f123cc14d53downstream_cells_mapreflect$8cc03530-1910-11eb-3404-15f5c8f69f8fupstream_cells_mapdot-+*Ray$8bc95210-1910-11eb-1617-6553c4a38187$8cd93b70-1910-11eb-050a-5713b545f28eprecedence_heuristic	cell_id$8cd93b70-1910-11eb-050a-5713b545f28edownstream_cells_mappixel_color$8cc03530-1910-11eb-3404-15f5c8f69f8fupstream_cells_map<RGB->/isless+*println$8d1e5abe-1910-11eb-2a84-79f43f4a7e65precedence_heuristic	cell_id$8d1e5abe-1910-11eb-2a84-79f43f4a7e65downstream_cells_mapobjects$8d20cbc0-1910-11eb-0d98-31a55e7becdeupstream_cells_mapspheres$8d079e70-1910-11eb-0f98-95762a22a7f2vcatsky$8d079e70-1910-11eb-01df-e5817d349353$8e89388e-1914-11eb-0f2f-619c7fe79430precedence_heuristic	cell_id$8e89388e-1914-11eb-0f2f-619c7fe79430downstream_cells_mapupstream_cells_map$c1f06690-1914-11eb-2426-29e3027f4f32precedence_heuristic	cell_id$c1f06690-1914-11eb-2426-29e3027f4f32downstream_cells_mapupstream_cells_mapRGBRay$8bc95210-1910-11eb-1617-6553c4a38187intersection$8c99c170-1910-11eb-2e24-49ed98b4dd2c$8cb27992-1910-11eb-3602-1ba932c81088SkyBox$8c0b3d10-1910-11eb-26cc-234b48fb81b7$8c1acd70-1910-11eb-24e6-333b3aa1e91fprecedence_heuristic	cell_id$8c1acd70-1910-11eb-24e6-333b3aa1e91fdownstream_cells_mapsphere_normal_at$8c36e0f0-1910-11eb-1a50-6526ea1a9663$8cc03530-1910-11eb-3404-15f5c8f69f8fupstream_cells_map-normalize$8c99c170-1910-11eb-2e24-49ed98b4dd2cprecedence_heuristic	cell_id$8c99c170-1910-11eb-2e24-49ed98b4dd2cdownstream_cells_mapintersection$c1f06690-1914-11eb-2426-29e3027f4f32$8cc03530-1910-11eb-3404-15f5c8f69f8fupstream_cells_map minimumSphere$8bea95b0-1910-11eb-3850-9f624fa3e6c0sqrt>islessnothing<dot-/+Union*Ray$8bc95210-1910-11eb-1617-6553c4a38187SkyBox$8c0b3d10-1910-11eb-26cc-234b48fb81b7maximum$8989d43e-190e-11eb-3e48-7d10df903b5dprecedence_heuristiccell_id$8989d43e-190e-11eb-3e48-7d10df903b5ddownstream_cells_mapPkg$8989d43e-190e-11eb-3e48-7d10df903b5dImagesPlutoUIPlots$8c7f3490-1910-11eb-3e86-d36bf13976d0ThreadsXupstream_cells_mapPkg.addPkg$8989d43e-190e-11eb-3e48-7d10df903b5dPkg.activatePkg.PackageSpecmktempdir$8cd93b70-1910-11eb-39eb-a7dd6c180bcfprecedence_heuristic	cell_id$8cd93b70-1910-11eb-39eb-a7dd6c180bcfdownstream_cells_mapconvert_to_imgupstream_cells_maplength:RGBundefsavesizeRay$8bc95210-1910-11eb-1617-6553c4a38187Array$8c09b670-1910-11eb-378a-7b49a6e0e0faprecedence_heuristic	cell_id$8c09b670-1910-11eb-378a-7b49a6e0e0fadownstream_cells_mapColoredSphereupstream_cells_mapRGBSphere$8bea95b0-1910-11eb-3850-9f624fa3e6c0Surface$8bccfb90-1910-11eb-07e2-89c2354c0ec5RGBA$8d079e70-1910-11eb-01df-e5817d349353precedence_heuristic	cell_id$8d079e70-1910-11eb-01df-e5817d349353downstream_cells_mapsky$8d1e5abe-1910-11eb-2a84-79f43f4a7e65upstream_cells_mapSkyBox$8c0b3d10-1910-11eb-26cc-234b48fb81b7$8c29e89e-1910-11eb-0ab3-bd8039bb7f10precedence_heuristic	cell_id$8c29e89e-1910-11eb-0ab3-bd8039bb7f10downstream_cells_mapinside_ofupstream_cells_map<=-^+$8c45ae00-1910-11eb-0726-79ba8d8e8085precedence_heuristic	cell_id$8c45ae00-1910-11eb-0726-79ba8d8e8085downstream_cells_mapMirror$8c809420-1910-11eb-2f0d-e17ea7a04a51$8cc03530-1910-11eb-3404-15f5c8f69f8fupstream_cells_mapnewWall$8c45ae00-1910-11eb-2908-ede9e1c04a53Float64Vector$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5precedence_heuristic	cell_id$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5downstream_cells_mapupstream_cells_map$8bccfb90-1910-11eb-07e2-89c2354c0ec5precedence_heuristic	cell_id$8bccfb90-1910-11eb-07e2-89c2354c0ec5downstream_cells_mapSurface$8bea95b0-1910-11eb-3850-9f624fa3e6c0$8bec1c50-1910-11eb-2f63-9151c9c3cb3b$8bfbfad0-1910-11eb-1c82-17966c89f2b2$8c09b670-1910-11eb-378a-7b49a6e0e0faupstream_cells_mapnewisapproxerror!RGBA+Float64$0bc3e570-1939-11eb-1e86-e97a9b07ea7cprecedence_heuristic	cell_id$0bc3e570-1939-11eb-1e86-e97a9b07ea7cdownstream_cells_mapupstream_cells_mapt$b766c970-1910-11eb-1457-9f5986c4807fprecedence_heuristic	cell_id$b766c970-1910-11eb-1457-9f5986c4807fdownstream_cells_mapas_image$8d20cbc0-1910-11eb-0d98-31a55e7becdeupstream_cells_mapArrayRay$8bc95210-1910-11eb-1617-6553c4a38187$8bfbfad0-1910-11eb-1c82-17966c89f2b2precedence_heuristic	cell_id$8bfbfad0-1910-11eb-1c82-17966c89f2b2downstream_cells_mapReflectingSphere$8d079e70-1910-11eb-0f98-95762a22a7f2upstream_cells_mapSphere$8bea95b0-1910-11eb-3850-9f624fa3e6c0Surface$8bccfb90-1910-11eb-07e2-89c2354c0ec5RGBA$b1537ff0-1911-11eb-01c4-39237e7c8123precedence_heuristic	cell_id$b1537ff0-1911-11eb-01c4-39237e7c8123downstream_cells_mapupstream_cells_mapCartesianIndex$0bba2172-1939-11eb-3822-95510610cd6fprecedence_heuristic	cell_id$0bba2172-1939-11eb-3822-95510610cd6fdownstream_cells_mapupstream_cells_map$8c63e460-1910-11eb-3a9f-cf493ae0a063precedence_heuristic	cell_id$8c63e460-1910-11eb-3a9f-cf493ae0a063downstream_cells_mapis_behindupstream_cells_mapdot->=$8c7f3490-1910-11eb-3e86-d36bf13976d0precedence_heuristic	cell_id$8c7f3490-1910-11eb-3e86-d36bf13976d0downstream_cells_mapdraw_circle$8c809420-1910-11eb-2f0d-e17ea7a04a51upstream_cells_mapPlots.partialcirclePlots$8989d43e-190e-11eb-3e48-7d10df903b5d+*pi$8cf0e220-1910-11eb-1237-23da08615addprecedence_heuristic	cell_id$8cf0e220-1910-11eb-1237-23da08615adddownstream_cells_mapray_trace$8d20cbc0-1910-11eb-0d98-31a55e7becdeupstream_cells_mappropagate$8cc03530-1910-11eb-107e-3db62b460115$8cc03530-1910-11eb-3404-15f5c8f69f8fCamera$8bc95210-1910-11eb-2af9-cb247912835aObject$8bdfe750-1910-11eb-1eb6-c9c61b3333cfinit_rays$8cf0e220-1910-11eb-0933-b168f7031f46Vector$8cb27992-1910-11eb-3602-1ba932c81088precedence_heuristic	cell_id$8cb27992-1910-11eb-3602-1ba932c81088downstream_cells_mapintersection$c1f06690-1914-11eb-2426-29e3027f4f32$8cc03530-1910-11eb-3404-15f5c8f69f8fupstream_cells_map>islessnothing<dotWall$8c45ae00-1910-11eb-2908-ede9e1c04a53-isfinite/*!===NaNRay$8bc95210-1910-11eb-1617-6553c4a38187$8d079e70-1910-11eb-0f98-95762a22a7f2precedence_heuristic	cell_id$8d079e70-1910-11eb-0f98-95762a22a7f2downstream_cells_mapspheres$8d1e5abe-1910-11eb-2a84-79f43f4a7e65upstream_cells_map-/+*Lens$8bec1c50-1910-11eb-2f63-9151c9c3cb3bcospiReflectingSphere$8bfbfad0-1910-11eb-1c82-17966c89f2b2sin$8bc95210-1910-11eb-1617-6553c4a38187precedence_heuristic	cell_id$8bc95210-1910-11eb-1617-6553c4a38187downstream_cells_mapRay$8c1d3e70-1910-11eb-10af-7dd208f70edd$8c36e0f0-1910-11eb-1a50-6526ea1a9663$8c67b4f0-1910-11eb-0efe-5f123cc14d53$8c99c170-1910-11eb-054a-1b007276a744$c1f06690-1914-11eb-2426-29e3027f4f32$8c99c170-1910-11eb-2e24-49ed98b4dd2c$8cb27992-1910-11eb-3602-1ba932c81088$8cc03530-1910-11eb-107e-3db62b460115$8cc03530-1910-11eb-3404-15f5c8f69f8f$8cd93b70-1910-11eb-39eb-a7dd6c180bcf$8cf0e220-1910-11eb-0933-b168f7031f46$b766c970-1910-11eb-1457-9f5986c4807fupstream_cells_mapRGBFloat64Vector$8c0b3d10-1910-11eb-26cc-234b48fb81b7precedence_heuristic	cell_id$8c0b3d10-1910-11eb-26cc-234b48fb81b7downstream_cells_mapSkyBox$c1f06690-1914-11eb-2426-29e3027f4f32$8c99c170-1910-11eb-2e24-49ed98b4dd2c$8cc03530-1910-11eb-3404-15f5c8f69f8f$8d079e70-1910-11eb-01df-e5817d349353upstream_cells_mapObject$8bdfe750-1910-11eb-1eb6-c9c61b3333cfFloat64Vector$8bec1c50-1910-11eb-2f63-9151c9c3cb3bprecedence_heuristic	cell_id$8bec1c50-1910-11eb-2f63-9151c9c3cb3bdownstream_cells_mapLens$8d079e70-1910-11eb-0f98-95762a22a7f2upstream_cells_mapSphere$8bea95b0-1910-11eb-3850-9f624fa3e6c0Surface$8bccfb90-1910-11eb-07e2-89c2354c0ec5RGBA$8c99c170-1910-11eb-054a-1b007276a744precedence_heuristic	cell_id$8c99c170-1910-11eb-054a-1b007276a744downstream_cells_mapstepupstream_cells_map+*Ray$8bc95210-1910-11eb-1617-6553c4a38187$8c45ae00-1910-11eb-2908-ede9e1c04a53precedence_heuristic	cell_id$8c45ae00-1910-11eb-2908-ede9e1c04a53downstream_cells_mapWall$8c45ae00-1910-11eb-0726-79ba8d8e8085$8cb27992-1910-11eb-3602-1ba932c81088upstream_cells_mapObject$8bdfe750-1910-11eb-1eb6-c9c61b3333cf$210789e0-1912-11eb-11b6-bdb806bee14dprecedence_heuristic	cell_id$210789e0-1912-11eb-11b6-bdb806bee14ddownstream_cells_mapupstream_cells_mapdoit$8d20cbc0-1910-11eb-0d98-31a55e7becdeT$88865f70-1939-11eb-2941-c538b8c9175bhighres$ca7d2270-193d-11eb-3dd6-e1f6d2678a21$8d20cbc0-1910-11eb-0d98-31a55e7becdeprecedence_heuristic	cell_id$8d20cbc0-1910-11eb-0d98-31a55e7becdedownstream_cells_mapdoit$210789e0-1912-11eb-11b6-bdb806bee14dupstream_cells_map:transposeRGBobjects$8d1e5abe-1910-11eb-2a84-79f43f4a7e65Camera$8bc95210-1910-11eb-2af9-cb247912835a|>repeat/as_image$b766c970-1910-11eb-1457-9f5986c4807fundefArrayray_trace$8cf0e220-1910-11eb-1237-23da08615add$f4c96d10-190e-11eb-0e8e-11ded1c8830eprecedence_heuristic	cell_id$f4c96d10-190e-11eb-0e8e-11ded1c8830edownstream_cells_mapBase.isapproxupstream_cells_mapBaseNothing$8c809420-1910-11eb-2f0d-e17ea7a04a51precedence_heuristic	cell_id$8c809420-1910-11eb-2f0d-e17ea7a04a51downstream_cells_mapplot_raysupstream_cells_map:Sphere$8bea95b0-1910-11eb-3850-9f624fa3e6c0Object$8bdfe750-1910-11eb-1eb6-c9c61b3333cftypeofzerossizedraw_circle$8c7f3490-1910-11eb-3e86-d36bf13976d0Mirror$8c45ae00-1910-11eb-0726-79ba8d8e8085Vector-plotplot!+*==$25ab9680-1912-11eb-0650-6361aaf781ecprecedence_heuristic	cell_id$25ab9680-1912-11eb-0650-6361aaf781ecdownstream_cells_mapupstream_cells_map$8c1d3e70-1910-11eb-10af-7dd208f70eddprecedence_heuristic	cell_id$8c1d3e70-1910-11eb-10af-7dd208f70edddownstream_cells_mapinside_ofupstream_cells_mapRay$8bc95210-1910-11eb-1617-6553c4a38187$8be2dea0-193e-11eb-0591-c3dcc4c84403precedence_heuristic	cell_id$8be2dea0-193e-11eb-0591-c3dcc4c84403downstream_cells_mapupstream_cells_map$8cc03530-1910-11eb-107e-3db62b460115precedence_heuristic	cell_id$8cc03530-1910-11eb-107e-3db62b460115downstream_cells_mappropagate$8cf0e220-1910-11eb-1237-23da08615addupstream_cells_map Base.Threads.*popObject$8bdfe750-1910-11eb-1eb6-c9c61b3333cfThreads.@threadsBase.Threads.-VectorlengthBase.Threads.+Base.Threads.>Ray$8bc95210-1910-11eb-1617-6553c4a38187Base.Threads.!=:Base.Threads.threading_runBase.Threads.Base.invokelatestBase.Threads.nthreadsBase.Threads.threadidBase.Threads.divremBaseBase.Threads.firstindexBase.Threads.lengthArrayBase.Threads.:Base.Threads.<=Base.Threads.==ccall$8bc95210-1910-11eb-2af9-cb247912835aprecedence_heuristic	cell_id$8bc95210-1910-11eb-2af9-cb247912835adownstream_cells_mapCamera$8cf0e220-1910-11eb-0933-b168f7031f46$8cf0e220-1910-11eb-1237-23da08615add$8d20cbc0-1910-11eb-0d98-31a55e7becdeupstream_cells_mapFloat64Vector$4417b3e0-190f-11eb-1efe-53d279a306e6precedence_heuristiccell_id$4417b3e0-190f-11eb-1efe-53d279a306e6downstream_cells_mapLinearAlgebraupstream_cells_map$853789be-1911-11eb-1121-679f89fe62dbprecedence_heuristic	cell_id$853789be-1911-11eb-1121-679f89fe62dbdownstream_cells_mapupstream_cells_map@md_strgetindex$8bea95b0-1910-11eb-3850-9f624fa3e6c0precedence_heuristic	cell_id$8bea95b0-1910-11eb-3850-9f624fa3e6c0downstream_cells_mapSphere$8bec1c50-1910-11eb-2f63-9151c9c3cb3b$8bfbfad0-1910-11eb-1c82-17966c89f2b2$8c09b670-1910-11eb-378a-7b49a6e0e0fa$8c36e0f0-1910-11eb-1a50-6526ea1a9663$8c809420-1910-11eb-2f0d-e17ea7a04a51$8c99c170-1910-11eb-2e24-49ed98b4dd2c$8cc03530-1910-11eb-3404-15f5c8f69f8fupstream_cells_mapSurface$8bccfb90-1910-11eb-07e2-89c2354c0ec5Object$8bdfe750-1910-11eb-1eb6-c9c61b3333cfFloat64Vector$88865f70-1939-11eb-2941-c538b8c9175bprecedence_heuristic	cell_id$88865f70-1939-11eb-2941-c538b8c9175bdownstream_cells_mapT$210789e0-1912-11eb-11b6-bdb806bee14dupstream_cells_mapCoreBase:PlutoRunner.create_bondPlutoRunnerCore.applicable@bindBase.getSlider$8bdfe750-1910-11eb-1eb6-c9c61b3333cfprecedence_heuristic	cell_id$8bdfe750-1910-11eb-1eb6-c9c61b3333cfdownstream_cells_mapObject$8bea95b0-1910-11eb-3850-9f624fa3e6c0$8c0b3d10-1910-11eb-26cc-234b48fb81b7$8c45ae00-1910-11eb-2908-ede9e1c04a53$8c809420-1910-11eb-2f0d-e17ea7a04a51$8cc03530-1910-11eb-107e-3db62b460115$8cc03530-1910-11eb-3404-15f5c8f69f8f$8cf0e220-1910-11eb-1237-23da08615addupstream_cells_map$8cf0e220-1910-11eb-0933-b168f7031f46precedence_heuristic	cell_id$8cf0e220-1910-11eb-0933-b168f7031f46downstream_cells_mapinit_rays$8cf0e220-1910-11eb-1237-23da08615addupstream_cells_mapCartesianIndicesRGBnormalizeCamera$8bc95210-1910-11eb-2af9-cb247912835asizemap-/+*Ray$8bc95210-1910-11eb-1617-6553c4a38187cell_execution_order 1$8989d43e-190e-11eb-3e48-7d10df903b5d$4417b3e0-190f-11eb-1efe-53d279a306e6$45a028a0-190f-11eb-355d-ad3c55fb1e2f$853789be-1911-11eb-1121-679f89fe62db$f4c96d10-190e-11eb-0e8e-11ded1c8830e$8bc95210-1910-11eb-2af9-cb247912835a$8bc95210-1910-11eb-1617-6553c4a38187$8bccfb90-1910-11eb-07e2-89c2354c0ec5$8bdfe750-1910-11eb-1eb6-c9c61b3333cf$8bea95b0-1910-11eb-3850-9f624fa3e6c0$8bec1c50-1910-11eb-2f63-9151c9c3cb3b$8bfbfad0-1910-11eb-1c82-17966c89f2b2$8c09b670-1910-11eb-378a-7b49a6e0e0fa$8c0b3d10-1910-11eb-26cc-234b48fb81b7$8c1acd70-1910-11eb-24e6-333b3aa1e91f$8c1d3e70-1910-11eb-10af-7dd208f70edd$8c29e89e-1910-11eb-0ab3-bd8039bb7f10$8c36e0f0-1910-11eb-1a50-6526ea1a9663$8c45ae00-1910-11eb-2908-ede9e1c04a53$8c45ae00-1910-11eb-0726-79ba8d8e8085$8c63e460-1910-11eb-3a9f-cf493ae0a063$8c67b4f0-1910-11eb-0efe-5f123cc14d53$8c7f3490-1910-11eb-3e86-d36bf13976d0$8c809420-1910-11eb-2f0d-e17ea7a04a51$8c99c170-1910-11eb-054a-1b007276a744$8e89388e-1914-11eb-0f2f-619c7fe79430$8c99c170-1910-11eb-2e24-49ed98b4dd2c$8cb27992-1910-11eb-3602-1ba932c81088$c1f06690-1914-11eb-2426-29e3027f4f32$8cc03530-1910-11eb-107e-3db62b460115$8cd93b70-1910-11eb-050a-5713b545f28e$8cc03530-1910-11eb-3404-15f5c8f69f8f$8cd93b70-1910-11eb-39eb-a7dd6c180bcf$b1537ff0-1911-11eb-01c4-39237e7c8123$8cf0e220-1910-11eb-0933-b168f7031f46$8cf0e220-1910-11eb-1237-23da08615add$b766c970-1910-11eb-1457-9f5986c4807f$8d079e70-1910-11eb-01df-e5817d349353$0bc3e570-1939-11eb-1e86-e97a9b07ea7c$0bba2172-1939-11eb-3822-95510610cd6f$8d079e70-1910-11eb-0f98-95762a22a7f2$8d1e5abe-1910-11eb-2a84-79f43f4a7e65$8d20cbc0-1910-11eb-0d98-31a55e7becde$88865f70-1939-11eb-2941-c538b8c9175b$ca7d2270-193d-11eb-3dd6-e1f6d2678a21$210789e0-1912-11eb-11b6-bdb806bee14d$25ab9680-1912-11eb-0650-6361aaf781ec$8be2dea0-193e-11eb-0591-c3dcc4c84403$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5last_hot_reload_time        shortpathraytracing_3d.jlprocess_statusreadypathF/home/runner/work/disorganised-mess/disorganised-mess/raytracing_3d.jlpluto_versionv0.19.47last_save_timeAi4cell_order 1$853789be-1911-11eb-1121-679f89fe62db$8989d43e-190e-11eb-3e48-7d10df903b5d$4417b3e0-190f-11eb-1efe-53d279a306e6$45a028a0-190f-11eb-355d-ad3c55fb1e2f$f4c96d10-190e-11eb-0e8e-11ded1c8830e$8bc95210-1910-11eb-2af9-cb247912835a$8bc95210-1910-11eb-1617-6553c4a38187$8bccfb90-1910-11eb-07e2-89c2354c0ec5$8bdfe750-1910-11eb-1eb6-c9c61b3333cf$8bea95b0-1910-11eb-3850-9f624fa3e6c0$8bec1c50-1910-11eb-2f63-9151c9c3cb3b$8bfbfad0-1910-11eb-1c82-17966c89f2b2$8c09b670-1910-11eb-378a-7b49a6e0e0fa$8c0b3d10-1910-11eb-26cc-234b48fb81b7$8c1acd70-1910-11eb-24e6-333b3aa1e91f$8c1d3e70-1910-11eb-10af-7dd208f70edd$8c29e89e-1910-11eb-0ab3-bd8039bb7f10$8c36e0f0-1910-11eb-1a50-6526ea1a9663$8c45ae00-1910-11eb-2908-ede9e1c04a53$8c45ae00-1910-11eb-0726-79ba8d8e8085$8c63e460-1910-11eb-3a9f-cf493ae0a063$8c67b4f0-1910-11eb-0efe-5f123cc14d53$8c7f3490-1910-11eb-3e86-d36bf13976d0$8c809420-1910-11eb-2f0d-e17ea7a04a51$8c99c170-1910-11eb-054a-1b007276a744$c1f06690-1914-11eb-2426-29e3027f4f32$8e89388e-1914-11eb-0f2f-619c7fe79430$8c99c170-1910-11eb-2e24-49ed98b4dd2c$8cb27992-1910-11eb-3602-1ba932c81088$8cc03530-1910-11eb-107e-3db62b460115$8cc03530-1910-11eb-3404-15f5c8f69f8f$8cd93b70-1910-11eb-050a-5713b545f28e$8cd93b70-1910-11eb-39eb-a7dd6c180bcf$b1537ff0-1911-11eb-01c4-39237e7c8123$8cf0e220-1910-11eb-0933-b168f7031f46$8cf0e220-1910-11eb-1237-23da08615add$b766c970-1910-11eb-1457-9f5986c4807f$8d079e70-1910-11eb-01df-e5817d349353$8d1e5abe-1910-11eb-2a84-79f43f4a7e65$0bc3e570-1939-11eb-1e86-e97a9b07ea7c$0bba2172-1939-11eb-3822-95510610cd6f$8d079e70-1910-11eb-0f98-95762a22a7f2$8d20cbc0-1910-11eb-0d98-31a55e7becde$88865f70-1939-11eb-2941-c538b8c9175b$ca7d2270-193d-11eb-3dd6-e1f6d2678a21$210789e0-1912-11eb-11b6-bdb806bee14d$25ab9680-1912-11eb-0650-6361aaf781ec$8be2dea0-193e-11eb-0591-c3dcc4c84403$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5published_objectsnbpkginstall_time_nsinstantiatedòinstalled_versionsterminal_outputsenabled·restart_recommended_msgrestart_required_msgbusy_packageswaiting_for_permission,waiting_for_permission_but_probably_disabled«cell_inputs 1$ca7d2270-193d-11eb-3dd6-e1f6d2678a21cell_id$ca7d2270-193d-11eb-3dd6-e1f6d2678a21code>let
	# T
	md"High resolution: $(@bind highres CheckBox())"
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8cc03530-1910-11eb-3404-15f5c8f69f8fcell_id$8cc03530-1910-11eb-3404-15f5c8f69f8fcode3function propagate(ray::Ray, objects::Vector{O},
                   num_intersections) where {O <: Object}

    for i = 1:num_intersections
        if ray.v != zeros(length(ray.v))
            intersect_final = [Inf, Inf]
            intersected_object = nothing
			
			
            for object in objects
                intersect = intersection(ray, object)
                if intersect != nothing &&
                   sum(intersect[:].^2) < sum(intersect_final[:].^2)
                    intersect_final = intersect
                    intersected_object = object
                end
            end

            if intersected_object != nothing
                ray.p .+= intersect_final
				
                if intersected_object isa Sphere
                    if !isapprox(intersected_object.s.t, 0)
                        ior = 1/intersected_object.s.ior
                        if dot(ray.v,
                               sphere_normal_at(ray,
                                                intersected_object)) > 0
                            ior = intersected_object.s.ior
                        end

                        ray = refract(ray, intersected_object, ior)
                    elseif !isapprox(intersected_object.s.r, 0)
                        n = sphere_normal_at(ray, intersected_object)
                        ray = reflect(ray, n)
                    elseif !isapprox(intersected_object.s.c.alpha, 0)
                        ray_color = RGB(intersected_object.s.c)
                        ray_vel = zeros(length(ray.v))
                        ray = Ray(ray_vel, ray.p, ray_color)
                    end

                elseif intersected_object isa Mirror
                    ray = reflect(ray, intersected_object.n)
				
                elseif intersected_object isa SkyBox
                    ray_color = pixel_color(ray.p)
                    ray_vel = zeros(length(ray.v))
                    ray = Ray(ray_vel, ray.p, ray_color)
                end
            else
                println("hit nothing")
            end
        end
    end

    return ray
endmetadatashow_logsèdisabled®skip_as_script«code_folded$45a028a0-190f-11eb-355d-ad3c55fb1e2fcell_id$45a028a0-190f-11eb-355d-ad3c55fb1e2fcodeusing Testmetadatashow_logsèdisabled®skip_as_script«code_folded$8c36e0f0-1910-11eb-1a50-6526ea1a9663cell_id$8c36e0f0-1910-11eb-1a50-6526ea1a9663codeAfunction refract(ray, lens::Sphere, ior)
	# note: light moves at a particular speed with respect to the medium it is
	#       moving through, so...
	#       n_2*v = n_1*l + (n_1*cos(theta_1) - n_2*cos(theta_2))*n
	#       Other approximations: ior = n_1/n_2, c = -n*l
	
    n = sphere_normal_at(ray, lens)

    if dot(n, ray.v) > 0
        n .*= -1
    end
    c = dot(-n, ray.v);
    d = 1.0 - ior^2 * (1.0 - c^2);

    if (d < 0.0)
        reflect!(ray, n)
        return
    end

    ray_vel = ior * ray.v + (ior * c - sqrt(d)) * n;
    return Ray(ray_vel, ray.p, ray.c)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8c67b4f0-1910-11eb-0efe-5f123cc14d53cell_id$8c67b4f0-1910-11eb-0efe-5f123cc14d53code,# note: for reflection, l_x -> l_x, but l_y -> -l_y
#       In this case, the y component of l = cos(theta)*n
#       so new vector: v = l + 2cos(theta)*n
function reflect(ray, n)
    ray_vel = ray.v .- 2*dot(ray.v, n).*n
    ray_pos = ray.p .+ 0.001*ray.v
    return Ray(ray_vel, ray_pos, ray.c)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8cd93b70-1910-11eb-050a-5713b545f28ecell_id$8cd93b70-1910-11eb-050a-5713b545f28ecode-function pixel_color(position)
    extents = 1000.0
    c = RGB(0)
    if position[1] < extents && position[1] > -extents
        c += RGB((position[1]+extents)/(2.0*extents), 0, 0)
    else
        println(position)
    end

    if position[2] < extents && position[2] > -extents
        c += RGB(0,0,(position[2]+extents)/(2.0*extents))
    else
        println(position)
    end

    if position[3] < extents && position[3] > -extents
        c += RGB(0,(position[3]+extents)/(2.0*extents), 0)
    else
        println(position)
    end

    return c
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8d1e5abe-1910-11eb-2a84-79f43f4a7e65cell_id$8d1e5abe-1910-11eb-2a84-79f43f4a7e65code"objects(t) = vcat(sky, spheres(t))metadatashow_logsèdisabled®skip_as_script«code_folded$8e89388e-1914-11eb-0f2f-619c7fe79430cell_id$8e89388e-1914-11eb-0f2f-619c7fe79430codel# begin
# 	function intersection(ray::Ray, skybox::SkyBox;
# 						  threshold = 0.01)

# 		return skybox.r * ray.v
# 	end
	
# 	function intersection(ray::Ray, sphere::Sphere;
# 						  threshold = 0.01)
# 		relative_dist = ray.p-sphere.p

# 		a = dot(ray.v, ray.v)
# 		b = 2.0 * dot(relative_dist, ray.v)
# 		c = dot(relative_dist, relative_dist) - sphere.r*sphere.r
# 		discriminant = b*b - 4*a*c

# 		if discriminant < 0
# 			return nothing
# 		elseif discriminant > 0
# 			roots = [(-b + sqrt(discriminant)) / (2*a),
# 					 (-b - sqrt(discriminant)) / (2*a)]
# 			min = minimum(roots)
# 			max = maximum(roots)

# 			if min > threshold
# 				return (min)*ray.v
# 			elseif max > threshold
# 				return (max)*ray.v
# 			else
# 				return nothing
# 			end
# 		else
# 			# Returns nothing if tangential
# 			return nothing
# 			#return (-b/(2*a))*ray.v
# 		end 
# 	end
# endmetadatashow_logsèdisabled®skip_as_script«code_folded$c1f06690-1914-11eb-2426-29e3027f4f32cell_id$c1f06690-1914-11eb-2426-29e3027f4f32code]intersection(
	Ray([1.0, 0.0, 0.0], [0.0, 0.0, 0.0], RGB(0,0,0)),
	SkyBox([2.0,0,0], 10000)
)metadatashow_logsèdisabled®skip_as_script«code_folded$8c1acd70-1910-11eb-24e6-333b3aa1e91fcell_id$8c1acd70-1910-11eb-24e6-333b3aa1e91fcode]function sphere_normal_at(ray, sphere)
    n = normalize(ray.p .- sphere.p)

    return n
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8c99c170-1910-11eb-2e24-49ed98b4dd2ccell_id$8c99c170-1910-11eb-2e24-49ed98b4dd2ccodebfunction intersection(ray::Ray, sphere::S;
                      threshold = 0.01) where
                      {S <: Union{Sphere, SkyBox}}
    relative_dist = ray.p-sphere.p
	
    a = dot(ray.v, ray.v)
    b = 2.0 * dot(relative_dist, ray.v)
    c = dot(relative_dist, relative_dist) - sphere.r*sphere.r
    discriminant = b*b - 4*a*c

    if discriminant < 0
        return nothing
    elseif discriminant > 0
        roots = [(-b + sqrt(discriminant)) / (2*a),
                 (-b - sqrt(discriminant)) / (2*a)]
        min = minimum(roots)
        max = maximum(roots)
		
        if min > threshold
            return (min)*ray.v
        elseif max > threshold
            return (max)*ray.v
        else
            return nothing
        end
    else
        # Returns nothing if tangential
        return nothing
        #return (-b/(2*a))*ray.v
    end 
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8989d43e-190e-11eb-3e48-7d10df903b5dcell_id$8989d43e-190e-11eb-3e48-7d10df903b5dcodecbegin
	import Pkg
	Pkg.activate(mktempdir())
	Pkg.add([
			Pkg.PackageSpec(name="Plots", version="1"),
			Pkg.PackageSpec(name="Images", version="0.23"),
			Pkg.PackageSpec(name="ImageMagick"),
			Pkg.PackageSpec(name="PlutoUI", version="0.6.8-0.6"),
			Pkg.PackageSpec(name="ThreadsX"),
			])
	using Images
	using Plots
	using PlutoUI
	using ThreadsX
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8cd93b70-1910-11eb-39eb-a7dd6c180bcfcell_id$8cd93b70-1910-11eb-39eb-a7dd6c180bcfcodefunction convert_to_img(rays::Array{Ray}, filename)
    color_array = Array{RGB}(undef, size(rays)[2], size(rays)[1])
    for i = 1:length(color_array)
         color_array[i] = rays[i].c
    end

    save(filename, color_array)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8c09b670-1910-11eb-378a-7b49a6e0e0facell_id$8c09b670-1910-11eb-378a-7b49a6e0e0facodeYfunction ColoredSphere(p, r, c::RGB)
    return Sphere(p, r, Surface(0,0,RGBA(c), 0))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8d079e70-1910-11eb-01df-e5817d349353cell_id$8d079e70-1910-11eb-01df-e5817d349353code%sky = [SkyBox([0.0, 0.0, 0.0], 1000)]metadatashow_logsèdisabled®skip_as_script«code_folded$8c29e89e-1910-11eb-0ab3-bd8039bb7f10cell_id$8c29e89e-1910-11eb-0ab3-bd8039bb7f10codeٸfunction inside_of(pos, sphere)
    x = sphere.p[1] - pos[1]
    y = sphere.p[2] - pos[2]
    if (x^2 + y^2 <= sphere.r^2)
        return true
    else
        return false
    end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8c45ae00-1910-11eb-0726-79ba8d8e8085cell_id$8c45ae00-1910-11eb-0726-79ba8d8e8085codemutable struct Mirror <: Wall
    # Normal vector
    n::Vector{Float64}

    # Position of mirror
    p::Vector{Float64}

    # Mirror size
    scale::Float64

    Mirror(in_n, in_p) = new(in_n, in_p, 2.5)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5cell_id$8b77c0c0-193e-11eb-1ba8-d99a89ab1cc5codemetadatashow_logsèdisabled®skip_as_script«code_folded$8bccfb90-1910-11eb-07e2-89c2354c0ec5cell_id$8bccfb90-1910-11eb-07e2-89c2354c0ec5codestruct Surface

    # Reflectivity
    r::Float64

    # Transmission
    t::Float64

    # Color
    c::RGBA

    # index of refraction
    ior::Float64

    function Surface(in_r, in_t, in_c, in_ior)
        if !isapprox(in_r+in_t+in_c.alpha, 1)
            error("invalid surface definition, RTC < 1")
        end
        new(in_r,in_t,in_c, in_ior)
    end

    Surface(in_r, in_t, in_c::Float64, in_ior) =
         new(in_r, in_t, RGBA(0,0,0,0), in_ior)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$0bc3e570-1939-11eb-1e86-e97a9b07ea7ccell_id$0bc3e570-1939-11eb-1e86-e97a9b07ea7ccodetmetadatashow_logsèdisabled®skip_as_script«code_folded$b766c970-1910-11eb-1457-9f5986c4807fcell_id$b766c970-1910-11eb-1457-9f5986c4807fcode<function as_image(rays::Array{Ray})
	[r.c for r in rays]
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8bfbfad0-1910-11eb-1c82-17966c89f2b2cell_id$8bfbfad0-1910-11eb-1c82-17966c89f2b2codeWfunction ReflectingSphere(p, r)
    return Sphere(p,r,Surface(1,0,RGBA(0,0,0,0),0))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$b1537ff0-1911-11eb-01c4-39237e7c8123cell_id$b1537ff0-1911-11eb-01c4-39237e7c8123codeCartesianIndex(1,2)metadatashow_logsèdisabled®skip_as_script«code_folded$0bba2172-1939-11eb-3822-95510610cd6fcell_id$0bba2172-1939-11eb-3822-95510610cd6fcodemetadatashow_logsèdisabled®skip_as_script«code_folded$8c63e460-1910-11eb-3a9f-cf493ae0a063cell_id$8c63e460-1910-11eb-3a9f-cf493ae0a063codeوfunction is_behind(ray, mirror)
    if dot(ray.p.-mirror.p, mirror.n) >= 0
        return true
    else
        return false
    end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8c7f3490-1910-11eb-3e86-d36bf13976d0cell_id$8c7f3490-1910-11eb-3e86-d36bf13976d0codeofunction draw_circle(p, r, res)
    return [x .+ (p[1], p[2]) for x in Plots.partialcircle(0, 2pi, res, r)]
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8cf0e220-1910-11eb-1237-23da08615addcell_id$8cf0e220-1910-11eb-1237-23da08615addcodefunction ray_trace(objects::Vector{O}, cam::Camera; filename="check.png",
                   num_intersections = 10) where {O <: Object}

    rays = init_rays(cam)

    rays = propagate(rays, objects, num_intersections)

    # convert_to_img(rays, filename)

    return rays
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8cb27992-1910-11eb-3602-1ba932c81088cell_id$8cb27992-1910-11eb-3602-1ba932c81088code-function intersection(ray::Ray, wall::W) where {W <: Wall}
    intersection_pt = -dot((ray.p .- wall.p),wall.n)/dot(ray.v, wall.n)

    if isfinite(intersection_pt) && intersection_pt > 0 &&
       intersection_pt != NaN
        return intersection_pt*ray.v
    else
        return nothing
    end
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8d079e70-1910-11eb-0f98-95762a22a7f2cell_id$8d079e70-1910-11eb-0f98-95762a22a7f2codespheres(t) = [
	ReflectingSphere([0,0,-25], 10),
	# ColoredSphere([0,0,-25], 5, RGB(0.75, .65, 0.1)),
	# ReflectingSphere([50 * sin(t), 0, 50 * cos(t) - 25], 15),
	Lens([50 * sin(t), 0, 50 * cos(t) - 25], 15, 1.5),
	Lens([-50 * sin(t), 0, -50*cos(t) - 25], 15, 1.5),
	Lens([-50 * sin(t + 2pi/3), 0, -50*cos(t + 2pi/3) - 25], 15, 1.5),
	Lens([-50 * sin(t + 4pi/3), 0, -50*cos(t + 4pi/3) - 25], 15, 1.5),
]metadatashow_logsèdisabled®skip_as_script«code_folded$8bc95210-1910-11eb-1617-6553c4a38187cell_id$8bc95210-1910-11eb-1617-6553c4a38187codeفstruct Ray
    # Velocity vector
    v::Vector{Float64}

    # Position vector
    p::Vector{Float64}

    # Color
    c::RGB
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8c0b3d10-1910-11eb-26cc-234b48fb81b7cell_id$8c0b3d10-1910-11eb-26cc-234b48fb81b7codetmutable struct SkyBox <: Object
    # Skybox position
    p::Vector{Float64}

    # Skybox radius
    r::Float64
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8bec1c50-1910-11eb-2f63-9151c9c3cb3bcell_id$8bec1c50-1910-11eb-2f63-9151c9c3cb3bcodeTfunction Lens(p, r, ior)
    return Sphere(p, r, Surface(0,1,RGBA(0,0,0,0),ior))
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8c99c170-1910-11eb-054a-1b007276a744cell_id$8c99c170-1910-11eb-054a-1b007276a744codeIfunction step(ray::Ray, dt)
    ray.p .+= .+ ray.v.*dt
    return ray
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8c45ae00-1910-11eb-2908-ede9e1c04a53cell_id$8c45ae00-1910-11eb-2908-ede9e1c04a53code!abstract type Wall <: Object end;metadatashow_logsèdisabled®skip_as_script«code_folded$210789e0-1912-11eb-11b6-bdb806bee14dcell_id$210789e0-1912-11eb-11b6-bdb806bee14dcodedoit(T, highres)metadatashow_logsèdisabled®skip_as_script«code_folded$8d20cbc0-1910-11eb-0d98-31a55e7becdecell_id$8d20cbc0-1910-11eb-0d98-31a55e7becdecode8doit(T, highres) = let
	
	
	
	# blank_img = Array{RGB}(undef, 1920,1080)
	blank_img = if highres
		Array{RGB}(undef, 800, 320)
	else
		Array{RGB}(undef, 200, 80)
	end
	repeat
	blank_img[:] .= RGB(0)

	cam = Camera(blank_img, [16,6], -10, [0,0,100])

	ray_trace(objects(T / 100), cam) |> as_image
end |> transposemetadatashow_logsèdisabled®skip_as_script«code_folded$f4c96d10-190e-11eb-0e8e-11ded1c8830ecell_id$f4c96d10-190e-11eb-0e8e-11ded1c8830ecode# TODO: get refraction to work without offsets in quadratic / inside_of fxs
#       Also, use dot product to see if exiting lens

function Base.isapprox(n1::Nothing, n2::Nothing)
    return true
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8c809420-1910-11eb-2f0d-e17ea7a04a51cell_id$8c809420-1910-11eb-2f0d-e17ea7a04a51codeLfunction plot_rays(positions, objects::Vector{O},
                   filename) where {O <: Object}
    plt = plot(background_color=:black, aspect_ratio=:equal, legend=false)

    for i = 1:size(positions)[1]
        plot!(plt, (positions[i,:,1], positions[i,:,2]); label = "ray",
              linecolor=:white)
    end

    for object in objects
        if typeof(object) == Mirror
            dir = [-object.n[2], object.n[1]]
            extents = zeros(2,2)
            extents[1,:] .= object.p .- object.scale * dir
            extents[2,:] .= object.p .+ object.scale * dir
            plot!(plt, (extents[:,1], extents[:,2]), label = "mirror")
        elseif typeof(object) == Sphere
            circle = draw_circle(object.p, object.r, 100)
            plot!(circle; label="lens", linecolor=:lightblue)
        end 
    end

    plt
endmetadatashow_logsèdisabled®skip_as_script«code_folded$25ab9680-1912-11eb-0650-6361aaf781eccell_id$25ab9680-1912-11eb-0650-6361aaf781eccode&# [doit() for _ in 1:10];

# 3.1
# 2.8metadatashow_logsèdisabled®skip_as_script«code_folded$8c1d3e70-1910-11eb-10af-7dd208f70eddcell_id$8c1d3e70-1910-11eb-10af-7dd208f70eddcodeLfunction inside_of(ray::Ray, sphere)
    return inside_of(ray.p, sphere)
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8be2dea0-193e-11eb-0591-c3dcc4c84403cell_id$8be2dea0-193e-11eb-0591-c3dcc4c84403codemetadatashow_logsèdisabled®skip_as_script«code_folded$8cc03530-1910-11eb-107e-3db62b460115cell_id$8cc03530-1910-11eb-107e-3db62b460115codefunction propagate(rays::Array{Ray}, objects::Vector{O},
                    num_intersections) where {O <: Object}
    Threads.@threads for j = 1:length(rays)
        rays[j] = propagate(rays[j], objects, num_intersections)
    end

    return rays
endmetadatashow_logsèdisabled®skip_as_script«code_folded$8bc95210-1910-11eb-2af9-cb247912835acell_id$8bc95210-1910-11eb-2af9-cb247912835acode+# For now, all cameras are aligned on the z axis
struct Camera
    # Set of all pixels, counts as scene resolution
    pixels

    # physical size of aperture
    size::Vector{Float64}

    # camera's distance from screen
    focal_length::Float64

    # camera's position
    p::Vector{Float64}
endmetadatashow_logsèdisabled®skip_as_script«code_folded$4417b3e0-190f-11eb-1efe-53d279a306e6cell_id$4417b3e0-190f-11eb-1efe-53d279a306e6codeusing LinearAlgebrametadatashow_logsèdisabled®skip_as_script«code_folded$853789be-1911-11eb-1121-679f89fe62dbcell_id$853789be-1911-11eb-1121-679f89fe62dbcode٣md"""
# 0123456789 www

Pluto notebook adaptation of https://github.com/leios/simuleios/tree/master/raytracing

See
https://www.youtube.com/watch?v=JwyQezsQkkw
"""metadatashow_logsèdisabled®skip_as_script«code_folded$8bea95b0-1910-11eb-3850-9f624fa3e6c0cell_id$8bea95b0-1910-11eb-3850-9f624fa3e6c0codexstruct Sphere <: Object
    # Lens position
    p::Vector{Float64}

    # Lens radius
    r::Float64

    s::Surface
endmetadatashow_logsèdisabled®skip_as_script«code_folded$88865f70-1939-11eb-2941-c538b8c9175bcell_id$88865f70-1939-11eb-2941-c538b8c9175bcode@bind T Slider(1:200)metadatashow_logsèdisabled®skip_as_script«code_folded$8bdfe750-1910-11eb-1eb6-c9c61b3333cfcell_id$8bdfe750-1910-11eb-1eb6-c9c61b3333cfcodeabstract type Object endmetadatashow_logsèdisabled®skip_as_script«code_folded$8cf0e220-1910-11eb-0933-b168f7031f46cell_id$8cf0e220-1910-11eb-0933-b168f7031f46codefunction init_rays(cam::Camera)

    res = size(cam.pixels)
    dim = cam.size

    pixel_width = dim ./ res

    # create a set of rays that go through every pixel in our grid.
	rays = map(CartesianIndices(cam.pixels)) do I
		pixel_loc = [cam.p[1] + 0.5*dim[1] - I[1]*dim[1]/res[1] + 
					 0.5*pixel_width[1],
					 cam.p[2] + 0.5*dim[2] - I[2]*dim[2]/res[2] +
					 0.5*pixel_width[2],
					 cam.p[3]+cam.focal_length]
		l = normalize(pixel_loc - cam.p)
		Ray(l, pixel_loc, RGB(0))
	end

    return rays

endmetadatashow_logsèdisabled®skip_as_script«code_folded«notebook_id$51a16ad8-4aa1-11f0-2e48-1b0a0cd88c7cin_temp_dir¨metadata