From d8cbb780fab6f1c0fecefc1b814300c88f8d75c4 Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 14 Jul 2024 15:45:19 +0100 Subject: [PATCH 01/11] Add public keywords for v1.11; Add const fields using a macro for compatibility; Test on pre-release; Add docstring to Module; --- .github/workflows/CI.yml | 3 +- README.md | 2 + docs/Manifest.toml | 99 +- docs/src/applications/cell_simulations.md | 71 +- docs/src/applications/interpolation.md | 90 +- docs/src/applications/pde_discretisation.md | 33 +- docs/src/index.md | 2 + .../literate_applications/cell_simulations.jl | 2 +- docs/src/tutorials/centroidal.md | 28 +- docs/src/tutorials/clipped.md | 24 +- docs/src/tutorials/clipped_rectangle.md | 41 +- docs/src/tutorials/constrained_edges.md | 78 +- .../constrained_interior_within_interiors.md | 14 +- .../constrained_multiply_connected.md | 157 +- .../src/tutorials/constrained_multipolygon.md | 12 +- .../tutorials/constrained_outer_boundary.md | 221 +- .../constrained_outer_boundary_segmented.md | 130 +- docs/src/tutorials/convex.md | 72 +- docs/src/tutorials/convex_hull.md | 56 +- docs/src/tutorials/curve_bounded.md | 2634 +++++++- docs/src/tutorials/custom_primitive.md | 50 +- docs/src/tutorials/lattice.md | 153 +- docs/src/tutorials/nearest.md | 32 +- .../operations_convex_hull_locking.md | 28 +- docs/src/tutorials/operations_flip_edge.md | 40 +- .../tutorials/operations_ghost_triangles.md | 125 +- .../src/tutorials/operations_legalise_edge.md | 38 +- .../tutorials/operations_segment_insertion.md | 35 +- docs/src/tutorials/operations_split_edge.md | 32 +- .../tutorials/operations_split_triangle.md | 12 +- .../operations_vertex_insertion_deletion.md | 85 +- docs/src/tutorials/point_in_polygon.md | 30 +- docs/src/tutorials/point_location.md | 171 +- docs/src/tutorials/pole_of_inaccessibility.md | 48 +- docs/src/tutorials/refinement.md | 5302 ++++++++++++++++- docs/src/tutorials/unconstrained.md | 3202 +++++++++- docs/src/tutorials/voronoi.md | 224 +- src/DelaunayTriangulation.jl | 20 + src/algorithms/triangulation/main.jl | 2 - .../trees/polygon_hierarchy.jl | 4 +- src/data_structures/trees/rtree.jl | 18 +- src/public.jl | 264 + src/setup.jl | 7 + test/runtests.jl | 2 + 44 files changed, 13209 insertions(+), 484 deletions(-) create mode 100644 src/public.jl diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 70ca7c45f..582e47f78 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -20,7 +20,8 @@ jobs: fail-fast: false matrix: version: - - '1' + - '1.10' + - 'pre' - 'lts' os: - ubuntu-latest diff --git a/README.md b/README.md index 553338b4d..592654e45 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,8 @@ Contributions are very welcome. If you encounter any issues or would like to mak The issues tab also lists features that would be nice to have in the package. If you would like to contribute towards any of those features, or towards any other significant enhancements, you are recommended to first post on that issue about your ideas before committing towards a complete implementation. +If you want to use a function from the package that isn't public (meaning it is not listed in the API section of the documentation), you are welcome to make an issue proposing that it be made public, mentioning your need for it. + ### Writing a Pull Request When contributing in the form of a pull request, there are a few important features that should be present, listed below. The point of these requirements is not to make you concerned about the amount of work needed to fulfill them, but to ensure that your contribution can be accepted more readily without the reviewer and yourself needing to go back-and-forth to meet the package's standards. If you do not meet them, you may still be fine depending on what you are contributing. You can always ask for help. diff --git a/docs/Manifest.toml b/docs/Manifest.toml index 973af2626..f4a78a756 100644 --- a/docs/Manifest.toml +++ b/docs/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.10.4" +julia_version = "1.11.0-rc1" manifest_format = "2.0" project_hash = "a5f97bd51af051946996607d64905eb7a7b0c1f9" @@ -54,7 +54,7 @@ version = "0.4.1" [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.1" +version = "1.1.2" [[deps.ArrayInterface]] deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -86,6 +86,7 @@ version = "7.12.0" [[deps.Artifacts]] uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" [[deps.Automa]] deps = ["PrecompileTools", "TranscodingStreams"] @@ -107,6 +108,7 @@ version = "0.4.7" [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" [[deps.BenchmarkTools]] deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] @@ -132,6 +134,7 @@ version = "0.5.0" [[deps.CRC32c]] uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" +version = "1.11.0" [[deps.CRlibm_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -147,9 +150,9 @@ version = "1.0.5" [[deps.CairoMakie]] deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] -git-tree-sha1 = "f84837ccd1411ba059bb0b752dab9c7f1b0b0826" +git-tree-sha1 = "e4da5095557f24713bae4c9f50e34ff4d3b959c0" uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.12.4" +version = "0.12.5" [[deps.Cairo_jll]] deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] @@ -285,6 +288,7 @@ version = "1.0.0" [[deps.Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" [[deps.DeepDiffs]] git-tree-sha1 = "9824894295b62a6a4ab6adf1c7bf337b3a9ca34c" @@ -295,7 +299,7 @@ version = "1.2.0" deps = ["EnumX", "ExactPredicates", "Preferences", "Random"] path = ".." uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "1.0.6" +version = "1.1.0" [[deps.DiffResults]] deps = ["StaticArraysCore"] @@ -323,6 +327,7 @@ weakdeps = ["ChainRulesCore", "SparseArrays"] [[deps.Distributed]] deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" [[deps.Distributions]] deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] @@ -447,6 +452,7 @@ version = "0.9.21" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" [[deps.FillArrays]] deps = ["LinearAlgebra"] @@ -530,6 +536,7 @@ version = "1.0.14+0" [[deps.Future]] deps = ["Random"] uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" +version = "1.11.0" [[deps.GeoInterface]] deps = ["Extents"] @@ -679,13 +686,14 @@ version = "0.1.2" [[deps.IntelOpenMP_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "be50fe8df3acbffa0274a744f1a99d29c45a57f4" +git-tree-sha1 = "14eb2b542e748570b56446f4c50fbfb2306ebc45" uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2024.1.0+0" +version = "2024.2.0+0" [[deps.InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" [[deps.Interpolations]] deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] @@ -802,6 +810,7 @@ version = "1.2.2" [[deps.LazyArtifacts]] deps = ["Artifacts", "Pkg"] uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" +version = "1.11.0" [[deps.LazyModules]] git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" @@ -816,16 +825,17 @@ version = "0.6.4" [[deps.LibCURL_jll]] deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.4.0+0" +version = "8.6.0+0" [[deps.LibGit2]] deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" [[deps.LibGit2_jll]] deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.6.4+0" +version = "1.7.2+0" [[deps.LibSSH2_jll]] deps = ["Artifacts", "Libdl", "MbedTLS_jll"] @@ -834,6 +844,7 @@ version = "1.11.0+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" [[deps.Libffi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -886,6 +897,7 @@ version = "7.2.0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" [[deps.LinearAlgebraX]] deps = ["LinearAlgebra", "Mods", "Primes", "SimplePolynomials"] @@ -895,9 +907,9 @@ version = "0.2.7" [[deps.Literate]] deps = ["Base64", "IOCapture", "JSON", "REPL"] -git-tree-sha1 = "596df2daea9c27da81eee63ef2cf101baf10c24c" +git-tree-sha1 = "eef2e1fc1dc38af90a18eb16e519e06d1fd10c2a" uuid = "98b081ad-f1c9-55d3-8b20-4c87d4299306" -version = "2.18.0" +version = "2.19.0" [[deps.LiveServer]] deps = ["HTTP", "LoggingExtras", "MIMEs", "Pkg", "Sockets", "Test"] @@ -923,6 +935,7 @@ version = "0.3.28" [[deps.Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" [[deps.LoggingExtras]] deps = ["Dates", "Logging"] @@ -937,9 +950,9 @@ version = "0.1.4" [[deps.MKL_jll]] deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "80b2833b56d466b3858d565adcd16a4a05f2089b" +git-tree-sha1 = "f046ccd0c6db2832a9f639e2c669c6fe867e5f4f" uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2024.1.0+0" +version = "2024.2.0+0" [[deps.MacroTools]] deps = ["Markdown", "Random"] @@ -949,15 +962,15 @@ version = "0.5.13" [[deps.Makie]] deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "InteractiveUtils", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] -git-tree-sha1 = "57a1a2b3d12e04f9e9fb77d61cd12571d5541c5f" +git-tree-sha1 = "863b9e666b5a099c8835e85476a5834f9d77c4c1" uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.21.4" +version = "0.21.5" [[deps.MakieCore]] deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] -git-tree-sha1 = "638bc817096742e8302f7b0b972ee5701fe00e97" +git-tree-sha1 = "c1c950560397ee68ad7302ee0e3efa1b07466a2f" uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" -version = "0.8.3" +version = "0.8.4" [[deps.MappedArrays]] git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" @@ -967,6 +980,7 @@ version = "0.4.2" [[deps.Markdown]] deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" [[deps.MarkdownAST]] deps = ["AbstractTrees", "Markdown"] @@ -989,7 +1003,7 @@ version = "1.1.9" [[deps.MbedTLS_jll]] deps = ["Artifacts", "Libdl"] uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.2+1" +version = "2.28.6+0" [[deps.Missings]] deps = ["DataAPI"] @@ -999,6 +1013,7 @@ version = "1.2.0" [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" [[deps.Mods]] git-tree-sha1 = "924f962b524a71eef7a21dae1e6853817f9b658f" @@ -1013,7 +1028,7 @@ version = "0.3.4" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.1.10" +version = "2023.12.12" [[deps.Multisets]] git-tree-sha1 = "8d852646862c96e226367ad10c8af56099b4047e" @@ -1065,7 +1080,7 @@ version = "1.3.5+1" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+4" +version = "0.3.27+1" [[deps.OpenEXR]] deps = ["Colors", "FileIO", "OpenEXR_jll"] @@ -1191,9 +1206,13 @@ uuid = "30392449-352a-5448-841d-b1acce4e97dc" version = "0.43.4+0" [[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.10.0" +version = "1.11.0" +weakdeps = ["REPL"] + + [deps.Pkg.extensions] + REPLExt = "REPL" [[deps.PkgVersion]] deps = ["Pkg"] @@ -1257,16 +1276,17 @@ version = "0.5.6" [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" [[deps.Profile]] -deps = ["Printf"] uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" +version = "1.11.0" [[deps.ProgressMeter]] deps = ["Distributed", "Printf"] -git-tree-sha1 = "763a8ceb07833dd51bb9e3bbca372de32c0605ad" +git-tree-sha1 = "80686d28ecb3ee7fb3ac5371cacaa0d673eb0d4a" uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.10.0" +version = "1.10.1" [[deps.PtrArrays]] git-tree-sha1 = "f011fbb92c4d401059b2212c05c0601b70f8b759" @@ -1286,12 +1306,14 @@ uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" version = "2.9.4" [[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" +version = "1.11.0" [[deps.Random]] deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" [[deps.RangeArrays]] git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" @@ -1390,6 +1412,7 @@ version = "1.2.1" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" [[deps.Setfield]] deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] @@ -1406,6 +1429,7 @@ version = "0.4.1" [[deps.SharedArrays]] deps = ["Distributed", "Mmap", "Random", "Serialization"] uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" +version = "1.11.0" [[deps.Showoff]] deps = ["Dates", "Grisu"] @@ -1462,6 +1486,7 @@ version = "0.1.3" [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" [[deps.SortingAlgorithms]] deps = ["DataStructures"] @@ -1472,7 +1497,7 @@ version = "1.2.1" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.10.0" +version = "1.11.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] @@ -1513,9 +1538,14 @@ uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" version = "1.4.3" [[deps.Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.10.0" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] [[deps.StatsAPI]] deps = ["LinearAlgebra"] @@ -1561,6 +1591,10 @@ version = "0.6.18" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" +[[deps.StyledStrings]] +uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" +version = "1.11.0" + [[deps.SuiteSparse]] deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" @@ -1568,7 +1602,7 @@ uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.2.1+1" +version = "7.6.0+0" [[deps.TOML]] deps = ["Dates"] @@ -1601,6 +1635,7 @@ version = "0.1.1" [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" [[deps.TiffImages]] deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"] @@ -1630,6 +1665,7 @@ version = "1.5.1" [[deps.UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" [[deps.UnPack]] git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" @@ -1638,6 +1674,7 @@ version = "1.0.2" [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" [[deps.UnicodeFun]] deps = ["REPL"] @@ -1792,7 +1829,7 @@ version = "1.3.7+1" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.52.0+1" +version = "1.59.0+0" [[deps.oneTBB_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] diff --git a/docs/src/applications/cell_simulations.md b/docs/src/applications/cell_simulations.md index 1aedbb6c5..99c8d0eb7 100644 --- a/docs/src/applications/cell_simulations.md +++ b/docs/src/applications/cell_simulations.md @@ -8,7 +8,7 @@ model here, allowing only diffusion and proliferation. The point here is to just in a `Triangulation` to perform this type of simulation. A good paper discussing these types of simulations is the paper [_Comparing individual-based approaches to modelling the self-organization of multicellular tissues_](https://doi.org/10.1371/journal.pcbi.1005387) by Osborne et al. (2017). -[^1]: If you are interested in hwot ehse ideas are applied in one dimension, see also [EpithelialDynamics1D.jl](https://github.com/DanielVandH/EpithelialDynamics1D.jl). +[^1]: If you are interested in how these ideas are applied in one dimension, see also [EpithelialDynamics1D.jl](https://github.com/DanielVandH/EpithelialDynamics1D.jl). ## Cell model Let us consider a domain $\Omega$, and suppose we have an initial @@ -46,29 +46,29 @@ We update the triangulation after each step.[^2] ## Implementation Let us now implement this model. First, we define a struct for storing the parameters of our model. -````@example cell_simulations +````julia using DelaunayTriangulation using StableRNGs using LinearAlgebra using StatsBase using CairoMakie -@kwdef mutable struct CellModel - tri::Triangulation +Base.@kwdef mutable struct CellModel{P} + tri::Triangulation{P} new_r_cache::Vector{NTuple{2,Float64}} # for r(t + Δt) - const α::Float64 - const s::Float64 - const Δt::Float64 - const rng::StableRNGs.LehmerRNG - const final_time::Float64 - const β::Float64 - const K::Float64 - const ϵ::Float64 + α::Float64 + s::Float64 + Δt::Float64 + rng::StableRNGs.LehmerRNG + final_time::Float64 + β::Float64 + K::Float64 + ϵ::Float64 end ```` Let's now write functions for performing the migration step. -````@example cell_simulations +````julia function migrate_cells!(cells::CellModel) # a more efficient way would be to loop over edges rather than vertices tri = cells.tri for i in each_solid_vertex(tri) @@ -90,11 +90,15 @@ function migrate_cells!(cells::CellModel) # a more efficient way would be to loo end ```` +```` +migrate_cells! (generic function with 1 method) +```` + Now we can write the proliferation functions. First, let us write a function that computes the Voronoi areas. If we had the `VoronoiTessellation` computed, we would just use `get_area`, but we are aiming to avoid having to compute $\mathcal V\mathcal T(\mathcal P)$ directly. -````@example cell_simulations +````julia function polygon_area(points) # this is the same function from the Interpolation section n = DelaunayTriangulation.num_points(points) p, q, r, s = get_point(points, 1, 2, n, n - 1) @@ -133,10 +137,14 @@ function get_voronoi_area(tri::Triangulation, i) end ```` +```` +get_voronoi_area (generic function with 1 method) +```` + The function `get_voronoi_area` above returns `0` if the cell is on the boundary. Finally, our function for performing the proliferation step is below. -````@example cell_simulations +````julia function proliferate_cells!(cells::CellModel) E = 0.0 Δt = cells.Δt @@ -164,9 +172,13 @@ function proliferate_cells!(cells::CellModel) end ```` +```` +proliferate_cells! (generic function with 1 method) +```` + Finally, our simulation function is below. -````@example cell_simulations +````julia function perform_step!(cells::CellModel) proliferate_cells!(cells) migrate_cells!(cells) @@ -185,12 +197,16 @@ function simulate_cells(cells::CellModel) end ```` +```` +simulate_cells (generic function with 1 method) +```` + ## Example Let us now give an example. Our initial set of points will be randomly chosen inside the rectangle $[-2, 2] \times [-5, 5]$. We use $\alpha = 5$, $s = 2$, $\Delta t = 10^{-3}$, $\beta = 0.25$, $K = 100^2$, and $\epsilon = 0.5$. -````@example cell_simulations +````julia rng = StableRNG(123444) a, b, c, d = -2.0, 2.0, -5.0, 5.0 points = [(a + (b - a) * rand(rng), c + (d - c) * rand(rng)) for _ in 1:10] @@ -214,7 +230,6 @@ record(fig, "cell_simulation.mp4", 1:10:length(t); framerate=60) do ii i[] = ii title_obs[] = L"t = %$(((ii-1) * Δt))" end; -nothing #hide ```` ![](cell_simulation.mp4) @@ -229,17 +244,17 @@ using StableRNGs using LinearAlgebra using StatsBase using CairoMakie -@kwdef mutable struct CellModel - tri::Triangulation +Base.@kwdef mutable struct CellModel{P} + tri::Triangulation{P} new_r_cache::Vector{NTuple{2,Float64}} # for r(t + Δt) - const α::Float64 - const s::Float64 - const Δt::Float64 - const rng::StableRNGs.LehmerRNG - const final_time::Float64 - const β::Float64 - const K::Float64 - const ϵ::Float64 + α::Float64 + s::Float64 + Δt::Float64 + rng::StableRNGs.LehmerRNG + final_time::Float64 + β::Float64 + K::Float64 + ϵ::Float64 end function migrate_cells!(cells::CellModel) # a more efficient way would be to loop over edges rather than vertices diff --git a/docs/src/applications/interpolation.md b/docs/src/applications/interpolation.md index 8ff787f5f..d71254b82 100644 --- a/docs/src/applications/interpolation.md +++ b/docs/src/applications/interpolation.md @@ -20,41 +20,10 @@ One way around this is to instead use the Voronoi tessellation to guide the tess We give an example of this below, where we show how $\mathcal D\mathcal T(X)$ may change significant after a small perturbation while $\mathcal V(X)$ does not at the same time. -````@example interpolation -using DelaunayTriangulation #hide -using CairoMakie #hide -A, B, C, D, E, F, G, H = (0.3, 1.1), (-0.1, 0.8), (0.2, 0.3), (0.6, 0.2), (0.8, 0.8), (0.3, 0.9), (0.5503600264347, 0.6814266789918), (1.1, 0.5) #hide -G2 = (0.5496217775447, 0.7146478790414) #hide -fig = Figure() #hide -ax = Axis(fig[1, 1], width=400, height=400, title="Original") #hide -xlims!(ax, -0.2, 1.3) #hide -ylims!(ax, 0.1, 1.2) #hide -points = [A, B, C, D, E, F, G, H] #hide -triplot!(ax, points, show_points=true) #hide -scatter!(ax, [G], color=:red, markersize=14) #hide -hidedecorations!(ax) #hide -ax2 = Axis(fig[2, 1], width=400, height=400) #hide -voronoiplot!(ax2, points, clip=(-0.2, 1.3, 0.1, 1.2)) #hide -xlims!(ax2, -0.2, 1.3) #hide -ylims!(ax2, 0.1, 1.2) #hide -scatter!(ax2, [G], color=:red, markersize=14) #hide -hidedecorations!(ax2) #hide -ax3 = Axis(fig[1, 2], width=400, height=400, title="Perturbed") #hide -points = [A, B, C, D, E, F, G2, H] #hide -triplot!(ax3, points, show_points=true) #hide -hidedecorations!(ax3) #hide -xlims!(ax3, -0.2, 1.3) #hide -ylims!(ax3, 0.1, 1.2) #hide -scatter!(ax3, [G2], color=:red, markersize=14) #hide -ax4 = Axis(fig[2, 2], width=400, height=400) #hide -voronoiplot!(ax4, points, clip=(-0.2, 1.3, 0.1, 1.2)) #hide -scatter!(ax4, [G2], color=:red, markersize=14) #hide -xlims!(ax4, -0.2, 1.3) #hide -ylims!(ax4, 0.1, 1.2) #hide -hidedecorations!(ax4) #hide -resize_to_layout!(fig) #hide -fig #hide -```` + +```@raw html + +``` This observation motivates the use of the Voronoi tessellation to guide the interpolation. @@ -100,7 +69,7 @@ We implement this below.[^1] [^1]: This is more expensive than we need. In NaturalNeighbours.jl, we use the `peek` keyword in `triangulate` to avoid making any changes to the triangulation itself, and use the `InsertionEventHistory` to track all changes made. -````@example interpolation +````julia using DelaunayTriangulation function compute_envelope(tri::Triangulation, point) r = DelaunayTriangulation.num_points(tri) @@ -115,9 +84,13 @@ function compute_envelope(tri::Triangulation, point) end ```` +```` +compute_envelope (generic function with 1 method) +```` + Let's now check that this function works. -````@example interpolation +````julia using CairoMakie using StableRNGs using ElasticArrays @@ -137,6 +110,10 @@ resize_to_layout!(fig) fig ```` +```@raw html + +``` + As we can see, the red region we have computed from our envelope is indeed the envelope we need. ### Computing the Sibsonian coordinates @@ -154,7 +131,7 @@ to compute the part of the area that is contained within the envelope, since eve envelope is unchanged. If we included the entire area, then the area that we subtract off for the intersection we compute later would just cancel it out anyway. Let's zoom in on the envelope and consider a specific example of how we can do this computation. -````@example interpolation +````julia fig = Figure(fontsize=24) ax = Axis(fig[1, 1], width=400, height=400) triplot!(ax, tri, show_points=true) @@ -180,11 +157,15 @@ resize_to_layout!(fig) fig ```` +```@raw html + +``` + The relevant polygon is shown above in blue, associated with the generator shown by the blue point. We need to compute the area of this polygon. This is simple using the [shoelace formula](https://en.wikipedia.org/wiki/Shoelace_formula). Our implementation of this is given below. -````@example interpolation +````julia function polygon_area(points) # this is the first formula in the "Other formulae" section of the above Wikipedia article n = DelaunayTriangulation.num_points(points) p, q, r, s = get_point(points, 1, 2, n, n - 1) @@ -226,10 +207,14 @@ function pre_insertion_area(tri::Triangulation, i, envelope_vertices) # area fro end ```` +```` +pre_insertion_area (generic function with 1 method) +```` + The details for the post-insertion area are similar, but now the triangles that we take the circumcenters of are those where the edges instead join with the inserted vertex. The function we use is below. -````@example interpolation +````julia function post_insertion_area(tri::Triangulation, i, envelope_vertices, point) u = envelope_vertices[i] prev_index = i == 1 ? length(envelope_vertices) - 1 : i - 1 @@ -251,9 +236,13 @@ function post_insertion_area(tri::Triangulation, i, envelope_vertices, point) end ```` +```` +post_insertion_area (generic function with 1 method) +```` + Now that we can compute the pre- and post-insertion areas, we can start computing the Sibsonian coordinates. -````@example interpolation +````julia function compute_sibson_coordinates(tri::Triangulation, envelope_vertices, point) coordinates = zeros(length(envelope_vertices) - 1) w = 0.0 @@ -271,12 +260,17 @@ function compute_sibson_coordinates(tri::Triangulation, envelope_vertices, point end ```` +```` +compute_sibson_coordinates (generic function with 1 method) +```` + This function gives our $\boldsymbol\lambda$ vector. Notice that, in the computation of these coordinates, we need needed to have $\mathcal V(X)$ directly or make use of the data $z_i$. +## Evaluating the Sibsonian interpolant Now we can evaluate our Sibson interpolant. The following function does this for us. -````@example interpolation +````julia function evaluate_sibson_interpolant(tri::Triangulation, z, point) envelope_vertices, _ = compute_envelope(tri, point) λ = compute_sibson_coordinates(tri, envelope_vertices, point) @@ -294,9 +288,13 @@ function evaluate_sibson_interpolant(tri::Triangulation, z, point) end ```` +```` +evaluate_sibson_interpolant (generic function with 1 method) +```` + Let's now use this function to interpolate some data. -````@example interpolation +````julia f = (x, y) -> sin(x * y) - cos(x - y) * exp(-(x - y)^2) trit = triangulate_rectangle(0.0, 1.0, 0.0, 1.0, 30, 30) zz = [f(x, y) for (x, y) in DelaunayTriangulation.each_point(trit)] @@ -312,6 +310,10 @@ resize_to_layout!(fig) fig ```` +```@raw html + +``` + Works perfectly! ## Just the code An uncommented version of this example is given below. @@ -449,8 +451,6 @@ function compute_sibson_coordinates(tri::Triangulation, envelope_vertices, point return coordinates end -### Evaluating the Sibsonian interpolant - function evaluate_sibson_interpolant(tri::Triangulation, z, point) envelope_vertices, _ = compute_envelope(tri, point) λ = compute_sibson_coordinates(tri, envelope_vertices, point) diff --git a/docs/src/applications/pde_discretisation.md b/docs/src/applications/pde_discretisation.md index 744985b5b..e76c10a98 100644 --- a/docs/src/applications/pde_discretisation.md +++ b/docs/src/applications/pde_discretisation.md @@ -28,7 +28,7 @@ $\Omega = \cup_i\mathcal T_i$. We will then approximate the solution $T$ on each For this decomposition, we simply use $\mathcal D\mathcal T(\Omega)$, where $\mathcal D\mathcal T(\Omega)$ is some Delaunay triangulation of points in $\Omega$ with $\partial\mathcal D\mathcal T(\Omega) = \partial\Omega$. Here is our discretisation of our annulus. -````@example pde_discretisation +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -45,22 +45,19 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + ## Discretisation of the PDE Now let's determine how we can use the discretisation above to solve the PDE. Central to this approach is the idea of a _control volume_ around each point. In particular, connect the centroids of each triangle to the midpoints of the edges of the triangle. This defines a collection of polygons $\Omega_i$ around each point $\vb x_i$, as shown below in blue. -````@example pde_discretisation -points = NTuple{2,Float64}[] #hide -for T in each_solid_triangle(tri) #hide - u, v, w = triangle_vertices(T) #hide - p, q, r = get_point(tri, u, v, w) #hide - c = DelaunayTriangulation.triangle_centroid(p, q, r) #hide - push!(points, c, (p .+ q) ./ 2, c, (q .+ r) ./ 2, c, (r .+ p) ./ 2) #hide -end #hide -linesegments!(ax, points, color=:blue) #hide -fig #hide -```` + +```@raw html + +``` Consider a particular control volume $\Omega_i$. We integrate our PDE over this domain, writing $\grad^2 = \grad \vdot \grad$ and use the divergence theorem: @@ -119,7 +116,7 @@ is the $i$th standard basis vector, and $b_i = 0$. The solution to this system w Let's now implement these ideas. Some details of this implementation, like how we efficient loop over the mesh for building the system by using edges rather than vertices, have been skipped and are described in more detail [here](https://sciml.github.io/FiniteVolumeMethod.jl/dev/math/). -````@example pde_discretisation +````julia using LinearAlgebra using SparseArrays function solve_met_problem(tri::Triangulation, D) @@ -242,16 +239,24 @@ function solve_met_problem(tri::Triangulation, D) end ```` +```` +solve_met_problem (generic function with 1 method) +```` + ## Solving the System Let's now solve this problem, taking $D = 6.25 \times 10^{-4}$. -````@example pde_discretisation +````julia D = 6.25e-4 T = solve_met_problem(tri, D) fig, ax, sc = tricontourf(tri, T, levels=0:5:200, extendhigh=:auto) fig ```` +```@raw html + +``` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_applications/pde_discretisation.jl). diff --git a/docs/src/index.md b/docs/src/index.md index 4f621609d..10dd67de3 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -63,6 +63,8 @@ Contributions are very welcome. If you encounter any issues or would like to mak The issues tab also lists features that would be nice to have in the package. If you would like to contribute towards any of those features, or towards any other significant enhancements, you are recommended to first post on that issue about your ideas before committing towards a complete implementation. +If you want to use a function from the package that isn't public (meaning it is not listed in the API section of the documentation), you are welcome to make an issue proposing that it be made public, mentioning your need for it. + ## Writing a Pull Request When contributing in the form of a pull request, there are a few important features that should be present, listed below. The point of these requirements is not to make you concerned about the amount of work needed to fulfill them, but to ensure that your contribution can be accepted more readily without the reviewer and yourself needing to go back-and-forth to meet the package's standards. If you do not meet them, you may still be fine depending on what you are contributing. You can always ask for help. diff --git a/docs/src/literate_applications/cell_simulations.jl b/docs/src/literate_applications/cell_simulations.jl index 856918443..6d4b318cc 100644 --- a/docs/src/literate_applications/cell_simulations.jl +++ b/docs/src/literate_applications/cell_simulations.jl @@ -4,7 +4,7 @@ # in a `Triangulation` to perform this type of simulation. A good paper discussing these types of simulations is the paper # [_Comparing individual-based approaches to modelling the self-organization of multicellular tissues_](https://doi.org/10.1371/journal.pcbi.1005387) by Osborne et al. (2017). # -# [^1]: If you are interested in hwot ehse ideas are applied in one dimension, see also [EpithelialDynamics1D.jl](https://github.com/DanielVandH/EpithelialDynamics1D.jl). +# [^1]: If you are interested in how these ideas are applied in one dimension, see also [EpithelialDynamics1D.jl](https://github.com/DanielVandH/EpithelialDynamics1D.jl). # # ## Cell model # Let us consider a domain $\Omega$, and suppose we have an initial diff --git a/docs/src/tutorials/centroidal.md b/docs/src/tutorials/centroidal.md index f09adc05a..fc6d49a33 100644 --- a/docs/src/tutorials/centroidal.md +++ b/docs/src/tutorials/centroidal.md @@ -12,7 +12,7 @@ in place. This method is only applicable to clipped tessellations. We give a simple example. First, we compute the clipped tessellation of a point set. -````@example centroidal +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -22,15 +22,31 @@ tri = triangulate(points; rng) vorn = voronoi(tri, clip=true) ```` -To now compute the centroidal tessellation, use [`centroidal_smooth`](@ref). +```` +Voronoi Tessellation. + Number of generators: 500 + Number of polygon vertices: 1032 + Number of polygons: 500 +```` -````@example centroidal +To now compute the centroidal tessellation, use [`centroidal_smooth`](@ref). ( +If you want to straight from a triangulation to a centroidal tessellation, you +can also just use `smooth_vorn = voronoi(tri, clip = true, smooth = true)`.) + +````julia smooth_vorn = centroidal_smooth(vorn; rng) ```` +```` +Voronoi Tessellation. + Number of generators: 500 + Number of polygon vertices: 1074 + Number of polygons: 500 +```` + Let us now compare the two tessellations. -````@example centroidal +````julia fig = Figure() ax1 = Axis(fig[1, 1], title="Original", width=600, height=400) ax2 = Axis(fig[1, 2], title="Smoothed", width=600, height=400) @@ -40,6 +56,10 @@ resize_to_layout!(fig) fig ```` +```@raw html + +``` + As you can see, the tiles are all reasonably uniform, and their generators do look to be near the centroid of their corresponding tile. Note that this function `centroidal_smooth` is iterative, and you can control the iteration limits diff --git a/docs/src/tutorials/clipped.md b/docs/src/tutorials/clipped.md index 596139572..7f96c3a09 100644 --- a/docs/src/tutorials/clipped.md +++ b/docs/src/tutorials/clipped.md @@ -13,7 +13,7 @@ are on the to-do list, but they are not yet implemented.) In the example below, we clip the tessellation to the convex hull of the point set by using `clip=true` in the keyword arguments. -````@example clipped +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -24,14 +24,28 @@ tri = triangulate(points; rng) vorn = voronoi(tri) ```` -````@example clipped +```` +Voronoi Tessellation. + Number of generators: 50 + Number of polygon vertices: 92 + Number of polygons: 50 +```` + +````julia clipped_vorn = voronoi(tri, clip = true) ```` +```` +Voronoi Tessellation. + Number of generators: 50 + Number of polygon vertices: 119 + Number of polygons: 50 +```` + Note that the clipping has put more polygon vertices in. We compare the clipped tessellations below. -````@example clipped +````julia fig = Figure() ax1 = Axis(fig[1, 1], title="Unclipped", width=600, height=400) ax2 = Axis(fig[1, 2], title="Clipped", width=600, height=400) @@ -41,6 +55,10 @@ resize_to_layout!(fig) fig ```` +```@raw html + +``` + As you can see, the unbounded polygons, and any polygons that included points outside of the convex hull, have now been clipped to the convex hull. ## Just the code diff --git a/docs/src/tutorials/clipped_rectangle.md b/docs/src/tutorials/clipped_rectangle.md index 121cfa287..c1c6e41c0 100644 --- a/docs/src/tutorials/clipped_rectangle.md +++ b/docs/src/tutorials/clipped_rectangle.md @@ -15,7 +15,7 @@ but we provide the function [`get_polygon_coordinates`](@ref) for this (this is Let us now demonstrate. First, we construct a tessellation of some example point set. -````@example clipped_rectangle +````julia using DelaunayTriangulation using CairoMakie A = (-3.0, 7.0) @@ -31,28 +31,43 @@ tri = triangulate(points) vorn = voronoi(tri) ```` +```` +Voronoi Tessellation. + Number of generators: 8 + Number of polygon vertices: 9 + Number of polygons: 8 +```` + Let us show the tessellation, and the rectangle we want to clip the tessellation to. -````@example clipped_rectangle +````julia fig, ax, sc = voronoiplot(vorn) a, b, c, d = -2.0, 3.0, 0.0, 7.0 lines!(ax, [(a,c),(b,c),(b,d),(a,d),(a,c)], color = :black, linewidth = 4) fig ```` +```@raw html + +``` + To apply this clipping, we need to provide a bounding box of the form `(xmin, xmax, ymin, ymax)`. Here, we will use -````@example clipped_rectangle +````julia bounding_box = (a, b, c, d) ```` +```` +(-2.0, 3.0, 0.0, 7.0) +```` + You can obtain some reasonable defaults for this bounding box using [DelaunayTriangulation.polygon_bounds(vorn)](@ref polygon_bounds). The coordinates for each polygon clipped to this box can be obtained as follows. -````@example clipped_rectangle +````julia clipped_coords = Vector{Vector{NTuple{2,Float64}}}(undef, num_polygons(vorn)) for i in each_polygon_index(vorn) clipped_coords[i] = get_polygon_coordinates(vorn, i, bounding_box) @@ -60,13 +75,29 @@ end clipped_coords ```` +```` +8-element Vector{Vector{Tuple{Float64, Float64}}}: + [(-2.000000000000001, 7.0), (-2.0, 5.666666666666667), (-1.1363636363636365, 5.954545454545455), (-0.8750000000000009, 7.0), (-2.000000000000001, 7.0)] + [(-0.30000000000000004, 4.7), (2.357142857142857, 2.9285714285714284), (3.0, 5.499999999999999), (3.0, 6.0), (2.0, 7.0), (-0.8750000000000009, 7.0), (-1.1363636363636365, 5.954545454545455), (-0.30000000000000004, 4.7)] + [(0.375, 0.0), (2.710526315789474, 1.868421052631579), (2.357142857142857, 2.9285714285714284), (-0.30000000000000004, 4.7), (-2.0, 3.0), (-2.0, 0.0), (0.375, 0.0)] + [(-2.0, 3.0), (-0.30000000000000004, 4.7), (-1.1363636363636365, 5.954545454545455), (-2.0, 5.666666666666667), (-2.0, 3.0)] + [(3.0, 0.0), (3.0, 1.7857142857142858), (2.710526315789474, 1.868421052631579), (0.375, 0.0), (3.0, 0.0)] + [(3.0, 1.7857142857142858), (3.0, 5.499999999999999), (2.357142857142857, 2.9285714285714284), (2.710526315789474, 1.868421052631579), (3.0, 1.7857142857142858)] + [] + [(3.0, 7.0), (2.0, 7.0), (3.0, 6.0), (3.0, 7.0)] +```` + Now let's plot these. -````@example clipped_rectangle +````julia fig, ax, sc = poly(clipped_coords, color = :white, strokewidth = 4) fig ```` +```@raw html + +``` + As we can see, the polygons have been clipped to the rectangle. Note that if you just want this for plotting, you can also call `voronoiplot` with the `bounding_box` keyword argument. diff --git a/docs/src/tutorials/constrained_edges.md b/docs/src/tutorials/constrained_edges.md index b213c8c88..e58e4d561 100644 --- a/docs/src/tutorials/constrained_edges.md +++ b/docs/src/tutorials/constrained_edges.md @@ -10,14 +10,14 @@ starting with the simple case of only having constrained segments, meaning edges that are forced to be in the final triangulation. To start, let us load in the packages we will need. -````@example constrained_edges +````julia using DelaunayTriangulation using CairoMakie ```` We consider triangulating the following set of points: -````@example constrained_edges +````julia a = (0.0, 0.0) b = (0.0, 1.0) c = (0.0, 2.5) @@ -32,12 +32,35 @@ k = (8.0, 2.5) pts = [a, b, c, d, e, f, g, h, i, j, k] ```` +```` +11-element Vector{Tuple{Float64, Float64}}: + (0.0, 0.0) + (0.0, 1.0) + (0.0, 2.5) + (2.0, 0.0) + (6.0, 0.0) + (8.0, 0.0) + (8.0, 0.5) + (7.5, 1.0) + (4.0, 1.0) + (4.0, 2.5) + (8.0, 2.5) +```` + To now define the segments, we define: -````@example constrained_edges +````julia C = Set([(2, 1), (2, 11), (2, 7), (2, 5)]) ```` +```` +Set{Tuple{Int64, Int64}} with 4 elements: + (2, 5) + (2, 11) + (2, 1) + (2, 7) +```` + With this notation, each `Tuple` is an individual edge to include in the triangulation, with `(i, j)` meaning the edge connecting the points @@ -45,21 +68,45 @@ edge to include in the triangulation, with make the triangulation, comparing it to its unconstrained counterpart. -````@example constrained_edges +````julia tri = triangulate(pts) ```` -````@example constrained_edges +```` +Delaunay Triangulation. + Number of vertices: 11 + Number of triangles: 11 + Number of edges: 21 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: false +```` + +````julia cons_tri = triangulate(pts; segments=C) ```` -````@example constrained_edges +```` +Delaunay Triangulation. + Number of vertices: 11 + Number of triangles: 11 + Number of edges: 21 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: true +```` + +````julia fig = Figure() ax1 = Axis(fig[1, 1], xlabel="x", ylabel=L"y", title="(a): Unconstrained", titlealign=:left, width=300, height=300) ax2 = Axis(fig[1, 2], xlabel="x", ylabel=L"y", - title="(b): Unconstrained", titlealign=:left, + title="(b): Constrained", titlealign=:left, width=300, height=300) triplot!(ax1, tri) triplot!(ax2, cons_tri, show_constrained_edges = true) @@ -67,22 +114,35 @@ resize_to_layout!(fig) fig ```` +```@raw html + +``` + As you can see, the constrained edges in magenta have now been included in the triangulation in (b), whereas in (a) most were previously not included. You can view the constrained edges by using -````@example constrained_edges +````julia get_interior_segments(cons_tri) ```` +```` +Set{Tuple{Int64, Int64}} with 4 elements: + (1, 2) + (2, 5) + (7, 2) + (11, 2) +```` + There is also a function [`get_all_segments`](@ref), which in this case is the same as [`get_interior_segments`](@ref), but in the case of a triangulation with constrained boundaries, it will also include the boundary segments whereas `get_interior_segments` will not; this is demonstrated in the later tutorials. + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/constrained_edges.jl). @@ -115,7 +175,7 @@ ax1 = Axis(fig[1, 1], xlabel="x", ylabel=L"y", title="(a): Unconstrained", titlealign=:left, width=300, height=300) ax2 = Axis(fig[1, 2], xlabel="x", ylabel=L"y", - title="(b): Unconstrained", titlealign=:left, + title="(b): Constrained", titlealign=:left, width=300, height=300) triplot!(ax1, tri) triplot!(ax2, cons_tri, show_constrained_edges = true) diff --git a/docs/src/tutorials/constrained_interior_within_interiors.md b/docs/src/tutorials/constrained_interior_within_interiors.md index 20178710d..540286d32 100644 --- a/docs/src/tutorials/constrained_interior_within_interiors.md +++ b/docs/src/tutorials/constrained_interior_within_interiors.md @@ -9,7 +9,7 @@ Now we consider triangulating a domain which has not only an interior boundary, but also an interior boundary inside that interior boundary. To start, let us load the packages. -````@example constrained_interior_within_interiors +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -24,7 +24,7 @@ the orientation of an interior curve is the opposite orientation to the curve it's inside of. Here are the points we will be triangulating. -````@example constrained_interior_within_interiors +````julia curve_1 = [ [(0.0, 0.0), (5.0, 0.0), (10.0, 0.0), (15.0, 0.0), (20.0, 0.0), (25.0, 0.0)], [(25.0, 0.0), (25.0, 5.0), (25.0, 10.0), (25.0, 15.0), (25.0, 20.0), (25.0, 25.0)], @@ -53,15 +53,23 @@ points = [ boundary_nodes, points = convert_boundary_points_to_indices(curves; existing_points=points) ```` +```` +([[[35, 36, 37, 38, 39, 40], [40, 41, 42, 43, 44, 45], [45, 46, 47, 48, 49, 50], [50, 51, 52, 53, 54, 35]], [[55, 56, 57, 58, 59], [59, 60, 61, 62, 63], [63, 64, 65, 66, 67, 55]], [[68, 69, 70, 71, 72, 73, 74, 68]]], [(3.0, 23.0), (9.0, 24.0), (9.2, 22.0), (14.8, 22.8), (16.0, 22.0), (23.0, 23.0), (22.6, 19.0), (23.8, 17.8), (22.0, 14.0), (22.0, 11.0), (24.0, 6.0), (23.0, 2.0), (19.0, 1.0), (16.0, 3.0), (10.0, 1.0), (11.0, 3.0), (6.0, 2.0), (6.2, 3.0), (2.0, 3.0), (2.6, 6.2), (2.0, 8.0), (2.0, 11.0), (5.0, 12.0), (2.0, 17.0), (3.0, 19.0), (6.0, 18.0), (6.5, 14.5), (13.0, 19.0), (13.0, 12.0), (16.0, 8.0), (9.8, 8.0), (7.5, 6.0), (12.0, 13.0), (19.0, 15.0), (0.0, 0.0), (5.0, 0.0), (10.0, 0.0), (15.0, 0.0), (20.0, 0.0), (25.0, 0.0), (25.0, 5.0), (25.0, 10.0), (25.0, 15.0), (25.0, 20.0), (25.0, 25.0), (20.0, 25.0), (15.0, 25.0), (10.0, 25.0), (5.0, 25.0), (0.0, 25.0), (0.0, 20.0), (0.0, 15.0), (0.0, 10.0), (0.0, 5.0), (4.0, 6.0), (4.0, 14.0), (4.0, 20.0), (18.0, 20.0), (20.0, 20.0), (20.0, 16.0), (20.0, 12.0), (20.0, 8.0), (20.0, 4.0), (16.0, 4.0), (12.0, 4.0), (8.0, 4.0), (4.0, 4.0), (12.906, 10.912), (16.0, 12.0), (16.16, 14.46), (16.29, 17.06), (13.13, 16.86), (8.92, 16.4), (8.8, 10.9)]) +```` + To now triangulate: -````@example constrained_interior_within_interiors +````julia rng = StableRNG(123) # triangulation is not unique when there are cocircular points tri = triangulate(points; boundary_nodes, rng) fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/constrained_interior_within_interiors.jl). diff --git a/docs/src/tutorials/constrained_multiply_connected.md b/docs/src/tutorials/constrained_multiply_connected.md index e6887f69a..fa26b4e34 100644 --- a/docs/src/tutorials/constrained_multiply_connected.md +++ b/docs/src/tutorials/constrained_multiply_connected.md @@ -9,7 +9,7 @@ We now consider triangulating a domain which has not only a boundary, but also an interior boundary. To start, let us load the packages. -````@example constrained_multiply_connected +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -26,7 +26,7 @@ the interior boundaries must be clockwise so that the orientations of the interiors relative to the boundaries are consistent. Note again that neighbouring segments must connect. -````@example constrained_multiply_connected +````julia curve_1 = [ [ # first segment (0.0, 0.0), (4.0, 0.0), (8.0, 0.0), (12.0, 0.0), (12.0, 4.0), @@ -65,7 +65,6 @@ points = [ (5.6, 7.8), (5.6, 7.6), (5.6, 7.4), (6.2, 7.4), (6.0, 7.6), (7.0, 7.8), (7.0, 7.4)] boundary_nodes, points = convert_boundary_points_to_indices(curves; existing_points=points); -nothing #hide ```` Notice that `curve_1` and `curve_2` are split up into multiple segments. For `curve_3` @@ -74,64 +73,192 @@ treating them as a single segment. Now let us triangulate. -````@example constrained_multiply_connected +````julia rng = StableRNG(123) # the triangulation is not unique due to cocircular points tri = triangulate(points; boundary_nodes, rng) fig, ax, sc = triplot(tri, show_constrained_edges=true, show_convex_hull=true) fig ```` +```@raw html + +``` + Like before, we examine individual segments by referring to them by their ghost vertices, which are still in the order `-1`, `-2`, and so on in the order of the segments provided in `boundary_nodes`. This is a lot more cumbersome to keep track of than the previous tutorials since there are many more ghost vertices. This is where the boundary fields become much more useful. For instance, the `boundary_edge_map` in this case is given by: -````@example constrained_multiply_connected +````julia get_boundary_edge_map(tri) ```` +```` +Dict{Tuple{Int64, Int64}, Tuple{Tuple{Int64, Int64}, Int64}} with 43 entries: + (61, 62) => ((1, 1), 7) + (58, 59) => ((1, 1), 4) + (93, 90) => ((3, 1), 4) + (56, 57) => ((1, 1), 2) + (55, 56) => ((1, 1), 1) + (96, 97) => ((4, 1), 3) + (92, 93) => ((3, 1), 3) + (75, 76) => ((1, 2), 9) + (97, 94) => ((4, 1), 4) + (71, 72) => ((1, 2), 5) + (67, 68) => ((1, 2), 1) + (77, 78) => ((1, 2), 11) + (60, 61) => ((1, 1), 6) + (88, 89) => ((2, 2), 5) + (66, 67) => ((1, 1), 12) + (69, 70) => ((1, 2), 3) + (76, 77) => ((1, 2), 10) + (73, 74) => ((1, 2), 7) + (91, 92) => ((3, 1), 2) + (64, 65) => ((1, 1), 10) + (80, 81) => ((2, 1), 2) + (84, 85) => ((2, 2), 1) + (89, 79) => ((2, 2), 6) + (87, 88) => ((2, 2), 4) + (68, 69) => ((1, 2), 2) + (59, 60) => ((1, 1), 5) + (70, 71) => ((1, 2), 4) + (81, 82) => ((2, 1), 3) + (94, 95) => ((4, 1), 1) + (90, 91) => ((3, 1), 1) + (72, 73) => ((1, 2), 6) + (62, 63) => ((1, 1), 8) + (83, 84) => ((2, 1), 5) + (65, 66) => ((1, 1), 11) + (74, 75) => ((1, 2), 8) + (78, 55) => ((1, 2), 12) + (85, 86) => ((2, 2), 2) + (86, 87) => ((2, 2), 3) + (95, 96) => ((4, 1), 2) + (63, 64) => ((1, 1), 9) + (57, 58) => ((1, 1), 3) + (82, 83) => ((2, 1), 4) + (79, 80) => ((2, 1), 1) +```` + The `Tuples` in the `values` are now of the form `((I, J), K)`, with `I` the curve index (with `1` being the outer boundary), `J` the segment index, and `K` the position of the edge within the segment. To look at the ghost vertices directly, another useful field is `ghost_vertex_ranges`: -````@example constrained_multiply_connected +````julia get_ghost_vertex_ranges(tri) ```` +```` +Dict{Int64, UnitRange{Int64}} with 6 entries: + -5 => -5:-5 + -1 => -2:-1 + -3 => -4:-3 + -2 => -2:-1 + -4 => -4:-3 + -6 => -6:-6 +```` + This field maps a ghost vertex to the complete set of ghost vertices that might be found on the curve corresponding to that ghost vertex. For example, `-3 => -4:-3` means that the ghost vertex `-3` is part of a curve that, in addition to itself, contains the ghost vertex `-4`. If you want all the ghost vertex, you can use -````@example constrained_multiply_connected +````julia DelaunayTriangulation.all_ghost_vertices(tri) ```` +```` +KeySet for a Dict{Int64, UnitRange{Int64}} with 6 entries. Keys: + -5 + -1 + -3 + -2 + -4 + -6 +```` + which is just `keys(get_ghost_vertex_ranges(tri))`. If you just want to find what curve and what segment a ghost vertex belongs to, you can look at the `ghost_vertex_map`: -````@example constrained_multiply_connected +````julia get_ghost_vertex_map(tri) ```` +```` +Dict{Int64, Tuple{Int64, Int64}} with 6 entries: + -5 => (3, 1) + -1 => (1, 1) + -3 => (2, 1) + -2 => (1, 2) + -4 => (2, 2) + -6 => (4, 1) +```` + So that, for example, `-3 => (2, 1)` means that the ghost vertex `-3` corresponds to the first part (from the second `Tuple` element) of the second curve (from the first `Tuple` element). To get all the boundary nodes, you can use -````@example constrained_multiply_connected +````julia DelaunayTriangulation.get_all_boundary_nodes(tri) ```` +```` +Set{Int64} with 43 elements: + 56 + 55 + 60 + 67 + 73 + 64 + 90 + 63 + 86 + 91 + 62 + 58 + 75 + 92 + 69 + 68 + 82 + 85 + 84 + 77 + 95 + 71 + 66 + 76 + 93 + 59 + 87 + 79 + 81 + 74 + 61 + 94 + 57 + 70 + 88 + 78 + 72 + 83 + 89 + 80 + 96 + 65 + 97 +```` + To give an example of how we can work with this boundary, let us compute the area of the triangulation (a more efficient approach is with [`get_area(tri)`](@ref get_area), but this is just for demonstration). For this, the order of the boundary edges is appropriate, so we must iterate in a way that respects the ordering. -````@example constrained_multiply_connected +````julia function get_triangulation_area(tri) A = 0.0 nc = DelaunayTriangulation.num_curves(tri) @@ -156,13 +283,17 @@ end A = get_triangulation_area(tri) ```` +```` +330.0 +```` + This is of course quite a complicated example since we need to take care of the order. If we don't care about order, then the complexity of the code for iterating over a boundary is much simpler. For example, here we compute the perimeter of the boundary, and we also consider the length of each curve and of each segment. -````@example constrained_multiply_connected +````julia function get_perimeters(tri) total_perimeter = 0.0 nc = DelaunayTriangulation.num_curves(tri) @@ -185,6 +316,10 @@ end ℓ, cℓ, sℓ = get_perimeters(tri) ```` +```` +(150.2711258282229, [92.61427157873052, 24.0, 20.0, 13.65685424949238], Dict((1, 2) => 49.30056307974577, (3, 1) => 20.0, (1, 1) => 43.31370849898476, (4, 1) => 13.65685424949238, (2, 2) => 12.0, (2, 1) => 12.0)) +```` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/constrained_multiply_connected.jl). diff --git a/docs/src/tutorials/constrained_multipolygon.md b/docs/src/tutorials/constrained_multipolygon.md index 83e264d05..19a267696 100644 --- a/docs/src/tutorials/constrained_multipolygon.md +++ b/docs/src/tutorials/constrained_multipolygon.md @@ -11,7 +11,7 @@ with the outer boundaries being counter-clockwise, and all the interior boundaries clockwise (and other interiors inside interiors counter-clockwise, etc., if you please). Here is a simple example. -````@example constrained_multipolygon +````julia using DelaunayTriangulation using CairoMakie @@ -33,9 +33,13 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Here is another example. -````@example constrained_multipolygon +````julia C = (15.7109521325776, 33.244486807457) D = (14.2705719699703, 32.8530791545746) E = (14.3, 27.2) @@ -196,6 +200,10 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/constrained_multipolygon.jl). diff --git a/docs/src/tutorials/constrained_outer_boundary.md b/docs/src/tutorials/constrained_outer_boundary.md index 7c90ce85e..6a4a77047 100644 --- a/docs/src/tutorials/constrained_outer_boundary.md +++ b/docs/src/tutorials/constrained_outer_boundary.md @@ -10,14 +10,14 @@ having constrained segments, we have a constrained outer boundary. This is especially useful as it allows us to, for example, have a non-convex boundary. To start, let us load in the packages we will need. -````@example constrained_outer_boundary +````julia using DelaunayTriangulation using CairoMakie ```` Now, we define some of the points we will be triangulating. -````@example constrained_outer_boundary +````julia pts = [ (-7.36, 12.55), (-9.32, 8.59), (-9.0, 3.0), (-6.32, -0.27), (-4.78, -1.53), (2.78, -1.41), (-5.42, 1.45), (7.86, 0.67), @@ -28,6 +28,32 @@ pts = [ ] ```` +```` +22-element Vector{Tuple{Float64, Float64}}: + (-7.36, 12.55) + (-9.32, 8.59) + (-9.0, 3.0) + (-6.32, -0.27) + (-4.78, -1.53) + (2.78, -1.41) + (-5.42, 1.45) + (7.86, 0.67) + (10.92, 0.23) + (9.9, 7.39) + (8.14, 4.77) + (13.4, 8.61) + (7.4, 12.27) + (2.2, 13.85) + (-3.48, 10.21) + (-4.56, 7.35) + (3.44, 8.99) + (3.74, 5.87) + (-2.0, 8.0) + (-2.52, 4.81) + (1.34, 6.77) + (1.24, 4.15) +```` + To define a boundary, we need to provide a counter-clockwise sequence of indices corresponding to the boundary points, and the first index must match the last index so the boundary is closed. While we could @@ -37,7 +63,7 @@ tedious to get correct. So, we instead provide the function [`convert_boundary_points_to_indices`](@ref) which takes in a vector of coordinates, and then returns the correct set of indices. Here is how we use it: -````@example constrained_outer_boundary +````julia boundary_points = [ (0.0, 0.0), (2.0, 1.0), (3.98, 2.85), (6.0, 5.0), (7.0, 7.0), (7.0, 9.0), (6.0, 11.0), (4.0, 12.0), @@ -46,37 +72,119 @@ boundary_points = [ (-6.94, 7.13), (-6.0, 5.0), (-4.0, 3.0), (-2.0, 1.0), (0.0, 0.0) ] boundary_nodes, pts = convert_boundary_points_to_indices(boundary_points; existing_points=pts); -nothing #hide ```` The keyword argument `existing_points` is so that the points in `boundary_points` get appended (in-place) to `pts`, as we see: -````@example constrained_outer_boundary +````julia pts ```` +```` +42-element Vector{Tuple{Float64, Float64}}: + (-7.36, 12.55) + (-9.32, 8.59) + (-9.0, 3.0) + (-6.32, -0.27) + (-4.78, -1.53) + (2.78, -1.41) + (-5.42, 1.45) + (7.86, 0.67) + (10.92, 0.23) + (9.9, 7.39) + (8.14, 4.77) + (13.4, 8.61) + (7.4, 12.27) + (2.2, 13.85) + (-3.48, 10.21) + (-4.56, 7.35) + (3.44, 8.99) + (3.74, 5.87) + (-2.0, 8.0) + (-2.52, 4.81) + (1.34, 6.77) + (1.24, 4.15) + (0.0, 0.0) + (2.0, 1.0) + (3.98, 2.85) + (6.0, 5.0) + (7.0, 7.0) + (7.0, 9.0) + (6.0, 11.0) + (4.0, 12.0) + (2.0, 12.0) + (1.0, 11.0) + (0.0, 9.13) + (-1.0, 11.0) + (-2.0, 12.0) + (-4.0, 12.0) + (-6.0, 11.0) + (-7.0, 9.0) + (-6.94, 7.13) + (-6.0, 5.0) + (-4.0, 3.0) + (-2.0, 1.0) +```` + The `boundary_nodes` is then these indices: -````@example constrained_outer_boundary +````julia boundary_nodes ```` +```` +21-element Vector{Int64}: + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 23 +```` + To now triangulate, we use the `boundary_nodes` keyword argument. Like in the last tutorial, we also give a comparison to the unconstrained version. -````@example constrained_outer_boundary +````julia tri = triangulate(pts) cons_tri = triangulate(pts; boundary_nodes) ```` -````@example constrained_outer_boundary +```` +Delaunay Triangulation. + Number of vertices: 28 + Number of triangles: 34 + Number of edges: 61 + Has boundary nodes: true + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: true +```` + +````julia fig = Figure() ax1 = Axis(fig[1, 1], xlabel="x", ylabel=L"y", title="(a): Unconstrained", titlealign=:left, width=300, height=300) ax2 = Axis(fig[1, 2], xlabel="x", ylabel=L"y", - title="(b): Unconstrained", titlealign=:left, + title="(b): Constrained", titlealign=:left, width=300, height=300) triplot!(ax1, tri) triplot!(ax2, cons_tri, show_constrained_edges=true, show_convex_hull=true) @@ -84,6 +192,10 @@ resize_to_layout!(fig) fig ```` +```@raw html + +``` + Notice now that the boundary in (b) is not convex, as is clear from the convex hull shown in red. You can access the convex hull using [`get_convex_hull(cons_tri)`](@ref get_convex_hull). We also note that the triangulation @@ -91,11 +203,15 @@ no longer contains every point in `pts`, as by default all triangles away from the boundary are deleted, so that we do actually have a boundary. If for some reason you do not want this behaviour, use `delete_holes = false`: -````@example constrained_outer_boundary +````julia full_tri = triangulate(pts; boundary_nodes, delete_holes=false) fig, ax, sc = triplot(full_tri, show_constrained_edges=true, show_convex_hull=true) ```` +```@raw html + +``` + This default behaviour does mean you need to be careful if you use [`DelaunayTriangulation.each_point`](@ref) or [`DelaunayTriangulation.each_point_index`](@ref), as these iterators will contain all points, possibly iterating over points that aren't in the triangulation. For this reason, it is recommended that you @@ -105,10 +221,35 @@ There are multiple methods available for working directly with the boundary nodes. You can get the boundary nodes using `get_boundary_nodes(tri)`: -````@example constrained_outer_boundary +````julia get_boundary_nodes(cons_tri) ```` +```` +21-element Vector{Int64}: + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 23 +```` + Later tutorials also consider other methods for working with the boundary where care needs to be taken with the boundary, or part of the boundary, being considered. For now, here is an example where we use @@ -119,7 +260,7 @@ A = \dfrac{1}{2}\sum_{i=1}^n \left(y_i + y_{i+1}\right)\left(x_i - x_{i+1}\right ``` Here is one implementation. -````@example constrained_outer_boundary +````julia function shoelace_area(tri) bn = get_boundary_nodes(tri) n = num_boundary_edges(bn) # length(bn) - 1 in this case since bn[1] = bn[end] @@ -137,38 +278,78 @@ end shoelace_area(cons_tri) ```` +```` +119.20499999999998 +```` + We also provide a map that contains the edges as the keys (*not* in order), and the values are `Tuple`s `(I, J)` such that `get_boundary_nodes(get_boundary_nodes(cons_tri, I), J)` gives the corresponding edge. The first call, `bn = get_boundary_nodes(cons_tri, I)` is for obtaining the chain of boundary edges containing the boundary edge, and then `get_boundary_nodes(bn, j)` gets the actual edge. -````@example constrained_outer_boundary +````julia get_boundary_edge_map(cons_tri) ```` +```` +Dict{Tuple{Int64, Int64}, Tuple{Vector{Int64}, Int64}} with 20 entries: + (23, 24) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 1) + (40, 41) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 18) + (25, 26) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 3) + (35, 36) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 13) + (30, 31) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 8) + (29, 30) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 7) + (42, 23) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 20) + (33, 34) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 11) + (38, 39) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 16) + (27, 28) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 5) + (26, 27) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 4) + (39, 40) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 17) + (24, 25) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 2) + (28, 29) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 6) + (41, 42) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 19) + (31, 32) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 9) + (32, 33) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 10) + (34, 35) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 12) + (37, 38) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 15) + (36, 37) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 14) +```` + In our case, the `I` is just `boundary_nodes` since we only have one contiguous boundary. To give an example, take -````@example constrained_outer_boundary +````julia bem = get_boundary_edge_map(cons_tri) e, (I, J) = first(bem) ```` -````@example constrained_outer_boundary +```` +(23, 24) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 1) +```` + +````julia bn = get_boundary_nodes(cons_tri, I) # same as boundary_nodes for this problem; see the later tutorials bn_j = get_boundary_nodes(bn, J) ```` +```` +23 +```` + This returns `23`, which is the start of the edge `e`. The full edge is given by -````@example constrained_outer_boundary +````julia get_boundary_nodes.(Ref(bn), (J, J+1)) # Ref to not broadcast over bn ```` +```` +(23, 24) +```` + To give an example, here's how we compute the perimeter of the triangulation. This only needs the edges, so we only consider the `keys` of the map. -````@example constrained_outer_boundary +````julia function get_perimeter(tri) bem = get_boundary_edge_map(tri) ℓ = 0.0 @@ -182,6 +363,10 @@ end get_perimeter(cons_tri) ```` +```` +44.23794172896859 +```` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/constrained_outer_boundary.jl). @@ -220,7 +405,7 @@ ax1 = Axis(fig[1, 1], xlabel="x", ylabel=L"y", title="(a): Unconstrained", titlealign=:left, width=300, height=300) ax2 = Axis(fig[1, 2], xlabel="x", ylabel=L"y", - title="(b): Unconstrained", titlealign=:left, + title="(b): Constrained", titlealign=:left, width=300, height=300) triplot!(ax1, tri) triplot!(ax2, cons_tri, show_constrained_edges=true, show_convex_hull=true) diff --git a/docs/src/tutorials/constrained_outer_boundary_segmented.md b/docs/src/tutorials/constrained_outer_boundary_segmented.md index 233304d30..4030856db 100644 --- a/docs/src/tutorials/constrained_outer_boundary_segmented.md +++ b/docs/src/tutorials/constrained_outer_boundary_segmented.md @@ -12,44 +12,72 @@ for the identification of separate parts of a boundary. This is useful, for exam if you want to assign different boundary conditions on different parts of the boundary for a differential equation problem. To start, let us load in the packages we will need. -````@example constrained_outer_boundary_segmented +````julia using DelaunayTriangulation using CairoMakie ```` Now, we define some of the points we will be triangulating. -````@example constrained_outer_boundary_segmented +````julia points = [ (2.0, 8.0), (6.0, 4.0), (2.0, 6.0), (2.0, 4.0), (8.0, 2.0) ] ```` +```` +5-element Vector{Tuple{Float64, Float64}}: + (2.0, 8.0) + (6.0, 4.0) + (2.0, 6.0) + (2.0, 4.0) + (8.0, 2.0) +```` + We now want to define our boundary. The method for providing a boundary to be identified into multiple sections is to provided a vector of vectors of indices, where each vector of indices is a section. The last index of each section must match the first index of the next section, including the last with the first section so that the boundary is closed. Here, we provide three . -````@example constrained_outer_boundary_segmented +````julia section_1 = [(0.0, 0.0), (14.0, 0.0)] section_2 = [(14.0, 0.0), (10.0, 4.0), (4.0, 6.0), (2.0, 12.0), (0.0, 14.0)] section_3 = [(0.0, 14.0), (0.0, 0.0)] boundary_points = [section_1, section_2, section_3] ```` +```` +3-element Vector{Vector{Tuple{Float64, Float64}}}: + [(0.0, 0.0), (14.0, 0.0)] + [(14.0, 0.0), (10.0, 4.0), (4.0, 6.0), (2.0, 12.0), (0.0, 14.0)] + [(0.0, 14.0), (0.0, 0.0)] +```` + We now convert these boundary points to indices using [`convert_boundary_points_to_indices`](@ref), and then we triangulate. We also add a constrained edge. -````@example constrained_outer_boundary_segmented +````julia E = Set(((6, 9),)) # (0, 0) → (4, 6) boundary_nodes, points = convert_boundary_points_to_indices(boundary_points; existing_points=points) tri = triangulate(points; boundary_nodes, segments=E) ```` -````@example constrained_outer_boundary_segmented +```` +Delaunay Triangulation. + Number of vertices: 11 + Number of triangles: 14 + Number of edges: 24 + Has boundary nodes: true + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: true +```` + +````julia fig, ax, sc = triplot(tri, show_constrained_edges=true, constrained_edge_linewidth=6) lines!(ax, section_1, color=:red, linewidth=6) lines!(ax, section_2, color=:green, linewidth=6) @@ -57,6 +85,10 @@ lines!(ax, section_3, color=:blue, linewidth=6) fig ```` +```@raw html + +``` + The first section is in red, the second section is in green, and the third section is in blue. We use ghost vertices to identify the sections, where the first section is identified by `-1`, the second by `-2`, and the third by `-3`. @@ -65,25 +97,51 @@ Before we go into how the sections can be worked with, let us make a note regard now that we have both constrained segments and boundary segments which might technically both be thought of as being constrained edges. If we look at `get_interior_segments(tri)`, we get: -````@example constrained_outer_boundary_segmented +````julia get_interior_segments(tri) ```` +```` +Set{Tuple{Int64, Int64}} with 1 element: + (9, 6) +```` + This is just the constrained segment we provided, and not the boundary segment. If we instead want all constrained segments, considering both the boundary segments and the segments provided, we can instead use [`get_all_segments(tri)`](@ref get_all_segments). -````@example constrained_outer_boundary_segmented +````julia get_all_segments(tri) ```` +```` +Set{Tuple{Int64, Int64}} with 7 elements: + (9, 6) + (7, 8) + (8, 9) + (9, 10) + (6, 7) + (10, 11) + (11, 6) +```` + Let us now explore the several ways available for working with this boundary. First, if we just want to work with the boundary edges without caring about the order, we can again use the boundary edge map. -````@example constrained_outer_boundary_segmented +````julia get_boundary_edge_map(tri) ```` +```` +Dict{Tuple{Int64, Int64}, Tuple{Int64, Int64}} with 6 entries: + (7, 8) => (2, 1) + (8, 9) => (2, 2) + (9, 10) => (2, 3) + (6, 7) => (1, 1) + (10, 11) => (2, 4) + (11, 6) => (3, 1) +```` + Remember that the keys are the edges, and the values are `Tuples` that give us (1) the section index, and (2) the position of the edge within that section (more specifically, the position of the first vertex of the edge). This would be useful if, for example, you don't care about the order of the edges, but you do @@ -106,7 +164,7 @@ f(x, y) = \begin{cases} ``` and $\Gamma_i$ denotes the $i$th section. -````@example constrained_outer_boundary_segmented +````julia function section_function(x, y, section_index) f = if abs(section_index) == 1 1.0 @@ -133,25 +191,47 @@ end s = compute_sum(tri) ```` +```` +2.9351669864789773 +```` + An alternative way to look at each section is to use [`get_adjacent2vertex`](@ref) with the associated ghost vertex. -````@example constrained_outer_boundary_segmented +````julia get_adjacent2vertex(tri, -1) ```` -````@example constrained_outer_boundary_segmented +```` +Set{Tuple{Int64, Int64}} with 1 element: + (7, 6) +```` + +````julia get_adjacent2vertex(tri, -2) ```` -````@example constrained_outer_boundary_segmented +```` +Set{Tuple{Int64, Int64}} with 4 elements: + (10, 9) + (8, 7) + (11, 10) + (9, 8) +```` + +````julia get_adjacent2vertex(tri, -3) ```` +```` +Set{Tuple{Int64, Int64}} with 1 element: + (6, 11) +```` + Note that the provided edges are not in order, but this is helpful for considering specific sections. For example, if we just wanted to compute the above sum over the second section, we could do -````@example constrained_outer_boundary_segmented +````julia function compute_sum_2(tri) edges = get_adjacent2vertex(tri, -2) s = 0.0 @@ -168,21 +248,41 @@ end s = compute_sum_2(tri) ```` +```` +1.1812647321356726 +```` + If your application instead wanted all the nodes on the section rather than the edges, you can look at the neighbours to the ghost vertex. For example, all the nodes on the section section can be identified using -````@example constrained_outer_boundary_segmented +````julia get_neighbours(tri, -2) ```` +```` +Set{Int64} with 5 elements: + 7 + 11 + 10 + 9 + 8 +```` + Another field is the `ghost_vertex_map`, which maps a given ghost vertex to the associated section. This is more so useful for internal methods, but you may sometimes need it. -````@example constrained_outer_boundary_segmented +````julia get_ghost_vertex_map(tri) ```` +```` +Dict{Int64, Int64} with 3 entries: + -1 => 1 + -3 => 3 + -2 => 2 +```` + In this case, the `i`th section just has the ghost vertex `-i`, but this is typically used to deal with the case of multiple boundaries so that we know where a ghost vertex belongs. ## Just the code diff --git a/docs/src/tutorials/convex.md b/docs/src/tutorials/convex.md index cdd107500..cec03d99a 100644 --- a/docs/src/tutorials/convex.md +++ b/docs/src/tutorials/convex.md @@ -8,7 +8,7 @@ In this tutorial, we show how we can triangulate convex polygons. The function [`triangulate_convex`](@ref) is used for this. Let us start with a simple example. -````@example convex +````julia using DelaunayTriangulation using CairoMakie @@ -21,11 +21,27 @@ S = 1:7 tri = triangulate_convex(points, 1:7) ```` -````@example convex +```` +Delaunay Triangulation. + Number of vertices: 7 + Number of triangles: 5 + Number of edges: 11 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: false +```` + +````julia fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + This `tri` is our triangulation of the convex polygon. The first input is the set of points, and `S` defines the vertices to take from these points and their order, @@ -37,7 +53,7 @@ needed. Let us give a larger example. For simplicity, we triangulate a a discretised circle. -````@example convex +````julia θ = LinRange(0, 2π, 5000) |> collect pop!(θ) x = cos.(θ) @@ -47,24 +63,66 @@ S = 1:4999 # can also be [1:4999; 1], if you want the array to be circular tri = triangulate_convex(points, S) ```` -````@example convex +```` +Delaunay Triangulation. + Number of vertices: 4999 + Number of triangles: 4997 + Number of edges: 9995 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: false +```` + +````julia fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Here is a comparison of the time it takes to triangulate this using `triangulate_convex` or `triangulate`. -````@example convex +````julia using BenchmarkTools @benchmark triangulate_convex($points, $S) ```` -````@example convex +```` +BenchmarkTools.Trial: 63 samples with 1 evaluation. + Range (min … max): 49.190 ms … 321.321 ms ┊ GC (min … max): 0.00% … 24.77% + Time (median): 61.254 ms ┊ GC (median): 0.00% + Time (mean ± σ): 80.549 ms ± 44.465 ms ┊ GC (mean ± σ): 12.58% ± 13.85% + + ▄███ ▁ + ████▆▆▇▄▆▄▄▆▁▄▄▁▁▄▁▇▆▁█▁▁▁▆▁▁▁▁▁▁▁▆▁▁▁▁▁▁▁▄▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▄ ▁ + 49.2 ms Histogram: frequency by time 212 ms < + + Memory estimate: 29.43 MiB, allocs estimate: 583522. +```` + +````julia @benchmark triangulate($points) ```` -For the smaller example that we started above, `triangulate_convex` is also +```` +BenchmarkTools.Trial: 11 samples with 1 evaluation. + Range (min … max): 394.357 ms … 656.843 ms ┊ GC (min … max): 0.00% … 0.00% + Time (median): 455.372 ms ┊ GC (median): 0.00% + Time (mean ± σ): 488.970 ms ± 92.472 ms ┊ GC (mean ± σ): 1.13% ± 3.85% + + █ ▁ ▁▁ ▁ ▁ ▁ ▁ ▁ ▁ + █▁▁▁█▁▁▁▁██▁▁▁█▁▁▁▁█▁▁▁▁▁▁▁▁█▁▁▁▁▁▁█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█▁▁█ ▁ + 394 ms Histogram: frequency by time 657 ms < + + Memory estimate: 32.43 MiB, allocs estimate: 617044. +```` + +For the smaller example that we started with above, `triangulate_convex` is also faster, although not by much (≈15.10 μs versus ≈10.7 μs). ## Just the code An uncommented version of this example is given below. diff --git a/docs/src/tutorials/convex_hull.md b/docs/src/tutorials/convex_hull.md index a4a2dec5d..fb15bcb51 100644 --- a/docs/src/tutorials/convex_hull.md +++ b/docs/src/tutorials/convex_hull.md @@ -13,7 +13,7 @@ from the point set directly, using the [monotone chain algorithm](https://en.wik Let us first demonstrate how we compute convex hulls from a triangulation. This is only possible from triangulations without a constrained boundary -````@example convex_hull +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -21,30 +21,72 @@ using StableRNGs We construct a triangulation of a point set. -````@example convex_hull +````julia rng = StableRNG(123) points = randn(rng, 2, 250) tri = triangulate(points; rng) ```` +```` +Delaunay Triangulation. + Number of vertices: 250 + Number of triangles: 489 + Number of edges: 738 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: false +```` + To get the convex hull, just use [`get_convex_hull`](@ref): -````@example convex_hull +````julia get_convex_hull(tri) ```` +```` +Convex hull. + Vertices: +10-element Vector{Int64}: + 151 + 96 + 43 + 159 + 25 + 147 + 65 + 206 + 199 + 151 +```` + You can also obtain the vertices directly from [`get_convex_hull_vertices`](@ref): -````@example convex_hull +````julia get_convex_hull_vertices(tri) ```` +```` +10-element Vector{Int64}: + 151 + 96 + 43 + 159 + 25 + 147 + 65 + 206 + 199 + 151 +```` + The vertices refer to indices of points in `points`, and they are given in counter-clockwise order. To obtain the convex hull directly from the points without constructing the triangulation, use [`convex_hull`](@ref): -````@example convex_hull +````julia ch = convex_hull(points) ch_points = [get_point(tri, i) for i in DelaunayTriangulation.get_vertices(ch)] fig, ax, sc = lines(ch_points, color=:red, linewidth=4) @@ -52,6 +94,10 @@ scatter!(ax, points) fig ```` +```@raw html + +``` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/convex_hull.jl). diff --git a/docs/src/tutorials/curve_bounded.md b/docs/src/tutorials/curve_bounded.md index 889dce4c4..c339b3108 100644 --- a/docs/src/tutorials/curve_bounded.md +++ b/docs/src/tutorials/curve_bounded.md @@ -10,7 +10,7 @@ of functions introduced in the [refinement tutorial](../tutorials/refinement.md) Let us start by loading in the packages we will need. -````@example curve_bounded +````julia using DelaunayTriangulation using DelaunayTriangulation: EllipticalArc # CairoMakie also exports this using CairoMakie @@ -38,7 +38,7 @@ We start with a simple domain: a circle. In particular, we consider a circle of radius $r = 2$ centered at $(x, y) = (1/2, 2)$. In past tutorials, we would have defined a domain like this by a set of points around a boundary, e.g.: -````@example curve_bounded +````julia n = 50 r = 2.0 xc, yc = 1 / 2, 2.0 @@ -46,50 +46,2581 @@ xc, yc = 1 / 2, 2.0 θ[end] = θ[begin]; x = xc .+ r * cos.(θ) y = yc .+ r * sin.(θ); -nothing #hide ```` One problem with this approach is that we had to decide what value of $n$ to use for discretising this boundary. Instead, we can use `CircularArc`. For this, we use: -````@example curve_bounded +````julia p = (xc + r, yc) c = (xc, yc) arc = CircularArc(p, p, c) ```` +```` +(::CircularArc) (generic function with 1 method) +```` + Here, the syntax is `CircularArc(first_point, last_point, centre)`. Since the circle is closed, we use `p` for both `first_point` and `last_point`. Notice that the `arc` is a function. In particular, -````@example curve_bounded -typeof(arc) |> supertype +````julia +typeof(arc) |> supertype |> supertype +```` + +```` +Function ```` If we wanted to look at this circle, we would need to evaluate it at a set of $t \in [0, 1]$. -````@example curve_bounded +````julia t = LinRange(0, 1, 2500) points = arc.(t) ```` -````@example curve_bounded +```` +2500-element Vector{Tuple{Float64, Float64}}: + (2.5, 2.0) + (2.4999936784002426, 2.00502855437152) + (2.499974713640933, 2.0100570769545323) + (2.4999431058419583, 2.015085535960729) + (2.4998988552031305, 2.0201138996022054) + (2.499841962004185, 2.0251421360916586) + (2.4997724266047774, 2.0301702136425908) + (2.499690249444483, 2.0351981004695077) + (2.4995954310427924, 2.0402257647881212) + (2.49948797199911, 2.0452531748155494) + (2.4993678729927487, 2.0502802987705193) + (2.499235134782926, 2.055307104873564) + (2.4990897582087603, 2.0603335613472287) + (2.498931744189264, 2.065359636416266) + (2.4987610937233384, 2.070385298307842) + (2.4985778078897676, 2.0754105152517326) + (2.498381887847211, 2.0804352554805288) + (2.4981733348341963, 2.0854594872298335) + (2.4979521501691133, 2.0904831787384643) + (2.497718335250202, 2.0955062982486545) + (2.4974718915555476, 2.100528814006253) + (2.4972128206430675, 2.105550694260925) + (2.4969411241505046, 2.1105719072663534) + (2.4966568037954158, 2.1155924212804402) + (2.4963598613751605, 2.1206122045655045) + (2.496050298766889, 2.1256312253884855) + (2.4957281179275332, 2.1306494520211428) + (2.4953933208937915, 2.135666852740256) + (2.495045909782116, 2.1406833958278253) + (2.494685886788701, 2.1456990495712738) + (2.494313254189468, 2.150713782263646) + (2.4939280143400513, 2.155727562203809) + (2.493530169675782, 2.1607403576966524) + (2.493119722711676, 2.165752137053289) + (2.4926966760424136, 2.170762868591257) + (2.492261032342328, 2.175772520634716) + (2.491812794365383, 2.1807810615146512) + (2.49135196494516, 2.1857884595690718) + (2.490878546994839, 2.1907946831432112) + (2.490392543507178, 2.1957997005897285) + (2.4898939575544965, 2.2008034802689056) + (2.489382792288655, 2.2058059905488503) + (2.488859050941037, 2.2108071998056955) + (2.488322736822524, 2.2158070764237974) + (2.487773853323481, 2.2208055887959373) + (2.4872124039137287, 2.2258027053235208) + (2.4866383921425252, 2.2307983944167766) + (2.486051821638544, 2.235792624494959) + (2.485452696109849, 2.240785363986543) + (2.4848410193438717, 2.2457765813294284) + (2.4842167952073875, 2.2507662449711368) + (2.483580027646492, 2.255754323369012) + (2.482930720686575, 2.2607407849904186) + (2.4822688784322953, 2.265725598312942) + (2.481594505067554, 2.2707087318245875) + (2.48090760485547, 2.27569015402398) + (2.4802081821383517, 2.280669833420561) + (2.479496241337669, 2.2856477385347915) + (2.4787717869540273, 2.2906238378983472) + (2.4780348235671372, 2.29559810005432) + (2.4772853558357864, 2.300570493557415) + (2.4765233884978093, 2.3055409869741506) + (2.475748926370059, 2.3105095488830574) + (2.474961974348375, 2.315476147874875) + (2.474162537407552, 2.320440752552753) + (2.4733506206013125, 2.325403331532447) + (2.4725262290622676, 2.3303638534425195) + (2.4716893680018917, 2.3353222869245363) + (2.470840042710485, 2.3402786006332654) + (2.4699782585571426, 2.345232763236875) + (2.469104020989718, 2.3501847434171323) + (2.468217335534793, 2.355134509869601) + (2.4673182077976357, 2.3600820313038375) + (2.466406643462174, 2.365027276443593) + (2.4654826482909513, 2.3699702140270054) + (2.464546228125096, 2.374910812806803) + (2.4635973888842813, 2.3798490415504974) + (2.4626361365666893, 2.384784869040583) + (2.461662477248973, 2.389718264074733) + (2.4606764170862157, 2.394649195466) + (2.459677962311895, 2.3995776320430084) + (2.4586671192378438, 2.404503542650155) + (2.4576438942542067, 2.4094268961478047) + (2.456608293829402, 2.414347661412487) + (2.4555603245100817, 2.419265807337093) + (2.454499992921088, 2.4241813028310735) + (2.4534273057654135, 2.4290941168206324) + (2.452342269824156, 2.4340042182489268) + (2.4512448919564793, 2.4389115760762605) + (2.450135179099567, 2.443816159280281) + (2.4490131382685796, 2.4487179368561764) + (2.4478787765566095, 2.4536168778168714) + (2.446732101134638, 2.4585129511932218) + (2.4455731192514882, 2.4634061260342106) + (2.4444018382337793, 2.468296371407146) + (2.4432182654858816, 2.473183656397853) + (2.4420224084898683, 2.4780679501108724) + (2.4408142748054678, 2.4829492216696547) + (2.439593872070019, 2.4878274402167544) + (2.4383612079984185, 2.492702574914026) + (2.437116290383076, 2.4975745949428196) + (2.4358591270938614, 2.5024434695041746) + (2.434589726078059, 2.507309167819015) + (2.433308095360313, 2.5121716591283425) + (2.4320142430425804, 2.5170309126934343) + (2.4307081773040773, 2.5218868977960334) + (2.429389906401229, 2.5267395837385465) + (2.428059438667616, 2.531588939844234) + (2.4267167825139238, 2.536434935457409) + (2.425361946427886, 2.541277539943626) + (2.4239949389742343, 2.5461167226898773) + (2.4226157687946435, 2.550952453104787) + (2.4212244446076747, 2.555784700618803) + (2.4198209752087223, 2.5606134346843907) + (2.4184053694699594, 2.565438624776225) + (2.4169776363402775, 2.570260240391386) + (2.415537784845235, 2.5750782510495505) + (2.4140858240869965, 2.579892626293182) + (2.4126217632442764, 2.5847033356877276) + (2.4111456115722816, 2.5895103488218085) + (2.409657378402652, 2.5943136353074108) + (2.4081570731434025, 2.5991131647800807) + (2.406644705278862, 2.6039089068991133) + (2.405120284369615, 2.6087008313477464) + (2.4035838200524404, 2.613488907833352) + (2.40203532204025, 2.618273106087626) + (2.40047480012203, 2.623053395866783) + (2.398902264162774, 2.6278297469517438) + (2.3973177241034254, 2.6326021291483284) + (2.3957211899608124, 2.6373705122874465) + (2.3941126718275845, 2.642134866225289) + (2.3924921798721495, 2.646895160843517) + (2.3908597243386094, 2.6516513660494527) + (2.3892153155466946, 2.656403451776271) + (2.387558963891699, 2.661151387983188) + (2.3858906798444153, 2.665895144655651) + (2.3842104739510668, 2.6706346918055286) + (2.382518356833243, 2.675369999471301) + (2.3808143391878316, 2.6801010377182495) + (2.37909843178695, 2.684827776638642) + (2.3773706454778774, 2.689550186351928) + (2.3756309911829874, 2.6942682370049233) + (2.3738794798996787, 2.698981898772) + (2.3721161227003043, 2.7036911418552747) + (2.370340930732102, 2.708395936484798) + (2.3685539152171264, 2.713096252918741) + (2.366755087452173, 2.717792061443584) + (2.3649444588087114, 2.722483332374306) + (2.3631220407328115, 2.7271700360545688) + (2.361287844745071, 2.7318521428569085) + (2.3594418824405423, 2.736529623182919) + (2.3575841654886602, 2.7412024474634427) + (2.3557147056331686, 2.7458705861587536) + (2.3538335146920435, 2.750534009758748) + (2.351940604557422, 2.755192688783129) + (2.350035987195523, 2.759846593781591) + (2.3481196746465764, 2.7644956953340105) + (2.3461916790247432, 2.7691399640506273) + (2.344252012518039, 2.7737793705722344) + (2.34230068738826, 2.7784138855703597) + (2.340337715970902, 2.7830434797474553) + (2.3383631106750853, 2.7876681238370784) + (2.3363768839834744, 2.7922877886040816) + (2.334379048452198, 2.7969024448447923) + (2.332369616710775, 2.801512063387201) + (2.3303486014620267, 2.806116615091144) + (2.3283160154820033, 2.8107160708484886) + (2.3262718716199, 2.815310401583316) + (2.3242161827979757, 2.819899578252107) + (2.3221489620114726, 2.8244835718439227) + (2.320070222328533, 2.829062353380591) + (2.317979976890118, 2.8336358939168864) + (2.3158782389099213, 2.8382041645407177) + (2.31376502167429, 2.8427671363733054) + (2.311640338542138, 2.847324780569368) + (2.3095042029448605, 2.851877068317304) + (2.307356628386253, 2.8564239708393706) + (2.305197628442422, 2.8609654593918714) + (2.3030272167617003, 2.8655015052653328) + (2.3008454070645623, 2.8700320797846883) + (2.2986522131435363, 2.874557154309459) + (2.296447648863116, 2.8790767002339352) + (2.2942317281596734, 2.883590688987357) + (2.292004465041374, 2.8880990920340928) + (2.2897658735880824, 2.892601880873824) + (2.287515967951278, 2.8970990270417216) + (2.285254762353965, 2.9015905021086272) + (2.282982271090579, 2.906076277681234) + (2.2806985085269007, 2.910556325402263) + (2.2784034890999623, 2.915030616950646) + (2.2760972273179587, 2.919499124041703) + (2.2737797377601536, 2.923961818427321) + (2.2714510350767885, 2.928418671896131) + (2.2691111339889893, 2.93286965627369) + (2.2667600492886746, 2.937314743422656) + (2.264397795838461, 2.9417539052429675) + (2.262024388571569, 2.9461871136720204) + (2.2596398424917297, 2.950614340684844) + (2.2572441726730883, 2.955035558294283) + (2.254837394260112, 2.959450738551168) + (2.2524195224674886, 2.9638598535444967) + (2.249990572580038, 2.968262875401609) + (2.2475505599526073, 2.972659776288363) + (2.245099500009981, 2.977050528409311) + (2.242637408246779, 2.9814351040078755) + (2.240164300227359, 2.985813475366525) + (2.2376801915857207, 2.9901856148069474) + (2.235185098025405, 2.994551494690227) + (2.2326790353193946, 2.9989110874170195) + (2.2301620193100145, 3.003264365427724) + (2.2276340659088323, 3.007611301202659) + (2.2250951910965586, 3.011951867262237) + (2.222545410922943, 3.016286036167136) + (2.219984741506676, 3.0206137805184756) + (2.217413199035283, 3.0249350729579874) + (2.2148307997650285, 3.0292498861681905) + (2.2122375600208057, 3.033558192872563) + (2.2096334961960387, 3.037859965835714) + (2.2070186247525765, 3.042155177863557) + (2.2043929622205907, 3.04644380180348) + (2.2017565251984674, 3.0507258105445194) + (2.199109330352708, 3.05500117701753) + (2.1964513944178172, 3.0592698741953552) + (2.193782734196203, 3.063531875093001) + (2.1911033665580675, 3.067787152767803) + (2.1884133084412998, 3.072035680319599) + (2.1857125768513708, 3.0762774308908982) + (2.1830011888612244, 3.080512377667051) + (2.180279161611171, 3.08474049387642) + (2.1775465123087776, 3.0889617527905453) + (2.174803258228758, 3.0931761277243184) + (2.172049416712868, 3.097383592036148) + (2.1692850051697903, 3.1015841191281277) + (2.1665100410750293, 3.105777682446207) + (2.1637245419707964, 3.1099642554803575) + (2.160928525465902, 3.1141438117647398) + (2.158122009235645, 3.1183163248778714) + (2.155305011021695, 3.1224817684427952) + (2.15247754863199, 3.126640116127244) + (2.149639639940614, 3.130791341643808) + (2.1467913028876895, 3.1349354187501) + (2.1439325554792648, 3.139072321248925) + (2.1410634157871957, 3.1432020229884396) + (2.1381839019490356, 3.147324497862323) + (2.135294032167918, 3.1514397198099395) + (2.1323938247124437, 3.1555476628165025) + (2.129483297916562, 3.15964830091324) + (2.1265624701794605, 3.16374160817756) + (2.123631359965441, 3.167827558733211) + (2.1206899858038106, 3.171906126750451) + (2.117738366288759, 3.175977286446204) + (2.114776520079243, 3.180041012084228) + (2.11180446589887, 3.1840972779752765) + (2.1088222225357756, 3.188146058477259) + (2.1058298088425094, 3.1921873279954074) + (2.1028272437359132, 3.196221060982432) + (2.0998145461970017, 3.2002472319386874) + (2.096791735270843, 3.2042658154123322) + (2.093758830066438, 3.208276785999491) + (2.0907158497565987, 3.212280118344412) + (2.0876628135778303, 3.2162757871396304) + (2.084599740830204, 3.2202637671261285) + (2.0815266508772403, 3.224244033093492) + (2.0784435631457843, 3.2282165598800727) + (2.075350497125882, 3.2321813223731466) + (2.0722474723706594, 3.236138295509072) + (2.0691345084961963, 3.2400874542734472) + (2.0660116251814054, 3.2440287737012734) + (2.0628788421679043, 3.247962228877105) + (2.059736179259893, 3.2518877949352127) + (2.0565836563240296, 3.2558054470597404) + (2.0534212932893023, 3.259715160484858) + (2.0502491101469036, 3.263616910494923) + (2.047067126950106, 3.267510672424632) + (2.0438753638141343, 3.2713964216591824) + (2.040673840916037, 3.275274133634422) + (2.0374625784945604, 3.2791437838370077) + (2.0342415968500207, 3.2830053478045595) + (2.031010916344174, 3.286858801125816) + (2.02777055740009, 3.290704119440787) + (2.024520540502021, 3.29454127844091) + (2.021260886195273, 3.2983702538692006) + (2.0179916150860757, 3.30219102152041) + (2.014712747841452, 3.306003557241173) + (2.0114243051890894, 3.309807836930165) + (2.008126307917206, 3.3136038365382534) + (2.0048187768744192, 3.3173915320686467) + (2.0015017329696185, 3.3211708995770506) + (1.998175197171826, 3.324941915171816) + (1.9948391905100709, 3.328704555014092) + (1.9914937340732513, 3.332458795317975) + (1.988138849010004, 3.3362046123506612) + (1.98477455652857, 3.3399419824325935) + (1.9814008778966594, 3.343670881937615) + (1.9780178344413182, 3.3473912872931146) + (1.9746254475487934, 3.351103174980179) + (1.971223738664397, 3.3548065215337406) + (1.9678127292923708, 3.3585013035427242) + (1.9643924409957514, 3.362187497650197) + (1.9609628953962321, 3.3658650805535144) + (1.9575241141740274, 3.36953402900447) + (1.954076119067736, 3.37319431980944) + (1.9506189318742029, 3.376845929829531) + (1.947152574448382, 3.380488835980726) + (1.9436770687031972, 3.3841230152340303) + (1.9401924366094052, 3.387748444615617) + (1.9366987001954552, 3.391365101206973) + (1.9331958815473504, 3.394972962145042) + (1.9296840028085085, 3.3985720046223724) + (1.9261630861796208, 3.402162205887257) + (1.9226331539185137, 3.405743543243881) + (1.9190942283400056, 3.4093159940524638) + (1.915546331815768, 3.4128795357293997) + (1.9119894867741825, 3.416434145747405) + (1.9084237157001995, 3.4199798016356584) + (1.904849041135197, 3.4235164809799423) + (1.901265485676837, 3.427044161422785) + (1.897673071978922, 3.430562820663603) + (1.8940718227512545, 3.43407243645884) + (1.8904617607594907, 3.4375729866221114) + (1.8868429088249967, 3.441064449024339) + (1.883215289824707, 3.444546801593895) + (1.8795789266909766, 3.44802002231674) + (1.8759338424114373, 3.451484089236564) + (1.872280060028854, 3.454938980454921) + (1.8686176026409755, 3.458384674131372) + (1.8649464934003928, 3.4618211484836205) + (1.861266755514388, 3.4652483817876516) + (1.8575784122447914, 3.468666352377868) + (1.8538814869078337, 3.4720750386472266) + (1.8501760028739964, 3.4754744190473783) + (1.8464619835678666, 3.4788644720888002) + (1.8427394524679885, 3.4822451763409337) + (1.8390084331067131, 3.4856165104323207) + (1.8352689490700513, 3.488978453050735) + (1.8315210239975255, 3.492330982943322) + (1.827764681582017, 3.495674078916729) + (1.8239999455696192, 3.499007719837241) + (1.8202268397594867, 3.5023318846309155) + (1.8164453880036846, 3.5056465522837117) + (1.8126556142070362, 3.508951701841629) + (1.808857542326976, 3.5122473124108335) + (1.8050511963733935, 3.515533363157794) + (1.801236600408484, 3.5188098333094144) + (1.7974137785465976, 3.5220767021531603) + (1.793582754954083, 3.5253339490371953) + (1.7897435538491384, 3.5285815533705076) + (1.7858961995016567, 3.5318194946230435) + (1.7820407162330723, 3.535047752325833) + (1.7781771284162065, 3.538266306071124) + (1.774305460475116, 3.541475135512507) + (1.7704257368849357, 3.5446742203650476) + (1.7665379821717249, 3.5478635404054115) + (1.7626422209123134, 3.551043075471994) + (1.7587384777341444, 3.5542128054650464) + (1.7548267773151194, 3.5573727103468045) + (1.7509071443834436, 3.5605227701416147) + (1.7469796037174672, 3.56366296493606) + (1.74304418014553, 3.5667932748790845) + (1.7391008985458056, 3.5699136801821227) + (1.7351497838461412, 3.5730241611192213) + (1.7311908610239026, 3.576124698027165) + (1.7272241551058158, 3.579215271305599) + (1.7232496911678077, 3.5822958614171574) + (1.719267494334848, 3.585366448887582) + (1.7152775897807926, 3.588427014305847) + (1.71128000272822, 3.591477538324284) + (1.7072747584482757, 3.594518001658701) + (1.7032618822605117, 3.5975483850885053) + (1.6992413995327242, 3.6005686694568255) + (1.6952133356807961, 3.6035788356706338) + (1.6911777161685355, 3.6065788647008628) + (1.687134566507513, 3.6095687375825296) + (1.6830839122569026, 3.6125484354148565) + (1.6790257790233196, 3.6155179393613848) + (1.6749601924606579, 3.618477230650099) + (1.6708871782699282, 3.621426290573545) + (1.6668067621990965, 3.6243651004889452) + (1.66271897004292, 3.62729364181832) + (1.658623827642784, 3.6302118960486043) + (1.6545213608865406, 3.6331198447317608) + (1.6504115957083418, 3.6360174694849032) + (1.646294558088479, 3.6389047519904074) + (1.6421702740532154, 3.6417816739960287) + (1.6380387696746246, 3.644648217315018) + (1.633900071070423, 3.6475043638262354) + (1.6297542044038076, 3.6503500954742663) + (1.6256011958832874, 3.6531853942695336) + (1.62144107176252, 3.6560102422884135) + (1.6172738583401458, 3.6588246216733475) + (1.6130995819596197, 3.661628514632955) + (1.6089182690090458, 3.6644219034421477) + (1.6047299459210116, 3.667204770442239) + (1.6005346391724196, 3.6699770980410578) + (1.5963323752843188, 3.6727388687130587) + (1.5921231808217406, 3.675490064999433) + (1.5879070823935275, 3.6782306695082183) + (1.5836841066521659, 3.6809606649144104) + (1.5794542802936185, 3.683680033960071) + (1.5752176300571548, 3.686388759454437) + (1.5709741827251813, 3.689086824274031) + (1.5667239651230744, 3.691774211362765) + (1.5624670041190083, 3.694450903732055) + (1.5582033266237862, 3.6971168844609235) + (1.5539329595906717, 3.6997721366961063) + (1.5496559300152153, 3.702416643652162) + (1.5453722649350858, 3.7050503886115767) + (1.5410819914299003, 3.707673354924868) + (1.5367851366210503, 3.710285526010692) + (1.5324817276715315, 3.7128868853559505) + (1.528171791785774, 3.7154774165158897) + (1.5238553562094668, 3.7180571031142087) + (1.5195324482293877, 3.720625928843161) + (1.5152030951732316, 3.7231838774636588) + (1.510867324409435, 3.725730932805375) + (1.5065251633470054, 3.7282670787668453) + (1.5021766394353475, 3.730792299315569) + (1.4978217801640885, 3.733306578488113) + (1.4934606130629065, 3.735809900390211) + (1.4890931657013537, 3.738302249196863) + (1.4847194656886842, 3.740783609152439) + (1.4803395406736795, 3.7432539645707736) + (1.4759534183444725, 3.745713299835268) + (1.4715611264283721, 3.7481615993989896) + (1.4671626926916908, 3.7505988477847683) + (1.4627581449395661, 3.753025029585295) + (1.4583475110157853, 3.7554401294632207) + (1.4539308188026117, 3.7578441321512495) + (1.4495080962206055, 3.7602370224522383) + (1.4450793712284478, 3.762618785239293) + (1.4406446718227668, 3.7649894054558626) + (1.4362040260379563, 3.7673488681158345) + (1.4317574619460016, 3.7696971583036305) + (1.4273050076563019, 3.7720342611742996) + (1.4228466913154905, 3.774360161953613) + (1.4183825411072588, 3.776674845938157) + (1.4139125852521781, 3.778978298495426) + (1.4094368520075204, 3.7812705050639144) + (1.404955369667079, 3.78355145115321) + (1.4004681665609926, 3.785821122344084) + (1.3959752710555626, 3.788079504288585) + (1.3914767115530766, 3.790326582710125) + (1.386972516491627, 3.7925623434035733) + (1.3824627143449322, 3.794786772235347) + (1.3779473336221562, 3.796999855143496) + (1.3734264028677292, 3.7992015781377972) + (1.3688999506611657, 3.8013919272998375) + (1.3643680056168843, 3.803570888783108) + (1.359830596384029, 3.8057384488130848) + (1.3552877516462836, 3.8078945936873216) + (1.3507395001216946, 3.8100393097755334) + (1.3461858705624885, 3.8121725835196836) + (1.3416268917548881, 3.8142944014340685) + (1.3370625925189326, 3.8164047501054066) + (1.3324930017082957, 3.818503616192916) + (1.3279181482101008, 3.820590986428406) + (1.3233380609447407, 3.8226668476163583) + (1.3187527688656946, 3.824731186634009) + (1.3141623009593433, 3.8267839904314322) + (1.3095666862447874, 3.828825246031625) + (1.3049659537736646, 3.8308549405305854) + (1.3003601326299634, 3.8328730610973984) + (1.2957492519298417, 3.8348795949743124) + (1.2911333408214423, 3.836874529476824) + (1.2865124284847074, 3.8388578519937555) + (1.2818865441311948, 3.840829549987336) + (1.277255717003895, 3.842789610993279) + (1.272619976377043, 3.8447380226208647) + (1.2679793515559352, 3.8466747725530137) + (1.2633338718767453, 3.8485998485463684) + (1.2586835667063363, 3.850513238431369) + (1.2540284654420755, 3.85241493011233) + (1.2493685975116506, 3.8543049115675183) + (1.2447039923728815, 3.856183170849227) + (1.2400346795135344, 3.8580496960838535) + (1.2353606884511374, 3.8599044754719714) + (1.2306820487327905, 3.861747497288408) + (1.225998789934981, 3.863578749882318) + (1.2213109416633974, 3.865398221677254) + (1.2166185335527402, 3.8672059011712445) + (1.2119215952665345, 3.869001776936863) + (1.2072201564969454, 3.870785837621302) + (1.202514246964586, 3.872558071946443) + (1.1978038964183337, 3.874318468708931) + (1.193089134635139, 3.876067016780241) + (1.1883699914198385, 3.8778037051067535) + (1.1836464966049676, 3.879528522709819) + (1.178918680050569, 3.881241458685831) + (1.1741865716440079, 3.8829425022062938) + (1.1694502012997785, 3.884631642517892) + (1.1647095989593192, 3.886308868942555) + (1.1599647945908205, 3.8879741708775297) + (1.1552158181890357, 3.889627537795444) + (1.1504626997750944, 3.8912689592443734) + (1.1457054693963076, 3.8928984248479086) + (1.1409441571259817, 3.894515924305221) + (1.1361787930632279, 3.896121447391125) + (1.1314094073327703, 3.8977149839561473) + (1.126636030084756, 3.899296523926587) + (1.121858691494566, 3.900866057304582) + (1.117077421762623, 3.9024235741681697) + (1.1122922511141997, 3.9039690646713527) + (1.1075032097992306, 3.905502519044158) + (1.1027103280921178, 3.907023927592701) + (1.0979136362915407, 3.9085332806992463) + (1.0931131647202659, 3.9100305688222665) + (1.0883089437249527, 3.9115157824965063) + (1.0835010036759631, 3.912988912333039) + (1.0786893749671709, 3.9144499490193274) + (1.0738740880157658, 3.915898883319282) + (1.0690551732620648, 3.917335706073321) + (1.0642326611693191, 3.9187604081984255) + (1.0594065822235188, 3.9201729806881986) + (1.0545769669332046, 3.9215734146129226) + (1.0497438458292705, 3.9229617011196147) + (1.0449072494647735, 3.9243378314320836) + (1.040067208414741, 3.925701796850984) + (1.0352237532759747, 3.9270535887538722) + (1.030376914666859, 3.9283931985952614) + (1.0255267232271685, 3.929720617906674) + (1.0206732096178723, 3.9310358382966957) + (1.0158164045209397, 3.932338851451031) + (1.0109563386391498, 3.9336296491325515) + (1.0060930426958934, 3.934908223181351) + (1.0012265474349809, 3.936174565514796) + (0.9963568836204479, 3.937428668127577) + (0.9914840820363597, 3.9386705230917594) + (0.9866081734866174, 3.9399001225568338) + (0.9817291887947641, 3.9411174587497633) + (0.9768471588037876, 3.9423225239750366) + (0.9719621143759273, 3.943515310614713) + (0.9670740863924796, 3.944695811128473) + (0.9621831057536001, 3.9458640180536655) + (0.957289203378112, 3.947019924005353) + (0.9523924102033061, 3.9481635216763618) + (0.94749275718475, 3.949294803837324) + (0.9425902752960889, 3.9504137633367264) + (0.93768499552885, 3.951520393100956) + (0.9327769488922502, 3.952614686134342) + (0.9278661664129947, 3.9536966355192016) + (0.9229526791350857, 3.9547662344158834) + (0.9180365181196231, 3.9558234760628124) + (0.9131177144446083, 3.956868353776529) + (0.9081962992047505, 3.957900860951735) + (0.9032723035112667, 3.9589209910613334) + (0.8983457584916864, 3.95992873765647) + (0.8934166952896563, 3.9609240943665736) + (0.8884851450647405, 3.9619070548993975) + (0.8835511389922255, 3.9628776130410595) + (0.8786147082629238, 3.9638357626560783) + (0.8736758840829741, 3.9647814976874165) + (0.8687346976736456, 3.9657148121565156) + (0.8637911802711424, 3.9666357001633346) + (0.8588453631264021, 3.9675441558863884) + (0.853897277504901, 3.968440173582784) + (0.8489469546864565, 3.9693237475882546) + (0.8439944259650278, 3.970194872317201) + (0.8390397226485191, 3.9710535422627196) + (0.8340828760585823, 3.971899751996644) + (0.8291239175304173, 3.972733496169574) + (0.8241628784125745, 3.9735547695109137) + (0.8191997900667587, 3.9743635668289) + (0.8142346838676273, 3.975159883010642) + (0.8092675912025942, 3.975943713022146) + (0.8042985434716319, 3.976715051908353) + (0.7993275720870711, 3.9774738947931674) + (0.7943547084734026, 3.978220236879488) + (0.789379984067081, 3.978954073449239) + (0.7844034303163222, 3.979675399863399) + (0.7794250786809069, 3.9803842115620314) + (0.7744449606319823, 3.9810805040643125) + (0.7694631076518613, 3.981764272968559) + (0.7644795512338238, 3.9824355139522583) + (0.7594943228819198, 3.9830942227720936) + (0.7545074541107673, 3.983740395263971) + (0.7495189764453539, 3.984374027343047) + (0.7445289214208402, 3.984995115003753) + (0.7395373205823557, 3.9856036543198208) + (0.7345442054848037, 3.9861996414443093) + (0.729549607692659, 3.986783072609626) + (0.7245535587797703, 3.9873539441275527) + (0.7195560903291585, 3.9879122523892683) + (0.7145572339328197, 3.9884579938653717) + (0.709557021191523, 3.9889911651059027) + (0.7045554837146113, 3.9895117627403667) + (0.699552653119804, 3.990019783477754) + (0.6945485610329931, 3.9905152241065607) + (0.6895432390880455, 3.9909980814948094) + (0.6845367189266041, 3.991468352590069) + (0.679529032197885, 3.991926034419474) + (0.6745202105584791, 3.9923711240897424) + (0.6695102856721529, 3.992803618787196) + (0.664499289209646, 3.993223515777777) + (0.6594872528484717, 3.9936308124070634) + (0.6544742082727191, 3.99402550610029) + (0.6494601871728488, 3.99440759436236) + (0.6444452212454951, 3.9947770747778657) + (0.6394293421932663, 3.9951339450110996) + (0.6344125817245416, 3.99547820280607) + (0.6293949715532725, 3.9958098459865177) + (0.6243765433987831, 3.9961288724559267) + (0.6193573289855671, 3.9964352801975402) + (0.6143373600430886, 3.9967290672743703) + (0.6093166683055831, 3.997010231829213) + (0.6042952855118533, 3.9972787720846585) + (0.5992732434050723, 3.9975346863431023) + (0.5942505737325798, 3.997777972986758) + (0.5892273082456829, 3.998008630477664) + (0.5842034786994563, 3.998226657357696) + (0.5791791168525392, 3.9984320522485755) + (0.5741542544669357, 3.998624813851878) + (0.5691289233078156, 3.998804940949042) + (0.5641031551433107, 3.998972432401376) + (0.5590769817443153, 3.999127287150066) + (0.5540504348842868, 3.9992695042161825) + (0.5490235463390425, 3.999399082700686) + (0.5439963478865589, 3.9995160217844328) + (0.5389688713067736, 3.999620320728182) + (0.533941148381381, 3.999711978872596) + (0.5289132108936325, 3.999790995638249) + (0.5238850906281376, 3.9998573705256297) + (0.5188568193706594, 3.9999111031151413) + (0.5138284289079161, 3.999952193067109) + (0.5087999510273804, 3.9999806401217777) + (0.503771417517076, 3.9999964440993168) + (0.49874286016538, 3.99999960489982) + (0.49371431076081884, 3.9999901225033057) + (0.48868580109186877, 3.999967996969718) + (0.48365736294675626, 3.999933228438926) + (0.4786290281132537, 3.999885817130722) + (0.47360082837848233, 3.9998257633448215) + (0.46857279552870784, 3.99975306746086) + (0.4635449613491415, 3.999667729938393) + (0.45851735762373785, 3.9995697513168884) + (0.453490016134997, 3.9994591322157294) + (0.4484629686637589, 3.999335873334205) + (0.4434362469890056, 3.999199975451508) + (0.4384098828876596, 3.999051439426732) + (0.433383908134383, 3.9988902661988606) + (0.4283583545013757, 3.9987164567867675) + (0.4233332537581781, 3.998530012289206) + (0.418308637671465, 3.9983309338848025) + (0.4132845380048481, 3.9981192228320532) + (0.4082609865186747, 3.9978948804693086) + (0.40323801496982675, 3.9976579082147725) + (0.398215655111519, 3.997408307566488) + (0.3931939386931021, 3.9971460801023313) + (0.38817289745985645, 3.996871227479999) + (0.3831525631527951, 3.9965837514369986) + (0.3781329675084622, 3.9962836537906394) + (0.3731141422587314, 3.995970936438019) + (0.3680961191306091, 3.995645601356011) + (0.3630789298460281, 3.995307650601253) + (0.3580626061216509, 3.9949570863101345) + (0.3530471796686685, 3.994593910698784) + (0.3480326821925994, 3.9942181260630507) + (0.34301914539308886, 3.993829734778495) + (0.3380066009637116, 3.993428739300372) + (0.3329950805917664, 3.993015142163614) + (0.32798461595807926, 3.992588945982816) + (0.3229752387368022, 3.9921501534522212) + (0.31796698059521294, 3.991698767345699) + (0.31295987319351415, 3.991234790516732) + (0.3079539481846365, 3.9907582258983965) + (0.30294923721403344, 3.990269076503343) + (0.29794577191948457, 3.9897673454237776) + (0.292943583930895, 3.989253035831444) + (0.28794270487009455, 3.988726150977602) + (0.28294316635063954, 3.988186694193006) + (0.277944999977612, 3.9876346688878863) + (0.27294823734741874, 3.987070078551926) + (0.26795291004759275, 3.986492926754238) + (0.2629590496565948, 3.985903217143347) + (0.257966687743611, 3.98530095344716) + (0.2529758558683548, 3.9846861394729465) + (0.24798658558086878, 3.9840587791073157) + (0.2429989084213217, 3.9834188763161875) + (0.23801285591981336, 3.982766435144772) + (0.2330284595961714, 3.982101459717541) + (0.22804575095975455, 3.981423954238203) + (0.22306476150925164, 3.980733922989676) + (0.21808552273248605, 3.9800313703340624) + (0.21310806610621158, 3.9793163007126178) + (0.2081324230959169, 3.9785887186457267) + (0.20315862515562555, 3.977848628732872) + (0.19818670372769742, 3.977096035652605) + (0.19321669024262894, 3.9763309441625188) + (0.1882486161188579, 3.975553359099215) + (0.18328251276255958, 3.974763285378276) + (0.17831841156745182, 3.9739607279942306) + (0.17335634391459548, 3.973145692020526) + (0.1683963411721962, 3.9723181826094933) + (0.1634384346954053, 3.971478204992315) + (0.15848265582612486, 3.970625764478995) + (0.15352903589280453, 3.9697608664583197) + (0.1485776062102469, 3.968883516397829) + (0.14362839807940864, 3.9679937198437782) + (0.13868144278720262, 3.9670914824211057) + (0.13373677160629943, 3.9661768098333945) + (0.12879441579493284, 3.9652497078628395) + (0.12385440659669739, 3.964310182370207) + (0.11891677524035393, 3.963358239294803) + (0.11398155293963175, 3.9623938846544293) + (0.10904877089303083, 3.96141712454535) + (0.1041184602836242, 3.9604279651422525) + (0.09919065227886392, 3.959426412698205) + (0.09426537803037893, 3.958412473544623) + (0.08934266867378182, 3.957386154091223) + (0.08442255532847087, 3.956347460825986) + (0.07950506909743288, 3.955296400315115) + (0.07459024106704815, 3.9542329792029935) + (0.06967810230689275, 3.953157204212145) + (0.06476868386954143, 3.952069082143188) + (0.05986201679037262, 3.9509686198747946) + (0.054958132087371325, 3.949855824363647) + (0.05005706076093469, 3.948730702644393) + (0.04515883379367325, 3.947593261829602) + (0.04026348215021819, 3.946443509109719) + (0.03537103677702291, 3.9452814517530213) + (0.030481528602168406, 3.9441070971055696) + (0.025594988535169227, 3.942920452591164) + (0.0207114474667755, 3.941721525711297) + (0.01583093626877885, 3.9405103240451034) + (0.010953485793817996, 3.9392868552493163) + (0.0060791268751832495, 3.9380511270582153) + (0.0012078903266202201, 3.9368031472835794) + (-0.003660193057863248, 3.9355429238146376) + (-0.008525092504192422, 3.9342704646180175) + (-0.013386777258420968, 3.9329857777376978) + (-0.01824521658692213, 3.9316888712949543) + (-0.023100379776587743, 3.9303797534883103) + (-0.027952236135019404, 3.929058432593485) + (-0.03280075499072321, 3.92772491696334) + (-0.037645905693303394, 3.9263792150278274) + (-0.04248765761365747, 3.925021335293936) + (-0.04732598014416578, 3.9236512863456383) + (-0.052160842698890764, 3.9222690768438353) + (-0.056992214713766476, 3.9208747155263026) + (-0.061820065646792766, 3.919468211207634) + (-0.06664436497822834, 3.9180495727791866) + (-0.0714650822107844, 3.916618809209025) + (-0.07628218686981458, 3.9151759295418644) + (-0.08109564850351203, 3.913720942899012) + (-0.08590543668309869, 3.912253858478311) + (-0.09071152100301905, 3.910774685554082) + (-0.0955138710811323, 3.9092834334770634) + (-0.10031245655890164, 3.907780111674356) + (-0.10510724710159125, 3.9062647296493562) + (-0.10989821239845421, 3.9047372969817045) + (-0.1146853221629257, 3.903197823327218) + (-0.11946854613281366, 3.901646318417833) + (-0.12424785407049144, 3.9000827920615424) + (-0.1290232157630854, 3.8985072541423342) + (-0.13379460102267127, 3.8969197146201293) + (-0.1385619796864609, 3.8953201835307163) + (-0.14332532161699463, 3.8937086709856903) + (-0.14808459670233132, 3.8920851871723894) + (-0.15283977485623934, 3.890449742353828) + (-0.15759082601838426, 3.888802346868634) + (-0.16233772015452286, 3.887143011130982) + (-0.16708042725669037, 3.8854717456305283) + (-0.17181891734339105, 3.8837885609323446) + (-0.17655316045978642, 3.8820934676768513) + (-0.18128312667788704, 3.8803864765797487) + (-0.186008786096739, 3.878667598431952) + (-0.190730108842615, 3.8769368440995207) + (-0.19544706506920295, 3.8751942245235913) + (-0.2001596249577925, 3.873439750720306) + (-0.20486775871746676, 3.8716734337807477) + (-0.20957143658528887, 3.869895284870864) + (-0.21427062882648962, 3.868105315231401) + (-0.2189653057346559, 3.86630353617783) + (-0.22365543763191986, 3.8644899591002773) + (-0.22834099486914472, 3.8626645954634515) + (-0.23302194782611307, 3.860827456806571) + (-0.23769826691171458, 3.8589785547432904) + (-0.24236992256413015, 3.8571179009616294) + (-0.24703688525102319, 3.855245507223896) + (-0.2516991254697236, 3.8533613853666138) + (-0.2563566137474148, 3.851465547300447) + (-0.2610093206413199, 3.8495580050101257) + (-0.2656572167388891, 3.8476387705543686) + (-0.27030027265798173, 3.8457078560658076) + (-0.2749384590470575, 3.843765273750911) + (-0.27957174658535855, 3.8418110358899074) + (-0.2842001059830954, 3.8398451548367056) + (-0.2888235079816325, 3.8378676430188197) + (-0.2934419233536737, 3.8358785129372865) + (-0.2980553229034437, 3.8338777771665917) + (-0.30266367746687806, 3.831865448354586) + (-0.3072669579118036, 3.8298415392224054) + (-0.31186513513812375, 3.827806062564395) + (-0.3164581800780024, 3.825759031248022) + (-0.3210460636960488, 3.8237004582138) + (-0.3256287569894972, 3.821630356475204) + (-0.33020623098839574, 3.819548739118588) + (-0.3347784567557861, 3.8174556193031037) + (-0.33934540538788627, 3.815351010260618) + (-0.3439070480142753, 3.8132349252956255) + (-0.3484633557980751, 3.8111073777851683) + (-0.35301429993612976, 3.808968381178752) + (-0.3575598516591929, 3.8068179489982557) + (-0.3620999822321057, 3.804656094837851) + (-0.36663466295397995, 3.802482832363915) + (-0.37116386515837896, 3.800298175314943) + (-0.37568756021350014, 3.7981021375014623) + (-0.38020571952235216, 3.7958947328059454) + (-0.38471831452294114, 3.7936759751827216) + (-0.3892253166884476, 3.7914458786578873) + (-0.39372669752740774, 3.7892044573292214) + (-0.39822242858389345, 3.786951725366092) + (-0.40271248143769334, 3.7846876970093684) + (-0.4071968277044886, 3.782412386571332) + (-0.411675439036038, 3.780125808435586) + (-0.4161482871203529, 3.77782797705696) + (-0.42061534368187825, 3.775518906961426) + (-0.4250765804816702, 3.7731986127460004) + (-0.4295319693175761, 3.7708671090786536) + (-0.43398148202440934, 3.7685244106982205) + (-0.43842509047413236, 3.7661705324143013) + (-0.4428627665760311, 3.7638054891071726) + (-0.44729448227689317, 3.761429295727692) + (-0.45172020956118586, 3.759041967297202) + (-0.4561399204512334, 3.7566435189074388) + (-0.4605535870073909, 3.754233965720432) + (-0.4649611813282257, 3.7518133229684136) + (-0.46936267555069067, 3.749381605953717) + (-0.4737580418503009, 3.746938830048685) + (-0.47814725244130996, 3.744485010695568) + (-0.482530279576886, 3.7420201634064303) + (-0.48690709554928413, 3.7395443037630507) + (-0.4912776726900263, 3.737057447416822) + (-0.49564198337007326, 3.734559610088655) + (-0.49999999999999956, 3.7320508075688776) + (-0.5043516950301692, 3.7295310557171346) + (-0.5086970409509064, 3.7270003704622896) + (-0.5130360102926739, 3.7244587678023215) + (-0.5173685756262447, 3.7219062638042253) + (-0.5216947095628743, 3.7193428746039094) + (-0.5260143847544758, 3.7167686164060942) + (-0.5303275738937923, 3.7141835054842094) + (-0.5346342497145666, 3.7115875581802924) + (-0.538934384991719, 3.708980790904883) + (-0.5432279525415151, 3.70636322013692) + (-0.5475149252217393, 3.703734862423638) + (-0.5517952759318665, 3.7010957343804636) + (-0.556068977613233, 3.6984458526909068) + (-0.560336003249206, 3.6957852341064594) + (-0.5645963258653581, 3.693113895446488) + (-0.5688499185296347, 3.690431853598125) + (-0.5730967543525256, 3.687739125516167) + (-0.5773368064872342, 3.685035728222962) + (-0.5815700481298491, 3.6823216788083055) + (-0.5857964525195094, 3.6795969944293327) + (-0.5900159929385786, 3.676861692310408) + (-0.5942286427128112, 3.674115789743015) + (-0.5984343752115215, 3.6713593040856516) + (-0.6026331638477518, 3.6685922527637174) + (-0.6068249820784415, 3.665814653269402) + (-0.6110098034045923, 3.663026523161579) + (-0.6151876013714395, 3.6602278800656904) + (-0.6193583495686159, 3.6574187416736375) + (-0.6235220216303214, 3.6545991257436694) + (-0.6276785912354874, 3.6517690501002695) + (-0.6318280321079452, 3.6489285326340424) + (-0.6359703180165892, 3.6460775913016037) + (-0.640105422775546, 3.6432162441254627) + (-0.6442333202443389, 3.6403445091939117) + (-0.6483539843280519, 3.6374624046609094) + (-0.6524673889774961, 3.634569948745967) + (-0.6565735081893742, 3.631667159734032) + (-0.6606723160064429, 3.6287540559753766) + (-0.6647637865176801, 3.6258306558854754) + (-0.668847893858447, 3.6228969779448947) + (-0.6729246122106516, 3.619953040699172) + (-0.6769939158029126, 3.616998862758699) + (-0.6810557789107203, 3.614034462798608) + (-0.6851101758566025, 3.6110598595586487) + (-0.6891570810102843, 3.6080750718430714) + (-0.6931964687888519, 3.60508011852051) + (-0.6972283136569111, 3.602075018523861) + (-0.701252590126753, 3.5990597908501627) + (-0.7052692727585126, 3.5960344545604794) + (-0.7092783361603296, 3.5929990287797744) + (-0.7132797549885108, 3.5899535326967955) + (-0.7172735039476865, 3.58689798556395) + (-0.7212595577909746, 3.5838324066971836) + (-0.7252378913201385, 3.5807568154758593) + (-0.7292084793857465, 3.5776712313426335) + (-0.7331712968873285, 3.5745756738033343) + (-0.7371263187735393, 3.571470162426838) + (-0.7410735200423133, 3.568354716844943) + (-0.7450128757410239, 3.5652293567522513) + (-0.7489443609666413, 3.562094101906037) + (-0.7528679508658898, 3.5589489721261263) + (-0.7567836206354033, 3.5557939872947726) + (-0.7606913455218853, 3.5526291673565256) + (-0.7645911008222634, 3.5494545323181113) + (-0.7684828618838451, 3.5462701022483003) + (-0.7723666041044748, 3.543075897277787) + (-0.776242302932689, 3.539871937599054) + (-0.7801099338678701, 3.5366582434662552) + (-0.7839694724604036, 3.5334348351950773) + (-0.7878208943118312, 3.5302017331626163) + (-0.7916641750750057, 3.5269589578072504) + (-0.7954992904542444, 3.523706529628507) + (-0.7993262162054835, 3.520444469186935) + (-0.8031449281364285, 3.517172797103976) + (-0.8069554021067118, 3.5138915340618304) + (-0.8107576140280421, 3.5106007008033306) + (-0.8145515398643575, 3.507300318131807) + (-0.8183371556319774, 3.5039904069109573) + (-0.8221144373997544, 3.5006709880647158) + (-0.825883361289224, 3.497342082577121) + (-0.8296439034747585, 3.494003711492179) + (-0.833396040183715, 3.490655895913738) + (-0.8371397476965874, 3.487298657005346) + (-0.8408750023471552, 3.483932015990125) + (-0.8446017805226338, 3.480555994150631) + (-0.848320058663822, 3.477170612828724) + (-0.8520298132652544, 3.473775893425429) + (-0.8557310208753472, 3.470371857400804) + (-0.8594236580965473, 3.466958526273801) + (-0.8631077015854798, 3.4635359216221344) + (-0.8667831280530973, 3.46010406508214) + (-0.8704499142648234, 3.4566629783486427) + (-0.8741080370407037, 3.4532126831748147) + (-0.8777574732555502, 3.449753201372041) + (-0.8813981998390881, 3.446284554809781) + (-0.8850301937761016, 3.4428067654154297) + (-0.8886534321065771, 3.4393198551741806) + (-0.8922678919258531, 3.435823846128884) + (-0.8958735503847612, 3.4323187603799097) + (-0.8994703846897716, 3.4288046200850077) + (-0.9030583721031376, 3.4252814474591653) + (-0.9066374899430394, 3.42174926477447) + (-0.9102077155837252, 3.4182080943599678) + (-0.9137690264556582, 3.41465795860152) + (-0.9173214000456564, 3.4110988799416644) + (-0.9208648138970357, 3.407530880879472) + (-0.9243992456097523, 3.403953983970404) + (-0.9279246728405437, 3.40036821182617) + (-0.9314410733030689, 3.3967735871145894) + (-0.9349484247680524, 3.3931701325594394) + (-0.9384467050634218, 3.3895578709403162) + (-0.9419358920744492, 3.385936825092494) + (-0.945415963743891, 3.382307017906774) + (-0.9488868980721277, 3.3786684723293443) + (-0.9523486731173003, 3.3750212113616347) + (-0.955801266995453, 3.3713652580601687) + (-0.9592446578806693, 3.3677006355364205) + (-0.9626788240052102, 3.364027366956666) + (-0.966103743659652, 3.3603454755418394) + (-0.9695193951930243, 3.356654984567384) + (-0.9729257570129435, 3.3529559173631074) + (-0.9763228075857542, 3.349248297313032) + (-0.9797105254366627, 3.3455321478552476) + (-0.9830888891498724, 3.341807492481763) + (-0.98645787736872, 3.3380743547383602) + (-0.9898174687958115, 3.33433275822444) + (-0.9931676421931526, 3.33058272659288) + (-0.9965083763822891, 3.326824283549877) + (-0.9998396502444362, 3.323057452854806) + (-1.0031614427206141, 3.3192822583200616) + (-1.0064737328117808, 3.3154987238109124) + (-1.0097764995789629, 3.3117068732453503) + (-1.0130697221433915, 3.3079067305939365) + (-1.0163533796866315, 3.3040983198796514) + (-1.0196274514507142, 3.300281665177744) + (-1.0228919167382688, 3.2964567906155766) + (-1.0261467549126515, 3.292623720372477) + (-1.0293919453980784, 3.28878247867958) + (-1.032627467679754, 3.284933089819678) + (-1.0358533013040017, 3.281075578127067) + (-1.039069425878393, 3.2772099679873916) + (-1.042275821071874, 3.2733362838374926) + (-1.045472466614899, 3.2694545501652508) + (-1.0486593422995536, 3.2655647915094326) + (-1.0518364279796861, 3.2616670324595347) + (-1.0550037035710311, 3.257761297655631) + (-1.058161149051341, 3.253847611788213) + (-1.0613087444605087, 3.2499259995980365) + (-1.0644464699006961, 3.2459964858759633) + (-1.0675743055364593, 3.2420590954628077) + (-1.0706922315948724, 3.238113853249175) + (-1.073800228365655, 3.234160784175309) + (-1.0768982762012955, 3.230199913230928) + (-1.0799863555171758, 3.226231265455074) + (-1.0830644467916941, 3.22225486593595) + (-1.08613253056639, 3.2182707398107615) + (-1.089190587446065, 3.2142789122655597) + (-1.0922385980989076, 3.210279408535081) + (-1.0952765432566147, 3.2062722539025867) + (-1.0983044037145127, 3.2022574736997047) + (-1.1013221603316798, 3.1982350933062684) + (-1.1043297940310672, 3.1942051381501564) + (-1.107327285799617, 3.1901676337071327) + (-1.1103146166883866, 3.1861226055006853) + (-1.1132917678126661, 3.1820700791018623) + (-1.1162587203520973, 3.1780100801291136) + (-1.119215455550794, 3.173942634248128) + (-1.12216195471746, 3.16986776717167) + (-1.1250981992255058, 3.1657855046594197) + (-1.1280241705131697, 3.1616958725178055) + (-1.130939850083632, 3.1575988965998456) + (-1.1338452195051336, 3.1534946028049813) + (-1.1367402604110917, 3.1493830170789163) + (-1.139624954500217, 3.145264165413448) + (-1.1424992835366272, 3.14113807384631) + (-1.1453632293499647, 3.137004768461001) + (-1.148216773835511, 3.1328642753866243) + (-1.151059898954299, 3.128716620797718) + (-1.1538925867332304, 3.124561830914096) + (-1.156714819265187, 3.1203999320006757) + (-1.1595265787091436, 3.116230950367317) + (-1.1623278472902825, 3.112054912368654) + (-1.1651186073001052, 3.1078718444039266) + (-1.1678988410965438, 3.103681772916816) + (-1.170668531104073, 3.0994847243952774) + (-1.1734276598138216, 3.095280725371371) + (-1.1761762097836812, 3.0910698024210976) + (-1.1789141636384197, 3.0868519821642257) + (-1.1816415040697883, 3.0826272912641266) + (-1.1843582138366326, 3.078395756427606) + (-1.1870642757650014, 3.0741574044047324) + (-1.1897596727482531, 3.069912261988672) + (-1.1924443877471673, 3.065660356015516) + (-1.1951184037900504, 3.0614017133641114) + (-1.1977817039728433, 3.0571363609558935) + (-1.200434271459228, 3.052864325754712) + (-1.203076089480735, 3.0485856347666638) + (-1.2057071413368474, 3.044300315039922) + (-1.2083274103951087, 3.0400083936645617) + (-1.2109368800912268, 3.035709897772392) + (-1.2135355339291787, 3.031404854536784) + (-1.2161233554813147, 3.0270932911724975) + (-1.2187003283884634, 3.0227752349355104) + (-1.2212664363600325, 3.0184507131228466) + (-1.2238216631741148, 3.0141197530724013) + (-1.2263659926775894, 3.009782382162771) + (-1.2288994087862233, 3.005438627813079) + (-1.231421895484774, 3.001088517482801) + (-1.2339334368270904, 2.996732078671593) + (-1.2364340169362127, 2.9923693389191186) + (-1.2389236200044744, 2.9880003258048724) + (-1.2414022302936019, 2.983625066948006) + (-1.2438698321348125, 2.979243590007155) + (-1.2463264099289153, 2.9748559226802627) + (-1.2487719481464088, 2.9704620927044054) + (-1.2512064313275788, 2.9660621278556185) + (-1.2536298440825973, 2.961656055948719) + (-1.2560421710916185, 2.9572439048371293) + (-1.2584433971048767, 2.952825702412703) + (-1.2608335069427825, 2.948401476605547) + (-1.263212485496018, 2.943971255383846) + (-1.2655803177256324, 2.939535066753687) + (-1.2679369886631386, 2.9350929387588773) + (-1.270282483410606, 2.930644899480773) + (-1.2726167871407554, 2.9261909770380976) + (-1.2749398850970535, 2.9217311995867656) + (-1.2772517625938042, 2.917265595319707) + (-1.2795524050162435, 2.9127941924666834) + (-1.2818417978206305, 2.9083170192941137) + (-1.2841199265343413, 2.9038341041048943) + (-1.2863867767559565, 2.899345475238223) + (-1.288642334155357, 2.894851161069413) + (-1.2908865844738118, 2.89035119000972) + (-1.2931195135240685, 2.8858455905061606) + (-1.2953411071904437, 2.88133439104133) + (-1.2975513514289105, 2.876817620133228) + (-1.2997502322671903, 2.8722953063350705) + (-1.301937735804838, 2.8677674782351166) + (-1.3041138482133323, 2.8632341644564825) + (-1.3062785557361616, 2.858695393656963) + (-1.3084318446889105, 2.8541511945288516) + (-1.3105737014593486, 2.8496015957987564) + (-1.3127041125075147, 2.845046626227419) + (-1.3148230643658028, 2.8404863146095343) + (-1.3169305436390475, 2.8359206897735665) + (-1.319026537004608, 2.8313497805815695) + (-1.3211110312124532, 2.8267736159290013) + (-1.323184013085245, 2.822192224744543) + (-1.3252454695184221, 2.817605635989916) + (-1.3272953874802815, 2.813013878659699) + (-1.329333754012063, 2.808416981781143) + (-1.3313605562280284, 2.8038149744139917) + (-1.3333757813155458, 2.799207885650293) + (-1.3353794165351685, 2.7945957446142184) + (-1.3373714492207167, 2.7899785804618773) + (-1.3393518667793571, 2.785356422381134) + (-1.341320656691683, 2.78072929959142) + (-1.3432778065117916, 2.776097241343556) + (-1.3452233038673658, 2.7714602769195595) + (-1.3471571364597497, 2.766818435632463) + (-1.3490792920640275, 2.76217174682613) + (-1.350989758529101, 2.757520239875068) + (-1.3528885237777666, 2.7528639441842393) + (-1.354775575806789, 2.748202889188885) + (-1.356650902686981, 2.7435371043543277) + (-1.3585144925632773, 2.7388666191757918) + (-1.3603663336548077, 2.7341914631782154) + (-1.3622064142549746, 2.729511665916063) + (-1.364034722731525, 2.72482725697314) + (-1.365851247526624, 2.720138265962406) + (-1.3676559771569292, 2.715444722525784) + (-1.369448900213662, 2.7107466563339777) + (-1.3712300053626805, 2.7060440970862816) + (-1.372999281344551, 2.701337074510392) + (-1.374756716974619, 2.696625618362222) + (-1.3765023011430795, 2.691909758425712) + (-1.378236022815048, 2.6871895245126414) + (-1.3799578710306304, 2.682464946462439) + (-1.381667834904991, 2.677736054141997) + (-1.3833659036284232, 2.6730028774454784) + (-1.3850520664664152, 2.6682654462941335) + (-1.3867263127597211, 2.663523790636106) + (-1.3883886319244259, 2.658777940446244) + (-1.390039013452013, 2.654027925725914) + (-1.391677446909431, 2.6492737765028065) + (-1.3933039219391599, 2.6445155228307504) + (-1.3949184282592744, 2.639753194789523) + (-1.3965209556635125, 2.6349868224846538) + (-1.3981114940213373, 2.6302164360472418) + (-1.3996900332780016, 2.6254420656337603) + (-1.4012565634546124, 2.6206637414258687) + (-1.402811074648193, 2.615881493630219) + (-1.4043535570317451, 2.611095352478269) + (-1.405884000854313, 2.6063053482260874) + (-1.4074023964410434, 2.601511511154163) + (-1.408908734193247, 2.596713871567216) + (-1.4104030045884592, 2.591912459794003) + (-1.4118851981805014, 2.587107306187127) + (-1.413355305599538, 2.5822984411228473) + (-1.414813317552139, 2.5774858950008834) + (-1.416259224821336, 2.572669698244226) + (-1.417693018266682, 2.5678498812989425) + (-1.419114688824309, 2.5630264746339875) + (-1.4205242275069845, 2.558199508741006) + (-1.4219216254041689, 2.5533690141341463) + (-1.4233068736820724, 2.548535021349861) + (-1.4246799635837095, 2.5436975609467183) + (-1.4260408864289558, 2.5388566635052054) + (-1.4273896336146015, 2.5340123596275395) + (-1.4287261966144067, 2.5291646799374696) + (-1.4300505669791552, 2.524313655080088) + (-1.4313627363367074, 2.519459315721632) + (-1.432662696392054, 2.5146016925492916) + (-1.4339504389273676, 2.509740816271016) + (-1.4352259558020557, 2.5048767176153204) + (-1.436489238952811, 2.5000094273310878) + (-1.437740280393663, 2.495138976187382) + (-1.438979072216028, 2.490265394973244) + (-1.4402056065887605, 2.485388714497504) + (-1.441419875758201, 2.4805089655885837) + (-1.4426218720482258, 2.4756261790943035) + (-1.4438115878602953, 2.4707403858816854) + (-1.4449890156735021, 2.4658516168367575) + (-1.4461541480446194, 2.460959902864362) + (-1.4473069776081464, 2.4560652748879552) + (-1.448447497076356, 2.4511677638494183) + (-1.4495756992393403, 2.4462674007088547) + (-1.4506915769650572, 2.4413642164443994) + (-1.4517951231993744, 2.4364582420520193) + (-1.452886330966114, 2.4315495085453227) + (-1.4539651933670972, 2.426638046955358) + (-1.455031703582188, 2.4217238883304186) + (-1.4560858548693356, 2.4168070637358494) + (-1.4571276405646176, 2.411887604253846) + (-1.4581570540822815, 2.406965540983265) + (-1.459174088914787, 2.402040905039418) + (-1.460178738632847, 2.397113727553884) + (-1.4611709968854687, 2.3921840396743055) + (-1.4621508573999917, 2.387251872564197) + (-1.4631183139821309, 2.382317257402744) + (-1.4640733605160121, 2.3773802253846106) + (-1.4650159909642138, 2.3724408077197356) + (-1.4659461993678036, 2.367499035633141) + (-1.466863979846376, 2.3625549403647312) + (-1.4677693265980907, 2.357608553169099) + (-1.4686622338997077, 2.3526599053153228) + (-1.469542696106624, 2.3477090280867756) + (-1.4704107076529105, 2.3427559527809207) + (-1.4712662630513451, 2.337800710709118) + (-1.4721093568934494, 2.332843333196424) + (-1.4729399838495212, 2.3278838515813955) + (-1.47375813866867, 2.32292229721589) + (-1.4745638161788477, 2.3179587014648693) + (-1.475357011286884, 2.3129930957061986) + (-1.4761377189785165, 2.30802551133045) + (-1.4769059343184243, 2.3030559797407038) + (-1.477661652450257, 2.2980845323523496) + (-1.4784048685966673, 2.293111200592887) + (-1.47913557805934, 2.2881360159017303) + (-1.4798537762190223, 2.2831590097300056) + (-1.480559458535553, 2.2781802135403537) + (-1.481252620547891, 2.273199658806732) + (-1.4819332578741433, 2.268217377014212) + (-1.4826013662115936, 2.263233399658787) + (-1.4832569413367278, 2.2582477582471667) + (-1.4838999791052625, 2.2532604842965807) + (-1.4845304754521707, 2.2482716093345787) + (-1.4851484263917063, 2.243281164898831) + (-1.4857538280174312, 2.2382891825369304) + (-1.4863466765022384, 2.2332956938061908) + (-1.4869269680983772, 2.22830073027345) + (-1.4874946991374762, 2.2233043235148684) + (-1.4880498660305672, 2.21830650511573) + (-1.488592465268107, 2.2133073066702407) + (-1.489122493420001, 2.2083067597813333) + (-1.4896399471356228, 2.203304896060464) + (-1.4901448231438372, 2.1983017471274136) + (-1.4906371182530205, 2.1932973446100865) + (-1.4911168293510795, 2.1882917201443126) + (-1.4915839534054731, 2.183284905373646) + (-1.49203848746323, 2.1782769319491653) + (-1.4924804286509674, 2.1732678315292757) + (-1.4929097741749102, 2.1682576357795047) + (-1.493326521320908, 2.1632463763723035) + (-1.493730667454452, 2.1582340849868498) + (-1.4941222100206921, 2.1532207933088423) + (-1.4945011465444529, 2.148206533030304) + (-1.4948674746302495, 2.1431913358493837) + (-1.4952211919623022, 2.1381752334701494) + (-1.4955622963045516, 2.133158257602392) + (-1.4958907855006727, 2.1281404399614265) + (-1.4962066574740882, 2.1231218122678865) + (-1.4965099102279817, 2.118102406247527) + (-1.4968005418453112, 2.113082253631026) + (-1.4970785504888195, 2.108061386153777) + (-1.4973439344010473, 2.1030398355556965) + (-1.4975966919043437, 2.098017633581016) + (-1.497836821400877, 2.092994811978087) + (-1.4980643213726448, 2.0879714024991762) + (-1.4982791903814832, 2.0829474369002696) + (-1.498481427069076, 2.0779229469408658) + (-1.4986710301569643, 2.0728979643837797) + (-1.498847998446553, 2.06787252099494) + (-1.4990123308191194, 2.0628466485431876) + (-1.4991640262358203, 2.057820378800076) + (-1.4993030837376977, 2.052793743539673) + (-1.4994295024456856, 2.0477667745383537) + (-1.4995432815606158, 2.042739503574604) + (-1.4996444203632224, 2.0377119624288187) + (-1.499732918214146, 2.0326841828831) + (-1.4998087745539388, 2.0276561967210593) + (-1.4998719889030672, 2.0226280357276125) + (-1.4999225608619158, 2.017599731688781) + (-1.4999604901107884, 2.012571316391489) + (-1.4999857764099118, 2.0075428216233657) + (-1.4999984195994363, 2.0025142791725443) + (-1.4999984195994363, 1.9974857208274561) + (-1.4999857764099118, 1.9924571783766345) + (-1.4999604901107884, 1.9874286836085122) + (-1.4999225608619158, 1.9824002683112198) + (-1.4998719889030672, 1.977371964272388) + (-1.4998087745539388, 1.9723438032789409) + (-1.499732918214146, 1.9673158171169005) + (-1.4996444203632224, 1.9622880375711829) + (-1.499543281560616, 1.9572604964253968) + (-1.4994295024456856, 1.952233225461647) + (-1.4993030837376977, 1.9472062564603274) + (-1.4991640262358203, 1.9421796211999234) + (-1.4990123308191197, 1.9371533514568138) + (-1.498847998446553, 1.9321274790050607) + (-1.4986710301569643, 1.9271020356162214) + (-1.498481427069076, 1.9220770530591345) + (-1.4982791903814832, 1.91705256309973) + (-1.498064321372645, 1.9120285975008242) + (-1.4978368214008773, 1.9070051880219134) + (-1.4975966919043437, 1.9019823664189854) + (-1.4973439344010473, 1.8969601644443042) + (-1.4970785504888195, 1.8919386138462224) + (-1.4968005418453112, 1.8869177463689748) + (-1.4965099102279817, 1.8818975937524727) + (-1.4962066574740882, 1.876878187732115) + (-1.4958907855006727, 1.871859560038574) + (-1.4955622963045516, 1.8668417423976091) + (-1.4952211919623022, 1.8618247665298513) + (-1.4948674746302495, 1.856808664150616) + (-1.494501146544453, 1.8517934669696965) + (-1.4941222100206921, 1.8467792066911584) + (-1.4937306674544522, 1.8417659150131518) + (-1.493326521320908, 1.8367536236276967) + (-1.4929097741749102, 1.831742364220495) + (-1.4924804286509674, 1.8267321684707247) + (-1.4920384874632298, 1.8217230680508343) + (-1.4915839534054731, 1.8167150946263553) + (-1.4911168293510795, 1.811708279855688) + (-1.4906371182530205, 1.806702655389915) + (-1.4901448231438372, 1.801698252872587) + (-1.4896399471356228, 1.7966951039395354) + (-1.4891224934200011, 1.7916932402186674) + (-1.488592465268107, 1.7866926933297596) + (-1.4880498660305672, 1.7816934948842718) + (-1.4874946991374762, 1.7766956764851318) + (-1.486926968098377, 1.7716992697265495) + (-1.4863466765022384, 1.76670430619381) + (-1.4857538280174312, 1.76171081746307) + (-1.4851484263917065, 1.7567188351011702) + (-1.4845304754521707, 1.751728390665422) + (-1.4838999791052625, 1.746739515703419) + (-1.4832569413367278, 1.7417522417528337) + (-1.4826013662115936, 1.7367666003412128) + (-1.4819332578741435, 1.731782622985789) + (-1.481252620547891, 1.7268003411932689) + (-1.4805594585355533, 1.7218197864596476) + (-1.4798537762190225, 1.7168409902699948) + (-1.4791355780593398, 1.7118639840982692) + (-1.4784048685966673, 1.7068887994071138) + (-1.477661652450257, 1.7019154676476511) + (-1.4769059343184245, 1.6969440202592976) + (-1.4761377189785168, 1.6919744886695502) + (-1.475357011286884, 1.687006904293801) + (-1.4745638161788477, 1.6820412985351312) + (-1.4737581386686698, 1.6770777027841097) + (-1.4729399838495214, 1.6721161484186056) + (-1.4721093568934494, 1.6671566668035767) + (-1.4712662630513453, 1.6621992892908837) + (-1.4704107076529105, 1.65724404721908) + (-1.469542696106624, 1.652290971913224) + (-1.4686622338997077, 1.6473400946846777) + (-1.467769326598091, 1.6423914468309015) + (-1.4668639798463765, 1.6374450596352699) + (-1.4659461993678036, 1.6325009643668598) + (-1.4650159909642138, 1.6275591922802641) + (-1.4640733605160121, 1.6226197746153899) + (-1.4631183139821307, 1.6176827425972555) + (-1.462150857399992, 1.6127481274358042) + (-1.4611709968854687, 1.607815960325695) + (-1.4601787386328473, 1.6028862724461168) + (-1.459174088914787, 1.5979590949605824) + (-1.4581570540822812, 1.5930344590167347) + (-1.4571276405646176, 1.5881123957461543) + (-1.4560858548693356, 1.583192936264151) + (-1.4550317035821883, 1.5782761116695818) + (-1.4539651933670974, 1.5733619530446425) + (-1.452886330966114, 1.5684504914546769) + (-1.4517951231993744, 1.5635417579479813) + (-1.4506915769650572, 1.5586357835556013) + (-1.4495756992393403, 1.5537325992911457) + (-1.448447497076356, 1.5488322361505822) + (-1.4473069776081464, 1.5439347251120452) + (-1.4461541480446194, 1.5390400971356386) + (-1.4449890156735024, 1.534148383163243) + (-1.4438115878602953, 1.5292596141183152) + (-1.442621872048226, 1.5243738209056967) + (-1.4414198757582013, 1.5194910344114168) + (-1.4402056065887607, 1.5146112855024962) + (-1.4389790722160283, 1.5097346050267564) + (-1.437740280393663, 1.5048610238126185) + (-1.4364892389528112, 1.4999905726689127) + (-1.4352259558020561, 1.495123282384681) + (-1.4339504389273678, 1.4902591837289845) + (-1.4326626963920543, 1.4853983074507098) + (-1.4313627363367074, 1.4805406842783686) + (-1.4300505669791552, 1.4756863449199122) + (-1.428726196614407, 1.4708353200625308) + (-1.4273896336146015, 1.465987640372461) + (-1.4260408864289562, 1.4611433364947959) + (-1.4246799635837097, 1.4563024390532826) + (-1.4233068736820724, 1.4514649786501383) + (-1.421921625404169, 1.4466309858658541) + (-1.4205242275069843, 1.4418004912589937) + (-1.4191146888243091, 1.4369735253660139) + (-1.417693018266682, 1.432150118701058) + (-1.4162592248213364, 1.4273303017557755) + (-1.4148133175521391, 1.422514104999117) + (-1.413355305599538, 1.4177015588771522) + (-1.4118851981805016, 1.4128926938128736) + (-1.4104030045884595, 1.4080875402059974) + (-1.4089087341932474, 1.4032861284327853) + (-1.4074023964410436, 1.3984884888458373) + (-1.405884000854313, 1.3936946517739124) + (-1.4043535570317454, 1.3889046475217315) + (-1.4028110746481928, 1.3841185063697807) + (-1.4012565634546128, 1.3793362585741327) + (-1.3996900332780018, 1.3745579343662402) + (-1.3981114940213377, 1.3697835639527596) + (-1.3965209556635128, 1.3650131775153467) + (-1.3949184282592744, 1.360246805210477) + (-1.39330392193916, 1.3554844771692498) + (-1.3916774469094313, 1.350726223497194) + (-1.3900390134520135, 1.3459720742740875) + (-1.388388631924426, 1.3412220595537563) + (-1.3867263127597211, 1.3364762093638938) + (-1.3850520664664154, 1.331734553705867) + (-1.383365903628423, 1.3269971225545212) + (-1.3816678349049913, 1.3222639458580043) + (-1.3799578710306304, 1.3175350535375614) + (-1.3782360228150479, 1.3128104754873582) + (-1.3765023011430797, 1.3080902415742885) + (-1.374756716974619, 1.303374381637778) + (-1.3729992813445515, 1.2986629254896092) + (-1.3712300053626807, 1.293955902913719) + (-1.3694489002136625, 1.2892533436660234) + (-1.3676559771569294, 1.2845552774742164) + (-1.365851247526624, 1.2798617340375937) + (-1.3640347227315253, 1.2751727430268605) + (-1.3622064142549748, 1.2704883340839372) + (-1.3603663336548082, 1.265808536821786) + (-1.3585144925632773, 1.2611333808242087) + (-1.3566509026869809, 1.256462895645672) + (-1.354775575806789, 1.2517971108111157) + (-1.3528885237777664, 1.2471360558157603) + (-1.3509897585291017, 1.2424797601249338) + (-1.3490792920640278, 1.2378282531738702) + (-1.34715713645975, 1.2331815643675381) + (-1.345223303867366, 1.2285397230804413) + (-1.3432778065117916, 1.2239027586564437) + (-1.3413206566916833, 1.2192707004085805) + (-1.3393518667793574, 1.2146435776188667) + (-1.3373714492207174, 1.2100214195381238) + (-1.3353794165351687, 1.205404255385782) + (-1.3333757813155456, 1.2007921143497065) + (-1.3313605562280286, 1.1961850255860087) + (-1.3293337540120629, 1.1915830182188567) + (-1.3272953874802822, 1.1869861213403023) + (-1.3252454695184224, 1.1823943640100845) + (-1.3231840130852452, 1.1778077752554577) + (-1.3211110312124534, 1.1732263840709993) + (-1.3190265370046077, 1.1686502194184303) + (-1.3169305436390477, 1.164079310226434) + (-1.314823064365803, 1.159513685390466) + (-1.312704112507515, 1.1549533737725812) + (-1.3105737014593488, 1.150398404201244) + (-1.3084318446889103, 1.145848805471148) + (-1.3062785557361618, 1.1413046063430377) + (-1.3041138482133325, 1.136765835543518) + (-1.3019377358048383, 1.1322325217648839) + (-1.2997502322671906, 1.12770469366493) + (-1.2975513514289108, 1.1231823798667726) + (-1.295341107190444, 1.1186656089586704) + (-1.2931195135240687, 1.1141544094938398) + (-1.290886584473812, 1.1096488099902804) + (-1.2886423341553572, 1.1051488389305877) + (-1.2863867767559567, 1.1006545247617776) + (-1.2841199265343415, 1.0961658958951062) + (-1.2818417978206307, 1.0916829807058868) + (-1.2795524050162437, 1.0872058075333173) + (-1.2772517625938045, 1.0827344046802936) + (-1.274939885097054, 1.0782688004132346) + (-1.2726167871407557, 1.0738090229619028) + (-1.2702824834106066, 1.0693551005192283) + (-1.2679369886631389, 1.064907061241123) + (-1.2655803177256326, 1.0604649332463136) + (-1.2632124854960183, 1.0560287446161543) + (-1.2608335069427827, 1.0515985233944534) + (-1.2584433971048774, 1.0471742975872984) + (-1.2560421710916188, 1.0427560951628712) + (-1.2536298440825975, 1.0383439440512814) + (-1.251206431327579, 1.0339378721443817) + (-1.2487719481464088, 1.0295379072955944) + (-1.246326409928916, 1.0251440773197387) + (-1.2438698321348127, 1.0207564099928454) + (-1.2414022302936025, 1.016374933051995) + (-1.2389236200044746, 1.011999674195128) + (-1.2364340169362125, 1.007630661080881) + (-1.2339334368270907, 1.0032679213284075) + (-1.2314218954847742, 0.9989114825171994) + (-1.228899408786224, 0.994561372186922) + (-1.2263659926775896, 0.9902176178372291) + (-1.2238216631741148, 0.9858802469275982) + (-1.2212664363600327, 0.981549286877154) + (-1.2187003283884632, 0.9772247650644894) + (-1.2161233554813153, 0.9729067088275034) + (-1.213535533929179, 0.9685951454632162) + (-1.2109368800912275, 0.9642901022276089) + (-1.208327410395109, 0.9599916063354388) + (-1.2057071413368472, 0.9556996849600778) + (-1.2030760894807353, 0.9514143652333367) + (-1.2004342714592282, 0.9471356742452883) + (-1.197781703972844, 0.9428636390441079) + (-1.1951184037900509, 0.9385982866358891) + (-1.192444387747167, 0.934339643984484) + (-1.1897596727482533, 0.9300877380113286) + (-1.1870642757650012, 0.9258425955952676) + (-1.1843582138366335, 0.9216042435723952) + (-1.1816415040697885, 0.9173727087358738) + (-1.1789141636384204, 0.9131480178357758) + (-1.1761762097836814, 0.908930197578903) + (-1.1734276598138214, 0.9047192746286288) + (-1.1706685311040739, 0.9005152756047239) + (-1.167898841096544, 0.8963182270831844) + (-1.165118607300106, 0.8921281555960747) + (-1.162327847290283, 0.8879450876313464) + (-1.1595265787091433, 0.8837690496326822) + (-1.1567148192651875, 0.8796000679993248) + (-1.1538925867332306, 0.8754381690859043) + (-1.1510598989542997, 0.8712833792022829) + (-1.1482167738355111, 0.8671357246133764) + (-1.1453632293499645, 0.8629952315389984) + (-1.1424992835366274, 0.8588619261536905) + (-1.1396249545002168, 0.8547358345865519) + (-1.1367402604110926, 0.850616982921085) + (-1.1338452195051338, 0.8465053971950189) + (-1.1309398500836327, 0.8424011034001555) + (-1.12802417051317, 0.8383041274821947) + (-1.1250981992255056, 0.8342144953405799) + (-1.1221619547174602, 0.83013223282833) + (-1.1192154555507943, 0.8260573657518722) + (-1.1162587203520982, 0.8219899198708875) + (-1.1132917678126664, 0.8179299208981383) + (-1.1103146166883864, 0.8138773944993145) + (-1.1073272857996173, 0.8098323662928673) + (-1.104329794031067, 0.8057948618498434) + (-1.1013221603316807, 0.8017649066937327) + (-1.0983044037145129, 0.7977425263002957) + (-1.0952765432566154, 0.7937277460974144) + (-1.092238598098908, 0.7897205914649195) + (-1.0891905874460648, 0.7857210877344398) + (-1.0861325305663905, 0.7817292601892392) + (-1.0830644467916946, 0.7777451340640502) + (-1.0799863555171767, 0.7737687345449269) + (-1.0768982762012957, 0.7698000867690724) + (-1.0738002283656547, 0.7658392158246912) + (-1.0706922315948726, 0.7618861467508253) + (-1.067574305536459, 0.7579409045371923) + (-1.0644464699006964, 0.7540035141240367) + (-1.061308744460509, 0.7500740004019641) + (-1.0581611490513412, 0.7461523882117875) + (-1.0550037035710316, 0.7422387023443695) + (-1.051836427979686, 0.7383329675404648) + (-1.0486593422995538, 0.7344352084905676) + (-1.0454724666148993, 0.7305454498347492) + (-1.0422758210718746, 0.7266637161625074) + (-1.0390694258783932, 0.7227900320126088) + (-1.035853301304002, 0.7189244218729334) + (-1.0326274676797544, 0.7150669101803224) + (-1.0293919453980787, 0.7112175213204206) + (-1.0261467549126517, 0.7073762796275236) + (-1.0228919167382693, 0.7035432093844236) + (-1.019627451450715, 0.6997183348222569) + (-1.016353379686632, 0.6959016801203486) + (-1.013069722143392, 0.692093269406064) + (-1.0097764995789633, 0.6882931267546499) + (-1.0064737328117812, 0.6845012761890881) + (-1.003161442720615, 0.6807177416799393) + (-0.9998396502444364, 0.6769425471451942) + (-0.9965083763822893, 0.6731757164501231) + (-0.9931676421931528, 0.6694172734071209) + (-0.9898174687958112, 0.6656672417755598) + (-0.9864578773687211, 0.6619256452616409) + (-0.9830888891498728, 0.6581925075182371) + (-0.9797105254366636, 0.6544678521447536) + (-0.9763228075857546, 0.6507517026869685) + (-0.9729257570129433, 0.6470440826368922) + (-0.9695193951930245, 0.6433450154326166) + (-0.9661037436596525, 0.6396545244581611) + (-0.9626788240052111, 0.6359726330433351) + (-0.9592446578806697, 0.6322993644635799) + (-0.9558012669954528, 0.6286347419398308) + (-0.9523486731173005, 0.6249787886383655) + (-0.9488868980721274, 0.6213315276706555) + (-0.9454159637438921, 0.6176929820932271) + (-0.9419358920744496, 0.6140631749075065) + (-0.9384467050634226, 0.6104421290596844) + (-0.9349484247680528, 0.6068298674405612) + (-0.9314410733030687, 0.6032264128854101) + (-0.9279246728405439, 0.5996317881738298) + (-0.9243992456097525, 0.5960460160295966) + (-0.9208648138970368, 0.5924691191205291) + (-0.9173214000456567, 0.5889011200583356) + (-0.9137690264556579, 0.5853420413984796) + (-0.9102077155837256, 0.5817919056400327) + (-0.9066374899430392, 0.5782507352255297) + (-0.9030583721031387, 0.5747185525408356) + (-0.899470384689772, 0.5711953799149929) + (-0.8958735503847621, 0.567681239620091) + (-0.8922678919258535, 0.5641761538711163) + (-0.8886534321065769, 0.5606801448258192) + (-0.8850301937761018, 0.5571932345845707) + (-0.8813981998390885, 0.5537154451902193) + (-0.8777574732555513, 0.55024679862796) + (-0.874108037040704, 0.5467873168251858) + (-0.870449914264823, 0.5433370216513571) + (-0.8667831280530978, 0.5398959349178603) + (-0.8631077015854802, 0.5364640783778658) + (-0.8594236580965482, 0.5330414737261999) + (-0.8557310208753477, 0.5296281425991969) + (-0.8520298132652542, 0.5262241065745707) + (-0.8483200586638224, 0.5228293871712766) + (-0.8446017805226333, 0.5194440058493688) + (-0.8408750023471561, 0.5160679840098759) + (-0.8371397476965878, 0.5127013429946541) + (-0.8333960401837162, 0.509344104086263) + (-0.8296439034747587, 0.5059962885078209) + (-0.8258833612892238, 0.5026579174228789) + (-0.8221144373997549, 0.49932901193528445) + (-0.8183371556319776, 0.4960095930890427) + (-0.8145515398643586, 0.4926996818681939) + (-0.8107576140280426, 0.4893992991966696) + (-0.8069554021067116, 0.4861084659381689) + (-0.8031449281364282, 0.48282720289602366) + (-0.799326216205483, 0.47955553081306457) + (-0.7954992904542448, 0.47629347037149317) + (-0.7916641750750062, 0.4730410421927498) + (-0.7878208943118317, 0.4697982668373839) + (-0.7839694724604038, 0.46656516480492316) + (-0.780109933867869, 0.4633417565337439) + (-0.7762423029326895, 0.46012806240094584) + (-0.7723666041044743, 0.45692410272221284) + (-0.7684828618838462, 0.45372989775170014) + (-0.764591100822263, 0.45054546768188874) + (-0.7606913455218851, 0.447370832643474) + (-0.756783620635403, 0.4442060127052272) + (-0.7528679508658895, 0.4410510278738733) + (-0.7489443609666415, 0.4379058980939632) + (-0.7450128757410244, 0.43477064324774917) + (-0.7410735200423137, 0.43164528315505724) + (-0.7371263187735397, 0.42852983757316276) + (-0.7331712968873276, 0.42542432619666504) + (-0.729208479385747, 0.4223287686573669) + (-0.7252378913201383, 0.4192431845241402) + (-0.7212595577909757, 0.4161675933028173) + (-0.7172735039476861, 0.41310201443605) + (-0.7132797549885106, 0.4100464673032045) + (-0.7092783361603301, 0.4070009712202258) + (-0.705269272758513, 0.40396554543952123) + (-0.7012525901267535, 0.4009402091498373) + (-0.6972283136569115, 0.3979249814761394) + (-0.6931964687888523, 0.3949198814794903) + (-0.6891570810102854, 0.39192492815692925) + (-0.685110175856602, 0.38894014044135106) + (-0.6810557789107214, 0.3859655372013926) + (-0.6769939158029123, 0.3830011372413007) + (-0.6729246122106534, 0.38004695930082955) + (-0.6688478938584475, 0.3771030220551055) + (-0.6647637865176805, 0.3741693441145246) + (-0.6606723160064434, 0.37124594402462385) + (-0.6565735081893747, 0.36833284026596824) + (-0.6524673889774972, 0.3654300512540338) + (-0.648353984328053, 0.36253759533909125) + (-0.64423332024434, 0.3596554908060887) + (-0.6401054227755472, 0.3567837558745377) + (-0.6359703180165888, 0.3539224086983961) + (-0.6318280321079464, 0.3510714673659585) + (-0.6276785912354879, 0.3482309498997309) + (-0.6235220216303232, 0.3454008742563317) + (-0.6193583495686164, 0.34258125832636277) + (-0.6151876013714397, 0.33977211993431) + (-0.6110098034045928, 0.3369734768384214) + (-0.6068249820784419, 0.3341853467305984) + (-0.6026331638477529, 0.3314077472362835) + (-0.5984343752115227, 0.32864069591434886) + (-0.5942286427128125, 0.32588421025698566) + (-0.5900159929385798, 0.32313830768959306) + (-0.585796452519509, 0.3204030055706668) + (-0.5815700481298502, 0.31767832119169515) + (-0.5773368064872346, 0.31496427177703845) + (-0.5730967543525274, 0.31226087448383444) + (-0.5688499185296352, 0.30956814640187513) + (-0.5645963258653584, 0.3068861045535125) + (-0.5603360032492064, 0.3042147658935408) + (-0.5560689776132335, 0.3015541473090937) + (-0.5517952759318676, 0.2989042656195371) + (-0.5475149252217406, 0.2962651375763623) + (-0.5432279525415162, 0.2936367798630808) + (-0.5389343849917201, 0.291019209095118) + (-0.5346342497145664, 0.2884124418197074) + (-0.5303275738937918, 0.2858164945157906) + (-0.5260143847544763, 0.2832313835939062) + (-0.5216947095628748, 0.280657125396091) + (-0.5173685756262452, 0.27809373619577493) + (-0.5130360102926743, 0.2755412321976787) + (-0.5086970409509068, 0.2729996295377106) + (-0.5043516950301696, 0.2704689442828656) + (-0.5000000000000009, 0.26794919243112303) + (-0.4956419833700745, 0.2654403899113458) + (-0.491277672690026, 0.2629425525831779) + (-0.4869070955492837, 0.2604556962369493) + (-0.48253027957688566, 0.2579798365935695) + (-0.4781472524413104, 0.25551498930443217) + (-0.47375804185030135, 0.25306116995131545) + (-0.4693626755506911, 0.25061839404628317) + (-0.46496118132822617, 0.2481866770315868) + (-0.46055358700739135, 0.245766034279568) + (-0.45613992045123386, 0.24335648109256147) + (-0.4517202095611855, 0.24095803270279736) + (-0.4472944822768944, 0.23857070427230864) + (-0.44286276657603074, 0.23619451089282717) + (-0.43842509047413203, 0.23382946758569845) + (-0.433981482024409, 0.23147558930177947) + (-0.42953196931757576, 0.22913289092134592) + (-0.42507658048167063, 0.226801387254) + (-0.4206153436818787, 0.2244810930385741) + (-0.41614828712035334, 0.22217202294303995) + (-0.4116754390360384, 0.21987419156441468) + (-0.4071968277044875, 0.21758761342866717) + (-0.4027124814376938, 0.2153123029906321) + (-0.3982224285838931, 0.21304827463390796) + (-0.39372669752740896, 0.21079554267077927) + (-0.3892253166884473, 0.2085541213421125) + (-0.3847183145229408, 0.20632402481727863) + (-0.3802057195223518, 0.20410526719405442) + (-0.3756875602134998, 0.20189786249853747) + (-0.3711638651583794, 0.19970182468505704) + (-0.3666346629539804, 0.19751716763608518) + (-0.36209998223210615, 0.19534390516214906) + (-0.35755985165919335, 0.19318205100174457) + (-0.35301429993612865, 0.19103161882124753) + (-0.3484633557980755, 0.18889262221483172) + (-0.34390704801427496, 0.18676507470437453) + (-0.3393454053878875, 0.18464898973938304) + (-0.33477845675578577, 0.18254438069689605) + (-0.33020623098839574, 0.18045126088141217) + (-0.32562875698949734, 0.17836964352479634) + (-0.3210460636960488, 0.1762995417862001) + (-0.3164581800780033, 0.17424096875197836) + (-0.3118651351381245, 0.17219393743560563) + (-0.30726695791180436, 0.17015846077759478) + (-0.30266367746687894, 0.1681345516454147) + (-0.29805532290344294, 0.16612222283340783) + (-0.29344192335367447, 0.16412148706271368) + (-0.2888235079816326, 0.16213235698118034) + (-0.2842001059830971, 0.1601548451632948) + (-0.27957174658535855, 0.15818896411009264) + (-0.2749384590470576, 0.15623472624908907) + (-0.27030027265798173, 0.15429214393419266) + (-0.2656572167388891, 0.15236122944563157) + (-0.26100932064132076, 0.15044199498987454) + (-0.2563566137474157, 0.14853445269955334) + (-0.2516991254697245, 0.1466386146333869) + (-0.24703688525102407, 0.14475449277610486) + (-0.24236992256412937, 0.14288209903837057) + (-0.23769826691171547, 0.14102144525671) + (-0.23302194782611307, 0.13917254319342898) + (-0.22834099486914639, 0.1373354045365489) + (-0.22365543763191986, 0.13551004089972252) + (-0.2189653057346559, 0.13369646382217004) + (-0.21427062882648962, 0.13189468476859934) + (-0.20957143658528943, 0.13010471512913635) + (-0.20486775871746765, 0.12832656621925254) + (-0.20015962495779338, 0.126560249279694) + (-0.19544706506920384, 0.12480577547640936) + (-0.19073010884261632, 0.12306315590047956) + (-0.18600878609673854, 0.1213324015680477) + (-0.18128312667788837, 0.11961352342025178) + (-0.17655316045978642, 0.11790653232314874) + (-0.17181891734339272, 0.11621143906765607) + (-0.1670804272566908, 0.1145282543694719) + (-0.1623377201545233, 0.1128569888690183) + (-0.1575908260183847, 0.11119765313136631) + (-0.1528397748562399, 0.10955025764617221) + (-0.14808459670233254, 0.10791481282761084) + (-0.14332532161699596, 0.10629132901430993) + (-0.13856197968646222, 0.10467981646928415) + (-0.1337946010226725, 0.10308028537987113) + (-0.12902321576308506, 0.10149274585766532) + (-0.12424785407049266, 0.09991720793845804) + (-0.1194685461328141, 0.09835368158216728) + (-0.11468532216292615, 0.09680217667278224) + (-0.10989821239845476, 0.09526270301829554) + (-0.1051072471015917, 0.09373527035064377) + (-0.10031245655890209, 0.09221988832564443) + (-0.09551387108113274, 0.09071656652293658) + (-0.09071152100302038, 0.08922531444591875) + (-0.08590543668310002, 0.08774614152168958) + (-0.08109564850351336, 0.0862790571009886) + (-0.07628218686981425, 0.08482407045813556) + (-0.07146508221078407, 0.08338119079097472) + (-0.06664436497822879, 0.08195042722081358) + (-0.06182006564679321, 0.08053178879236644) + (-0.05699221471376703, 0.0791252844736976) + (-0.05216084269889132, 0.07773092315616492) + (-0.047325980144166224, 0.07634871365436191) + (-0.042487657613657914, 0.0749786647060644) + (-0.037645905693304726, 0.07362078497217328) + (-0.032800754990724545, 0.07227508303666053) + (-0.02795223613501907, 0.07094156740651503) + (-0.02310037977658741, 0.06962024651168952) + (-0.018245216586921686, 0.06831112870504574) + (-0.013386777258420635, 0.06701422226230203) + (-0.008525092504192866, 0.06572953538198223) + (-0.003660193057863692, 0.06445707618536245) + (0.0012078903266197205, 0.06319685271642062) + (0.00607912687518275, 0.06194887294178475) + (0.010953485793819273, 0.060713144750683457) + (0.015830936268777906, 0.059489675954896626) + (0.02071144746677589, 0.05827847428870303) + (0.025594988535167895, 0.05707954740883636) + (0.030481528602168795, 0.05589290289443061) + (0.03537103677702286, 0.05471854824697897) + (0.04026348215021813, 0.053556490890280806) + (0.04515883379367319, 0.05240673817039809) + (0.05005706076093425, 0.05126929735560681) + (0.054958132087370826, 0.05014417563635276) + (0.05986201679037173, 0.04903138012520536) + (0.06476868386954054, 0.04793091785681214) + (0.06967810230689359, 0.046842795787854774) + (0.07459024106704726, 0.045767020797006674) + (0.07950506909743327, 0.04470359968488524) + (0.0844225553284691, 0.04365253917401457) + (0.08934266867378182, 0.04261384590877704) + (0.09426537803037893, 0.04158752645537711) + (0.09919065227886387, 0.04057358730179472) + (0.10411846028362415, 0.03957203485774774) + (0.10904877089302994, 0.03858287545465) + (0.1139815529396308, 0.0376061153455709) + (0.11891677524035305, 0.0366417607051972) + (0.12385440659669644, 0.03568981762979284) + (0.12879441579493367, 0.03475029213716074) + (0.1337367716062985, 0.03382319016660573) + (0.13868144278720257, 0.03290851757889457) + (0.14362839807940686, 0.03200628015622198) + (0.14857760621024685, 0.03111648360217112) + (0.15352903589280453, 0.030239133541680285) + (0.1584826558261248, 0.029374235521005154) + (0.16343843469540525, 0.028521795007684814) + (0.16839634117219526, 0.027681817390507124) + (0.17335634391459454, 0.0268543079794743) + (0.17831841156745087, 0.02603927200576961) + (0.1832825127625587, 0.025236714621724277) + (0.18824861611885874, 0.024446640900784633) + (0.193216690242628, 0.023669055837481467) + (0.19818670372769737, 0.022903964347394945) + (0.20315862515562372, 0.022151371267128406) + (0.20813242309591684, 0.02141128135427328) + (0.21310806610621152, 0.02068369928738223) + (0.218085522732486, 0.01996862966593782) + (0.22306476150925159, 0.0192660770103239) + (0.22804575095975366, 0.018576045761797166) + (0.23302845959617047, 0.017898540282459185) + (0.23801285591981242, 0.01723356485522798) + (0.24299890842132083, 0.016581123683812704) + (0.24798658558086917, 0.01594122089268457) + (0.25297585586835347, 0.015313860527053524) + (0.257966687743611, 0.014699046552840267) + (0.262959049656593, 0.01409678285665339) + (0.2679529100475927, 0.013507073245761836) + (0.27294823734741824, 0.012929921448074477) + (0.2779449999776115, 0.012365331112113687) + (0.2829431663506391, 0.011813305806994023) + (0.2879427048700936, 0.01127384902239803) + (0.2929435839308936, 0.010746964168555806) + (0.29794577191948324, 0.010232654576222355) + (0.302949237214032, 0.009730923496657384) + (0.30795394818463684, 0.00924177410160354) + (0.31295987319351276, 0.0087652094832682) + (0.31796698059521245, 0.00830123265430105) + (0.3229752387368017, 0.007849846547778982) + (0.3279846159580788, 0.0074110540171838934) + (0.33299508059176597, 0.006984857836386249) + (0.33800660096371116, 0.006571260699628212) + (0.3430191453930884, 0.006170265221504989) + (0.3480326821925981, 0.005781873936949733) + (0.3530471796686671, 0.0054060893012164435) + (0.35806260612164953, 0.005042913689865314) + (0.3630789298460267, 0.0046923493987474085) + (0.36809611913060947, 0.004354398643989343) + (0.37311414225873185, 0.00402906356198085) + (0.3781329675084617, 0.003716346209360344) + (0.3831525631527946, 0.0034162485630013784) + (0.38817289745985595, 0.0031287725200015437) + (0.3931939386931016, 0.0028539198976689217) + (0.3982156551115185, 0.002591692433511872) + (0.40323801496982536, 0.0023420917852274847) + (0.4082609865186734, 0.0021051195306913684) + (0.4132845380048485, 0.0018807771679469898) + (0.41830863767146537, 0.0016690661151972375) + (0.4233332537581785, 0.0014699877107944292) + (0.4283583545013761, 0.0012835432132327629) + (0.4333839081343825, 0.0011097338011394342) + (0.4384098828876591, 0.0009485605732681979) + (0.4434362469890051, 0.0008000245484918178) + (0.4484629686637584, 0.0006641266657951839) + (0.4534900161349965, 0.0005408677842706489) + (0.45851735762373735, 0.00043024868311158926) + (0.4635449613491419, 0.0003322700616072982) + (0.46857279552870645, 0.0002469325391398769) + (0.4736008283784827, 0.00017423665517868336) + (0.47862902811325414, 0.00011418286927789012) + (0.4836573629467562, 6.677156107381954e-5) + (0.4886858010918687, 3.200303028161322e-5) + (0.49371431076081834, 9.877496694121746e-6) + (0.4987428601653795, 3.9510017990629365e-7) + (0.5037714175170755, 3.555900683238633e-6) + (0.5087999510273795, 1.9359878222324767e-5) + (0.513828428907917, 4.780693289108129e-5) + (0.5188568193706581, 8.889688485846925e-5) + (0.5238850906281379, 0.00014262947437027051) + (0.5289132108936312, 0.00020900436175064208) + (0.533941148381381, 0.00028802112740411445) + (0.5389688713067736, 0.0003796792718182562) + (0.5439963478865588, 0.0004839782155670047) + (0.5490235463390419, 0.0006009172993142187) + (0.5540504348842864, 0.0007304957838176751) + (0.5590769817443147, 0.0008727128499341763) + (0.5641031551433098, 0.0010275675986242128) + (0.5691289233078146, 0.0011950590509581804) + (0.5741542544669365, 0.001375186148122376) + (0.5791791168525378, 0.0015679477514247697) + (0.5842034786994568, 0.0017733426423041099) + (0.5892273082456816, 0.0019913695223361394) + (0.5942505737325798, 0.002222027013242034) + (0.5992732434050723, 0.0024653136568975054) + (0.6042952855118532, 0.002721227915341462) + (0.6093166683055826, 0.0029897681707868884) + (0.6143373600430881, 0.003270932725629505) + (0.6193573289855662, 0.0035647198024597593) + (0.6243765433987821, 0.0038711275440728166) + (0.6293949715532716, 0.004190154013482106) + (0.6344125817245421, 0.004521797193929977) + (0.6394293421932649, 0.004866054988900359) + (0.6444452212454955, 0.005222925222134078) + (0.6494601871728469, 0.005592405637639519) + (0.654474208272719, 0.005974493899710165) + (0.6594872528484717, 0.006369187592936587) + (0.6644992892096454, 0.0067764842222231) + (0.6695102856721524, 0.0071963812128037485) + (0.6745202105584787, 0.007628875910257404) + (0.6795290321978841, 0.008073965580526199) + (0.6845367189266031, 0.008531647409930843) + (0.6895432390880445, 0.009001918505190387) + (0.6945485610329935, 0.009484775893439323) + (0.6995526531198026, 0.009980216522245788) + (0.7045554837146117, 0.010488237259633326) + (0.7095570211915211, 0.011008834894097319) + (0.7145572339328197, 0.011542006134628524) + (0.7195560903291585, 0.012087747610731503) + (0.7245535587797698, 0.012646055872447048) + (0.7295496076926585, 0.013216927390373945) + (0.7345442054848028, 0.013800358555690728) + (0.7395373205823547, 0.014396345680179223) + (0.7445289214208388, 0.015004884996247414) + (0.7495189764453526, 0.01562597265695298) + (0.7545074541107671, 0.016259604736029054) + (0.759494322881918, 0.016905777227906205) + (0.7644795512338238, 0.017564486047741523) + (0.7694631076518608, 0.01823572703144083) + (0.7744449606319819, 0.018919495935687758) + (0.7794250786809065, 0.019615788437968407) + (0.7844034303163213, 0.020324600136600868) + (0.7893799840670801, 0.021045926550760985) + (0.7943547084734017, 0.021779763120511664) + (0.7993275720870696, 0.022526105206832403) + (0.8042985434716305, 0.023284948091646607) + (0.8092675912025928, 0.02405628697785378) + (0.8142346838676272, 0.024840116989358174) + (0.8191997900667586, 0.02563643317109965) + (0.8241628784125745, 0.026445230489086535) + (0.8291239175304168, 0.027266503830425837) + (0.8340828760585819, 0.028100248003355865) + (0.8390397226485187, 0.028946457737280218) + (0.8439944259650269, 0.029805127682799082) + (0.8489469546864555, 0.030676252411744986) + (0.8538972775049, 0.03155982641721633) + (0.8588453631264008, 0.032455844113611354) + (0.8637911802711429, 0.033364299836665445) + (0.8687346976736461, 0.034285187843484444) + (0.873675884082974, 0.0352185023125835) + (0.8786147082629236, 0.03616423734392149) + (0.8835511389922255, 0.03712238695894077) + (0.88848514506474, 0.03809294510060246) + (0.8934166952896557, 0.039075905633426666) + (0.8983457584916859, 0.0400712623435302) + (0.9032723035112658, 0.04107900893866634) + (0.9081962992047514, 0.04209913904826501) + (0.9131177144446074, 0.043131646223470765) + (0.9180365181196235, 0.04417652393718785) + (0.9229526791350862, 0.0452337655841164) + (0.927866166412995, 0.04630336448079864) + (0.9327769488922502, 0.04738531386565814) + (0.93768499552885, 0.04847960689904385) + (0.9425902752960883, 0.04958623666327333) + (0.9474927571847496, 0.0507051961626761) + (0.9523924102033057, 0.051836478323638246) + (0.9572892033781127, 0.052980075994646825) + (0.9621831057535992, 0.054135981946334066) + (0.9670740863924799, 0.05530418887152688) + (0.9719621143759258, 0.056484689385286835) + (0.9768471588037875, 0.05767747602496365) + (0.981729188794764, 0.05888254125023673) + (0.9866081734866174, 0.06009987744316647) + (0.9914840820363593, 0.0613294769082402) + (0.9963568836204474, 0.06257133187242281) + (1.0012265474349804, 0.06382543448520384) + (1.0060930426958925, 0.06509177681864875) + (1.010956338639149, 0.06637035086744825) + (1.0158164045209404, 0.0676611485489691) + (1.020673209617871, 0.06896416170330366) + (1.025526723227169, 0.07027938209332629) + (1.0303769146668578, 0.07160680140473819) + (1.0352237532759747, 0.07294641124612755) + (1.040067208414741, 0.0742982031490158) + (1.0449072494647735, 0.07566216856791619) + (1.04974384582927, 0.07703829888038483) + (1.0545769669332041, 0.07842658538707714) + (1.0594065822235184, 0.07982701931180114) + (1.0642326611693183, 0.08123959180157425) + (1.069055173262064, 0.0826642939266784) + (1.0738740880157662, 0.08410111668071774) + (1.0786893749671695, 0.08555005098067214) + (1.0835010036759636, 0.0870110876669612) + (1.0883089437249511, 0.08848421750349322) + (1.0931131647202657, 0.08996943117773348) + (1.0979136362915407, 0.0914667193007539) + (1.1027103280921173, 0.09297607240729877) + (1.1075032097992301, 0.09449748095584187) + (1.1122922511141993, 0.09603093532864704) + (1.117077421762622, 0.0975764258318299) + (1.1218586914945652, 0.09913394269541786) + (1.126636030084755, 0.10070347607341268) + (1.1314094073327707, 0.10228501604385287) + (1.1361787930632266, 0.10387855260887457) + (1.140944157125982, 0.10548407569477947) + (1.1457054693963058, 0.10710157515209073) + (1.1504626997750942, 0.10873104075562656) + (1.1552158181890357, 0.11037246220455588) + (1.15996479459082, 0.11202582912247006) + (1.1647095989593188, 0.11369113105744488) + (1.169450201299778, 0.11536835748210827) + (1.174186571644007, 0.11705749779370578) + (1.1789186800505682, 0.11875854131416874) + (1.1836464966049662, 0.1204714772901807) + (1.188369991419839, 0.12219629489324646) + (1.1930891346351373, 0.12393298321975799) + (1.1978038964183335, 0.12568153129106907) + (1.2025142469645842, 0.12744192805355614) + (1.207220156496945, 0.12921416237869798) + (1.211921595266534, 0.13099822306313658) + (1.2166185335527393, 0.13279409882875504) + (1.2213109416633965, 0.13460177832274534) + (1.2259987899349802, 0.13642125011768158) + (1.2306820487327892, 0.13825250271159106) + (1.2353606884511361, 0.14009552452802798) + (1.2400346795135333, 0.14195030391614605) + (1.2447039923728815, 0.14381682915077287) + (1.2493685975116506, 0.1456950884324817) + (1.2540284654420755, 0.14758506988766995) + (1.2586835667063359, 0.14948676156863105) + (1.2633338718767448, 0.1514001514536314) + (1.2679793515559348, 0.15332522744698607) + (1.272619976377042, 0.15526197737913505) + (1.277255717003894, 0.15721038900672046) + (1.281886544131194, 0.15917045001266383) + (1.286512428484706, 0.16114214800624405) + (1.291133340821441, 0.1631254705231755) + (1.2957492519298421, 0.1651204050256876) + (1.3003601326299634, 0.16712693890260155) + (1.3049659537736646, 0.16914505946941438) + (1.3095666862447874, 0.171174753968375) + (1.3141623009593428, 0.17321600956856753) + (1.3187527688656941, 0.17526881336599076) + (1.3233380609447403, 0.17733315238364122) + (1.3279181482101, 0.17940901357159333) + (1.3324930017082948, 0.18149638380708377) + (1.3370625925189317, 0.18359524989459342) + (1.3416268917548884, 0.1857055985659315) + (1.346185870562489, 0.18782741648031687) + (1.350739500121695, 0.18996069022446682) + (1.3552877516462836, 0.19210540631267858) + (1.3598305963840287, 0.19426155118691524) + (1.3643680056168843, 0.1964291112168921) + (1.3688999506611652, 0.198608072700162) + (1.3734264028677288, 0.20079842186220276) + (1.3779473336221573, 0.20300014485650442) + (1.3824627143449313, 0.20521322776465278) + (1.3869725164916276, 0.20743765659642688) + (1.3914767115530755, 0.20967341728987487) + (1.3959752710555628, 0.21192049571141536) + (1.4004681665609926, 0.21417887765591592) + (1.404955369667079, 0.2164485488467902) + (1.40943685200752, 0.21872949493608562) + (1.4139125852521777, 0.22102170150457412) + (1.4183825411072584, 0.2233251540618426) + (1.4228466913154896, 0.22563983804638643) + (1.427305007656301, 0.22796573882569993) + (1.4317574619460025, 0.23030284169636972) + (1.4362040260379552, 0.23265113188416486) + (1.440644671822767, 0.23501059454413764) + (1.4450793712284467, 0.23738121476070617) + (1.4495080962206055, 0.23976297754776166) + (1.4539308188026117, 0.24215586784875076) + (1.4583475110157853, 0.2445598705367793) + (1.4627581449395657, 0.2469749704147044) + (1.4671626926916903, 0.24940115221523151) + (1.4715611264283717, 0.25183840060101037) + (1.4759534183444716, 0.25428670016473176) + (1.4803395406736788, 0.25674603542922614) + (1.484719465688685, 0.2592163908475613) + (1.4890931657013526, 0.26169775080313595) + (1.493460613062907, 0.26419009960978923) + (1.4978217801640874, 0.26669342151188635) + (1.5021766394353475, 0.26920770068443134) + (1.5065251633470054, 0.27173292123315496) + (1.5108673244094346, 0.2742690671946246) + (1.5152030951732312, 0.2768161225363408) + (1.5195324482293873, 0.27937407115683865) + (1.5238553562094659, 0.2819428968857911) + (1.5281717917857731, 0.28452258348410986) + (1.5324817276715308, 0.2871131146440489) + (1.5367851366210505, 0.28971447398930805) + (1.5410819914298992, 0.2923266450751316) + (1.5453722649350863, 0.29494961138842357) + (1.5496559300152137, 0.2975833563478367) + (1.5539329595906717, 0.3002278633038935) + (1.5582033266237862, 0.3028831155390763) + (1.562467004119008, 0.30554909626794435) + (1.566723965123074, 0.3082257886372346) + (1.5709741827251809, 0.3109131757259691) + (1.575217630057154, 0.31361124054556244) + (1.5794542802936178, 0.3163199660399285) + (1.583684106652165, 0.3190393350855889) + (1.5879070823935277, 0.3217693304917819) + (1.5921231808217393, 0.32450993500056624) + (1.5963323752843188, 0.32726113128694134) + (1.6005346391724178, 0.33002290195894113) + (1.6047299459210116, 0.332795229557761) + (1.6089182690090456, 0.3355780965578523) + (1.613099581959619, 0.33837148536704476) + (1.6172738583401454, 0.34117537832665246) + (1.6214410717625196, 0.343989757711586) + (1.6256011958832866, 0.34681460573046574) + (1.6297542044038067, 0.3496499045257331) + (1.6339000710704221, 0.35249563617376367) + (1.6380387696746248, 0.35535178268498213) + (1.642170274053214, 0.3582183260039702) + (1.646294558088479, 0.3610952480095926) + (1.6504115957083416, 0.36398253051509655) + (1.6545213608865401, 0.366880155268239) + (1.6586238276427836, 0.3697881039513957) + (1.6627189700429192, 0.3727063581816794) + (1.6668067621990958, 0.37563489951105433) + (1.6708871782699275, 0.3785737094264545) + (1.6749601924606567, 0.38152276934990015) + (1.6790257790233185, 0.38448206063861456) + (1.6830839122569028, 0.38745156458514374) + (1.687134566507513, 0.39043126241747017) + (1.6911777161685355, 0.39342113529913747) + (1.6952133356807961, 0.39642116432936647) + (1.6992413995327238, 0.39943133054317426) + (1.7032618822605112, 0.4024516149114945) + (1.7072747584482753, 0.4054819983412987) + (1.7112800027282193, 0.40852246167571526) + (1.7152775897807917, 0.41157298569415235) + (1.7192674943348474, 0.41463355111241773) + (1.723249691167808, 0.41770413858284305) + (1.727224155105816, 0.4207847286944013) + (1.7311908610239028, 0.4238753019728354) + (1.7351497838461412, 0.4269758388807785) + (1.7391008985458054, 0.4300863198178768) + (1.7430441801455299, 0.4332067251209153) + (1.7469796037174667, 0.43633703506394017) + (1.750907144383443, 0.4394772298583849) + (1.7548267773151187, 0.4426272896531951) + (1.7587384777341435, 0.4457871945349532) + (1.7626422209123138, 0.4489569245280065) + (1.766537982171724, 0.4521364595945876) + (1.7704257368849359, 0.45532577963495235) + (1.774305460475116, 0.45852486448749286) + (1.7781771284162065, 0.4617336939288763) + (1.782040716233072, 0.464952247674167) + (1.7858961995016565, 0.46818050537695655) + (1.7897435538491382, 0.47141844662949195) + (1.7935827549540826, 0.47466605096280445) + (1.7974137785465971, 0.4779232978468393) + (1.801236600408485, 0.48119016669058645) + (1.8050511963733926, 0.48446663684220503) + (1.8088575423269764, 0.4877526875891671) + (1.8126556142070354, 0.49104829815837037) + (1.8164453880036846, 0.4943534477162881) + (1.820226839759487, 0.49766811536908473) + (1.8239999455696192, 0.5009922801627587) + (1.8277646815820168, 0.5043259210832711) + (1.831521023997525, 0.5076690170566778) + (1.8352689490700511, 0.5110215469492645) + (1.8390084331067125, 0.5143834895676789) + (1.8427394524679879, 0.5177548236590654) + (1.8464619835678673, 0.5211355279112002) + (1.8501760028739955, 0.524525580952621) + (1.853881486907834, 0.5279249613527737) + (1.8575784122447905, 0.5313336476221313) + (1.861266755514388, 0.5347516182123484) + (1.8649464934003925, 0.5381788515163792) + (1.8686176026409755, 0.5416153258686278) + (1.8722800600288536, 0.5450610195450787) + (1.875933842411437, 0.5485159107634356) + (1.879578926690976, 0.551979977683259) + (1.8832152898247063, 0.5554531984061044) + (1.886842908824996, 0.5589355509756604) + (1.890461760759491, 0.562427013377889) + (1.8940718227512536, 0.5659275635411587) + (1.8976730719789223, 0.5694371793363977) + (1.9012654856768356, 0.572955838577214) + (1.904849041135197, 0.5764835190200579) + (1.9084237157001993, 0.5800201983643414) + (1.911989486774182, 0.5835658542525946) + (1.9155463318157675, 0.5871204642706) + (1.9190942283400052, 0.5906840059475358) + (1.922633153918513, 0.5942564567561179) + (1.9261630861796202, 0.597837794112742) + (1.9296840028085076, 0.6014279953776267) + (1.9331958815473507, 0.605027037854958) + (1.936698700195454, 0.6086348987930261) + (1.9401924366094054, 0.612251555384383) + (1.9436770687031961, 0.6158769847659684) + (1.9471525744483817, 0.6195111640192736) + (1.9506189318742027, 0.6231540701704685) + (1.9540761190677356, 0.6268056801905593) + (1.957524114174027, 0.6304659709955294) + (1.9609628953962315, 0.6341349194464849) + (1.9643924409957507, 0.6378125023498025) + (1.9678127292923702, 0.6414986964572749) + (1.971223738664396, 0.6451934784662583) + (1.9746254475487937, 0.648896825019821) + (1.9780178344413173, 0.6526087127068845) + (1.9814008778966594, 0.6563291180623854) + (1.98477455652857, 0.6600580175674065) + (1.9881388490100038, 0.6637953876493388) + (1.9914937340732508, 0.6675412046820244) + (1.9948391905100704, 0.6712954449859074) + (1.9981751971718256, 0.6750580848281833) + (2.0015017329696176, 0.6788291004229488) + (2.004818776874419, 0.6826084679313524) + (2.0081263079172045, 0.6863961634617459) + (2.0114243051890885, 0.6901921630698338) + (2.014712747841452, 0.6939964427588274) + (2.0179916150860757, 0.6978089784795902) + (2.0212608861952726, 0.701629746130799) + (2.024520540502021, 0.70545872155909) + (2.02777055740009, 0.7092958805592124) + (2.0310109163441736, 0.7131411988741836) + (2.03424159685002, 0.7169946521954398) + (2.03746257849456, 0.7208562161629914) + (2.0406738409160363, 0.7247258663655769) + (2.0438753638141347, 0.7286035783408178) + (2.0470671269501066, 0.7324893275753679) + (2.050249110146904, 0.7363830895050776) + (2.0534212932893023, 0.740284839515142) + (2.0565836563240296, 0.7441945529402596) + (2.059736179259893, 0.7481122050647868) + (2.062878842167904, 0.7520377711228949) + (2.066011625181405, 0.7559712262987264) + (2.0691345084961963, 0.7599125457265519) + (2.072247472370659, 0.7638617044909277) + (2.0753504971258825, 0.7678186776268541) + (2.0784435631457834, 0.7717834401199262) + (2.0815266508772408, 0.7757559669065084) + (2.084599740830204, 0.7797362328738717) + (2.0876628135778303, 0.7837242128603694) + (2.0907158497565987, 0.7877198816555881) + (2.093758830066438, 0.791723214000509) + (2.096791735270843, 0.7957341845876673) + (2.0998145461970017, 0.7997527680613123) + (2.102827243735913, 0.8037789390175676) + (2.1058298088425103, 0.8078126720045933) + (2.1088222225357747, 0.8118539415227395) + (2.11180446589887, 0.8159027220247239) + (2.1147765200792423, 0.8199589879157707) + (2.1177383662887594, 0.8240227135537963) + (2.1206899858038106, 0.8280938732495491) + (2.123631359965441, 0.8321724412667886) + (2.12656247017946, 0.8362583918224402) + (2.129483297916562, 0.8403516990867599) + (2.1323938247124428, 0.8444523371834973) + (2.1352940321679177, 0.8485602801900598) + (2.138183901949035, 0.852675502137676) + (2.141063415787196, 0.8567979770115608) + (2.143932555479264, 0.860927678751074) + (2.14679130288769, 0.8650645812499) + (2.149639639940613, 0.8692086583561911) + (2.15247754863199, 0.8733598838727561) + (2.155305011021695, 0.8775182315572045) + (2.1581220092356443, 0.8816836751221282) + (2.160928525465902, 0.8858561882352598) + (2.1637245419707956, 0.8900357445196418) + (2.1665100410750284, 0.8942223175537922) + (2.16928500516979, 0.8984158808718716) + (2.172049416712867, 0.9026164079638515) + (2.1748032582287586, 0.9068238722756821) + (2.1775465123087767, 0.9110382472094536) + (2.180279161611171, 0.9152595061235804) + (2.1830011888612235, 0.9194876223329473) + (2.1857125768513708, 0.9237225691091018) + (2.1884133084412998, 0.927964319680401) + (2.191103366558067, 0.9322128472321969) + (2.193782734196203, 0.9364681249069988) + (2.196451394417817, 0.9407301258046443) + (2.1991093303527074, 0.9449988229824695) + (2.2017565251984674, 0.9492741894554797) + (2.20439296222059, 0.953556198196519) + (2.207018624752577, 0.9578448221364435) + (2.2096334961960378, 0.9621400341642845) + (2.2122375600208057, 0.966441807127437) + (2.2148307997650276, 0.970750113831808) + (2.217413199035283, 0.9750649270420126) + (2.2199847415066754, 0.9793862194815244) + (2.222545410922943, 0.9837139638328636) + (2.2250951910965586, 0.9880481327377626) + (2.2276340659088323, 0.9923886987973403) + (2.230162019310014, 0.9967356345722753) + (2.2326790353193937, 1.0010889125829796) + (2.235185098025404, 1.0054485053097717) + (2.237680191585721, 1.009814385193053) + (2.240164300227358, 1.0141865246334736) + (2.242637408246779, 1.0185648959921243) + (2.2450995000099803, 1.0229494715906873) + (2.2475505599526073, 1.027340223711637) + (2.2499905725800375, 1.0317371245983906) + (2.2524195224674886, 1.036140146455503) + (2.254837394260111, 1.0405492614488314) + (2.2572441726730883, 1.0449644417057162) + (2.259639842491729, 1.0493856593151547) + (2.2620243885715685, 1.0538128863279788) + (2.2643977958384607, 1.0582460947570311) + (2.266760049288675, 1.062685256577344) + (2.2691111339889893, 1.0671303437263102) + (2.2714510350767885, 1.071581328103869) + (2.2737797377601536, 1.0760381815726792) + (2.2760972273179583, 1.0805008759582964) + (2.2784034890999623, 1.0849693830493532) + (2.2806985085269003, 1.0894436745977365) + (2.282982271090579, 1.0939237223187654) + (2.285254762353965, 1.0984094978913714) + (2.287515967951278, 1.102900972958277) + (2.289765873588083, 1.1073981191261764) + (2.292004465041374, 1.1119009079659075) + (2.294231728159674, 1.1164093110126434) + (2.296447648863116, 1.1209232997660645) + (2.2986522131435363, 1.1254428456905408) + (2.3008454070645623, 1.1299679202153117) + (2.3030272167617003, 1.1344984947346668) + (2.3051976284424214, 1.1390345406081281) + (2.3073566283862528, 1.1435760291606285) + (2.3095042029448614, 1.148122931682697) + (2.311640338542137, 1.1526752194306307) + (2.3137650216742904, 1.157232863626695) + (2.3158782389099217, 1.1617958354592826) + (2.317979976890118, 1.1663641060831136) + (2.320070222328533, 1.170937646619409) + (2.3221489620114726, 1.1755164281560768) + (2.3242161827979757, 1.1801004217478925) + (2.3262718716198996, 1.1846895984166832) + (2.328316015482003, 1.1892839291515107) + (2.3303486014620267, 1.1938833849088568) + (2.3323696167107744, 1.198487936612798) + (2.334379048452199, 1.203097555155208) + (2.3363768839834735, 1.2077122113959171) + (2.3383631106750853, 1.2123318761629216) + (2.340337715970902, 1.216956520252545) + (2.34230068738826, 1.22158611442964) + (2.344252012518039, 1.2262206294277656) + (2.346191679024743, 1.2308600359493722) + (2.3481196746465764, 1.235504304665989) + (2.3500359871955228, 1.2401534062184083) + (2.3519406045574214, 1.2448073112168703) + (2.353833514692044, 1.2494659902412524) + (2.355714705633168, 1.2541294138412453) + (2.3575841654886607, 1.258797552536558) + (2.3594418824405414, 1.2634703768170796) + (2.361287844745071, 1.2681478571430918) + (2.3631220407328115, 1.2728299639454312) + (2.3649444588087114, 1.277516667625694) + (2.366755087452173, 1.2822079385564156) + (2.368553915217126, 1.2869037470812588) + (2.3703409307321017, 1.2916040635152015) + (2.3721161227003034, 1.2963088581447244) + (2.373879479899678, 1.301018101227999) + (2.3756309911829874, 1.305731762995077) + (2.3773706454778765, 1.3104498136480704) + (2.37909843178695, 1.3151722233613583) + (2.3808143391878316, 1.3198989622817492) + (2.382518356833243, 1.3246300005286986) + (2.3842104739510668, 1.3293653081944714) + (2.3858906798444153, 1.334104855344349) + (2.3875589638916987, 1.3388486120168117) + (2.389215315546694, 1.3435965482237284) + (2.3908597243386094, 1.3483486339505464) + (2.392492179872149, 1.3531048391564822) + (2.394112671827584, 1.3578651337747099) + (2.3957211899608124, 1.362629487712554) + (2.397317724103425, 1.3673978708516703) + (2.398902264162774, 1.3721702530482567) + (2.4004748001220295, 1.3769466041332152) + (2.40203532204025, 1.3817268939123737) + (2.4035838200524404, 1.386511092166648) + (2.4051202843696147, 1.3912991686522531) + (2.406644705278862, 1.396091093100886) + (2.408157073143402, 1.4008868352199184) + (2.4096573784026516, 1.4056863646925881) + (2.411145611572281, 1.4104896511781906) + (2.412621763244276, 1.415296664312271) + (2.4140858240869965, 1.4201073737068186) + (2.4155377848452346, 1.4249217489504482) + (2.4169776363402775, 1.4297397596086137) + (2.4184053694699585, 1.4345613752237731) + (2.4198209752087223, 1.4393865653156093) + (2.4212244446076743, 1.4442152993811965) + (2.422615768794643, 1.4490475468952122) + (2.423994938974234, 1.4538832773101218) + (2.4253619464278855, 1.4587224600563733) + (2.4267167825139233, 1.46356506454259) + (2.4280594386676158, 1.4684110601557647) + (2.4293899064012283, 1.4732604162614524) + (2.4307081773040773, 1.4781131022039669) + (2.4320142430425795, 1.4829690873065644) + (2.433308095360313, 1.4878283408716575) + (2.434589726078059, 1.492690832180985) + (2.4358591270938614, 1.497556530495825) + (2.4371162903830754, 1.5024254050571797) + (2.4383612079984185, 1.5072974250859732) + (2.4395938720700188, 1.512172559783245) + (2.4408142748054678, 1.5170507783303444) + (2.442022408489868, 1.5219320498891262) + (2.443218265485881, 1.5268163436021458) + (2.4444018382337793, 1.5317036285928545) + (2.4455731192514882, 1.5365938739657894) + (2.446732101134638, 1.5414870488067782) + (2.4478787765566095, 1.5463831221831283) + (2.449013138268579, 1.551282063143823) + (2.4501351790995667, 1.5561838407197186) + (2.4512448919564793, 1.561088423923739) + (2.4523422698241557, 1.5659957817510723) + (2.453427305765413, 1.5709058831793665) + (2.454499992921088, 1.5758186971689256) + (2.4555603245100817, 1.5807341926629075) + (2.456608293829402, 1.5856523385875134) + (2.4576438942542067, 1.5905731038521953) + (2.4586671192378438, 1.595496457349845) + (2.459677962311895, 1.6004223679569913) + (2.4606764170862157, 1.6053508045339997) + (2.4616624772489724, 1.6102817359252664) + (2.4626361365666893, 1.6152151309594167) + (2.4635973888842817, 1.6201509584495035) + (2.464546228125096, 1.625089187193196) + (2.4654826482909513, 1.630029785972995) + (2.4664066434621734, 1.634972723556406) + (2.4673182077976357, 1.6399179686961627) + (2.468217335534793, 1.6448654901303994) + (2.469104020989718, 1.6498152565828677) + (2.469978258557142, 1.6547672367631248) + (2.470840042710485, 1.6597213993667344) + (2.4716893680018917, 1.6646777130754633) + (2.4725262290622676, 1.6696361465574798) + (2.473350620601312, 1.6745966684675522) + (2.4741625374075524, 1.6795592474472478) + (2.4749619743483744, 1.6845238521251238) + (2.475748926370059, 1.689490451116943) + (2.4765233884978093, 1.694459013025848) + (2.4772853558357864, 1.6994295064425853) + (2.4780348235671372, 1.70440189994568) + (2.4787717869540273, 1.7093761621016526) + (2.479496241337669, 1.7143522614652082) + (2.4802081821383517, 1.7193301665794385) + (2.48090760485547, 1.7243098459760196) + (2.4815945050675534, 1.7292912681754116) + (2.482268878432295, 1.734274401687057) + (2.482930720686575, 1.739259215009582) + (2.483580027646492, 1.7442456766309866) + (2.484216795207388, 1.7492337550288635) + (2.4848410193438712, 1.7542234186705703) + (2.485452696109849, 1.7592146360134573) + (2.486051821638544, 1.7642073755050414) + (2.4866383921425252, 1.769201605583223) + (2.4872124039137287, 1.774197294676479) + (2.487773853323481, 1.779194411204062) + (2.488322736822524, 1.784192923576202) + (2.488859050941037, 1.7891928001943036) + (2.489382792288655, 1.7941940094511484) + (2.4898939575544965, 1.799196519731095) + (2.490392543507178, 1.8042002994102704) + (2.490878546994839, 1.8092053168567888) + (2.49135196494516, 1.8142115404309265) + (2.491812794365383, 1.8192189384853488) + (2.492261032342328, 1.8242274793652837) + (2.4926966760424136, 1.8292371314087426) + (2.4931197227116755, 1.8342478629467103) + (2.4935301696757817, 1.8392596423033472) + (2.4939280143400513, 1.8442724377961903) + (2.494313254189468, 1.849286217736353) + (2.494685886788701, 1.854300950428725) + (2.4950459097821165, 1.8593166041721751) + (2.4953933208937915, 1.8643331472597429) + (2.4957281179275332, 1.8693505479788575) + (2.496050298766889, 1.8743687746115127) + (2.4963598613751605, 1.8793877954344955) + (2.4966568037954158, 1.8844075787195596) + (2.4969411241505046, 1.889428092733646) + (2.4972128206430675, 1.8944493057390746) + (2.4974718915555476, 1.8994711859937463) + (2.497718335250202, 1.9044937017513446) + (2.4979521501691133, 1.9095168212615343) + (2.4981733348341963, 1.9145405127701651) + (2.498381887847211, 1.9195647445194712) + (2.4985778078897676, 1.9245894847482656) + (2.4987610937233384, 1.9296147016921583) + (2.498931744189264, 1.934640363583734) + (2.4990897582087603, 1.939666438652771) + (2.499235134782926, 1.9446928951264353) + (2.4993678729927487, 1.9497197012294802) + (2.49948797199911, 1.9547468251844495) + (2.4995954310427924, 1.9597742352118779) + (2.499690249444483, 1.9648018995304912) + (2.4997724266047774, 1.969829786357408) + (2.499841962004185, 1.9748578639083398) + (2.4998988552031305, 1.9798861003977948) + (2.4999431058419583, 1.984914464039271) + (2.499974713640933, 1.9899429230454677) + (2.4999936784002426, 1.9949714456284795) + (2.5, 2.0) +```` + +````julia fig, ax, sc = lines(points) ```` +```@raw html + +``` + Let's now triangulate this domain. We need to put the arc into its own vector, and we still need to pass a set of points into `triangulate`: -````@example curve_bounded +````julia points = NTuple{2,Float64}[] rng = StableRNG(123) tri = triangulate(points; boundary_nodes=[arc], rng) ```` -````@example curve_bounded +```` +Delaunay Triangulation. + Number of vertices: 8 + Number of triangles: 6 + Number of edges: 13 + Has boundary nodes: true + Has ghost triangles: true + Curve-bounded: true + Weighted: false + Constrained: true +```` + +````julia fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Notice that the domain doesn't look like a circle yet. This is because using `triangulate` on the curve just by itself isn't enough. In fact, the triangulation returned in this case is simply one where: @@ -99,12 +2630,16 @@ curve just by itself isn't enough. In fact, the triangulation returned in this c This is probably not what we actually want, though. Instead, we need to refine the domain using mesh refinement. The syntax for this is the same as in the [refinement tutorial](../tutorials/refinement.md): -````@example curve_bounded +````julia refine!(tri; max_area=1e-1, rng) fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Much better! We have now triangulated our first curve-bounded domain. ## A Boundary Defined by Multiple Parametric Curves @@ -112,10 +2647,24 @@ We now take a domain which is defined by three separate curves: a circular arc, For piecewise linear curves, we use the same method as we would in previous tutorials, where instead of using coordinates to define the boundary we use numbers that refer to points in the point set. To start, the point set we will be using is -````@example curve_bounded +````julia points = [(0.1, 0.1), (0.15, 0.15), (0.23, 0.23), (0.009, 0.11), (0.0, -2.0), (0.2, -1.7), (0.000591, 0.00019), (0.111, -0.005), (-0.0001, -0.00991), (1.0, 0.0)] ```` +```` +10-element Vector{Tuple{Float64, Float64}}: + (0.1, 0.1) + (0.15, 0.15) + (0.23, 0.23) + (0.009, 0.11) + (0.0, -2.0) + (0.2, -1.7) + (0.000591, 0.00019) + (0.111, -0.005) + (-0.0001, -0.00991) + (1.0, 0.0) +```` + Now, for the boundary, we will take: - A circular arc defined between $(1, 0)$ and $(0, 1)$ centred at $(0, 0)$. @@ -124,26 +2673,37 @@ Now, for the boundary, we will take: We can define these curves as follows: -````@example curve_bounded +````julia arc = CircularArc((1.0, 0.0), (0.0, 1.0), (0.0, 0.0)) bspl = BSpline([(0.0, 1.0), (-1.0, 2.0), (-2.0, 0.0), (-2.0, -1.0), (0.0, -2.0)]) pce = [5, 6, 10] ```` +```` +3-element Vector{Int64}: + 5 + 6 + 10 +```` + Notice that we still must make sure that the curves connect, and that together the curves define a positively-oriented boundary. The domain we get from this looks like: -````@example curve_bounded +````julia t = LinRange(0, 1, 1000) pts = vcat(arc.(t), bspl.(t), points[pce]) fig, ax, sc = lines(pts) fig ```` +```@raw html + +``` + Let's now get a triangulation of this domain. We will use a custom constraint to force triangles closer to the origin to be smaller than those outside of it. -````@example curve_bounded +````julia curve = [[arc], [bspl], pce] rng = StableRNG(123) tri = triangulate(points; boundary_nodes=curve, rng) @@ -157,11 +2717,15 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + ## A Complicated Multiply-Connected Disjoint Domain For our last example, we take a complicated case with a domain that is disjoint, and where the individual domains are multiply-connected. Let us give the domain followed by an explanation of how it is defined: -````@example curve_bounded +````julia curve = [ [ [1, 2, 3], [EllipticalArc((2.0, 0.0), (-2.0, 0.0), (0.0, 0.0), 2, 1 / 2, 0.0)] @@ -187,18 +2751,22 @@ t = LinRange(0, 1, 1000) fig fig = Figure() ax = Axis(fig[1, 1]) -lines!(ax, [get_point(tri, curve[1][1]...)...], color=:red, label="(1, 2, 3)") +lines!(ax, [get_point(points, curve[1][1]...)...], color=:red, label="(1, 2, 3)") lines!(ax, curve[1][2][1].(t), color=:red, linestyle=:dashdot, label="EllipticalArc") lines!(ax, curve[2][1][1].(t), color=:green, label="BSpline") -lines!(ax, [get_point(tri, curve[3][1]...)...], color=:blue, label="(4, 5, 6, 7, 4)") +lines!(ax, [get_point(points, curve[3][1]...)...], color=:blue, label="(4, 5, 6, 7, 4)") lines!(ax, curve[4][1][1].(t), color=:purple, label="BezierCurve") lines!(ax, curve[4][2][1].(t), color=:purple, linestyle=:dashdot, label="CatmullRomSpline") -lines!(ax, [get_point(tri, curve[5][1]...)...], color=:orange, label="(12, 11, 10, 12)") +lines!(ax, [get_point(points, curve[5][1]...)...], color=:orange, label="(12, 11, 10, 12)") lines!(ax, curve[6][1][1].(t), color=:black, label="CircularArc") fig[1, 2] = Legend(fig, ax, "Curve") fig ```` +```@raw html + +``` + Let's walk through the definition of `curve`. - The first domain that is defined is the red curve in the above figure, defined in terms of a piecewise linear portion and an elliptical arc. @@ -218,7 +2786,7 @@ the curves connect at the correct points. Let's now triangulate. -````@example curve_bounded +````julia rng = StableRNG(123) tri = triangulate(copy(points); boundary_nodes=curve, rng) # copying so that we don't mutate for the next section refine!(tri; max_area=1e-2) @@ -226,6 +2794,10 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + ### Using Custom Constraints to Control Refinement Let's give another example of using custom constraints to better control the refinement within different domains. Referencing the previous figure where we showed each domain by colour, let us try and use a coarse mesh in the region bounded between the red and green @@ -235,7 +2807,7 @@ purple and orange curves. To do this, we must have a method for deciding which r To write this function, we note that the indices of these polygons are 1, 3, and 4 for the red, blue, and purple regions, respectively. -````@example curve_bounded +````julia poly_constraint = (_tri, T) -> begin i, j, k = triangle_vertices(T) p, q, r = get_point(_tri, i, j, k) @@ -261,6 +2833,10 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + ## Defining a New Parametric Curve Let us now give an example where we define a domain by a parametric curve that is not provided natively by this package. For this example, we consider the astroid, where @@ -280,7 +2856,7 @@ with this package we need: Let's now meet these requirements. -````@example curve_bounded +````julia struct Astroid <: DelaunayTriangulation.AbstractParametricCurve lookup_table::Vector{NTuple{2,Float64}} end @@ -311,7 +2887,7 @@ end Let's now define an astroid curve and triangulate it. -````@example curve_bounded +````julia function Astroid(n::Int) lookup_table = Vector{NTuple{2,Float64}}(undef, n) c = Astroid(lookup_table) @@ -328,6 +2904,10 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/curve_bounded.jl). @@ -351,7 +2931,7 @@ p = (xc + r, yc) c = (xc, yc) arc = CircularArc(p, p, c) -typeof(arc) |> supertype +typeof(arc) |> supertype |> supertype t = LinRange(0, 1, 2500) points = arc.(t) @@ -417,13 +2997,13 @@ t = LinRange(0, 1, 1000) fig fig = Figure() ax = Axis(fig[1, 1]) -lines!(ax, [get_point(tri, curve[1][1]...)...], color=:red, label="(1, 2, 3)") +lines!(ax, [get_point(points, curve[1][1]...)...], color=:red, label="(1, 2, 3)") lines!(ax, curve[1][2][1].(t), color=:red, linestyle=:dashdot, label="EllipticalArc") lines!(ax, curve[2][1][1].(t), color=:green, label="BSpline") -lines!(ax, [get_point(tri, curve[3][1]...)...], color=:blue, label="(4, 5, 6, 7, 4)") +lines!(ax, [get_point(points, curve[3][1]...)...], color=:blue, label="(4, 5, 6, 7, 4)") lines!(ax, curve[4][1][1].(t), color=:purple, label="BezierCurve") lines!(ax, curve[4][2][1].(t), color=:purple, linestyle=:dashdot, label="CatmullRomSpline") -lines!(ax, [get_point(tri, curve[5][1]...)...], color=:orange, label="(12, 11, 10, 12)") +lines!(ax, [get_point(points, curve[5][1]...)...], color=:orange, label="(12, 11, 10, 12)") lines!(ax, curve[6][1][1].(t), color=:black, label="CircularArc") fig[1, 2] = Legend(fig, ax, "Curve") fig diff --git a/docs/src/tutorials/custom_primitive.md b/docs/src/tutorials/custom_primitive.md index 7e74b32d4..124994060 100644 --- a/docs/src/tutorials/custom_primitive.md +++ b/docs/src/tutorials/custom_primitive.md @@ -13,18 +13,17 @@ already defined for most methods that can be overloaded for these primitives, bu completely new structs you are required to define many new methods. The packages we will be using are loaded below. -````@example custom_primitive +````julia using DelaunayTriangulation using CairoMakie using Random using StableRNGs const DT = DelaunayTriangulation; -nothing #hide ```` Let us now define our custom structs. -````@example custom_primitive +````julia struct CustomPoint x::Float64 y::Float64 @@ -61,7 +60,7 @@ end Now, depending on your application you might not need to define all possible methods. For example, if you just want an unconstrained triangulation, all you need are `CustomPoint` and `CustomPoints`. So, let's define our methods for increasing complexity. First, for unconstrained triangulations, all we need to define are: -````@example custom_primitive +````julia DT.getx(p::CustomPoint) = p.x DT.gety(p::CustomPoint) = p.y DT.number_type(::Type{CustomPoint}) = Float64 @@ -87,9 +86,13 @@ Base.length(triangles::CustomTriangles) = length(triangles.triangles) CustomTriangles() = CustomTriangles(Vector{CustomTriangle}()) ```` +```` +Main.var"##254".CustomTriangles +```` + Now let's suppose we want to add in some segments. For this, we also need the following methods. -````@example custom_primitive +````julia DT.construct_edge(::Type{CustomSegment}, i, j) = CustomSegment(i, j) DT.initial(e::CustomSegment) = e.i DT.terminal(e::CustomSegment) = e.j @@ -103,9 +106,13 @@ Base.length(segments::CustomSegments) = length(segments.segments) CustomSegments() = CustomSegments(Set{CustomSegment}()) ```` +```` +Main.var"##254".CustomSegments +```` + Next, we want to allow for defining a boundary. For this, we need the following methods. -````@example custom_primitive +````julia DT.has_multiple_curves(::CustomPolygons{N}) where {N} = N > 1 DT.has_multiple_curves(::CustomPolygon) = false DT.has_multiple_curves(::CustomPolygonSegment) = false @@ -126,13 +133,13 @@ for working with Voronoi tessellations and centroidal Voronoi tessellations. For triangulations, so you of course would not have to define the methods we have just defined for segments and boundaries. For Voronoi tessellations, no extra methods are needed, except for -````@example custom_primitive +````julia Base.empty!(segments::CustomSegments) = empty!(segments.segments) ```` if we specify `EdgesType` inside `triangulate` together with `clip=true` (and not otherwise). For centroidal Voronoi tessellations, we need -````@example custom_primitive +````julia DT.set_point!(points::CustomPoints, i, x, y) = points.points[i] = CustomPoint(x, y) ```` @@ -140,7 +147,7 @@ We also need to consider methods needed for mesh refinement. We could also consi but an example of this is already given in the [curve bounded tutorial](../tutorials/curve_bounded.md), so we will only consider methods with piecewise linear boundaries. For refinement, we need the following methods: -````@example custom_primitive +````julia Base.pop!(points::CustomPoints) = pop!(points.points) DT.push_point!(points::CustomPoints, x, y) = push!(points.points, CustomPoint(x, y)) @@ -159,7 +166,7 @@ end Now we have all that we need. Let's now demonstrate that this works. First, let's define the points, segments, and the boundary. -````@example custom_primitive +````julia p1 = CustomPoint(0.0, 0.0) p2 = CustomPoint(1.0, 0.0) p3 = CustomPoint(1.0, 1.0) @@ -179,12 +186,11 @@ inner_polygon = CustomPolygon([ CustomPolygonSegment([CustomSegment(6, 9), CustomSegment(9, 8), CustomSegment(8, 7), CustomSegment(7, 6)]), ]) polygons = CustomPolygons((outer_polygon, inner_polygon)); -nothing #hide ```` Now we triangulate and refine. -````@example custom_primitive +````julia rng = StableRNG(123) tri = triangulate(points; boundary_nodes=polygons, segments, IntegerType=Int32, @@ -199,10 +205,14 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Now let's give an example of a centroidal Voronoi tessellation to show that this all works. -````@example custom_primitive +````julia rng = StableRNG(123) points = CustomPoints([p1, p2, p3, p4, p5, p6, p7, p8, p9]) tri = triangulate(points; @@ -212,12 +222,15 @@ tri = triangulate(points; EdgesType=CustomSegments, TrianglesType=CustomTriangles, rng) -vorn = voronoi(tri; clip=true, rng) -vorn_cs = centroidal_smooth(vorn; rng) -fig, ax, sc = voronoiplot(vorn_cs) +vorn = voronoi(tri; clip=true, smooth=true, rng) +fig, ax, sc = voronoiplot(vorn) fig ```` +```@raw html + +``` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/custom_primitive.jl). @@ -372,9 +385,8 @@ tri = triangulate(points; EdgesType=CustomSegments, TrianglesType=CustomTriangles, rng) -vorn = voronoi(tri; clip=true, rng) -vorn_cs = centroidal_smooth(vorn; rng) -fig, ax, sc = voronoiplot(vorn_cs) +vorn = voronoi(tri; clip=true, smooth=true, rng) +fig, ax, sc = voronoiplot(vorn) fig ``` diff --git a/docs/src/tutorials/lattice.md b/docs/src/tutorials/lattice.md index a4cb9b0a2..f0177d501 100644 --- a/docs/src/tutorials/lattice.md +++ b/docs/src/tutorials/lattice.md @@ -10,7 +10,7 @@ $[a, b] \times [c, d]$. Rather than using `triangulate`, you can use [`triangulate_rectangle`](@ref) for this purpose. To start, we give a simple example -````@example lattice +````julia using DelaunayTriangulation using CairoMakie @@ -21,52 +21,189 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + This can be much faster than if we just construct the points in the lattice manually and `triangulate` those. Here's a comparison of the times. -````@example lattice +````julia using BenchmarkTools points = get_points(tri) @benchmark triangulate($points; randomise=$false) # randomise=false because points are already in lattice order, i.e. spatially sorted ```` -````@example lattice +```` +BenchmarkTools.Trial: 625 samples with 1 evaluation. + Range (min … max): 4.273 ms … 212.990 ms ┊ GC (min … max): 0.00% … 45.64% + Time (median): 5.902 ms ┊ GC (median): 0.00% + Time (mean ± σ): 7.978 ms ± 12.950 ms ┊ GC (mean ± σ): 12.79% ± 8.21% + + ▆█ + ██▆▅▄▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▁▁▂▁▂▂▁▁▂ ▂ + 4.27 ms Histogram: frequency by time 75.7 ms < + + Memory estimate: 2.95 MiB, allocs estimate: 70952. +```` + +````julia @benchmark triangulate_rectangle($a, $b, $c, $d, $nx, $ny) ```` +```` +BenchmarkTools.Trial: 7182 samples with 1 evaluation. + Range (min … max): 277.700 μs … 55.996 ms ┊ GC (min … max): 0.00% … 98.48% + Time (median): 516.100 μs ┊ GC (median): 0.00% + Time (mean ± σ): 687.669 μs ± 1.109 ms ┊ GC (mean ± σ): 15.57% ± 11.52% + + █▃▃ + ████▇▆▅▄▃▃▂▂▂▂▂▂▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▁▂▂▂▂▂▂▂▂▂▂▂▂ ▃ + 278 μs Histogram: frequency by time 5.79 ms < + + Memory estimate: 916.06 KiB, allocs estimate: 2797. +```` + This difference would be more pronounced for larger `nx, ny`. Note that the output of `triangulate_rectangle` treats the boundary as a constrained boundary: -````@example lattice +````julia get_boundary_nodes(tri) ```` +```` +4-element Vector{Vector{Int64}}: + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250] + [250, 249, 248, 247, 246, 245, 244, 243, 242, 241] + [241, 231, 221, 211, 201, 191, 181, 171, 161, 151, 141, 131, 121, 111, 101, 91, 81, 71, 61, 51, 41, 31, 21, 11, 1] +```` + This boundary is split into four separate sections, one for each side of the rectangle. If you would prefer to keep the boundary as one contiguous section, use `single_boundary=true`. Moreover, note that this `tri` has ghost triangles: -````@example lattice +````julia tri ```` +```` +Delaunay Triangulation. + Number of vertices: 250 + Number of triangles: 432 + Number of edges: 681 + Has boundary nodes: true + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: true +```` + You can opt into not having these by using `delete_ghosts=true`: -````@example lattice +````julia tri = triangulate_rectangle(a, b, c, d, nx, ny; single_boundary=true, delete_ghosts=true) tri ```` -````@example lattice +```` +Delaunay Triangulation. + Number of vertices: 250 + Number of triangles: 432 + Number of edges: 681 + Has boundary nodes: true + Has ghost triangles: false + Curve-bounded: false + Weighted: false + Constrained: true +```` + +````julia get_boundary_nodes(tri) ```` -````@example lattice +```` +67-element Vector{Int64}: + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 20 + 30 + 40 + 50 + 60 + 70 + 80 + 90 + 100 + 110 + 120 + 130 + 140 + 150 + 160 + 170 + 180 + 190 + 200 + 210 + 220 + 230 + 240 + 250 + 249 + 248 + 247 + 246 + 245 + 244 + 243 + 242 + 241 + 231 + 221 + 211 + 201 + 191 + 181 + 171 + 161 + 151 + 141 + 131 + 121 + 111 + 101 + 91 + 81 + 71 + 61 + 51 + 41 + 31 + 21 + 11 + 1 +```` + +````julia DelaunayTriangulation.has_ghost_triangles(tri) ```` +```` +false +```` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/lattice.jl). diff --git a/docs/src/tutorials/nearest.md b/docs/src/tutorials/nearest.md index cd3974818..a4901d69c 100644 --- a/docs/src/tutorials/nearest.md +++ b/docs/src/tutorials/nearest.md @@ -12,7 +12,7 @@ given a point `p` find the Voronoi tile `P` containing it. Here we give an examp of how we can use triangulations or tessellations to find the nearest neighbour in the point set to a given point. First, we load in the packages we need. -````@example nearest +````julia using DelaunayTriangulation using CairoMakie ```` @@ -20,7 +20,7 @@ using CairoMakie Now we define the tessellation we will use for this example. The white points shown are the points that we will query. -````@example nearest +````julia points = [ (-3.0, 7.0), (2.0, 6.0), (0.0, 3.0), (0.0, 0.0), (-5.0, 5.0), (-3.0, 1.0), @@ -34,28 +34,48 @@ scatter!(ax,[p,q],color=:white,strokecolor=:black,strokewidth=2,markersize=14) fig ```` +```@raw html + +``` + To get the nearest neighbour of a point, we use [`get_nearest_neighbour`](@ref). -````@example nearest +````julia np = get_nearest_neighbour(vorn, p) ```` -````@example nearest +```` +1 +```` + +````julia nq = get_nearest_neighbour(vorn, q) ```` +```` +3 +```` + We see that the nearest point in `points` to `p` is the first point, and to `q` it is the third point. We note that we could have also performed this query without constructing `vorn` directly, instead using `tri`: -````@example nearest +````julia np_tri = get_nearest_neighbour(tri, p) ```` -````@example nearest +```` +1 +```` + +````julia nq_tri = get_nearest_neighbour(tri, q) ```` +```` +3 +```` + Both methods lead to the same results because they use the same algorithm. ## Just the code An uncommented version of this example is given below. diff --git a/docs/src/tutorials/operations_convex_hull_locking.md b/docs/src/tutorials/operations_convex_hull_locking.md index 845a2eb05..67a6c0a4f 100644 --- a/docs/src/tutorials/operations_convex_hull_locking.md +++ b/docs/src/tutorials/operations_convex_hull_locking.md @@ -15,7 +15,7 @@ inside `refine!` when providing an unconstrained triangulation for mesh refinement. Let us give an example of how this can be done, in case you want to do this for your own application. -````@example operations_convex_hull_locking +````julia using DelaunayTriangulation using CairoMakie @@ -24,24 +24,46 @@ tri = triangulate(points) get_boundary_nodes(tri) ```` +```` +Int64[] +```` + As you can see, the boundary nodes field is empty. We can lock the convex hull using [`lock_convex_hull!`](@ref): -````@example operations_convex_hull_locking +````julia lock_convex_hull!(tri) get_boundary_nodes(tri) ```` +```` +10-element Vector{Int64}: + 8 + 27 + 37 + 32 + 3 + 41 + 22 + 10 + 21 + 8 +```` + Now the boundary nodes field is not empty. Note that if you try and lock the convex hull again, you will get an error because `DelaunayTriangulation.has_boundary_nodes(tri)` is now true. To now unlock the convex hull, we use [`unlock_convex_hull!`](@ref): -````@example operations_convex_hull_locking +````julia unlock_convex_hull!(tri) get_boundary_nodes(tri) ```` +```` +Int64[] +```` + This function will error if it detects that the existing boundary isn't actually equal to the convex hull. diff --git a/docs/src/tutorials/operations_flip_edge.md b/docs/src/tutorials/operations_flip_edge.md index 197ac1672..7c286fe9b 100644 --- a/docs/src/tutorials/operations_flip_edge.md +++ b/docs/src/tutorials/operations_flip_edge.md @@ -9,31 +9,10 @@ This tutorial shows we can flip edges in a triangulation. Edge flipping is the f edge `(i, j)` to the edge `(k, ℓ)`, where `(i, j)` and `(k, ℓ)` are diagonals of the quadrilateral formed by $p_ip_jp_kp_l$. The edge flip is illustrated below. -````@example operations_flip_edge -using CairoMakie #hide -points = [(0.0, -1.0), (1.0, 0.0), (0.0, 1.0), (-1.0, 0.0)] #hide -T1 = points[[1, 2, 3]] #hide -T2 = points[[1, 3, 4]] #hide -T3 = points[[1, 2, 4]] #hide -T4 = points[[2, 3, 4]] #hide -fig = Figure() #hide -ax1 = Axis(fig[1, 1], width = 600, height = 400) #hide -ax2 = Axis(fig[1, 2], width = 600, height = 400) #hide -poly!(ax1, [T1; T2], color=(:white, 0.0), strokewidth=3) #hide -poly!(ax2, [T3; T4], color=(:white, 0.0), strokewidth=3) #hide -for ax in (ax1, ax2) #hide - hidedecorations!(ax) #hide - hidespines!(ax) #hide - text!(ax, [(0.05, -1.1)]; text=[L"p_j"], fontsize=43) #hide - text!(ax, [(0.9, 0.1)]; text=[L"p_k"], fontsize=43) #hide - text!(ax, [(0.05, 1.0)]; text=[L"p_i"], fontsize=43) #hide - text!(ax, [(-1.05, 0.05)]; text=[L"p_\ell"], fontsize=43) #hide - xlims!(ax, -1.1, 1.1) #hide - ylims!(ax, -1.3, 1.3) #hide -end #hide -resize_to_layout!(fig) #hide -fig #hide -```` + +```@raw html + +``` Note that this edge flip only makes sense if the quadrilateral is convex. If the quadrilateral is not convex, then the edge flip @@ -43,23 +22,22 @@ quadrilateral is convex inside the [`flip_edge!`](@ref) function. Let us now showcase how we can flip edges. First, we load in the packages we need. -````@example operations_flip_edge +````julia using DelaunayTriangulation using CairoMakie ```` Let us now define our initial triangulation. -````@example operations_flip_edge +````julia points = [(0.0, 0.0), (0.8, 0.0), (1.3, 1.0), (0.0, 1.0)] tri = triangulate(points); -nothing #hide ```` Now, flipping the edge is simple. We simply provide the indices `i` and `j` for the edge we want to flip. Let us flip the edge `(2, 4)`. -````@example operations_flip_edge +````julia fig, ax, sc = triplot(tri, axis = (title = "Before flipping",)) ax2 = Axis(fig[1, 2], title = "After flipping") flip_edge!(tri, 2, 4) @@ -67,6 +45,10 @@ triplot!(ax2, tri) fig ```` +```@raw html + +``` + As simple as that. Note that no checks are made for whether the edge is actually in the triangulation, on the boundary, or if the associated quadrilateral is convex. It is up to you to check this if needed; one way to check would be to use [`DelaunayTriangulation.is_legal`](@ref), diff --git a/docs/src/tutorials/operations_ghost_triangles.md b/docs/src/tutorials/operations_ghost_triangles.md index 0e41d6bd9..277e1440e 100644 --- a/docs/src/tutorials/operations_ghost_triangles.md +++ b/docs/src/tutorials/operations_ghost_triangles.md @@ -11,23 +11,39 @@ As we discussed in the [vertex insertion/deletion example](operations_vertex_ins ghost triangles are needed when we are making updates outside of the boundary of the current triangulation. -````@example operations_ghost_triangles +````julia using DelaunayTriangulation using CairoMakie ```` Let us take an example triangulation. -````@example operations_ghost_triangles +````julia points = [(-1.0, -1.0), (1.0, -1.0), (0.0, 1.0)] tri = triangulate(points) ```` -````@example operations_ghost_triangles +```` +Delaunay Triangulation. + Number of vertices: 3 + Number of triangles: 1 + Number of edges: 3 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: false +```` + +````julia fig, ax, sc = triplot(tri, show_ghost_edges = true) fig ```` +```@raw html + +``` + The ghost triangles are represented by the convex regions bounded by the blue lines. By default, `triangulate` will keep these ghost triangles. If you want to remove them, you'd have to use @@ -36,88 +52,163 @@ ghost triangles. If you want to remove them, you'd have to use If you do need to query whether your triangulation already has ghost triangles, use -````@example operations_ghost_triangles +````julia DelaunayTriangulation.has_ghost_triangles(tri) ```` +```` +true +```` + To clear the ghost triangles, use -````@example operations_ghost_triangles +````julia delete_ghost_triangles!(tri) DelaunayTriangulation.has_ghost_triangles(tri) ```` +```` +false +```` + An important note for us to make is that ghost triangles are not just there as a concept, but they are actually physically stored. Adding them back with [`add_ghost_triangles!`](@ref), we have: -````@example operations_ghost_triangles +````julia add_ghost_triangles!(tri) get_triangles(tri) ```` +```` +Set{Tuple{Int64, Int64, Int64}} with 4 elements: + (3, 2, -1) + (2, 3, 1) + (1, 3, -1) + (2, 1, -1) +```` + See that there is not just the triangle `(1, 2, 3)`, but also `(3, 2, -1)`, `(1, 3, -1)`, and `(2, 1, -1)` (where the ghost triangles are also oriented counter-clockwise). For example, -````@example operations_ghost_triangles +````julia get_adjacent(tri, 3, 2) ```` -````@example operations_ghost_triangles +```` +-1 +```` + +````julia get_adjacent(tri, 3, -1) ```` -````@example operations_ghost_triangles +```` +1 +```` + +````julia get_adjacent(tri, -1, 2) ```` -````@example operations_ghost_triangles +```` +1 +```` + +````julia get_neighbours(tri, -1) ```` -````@example operations_ghost_triangles +```` +Set{Int64} with 3 elements: + 2 + 3 + 1 +```` + +````julia get_adjacent2vertex(tri, -1) ```` +```` +Set{Tuple{Int64, Int64}} with 3 elements: + (3, 2) + (1, 3) + (2, 1) +```` + If we delete them, they are no longer there. -````@example operations_ghost_triangles +````julia delete_ghost_triangles!(tri) get_triangles(tri) ```` +```` +Set{Tuple{Int64, Int64, Int64}} with 1 element: + (2, 3, 1) +```` + As a last note, we remark that the ghost vertices that define the vertex of these ghost triangles is still there regardless of whether the triangulation has ghost triangles. Thus, for example, the following still work -````@example operations_ghost_triangles +````julia get_neighbours(tri, -1) ```` -````@example operations_ghost_triangles +```` +Set{Int64} with 3 elements: + 2 + 3 + 1 +```` + +````julia get_adjacent2vertex(tri, -1) ```` -````@example operations_ghost_triangles +```` +Set{Tuple{Int64, Int64}} with 3 elements: + (3, 2) + (1, 3) + (2, 1) +```` + +````julia get_adjacent(tri, 3, 2) ```` +```` +-1 +```` + You can remove them from the graph, using -````@example operations_ghost_triangles +````julia DelaunayTriangulation.delete_ghost_vertices_from_graph!(tri) ```` +```` +Graph + Number of edges: 6 + Number of vertices: 3 +```` + so that e.g. `get_neighbours(tri, -1)` is then an error. This will still not remove them from the `adjacent` and `adjacent2vertex` maps, but it does mean for example that -````@example operations_ghost_triangles +````julia collect(each_solid_vertex(tri)) == collect(each_vertex(tri)) ```` +```` +true +```` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/operations_ghost_triangles.jl). diff --git a/docs/src/tutorials/operations_legalise_edge.md b/docs/src/tutorials/operations_legalise_edge.md index 87f7f5a03..05281145d 100644 --- a/docs/src/tutorials/operations_legalise_edge.md +++ b/docs/src/tutorials/operations_legalise_edge.md @@ -27,7 +27,7 @@ such an insertion; this is the main step of the algorithm of Guibas et al. (1992 We use this tutorial to demonstrate how this can be used. First, let us define some initial triangulation. -````@example operations_legalise_edge +````julia using DelaunayTriangulation using CairoMakie @@ -44,13 +44,17 @@ scatter!(ax, [p], markersize=14) fig ```` +```@raw html + +``` + The blue point is the point to be added. It is inside the triangle `(9, 14, 3)`. To insert it, follow Guibas et al. (1992) and connect the edges of `(9, 14, 3)` to the new point. This is done using [`split_triangle!`](@ref). (Note: the function [`DelaunayTriangulation.complete_split_triangle_and_legalise!`](@ref) does the splitting and the legalising all in the same step, but we do not demonstrate this here.) -````@example operations_legalise_edge +````julia push!(points, p) r = length(points) i, j, k = 9, 14, 3 @@ -59,31 +63,23 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + This splitting introduces some new illegal edges, shown in red below. -````@example operations_legalise_edge -function get_all_illegal_edges(tri) #hide - T = NTuple{2,Float64}[] #hide - for E in each_edge(tri) #hide - cert = DelaunayTriangulation.is_legal(tri, E...) #hide - if DelaunayTriangulation.is_illegal(cert) #hide - push!(T, get_point(tri, E...)...) #hide - end #hide - end #hide - return T #hide -end #hide -fig, ax, sc = triplot(tri) #hide -T = get_all_illegal_edges(tri) #hide -linesegments!(ax, T, color=:red, linewidth=3) #hide -fig #hide -```` + +```@raw html + +``` To fix this, we use `legalise_edge!`. This functions take in a single edge, so to legalise all the new edges we apply the function to each edge of the triangle that the point resides in. (The function [`DelaunayTriangulation.legalise_split_triangle!`](@ref) also performs these three calls below.) -````@example operations_legalise_edge +````julia legalise_edge!(tri, i, j, r) legalise_edge!(tri, j, k, r) legalise_edge!(tri, k, i, r) @@ -91,6 +87,10 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + The triangulation is now Delaunay, and there are no more illegal edges. ## Just the code An uncommented version of this example is given below. diff --git a/docs/src/tutorials/operations_segment_insertion.md b/docs/src/tutorials/operations_segment_insertion.md index 666f79175..a7c89f6eb 100644 --- a/docs/src/tutorials/operations_segment_insertion.md +++ b/docs/src/tutorials/operations_segment_insertion.md @@ -7,14 +7,14 @@ EditURL = "https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/d This tutorial shows how we can add segments into a triangulation. First, load the packages we need: -````@example operations_segment_insertion +````julia using DelaunayTriangulation using CairoMakie ```` Let us now define our initial triangulation. -````@example operations_segment_insertion +````julia points = [(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.9, 0.9), (0.5, 0.5), (0.2, 0.5), (0.5, 0.8)] tri = triangulate(points) @@ -22,23 +22,38 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + To add a segment, we use [`add_segment!`](@ref), providing the vertices for the points that a segment should be added between. Let us add a segment between `(0.0, 0.0)` and `(1.0, 1.0)`, which corresponds to vertices `1` and `3`. -````@example operations_segment_insertion +````julia add_segment!(tri, 1, 3) fig, ax, sc = triplot(tri, show_constrained_edges = true) fig ```` +```@raw html + +``` + Of course, this changed nothing since the segment was already there. We do note, though, that if we look at the constrained edges -````@example operations_segment_insertion +````julia get_interior_segments(tri) ```` +```` +Set{Tuple{Int64, Int64}} with 3 elements: + (1, 6) + (5, 3) + (5, 6) +```` + then we notice that the segment `(1, 3)` was converted into the segments `(1, 6)`, `(5, 3)`, and `(5, 6)`. This is because the segment `(1, 3)` crossed through other vertices, and so the algorithm automatically breaks down the segments into a sequence of connected collinear @@ -46,22 +61,30 @@ segments. Now we add a segment that was not already there. -````@example operations_segment_insertion +````julia add_segment!(tri, 1, 8) fig, ax, sc = triplot(tri, show_constrained_edges = true) fig ```` +```@raw html + +``` + Currently, the segments that you add must not intersect at an angle (they can be collinear with other edges as we have demonstrated above). To see what happens if we do this: -````@example operations_segment_insertion +````julia add_segment!(tri, 8, 2) fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + The other constrained edge was partially removed. ## Just the code An uncommented version of this example is given below. diff --git a/docs/src/tutorials/operations_split_edge.md b/docs/src/tutorials/operations_split_edge.md index 66ad0a5c9..1a971463b 100644 --- a/docs/src/tutorials/operations_split_edge.md +++ b/docs/src/tutorials/operations_split_edge.md @@ -10,7 +10,7 @@ close to being on, an edge `(i, j)`. In this tutorial, we show how the [`split_edge!`](@ref) function can be used for putting a point on this edge. First, let us consider the following triangulation. -````@example operations_split_edge +````julia using DelaunayTriangulation using CairoMakie @@ -24,10 +24,14 @@ scatter!(ax, [p], markersize=14) fig ```` +```@raw html + +``` + We want to add the blue point onto the edge shown, which is `(1, 2)`. To do this, we can use the function `split_edge!`. -````@example operations_split_edge +````julia push!(points, p) r = length(points) i, j = 1, 2 @@ -36,21 +40,29 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Notice that this has only split the edge in one direction. This is because the edges in this case are treated as being oriented. To split the edge in the other direction, we simply swap the indices. -````@example operations_split_edge +````julia split_edge!(tri, j, i, r) fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + If you also want to restore the Delaunay property of the triangulation following this splitting, you need to use [`legalise_edge!`](@ref). In this example, though, there are no illegal edges. If there were, we would use -````@example operations_split_edge +````julia k = get_adjacent(tri, i, r) # get_adjacent(tri, i, j) before split_edge!(tri, i, j) legalise_edge!(tri, j, k, r) legalise_edge!(tri, k, i, r) @@ -59,6 +71,18 @@ legalise_edge!(tri, i, k, r) legalise_edge!(tri, k, j, r) ```` +```` +Delaunay Triangulation. + Number of vertices: 10 + Number of triangles: 14 + Number of edges: 23 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: false +```` + These steps, in particular the steps of splitting both sides of the edge and then legalising, are also implemented in [`DelaunayTriangulation.complete_split_edge_and_legalise!`](@ref). ## Just the code diff --git a/docs/src/tutorials/operations_split_triangle.md b/docs/src/tutorials/operations_split_triangle.md index ab25037f5..afb7e0ee4 100644 --- a/docs/src/tutorials/operations_split_triangle.md +++ b/docs/src/tutorials/operations_split_triangle.md @@ -12,7 +12,7 @@ that triangle into three new triangles. This is called *triangle splitting*. Let us give an example. -````@example operations_split_triangle +````julia using DelaunayTriangulation using CairoMakie @@ -24,13 +24,17 @@ scatter!(ax, [p], markersize=14) fig ```` +```@raw html + +``` + The blue point shows the point we want to add into the triangulation using [`split_triangle!`](@ref). To use this, we provide (1) the index of the point in `points` and (2) the triangle that the point is in. The index of the point will be `4` after pushing `p` into `points`, and in this simple example the triangle that `p` is in is `(1, 2, 3)`. -````@example operations_split_triangle +````julia push!(points, p) r = length(points) i, j, k = 1, 2, 3 @@ -39,6 +43,10 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + See the [`legalise_edge!` tutorial](operations_legalise_edge.md) for more discussion about restoring the Delaunay property of the triangulation after using `split_triangle!`. diff --git a/docs/src/tutorials/operations_vertex_insertion_deletion.md b/docs/src/tutorials/operations_vertex_insertion_deletion.md index f36d3e3c2..ce6d161a9 100644 --- a/docs/src/tutorials/operations_vertex_insertion_deletion.md +++ b/docs/src/tutorials/operations_vertex_insertion_deletion.md @@ -9,7 +9,7 @@ This tutorial demonstrates how to insert and delete vertices from a triangulation while maintaining the Delaunay property of the triangulation. First, load the packages we need: -````@example operations_vertex_insertion_deletion +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -17,13 +17,17 @@ using StableRNGs Let us now define our initial triangulation. -````@example operations_vertex_insertion_deletion +````julia points = [(0.0, 0.0), (2.0, 0.0), (1.0, 2.0)] tri = triangulate(points) fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Note that we use a structure for `points` that is mutable so that points can be pushed into it. @@ -33,31 +37,40 @@ is a method which uses the index of the vertex rather than the coordinates, but we don't use that here as the points to be added are not already in `points`. Here, we add a point at `(1.0, 0.5)`. -````@example operations_vertex_insertion_deletion +````julia add_point!(tri, 1.0, 0.5) fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + This is still a valid Delaunay triangulation, unsurprisingly due to the small number of points. We can also add points that are outside of the triangulation: -````@example operations_vertex_insertion_deletion +````julia add_point!(tri, 0.0, 1.0) fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + One important thing to note here is that, if not for the ghost triangles inside `tri`, adding a point outside of the triangulation would not work. Here is an example of this failing. -````@example operations_vertex_insertion_deletion +````julia delete_ghost_triangles!(tri) -try #hide add_point!(tri, 2.0, 1.5) -catch e #hide -println(e) #hide -end #hide +```` + +```` +BoundsError([(0.0, 0.0), (2.0, 0.0), (1.0, 2.0), (1.0, 0.5), (0.0, 1.0)], (0,)) + ```` This is a `BoundsError`, because the triangulation has had to @@ -67,38 +80,70 @@ perform some operation including a point outside of the boundary, you need to be sure that you have ghost triangles, which you can query using [`DelaunayTriangulation.has_ghost_triangles`](@ref). -````@example operations_vertex_insertion_deletion +````julia DelaunayTriangulation.has_ghost_triangles(tri) ```` -````@example operations_vertex_insertion_deletion +```` +false +```` + +````julia add_ghost_triangles!(tri) ```` -````@example operations_vertex_insertion_deletion +```` +Delaunay Triangulation. + Number of vertices: 5 + Number of triangles: 4 + Number of edges: 8 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: false +```` + +````julia DelaunayTriangulation.has_ghost_triangles(tri) ```` +```` +true +```` + Another issue is that the convex hull is not updated as we add (or delete) points for performance reasons: -````@example operations_vertex_insertion_deletion +````julia get_convex_hull_vertices(tri) ```` +```` +4-element Vector{Int64}: + 3 + 1 + 2 + 3 +```` + If we do want to fix the convex hull, we can use [`convex_hull!(tri)`](@ref). -````@example operations_vertex_insertion_deletion +````julia convex_hull!(tri) fig, ax, sc = triplot(tri, show_convex_hull=true) fig ```` +```@raw html + +``` + We now have the same triangulation that we would have had if we had done `triangulate` on this set of points originally. To now push this further, let's add in a bunch of random points. -````@example operations_vertex_insertion_deletion +````julia rng = StableRNG(123) for _ in 1:1000 new_point = 2rand(rng, 2) @@ -108,12 +153,16 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Let us now demonstrate how to delete points. To do this, we use [`delete_point!`](@ref). This function takes vertices rather than coordinates, identifying the corresponding point in `points` by its index. Let us demonstrate this operation by deleting all points within a distance of `1/2` around `(1.0, 1.0)`. -````@example operations_vertex_insertion_deletion +````julia vertices_to_delete = Iterators.filter(each_solid_vertex(tri)) do i p = get_point(tri, i) r2 = (getx(p) - 1.0)^2 + (gety(p) - 1.0)^2 @@ -126,6 +175,10 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Note that in this situation, `points` still contains those points that we have now deleted. This is the reason to be careful about using, say, [`DelaunayTriangulation.each_point`](@ref) rather than [`each_solid_vertex`](@ref). This triangulation is also still Delaunay. diff --git a/docs/src/tutorials/point_in_polygon.md b/docs/src/tutorials/point_in_polygon.md index 885767abf..0ea2a8e75 100644 --- a/docs/src/tutorials/point_in_polygon.md +++ b/docs/src/tutorials/point_in_polygon.md @@ -7,7 +7,7 @@ EditURL = "https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/d This tutorial shows how we can perform point-in-polygon testing, and how we can find a polygon containing a point. First, let us build this ploygon. -````@example point_in_polygon +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -179,6 +179,10 @@ end fig ```` +```@raw html + +``` + To now determine which of these query points are inside any of the magenta regions, we have several methods: - Using [`DelaunayTriangulation.distance_to_polygon`](@ref), check if the distance to the polygon is positive (inside) or negative (outside). - Triangulate the domain and use [`DelaunayTriangulation.dist`](@ref) to get the distance from a point to the triangulation. @@ -190,33 +194,37 @@ for example, you might already have a triangulation and want to use that. We als here do not use exact arithmetic, unlike other predicates in this package, so there may be some robustness issues for points very close to the boundary. Here is the first approach: -````@example point_in_polygon +````julia is_inside = [DelaunayTriangulation.distance_to_polygon(q, points, nodes) > 0 for q in query_points] scatter!(ax, query_points[is_inside], color=:blue) scatter!(ax, query_points[.!is_inside], color=:red) fig ```` +```@raw html + +``` + Here is the second method. -````@example point_in_polygon +````julia tri = triangulate(points; boundary_nodes=nodes) -is_inside_2 = [DelaunayTriangulation.dist(tri, q) > 0 for q in query_points] +is_inside_2 = [DelaunayTriangulation.dist(tri, q) > 0 for q in query_points]; ```` The third method is to use [`find_polygon`](@ref) to find the polygon containing the point. If no such polygon exists, `find_polygon` returns `0`, so this is what we use to determine if a point is inside or outside the polygon. -````@example point_in_polygon -is_inside_3 = [find_polygon(tri, q) ≠ 0 for q in query_points] +````julia +is_inside_3 = [find_polygon(tri, q) ≠ 0 for q in query_points]; ```` This test is not exactly the same as the previous one (with a difference of about five points) due to points near the boundary. The fourth method is: -````@example point_in_polygon +````julia hierarchy = DelaunayTriangulation.construct_polygon_hierarchy(points, nodes) -is_inside_4 = [find_polygon(hierarchy, points, nodes, q) ≠ 0 for q in query_points] +is_inside_4 = [find_polygon(hierarchy, points, nodes, q) ≠ 0 for q in query_points]; ```` ## Just the code @@ -400,12 +408,12 @@ scatter!(ax, query_points[.!is_inside], color=:red) fig tri = triangulate(points; boundary_nodes=nodes) -is_inside_2 = [DelaunayTriangulation.dist(tri, q) > 0 for q in query_points] +is_inside_2 = [DelaunayTriangulation.dist(tri, q) > 0 for q in query_points]; -is_inside_3 = [find_polygon(tri, q) ≠ 0 for q in query_points] +is_inside_3 = [find_polygon(tri, q) ≠ 0 for q in query_points]; hierarchy = DelaunayTriangulation.construct_polygon_hierarchy(points, nodes) -is_inside_4 = [find_polygon(hierarchy, points, nodes, q) ≠ 0 for q in query_points] +is_inside_4 = [find_polygon(hierarchy, points, nodes, q) ≠ 0 for q in query_points]; ``` --- diff --git a/docs/src/tutorials/point_location.md b/docs/src/tutorials/point_location.md index 18c554e3c..a8307db77 100644 --- a/docs/src/tutorials/point_location.md +++ b/docs/src/tutorials/point_location.md @@ -19,7 +19,7 @@ a keyword argument `concavity_protection` to make an extra check to guarantee ev We start with a simple example, demonstrating point location on an unconstrained triangulation. -````@example point_location +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -36,37 +36,57 @@ scatter!(ax, q) fig ```` +```@raw html + +``` + The aim is to, from `tri`, find which triangle contains the point `q` shown. Using the `find_triangle` function, this is simple. -````@example point_location +````julia V = find_triangle(tri, q) ```` +```` +(2, 7, 6) +```` + The result means that the triangle `(2, 7, 6)` contains the point, as we can easily check: -````@example point_location +````julia DelaunayTriangulation.point_position_relative_to_triangle(tri, V, q) ```` +```` +Certificate.Inside = 0 +```` + When we provide no keyword arguments, the default behaviour of `find_triangle` is to first sample some number of points (defaults to $\lceil \sqrt[3]{n}\rceil$, where $n$ is the number of points), and then start at the point that is closest to `q` out of those sampled, then marching along the triangulation until `q` is found. This number of samples can be changed using the `m` keyword argument. For example, -````@example point_location +````julia V = find_triangle(tri, q, m=10) ```` +```` +(6, 2, 7) +```` + means that we get a sample of size 10, and start at whichever point is the closest. -(For technical reasons, this sample is with replacement, so it is possible that the same point is sampled more than once.) +(For technical reasons, this sampling is with replacement, so it is possible that the same point is sampled more than once.) You could also instead specify the point to start at using the `k` keyword argument, in which case no points are sampled. For example, -````@example point_location +````julia V = find_triangle(tri, q, k=6) ```` +```` +(2, 7, 6) +```` + starts the algorithm at the point `6`. Note also that the triangles found from `find_triangle` do not have to be given in the same order as they appear @@ -75,37 +95,49 @@ or `(k, i, j)` could be returned. The point `q` does not have to be in the triangulation. For example, consider the following point. -````@example point_location +````julia q = (-5.0, 8.0) fig, ax, sc = triplot(tri) scatter!(ax, q) fig ```` +```@raw html + +``` + We obtain: -````@example point_location +````julia V = find_triangle(tri, q) ```` +```` +(1, 5, -1) +```` + See that the result is a ghost triangle `(1, 5, -1)`. As discussed in the [manual](../manual/ghost_triangles.md), this can be interpreted as meaning that `q` is between the two lines through the points `1` and `5` that start at a central point of the triangulation. (The index `-1` is just the ghost vertex.) This can be visualised. -````@example point_location +````julia fig, ax, sc = triplot(tri, show_ghost_edges=true) scatter!(ax, q) fig ```` +```@raw html + +``` + ## Region with concave boundaries and holes Now we give an example of point location for a reason with holes. Since the case where all boundaries are convex is reasonably straight forward, here we consider concave boundaries and discuss methods for improving the speed of the algorithm in this case. First, let us give our example triangulation. -````@example point_location +````julia a, b, c = (0.0, 8.0), (0.0, 6.0), (0.0, 4.0) d, e, f = (0.0, 2.0), (0.0, 0.0), (2.0, 0.0) g, h, i = (4.0, 0.0), (6.0, 0.0), (8.0, 0.0) @@ -120,21 +152,24 @@ boundary_nodes, points = convert_boundary_points_to_indices([outer, inner]) rng = StableRNG(125123) tri = triangulate(points; rng, boundary_nodes) refine!(tri; max_area=0.01get_area(tri), rng); -nothing #hide ```` The issue with concavity is that the ghost triangles can no longer be sensibly defined. To demonstrate this, see the following plot: -````@example point_location +````julia fig, ax, sc = triplot(tri, show_ghost_edges=true) fig ```` +```@raw html + +``` + The ghost edges now intersect the boundary, which doesn't make sense, and creates difficulties. Let us now demonstrate how the function still works here. We try finding the blue points shown below. -````@example point_location +````julia qs = [ (4.0, 5.0), (1.0, 5.6), (0.2, 5.0), (0.0, -1.0), (0.5, 3.5), (2.5, 1.5), @@ -146,42 +181,76 @@ scatter!(ax, qs, color=:blue, markersize=16) fig ```` +```@raw html + +``` + Now let's find the triangles. -````@example point_location +````julia Vs = [find_triangle(tri, q; rng) for q in qs] ```` +```` +12-element Vector{Tuple{Int64, Int64, Int64}}: + (35, 12, -3) + (77, 56, 76) + (84, 55, 74) + (71, 6, -2) + (102, 47, 89) + (-4, 54, 25) + (24, -4, 18) + (57, 60, 37) + (69, 70, 39) + (94, 17, -3) + (17, 81, 80) + (24, -4, 18) +```` + While we do find some triangles, they may not all be correct. For example, the triangle found for `(1.2, 1.6)` is -````@example point_location +````julia Vs[end] ```` -but the point `(1.2, 1.6)` is actually inside the triangulation. We can even see -this if we run `find_triangle` again: - -````@example point_location -V = find_triangle(tri, (1.2, 1.6); rng) +```` +(24, -4, 18) ```` +but the point `(1.2, 1.6)` is actually inside the triangulation. To protect against this, you need to use `concavity_protection=true`, which will enable a check to be made that the point is actually outside the triangulation whenever a ghost triangle is to be returned. If the check finds this to not be the case, it restarts. With these results, we now compute: -````@example point_location +````julia Vs = [find_triangle(tri, q; rng, concavity_protection=true) for q in qs] ```` +```` +12-element Vector{Tuple{Int64, Int64, Int64}}: + (35, 12, -3) + (77, 56, 76) + (55, 74, 84) + (71, 6, -2) + (89, 102, 47) + (-4, 54, 25) + (18, 24, -4) + (50, 59, 37) + (39, 69, 70) + (94, 17, -3) + (17, 81, 80) + (23, 41, 22) +```` + Here is how we can actually test that these results are now correct. We cannot directly use [`DelaunayTriangulation.point_position_relative_to_triangle`](@ref) because it does not know that the ghost triangles are invalid. Instead, we find the distance of each point to the triangulation's boundary using [`DelaunayTriangulation.dist`](@ref) so that we can classify it as being inside or outside of the triangulation, and then check the type of the found triangle. -````@example point_location +````julia δs = [DelaunayTriangulation.dist(tri, q) for q in qs] results = Vector{Bool}(undef, length(qs)) for (j, (q, δ, V)) in (enumerate ∘ zip)(qs, δs, Vs) @@ -197,6 +266,22 @@ end results ```` +```` +12-element Vector{Bool}: + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +```` + As we see, the triangles are now all correct. ## Disjoint domains @@ -205,7 +290,7 @@ domains that are disjoint to the current domain, thus allowing us to demonstrate how `find_triangle` applies here. The new domain is below, along with the points we will be searching for. -````@example point_location +````julia m₁, n₁, o₁ = (6.0, 8.0), (8.0, 8.0), (8.0, 4.0) p₁, q₁, r₁ = (10.0, 4.0), (6.0, 6.0), (8.0, 6.0) s₁, t₁, u₁ = (9.0, 7.0), (4.0, 4.0), (5.0, 4.0) @@ -229,16 +314,35 @@ scatter!(ax, qs, color=:blue, markersize=16) fig ```` +```@raw html + +``` + Here are the `find_triangle` results. -````@example point_location +````julia Vs = [find_triangle(tri, q; rng, concavity_protection=true) for q in qs] ```` +```` +11-element Vector{Tuple{Int64, Int64, Int64}}: + (422, 348, 368) + (435, 797, 434) + (180, 46, -3) + (486, 88, -2) + (947, 777, 773) + (748, 642, 718) + (575, 620, 815) + (117, 803, 918) + (237, 804, 840) + (18, -4, 294) + (715, 29, -5) +```` + Again, we can verify that these are all correct as follows. Without `concavity_protection=true`, these would not be all correct. -````@example point_location +````julia δs = [DelaunayTriangulation.dist(tri, q) for q in qs] results = Vector{Bool}(undef, length(qs)) for (j, (q, δ, V)) in (enumerate ∘ zip)(qs, δs, Vs) @@ -254,6 +358,21 @@ end results ```` +```` +11-element Vector{Bool}: + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 +```` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/point_location.jl). @@ -325,8 +444,6 @@ Vs = [find_triangle(tri, q; rng) for q in qs] Vs[end] -V = find_triangle(tri, (1.2, 1.6); rng) - Vs = [find_triangle(tri, q; rng, concavity_protection=true) for q in qs] δs = [DelaunayTriangulation.dist(tri, q) for q in qs] diff --git a/docs/src/tutorials/pole_of_inaccessibility.md b/docs/src/tutorials/pole_of_inaccessibility.md index 6a1d546ec..8c3fc9e59 100644 --- a/docs/src/tutorials/pole_of_inaccessibility.md +++ b/docs/src/tutorials/pole_of_inaccessibility.md @@ -13,7 +13,7 @@ triangulation tutorials. In particular, the algorithm we use works for polygons interior holes, or even nested holes, as well as for multipolygons. We give a simple example. First, let us define our polygon. -````@example pole_of_inaccessibility +````julia using DelaunayTriangulation using CairoMakie @@ -70,17 +70,29 @@ end fig ```` +```@raw html + +``` + To now find the pole of inaccessibility, use [`DelaunayTriangulation.pole_of_inaccessibility`](@ref): -````@example pole_of_inaccessibility +````julia pole = DelaunayTriangulation.pole_of_inaccessibility(points, boundary_nodes) ```` -````@example pole_of_inaccessibility +```` +(-1.0785225000000003, 5.3725974999999995) +```` + +````julia scatter!(ax, pole, color=:blue, markersize=16) fig ```` +```@raw html + +``` + This shows that the point inside the red region that is furthest from the boundary is the blue point shown. @@ -88,7 +100,7 @@ We note that triangulations also store the poles of inaccessibility for each bou as these are used to define the orientation of a ghost edge. Here is an example. First, we get the triangulation. -````@example pole_of_inaccessibility +````julia θ = LinRange(0, 2π, 20) |> collect θ[end] = 0 # need to make sure that 2π gives the exact same coordinates as 0 xy = Vector{Vector{Vector{NTuple{2,Float64}}}}() @@ -105,16 +117,36 @@ boundary_nodes, points = convert_boundary_points_to_indices(xy) tri = triangulate(points; boundary_nodes=boundary_nodes) ```` +```` +Delaunay Triangulation. + Number of vertices: 76 + Number of triangles: 76 + Number of edges: 152 + Has boundary nodes: true + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: true +```` + To see the poles, called representative points, we use -````@example pole_of_inaccessibility +````julia DelaunayTriangulation.get_representative_point_list(tri) ```` +```` +Dict{Int64, DelaunayTriangulation.RepresentativeCoordinates{Int64, Float64}} with 4 entries: + 4 => RepresentativeCoordinates{Int64, Float64}(3.0, -4.79892e-17, 0) + 2 => RepresentativeCoordinates{Int64, Float64}(-1.7996e-17, -2.02455e-17, 0) + 3 => RepresentativeCoordinates{Int64, Float64}(3.0, -4.49899e-17, 0) + 1 => RepresentativeCoordinates{Int64, Float64}(0.50341, -0.499994, 0) +```` + The keys of the `Dict` refer to the curve index, and the values contain the coordinates. -````@example pole_of_inaccessibility +````julia fig, ax, sc = triplot(tri, show_ghost_edges=true) colors = (:red, :blue, :darkgreen, :purple) for i in eachindex(boundary_nodes) @@ -125,6 +157,10 @@ end fig ```` +```@raw html + +``` + Note that the green and purple boundaries have the same pole of inaccessibility. The first curve, the red curve, is the only one that has the pole of inaccessibility computed with respect to all other boundaries. You can also see that indeed the ghost edges are all diff --git a/docs/src/tutorials/refinement.md b/docs/src/tutorials/refinement.md index 7c132f892..a70183c9c 100644 --- a/docs/src/tutorials/refinement.md +++ b/docs/src/tutorials/refinement.md @@ -16,7 +16,7 @@ can also be refined as discussed in [this tutorial](../tutorials/curve_bounded.m Let us start by loading in the packages we will need. -````@example refinement +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -27,10 +27,10 @@ Let us start with a simple example, refining an unconstrained triangulation. We will constrain the triangulation such that the minimum angle is 30 degrees, and the maximum area of a triangulation is 1% of the triangulation's total area. Note that below we need to make sure `points` is mutable, else -it is not possible to push points into the triangulation. Here we use a tuple, but you +it is not possible to push points into the triangulation. Here we use a vector, but you could also use e.g. an `ElasticMatrix` from [ElasticArrays.jl](https://github.com/JuliaArrays/ElasticArrays.jl). -````@example refinement +````julia rng = StableRNG(123) x = rand(rng, 50) y = rand(rng, 50) @@ -41,65 +41,137 @@ A = get_area(tri) refine!(tri; min_angle=30.0, max_area=0.01A, rng) ```` +```` +Delaunay Triangulation. + Number of vertices: 293 + Number of triangles: 522 + Number of edges: 814 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: false +```` + The [`refine!`](@ref) function operates on `tri` in-place. If we wanted to review the statistics of the refined mesh, we can use [`statistics`](@ref): -````@example refinement +````julia statistics(tri) ```` +```` +Delaunay Triangulation Statistics. + Triangulation area: 0.6676219360027273 + Number of vertices: 294 + Number of solid vertices: 293 + Number of ghost vertices: 1 + Number of edges: 876 + Number of solid edges: 814 + Number of ghost edges: 62 + Number of triangles: 584 + Number of solid triangles: 522 + Number of ghost triangles: 62 + Number of boundary segments: 0 + Number of interior segments: 0 + Number of segments: 0 + Number of convex hull vertices: 62 + Smallest angle: 30.093123918976033° + Largest angle: 115.1681501036418° + Smallest area: 2.101315544214238e-5 + Largest area: 0.006504759798840958 + Smallest radius-edge ratio: 0.5783859342412219 + Largest radius-edge ratio: 0.997194082313877 +```` + As we can see, the maximum area of a triangle is about 0.0064, which is indeed less than 1% of the triangulation's area, which is about 0.0067. Moreover, the smallest angle is indeed greater than 30. Let us compare the triangulation pre- and post-refinement. -````@example refinement +````julia fig, ax, sc = triplot(orig_tri, axis=(title="Pre-refinement",)) ax = Axis(fig[1, 2], title="Post-refinement") triplot!(ax, tri) fig ```` +```@raw html + +``` + The triangulation is now much finer. There are still some parts with -many more triangles than other regions, but this is most nearly a boundary +many more triangles than other regions, but these are mostly near a boundary or where was a cluster of random points. If we wanted, we could refine again to try and improve this. -````@example refinement +````julia refine!(tri; min_angle=30.0, max_area=0.001A, rng) # 0.1% instead of 1% fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + The quality has now been improved. We could also try improving the minimum angle further, but even 30 is a bit closer to the limit of convergence (which is about 33.9 degrees). For example, if we try a minimum angle of 35 degrees, the algorithm just doesn't even converge, instead it reaches the maximum number of points. -````@example refinement +````julia test_tri = deepcopy(tri) refine!(test_tri; min_angle=35.0, max_area=0.001A, max_points = 5_000, rng) # 20_000 so that it doesn't just keep going statistics(test_tri) ```` +```` +Delaunay Triangulation Statistics. + Triangulation area: 0.6676219360027283 + Number of vertices: 5001 + Number of solid vertices: 5000 + Number of ghost vertices: 1 + Number of edges: 14997 + Number of solid edges: 14855 + Number of ghost edges: 142 + Number of triangles: 9998 + Number of solid triangles: 9856 + Number of ghost triangles: 142 + Number of boundary segments: 0 + Number of interior segments: 0 + Number of segments: 0 + Number of convex hull vertices: 142 + Smallest angle: 29.178318890457142° + Largest angle: 117.10742856878393° + Smallest area: 3.296647038397725e-6 + Largest area: 0.0006659872224699419 + Smallest radius-edge ratio: 0.5773574317028193 + Largest radius-edge ratio: 1.0255793759836065 +```` + As we can see, the smallest angle is about 29 degrees instead of 35 degrees, and there are now 5000 points in the triangulation. The resulting triangulation is given below: -````@example refinement +````julia fig, ax, sc = triplot(test_tri) fig ```` +```@raw html + +``` + This is certainly not a suitable triangulation. One useful figure to look at for these plots are histograms that look at the areas and angles. Looking to `tri`, we can plot these as follows: -````@example refinement +````julia stats = statistics(tri) fig = Figure(fontsize=33) areas = get_all_stat(stats, :area) ./ A @@ -113,6 +185,10 @@ resize_to_layout!(fig) fig ```` +```@raw html + +``` + We see that indeed many of the triangle areas are very small, and the angles are all greater than 30 degrees. @@ -122,7 +198,7 @@ case where the mesh refinement is needed. For this example, we consider an examp with holes, but note that any triangulation can be refined, regardless of the type. Here is the triangulation we consider. -````@example refinement +````julia n = 100 θ = LinRange(0, 2π, n + 1) θ = [θ[1:n]; 0] @@ -142,15 +218,23 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Let us now refine this triangulation. -````@example refinement +````julia A = get_area(tri) refine!(tri; min_angle=27.3, max_area=0.01A, rng) fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + We inspect the plot, and we might think that it's perhaps not fine enough. Let's use finer constraints and see what happens. Since `refine!` operates on `tri` in-place, refining it again @@ -158,12 +242,16 @@ with the constraints below is going to take roughly the same amount of time as if we had refined it with these constraints in the first place. -````@example refinement +````julia refine!(tri; min_angle=33.9, max_area=0.001A, rng) fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + This is indeed much better, but notice that the inner hole is much more fine than the outer. This is because we are applying the same area constraint inside and outside, when really we should try and take note @@ -177,7 +265,7 @@ instead of applying constraints so that the triangles are limited to 1% of the t triangulation area, we do 0.5% or 0.1% of the area of the inner or outer domain, respectively. -````@example refinement +````julia outer_area = π * (r₁^2 - r₂^2) inner_area = π * r₃^2 function in_inner(p, q, r) @@ -196,10 +284,14 @@ function area_constraint(_tri, T) end ```` +```` +area_constraint (generic function with 1 method) +```` + Let's now refine. We recompute the triangulation so that we can see the new results. -````@example refinement +````julia boundary_nodes, points = convert_boundary_points_to_indices(x, y) rng = StableRNG(456) tri = triangulate(points; boundary_nodes, rng) @@ -208,12 +300,16 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + This is now much better, and the two parts of the domain are appropriately refined. Let us extend our custom constraint function to also require that any triangle has minimum angle less than 33 degrees inside the innermost domain, and less than 20 degrees outside the innermost domain. -````@example refinement +````julia function angle_constraint(_tri, T) i, j, k = triangle_vertices(T) p, q, r = get_point(_tri, i, j, k) @@ -231,6 +327,10 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Indeed, the inner domain is much finer. These examples could be extended to more complicated cases, for example using adaptive mesh refinement for a numerical PDE solution so that triangles are refined based on some *a posteriori* error estimate, implemented @@ -244,7 +344,7 @@ algorithm will still try its best to refine in these locations. Let's consider a example with many small angles. We consider the boundary of Switzerland, as obtained in this [NaturalNeighbours.jl example](https://danielvandh.github.io/NaturalNeighbours.jl/stable/swiss/). -````@example refinement +````julia using Downloads using DelimitedFiles boundary_url = "https://gist.githubusercontent.com/DanielVandH/13687b0918e45a416a5c93cd52c91449/raw/a8da6cdc94859fd66bcff85a2307f0f9cd57a18c/boundary.txt" @@ -254,9 +354,5139 @@ boundary_points = [(boundary[i, 1], boundary[i, 2]) for i in axes(boundary, 1)] reverse!(boundary_points) ```` +```` +5126-element Vector{Tuple{Float64, Float64}}: + (7.133862520764, 45.871870678164) + (7.138563027059, 45.871870678164) + (7.138563027059, 45.876571184459) + (7.143263533355, 45.876571184459) + (7.14796403965, 45.876571184459) + (7.152664545945, 45.876571184459) + (7.15736505224, 45.876571184459) + (7.162065558535, 45.876571184459) + (7.162065558535, 45.871870678164) + (7.166766064831, 45.871870678164) + (7.166766064831, 45.867170171868) + (7.171466571126, 45.867170171868) + (7.171466571126, 45.862469665573) + (7.176167077421, 45.862469665573) + (7.180867583716, 45.862469665573) + (7.185568090011, 45.862469665573) + (7.185568090011, 45.857769159278) + (7.190268596307, 45.857769159278) + (7.194969102602, 45.857769159278) + (7.194969102602, 45.862469665573) + (7.199669608897, 45.862469665573) + (7.199669608897, 45.867170171868) + (7.199669608897, 45.871870678164) + (7.199669608897, 45.876571184459) + (7.204370115192, 45.876571184459) + (7.209070621488, 45.876571184459) + (7.209070621488, 45.881271690754) + (7.213771127783, 45.881271690754) + (7.213771127783, 45.885972197049) + (7.218471634078, 45.885972197049) + (7.218471634078, 45.890672703344) + (7.223172140373, 45.890672703344) + (7.227872646668, 45.890672703344) + (7.232573152964, 45.890672703344) + (7.237273659259, 45.890672703344) + (7.241974165554, 45.890672703344) + (7.246674671849, 45.890672703344) + (7.251375178144, 45.890672703344) + (7.25607568444, 45.890672703344) + (7.260776190735, 45.890672703344) + (7.260776190735, 45.89537320964) + (7.26547669703, 45.89537320964) + (7.270177203325, 45.89537320964) + (7.270177203325, 45.900073715935) + (7.274877709621, 45.900073715935) + (7.279578215916, 45.900073715935) + (7.279578215916, 45.90477422223) + (7.279578215916, 45.909474728525) + (7.284278722211, 45.909474728525) + (7.284278722211, 45.91417523482) + (7.288979228506, 45.91417523482) + (7.288979228506, 45.918875741116) + (7.293679734801, 45.918875741116) + (7.298380241097, 45.918875741116) + (7.303080747392, 45.918875741116) + (7.307781253687, 45.918875741116) + (7.312481759982, 45.918875741116) + (7.312481759982, 45.91417523482) + (7.317182266278, 45.91417523482) + (7.317182266278, 45.909474728525) + (7.321882772573, 45.909474728525) + (7.326583278868, 45.909474728525) + (7.331283785163, 45.909474728525) + (7.335984291458, 45.909474728525) + (7.335984291458, 45.91417523482) + (7.340684797754, 45.91417523482) + (7.345385304049, 45.91417523482) + (7.350085810344, 45.91417523482) + (7.350085810344, 45.909474728525) + (7.354786316639, 45.909474728525) + (7.354786316639, 45.90477422223) + (7.359486822934, 45.90477422223) + (7.36418732923, 45.90477422223) + (7.368887835525, 45.90477422223) + (7.37358834182, 45.90477422223) + (7.37358834182, 45.900073715935) + (7.378288848115, 45.900073715935) + (7.382989354411, 45.900073715935) + (7.382989354411, 45.89537320964) + (7.387689860706, 45.89537320964) + (7.387689860706, 45.900073715935) + (7.392390367001, 45.900073715935) + (7.397090873296, 45.900073715935) + (7.397090873296, 45.90477422223) + (7.397090873296, 45.909474728525) + (7.401791379591, 45.909474728525) + (7.406491885887, 45.909474728525) + (7.411192392182, 45.909474728525) + (7.415892898477, 45.909474728525) + (7.420593404772, 45.909474728525) + (7.420593404772, 45.91417523482) + (7.425293911067, 45.91417523482) + (7.429994417363, 45.91417523482) + (7.429994417363, 45.918875741116) + (7.434694923658, 45.918875741116) + (7.434694923658, 45.923576247411) + (7.439395429953, 45.923576247411) + (7.439395429953, 45.928276753706) + (7.444095936248, 45.928276753706) + (7.448796442544, 45.928276753706) + (7.448796442544, 45.932977260001) + (7.453496948839, 45.932977260001) + (7.458197455134, 45.932977260001) + (7.462897961429, 45.932977260001) + (7.462897961429, 45.937677766297) + (7.467598467724, 45.937677766297) + (7.467598467724, 45.932977260001) + (7.47229897402, 45.932977260001) + (7.47229897402, 45.937677766297) + (7.47229897402, 45.942378272592) + (7.47229897402, 45.947078778887) + (7.47229897402, 45.951779285182) + (7.476999480315, 45.951779285182) + (7.48169998661, 45.951779285182) + (7.48169998661, 45.956479791477) + (7.486400492905, 45.956479791477) + (7.4911009992, 45.956479791477) + (7.495801505496, 45.956479791477) + (7.495801505496, 45.961180297773) + (7.500502011791, 45.961180297773) + (7.505202518086, 45.961180297773) + (7.509903024381, 45.961180297773) + (7.514603530677, 45.961180297773) + (7.519304036972, 45.961180297773) + (7.524004543267, 45.961180297773) + (7.524004543267, 45.956479791477) + (7.528705049562, 45.956479791477) + (7.533405555857, 45.956479791477) + (7.538106062153, 45.956479791477) + (7.542806568448, 45.956479791477) + (7.542806568448, 45.961180297773) + (7.547507074743, 45.961180297773) + (7.547507074743, 45.965880804068) + (7.547507074743, 45.970581310363) + (7.542806568448, 45.970581310363) + (7.542806568448, 45.975281816658) + (7.542806568448, 45.979982322953) + (7.542806568448, 45.984682829249) + (7.547507074743, 45.984682829249) + (7.552207581038, 45.984682829249) + (7.556908087333, 45.984682829249) + (7.561608593629, 45.984682829249) + (7.566309099924, 45.984682829249) + (7.566309099924, 45.989383335544) + (7.571009606219, 45.989383335544) + (7.575710112514, 45.989383335544) + (7.575710112514, 45.984682829249) + (7.58041061881, 45.984682829249) + (7.58041061881, 45.979982322953) + (7.58041061881, 45.975281816658) + (7.585111125105, 45.975281816658) + (7.585111125105, 45.970581310363) + (7.5898116314, 45.970581310363) + (7.594512137695, 45.970581310363) + (7.59921264399, 45.970581310363) + (7.603913150286, 45.970581310363) + (7.608613656581, 45.970581310363) + (7.613314162876, 45.970581310363) + (7.618014669171, 45.970581310363) + (7.622715175467, 45.970581310363) + (7.627415681762, 45.970581310363) + (7.632116188057, 45.970581310363) + (7.636816694352, 45.970581310363) + (7.641517200647, 45.970581310363) + (7.646217706943, 45.970581310363) + (7.646217706943, 45.975281816658) + (7.650918213238, 45.975281816658) + (7.655618719533, 45.975281816658) + (7.660319225828, 45.975281816658) + (7.665019732123, 45.975281816658) + (7.669720238419, 45.975281816658) + (7.669720238419, 45.970581310363) + (7.674420744714, 45.970581310363) + (7.674420744714, 45.965880804068) + (7.679121251009, 45.965880804068) + (7.679121251009, 45.961180297773) + (7.679121251009, 45.956479791477) + (7.683821757304, 45.956479791477) + (7.6885222636, 45.956479791477) + (7.693222769895, 45.956479791477) + (7.69792327619, 45.956479791477) + (7.69792327619, 45.951779285182) + (7.702623782485, 45.951779285182) + (7.70732428878, 45.951779285182) + (7.70732428878, 45.947078778887) + (7.70732428878, 45.942378272592) + (7.70732428878, 45.937677766297) + (7.70732428878, 45.932977260001) + (7.712024795076, 45.932977260001) + (7.712024795076, 45.928276753706) + (7.716725301371, 45.928276753706) + (7.716725301371, 45.923576247411) + (7.721425807666, 45.923576247411) + (7.726126313961, 45.923576247411) + (7.730826820256, 45.923576247411) + (7.735527326552, 45.923576247411) + (7.735527326552, 45.928276753706) + (7.740227832847, 45.928276753706) + (7.740227832847, 45.932977260001) + (7.744928339142, 45.932977260001) + (7.744928339142, 45.937677766297) + (7.749628845437, 45.937677766297) + (7.749628845437, 45.942378272592) + (7.754329351733, 45.942378272592) + (7.754329351733, 45.937677766297) + (7.759029858028, 45.937677766297) + (7.763730364323, 45.937677766297) + (7.768430870618, 45.937677766297) + (7.768430870618, 45.932977260001) + (7.773131376913, 45.932977260001) + (7.777831883209, 45.932977260001) + (7.777831883209, 45.928276753706) + (7.782532389504, 45.928276753706) + (7.787232895799, 45.928276753706) + (7.787232895799, 45.923576247411) + (7.791933402094, 45.923576247411) + (7.796633908389, 45.923576247411) + (7.796633908389, 45.918875741116) + (7.801334414685, 45.918875741116) + (7.80603492098, 45.918875741116) + (7.80603492098, 45.923576247411) + (7.810735427275, 45.923576247411) + (7.81543593357, 45.923576247411) + (7.820136439866, 45.923576247411) + (7.824836946161, 45.923576247411) + (7.829537452456, 45.923576247411) + (7.834237958751, 45.923576247411) + (7.838938465046, 45.923576247411) + (7.843638971342, 45.923576247411) + (7.848339477637, 45.923576247411) + (7.848339477637, 45.918875741116) + (7.853039983932, 45.918875741116) + (7.857740490227, 45.918875741116) + (7.862440996522, 45.918875741116) + (7.867141502818, 45.918875741116) + (7.871842009113, 45.918875741116) + (7.871842009113, 45.923576247411) + (7.876542515408, 45.923576247411) + (7.876542515408, 45.928276753706) + (7.871842009113, 45.928276753706) + (7.871842009113, 45.932977260001) + (7.867141502818, 45.932977260001) + (7.867141502818, 45.937677766297) + (7.867141502818, 45.942378272592) + (7.871842009113, 45.942378272592) + (7.871842009113, 45.947078778887) + (7.871842009113, 45.951779285182) + (7.876542515408, 45.951779285182) + (7.876542515408, 45.956479791477) + (7.876542515408, 45.961180297773) + (7.881243021703, 45.961180297773) + (7.881243021703, 45.965880804068) + (7.881243021703, 45.970581310363) + (7.876542515408, 45.970581310363) + (7.876542515408, 45.975281816658) + (7.881243021703, 45.975281816658) + (7.885943527999, 45.975281816658) + (7.890644034294, 45.975281816658) + (7.890644034294, 45.979982322953) + (7.895344540589, 45.979982322953) + (7.895344540589, 45.984682829249) + (7.900045046884, 45.984682829249) + (7.900045046884, 45.989383335544) + (7.904745553179, 45.989383335544) + (7.904745553179, 45.994083841839) + (7.909446059475, 45.994083841839) + (7.909446059475, 45.998784348134) + (7.91414656577, 45.998784348134) + (7.918847072065, 45.998784348134) + (7.92354757836, 45.998784348134) + (7.928248084656, 45.998784348134) + (7.932948590951, 45.998784348134) + (7.937649097246, 45.998784348134) + (7.942349603541, 45.998784348134) + (7.947050109836, 45.998784348134) + (7.951750616132, 45.998784348134) + (7.956451122427, 45.998784348134) + (7.961151628722, 45.998784348134) + (7.965852135017, 45.998784348134) + (7.970552641312, 45.998784348134) + (7.975253147608, 45.998784348134) + (7.979953653903, 45.998784348134) + (7.984654160198, 45.998784348134) + (7.989354666493, 45.998784348134) + (7.994055172789, 45.998784348134) + (7.994055172789, 46.00348485443) + (7.998755679084, 46.00348485443) + (7.998755679084, 46.008185360725) + (7.998755679084, 46.01288586702) + (8.003456185379, 46.01288586702) + (8.008156691674, 46.01288586702) + (8.012857197969, 46.01288586702) + (8.012857197969, 46.017586373315) + (8.012857197969, 46.02228687961) + (8.017557704265, 46.02228687961) + (8.017557704265, 46.026987385906) + (8.017557704265, 46.031687892201) + (8.017557704265, 46.036388398496) + (8.02225821056, 46.036388398496) + (8.02225821056, 46.041088904791) + (8.026958716855, 46.041088904791) + (8.026958716855, 46.045789411086) + (8.03165922315, 46.045789411086) + (8.03165922315, 46.050489917382) + (8.026958716855, 46.050489917382) + (8.026958716855, 46.055190423677) + (8.026958716855, 46.059890929972) + (8.026958716855, 46.064591436267) + (8.02225821056, 46.064591436267) + (8.02225821056, 46.069291942563) + (8.02225821056, 46.073992448858) + (8.02225821056, 46.078692955153) + (8.026958716855, 46.078692955153) + (8.026958716855, 46.083393461448) + (8.03165922315, 46.083393461448) + (8.03165922315, 46.088093967743) + (8.03165922315, 46.092794474039) + (8.03165922315, 46.097494980334) + (8.036359729445, 46.097494980334) + (8.036359729445, 46.102195486629) + (8.041060235741, 46.102195486629) + (8.045760742036, 46.102195486629) + (8.050461248331, 46.102195486629) + (8.055161754626, 46.102195486629) + (8.059862260922, 46.102195486629) + (8.064562767217, 46.102195486629) + (8.064562767217, 46.106895992924) + (8.069263273512, 46.106895992924) + (8.073963779807, 46.106895992924) + (8.078664286102, 46.106895992924) + (8.083364792398, 46.106895992924) + (8.088065298693, 46.106895992924) + (8.092765804988, 46.106895992924) + (8.097466311283, 46.106895992924) + (8.097466311283, 46.111596499219) + (8.102166817578, 46.111596499219) + (8.106867323874, 46.111596499219) + (8.106867323874, 46.116297005515) + (8.111567830169, 46.116297005515) + (8.116268336464, 46.116297005515) + (8.116268336464, 46.12099751181) + (8.116268336464, 46.125698018105) + (8.116268336464, 46.1303985244) + (8.120968842759, 46.1303985244) + (8.120968842759, 46.135099030696) + (8.125669349055, 46.135099030696) + (8.13036985535, 46.135099030696) + (8.135070361645, 46.135099030696) + (8.13977086794, 46.135099030696) + (8.144471374235, 46.135099030696) + (8.149171880531, 46.135099030696) + (8.149171880531, 46.139799536991) + (8.153872386826, 46.139799536991) + (8.153872386826, 46.144500043286) + (8.153872386826, 46.149200549581) + (8.153872386826, 46.153901055876) + (8.149171880531, 46.153901055876) + (8.149171880531, 46.158601562172) + (8.149171880531, 46.163302068467) + (8.153872386826, 46.163302068467) + (8.153872386826, 46.168002574762) + (8.153872386826, 46.172703081057) + (8.158572893121, 46.172703081057) + (8.163273399416, 46.172703081057) + (8.163273399416, 46.177403587352) + (8.167973905711, 46.177403587352) + (8.167973905711, 46.182104093648) + (8.163273399416, 46.182104093648) + (8.163273399416, 46.186804599943) + (8.158572893121, 46.186804599943) + (8.158572893121, 46.191505106238) + (8.153872386826, 46.191505106238) + (8.153872386826, 46.196205612533) + (8.149171880531, 46.196205612533) + (8.149171880531, 46.200906118829) + (8.149171880531, 46.205606625124) + (8.144471374235, 46.205606625124) + (8.144471374235, 46.210307131419) + (8.144471374235, 46.215007637714) + (8.13977086794, 46.215007637714) + (8.13977086794, 46.219708144009) + (8.13977086794, 46.224408650305) + (8.135070361645, 46.224408650305) + (8.135070361645, 46.2291091566) + (8.13036985535, 46.2291091566) + (8.125669349055, 46.2291091566) + (8.120968842759, 46.2291091566) + (8.120968842759, 46.233809662895) + (8.116268336464, 46.233809662895) + (8.116268336464, 46.23851016919) + (8.116268336464, 46.243210675486) + (8.111567830169, 46.243210675486) + (8.111567830169, 46.247911181781) + (8.106867323874, 46.247911181781) + (8.106867323874, 46.252611688076) + (8.102166817578, 46.252611688076) + (8.097466311283, 46.252611688076) + (8.092765804988, 46.252611688076) + (8.088065298693, 46.252611688076) + (8.083364792398, 46.252611688076) + (8.083364792398, 46.257312194371) + (8.078664286102, 46.257312194371) + (8.078664286102, 46.262012700666) + (8.083364792398, 46.262012700666) + (8.083364792398, 46.266713206962) + (8.088065298693, 46.266713206962) + (8.092765804988, 46.266713206962) + (8.092765804988, 46.271413713257) + (8.097466311283, 46.271413713257) + (8.097466311283, 46.276114219552) + (8.102166817578, 46.276114219552) + (8.106867323874, 46.276114219552) + (8.106867323874, 46.280814725847) + (8.111567830169, 46.280814725847) + (8.116268336464, 46.280814725847) + (8.116268336464, 46.285515232142) + (8.116268336464, 46.290215738438) + (8.120968842759, 46.290215738438) + (8.120968842759, 46.294916244733) + (8.125669349055, 46.294916244733) + (8.125669349055, 46.299616751028) + (8.13036985535, 46.299616751028) + (8.135070361645, 46.299616751028) + (8.135070361645, 46.304317257323) + (8.13977086794, 46.304317257323) + (8.13977086794, 46.299616751028) + (8.144471374235, 46.299616751028) + (8.149171880531, 46.299616751028) + (8.153872386826, 46.299616751028) + (8.153872386826, 46.294916244733) + (8.158572893121, 46.294916244733) + (8.163273399416, 46.294916244733) + (8.167973905711, 46.294916244733) + (8.172674412007, 46.294916244733) + (8.177374918302, 46.294916244733) + (8.177374918302, 46.299616751028) + (8.182075424597, 46.299616751028) + (8.186775930892, 46.299616751028) + (8.191476437188, 46.299616751028) + (8.191476437188, 46.304317257323) + (8.196176943483, 46.304317257323) + (8.200877449778, 46.304317257323) + (8.205577956073, 46.304317257323) + (8.210278462368, 46.304317257323) + (8.210278462368, 46.309017763619) + (8.214978968664, 46.309017763619) + (8.214978968664, 46.313718269914) + (8.214978968664, 46.318418776209) + (8.219679474959, 46.318418776209) + (8.219679474959, 46.323119282504) + (8.224379981254, 46.323119282504) + (8.224379981254, 46.327819788799) + (8.224379981254, 46.332520295095) + (8.229080487549, 46.332520295095) + (8.229080487549, 46.33722080139) + (8.233780993844, 46.33722080139) + (8.23848150014, 46.33722080139) + (8.243182006435, 46.33722080139) + (8.243182006435, 46.341921307685) + (8.24788251273, 46.341921307685) + (8.252583019025, 46.341921307685) + (8.252583019025, 46.34662181398) + (8.257283525321, 46.34662181398) + (8.261984031616, 46.34662181398) + (8.261984031616, 46.351322320275) + (8.261984031616, 46.356022826571) + (8.261984031616, 46.360723332866) + (8.261984031616, 46.365423839161) + (8.266684537911, 46.365423839161) + (8.271385044206, 46.365423839161) + (8.276085550501, 46.365423839161) + (8.280786056797, 46.365423839161) + (8.285486563092, 46.365423839161) + (8.285486563092, 46.370124345456) + (8.290187069387, 46.370124345456) + (8.294887575682, 46.370124345456) + (8.294887575682, 46.374824851752) + (8.299588081978, 46.374824851752) + (8.304288588273, 46.374824851752) + (8.308989094568, 46.374824851752) + (8.308989094568, 46.379525358047) + (8.313689600863, 46.379525358047) + (8.313689600863, 46.384225864342) + (8.318390107158, 46.384225864342) + (8.318390107158, 46.388926370637) + (8.313689600863, 46.388926370637) + (8.313689600863, 46.393626876932) + (8.313689600863, 46.398327383228) + (8.313689600863, 46.403027889523) + (8.308989094568, 46.403027889523) + (8.304288588273, 46.403027889523) + (8.299588081978, 46.403027889523) + (8.294887575682, 46.403027889523) + (8.294887575682, 46.407728395818) + (8.290187069387, 46.407728395818) + (8.290187069387, 46.412428902113) + (8.294887575682, 46.412428902113) + (8.294887575682, 46.417129408408) + (8.299588081978, 46.417129408408) + (8.299588081978, 46.421829914704) + (8.304288588273, 46.421829914704) + (8.308989094568, 46.421829914704) + (8.308989094568, 46.426530420999) + (8.313689600863, 46.426530420999) + (8.318390107158, 46.426530420999) + (8.323090613454, 46.426530420999) + (8.327791119749, 46.426530420999) + (8.332491626044, 46.426530420999) + (8.332491626044, 46.431230927294) + (8.337192132339, 46.431230927294) + (8.341892638634, 46.431230927294) + (8.341892638634, 46.435931433589) + (8.34659314493, 46.435931433589) + (8.34659314493, 46.440631939885) + (8.351293651225, 46.440631939885) + (8.35599415752, 46.440631939885) + (8.35599415752, 46.44533244618) + (8.360694663815, 46.44533244618) + (8.360694663815, 46.450032952475) + (8.365395170111, 46.450032952475) + (8.370095676406, 46.450032952475) + (8.370095676406, 46.45473345877) + (8.374796182701, 46.45473345877) + (8.379496688996, 46.45473345877) + (8.384197195291, 46.45473345877) + (8.388897701587, 46.45473345877) + (8.393598207882, 46.45473345877) + (8.398298714177, 46.45473345877) + (8.402999220472, 46.45473345877) + (8.407699726767, 46.45473345877) + (8.407699726767, 46.459433965065) + (8.412400233063, 46.459433965065) + (8.417100739358, 46.459433965065) + (8.421801245653, 46.459433965065) + (8.426501751948, 46.459433965065) + (8.426501751948, 46.464134471361) + (8.431202258244, 46.464134471361) + (8.435902764539, 46.464134471361) + (8.440603270834, 46.464134471361) + (8.445303777129, 46.464134471361) + (8.450004283424, 46.464134471361) + (8.450004283424, 46.459433965065) + (8.45470478972, 46.459433965065) + (8.45470478972, 46.45473345877) + (8.459405296015, 46.45473345877) + (8.459405296015, 46.450032952475) + (8.46410580231, 46.450032952475) + (8.46410580231, 46.44533244618) + (8.46410580231, 46.440631939885) + (8.459405296015, 46.440631939885) + (8.459405296015, 46.435931433589) + (8.459405296015, 46.431230927294) + (8.459405296015, 46.426530420999) + (8.459405296015, 46.421829914704) + (8.459405296015, 46.417129408408) + (8.46410580231, 46.417129408408) + (8.46410580231, 46.412428902113) + (8.468806308605, 46.412428902113) + (8.468806308605, 46.407728395818) + (8.46410580231, 46.407728395818) + (8.46410580231, 46.403027889523) + (8.46410580231, 46.398327383228) + (8.468806308605, 46.398327383228) + (8.468806308605, 46.393626876932) + (8.46410580231, 46.393626876932) + (8.46410580231, 46.388926370637) + (8.46410580231, 46.384225864342) + (8.46410580231, 46.379525358047) + (8.46410580231, 46.374824851752) + (8.468806308605, 46.374824851752) + (8.468806308605, 46.370124345456) + (8.468806308605, 46.365423839161) + (8.468806308605, 46.360723332866) + (8.46410580231, 46.360723332866) + (8.46410580231, 46.356022826571) + (8.46410580231, 46.351322320275) + (8.46410580231, 46.34662181398) + (8.46410580231, 46.341921307685) + (8.46410580231, 46.33722080139) + (8.46410580231, 46.332520295095) + (8.46410580231, 46.327819788799) + (8.459405296015, 46.327819788799) + (8.45470478972, 46.327819788799) + (8.45470478972, 46.323119282504) + (8.450004283424, 46.323119282504) + (8.450004283424, 46.318418776209) + (8.445303777129, 46.318418776209) + (8.440603270834, 46.318418776209) + (8.440603270834, 46.313718269914) + (8.440603270834, 46.309017763619) + (8.440603270834, 46.304317257323) + (8.435902764539, 46.304317257323) + (8.431202258244, 46.304317257323) + (8.431202258244, 46.299616751028) + (8.431202258244, 46.294916244733) + (8.431202258244, 46.290215738438) + (8.435902764539, 46.290215738438) + (8.435902764539, 46.285515232142) + (8.440603270834, 46.285515232142) + (8.440603270834, 46.280814725847) + (8.445303777129, 46.280814725847) + (8.445303777129, 46.276114219552) + (8.450004283424, 46.276114219552) + (8.450004283424, 46.271413713257) + (8.450004283424, 46.266713206962) + (8.450004283424, 46.262012700666) + (8.450004283424, 46.257312194371) + (8.445303777129, 46.257312194371) + (8.445303777129, 46.252611688076) + (8.445303777129, 46.247911181781) + (8.450004283424, 46.247911181781) + (8.45470478972, 46.247911181781) + (8.45470478972, 46.243210675486) + (8.459405296015, 46.243210675486) + (8.46410580231, 46.243210675486) + (8.46410580231, 46.23851016919) + (8.468806308605, 46.23851016919) + (8.468806308605, 46.233809662895) + (8.4735068149, 46.233809662895) + (8.4735068149, 46.2291091566) + (8.478207321196, 46.2291091566) + (8.482907827491, 46.2291091566) + (8.487608333786, 46.2291091566) + (8.492308840081, 46.2291091566) + (8.497009346377, 46.2291091566) + (8.497009346377, 46.224408650305) + (8.501709852672, 46.224408650305) + (8.506410358967, 46.224408650305) + (8.511110865262, 46.224408650305) + (8.515811371557, 46.224408650305) + (8.515811371557, 46.219708144009) + (8.520511877853, 46.219708144009) + (8.525212384148, 46.219708144009) + (8.529912890443, 46.219708144009) + (8.534613396738, 46.219708144009) + (8.534613396738, 46.215007637714) + (8.534613396738, 46.210307131419) + (8.534613396738, 46.205606625124) + (8.539313903033, 46.205606625124) + (8.539313903033, 46.200906118829) + (8.539313903033, 46.196205612533) + (8.544014409329, 46.196205612533) + (8.548714915624, 46.196205612533) + (8.548714915624, 46.191505106238) + (8.553415421919, 46.191505106238) + (8.553415421919, 46.186804599943) + (8.558115928214, 46.186804599943) + (8.558115928214, 46.182104093648) + (8.56281643451, 46.182104093648) + (8.567516940805, 46.182104093648) + (8.567516940805, 46.177403587352) + (8.5722174471, 46.177403587352) + (8.5722174471, 46.172703081057) + (8.5722174471, 46.168002574762) + (8.576917953395, 46.168002574762) + (8.576917953395, 46.163302068467) + (8.58161845969, 46.163302068467) + (8.586318965986, 46.163302068467) + (8.586318965986, 46.158601562172) + (8.591019472281, 46.158601562172) + (8.595719978576, 46.158601562172) + (8.595719978576, 46.153901055876) + (8.600420484871, 46.153901055876) + (8.600420484871, 46.149200549581) + (8.595719978576, 46.149200549581) + (8.595719978576, 46.144500043286) + (8.595719978576, 46.139799536991) + (8.600420484871, 46.139799536991) + (8.605120991167, 46.139799536991) + (8.605120991167, 46.135099030696) + (8.609821497462, 46.135099030696) + (8.609821497462, 46.1303985244) + (8.609821497462, 46.125698018105) + (8.614522003757, 46.125698018105) + (8.614522003757, 46.12099751181) + (8.619222510052, 46.12099751181) + (8.623923016347, 46.12099751181) + (8.628623522643, 46.12099751181) + (8.633324028938, 46.12099751181) + (8.638024535233, 46.12099751181) + (8.642725041528, 46.12099751181) + (8.647425547823, 46.12099751181) + (8.652126054119, 46.12099751181) + (8.652126054119, 46.116297005515) + (8.656826560414, 46.116297005515) + (8.656826560414, 46.111596499219) + (8.661527066709, 46.111596499219) + (8.666227573004, 46.111596499219) + (8.666227573004, 46.106895992924) + (8.6709280793, 46.106895992924) + (8.675628585595, 46.106895992924) + (8.675628585595, 46.111596499219) + (8.68032909189, 46.111596499219) + (8.68032909189, 46.106895992924) + (8.685029598185, 46.106895992924) + (8.685029598185, 46.102195486629) + (8.68973010448, 46.102195486629) + (8.694430610776, 46.102195486629) + (8.699131117071, 46.102195486629) + (8.703831623366, 46.102195486629) + (8.703831623366, 46.097494980334) + (8.708532129661, 46.097494980334) + (8.713232635956, 46.097494980334) + (8.717933142252, 46.097494980334) + (8.717933142252, 46.102195486629) + (8.717933142252, 46.106895992924) + (8.722633648547, 46.106895992924) + (8.722633648547, 46.111596499219) + (8.727334154842, 46.111596499219) + (8.732034661137, 46.111596499219) + (8.732034661137, 46.116297005515) + (8.736735167433, 46.116297005515) + (8.736735167433, 46.12099751181) + (8.741435673728, 46.12099751181) + (8.746136180023, 46.12099751181) + (8.746136180023, 46.116297005515) + (8.750836686318, 46.116297005515) + (8.750836686318, 46.111596499219) + (8.755537192613, 46.111596499219) + (8.755537192613, 46.106895992924) + (8.755537192613, 46.102195486629) + (8.760237698909, 46.102195486629) + (8.764938205204, 46.102195486629) + (8.764938205204, 46.097494980334) + (8.769638711499, 46.097494980334) + (8.774339217794, 46.097494980334) + (8.779039724089, 46.097494980334) + (8.783740230385, 46.097494980334) + (8.78844073668, 46.097494980334) + (8.793141242975, 46.097494980334) + (8.79784174927, 46.097494980334) + (8.802542255566, 46.097494980334) + (8.802542255566, 46.102195486629) + (8.807242761861, 46.102195486629) + (8.811943268156, 46.102195486629) + (8.811943268156, 46.097494980334) + (8.816643774451, 46.097494980334) + (8.821344280746, 46.097494980334) + (8.821344280746, 46.092794474039) + (8.826044787042, 46.092794474039) + (8.830745293337, 46.092794474039) + (8.830745293337, 46.088093967743) + (8.835445799632, 46.088093967743) + (8.835445799632, 46.083393461448) + (8.840146305927, 46.083393461448) + (8.840146305927, 46.078692955153) + (8.844846812222, 46.078692955153) + (8.849547318518, 46.078692955153) + (8.849547318518, 46.073992448858) + (8.854247824813, 46.073992448858) + (8.854247824813, 46.069291942563) + (8.854247824813, 46.064591436267) + (8.854247824813, 46.059890929972) + (8.849547318518, 46.059890929972) + (8.849547318518, 46.055190423677) + (8.849547318518, 46.050489917382) + (8.844846812222, 46.050489917382) + (8.840146305927, 46.050489917382) + (8.835445799632, 46.050489917382) + (8.830745293337, 46.050489917382) + (8.830745293337, 46.045789411086) + (8.830745293337, 46.041088904791) + (8.830745293337, 46.036388398496) + (8.826044787042, 46.036388398496) + (8.826044787042, 46.031687892201) + (8.826044787042, 46.026987385906) + (8.821344280746, 46.026987385906) + (8.816643774451, 46.026987385906) + (8.811943268156, 46.026987385906) + (8.811943268156, 46.02228687961) + (8.807242761861, 46.02228687961) + (8.802542255566, 46.02228687961) + (8.802542255566, 46.017586373315) + (8.79784174927, 46.017586373315) + (8.79784174927, 46.01288586702) + (8.79784174927, 46.008185360725) + (8.793141242975, 46.008185360725) + (8.793141242975, 46.00348485443) + (8.793141242975, 45.998784348134) + (8.78844073668, 45.998784348134) + (8.78844073668, 45.994083841839) + (8.78844073668, 45.989383335544) + (8.793141242975, 45.989383335544) + (8.793141242975, 45.994083841839) + (8.79784174927, 45.994083841839) + (8.802542255566, 45.994083841839) + (8.807242761861, 45.994083841839) + (8.807242761861, 45.989383335544) + (8.811943268156, 45.989383335544) + (8.816643774451, 45.989383335544) + (8.821344280746, 45.989383335544) + (8.826044787042, 45.989383335544) + (8.830745293337, 45.989383335544) + (8.830745293337, 45.984682829249) + (8.835445799632, 45.984682829249) + (8.840146305927, 45.984682829249) + (8.840146305927, 45.979982322953) + (8.844846812222, 45.979982322953) + (8.844846812222, 45.975281816658) + (8.849547318518, 45.975281816658) + (8.849547318518, 45.970581310363) + (8.854247824813, 45.970581310363) + (8.858948331108, 45.970581310363) + (8.858948331108, 45.965880804068) + (8.863648837403, 45.965880804068) + (8.868349343699, 45.965880804068) + (8.868349343699, 45.961180297773) + (8.873049849994, 45.961180297773) + (8.873049849994, 45.956479791477) + (8.877750356289, 45.956479791477) + (8.882450862584, 45.956479791477) + (8.887151368879, 45.956479791477) + (8.891851875175, 45.956479791477) + (8.89655238147, 45.956479791477) + (8.89655238147, 45.951779285182) + (8.89655238147, 45.947078778887) + (8.89655238147, 45.942378272592) + (8.89655238147, 45.937677766297) + (8.89655238147, 45.932977260001) + (8.89655238147, 45.928276753706) + (8.89655238147, 45.923576247411) + (8.901252887765, 45.923576247411) + (8.901252887765, 45.918875741116) + (8.90595339406, 45.918875741116) + (8.910653900356, 45.918875741116) + (8.915354406651, 45.918875741116) + (8.915354406651, 45.91417523482) + (8.920054912946, 45.91417523482) + (8.920054912946, 45.909474728525) + (8.920054912946, 45.90477422223) + (8.924755419241, 45.90477422223) + (8.924755419241, 45.900073715935) + (8.924755419241, 45.89537320964) + (8.924755419241, 45.890672703344) + (8.929455925536, 45.890672703344) + (8.929455925536, 45.885972197049) + (8.934156431832, 45.885972197049) + (8.934156431832, 45.881271690754) + (8.934156431832, 45.876571184459) + (8.934156431832, 45.871870678164) + (8.934156431832, 45.867170171868) + (8.938856938127, 45.867170171868) + (8.943557444422, 45.867170171868) + (8.943557444422, 45.862469665573) + (8.938856938127, 45.862469665573) + (8.934156431832, 45.862469665573) + (8.934156431832, 45.857769159278) + (8.929455925536, 45.857769159278) + (8.929455925536, 45.853068652983) + (8.924755419241, 45.853068652983) + (8.920054912946, 45.853068652983) + (8.920054912946, 45.848368146687) + (8.915354406651, 45.848368146687) + (8.915354406651, 45.843667640392) + (8.915354406651, 45.838967134097) + (8.910653900356, 45.838967134097) + (8.910653900356, 45.834266627802) + (8.915354406651, 45.834266627802) + (8.915354406651, 45.829566121507) + (8.920054912946, 45.829566121507) + (8.924755419241, 45.829566121507) + (8.924755419241, 45.834266627802) + (8.929455925536, 45.834266627802) + (8.934156431832, 45.834266627802) + (8.934156431832, 45.838967134097) + (8.938856938127, 45.838967134097) + (8.943557444422, 45.838967134097) + (8.943557444422, 45.843667640392) + (8.948257950717, 45.843667640392) + (8.952958457012, 45.843667640392) + (8.957658963308, 45.843667640392) + (8.957658963308, 45.838967134097) + (8.962359469603, 45.838967134097) + (8.962359469603, 45.834266627802) + (8.967059975898, 45.834266627802) + (8.971760482193, 45.834266627802) + (8.976460988489, 45.834266627802) + (8.981161494784, 45.834266627802) + (8.985862001079, 45.834266627802) + (8.990562507374, 45.834266627802) + (8.995263013669, 45.834266627802) + (8.995263013669, 45.829566121507) + (8.995263013669, 45.824865615211) + (8.995263013669, 45.820165108916) + (8.999963519965, 45.820165108916) + (9.00466402626, 45.820165108916) + (9.009364532555, 45.820165108916) + (9.01406503885, 45.820165108916) + (9.018765545145, 45.820165108916) + (9.023466051441, 45.820165108916) + (9.028166557736, 45.820165108916) + (9.032867064031, 45.820165108916) + (9.032867064031, 45.824865615211) + (9.032867064031, 45.829566121507) + (9.037567570326, 45.829566121507) + (9.037567570326, 45.834266627802) + (9.037567570326, 45.838967134097) + (9.037567570326, 45.843667640392) + (9.042268076622, 45.843667640392) + (9.042268076622, 45.848368146687) + (9.046968582917, 45.848368146687) + (9.046968582917, 45.853068652983) + (9.051669089212, 45.853068652983) + (9.051669089212, 45.857769159278) + (9.051669089212, 45.862469665573) + (9.051669089212, 45.867170171868) + (9.051669089212, 45.871870678164) + (9.056369595507, 45.871870678164) + (9.056369595507, 45.876571184459) + (9.061070101802, 45.876571184459) + (9.065770608098, 45.876571184459) + (9.070471114393, 45.876571184459) + (9.070471114393, 45.881271690754) + (9.075171620688, 45.881271690754) + (9.075171620688, 45.885972197049) + (9.079872126983, 45.885972197049) + (9.079872126983, 45.890672703344) + (9.084572633278, 45.890672703344) + (9.084572633278, 45.89537320964) + (9.089273139574, 45.89537320964) + (9.089273139574, 45.900073715935) + (9.084572633278, 45.900073715935) + (9.079872126983, 45.900073715935) + (9.075171620688, 45.900073715935) + (9.075171620688, 45.90477422223) + (9.075171620688, 45.909474728525) + (9.075171620688, 45.91417523482) + (9.070471114393, 45.91417523482) + (9.065770608098, 45.91417523482) + (9.061070101802, 45.91417523482) + (9.061070101802, 45.918875741116) + (9.061070101802, 45.923576247411) + (9.056369595507, 45.923576247411) + (9.056369595507, 45.918875741116) + (9.051669089212, 45.918875741116) + (9.051669089212, 45.923576247411) + (9.046968582917, 45.923576247411) + (9.046968582917, 45.928276753706) + (9.042268076622, 45.928276753706) + (9.037567570326, 45.928276753706) + (9.032867064031, 45.928276753706) + (9.028166557736, 45.928276753706) + (9.023466051441, 45.928276753706) + (9.018765545145, 45.928276753706) + (9.018765545145, 45.932977260001) + (9.023466051441, 45.932977260001) + (9.023466051441, 45.937677766297) + (9.018765545145, 45.937677766297) + (9.018765545145, 45.942378272592) + (9.01406503885, 45.942378272592) + (9.01406503885, 45.947078778887) + (9.018765545145, 45.947078778887) + (9.018765545145, 45.951779285182) + (9.01406503885, 45.951779285182) + (9.01406503885, 45.956479791477) + (9.01406503885, 45.961180297773) + (9.009364532555, 45.961180297773) + (9.00466402626, 45.961180297773) + (9.00466402626, 45.965880804068) + (8.999963519965, 45.965880804068) + (8.995263013669, 45.965880804068) + (8.990562507374, 45.965880804068) + (8.990562507374, 45.970581310363) + (8.995263013669, 45.970581310363) + (8.995263013669, 45.975281816658) + (8.995263013669, 45.979982322953) + (8.999963519965, 45.979982322953) + (9.00466402626, 45.979982322953) + (9.009364532555, 45.979982322953) + (9.009364532555, 45.984682829249) + (9.009364532555, 45.989383335544) + (9.01406503885, 45.989383335544) + (9.018765545145, 45.989383335544) + (9.023466051441, 45.989383335544) + (9.023466051441, 45.994083841839) + (9.028166557736, 45.994083841839) + (9.028166557736, 45.998784348134) + (9.023466051441, 45.998784348134) + (9.023466051441, 46.00348485443) + (9.023466051441, 46.008185360725) + (9.023466051441, 46.01288586702) + (9.023466051441, 46.017586373315) + (9.018765545145, 46.017586373315) + (9.018765545145, 46.02228687961) + (9.01406503885, 46.02228687961) + (9.01406503885, 46.026987385906) + (9.009364532555, 46.026987385906) + (9.009364532555, 46.031687892201) + (9.009364532555, 46.036388398496) + (9.009364532555, 46.041088904791) + (9.01406503885, 46.041088904791) + (9.018765545145, 46.041088904791) + (9.018765545145, 46.045789411086) + (9.018765545145, 46.050489917382) + (9.023466051441, 46.050489917382) + (9.023466051441, 46.055190423677) + (9.028166557736, 46.055190423677) + (9.032867064031, 46.055190423677) + (9.037567570326, 46.055190423677) + (9.037567570326, 46.059890929972) + (9.042268076622, 46.059890929972) + (9.046968582917, 46.059890929972) + (9.051669089212, 46.059890929972) + (9.056369595507, 46.059890929972) + (9.061070101802, 46.059890929972) + (9.065770608098, 46.059890929972) + (9.070471114393, 46.059890929972) + (9.070471114393, 46.064591436267) + (9.075171620688, 46.064591436267) + (9.079872126983, 46.064591436267) + (9.079872126983, 46.069291942563) + (9.079872126983, 46.073992448858) + (9.079872126983, 46.078692955153) + (9.084572633278, 46.078692955153) + (9.084572633278, 46.083393461448) + (9.089273139574, 46.083393461448) + (9.089273139574, 46.088093967743) + (9.084572633278, 46.088093967743) + (9.084572633278, 46.092794474039) + (9.084572633278, 46.097494980334) + (9.079872126983, 46.097494980334) + (9.079872126983, 46.102195486629) + (9.079872126983, 46.106895992924) + (9.075171620688, 46.106895992924) + (9.075171620688, 46.111596499219) + (9.075171620688, 46.116297005515) + (9.075171620688, 46.12099751181) + (9.079872126983, 46.12099751181) + (9.084572633278, 46.12099751181) + (9.084572633278, 46.125698018105) + (9.089273139574, 46.125698018105) + (9.093973645869, 46.125698018105) + (9.098674152164, 46.125698018105) + (9.098674152164, 46.1303985244) + (9.103374658459, 46.1303985244) + (9.108075164755, 46.1303985244) + (9.108075164755, 46.135099030696) + (9.11277567105, 46.135099030696) + (9.117476177345, 46.135099030696) + (9.12217668364, 46.135099030696) + (9.12217668364, 46.139799536991) + (9.126877189935, 46.139799536991) + (9.126877189935, 46.144500043286) + (9.131577696231, 46.144500043286) + (9.131577696231, 46.149200549581) + (9.136278202526, 46.149200549581) + (9.136278202526, 46.153901055876) + (9.140978708821, 46.153901055876) + (9.145679215116, 46.153901055876) + (9.145679215116, 46.158601562172) + (9.150379721411, 46.158601562172) + (9.155080227707, 46.158601562172) + (9.155080227707, 46.163302068467) + (9.159780734002, 46.163302068467) + (9.159780734002, 46.168002574762) + (9.164481240297, 46.168002574762) + (9.164481240297, 46.172703081057) + (9.169181746592, 46.172703081057) + (9.173882252888, 46.172703081057) + (9.178582759183, 46.172703081057) + (9.183283265478, 46.172703081057) + (9.187983771773, 46.172703081057) + (9.187983771773, 46.177403587352) + (9.192684278068, 46.177403587352) + (9.192684278068, 46.182104093648) + (9.197384784364, 46.182104093648) + (9.197384784364, 46.186804599943) + (9.197384784364, 46.191505106238) + (9.192684278068, 46.191505106238) + (9.192684278068, 46.196205612533) + (9.197384784364, 46.196205612533) + (9.197384784364, 46.200906118829) + (9.202085290659, 46.200906118829) + (9.202085290659, 46.205606625124) + (9.202085290659, 46.210307131419) + (9.206785796954, 46.210307131419) + (9.211486303249, 46.210307131419) + (9.216186809544, 46.210307131419) + (9.216186809544, 46.215007637714) + (9.22088731584, 46.215007637714) + (9.22088731584, 46.219708144009) + (9.22088731584, 46.224408650305) + (9.22088731584, 46.2291091566) + (9.225587822135, 46.2291091566) + (9.225587822135, 46.233809662895) + (9.23028832843, 46.233809662895) + (9.234988834725, 46.233809662895) + (9.239689341021, 46.233809662895) + (9.244389847316, 46.233809662895) + (9.249090353611, 46.233809662895) + (9.249090353611, 46.23851016919) + (9.249090353611, 46.243210675486) + (9.249090353611, 46.247911181781) + (9.249090353611, 46.252611688076) + (9.249090353611, 46.257312194371) + (9.249090353611, 46.262012700666) + (9.253790859906, 46.262012700666) + (9.253790859906, 46.266713206962) + (9.253790859906, 46.271413713257) + (9.258491366201, 46.271413713257) + (9.258491366201, 46.276114219552) + (9.258491366201, 46.280814725847) + (9.263191872497, 46.280814725847) + (9.267892378792, 46.280814725847) + (9.267892378792, 46.285515232142) + (9.272592885087, 46.285515232142) + (9.272592885087, 46.290215738438) + (9.277293391382, 46.290215738438) + (9.277293391382, 46.294916244733) + (9.281993897678, 46.294916244733) + (9.281993897678, 46.299616751028) + (9.281993897678, 46.304317257323) + (9.281993897678, 46.309017763619) + (9.286694403973, 46.309017763619) + (9.286694403973, 46.313718269914) + (9.291394910268, 46.313718269914) + (9.291394910268, 46.318418776209) + (9.296095416563, 46.318418776209) + (9.296095416563, 46.323119282504) + (9.296095416563, 46.327819788799) + (9.296095416563, 46.332520295095) + (9.291394910268, 46.332520295095) + (9.291394910268, 46.33722080139) + (9.296095416563, 46.33722080139) + (9.296095416563, 46.341921307685) + (9.300795922858, 46.341921307685) + (9.300795922858, 46.34662181398) + (9.300795922858, 46.351322320275) + (9.296095416563, 46.351322320275) + (9.296095416563, 46.356022826571) + (9.291394910268, 46.356022826571) + (9.286694403973, 46.356022826571) + (9.281993897678, 46.356022826571) + (9.281993897678, 46.360723332866) + (9.277293391382, 46.360723332866) + (9.277293391382, 46.365423839161) + (9.277293391382, 46.370124345456) + (9.277293391382, 46.374824851752) + (9.277293391382, 46.379525358047) + (9.281993897678, 46.379525358047) + (9.281993897678, 46.384225864342) + (9.281993897678, 46.388926370637) + (9.277293391382, 46.388926370637) + (9.277293391382, 46.393626876932) + (9.277293391382, 46.398327383228) + (9.281993897678, 46.398327383228) + (9.281993897678, 46.403027889523) + (9.281993897678, 46.407728395818) + (9.281993897678, 46.412428902113) + (9.277293391382, 46.412428902113) + (9.277293391382, 46.417129408408) + (9.272592885087, 46.417129408408) + (9.272592885087, 46.421829914704) + (9.267892378792, 46.421829914704) + (9.263191872497, 46.421829914704) + (9.258491366201, 46.421829914704) + (9.258491366201, 46.426530420999) + (9.253790859906, 46.426530420999) + (9.253790859906, 46.431230927294) + (9.249090353611, 46.431230927294) + (9.249090353611, 46.435931433589) + (9.249090353611, 46.440631939885) + (9.249090353611, 46.44533244618) + (9.249090353611, 46.450032952475) + (9.253790859906, 46.450032952475) + (9.258491366201, 46.450032952475) + (9.263191872497, 46.450032952475) + (9.263191872497, 46.45473345877) + (9.267892378792, 46.45473345877) + (9.272592885087, 46.45473345877) + (9.272592885087, 46.459433965065) + (9.277293391382, 46.459433965065) + (9.277293391382, 46.464134471361) + (9.272592885087, 46.464134471361) + (9.272592885087, 46.468834977656) + (9.277293391382, 46.468834977656) + (9.277293391382, 46.473535483951) + (9.277293391382, 46.478235990246) + (9.277293391382, 46.482936496541) + (9.277293391382, 46.482936496542) + (9.277293391382, 46.487637002837) + (9.281993897678, 46.487637002837) + (9.281993897678, 46.492337509132) + (9.286694403973, 46.492337509132) + (9.286694403973, 46.497038015427) + (9.291394910268, 46.497038015427) + (9.296095416563, 46.497038015427) + (9.300795922858, 46.497038015427) + (9.300795922858, 46.501738521722) + (9.305496429154, 46.501738521722) + (9.310196935449, 46.501738521722) + (9.314897441744, 46.501738521722) + (9.314897441744, 46.506439028018) + (9.319597948039, 46.506439028018) + (9.324298454334, 46.506439028018) + (9.32899896063, 46.506439028018) + (9.333699466925, 46.506439028018) + (9.33839997322, 46.506439028018) + (9.343100479515, 46.506439028018) + (9.347800985811, 46.506439028018) + (9.352501492106, 46.506439028018) + (9.357201998401, 46.506439028018) + (9.361902504696, 46.506439028018) + (9.366603010991, 46.506439028018) + (9.371303517287, 46.506439028018) + (9.371303517287, 46.501738521722) + (9.371303517287, 46.497038015427) + (9.371303517287, 46.492337509132) + (9.371303517287, 46.487637002837) + (9.376004023582, 46.487637002837) + (9.380704529877, 46.487637002837) + (9.380704529877, 46.482936496541) + (9.385405036172, 46.482936496541) + (9.385405036172, 46.478235990246) + (9.390105542467, 46.478235990246) + (9.390105542467, 46.473535483951) + (9.394806048763, 46.473535483951) + (9.394806048763, 46.468834977656) + (9.399506555058, 46.468834977656) + (9.404207061353, 46.468834977656) + (9.408907567648, 46.468834977656) + (9.413608073944, 46.468834977656) + (9.418308580239, 46.468834977656) + (9.418308580239, 46.473535483951) + (9.423009086534, 46.473535483951) + (9.423009086534, 46.478235990246) + (9.423009086534, 46.482936496541) + (9.423009086534, 46.482936496542) + (9.423009086534, 46.487637002837) + (9.427709592829, 46.487637002837) + (9.427709592829, 46.492337509132) + (9.432410099124, 46.492337509132) + (9.432410099124, 46.497038015427) + (9.43711060542, 46.497038015427) + (9.43711060542, 46.501738521722) + (9.441811111715, 46.501738521722) + (9.44651161801, 46.501738521722) + (9.451212124305, 46.501738521722) + (9.451212124305, 46.506439028018) + (9.4559126306, 46.506439028018) + (9.460613136896, 46.506439028018) + (9.460613136896, 46.501738521722) + (9.460613136896, 46.497038015427) + (9.460613136896, 46.492337509132) + (9.460613136896, 46.487637002837) + (9.460613136896, 46.482936496542) + (9.4559126306, 46.482936496542) + (9.451212124305, 46.482936496542) + (9.451212124305, 46.478235990246) + (9.4559126306, 46.478235990246) + (9.460613136896, 46.478235990246) + (9.465313643191, 46.478235990246) + (9.465313643191, 46.473535483951) + (9.465313643191, 46.468834977656) + (9.465313643191, 46.464134471361) + (9.460613136896, 46.464134471361) + (9.460613136896, 46.459433965065) + (9.460613136896, 46.45473345877) + (9.460613136896, 46.450032952475) + (9.460613136896, 46.44533244618) + (9.460613136896, 46.440631939885) + (9.4559126306, 46.440631939885) + (9.4559126306, 46.435931433589) + (9.4559126306, 46.431230927294) + (9.4559126306, 46.426530420999) + (9.4559126306, 46.421829914704) + (9.4559126306, 46.417129408408) + (9.4559126306, 46.412428902113) + (9.460613136896, 46.412428902113) + (9.460613136896, 46.407728395818) + (9.465313643191, 46.407728395818) + (9.465313643191, 46.403027889523) + (9.465313643191, 46.398327383228) + (9.465313643191, 46.393626876932) + (9.465313643191, 46.388926370637) + (9.465313643191, 46.384225864342) + (9.465313643191, 46.379525358047) + (9.465313643191, 46.374824851752) + (9.465313643191, 46.370124345456) + (9.470014149486, 46.370124345456) + (9.474714655781, 46.370124345456) + (9.479415162077, 46.370124345456) + (9.479415162077, 46.365423839161) + (9.484115668372, 46.365423839161) + (9.488816174667, 46.365423839161) + (9.493516680962, 46.365423839161) + (9.493516680962, 46.360723332866) + (9.498217187257, 46.360723332866) + (9.498217187257, 46.356022826571) + (9.502917693553, 46.356022826571) + (9.502917693553, 46.351322320275) + (9.507618199848, 46.351322320275) + (9.507618199848, 46.34662181398) + (9.507618199848, 46.341921307685) + (9.512318706143, 46.341921307685) + (9.512318706143, 46.33722080139) + (9.512318706143, 46.332520295095) + (9.517019212438, 46.332520295095) + (9.517019212438, 46.327819788799) + (9.521719718733, 46.327819788799) + (9.521719718733, 46.323119282504) + (9.526420225029, 46.323119282504) + (9.526420225029, 46.318418776209) + (9.531120731324, 46.318418776209) + (9.531120731324, 46.313718269914) + (9.535821237619, 46.313718269914) + (9.535821237619, 46.309017763619) + (9.540521743914, 46.309017763619) + (9.540521743914, 46.304317257323) + (9.54522225021, 46.304317257323) + (9.549922756505, 46.304317257323) + (9.5546232628, 46.304317257323) + (9.559323769095, 46.304317257323) + (9.56402427539, 46.304317257323) + (9.56402427539, 46.299616751028) + (9.568724781686, 46.299616751028) + (9.573425287981, 46.299616751028) + (9.573425287981, 46.294916244733) + (9.578125794276, 46.294916244733) + (9.582826300571, 46.294916244733) + (9.587526806867, 46.294916244733) + (9.592227313162, 46.294916244733) + (9.596927819457, 46.294916244733) + (9.601628325752, 46.294916244733) + (9.606328832047, 46.294916244733) + (9.611029338343, 46.294916244733) + (9.615729844638, 46.294916244733) + (9.615729844638, 46.290215738438) + (9.620430350933, 46.290215738438) + (9.620430350933, 46.285515232142) + (9.625130857228, 46.285515232142) + (9.629831363523, 46.285515232142) + (9.634531869819, 46.285515232142) + (9.639232376114, 46.285515232142) + (9.643932882409, 46.285515232142) + (9.643932882409, 46.290215738438) + (9.648633388704, 46.290215738438) + (9.653333895, 46.290215738438) + (9.653333895, 46.294916244733) + (9.658034401295, 46.294916244733) + (9.66273490759, 46.294916244733) + (9.667435413885, 46.294916244733) + (9.667435413885, 46.299616751028) + (9.67213592018, 46.299616751028) + (9.676836426476, 46.299616751028) + (9.681536932771, 46.299616751028) + (9.686237439066, 46.299616751028) + (9.686237439066, 46.294916244733) + (9.690937945361, 46.294916244733) + (9.695638451656, 46.294916244733) + (9.695638451656, 46.290215738438) + (9.700338957952, 46.290215738438) + (9.705039464247, 46.290215738438) + (9.709739970542, 46.290215738438) + (9.709739970542, 46.294916244733) + (9.714440476837, 46.294916244733) + (9.714440476837, 46.299616751028) + (9.719140983133, 46.299616751028) + (9.719140983133, 46.304317257323) + (9.719140983133, 46.309017763619) + (9.723841489428, 46.309017763619) + (9.723841489428, 46.313718269914) + (9.728541995723, 46.313718269914) + (9.728541995723, 46.318418776209) + (9.723841489428, 46.318418776209) + (9.723841489428, 46.323119282504) + (9.719140983133, 46.323119282504) + (9.719140983133, 46.327819788799) + (9.723841489428, 46.327819788799) + (9.723841489428, 46.332520295095) + (9.728541995723, 46.332520295095) + (9.728541995723, 46.33722080139) + (9.723841489428, 46.33722080139) + (9.723841489428, 46.341921307685) + (9.728541995723, 46.341921307685) + (9.728541995723, 46.34662181398) + (9.733242502018, 46.34662181398) + (9.733242502018, 46.351322320275) + (9.737943008313, 46.351322320275) + (9.742643514609, 46.351322320275) + (9.747344020904, 46.351322320275) + (9.747344020904, 46.34662181398) + (9.752044527199, 46.34662181398) + (9.756745033494, 46.34662181398) + (9.756745033494, 46.341921307685) + (9.761445539789, 46.341921307685) + (9.761445539789, 46.33722080139) + (9.766146046085, 46.33722080139) + (9.77084655238, 46.33722080139) + (9.77084655238, 46.332520295095) + (9.775547058675, 46.332520295095) + (9.78024756497, 46.332520295095) + (9.78024756497, 46.33722080139) + (9.784948071266, 46.33722080139) + (9.789648577561, 46.33722080139) + (9.789648577561, 46.341921307685) + (9.794349083856, 46.341921307685) + (9.799049590151, 46.341921307685) + (9.803750096446, 46.341921307685) + (9.803750096446, 46.34662181398) + (9.808450602742, 46.34662181398) + (9.813151109037, 46.34662181398) + (9.817851615332, 46.34662181398) + (9.817851615332, 46.351322320275) + (9.822552121627, 46.351322320275) + (9.822552121627, 46.356022826571) + (9.827252627922, 46.356022826571) + (9.831953134218, 46.356022826571) + (9.831953134218, 46.360723332866) + (9.836653640513, 46.360723332866) + (9.841354146808, 46.360723332866) + (9.846054653103, 46.360723332866) + (9.850755159399, 46.360723332866) + (9.850755159399, 46.365423839161) + (9.855455665694, 46.365423839161) + (9.860156171989, 46.365423839161) + (9.864856678284, 46.365423839161) + (9.869557184579, 46.365423839161) + (9.874257690875, 46.365423839161) + (9.87895819717, 46.365423839161) + (9.87895819717, 46.370124345456) + (9.883658703465, 46.370124345456) + (9.883658703465, 46.374824851752) + (9.88835920976, 46.374824851752) + (9.893059716056, 46.374824851752) + (9.897760222351, 46.374824851752) + (9.897760222351, 46.379525358047) + (9.902460728646, 46.379525358047) + (9.907161234941, 46.379525358047) + (9.911861741236, 46.379525358047) + (9.911861741236, 46.374824851752) + (9.916562247532, 46.374824851752) + (9.916562247532, 46.370124345456) + (9.921262753827, 46.370124345456) + (9.925963260122, 46.370124345456) + (9.925963260122, 46.365423839161) + (9.930663766417, 46.365423839161) + (9.930663766417, 46.370124345456) + (9.935364272712, 46.370124345456) + (9.935364272712, 46.374824851752) + (9.940064779008, 46.374824851752) + (9.940064779008, 46.379525358047) + (9.944765285303, 46.379525358047) + (9.949465791598, 46.379525358047) + (9.954166297893, 46.379525358047) + (9.958866804189, 46.379525358047) + (9.958866804189, 46.374824851752) + (9.958866804189, 46.370124345456) + (9.963567310484, 46.370124345456) + (9.963567310484, 46.365423839161) + (9.968267816779, 46.365423839161) + (9.968267816779, 46.360723332866) + (9.972968323074, 46.360723332866) + (9.977668829369, 46.360723332866) + (9.977668829369, 46.356022826571) + (9.982369335665, 46.356022826571) + (9.98706984196, 46.356022826571) + (9.98706984196, 46.351322320275) + (9.991770348255, 46.351322320275) + (9.99647085455, 46.351322320275) + (9.99647085455, 46.34662181398) + (9.99647085455, 46.341921307685) + (9.991770348255, 46.341921307685) + (9.991770348255, 46.33722080139) + (9.98706984196, 46.33722080139) + (9.98706984196, 46.332520295095) + (9.98706984196, 46.327819788799) + (9.982369335665, 46.327819788799) + (9.982369335665, 46.323119282504) + (9.98706984196, 46.323119282504) + (9.98706984196, 46.318418776209) + (9.991770348255, 46.318418776209) + (9.991770348255, 46.313718269914) + (9.99647085455, 46.313718269914) + (10.001171360845, 46.313718269914) + (10.001171360845, 46.309017763619) + (10.001171360845, 46.304317257323) + (9.99647085455, 46.304317257323) + (9.99647085455, 46.299616751028) + (9.99647085455, 46.294916244733) + (9.991770348255, 46.294916244733) + (9.991770348255, 46.290215738438) + (9.99647085455, 46.290215738438) + (9.99647085455, 46.285515232142) + (10.001171360845, 46.285515232142) + (10.001171360845, 46.280814725847) + (10.005871867141, 46.280814725847) + (10.010572373436, 46.280814725847) + (10.015272879731, 46.280814725847) + (10.019973386026, 46.280814725847) + (10.019973386026, 46.276114219552) + (10.024673892322, 46.276114219552) + (10.029374398617, 46.276114219552) + (10.034074904912, 46.276114219552) + (10.038775411207, 46.276114219552) + (10.038775411207, 46.271413713257) + (10.043475917502, 46.271413713257) + (10.048176423798, 46.271413713257) + (10.048176423798, 46.266713206962) + (10.052876930093, 46.266713206962) + (10.052876930093, 46.262012700666) + (10.057577436388, 46.262012700666) + (10.057577436388, 46.257312194371) + (10.057577436388, 46.252611688076) + (10.057577436388, 46.247911181781) + (10.057577436388, 46.243210675486) + (10.057577436388, 46.23851016919) + (10.052876930093, 46.23851016919) + (10.052876930093, 46.233809662895) + (10.048176423798, 46.233809662895) + (10.043475917502, 46.233809662895) + (10.043475917502, 46.2291091566) + (10.048176423798, 46.2291091566) + (10.048176423798, 46.224408650305) + (10.052876930093, 46.224408650305) + (10.057577436388, 46.224408650305) + (10.057577436388, 46.219708144009) + (10.062277942683, 46.219708144009) + (10.066978448978, 46.219708144009) + (10.071678955274, 46.219708144009) + (10.076379461569, 46.219708144009) + (10.076379461569, 46.224408650305) + (10.081079967864, 46.224408650305) + (10.085780474159, 46.224408650305) + (10.090480980455, 46.224408650305) + (10.09518148675, 46.224408650305) + (10.09518148675, 46.2291091566) + (10.099881993045, 46.2291091566) + (10.10458249934, 46.2291091566) + (10.10458249934, 46.224408650305) + (10.109283005635, 46.224408650305) + (10.113983511931, 46.224408650305) + (10.118684018226, 46.224408650305) + (10.123384524521, 46.224408650305) + (10.128085030816, 46.224408650305) + (10.132785537111, 46.224408650305) + (10.137486043407, 46.224408650305) + (10.137486043407, 46.2291091566) + (10.142186549702, 46.2291091566) + (10.146887055997, 46.2291091566) + (10.146887055997, 46.233809662895) + (10.146887055997, 46.23851016919) + (10.151587562292, 46.23851016919) + (10.156288068588, 46.23851016919) + (10.156288068588, 46.243210675486) + (10.160988574883, 46.243210675486) + (10.160988574883, 46.247911181781) + (10.165689081178, 46.247911181781) + (10.170389587473, 46.247911181781) + (10.170389587473, 46.252611688076) + (10.175090093768, 46.252611688076) + (10.175090093768, 46.257312194371) + (10.175090093768, 46.262012700666) + (10.175090093768, 46.266713206962) + (10.170389587473, 46.266713206962) + (10.170389587473, 46.271413713257) + (10.165689081178, 46.271413713257) + (10.160988574883, 46.271413713257) + (10.160988574883, 46.276114219552) + (10.160988574883, 46.280814725847) + (10.160988574883, 46.285515232142) + (10.156288068588, 46.285515232142) + (10.156288068588, 46.290215738438) + (10.156288068588, 46.294916244733) + (10.151587562292, 46.294916244733) + (10.146887055997, 46.294916244733) + (10.142186549702, 46.294916244733) + (10.142186549702, 46.299616751028) + (10.137486043407, 46.299616751028) + (10.137486043407, 46.304317257323) + (10.137486043407, 46.309017763619) + (10.132785537111, 46.309017763619) + (10.128085030816, 46.309017763619) + (10.128085030816, 46.313718269914) + (10.123384524521, 46.313718269914) + (10.118684018226, 46.313718269914) + (10.118684018226, 46.318418776209) + (10.113983511931, 46.318418776209) + (10.113983511931, 46.323119282504) + (10.113983511931, 46.327819788799) + (10.109283005635, 46.327819788799) + (10.109283005635, 46.332520295095) + (10.10458249934, 46.332520295095) + (10.10458249934, 46.33722080139) + (10.10458249934, 46.341921307685) + (10.10458249934, 46.34662181398) + (10.109283005635, 46.34662181398) + (10.109283005635, 46.351322320275) + (10.113983511931, 46.351322320275) + (10.113983511931, 46.356022826571) + (10.118684018226, 46.356022826571) + (10.118684018226, 46.360723332866) + (10.123384524521, 46.360723332866) + (10.128085030816, 46.360723332866) + (10.132785537111, 46.360723332866) + (10.132785537111, 46.365423839161) + (10.128085030816, 46.365423839161) + (10.128085030816, 46.370124345456) + (10.128085030816, 46.374824851752) + (10.128085030816, 46.379525358047) + (10.132785537111, 46.379525358047) + (10.132785537111, 46.384225864342) + (10.137486043407, 46.384225864342) + (10.142186549702, 46.384225864342) + (10.146887055997, 46.384225864342) + (10.151587562292, 46.384225864342) + (10.156288068588, 46.384225864342) + (10.160988574883, 46.384225864342) + (10.160988574883, 46.388926370637) + (10.160988574883, 46.393626876932) + (10.165689081178, 46.393626876932) + (10.165689081178, 46.398327383228) + (10.165689081178, 46.403027889523) + (10.165689081178, 46.407728395818) + (10.165689081178, 46.412428902113) + (10.160988574883, 46.412428902113) + (10.156288068588, 46.412428902113) + (10.151587562292, 46.412428902113) + (10.146887055997, 46.412428902113) + (10.146887055997, 46.417129408408) + (10.146887055997, 46.421829914704) + (10.142186549702, 46.421829914704) + (10.142186549702, 46.426530420999) + (10.137486043407, 46.426530420999) + (10.132785537111, 46.426530420999) + (10.132785537111, 46.431230927294) + (10.128085030816, 46.431230927294) + (10.123384524521, 46.431230927294) + (10.123384524521, 46.426530420999) + (10.118684018226, 46.426530420999) + (10.113983511931, 46.426530420999) + (10.109283005635, 46.426530420999) + (10.10458249934, 46.426530420999) + (10.10458249934, 46.421829914704) + (10.099881993045, 46.421829914704) + (10.09518148675, 46.421829914704) + (10.090480980455, 46.421829914704) + (10.085780474159, 46.421829914704) + (10.081079967864, 46.421829914704) + (10.076379461569, 46.421829914704) + (10.076379461569, 46.426530420999) + (10.071678955274, 46.426530420999) + (10.066978448978, 46.426530420999) + (10.062277942683, 46.426530420999) + (10.057577436388, 46.426530420999) + (10.057577436388, 46.431230927294) + (10.057577436388, 46.435931433589) + (10.052876930093, 46.435931433589) + (10.052876930093, 46.440631939885) + (10.048176423798, 46.440631939885) + (10.043475917502, 46.440631939885) + (10.043475917502, 46.44533244618) + (10.038775411207, 46.44533244618) + (10.038775411207, 46.450032952475) + (10.043475917502, 46.450032952475) + (10.043475917502, 46.45473345877) + (10.048176423798, 46.45473345877) + (10.048176423798, 46.459433965065) + (10.052876930093, 46.459433965065) + (10.052876930093, 46.464134471361) + (10.052876930093, 46.468834977656) + (10.052876930093, 46.473535483951) + (10.048176423798, 46.473535483951) + (10.048176423798, 46.478235990246) + (10.043475917502, 46.478235990246) + (10.043475917502, 46.482936496541) + (10.043475917502, 46.482936496542) + (10.043475917502, 46.487637002837) + (10.048176423798, 46.487637002837) + (10.048176423798, 46.492337509132) + (10.048176423798, 46.497038015427) + (10.048176423798, 46.501738521722) + (10.048176423798, 46.506439028018) + (10.043475917502, 46.506439028018) + (10.043475917502, 46.511139534313) + (10.048176423798, 46.511139534313) + (10.048176423798, 46.515840040608) + (10.052876930093, 46.515840040608) + (10.052876930093, 46.520540546903) + (10.052876930093, 46.525241053198) + (10.052876930093, 46.529941559494) + (10.048176423798, 46.529941559494) + (10.048176423798, 46.534642065789) + (10.048176423798, 46.539342572084) + (10.048176423798, 46.544043078379) + (10.052876930093, 46.544043078379) + (10.057577436388, 46.544043078379) + (10.062277942683, 46.544043078379) + (10.062277942683, 46.548743584675) + (10.066978448978, 46.548743584675) + (10.066978448978, 46.55344409097) + (10.071678955274, 46.55344409097) + (10.071678955274, 46.558144597265) + (10.076379461569, 46.558144597265) + (10.076379461569, 46.56284510356) + (10.081079967864, 46.56284510356) + (10.085780474159, 46.56284510356) + (10.085780474159, 46.567545609855) + (10.081079967864, 46.567545609855) + (10.081079967864, 46.572246116151) + (10.081079967864, 46.576946622446) + (10.085780474159, 46.576946622446) + (10.090480980455, 46.576946622446) + (10.09518148675, 46.576946622446) + (10.09518148675, 46.581647128741) + (10.099881993045, 46.581647128741) + (10.099881993045, 46.586347635036) + (10.099881993045, 46.591048141331) + (10.099881993045, 46.595748647627) + (10.099881993045, 46.600449153922) + (10.099881993045, 46.605149660217) + (10.099881993045, 46.609850166512) + (10.10458249934, 46.609850166512) + (10.109283005635, 46.609850166512) + (10.113983511931, 46.609850166512) + (10.118684018226, 46.609850166512) + (10.123384524521, 46.609850166512) + (10.128085030816, 46.609850166512) + (10.132785537111, 46.609850166512) + (10.137486043407, 46.609850166512) + (10.142186549702, 46.609850166512) + (10.146887055997, 46.609850166512) + (10.151587562292, 46.609850166512) + (10.151587562292, 46.614550672808) + (10.156288068588, 46.614550672808) + (10.160988574883, 46.614550672808) + (10.165689081178, 46.614550672808) + (10.165689081178, 46.619251179103) + (10.170389587473, 46.619251179103) + (10.175090093768, 46.619251179103) + (10.175090093768, 46.623951685398) + (10.179790600064, 46.623951685398) + (10.184491106359, 46.623951685398) + (10.189191612654, 46.623951685398) + (10.193892118949, 46.623951685398) + (10.198592625244, 46.623951685398) + (10.20329313154, 46.623951685398) + (10.20329313154, 46.619251179103) + (10.207993637835, 46.619251179103) + (10.21269414413, 46.619251179103) + (10.217394650425, 46.619251179103) + (10.217394650425, 46.623951685398) + (10.222095156721, 46.623951685398) + (10.222095156721, 46.628652191693) + (10.226795663016, 46.628652191693) + (10.231496169311, 46.628652191693) + (10.231496169311, 46.633352697988) + (10.236196675606, 46.633352697988) + (10.240897181901, 46.633352697988) + (10.240897181901, 46.628652191693) + (10.240897181901, 46.623951685398) + (10.245597688197, 46.623951685398) + (10.245597688197, 46.619251179103) + (10.250298194492, 46.619251179103) + (10.250298194492, 46.614550672808) + (10.254998700787, 46.614550672808) + (10.254998700787, 46.609850166512) + (10.254998700787, 46.605149660217) + (10.254998700787, 46.600449153922) + (10.250298194492, 46.600449153922) + (10.245597688197, 46.600449153922) + (10.245597688197, 46.595748647627) + (10.245597688197, 46.591048141331) + (10.245597688197, 46.586347635036) + (10.245597688197, 46.581647128741) + (10.245597688197, 46.576946622446) + (10.245597688197, 46.572246116151) + (10.250298194492, 46.572246116151) + (10.254998700787, 46.572246116151) + (10.259699207082, 46.572246116151) + (10.259699207082, 46.576946622446) + (10.264399713378, 46.576946622446) + (10.269100219673, 46.576946622446) + (10.273800725968, 46.576946622446) + (10.273800725968, 46.572246116151) + (10.278501232263, 46.572246116151) + (10.283201738558, 46.572246116151) + (10.283201738558, 46.567545609855) + (10.287902244854, 46.567545609855) + (10.287902244854, 46.56284510356) + (10.292602751149, 46.56284510356) + (10.292602751149, 46.558144597265) + (10.297303257444, 46.558144597265) + (10.297303257444, 46.55344409097) + (10.297303257444, 46.548743584675) + (10.302003763739, 46.548743584675) + (10.306704270034, 46.548743584675) + (10.31140477633, 46.548743584675) + (10.316105282625, 46.548743584675) + (10.32080578892, 46.548743584675) + (10.325506295215, 46.548743584675) + (10.330206801511, 46.548743584675) + (10.334907307806, 46.548743584675) + (10.334907307806, 46.544043078379) + (10.339607814101, 46.544043078379) + (10.344308320396, 46.544043078379) + (10.344308320396, 46.548743584675) + (10.349008826691, 46.548743584675) + (10.349008826691, 46.55344409097) + (10.353709332987, 46.55344409097) + (10.358409839282, 46.55344409097) + (10.363110345577, 46.55344409097) + (10.367810851872, 46.55344409097) + (10.372511358167, 46.55344409097) + (10.377211864463, 46.55344409097) + (10.377211864463, 46.548743584675) + (10.381912370758, 46.548743584675) + (10.386612877053, 46.548743584675) + (10.391313383348, 46.548743584675) + (10.391313383348, 46.544043078379) + (10.396013889644, 46.544043078379) + (10.400714395939, 46.544043078379) + (10.405414902234, 46.544043078379) + (10.405414902234, 46.548743584675) + (10.410115408529, 46.548743584675) + (10.414815914824, 46.548743584675) + (10.41951642112, 46.548743584675) + (10.424216927415, 46.548743584675) + (10.424216927415, 46.544043078379) + (10.42891743371, 46.544043078379) + (10.42891743371, 46.539342572084) + (10.433617940005, 46.539342572084) + (10.4383184463, 46.539342572084) + (10.4383184463, 46.534642065789) + (10.443018952596, 46.534642065789) + (10.447719458891, 46.534642065789) + (10.452419965186, 46.534642065789) + (10.457120471481, 46.534642065789) + (10.461820977777, 46.534642065789) + (10.461820977777, 46.539342572084) + (10.461820977777, 46.544043078379) + (10.466521484072, 46.544043078379) + (10.471221990367, 46.544043078379) + (10.471221990367, 46.548743584675) + (10.471221990367, 46.55344409097) + (10.475922496662, 46.55344409097) + (10.475922496662, 46.558144597265) + (10.475922496662, 46.56284510356) + (10.475922496662, 46.567545609855) + (10.475922496662, 46.572246116151) + (10.480623002957, 46.572246116151) + (10.480623002957, 46.576946622446) + (10.485323509253, 46.576946622446) + (10.485323509253, 46.581647128741) + (10.485323509253, 46.586347635036) + (10.485323509253, 46.591048141331) + (10.485323509253, 46.595748647627) + (10.485323509253, 46.600449153922) + (10.485323509253, 46.605149660217) + (10.490024015548, 46.605149660217) + (10.490024015548, 46.609850166512) + (10.490024015548, 46.614550672808) + (10.485323509253, 46.614550672808) + (10.485323509253, 46.619251179103) + (10.480623002957, 46.619251179103) + (10.480623002957, 46.623951685398) + (10.475922496662, 46.623951685398) + (10.471221990367, 46.623951685398) + (10.471221990367, 46.628652191693) + (10.466521484072, 46.628652191693) + (10.461820977777, 46.628652191693) + (10.461820977777, 46.633352697988) + (10.457120471481, 46.633352697988) + (10.452419965186, 46.633352697988) + (10.452419965186, 46.638053204284) + (10.447719458891, 46.638053204284) + (10.443018952596, 46.638053204284) + (10.4383184463, 46.638053204284) + (10.433617940005, 46.638053204284) + (10.42891743371, 46.638053204284) + (10.424216927415, 46.638053204284) + (10.41951642112, 46.638053204284) + (10.414815914824, 46.638053204284) + (10.410115408529, 46.638053204284) + (10.405414902234, 46.638053204284) + (10.400714395939, 46.638053204284) + (10.400714395939, 46.642753710579) + (10.396013889644, 46.642753710579) + (10.396013889644, 46.647454216874) + (10.396013889644, 46.652154723169) + (10.391313383348, 46.652154723169) + (10.391313383348, 46.656855229464) + (10.391313383348, 46.66155573576) + (10.391313383348, 46.666256242055) + (10.391313383348, 46.67095674835) + (10.386612877053, 46.67095674835) + (10.386612877053, 46.675657254645) + (10.386612877053, 46.680357760941) + (10.381912370758, 46.680357760941) + (10.381912370758, 46.685058267236) + (10.386612877053, 46.685058267236) + (10.386612877053, 46.689758773531) + (10.391313383348, 46.689758773531) + (10.396013889644, 46.689758773531) + (10.396013889644, 46.694459279826) + (10.396013889644, 46.699159786121) + (10.400714395939, 46.699159786121) + (10.400714395939, 46.703860292417) + (10.405414902234, 46.703860292417) + (10.405414902234, 46.708560798712) + (10.410115408529, 46.708560798712) + (10.414815914824, 46.708560798712) + (10.414815914824, 46.713261305007) + (10.414815914824, 46.717961811302) + (10.414815914824, 46.722662317597) + (10.410115408529, 46.722662317597) + (10.410115408529, 46.727362823893) + (10.405414902234, 46.727362823893) + (10.405414902234, 46.732063330188) + (10.400714395939, 46.732063330188) + (10.400714395939, 46.736763836483) + (10.405414902234, 46.736763836483) + (10.405414902234, 46.741464342778) + (10.410115408529, 46.741464342778) + (10.414815914824, 46.741464342778) + (10.41951642112, 46.741464342778) + (10.41951642112, 46.746164849074) + (10.424216927415, 46.746164849074) + (10.424216927415, 46.750865355369) + (10.42891743371, 46.750865355369) + (10.433617940005, 46.750865355369) + (10.4383184463, 46.750865355369) + (10.4383184463, 46.755565861664) + (10.443018952596, 46.755565861664) + (10.443018952596, 46.760266367959) + (10.443018952596, 46.764966874254) + (10.443018952596, 46.76966738055) + (10.4383184463, 46.76966738055) + (10.4383184463, 46.774367886845) + (10.433617940005, 46.774367886845) + (10.433617940005, 46.77906839314) + (10.42891743371, 46.77906839314) + (10.42891743371, 46.783768899435) + (10.424216927415, 46.783768899435) + (10.424216927415, 46.78846940573) + (10.424216927415, 46.788469405731) + (10.424216927415, 46.793169912026) + (10.42891743371, 46.793169912026) + (10.42891743371, 46.797870418321) + (10.433617940005, 46.797870418321) + (10.4383184463, 46.797870418321) + (10.443018952596, 46.797870418321) + (10.447719458891, 46.797870418321) + (10.447719458891, 46.802570924616) + (10.447719458891, 46.807271430911) + (10.452419965186, 46.807271430911) + (10.452419965186, 46.811971937207) + (10.457120471481, 46.811971937207) + (10.457120471481, 46.816672443502) + (10.457120471481, 46.821372949797) + (10.457120471481, 46.826073456092) + (10.457120471481, 46.830773962387) + (10.461820977777, 46.830773962387) + (10.461820977777, 46.835474468683) + (10.466521484072, 46.835474468683) + (10.466521484072, 46.840174974978) + (10.466521484072, 46.844875481273) + (10.471221990367, 46.844875481273) + (10.471221990367, 46.849575987568) + (10.471221990367, 46.854276493864) + (10.471221990367, 46.858977000159) + (10.466521484072, 46.858977000159) + (10.466521484072, 46.863677506454) + (10.471221990367, 46.863677506454) + (10.471221990367, 46.868378012749) + (10.471221990367, 46.873078519044) + (10.471221990367, 46.87777902534) + (10.471221990367, 46.882479531635) + (10.466521484072, 46.882479531635) + (10.466521484072, 46.88718003793) + (10.471221990367, 46.88718003793) + (10.471221990367, 46.891880544225) + (10.475922496662, 46.891880544225) + (10.475922496662, 46.89658105052) + (10.475922496662, 46.901281556816) + (10.475922496662, 46.905982063111) + (10.480623002957, 46.905982063111) + (10.480623002957, 46.910682569406) + (10.485323509253, 46.910682569406) + (10.485323509253, 46.915383075701) + (10.485323509253, 46.920083581997) + (10.485323509253, 46.924784088292) + (10.490024015548, 46.924784088292) + (10.490024015548, 46.929484594587) + (10.485323509253, 46.929484594587) + (10.485323509253, 46.934185100882) + (10.490024015548, 46.934185100882) + (10.490024015548, 46.938885607177) + (10.485323509253, 46.938885607177) + (10.480623002957, 46.938885607177) + (10.475922496662, 46.938885607177) + (10.475922496662, 46.943586113473) + (10.471221990367, 46.943586113473) + (10.471221990367, 46.948286619768) + (10.466521484072, 46.948286619768) + (10.461820977777, 46.948286619768) + (10.457120471481, 46.948286619768) + (10.457120471481, 46.952987126063) + (10.452419965186, 46.952987126063) + (10.447719458891, 46.952987126063) + (10.443018952596, 46.952987126063) + (10.4383184463, 46.952987126063) + (10.4383184463, 46.957687632358) + (10.433617940005, 46.957687632358) + (10.42891743371, 46.957687632358) + (10.424216927415, 46.957687632358) + (10.424216927415, 46.962388138653) + (10.424216927415, 46.967088644949) + (10.424216927415, 46.971789151244) + (10.42891743371, 46.971789151244) + (10.42891743371, 46.976489657539) + (10.424216927415, 46.976489657539) + (10.424216927415, 46.981190163834) + (10.41951642112, 46.981190163834) + (10.414815914824, 46.981190163834) + (10.410115408529, 46.981190163834) + (10.410115408529, 46.98589067013) + (10.405414902234, 46.98589067013) + (10.405414902234, 46.990591176425) + (10.400714395939, 46.990591176425) + (10.400714395939, 46.99529168272) + (10.396013889644, 46.99529168272) + (10.396013889644, 46.999992189015) + (10.391313383348, 46.999992189015) + (10.386612877053, 46.999992189015) + (10.381912370758, 46.999992189015) + (10.381912370758, 46.99529168272) + (10.377211864463, 46.99529168272) + (10.377211864463, 46.990591176425) + (10.372511358167, 46.990591176425) + (10.367810851872, 46.990591176425) + (10.363110345577, 46.990591176425) + (10.358409839282, 46.990591176425) + (10.353709332987, 46.990591176425) + (10.349008826691, 46.990591176425) + (10.344308320396, 46.990591176425) + (10.344308320396, 46.98589067013) + (10.344308320396, 46.981190163834) + (10.339607814101, 46.981190163834) + (10.339607814101, 46.976489657539) + (10.334907307806, 46.976489657539) + (10.334907307806, 46.971789151244) + (10.334907307806, 46.967088644949) + (10.330206801511, 46.967088644949) + (10.330206801511, 46.962388138653) + (10.330206801511, 46.957687632358) + (10.330206801511, 46.952987126063) + (10.325506295215, 46.952987126063) + (10.32080578892, 46.952987126063) + (10.316105282625, 46.952987126063) + (10.31140477633, 46.952987126063) + (10.31140477633, 46.948286619768) + (10.306704270034, 46.948286619768) + (10.306704270034, 46.943586113473) + (10.306704270034, 46.938885607177) + (10.31140477633, 46.938885607177) + (10.31140477633, 46.934185100882) + (10.316105282625, 46.934185100882) + (10.316105282625, 46.929484594587) + (10.316105282625, 46.924784088292) + (10.31140477633, 46.924784088292) + (10.306704270034, 46.924784088292) + (10.302003763739, 46.924784088292) + (10.297303257444, 46.924784088292) + (10.297303257444, 46.920083581997) + (10.292602751149, 46.920083581997) + (10.292602751149, 46.924784088292) + (10.287902244854, 46.924784088292) + (10.283201738558, 46.924784088292) + (10.278501232263, 46.924784088292) + (10.273800725968, 46.924784088292) + (10.273800725968, 46.929484594587) + (10.269100219673, 46.929484594587) + (10.264399713378, 46.929484594587) + (10.259699207082, 46.929484594587) + (10.254998700787, 46.929484594587) + (10.250298194492, 46.929484594587) + (10.245597688197, 46.929484594587) + (10.240897181901, 46.929484594587) + (10.240897181901, 46.924784088292) + (10.240897181901, 46.920083581997) + (10.240897181901, 46.915383075701) + (10.236196675606, 46.915383075701) + (10.236196675606, 46.910682569406) + (10.236196675606, 46.905982063111) + (10.236196675606, 46.901281556816) + (10.231496169311, 46.901281556816) + (10.231496169311, 46.89658105052) + (10.226795663016, 46.89658105052) + (10.226795663016, 46.891880544225) + (10.226795663016, 46.88718003793) + (10.231496169311, 46.88718003793) + (10.236196675606, 46.88718003793) + (10.236196675606, 46.882479531635) + (10.236196675606, 46.87777902534) + (10.231496169311, 46.87777902534) + (10.231496169311, 46.873078519044) + (10.231496169311, 46.868378012749) + (10.226795663016, 46.868378012749) + (10.222095156721, 46.868378012749) + (10.217394650425, 46.868378012749) + (10.217394650425, 46.863677506454) + (10.21269414413, 46.863677506454) + (10.207993637835, 46.863677506454) + (10.20329313154, 46.863677506454) + (10.198592625244, 46.863677506454) + (10.198592625244, 46.868378012749) + (10.193892118949, 46.868378012749) + (10.193892118949, 46.863677506454) + (10.189191612654, 46.863677506454) + (10.189191612654, 46.858977000159) + (10.184491106359, 46.858977000159) + (10.184491106359, 46.854276493864) + (10.179790600064, 46.854276493864) + (10.175090093768, 46.854276493864) + (10.170389587473, 46.854276493864) + (10.170389587473, 46.849575987568) + (10.165689081178, 46.849575987568) + (10.160988574883, 46.849575987568) + (10.156288068588, 46.849575987568) + (10.151587562292, 46.849575987568) + (10.146887055997, 46.849575987568) + (10.142186549702, 46.849575987568) + (10.137486043407, 46.849575987568) + (10.132785537111, 46.849575987568) + (10.128085030816, 46.849575987568) + (10.123384524521, 46.849575987568) + (10.123384524521, 46.844875481273) + (10.118684018226, 46.844875481273) + (10.113983511931, 46.844875481273) + (10.113983511931, 46.840174974978) + (10.109283005635, 46.840174974978) + (10.10458249934, 46.840174974978) + (10.10458249934, 46.844875481273) + (10.099881993045, 46.844875481273) + (10.099881993045, 46.849575987568) + (10.09518148675, 46.849575987568) + (10.090480980455, 46.849575987568) + (10.090480980455, 46.854276493864) + (10.090480980455, 46.858977000159) + (10.085780474159, 46.858977000159) + (10.081079967864, 46.858977000159) + (10.076379461569, 46.858977000159) + (10.076379461569, 46.863677506454) + (10.071678955274, 46.863677506454) + (10.071678955274, 46.858977000159) + (10.066978448978, 46.858977000159) + (10.066978448978, 46.863677506454) + (10.062277942683, 46.863677506454) + (10.062277942683, 46.858977000159) + (10.057577436388, 46.858977000159) + (10.057577436388, 46.863677506454) + (10.052876930093, 46.863677506454) + (10.052876930093, 46.868378012749) + (10.052876930093, 46.873078519044) + (10.052876930093, 46.87777902534) + (10.048176423798, 46.87777902534) + (10.043475917502, 46.87777902534) + (10.043475917502, 46.882479531635) + (10.038775411207, 46.882479531635) + (10.038775411207, 46.88718003793) + (10.034074904912, 46.88718003793) + (10.029374398617, 46.88718003793) + (10.029374398617, 46.891880544225) + (10.029374398617, 46.89658105052) + (10.024673892322, 46.89658105052) + (10.019973386026, 46.89658105052) + (10.019973386026, 46.901281556816) + (10.015272879731, 46.901281556816) + (10.010572373436, 46.901281556816) + (10.005871867141, 46.901281556816) + (10.001171360845, 46.901281556816) + (9.99647085455, 46.901281556816) + (9.991770348255, 46.901281556816) + (9.98706984196, 46.901281556816) + (9.98706984196, 46.905982063111) + (9.982369335665, 46.905982063111) + (9.982369335665, 46.910682569406) + (9.982369335665, 46.915383075701) + (9.977668829369, 46.915383075701) + (9.972968323074, 46.915383075701) + (9.968267816779, 46.915383075701) + (9.968267816779, 46.910682569406) + (9.963567310484, 46.910682569406) + (9.963567310484, 46.915383075701) + (9.958866804189, 46.915383075701) + (9.954166297893, 46.915383075701) + (9.949465791598, 46.915383075701) + (9.949465791598, 46.910682569406) + (9.944765285303, 46.910682569406) + (9.944765285303, 46.915383075701) + (9.940064779008, 46.915383075701) + (9.935364272712, 46.915383075701) + (9.930663766417, 46.915383075701) + (9.925963260122, 46.915383075701) + (9.925963260122, 46.920083581997) + (9.921262753827, 46.920083581997) + (9.916562247532, 46.920083581997) + (9.916562247532, 46.924784088292) + (9.911861741236, 46.924784088292) + (9.907161234941, 46.924784088292) + (9.902460728646, 46.924784088292) + (9.902460728646, 46.929484594587) + (9.897760222351, 46.929484594587) + (9.893059716056, 46.929484594587) + (9.893059716056, 46.934185100882) + (9.88835920976, 46.934185100882) + (9.883658703465, 46.934185100882) + (9.87895819717, 46.934185100882) + (9.87895819717, 46.938885607177) + (9.87895819717, 46.943586113473) + (9.87895819717, 46.948286619768) + (9.874257690875, 46.948286619768) + (9.874257690875, 46.952987126063) + (9.87895819717, 46.952987126063) + (9.87895819717, 46.957687632358) + (9.874257690875, 46.957687632358) + (9.874257690875, 46.962388138653) + (9.874257690875, 46.967088644949) + (9.874257690875, 46.971789151244) + (9.874257690875, 46.976489657539) + (9.87895819717, 46.976489657539) + (9.883658703465, 46.976489657539) + (9.883658703465, 46.981190163834) + (9.883658703465, 46.98589067013) + (9.88835920976, 46.98589067013) + (9.893059716056, 46.98589067013) + (9.893059716056, 46.990591176425) + (9.88835920976, 46.990591176425) + (9.88835920976, 46.99529168272) + (9.88835920976, 46.999992189015) + (9.883658703465, 46.999992189015) + (9.883658703465, 47.00469269531) + (9.87895819717, 47.00469269531) + (9.874257690875, 47.00469269531) + (9.874257690875, 47.009393201606) + (9.869557184579, 47.009393201606) + (9.869557184579, 47.014093707901) + (9.874257690875, 47.014093707901) + (9.87895819717, 47.014093707901) + (9.87895819717, 47.018794214196) + (9.874257690875, 47.018794214196) + (9.874257690875, 47.023494720491) + (9.869557184579, 47.023494720491) + (9.864856678284, 47.023494720491) + (9.860156171989, 47.023494720491) + (9.860156171989, 47.018794214196) + (9.855455665694, 47.018794214196) + (9.850755159399, 47.018794214196) + (9.850755159399, 47.014093707901) + (9.846054653103, 47.014093707901) + (9.841354146808, 47.014093707901) + (9.836653640513, 47.014093707901) + (9.831953134218, 47.014093707901) + (9.827252627922, 47.014093707901) + (9.827252627922, 47.018794214196) + (9.822552121627, 47.018794214196) + (9.817851615332, 47.018794214196) + (9.817851615332, 47.023494720491) + (9.813151109037, 47.023494720491) + (9.808450602742, 47.023494720491) + (9.803750096446, 47.023494720491) + (9.803750096446, 47.028195226786) + (9.799049590151, 47.028195226786) + (9.794349083856, 47.028195226786) + (9.794349083856, 47.032895733082) + (9.789648577561, 47.032895733082) + (9.789648577561, 47.037596239377) + (9.784948071266, 47.037596239377) + (9.78024756497, 47.037596239377) + (9.775547058675, 47.037596239377) + (9.77084655238, 47.037596239377) + (9.766146046085, 47.037596239377) + (9.761445539789, 47.037596239377) + (9.756745033494, 47.037596239377) + (9.752044527199, 47.037596239377) + (9.747344020904, 47.037596239377) + (9.747344020904, 47.042296745672) + (9.742643514609, 47.042296745672) + (9.737943008313, 47.042296745672) + (9.733242502018, 47.042296745672) + (9.728541995723, 47.042296745672) + (9.723841489428, 47.042296745672) + (9.719140983133, 47.042296745672) + (9.719140983133, 47.046997251967) + (9.714440476837, 47.046997251967) + (9.709739970542, 47.046997251967) + (9.705039464247, 47.046997251967) + (9.705039464247, 47.051697758263) + (9.700338957952, 47.051697758263) + (9.695638451656, 47.051697758263) + (9.690937945361, 47.051697758263) + (9.690937945361, 47.056398264558) + (9.686237439066, 47.056398264558) + (9.681536932771, 47.056398264558) + (9.681536932771, 47.061098770853) + (9.676836426476, 47.061098770853) + (9.67213592018, 47.061098770853) + (9.667435413885, 47.061098770853) + (9.66273490759, 47.061098770853) + (9.66273490759, 47.056398264558) + (9.658034401295, 47.056398264558) + (9.653333895, 47.056398264558) + (9.653333895, 47.061098770853) + (9.648633388704, 47.061098770853) + (9.643932882409, 47.061098770853) + (9.643932882409, 47.056398264558) + (9.639232376114, 47.056398264558) + (9.639232376114, 47.051697758263) + (9.634531869819, 47.051697758263) + (9.629831363523, 47.051697758263) + (9.625130857228, 47.051697758263) + (9.620430350933, 47.051697758263) + (9.615729844638, 47.051697758263) + (9.615729844638, 47.056398264558) + (9.611029338343, 47.056398264558) + (9.611029338343, 47.061098770853) + (9.606328832047, 47.061098770853) + (9.601628325752, 47.061098770853) + (9.596927819457, 47.061098770853) + (9.596927819457, 47.056398264558) + (9.592227313162, 47.056398264558) + (9.587526806867, 47.056398264558) + (9.582826300571, 47.056398264558) + (9.582826300571, 47.051697758263) + (9.578125794276, 47.051697758263) + (9.573425287981, 47.051697758263) + (9.568724781686, 47.051697758263) + (9.56402427539, 47.051697758263) + (9.559323769095, 47.051697758263) + (9.559323769095, 47.046997251967) + (9.5546232628, 47.046997251967) + (9.5546232628, 47.051697758263) + (9.5546232628, 47.056398264558) + (9.549922756505, 47.056398264558) + (9.549922756505, 47.061098770853) + (9.54522225021, 47.061098770853) + (9.54522225021, 47.065799277148) + (9.540521743914, 47.065799277148) + (9.535821237619, 47.065799277148) + (9.531120731324, 47.065799277148) + (9.531120731324, 47.061098770853) + (9.526420225029, 47.061098770853) + (9.521719718733, 47.061098770853) + (9.517019212438, 47.061098770853) + (9.517019212438, 47.056398264558) + (9.512318706143, 47.056398264558) + (9.507618199848, 47.056398264558) + (9.502917693553, 47.056398264558) + (9.498217187257, 47.056398264558) + (9.493516680962, 47.056398264558) + (9.488816174667, 47.056398264558) + (9.488816174667, 47.051697758263) + (9.484115668372, 47.051697758263) + (9.484115668372, 47.056398264558) + (9.479415162077, 47.056398264558) + (9.474714655781, 47.056398264558) + (9.474714655781, 47.061098770853) + (9.474714655781, 47.065799277148) + (9.479415162077, 47.065799277148) + (9.479415162077, 47.070499783443) + (9.484115668372, 47.070499783443) + (9.488816174667, 47.070499783443) + (9.488816174667, 47.075200289739) + (9.493516680962, 47.075200289739) + (9.498217187257, 47.075200289739) + (9.498217187257, 47.079900796034) + (9.502917693553, 47.079900796034) + (9.507618199848, 47.079900796034) + (9.507618199848, 47.084601302329) + (9.512318706143, 47.084601302329) + (9.517019212438, 47.084601302329) + (9.517019212438, 47.089301808624) + (9.517019212438, 47.094002314919) + (9.517019212438, 47.09400231492) + (9.517019212438, 47.098702821215) + (9.521719718733, 47.098702821215) + (9.521719718733, 47.10340332751) + (9.521719718733, 47.108103833805) + (9.517019212438, 47.108103833805) + (9.517019212438, 47.1128043401) + (9.517019212438, 47.117504846396) + (9.517019212438, 47.122205352691) + (9.512318706143, 47.122205352691) + (9.512318706143, 47.126905858986) + (9.512318706143, 47.131606365281) + (9.512318706143, 47.136306871576) + (9.507618199848, 47.136306871576) + (9.507618199848, 47.141007377872) + (9.507618199848, 47.145707884167) + (9.502917693553, 47.145707884167) + (9.502917693553, 47.150408390462) + (9.498217187257, 47.150408390462) + (9.498217187257, 47.155108896757) + (9.493516680962, 47.155108896757) + (9.493516680962, 47.159809403053) + (9.493516680962, 47.164509909348) + (9.488816174667, 47.164509909348) + (9.488816174667, 47.169210415643) + (9.488816174667, 47.173910921938) + (9.488816174667, 47.178611428233) + (9.484115668372, 47.178611428233) + (9.484115668372, 47.183311934529) + (9.488816174667, 47.183311934529) + (9.488816174667, 47.188012440824) + (9.488816174667, 47.192712947119) + (9.488816174667, 47.197413453414) + (9.493516680962, 47.197413453414) + (9.493516680962, 47.202113959709) + (9.493516680962, 47.206814466005) + (9.498217187257, 47.206814466005) + (9.498217187257, 47.2115149723) + (9.498217187257, 47.216215478595) + (9.502917693553, 47.216215478595) + (9.502917693553, 47.22091598489) + (9.502917693553, 47.225616491186) + (9.507618199848, 47.225616491186) + (9.507618199848, 47.230316997481) + (9.512318706143, 47.230316997481) + (9.512318706143, 47.235017503776) + (9.517019212438, 47.235017503776) + (9.517019212438, 47.239718010071) + (9.517019212438, 47.244418516366) + (9.521719718733, 47.244418516366) + (9.521719718733, 47.249119022662) + (9.521719718733, 47.253819528957) + (9.526420225029, 47.253819528957) + (9.526420225029, 47.258520035252) + (9.526420225029, 47.263220541547) + (9.531120731324, 47.263220541547) + (9.531120731324, 47.267921047842) + (9.531120731324, 47.272621554138) + (9.535821237619, 47.272621554138) + (9.535821237619, 47.277322060433) + (9.540521743914, 47.277322060433) + (9.54522225021, 47.277322060433) + (9.54522225021, 47.282022566728) + (9.549922756505, 47.282022566728) + (9.549922756505, 47.286723073023) + (9.5546232628, 47.286723073023) + (9.5546232628, 47.291423579319) + (9.5546232628, 47.296124085614) + (9.5546232628, 47.300824591909) + (9.559323769095, 47.300824591909) + (9.56402427539, 47.300824591909) + (9.56402427539, 47.305525098204) + (9.568724781686, 47.305525098204) + (9.573425287981, 47.305525098204) + (9.573425287981, 47.310225604499) + (9.578125794276, 47.310225604499) + (9.582826300571, 47.310225604499) + (9.582826300571, 47.314926110795) + (9.587526806867, 47.314926110795) + (9.587526806867, 47.31962661709) + (9.592227313162, 47.31962661709) + (9.592227313162, 47.324327123385) + (9.592227313162, 47.32902762968) + (9.592227313162, 47.333728135975) + (9.596927819457, 47.333728135975) + (9.596927819457, 47.338428642271) + (9.596927819457, 47.343129148566) + (9.601628325752, 47.343129148566) + (9.601628325752, 47.347829654861) + (9.606328832047, 47.347829654861) + (9.606328832047, 47.352530161156) + (9.611029338343, 47.352530161156) + (9.611029338343, 47.357230667452) + (9.615729844638, 47.357230667452) + (9.615729844638, 47.361931173747) + (9.620430350933, 47.361931173747) + (9.620430350933, 47.366631680042) + (9.625130857228, 47.366631680042) + (9.629831363523, 47.366631680042) + (9.634531869819, 47.366631680042) + (9.639232376114, 47.366631680042) + (9.643932882409, 47.366631680042) + (9.648633388704, 47.366631680042) + (9.653333895, 47.366631680042) + (9.658034401295, 47.366631680042) + (9.658034401295, 47.371332186337) + (9.66273490759, 47.371332186337) + (9.667435413885, 47.371332186337) + (9.667435413885, 47.376032692632) + (9.67213592018, 47.376032692632) + (9.67213592018, 47.380733198928) + (9.67213592018, 47.385433705223) + (9.67213592018, 47.390134211518) + (9.67213592018, 47.394834717813) + (9.667435413885, 47.394834717813) + (9.66273490759, 47.394834717813) + (9.66273490759, 47.399535224108) + (9.658034401295, 47.399535224108) + (9.658034401295, 47.404235730404) + (9.653333895, 47.404235730404) + (9.653333895, 47.408936236699) + (9.653333895, 47.413636742994) + (9.653333895, 47.418337249289) + (9.648633388704, 47.418337249289) + (9.648633388704, 47.423037755585) + (9.648633388704, 47.42773826188) + (9.643932882409, 47.42773826188) + (9.643932882409, 47.432438768175) + (9.643932882409, 47.43713927447) + (9.648633388704, 47.43713927447) + (9.648633388704, 47.441839780765) + (9.653333895, 47.441839780765) + (9.653333895, 47.446540287061) + (9.658034401295, 47.446540287061) + (9.658034401295, 47.451240793356) + (9.658034401295, 47.455941299651) + (9.653333895, 47.455941299651) + (9.648633388704, 47.455941299651) + (9.643932882409, 47.455941299651) + (9.639232376114, 47.455941299651) + (9.634531869819, 47.455941299651) + (9.629831363523, 47.455941299651) + (9.625130857228, 47.455941299651) + (9.620430350933, 47.455941299651) + (9.620430350933, 47.460641805946) + (9.615729844638, 47.460641805946) + (9.615729844638, 47.465342312242) + (9.611029338343, 47.465342312242) + (9.611029338343, 47.470042818537) + (9.606328832047, 47.470042818537) + (9.606328832047, 47.465342312242) + (9.606328832047, 47.460641805946) + (9.601628325752, 47.460641805946) + (9.596927819457, 47.460641805946) + (9.596927819457, 47.465342312242) + (9.592227313162, 47.465342312242) + (9.592227313162, 47.470042818537) + (9.587526806867, 47.470042818537) + (9.587526806867, 47.474743324832) + (9.587526806867, 47.479443831127) + (9.582826300571, 47.479443831127) + (9.582826300571, 47.484144337422) + (9.578125794276, 47.484144337422) + (9.578125794276, 47.488844843718) + (9.573425287981, 47.488844843718) + (9.568724781686, 47.488844843718) + (9.568724781686, 47.493545350013) + (9.56402427539, 47.493545350013) + (9.56402427539, 47.498245856308) + (9.559323769095, 47.498245856308) + (9.559323769095, 47.502946362603) + (9.559323769095, 47.507646868898) + (9.559323769095, 47.512347375194) + (9.559323769095, 47.517047881489) + (9.5546232628, 47.517047881489) + (9.5546232628, 47.521748387784) + (9.5546232628, 47.526448894079) + (9.5546232628, 47.531149400375) + (9.549922756505, 47.531149400375) + (9.549922756505, 47.53584990667) + (9.54522225021, 47.53584990667) + (9.540521743914, 47.53584990667) + (9.535821237619, 47.53584990667) + (9.531120731324, 47.53584990667) + (9.526420225029, 47.53584990667) + (9.521719718733, 47.53584990667) + (9.517019212438, 47.53584990667) + (9.512318706143, 47.53584990667) + (9.512318706143, 47.540550412965) + (9.507618199848, 47.540550412965) + (9.507618199848, 47.54525091926) + (9.502917693553, 47.54525091926) + (9.502917693553, 47.549951425555) + (9.498217187257, 47.549951425555) + (9.498217187257, 47.554651931851) + (9.493516680962, 47.554651931851) + (9.493516680962, 47.559352438146) + (9.488816174667, 47.559352438146) + (9.484115668372, 47.559352438146) + (9.484115668372, 47.564052944441) + (9.479415162077, 47.564052944441) + (9.479415162077, 47.568753450736) + (9.474714655781, 47.568753450736) + (9.474714655781, 47.573453957031) + (9.470014149486, 47.573453957031) + (9.470014149486, 47.578154463327) + (9.465313643191, 47.578154463327) + (9.465313643191, 47.582854969622) + (9.460613136896, 47.582854969622) + (9.460613136896, 47.587555475917) + (9.4559126306, 47.587555475917) + (9.451212124305, 47.587555475917) + (9.451212124305, 47.592255982212) + (9.44651161801, 47.592255982212) + (9.44651161801, 47.596956488508) + (9.441811111715, 47.596956488508) + (9.43711060542, 47.596956488508) + (9.432410099124, 47.596956488508) + (9.432410099124, 47.601656994803) + (9.427709592829, 47.601656994803) + (9.423009086534, 47.601656994803) + (9.418308580239, 47.601656994803) + (9.418308580239, 47.606357501098) + (9.413608073944, 47.606357501098) + (9.408907567648, 47.606357501098) + (9.404207061353, 47.606357501098) + (9.404207061353, 47.611058007393) + (9.399506555058, 47.611058007393) + (9.394806048763, 47.611058007393) + (9.390105542467, 47.611058007393) + (9.390105542467, 47.615758513688) + (9.385405036172, 47.615758513688) + (9.380704529877, 47.615758513688) + (9.376004023582, 47.615758513688) + (9.376004023582, 47.620459019984) + (9.371303517287, 47.620459019984) + (9.366603010991, 47.620459019984) + (9.366603010991, 47.625159526279) + (9.361902504696, 47.625159526279) + (9.357201998401, 47.625159526279) + (9.352501492106, 47.625159526279) + (9.352501492106, 47.629860032574) + (9.347800985811, 47.629860032574) + (9.343100479515, 47.629860032574) + (9.33839997322, 47.629860032574) + (9.33839997322, 47.634560538869) + (9.333699466925, 47.634560538869) + (9.32899896063, 47.634560538869) + (9.324298454334, 47.634560538869) + (9.324298454334, 47.639261045164) + (9.319597948039, 47.639261045164) + (9.314897441744, 47.639261045164) + (9.310196935449, 47.639261045164) + (9.310196935449, 47.64396155146) + (9.305496429154, 47.64396155146) + (9.300795922858, 47.64396155146) + (9.296095416563, 47.64396155146) + (9.296095416563, 47.648662057755) + (9.291394910268, 47.648662057755) + (9.286694403973, 47.648662057755) + (9.281993897678, 47.648662057755) + (9.281993897678, 47.65336256405) + (9.277293391382, 47.65336256405) + (9.272592885087, 47.65336256405) + (9.267892378792, 47.65336256405) + (9.267892378792, 47.658063070345) + (9.263191872497, 47.658063070345) + (9.258491366201, 47.658063070345) + (9.253790859906, 47.658063070345) + (9.249090353611, 47.658063070345) + (9.244389847316, 47.658063070345) + (9.239689341021, 47.658063070345) + (9.234988834725, 47.658063070345) + (9.23028832843, 47.658063070345) + (9.225587822135, 47.658063070345) + (9.22088731584, 47.658063070345) + (9.216186809544, 47.658063070345) + (9.211486303249, 47.658063070345) + (9.206785796954, 47.658063070345) + (9.206785796954, 47.65336256405) + (9.202085290659, 47.65336256405) + (9.202085290659, 47.658063070345) + (9.197384784364, 47.658063070345) + (9.192684278068, 47.658063070345) + (9.187983771773, 47.658063070345) + (9.183283265478, 47.658063070345) + (9.178582759183, 47.658063070345) + (9.178582759183, 47.65336256405) + (9.173882252888, 47.65336256405) + (9.169181746592, 47.65336256405) + (9.169181746592, 47.658063070345) + (9.164481240297, 47.658063070345) + (9.164481240297, 47.662763576641) + (9.159780734002, 47.662763576641) + (9.159780734002, 47.667464082936) + (9.155080227707, 47.667464082936) + (9.150379721411, 47.667464082936) + (9.145679215116, 47.667464082936) + (9.145679215116, 47.662763576641) + (9.140978708821, 47.662763576641) + (9.136278202526, 47.662763576641) + (9.136278202526, 47.667464082936) + (9.131577696231, 47.667464082936) + (9.126877189935, 47.667464082936) + (9.12217668364, 47.667464082936) + (9.117476177345, 47.667464082936) + (9.117476177345, 47.672164589231) + (9.11277567105, 47.672164589231) + (9.108075164755, 47.672164589231) + (9.108075164755, 47.676865095526) + (9.103374658459, 47.676865095526) + (9.098674152164, 47.676865095526) + (9.093973645869, 47.676865095526) + (9.089273139574, 47.676865095526) + (9.089273139574, 47.681565601821) + (9.084572633278, 47.681565601821) + (9.084572633278, 47.676865095526) + (9.079872126983, 47.676865095526) + (9.075171620688, 47.676865095526) + (9.075171620688, 47.681565601821) + (9.070471114393, 47.681565601821) + (9.065770608098, 47.681565601821) + (9.061070101802, 47.681565601821) + (9.056369595507, 47.681565601821) + (9.056369595507, 47.686266108117) + (9.051669089212, 47.686266108117) + (9.046968582917, 47.686266108117) + (9.042268076622, 47.686266108117) + (9.037567570326, 47.686266108117) + (9.032867064031, 47.686266108117) + (9.028166557736, 47.686266108117) + (9.023466051441, 47.686266108117) + (9.018765545145, 47.686266108117) + (9.01406503885, 47.686266108117) + (9.009364532555, 47.686266108117) + (9.009364532555, 47.681565601821) + (9.00466402626, 47.681565601821) + (8.999963519965, 47.681565601821) + (8.995263013669, 47.681565601821) + (8.995263013669, 47.676865095526) + (8.990562507374, 47.676865095526) + (8.985862001079, 47.676865095526) + (8.981161494784, 47.676865095526) + (8.981161494784, 47.672164589231) + (8.976460988489, 47.672164589231) + (8.971760482193, 47.672164589231) + (8.971760482193, 47.667464082936) + (8.967059975898, 47.667464082936) + (8.962359469603, 47.667464082936) + (8.962359469603, 47.662763576641) + (8.957658963308, 47.662763576641) + (8.952958457012, 47.662763576641) + (8.952958457012, 47.658063070345) + (8.948257950717, 47.658063070345) + (8.943557444422, 47.658063070345) + (8.938856938127, 47.658063070345) + (8.934156431832, 47.658063070345) + (8.929455925536, 47.658063070345) + (8.929455925536, 47.65336256405) + (8.924755419241, 47.65336256405) + (8.920054912946, 47.65336256405) + (8.915354406651, 47.65336256405) + (8.910653900356, 47.65336256405) + (8.910653900356, 47.648662057755) + (8.90595339406, 47.648662057755) + (8.901252887765, 47.648662057755) + (8.89655238147, 47.648662057755) + (8.891851875175, 47.648662057755) + (8.887151368879, 47.648662057755) + (8.887151368879, 47.65336256405) + (8.882450862584, 47.65336256405) + (8.877750356289, 47.65336256405) + (8.873049849994, 47.65336256405) + (8.873049849994, 47.658063070345) + (8.873049849994, 47.662763576641) + (8.873049849994, 47.667464082936) + (8.873049849994, 47.672164589231) + (8.868349343699, 47.672164589231) + (8.868349343699, 47.676865095526) + (8.863648837403, 47.676865095526) + (8.863648837403, 47.681565601821) + (8.858948331108, 47.681565601821) + (8.854247824813, 47.681565601821) + (8.849547318518, 47.681565601821) + (8.849547318518, 47.686266108117) + (8.854247824813, 47.686266108117) + (8.854247824813, 47.690966614412) + (8.858948331108, 47.690966614412) + (8.858948331108, 47.695667120707) + (8.863648837403, 47.695667120707) + (8.868349343699, 47.695667120707) + (8.873049849994, 47.695667120707) + (8.873049849994, 47.700367627002) + (8.873049849994, 47.705068133297) + (8.868349343699, 47.705068133297) + (8.863648837403, 47.705068133297) + (8.858948331108, 47.705068133297) + (8.854247824813, 47.705068133297) + (8.849547318518, 47.705068133297) + (8.844846812222, 47.705068133297) + (8.844846812222, 47.709768639593) + (8.844846812222, 47.714469145888) + (8.840146305927, 47.714469145888) + (8.835445799632, 47.714469145888) + (8.830745293337, 47.714469145888) + (8.830745293337, 47.709768639593) + (8.826044787042, 47.709768639593) + (8.821344280746, 47.709768639593) + (8.821344280746, 47.714469145888) + (8.826044787042, 47.714469145888) + (8.826044787042, 47.719169652183) + (8.821344280746, 47.719169652183) + (8.816643774451, 47.719169652183) + (8.816643774451, 47.723870158478) + (8.811943268156, 47.723870158478) + (8.807242761861, 47.723870158478) + (8.807242761861, 47.728570664774) + (8.811943268156, 47.728570664774) + (8.811943268156, 47.733271171069) + (8.807242761861, 47.733271171069) + (8.807242761861, 47.737971677364) + (8.802542255566, 47.737971677364) + (8.79784174927, 47.737971677364) + (8.79784174927, 47.733271171069) + (8.79784174927, 47.728570664774) + (8.793141242975, 47.728570664774) + (8.78844073668, 47.728570664774) + (8.783740230385, 47.728570664774) + (8.783740230385, 47.723870158478) + (8.779039724089, 47.723870158478) + (8.774339217794, 47.723870158478) + (8.774339217794, 47.719169652183) + (8.769638711499, 47.719169652183) + (8.769638711499, 47.714469145888) + (8.769638711499, 47.709768639593) + (8.769638711499, 47.705068133297) + (8.774339217794, 47.705068133297) + (8.779039724089, 47.705068133297) + (8.783740230385, 47.705068133297) + (8.78844073668, 47.705068133297) + (8.793141242975, 47.705068133297) + (8.79784174927, 47.705068133297) + (8.79784174927, 47.700367627002) + (8.79784174927, 47.695667120707) + (8.802542255566, 47.695667120707) + (8.807242761861, 47.695667120707) + (8.811943268156, 47.695667120707) + (8.811943268156, 47.690966614412) + (8.807242761861, 47.690966614412) + (8.802542255566, 47.690966614412) + (8.79784174927, 47.690966614412) + (8.79784174927, 47.686266108117) + (8.793141242975, 47.686266108117) + (8.793141242975, 47.681565601821) + (8.793141242975, 47.676865095526) + (8.78844073668, 47.676865095526) + (8.783740230385, 47.676865095526) + (8.779039724089, 47.676865095526) + (8.779039724089, 47.681565601821) + (8.774339217794, 47.681565601821) + (8.769638711499, 47.681565601821) + (8.769638711499, 47.686266108117) + (8.764938205204, 47.686266108117) + (8.760237698909, 47.686266108117) + (8.760237698909, 47.690966614412) + (8.755537192613, 47.690966614412) + (8.750836686318, 47.690966614412) + (8.746136180023, 47.690966614412) + (8.741435673728, 47.690966614412) + (8.736735167433, 47.690966614412) + (8.732034661137, 47.690966614412) + (8.727334154842, 47.690966614412) + (8.727334154842, 47.695667120707) + (8.727334154842, 47.700367627002) + (8.727334154842, 47.705068133297) + (8.732034661137, 47.705068133297) + (8.732034661137, 47.709768639593) + (8.732034661137, 47.714469145888) + (8.736735167433, 47.714469145888) + (8.736735167433, 47.719169652183) + (8.732034661137, 47.719169652183) + (8.727334154842, 47.719169652183) + (8.722633648547, 47.719169652183) + (8.722633648547, 47.723870158478) + (8.717933142252, 47.723870158478) + (8.713232635956, 47.723870158478) + (8.713232635956, 47.728570664774) + (8.713232635956, 47.733271171069) + (8.713232635956, 47.737971677364) + (8.717933142252, 47.737971677364) + (8.717933142252, 47.742672183659) + (8.722633648547, 47.742672183659) + (8.722633648547, 47.747372689954) + (8.727334154842, 47.747372689954) + (8.732034661137, 47.747372689954) + (8.736735167433, 47.747372689954) + (8.741435673728, 47.747372689954) + (8.741435673728, 47.75207319625) + (8.736735167433, 47.75207319625) + (8.736735167433, 47.756773702545) + (8.732034661137, 47.756773702545) + (8.732034661137, 47.76147420884) + (8.727334154842, 47.76147420884) + (8.722633648547, 47.76147420884) + (8.717933142252, 47.76147420884) + (8.717933142252, 47.766174715135) + (8.713232635956, 47.766174715135) + (8.708532129661, 47.766174715135) + (8.708532129661, 47.76147420884) + (8.703831623366, 47.76147420884) + (8.699131117071, 47.76147420884) + (8.699131117071, 47.756773702545) + (8.694430610776, 47.756773702545) + (8.68973010448, 47.756773702545) + (8.68973010448, 47.76147420884) + (8.685029598185, 47.76147420884) + (8.685029598185, 47.766174715135) + (8.685029598185, 47.77087522143) + (8.68973010448, 47.77087522143) + (8.68973010448, 47.775575727726) + (8.685029598185, 47.775575727726) + (8.685029598185, 47.780276234021) + (8.68032909189, 47.780276234021) + (8.68032909189, 47.784976740316) + (8.675628585595, 47.784976740316) + (8.6709280793, 47.784976740316) + (8.6709280793, 47.789677246611) + (8.666227573004, 47.789677246611) + (8.661527066709, 47.789677246611) + (8.656826560414, 47.789677246611) + (8.656826560414, 47.794377752907) + (8.661527066709, 47.794377752907) + (8.661527066709, 47.799078259202) + (8.656826560414, 47.799078259202) + (8.652126054119, 47.799078259202) + (8.647425547823, 47.799078259202) + (8.647425547823, 47.794377752907) + (8.647425547823, 47.789677246611) + (8.647425547823, 47.784976740316) + (8.647425547823, 47.780276234021) + (8.647425547823, 47.775575727726) + (8.652126054119, 47.775575727726) + (8.652126054119, 47.77087522143) + (8.647425547823, 47.77087522143) + (8.647425547823, 47.766174715135) + (8.642725041528, 47.766174715135) + (8.638024535233, 47.766174715135) + (8.638024535233, 47.76147420884) + (8.633324028938, 47.76147420884) + (8.628623522643, 47.76147420884) + (8.623923016347, 47.76147420884) + (8.623923016347, 47.766174715135) + (8.619222510052, 47.766174715135) + (8.619222510052, 47.77087522143) + (8.619222510052, 47.775575727726) + (8.623923016347, 47.775575727726) + (8.623923016347, 47.780276234021) + (8.619222510052, 47.780276234021) + (8.614522003757, 47.780276234021) + (8.614522003757, 47.784976740316) + (8.619222510052, 47.784976740316) + (8.619222510052, 47.789677246611) + (8.619222510052, 47.794377752907) + (8.619222510052, 47.799078259202) + (8.614522003757, 47.799078259202) + (8.609821497462, 47.799078259202) + (8.609821497462, 47.803778765497) + (8.605120991167, 47.803778765497) + (8.600420484871, 47.803778765497) + (8.595719978576, 47.803778765497) + (8.595719978576, 47.799078259202) + (8.591019472281, 47.799078259202) + (8.591019472281, 47.803778765497) + (8.586318965986, 47.803778765497) + (8.58161845969, 47.803778765497) + (8.58161845969, 47.799078259202) + (8.576917953395, 47.799078259202) + (8.5722174471, 47.799078259202) + (8.5722174471, 47.803778765497) + (8.5722174471, 47.808479271792) + (8.567516940805, 47.808479271792) + (8.567516940805, 47.803778765497) + (8.56281643451, 47.803778765497) + (8.56281643451, 47.799078259202) + (8.56281643451, 47.794377752907) + (8.567516940805, 47.794377752907) + (8.567516940805, 47.789677246611) + (8.5722174471, 47.789677246611) + (8.5722174471, 47.784976740316) + (8.576917953395, 47.784976740316) + (8.576917953395, 47.780276234021) + (8.5722174471, 47.780276234021) + (8.567516940805, 47.780276234021) + (8.56281643451, 47.780276234021) + (8.558115928214, 47.780276234021) + (8.558115928214, 47.784976740316) + (8.553415421919, 47.784976740316) + (8.548714915624, 47.784976740316) + (8.548714915624, 47.780276234021) + (8.544014409329, 47.780276234021) + (8.539313903033, 47.780276234021) + (8.534613396738, 47.780276234021) + (8.529912890443, 47.780276234021) + (8.529912890443, 47.775575727726) + (8.525212384148, 47.775575727726) + (8.520511877853, 47.775575727726) + (8.520511877853, 47.77087522143) + (8.515811371557, 47.77087522143) + (8.515811371557, 47.775575727726) + (8.511110865262, 47.775575727726) + (8.506410358967, 47.775575727726) + (8.501709852672, 47.775575727726) + (8.501709852672, 47.77087522143) + (8.497009346377, 47.77087522143) + (8.492308840081, 47.77087522143) + (8.487608333786, 47.77087522143) + (8.482907827491, 47.77087522143) + (8.482907827491, 47.766174715135) + (8.478207321196, 47.766174715135) + (8.4735068149, 47.766174715135) + (8.4735068149, 47.76147420884) + (8.468806308605, 47.76147420884) + (8.468806308605, 47.756773702545) + (8.468806308605, 47.75207319625) + (8.46410580231, 47.75207319625) + (8.459405296015, 47.75207319625) + (8.459405296015, 47.747372689954) + (8.45470478972, 47.747372689954) + (8.45470478972, 47.742672183659) + (8.45470478972, 47.737971677364) + (8.450004283424, 47.737971677364) + (8.450004283424, 47.733271171069) + (8.450004283424, 47.728570664774) + (8.45470478972, 47.728570664774) + (8.45470478972, 47.723870158478) + (8.450004283424, 47.723870158478) + (8.445303777129, 47.723870158478) + (8.440603270834, 47.723870158478) + (8.440603270834, 47.719169652183) + (8.435902764539, 47.719169652183) + (8.435902764539, 47.714469145888) + (8.431202258244, 47.714469145888) + (8.431202258244, 47.709768639593) + (8.426501751948, 47.709768639593) + (8.421801245653, 47.709768639593) + (8.417100739358, 47.709768639593) + (8.412400233063, 47.709768639593) + (8.412400233063, 47.705068133297) + (8.412400233063, 47.700367627002) + (8.407699726767, 47.700367627002) + (8.402999220472, 47.700367627002) + (8.402999220472, 47.695667120707) + (8.407699726767, 47.695667120707) + (8.412400233063, 47.695667120707) + (8.412400233063, 47.690966614412) + (8.417100739358, 47.690966614412) + (8.417100739358, 47.686266108117) + (8.421801245653, 47.686266108117) + (8.421801245653, 47.681565601821) + (8.417100739358, 47.681565601821) + (8.412400233063, 47.681565601821) + (8.412400233063, 47.676865095526) + (8.407699726767, 47.676865095526) + (8.407699726767, 47.672164589231) + (8.407699726767, 47.667464082936) + (8.412400233063, 47.667464082936) + (8.417100739358, 47.667464082936) + (8.421801245653, 47.667464082936) + (8.426501751948, 47.667464082936) + (8.426501751948, 47.662763576641) + (8.431202258244, 47.662763576641) + (8.431202258244, 47.658063070345) + (8.435902764539, 47.658063070345) + (8.440603270834, 47.658063070345) + (8.440603270834, 47.65336256405) + (8.445303777129, 47.65336256405) + (8.450004283424, 47.65336256405) + (8.45470478972, 47.65336256405) + (8.459405296015, 47.65336256405) + (8.46410580231, 47.65336256405) + (8.46410580231, 47.648662057755) + (8.46410580231, 47.64396155146) + (8.468806308605, 47.64396155146) + (8.468806308605, 47.639261045164) + (8.4735068149, 47.639261045164) + (8.478207321196, 47.639261045164) + (8.478207321196, 47.64396155146) + (8.478207321196, 47.648662057755) + (8.482907827491, 47.648662057755) + (8.482907827491, 47.64396155146) + (8.487608333786, 47.64396155146) + (8.492308840081, 47.64396155146) + (8.497009346377, 47.64396155146) + (8.497009346377, 47.648662057755) + (8.501709852672, 47.648662057755) + (8.506410358967, 47.648662057755) + (8.511110865262, 47.648662057755) + (8.515811371557, 47.648662057755) + (8.520511877853, 47.648662057755) + (8.520511877853, 47.64396155146) + (8.525212384148, 47.64396155146) + (8.529912890443, 47.64396155146) + (8.529912890443, 47.648662057755) + (8.529912890443, 47.65336256405) + (8.529912890443, 47.658063070345) + (8.525212384148, 47.658063070345) + (8.525212384148, 47.662763576641) + (8.529912890443, 47.662763576641) + (8.534613396738, 47.662763576641) + (8.534613396738, 47.658063070345) + (8.539313903033, 47.658063070345) + (8.539313903033, 47.662763576641) + (8.539313903033, 47.667464082936) + (8.544014409329, 47.667464082936) + (8.548714915624, 47.667464082936) + (8.553415421919, 47.667464082936) + (8.558115928214, 47.667464082936) + (8.56281643451, 47.667464082936) + (8.567516940805, 47.667464082936) + (8.567516940805, 47.662763576641) + (8.5722174471, 47.662763576641) + (8.576917953395, 47.662763576641) + (8.58161845969, 47.662763576641) + (8.586318965986, 47.662763576641) + (8.586318965986, 47.667464082936) + (8.591019472281, 47.667464082936) + (8.595719978576, 47.667464082936) + (8.595719978576, 47.672164589231) + (8.600420484871, 47.672164589231) + (8.605120991167, 47.672164589231) + (8.605120991167, 47.667464082936) + (8.609821497462, 47.667464082936) + (8.609821497462, 47.662763576641) + (8.614522003757, 47.662763576641) + (8.619222510052, 47.662763576641) + (8.619222510052, 47.658063070345) + (8.623923016347, 47.658063070345) + (8.628623522643, 47.658063070345) + (8.628623522643, 47.65336256405) + (8.628623522643, 47.648662057755) + (8.628623522643, 47.64396155146) + (8.623923016347, 47.64396155146) + (8.623923016347, 47.639261045164) + (8.619222510052, 47.639261045164) + (8.614522003757, 47.639261045164) + (8.609821497462, 47.639261045164) + (8.605120991167, 47.639261045164) + (8.605120991167, 47.64396155146) + (8.609821497462, 47.64396155146) + (8.614522003757, 47.64396155146) + (8.614522003757, 47.648662057755) + (8.609821497462, 47.648662057755) + (8.609821497462, 47.65336256405) + (8.605120991167, 47.65336256405) + (8.600420484871, 47.65336256405) + (8.600420484871, 47.648662057755) + (8.600420484871, 47.64396155146) + (8.595719978576, 47.64396155146) + (8.595719978576, 47.639261045164) + (8.595719978576, 47.634560538869) + (8.595719978576, 47.629860032574) + (8.600420484871, 47.629860032574) + (8.600420484871, 47.625159526279) + (8.600420484871, 47.620459019984) + (8.605120991167, 47.620459019984) + (8.605120991167, 47.615758513688) + (8.605120991167, 47.611058007393) + (8.600420484871, 47.611058007393) + (8.600420484871, 47.606357501098) + (8.595719978576, 47.606357501098) + (8.591019472281, 47.606357501098) + (8.591019472281, 47.601656994803) + (8.586318965986, 47.601656994803) + (8.586318965986, 47.596956488508) + (8.58161845969, 47.596956488508) + (8.576917953395, 47.596956488508) + (8.5722174471, 47.596956488508) + (8.567516940805, 47.596956488508) + (8.56281643451, 47.596956488508) + (8.56281643451, 47.601656994803) + (8.56281643451, 47.606357501098) + (8.567516940805, 47.606357501098) + (8.567516940805, 47.611058007393) + (8.5722174471, 47.611058007393) + (8.5722174471, 47.615758513688) + (8.567516940805, 47.615758513688) + (8.567516940805, 47.620459019984) + (8.56281643451, 47.620459019984) + (8.558115928214, 47.620459019984) + (8.558115928214, 47.625159526279) + (8.553415421919, 47.625159526279) + (8.548714915624, 47.625159526279) + (8.544014409329, 47.625159526279) + (8.544014409329, 47.629860032574) + (8.539313903033, 47.629860032574) + (8.534613396738, 47.629860032574) + (8.534613396738, 47.634560538869) + (8.529912890443, 47.634560538869) + (8.525212384148, 47.634560538869) + (8.520511877853, 47.634560538869) + (8.515811371557, 47.634560538869) + (8.515811371557, 47.629860032574) + (8.515811371557, 47.625159526279) + (8.511110865262, 47.625159526279) + (8.511110865262, 47.620459019984) + (8.506410358967, 47.620459019984) + (8.506410358967, 47.615758513688) + (8.501709852672, 47.615758513688) + (8.497009346377, 47.615758513688) + (8.492308840081, 47.615758513688) + (8.487608333786, 47.615758513688) + (8.482907827491, 47.615758513688) + (8.482907827491, 47.611058007393) + (8.478207321196, 47.611058007393) + (8.4735068149, 47.611058007393) + (8.4735068149, 47.606357501098) + (8.468806308605, 47.606357501098) + (8.468806308605, 47.601656994803) + (8.46410580231, 47.601656994803) + (8.459405296015, 47.601656994803) + (8.459405296015, 47.596956488508) + (8.459405296015, 47.592255982212) + (8.459405296015, 47.587555475917) + (8.46410580231, 47.587555475917) + (8.46410580231, 47.582854969622) + (8.468806308605, 47.582854969622) + (8.4735068149, 47.582854969622) + (8.478207321196, 47.582854969622) + (8.478207321196, 47.587555475917) + (8.482907827491, 47.587555475917) + (8.487608333786, 47.587555475917) + (8.492308840081, 47.587555475917) + (8.492308840081, 47.582854969622) + (8.492308840081, 47.578154463327) + (8.487608333786, 47.578154463327) + (8.482907827491, 47.578154463327) + (8.478207321196, 47.578154463327) + (8.478207321196, 47.573453957031) + (8.4735068149, 47.573453957031) + (8.468806308605, 47.573453957031) + (8.46410580231, 47.573453957031) + (8.459405296015, 47.573453957031) + (8.45470478972, 47.573453957031) + (8.45470478972, 47.568753450736) + (8.450004283424, 47.568753450736) + (8.445303777129, 47.568753450736) + (8.440603270834, 47.568753450736) + (8.440603270834, 47.564052944441) + (8.435902764539, 47.564052944441) + (8.431202258244, 47.564052944441) + (8.426501751948, 47.564052944441) + (8.426501751948, 47.568753450736) + (8.421801245653, 47.568753450736) + (8.417100739358, 47.568753450736) + (8.412400233063, 47.568753450736) + (8.412400233063, 47.573453957031) + (8.407699726767, 47.573453957031) + (8.402999220472, 47.573453957031) + (8.402999220472, 47.578154463327) + (8.398298714177, 47.578154463327) + (8.398298714177, 47.573453957031) + (8.393598207882, 47.573453957031) + (8.388897701587, 47.573453957031) + (8.388897701587, 47.568753450736) + (8.384197195291, 47.568753450736) + (8.384197195291, 47.564052944441) + (8.379496688996, 47.564052944441) + (8.379496688996, 47.568753450736) + (8.374796182701, 47.568753450736) + (8.370095676406, 47.568753450736) + (8.365395170111, 47.568753450736) + (8.360694663815, 47.568753450736) + (8.35599415752, 47.568753450736) + (8.351293651225, 47.568753450736) + (8.34659314493, 47.568753450736) + (8.341892638634, 47.568753450736) + (8.337192132339, 47.568753450736) + (8.332491626044, 47.568753450736) + (8.327791119749, 47.568753450736) + (8.327791119749, 47.573453957031) + (8.323090613454, 47.573453957031) + (8.318390107158, 47.573453957031) + (8.318390107158, 47.578154463327) + (8.313689600863, 47.578154463327) + (8.313689600863, 47.582854969622) + (8.308989094568, 47.582854969622) + (8.304288588273, 47.582854969622) + (8.304288588273, 47.587555475917) + (8.299588081978, 47.587555475917) + (8.294887575682, 47.587555475917) + (8.294887575682, 47.592255982212) + (8.294887575682, 47.596956488508) + (8.294887575682, 47.601656994803) + (8.294887575682, 47.606357501098) + (8.294887575682, 47.611058007393) + (8.290187069387, 47.611058007393) + (8.285486563092, 47.611058007393) + (8.280786056797, 47.611058007393) + (8.276085550501, 47.611058007393) + (8.271385044206, 47.611058007393) + (8.266684537911, 47.611058007393) + (8.261984031616, 47.611058007393) + (8.261984031616, 47.615758513688) + (8.257283525321, 47.615758513688) + (8.252583019025, 47.615758513688) + (8.24788251273, 47.615758513688) + (8.24788251273, 47.611058007393) + (8.243182006435, 47.611058007393) + (8.23848150014, 47.611058007393) + (8.233780993844, 47.611058007393) + (8.233780993844, 47.606357501098) + (8.229080487549, 47.606357501098) + (8.224379981254, 47.606357501098) + (8.224379981254, 47.611058007393) + (8.219679474959, 47.611058007393) + (8.219679474959, 47.615758513688) + (8.214978968664, 47.615758513688) + (8.214978968664, 47.620459019984) + (8.210278462368, 47.620459019984) + (8.205577956073, 47.620459019984) + (8.200877449778, 47.620459019984) + (8.196176943483, 47.620459019984) + (8.196176943483, 47.615758513688) + (8.191476437188, 47.615758513688) + (8.191476437188, 47.611058007393) + (8.186775930892, 47.611058007393) + (8.186775930892, 47.606357501098) + (8.182075424597, 47.606357501098) + (8.182075424597, 47.601656994803) + (8.177374918302, 47.601656994803) + (8.172674412007, 47.601656994803) + (8.172674412007, 47.596956488508) + (8.167973905711, 47.596956488508) + (8.167973905711, 47.592255982212) + (8.163273399416, 47.592255982212) + (8.158572893121, 47.592255982212) + (8.158572893121, 47.596956488508) + (8.153872386826, 47.596956488508) + (8.149171880531, 47.596956488508) + (8.144471374235, 47.596956488508) + (8.144471374235, 47.592255982212) + (8.13977086794, 47.592255982212) + (8.13977086794, 47.587555475917) + (8.135070361645, 47.587555475917) + (8.135070361645, 47.582854969622) + (8.13036985535, 47.582854969622) + (8.125669349055, 47.582854969622) + (8.120968842759, 47.582854969622) + (8.116268336464, 47.582854969622) + (8.111567830169, 47.582854969622) + (8.106867323874, 47.582854969622) + (8.106867323874, 47.578154463327) + (8.102166817578, 47.578154463327) + (8.102166817578, 47.573453957031) + (8.102166817578, 47.568753450736) + (8.102166817578, 47.564052944441) + (8.097466311283, 47.564052944441) + (8.097466311283, 47.559352438146) + (8.092765804988, 47.559352438146) + (8.088065298693, 47.559352438146) + (8.083364792398, 47.559352438146) + (8.078664286102, 47.559352438146) + (8.078664286102, 47.564052944441) + (8.073963779807, 47.564052944441) + (8.069263273512, 47.564052944441) + (8.064562767217, 47.564052944441) + (8.059862260922, 47.564052944441) + (8.055161754626, 47.564052944441) + (8.055161754626, 47.559352438146) + (8.050461248331, 47.559352438146) + (8.050461248331, 47.554651931851) + (8.045760742036, 47.554651931851) + (8.041060235741, 47.554651931851) + (8.036359729445, 47.554651931851) + (8.03165922315, 47.554651931851) + (8.03165922315, 47.549951425555) + (8.026958716855, 47.549951425555) + (8.02225821056, 47.549951425555) + (8.017557704265, 47.549951425555) + (8.012857197969, 47.549951425555) + (8.008156691674, 47.549951425555) + (8.008156691674, 47.554651931851) + (8.003456185379, 47.554651931851) + (7.998755679084, 47.554651931851) + (7.994055172789, 47.554651931851) + (7.989354666493, 47.554651931851) + (7.984654160198, 47.554651931851) + (7.979953653903, 47.554651931851) + (7.975253147608, 47.554651931851) + (7.970552641312, 47.554651931851) + (7.965852135017, 47.554651931851) + (7.965852135017, 47.559352438146) + (7.961151628722, 47.559352438146) + (7.961151628722, 47.554651931851) + (7.956451122427, 47.554651931851) + (7.951750616132, 47.554651931851) + (7.951750616132, 47.549951425555) + (7.951750616132, 47.54525091926) + (7.947050109836, 47.54525091926) + (7.942349603541, 47.54525091926) + (7.937649097246, 47.54525091926) + (7.932948590951, 47.54525091926) + (7.928248084656, 47.54525091926) + (7.92354757836, 47.54525091926) + (7.918847072065, 47.54525091926) + (7.918847072065, 47.549951425555) + (7.91414656577, 47.549951425555) + (7.909446059475, 47.549951425555) + (7.909446059475, 47.554651931851) + (7.909446059475, 47.559352438146) + (7.909446059475, 47.564052944441) + (7.909446059475, 47.568753450736) + (7.909446059475, 47.573453957031) + (7.904745553179, 47.573453957031) + (7.904745553179, 47.578154463327) + (7.900045046884, 47.578154463327) + (7.900045046884, 47.582854969622) + (7.895344540589, 47.582854969622) + (7.895344540589, 47.587555475917) + (7.890644034294, 47.587555475917) + (7.885943527999, 47.587555475917) + (7.881243021703, 47.587555475917) + (7.881243021703, 47.592255982212) + (7.876542515408, 47.592255982212) + (7.876542515408, 47.587555475917) + (7.871842009113, 47.587555475917) + (7.867141502818, 47.587555475917) + (7.862440996522, 47.587555475917) + (7.857740490227, 47.587555475917) + (7.857740490227, 47.582854969622) + (7.853039983932, 47.582854969622) + (7.848339477637, 47.582854969622) + (7.843638971342, 47.582854969622) + (7.838938465046, 47.582854969622) + (7.834237958751, 47.582854969622) + (7.834237958751, 47.587555475917) + (7.829537452456, 47.587555475917) + (7.824836946161, 47.587555475917) + (7.820136439866, 47.587555475917) + (7.81543593357, 47.587555475917) + (7.81543593357, 47.582854969622) + (7.81543593357, 47.578154463327) + (7.81543593357, 47.573453957031) + (7.810735427275, 47.573453957031) + (7.810735427275, 47.568753450736) + (7.80603492098, 47.568753450736) + (7.801334414685, 47.568753450736) + (7.801334414685, 47.564052944441) + (7.801334414685, 47.559352438146) + (7.796633908389, 47.559352438146) + (7.791933402094, 47.559352438146) + (7.791933402094, 47.554651931851) + (7.787232895799, 47.554651931851) + (7.782532389504, 47.554651931851) + (7.777831883209, 47.554651931851) + (7.777831883209, 47.549951425555) + (7.773131376913, 47.549951425555) + (7.768430870618, 47.549951425555) + (7.763730364323, 47.549951425555) + (7.759029858028, 47.549951425555) + (7.754329351733, 47.549951425555) + (7.754329351733, 47.54525091926) + (7.749628845437, 47.54525091926) + (7.744928339142, 47.54525091926) + (7.740227832847, 47.54525091926) + (7.735527326552, 47.54525091926) + (7.730826820256, 47.54525091926) + (7.726126313961, 47.54525091926) + (7.721425807666, 47.54525091926) + (7.721425807666, 47.540550412965) + (7.716725301371, 47.540550412965) + (7.712024795076, 47.540550412965) + (7.70732428878, 47.540550412965) + (7.70732428878, 47.53584990667) + (7.702623782485, 47.53584990667) + (7.69792327619, 47.53584990667) + (7.69792327619, 47.531149400375) + (7.693222769895, 47.531149400375) + (7.6885222636, 47.531149400375) + (7.683821757304, 47.531149400375) + (7.679121251009, 47.531149400375) + (7.674420744714, 47.531149400375) + (7.674420744714, 47.53584990667) + (7.669720238419, 47.53584990667) + (7.665019732123, 47.53584990667) + (7.665019732123, 47.540550412965) + (7.660319225828, 47.540550412965) + (7.660319225828, 47.54525091926) + (7.655618719533, 47.54525091926) + (7.650918213238, 47.54525091926) + (7.650918213238, 47.549951425555) + (7.646217706943, 47.549951425555) + (7.646217706943, 47.554651931851) + (7.641517200647, 47.554651931851) + (7.641517200647, 47.559352438146) + (7.636816694352, 47.559352438146) + (7.636816694352, 47.564052944441) + (7.641517200647, 47.564052944441) + (7.646217706943, 47.564052944441) + (7.650918213238, 47.564052944441) + (7.655618719533, 47.564052944441) + (7.660319225828, 47.564052944441) + (7.665019732123, 47.564052944441) + (7.669720238419, 47.564052944441) + (7.674420744714, 47.564052944441) + (7.679121251009, 47.564052944441) + (7.679121251009, 47.568753450736) + (7.683821757304, 47.568753450736) + (7.6885222636, 47.568753450736) + (7.6885222636, 47.573453957031) + (7.683821757304, 47.573453957031) + (7.683821757304, 47.578154463327) + (7.683821757304, 47.582854969622) + (7.679121251009, 47.582854969622) + (7.674420744714, 47.582854969622) + (7.674420744714, 47.587555475917) + (7.674420744714, 47.592255982212) + (7.669720238419, 47.592255982212) + (7.665019732123, 47.592255982212) + (7.660319225828, 47.592255982212) + (7.660319225828, 47.596956488508) + (7.655618719533, 47.596956488508) + (7.650918213238, 47.596956488508) + (7.646217706943, 47.596956488508) + (7.646217706943, 47.592255982212) + (7.641517200647, 47.592255982212) + (7.641517200647, 47.587555475917) + (7.636816694352, 47.587555475917) + (7.632116188057, 47.587555475917) + (7.632116188057, 47.582854969622) + (7.627415681762, 47.582854969622) + (7.627415681762, 47.578154463327) + (7.622715175467, 47.578154463327) + (7.618014669171, 47.578154463327) + (7.613314162876, 47.578154463327) + (7.608613656581, 47.578154463327) + (7.603913150286, 47.578154463327) + (7.603913150286, 47.582854969622) + (7.603913150286, 47.587555475917) + (7.59921264399, 47.587555475917) + (7.594512137695, 47.587555475917) + (7.5898116314, 47.587555475917) + (7.585111125105, 47.587555475917) + (7.585111125105, 47.582854969622) + (7.585111125105, 47.578154463327) + (7.58041061881, 47.578154463327) + (7.575710112514, 47.578154463327) + (7.571009606219, 47.578154463327) + (7.566309099924, 47.578154463327) + (7.561608593629, 47.578154463327) + (7.561608593629, 47.573453957031) + (7.556908087333, 47.573453957031) + (7.556908087333, 47.568753450736) + (7.556908087333, 47.564052944441) + (7.552207581038, 47.564052944441) + (7.547507074743, 47.564052944441) + (7.547507074743, 47.559352438146) + (7.542806568448, 47.559352438146) + (7.538106062153, 47.559352438146) + (7.538106062153, 47.554651931851) + (7.533405555857, 47.554651931851) + (7.528705049562, 47.554651931851) + (7.528705049562, 47.549951425555) + (7.524004543267, 47.549951425555) + (7.519304036972, 47.549951425555) + (7.514603530677, 47.549951425555) + (7.514603530677, 47.54525091926) + (7.509903024381, 47.54525091926) + (7.505202518086, 47.54525091926) + (7.505202518086, 47.540550412965) + (7.500502011791, 47.540550412965) + (7.500502011791, 47.53584990667) + (7.500502011791, 47.531149400375) + (7.505202518086, 47.531149400375) + (7.505202518086, 47.526448894079) + (7.509903024381, 47.526448894079) + (7.509903024381, 47.531149400375) + (7.514603530677, 47.531149400375) + (7.519304036972, 47.531149400375) + (7.524004543267, 47.531149400375) + (7.528705049562, 47.531149400375) + (7.528705049562, 47.526448894079) + (7.528705049562, 47.521748387784) + (7.524004543267, 47.521748387784) + (7.524004543267, 47.517047881489) + (7.519304036972, 47.517047881489) + (7.514603530677, 47.517047881489) + (7.509903024381, 47.517047881489) + (7.505202518086, 47.517047881489) + (7.500502011791, 47.517047881489) + (7.500502011791, 47.512347375194) + (7.505202518086, 47.512347375194) + (7.505202518086, 47.507646868898) + (7.509903024381, 47.507646868898) + (7.509903024381, 47.502946362603) + (7.509903024381, 47.498245856308) + (7.509903024381, 47.493545350013) + (7.505202518086, 47.493545350013) + (7.500502011791, 47.493545350013) + (7.500502011791, 47.488844843718) + (7.495801505496, 47.488844843718) + (7.495801505496, 47.484144337422) + (7.4911009992, 47.484144337422) + (7.486400492905, 47.484144337422) + (7.48169998661, 47.484144337422) + (7.48169998661, 47.479443831127) + (7.476999480315, 47.479443831127) + (7.47229897402, 47.479443831127) + (7.47229897402, 47.484144337422) + (7.467598467724, 47.484144337422) + (7.462897961429, 47.484144337422) + (7.462897961429, 47.488844843718) + (7.458197455134, 47.488844843718) + (7.453496948839, 47.488844843718) + (7.453496948839, 47.493545350013) + (7.448796442544, 47.493545350013) + (7.444095936248, 47.493545350013) + (7.439395429953, 47.493545350013) + (7.439395429953, 47.498245856308) + (7.434694923658, 47.498245856308) + (7.429994417363, 47.498245856308) + (7.429994417363, 47.493545350013) + (7.429994417363, 47.488844843718) + (7.425293911067, 47.488844843718) + (7.425293911067, 47.484144337422) + (7.420593404772, 47.484144337422) + (7.420593404772, 47.479443831127) + (7.425293911067, 47.479443831127) + (7.429994417363, 47.479443831127) + (7.434694923658, 47.479443831127) + (7.439395429953, 47.479443831127) + (7.444095936248, 47.479443831127) + (7.448796442544, 47.479443831127) + (7.448796442544, 47.474743324832) + (7.453496948839, 47.474743324832) + (7.453496948839, 47.470042818537) + (7.453496948839, 47.465342312242) + (7.448796442544, 47.465342312242) + (7.448796442544, 47.460641805946) + (7.444095936248, 47.460641805946) + (7.439395429953, 47.460641805946) + (7.434694923658, 47.460641805946) + (7.429994417363, 47.460641805946) + (7.429994417363, 47.455941299651) + (7.429994417363, 47.451240793356) + (7.425293911067, 47.451240793356) + (7.425293911067, 47.446540287061) + (7.420593404772, 47.446540287061) + (7.415892898477, 47.446540287061) + (7.415892898477, 47.441839780765) + (7.411192392182, 47.441839780765) + (7.406491885887, 47.441839780765) + (7.406491885887, 47.43713927447) + (7.401791379591, 47.43713927447) + (7.397090873296, 47.43713927447) + (7.392390367001, 47.43713927447) + (7.392390367001, 47.432438768175) + (7.387689860706, 47.432438768175) + (7.382989354411, 47.432438768175) + (7.378288848115, 47.432438768175) + (7.37358834182, 47.432438768175) + (7.368887835525, 47.432438768175) + (7.36418732923, 47.432438768175) + (7.359486822934, 47.432438768175) + (7.354786316639, 47.432438768175) + (7.350085810344, 47.432438768175) + (7.350085810344, 47.43713927447) + (7.345385304049, 47.43713927447) + (7.340684797754, 47.43713927447) + (7.335984291458, 47.43713927447) + (7.331283785163, 47.43713927447) + (7.326583278868, 47.43713927447) + (7.321882772573, 47.43713927447) + (7.317182266278, 47.43713927447) + (7.312481759982, 47.43713927447) + (7.312481759982, 47.441839780765) + (7.307781253687, 47.441839780765) + (7.307781253687, 47.43713927447) + (7.303080747392, 47.43713927447) + (7.298380241097, 47.43713927447) + (7.298380241097, 47.432438768175) + (7.293679734801, 47.432438768175) + (7.288979228506, 47.432438768175) + (7.284278722211, 47.432438768175) + (7.279578215916, 47.432438768175) + (7.274877709621, 47.432438768175) + (7.270177203325, 47.432438768175) + (7.270177203325, 47.42773826188) + (7.26547669703, 47.42773826188) + (7.260776190735, 47.42773826188) + (7.260776190735, 47.423037755585) + (7.25607568444, 47.423037755585) + (7.251375178144, 47.423037755585) + (7.246674671849, 47.423037755585) + (7.241974165554, 47.423037755585) + (7.241974165554, 47.42773826188) + (7.241974165554, 47.432438768175) + (7.237273659259, 47.432438768175) + (7.237273659259, 47.43713927447) + (7.232573152964, 47.43713927447) + (7.227872646668, 47.43713927447) + (7.227872646668, 47.441839780765) + (7.223172140373, 47.441839780765) + (7.223172140373, 47.43713927447) + (7.218471634078, 47.43713927447) + (7.213771127783, 47.43713927447) + (7.209070621488, 47.43713927447) + (7.209070621488, 47.432438768175) + (7.204370115192, 47.432438768175) + (7.199669608897, 47.432438768175) + (7.199669608897, 47.43713927447) + (7.194969102602, 47.43713927447) + (7.190268596307, 47.43713927447) + (7.190268596307, 47.441839780765) + (7.185568090011, 47.441839780765) + (7.180867583716, 47.441839780765) + (7.176167077421, 47.441839780765) + (7.171466571126, 47.441839780765) + (7.171466571126, 47.446540287061) + (7.176167077421, 47.446540287061) + (7.176167077421, 47.451240793356) + (7.176167077421, 47.455941299651) + (7.176167077421, 47.460641805946) + (7.176167077421, 47.465342312242) + (7.176167077421, 47.470042818537) + (7.180867583716, 47.470042818537) + (7.180867583716, 47.474743324832) + (7.180867583716, 47.479443831127) + (7.185568090011, 47.479443831127) + (7.185568090011, 47.484144337422) + (7.190268596307, 47.484144337422) + (7.190268596307, 47.488844843718) + (7.194969102602, 47.488844843718) + (7.199669608897, 47.488844843718) + (7.199669608897, 47.493545350013) + (7.194969102602, 47.493545350013) + (7.190268596307, 47.493545350013) + (7.185568090011, 47.493545350013) + (7.180867583716, 47.493545350013) + (7.180867583716, 47.488844843718) + (7.176167077421, 47.488844843718) + (7.171466571126, 47.488844843718) + (7.166766064831, 47.488844843718) + (7.162065558535, 47.488844843718) + (7.162065558535, 47.493545350013) + (7.15736505224, 47.493545350013) + (7.15736505224, 47.498245856308) + (7.152664545945, 47.498245856308) + (7.14796403965, 47.498245856308) + (7.143263533355, 47.498245856308) + (7.143263533355, 47.502946362603) + (7.138563027059, 47.502946362603) + (7.133862520764, 47.502946362603) + (7.129162014469, 47.502946362603) + (7.124461508174, 47.502946362603) + (7.124461508174, 47.498245856308) + (7.119761001878, 47.498245856308) + (7.119761001878, 47.493545350013) + (7.115060495583, 47.493545350013) + (7.110359989288, 47.493545350013) + (7.105659482993, 47.493545350013) + (7.100958976698, 47.493545350013) + (7.096258470402, 47.493545350013) + (7.091557964107, 47.493545350013) + (7.091557964107, 47.488844843718) + (7.086857457812, 47.488844843718) + (7.082156951517, 47.488844843718) + (7.077456445222, 47.488844843718) + (7.072755938926, 47.488844843718) + (7.068055432631, 47.488844843718) + (7.068055432631, 47.493545350013) + (7.063354926336, 47.493545350013) + (7.058654420041, 47.493545350013) + (7.053953913745, 47.493545350013) + (7.04925340745, 47.493545350013) + (7.044552901155, 47.493545350013) + (7.044552901155, 47.498245856308) + (7.03985239486, 47.498245856308) + (7.035151888565, 47.498245856308) + (7.030451382269, 47.498245856308) + (7.030451382269, 47.502946362603) + (7.025750875974, 47.502946362603) + (7.021050369679, 47.502946362603) + (7.016349863384, 47.502946362603) + (7.011649357089, 47.502946362603) + (7.006948850793, 47.502946362603) + (7.002248344498, 47.502946362603) + (7.002248344498, 47.498245856308) + (6.997547838203, 47.498245856308) + (6.992847331908, 47.498245856308) + (6.992847331908, 47.493545350013) + (6.988146825612, 47.493545350013) + (6.988146825612, 47.488844843718) + (6.988146825612, 47.484144337422) + (6.988146825612, 47.479443831127) + (6.988146825612, 47.474743324832) + (6.992847331908, 47.474743324832) + (6.992847331908, 47.470042818537) + (6.992847331908, 47.465342312242) + (6.997547838203, 47.465342312242) + (6.997547838203, 47.470042818537) + (7.002248344498, 47.470042818537) + (7.002248344498, 47.465342312242) + (7.002248344498, 47.460641805946) + (6.997547838203, 47.460641805946) + (6.997547838203, 47.455941299651) + (7.002248344498, 47.455941299651) + (7.002248344498, 47.451240793356) + (6.997547838203, 47.451240793356) + (6.992847331908, 47.451240793356) + (6.988146825612, 47.451240793356) + (6.983446319317, 47.451240793356) + (6.983446319317, 47.446540287061) + (6.978745813022, 47.446540287061) + (6.974045306727, 47.446540287061) + (6.969344800432, 47.446540287061) + (6.969344800432, 47.441839780765) + (6.969344800432, 47.43713927447) + (6.964644294136, 47.43713927447) + (6.959943787841, 47.43713927447) + (6.959943787841, 47.432438768175) + (6.955243281546, 47.432438768175) + (6.955243281546, 47.43713927447) + (6.950542775251, 47.43713927447) + (6.945842268956, 47.43713927447) + (6.945842268956, 47.432438768175) + (6.94114176266, 47.432438768175) + (6.94114176266, 47.42773826188) + (6.94114176266, 47.423037755585) + (6.94114176266, 47.418337249289) + (6.94114176266, 47.413636742994) + (6.94114176266, 47.408936236699) + (6.94114176266, 47.404235730404) + (6.936441256365, 47.404235730404) + (6.93174075007, 47.404235730404) + (6.927040243775, 47.404235730404) + (6.922339737479, 47.404235730404) + (6.917639231184, 47.404235730404) + (6.917639231184, 47.399535224108) + (6.912938724889, 47.399535224108) + (6.912938724889, 47.394834717813) + (6.912938724889, 47.390134211518) + (6.912938724889, 47.385433705223) + (6.908238218594, 47.385433705223) + (6.903537712299, 47.385433705223) + (6.898837206003, 47.385433705223) + (6.898837206003, 47.380733198928) + (6.894136699708, 47.380733198928) + (6.889436193413, 47.380733198928) + (6.889436193413, 47.376032692632) + (6.884735687118, 47.376032692632) + (6.884735687118, 47.371332186337) + (6.884735687118, 47.366631680042) + (6.884735687118, 47.361931173747) + (6.880035180822, 47.361931173747) + (6.880035180822, 47.357230667452) + (6.880035180822, 47.352530161156) + (6.884735687118, 47.352530161156) + (6.889436193413, 47.352530161156) + (6.889436193413, 47.357230667452) + (6.894136699708, 47.357230667452) + (6.898837206003, 47.357230667452) + (6.903537712299, 47.357230667452) + (6.908238218594, 47.357230667452) + (6.912938724889, 47.357230667452) + (6.917639231184, 47.357230667452) + (6.922339737479, 47.357230667452) + (6.927040243775, 47.357230667452) + (6.93174075007, 47.357230667452) + (6.936441256365, 47.357230667452) + (6.94114176266, 47.357230667452) + (6.945842268956, 47.357230667452) + (6.950542775251, 47.357230667452) + (6.955243281546, 47.357230667452) + (6.959943787841, 47.357230667452) + (6.964644294136, 47.357230667452) + (6.964644294136, 47.361931173747) + (6.969344800432, 47.361931173747) + (6.974045306727, 47.361931173747) + (6.978745813022, 47.361931173747) + (6.983446319317, 47.361931173747) + (6.988146825612, 47.361931173747) + (6.992847331908, 47.361931173747) + (6.997547838203, 47.361931173747) + (6.997547838203, 47.366631680042) + (7.002248344498, 47.366631680042) + (7.006948850793, 47.366631680042) + (7.011649357089, 47.366631680042) + (7.011649357089, 47.371332186337) + (7.016349863384, 47.371332186337) + (7.021050369679, 47.371332186337) + (7.025750875974, 47.371332186337) + (7.030451382269, 47.371332186337) + (7.035151888565, 47.371332186337) + (7.035151888565, 47.366631680042) + (7.035151888565, 47.361931173747) + (7.03985239486, 47.361931173747) + (7.044552901155, 47.361931173747) + (7.04925340745, 47.361931173747) + (7.04925340745, 47.357230667452) + (7.04925340745, 47.352530161156) + (7.04925340745, 47.347829654861) + (7.053953913745, 47.347829654861) + (7.058654420041, 47.347829654861) + (7.058654420041, 47.343129148566) + (7.058654420041, 47.338428642271) + (7.053953913745, 47.338428642271) + (7.053953913745, 47.333728135975) + (7.04925340745, 47.333728135975) + (7.04925340745, 47.32902762968) + (7.044552901155, 47.32902762968) + (7.03985239486, 47.32902762968) + (7.035151888565, 47.32902762968) + (7.030451382269, 47.32902762968) + (7.025750875974, 47.32902762968) + (7.025750875974, 47.324327123385) + (7.021050369679, 47.324327123385) + (7.016349863384, 47.324327123385) + (7.011649357089, 47.324327123385) + (7.006948850793, 47.324327123385) + (7.006948850793, 47.31962661709) + (7.011649357089, 47.31962661709) + (7.016349863384, 47.31962661709) + (7.016349863384, 47.314926110795) + (7.016349863384, 47.310225604499) + (7.011649357089, 47.310225604499) + (7.011649357089, 47.305525098204) + (7.006948850793, 47.305525098204) + (7.006948850793, 47.300824591909) + (7.002248344498, 47.300824591909) + (6.997547838203, 47.300824591909) + (6.997547838203, 47.296124085614) + (6.992847331908, 47.296124085614) + (6.988146825612, 47.296124085614) + (6.983446319317, 47.296124085614) + (6.978745813022, 47.296124085614) + (6.974045306727, 47.296124085614) + (6.974045306727, 47.291423579319) + (6.969344800432, 47.291423579319) + (6.964644294136, 47.291423579319) + (6.959943787841, 47.291423579319) + (6.955243281546, 47.291423579319) + (6.950542775251, 47.291423579319) + (6.945842268956, 47.291423579319) + (6.945842268956, 47.286723073023) + (6.94114176266, 47.286723073023) + (6.94114176266, 47.282022566728) + (6.945842268956, 47.282022566728) + (6.945842268956, 47.277322060433) + (6.950542775251, 47.277322060433) + (6.950542775251, 47.272621554138) + (6.950542775251, 47.267921047842) + (6.950542775251, 47.263220541547) + (6.950542775251, 47.258520035252) + (6.950542775251, 47.253819528957) + (6.945842268956, 47.253819528957) + (6.945842268956, 47.249119022662) + (6.950542775251, 47.249119022662) + (6.950542775251, 47.244418516366) + (6.950542775251, 47.239718010071) + (6.945842268956, 47.239718010071) + (6.94114176266, 47.239718010071) + (6.94114176266, 47.235017503776) + (6.94114176266, 47.230316997481) + (6.936441256365, 47.230316997481) + (6.93174075007, 47.230316997481) + (6.927040243775, 47.230316997481) + (6.927040243775, 47.225616491186) + (6.922339737479, 47.225616491186) + (6.922339737479, 47.22091598489) + (6.917639231184, 47.22091598489) + (6.912938724889, 47.22091598489) + (6.912938724889, 47.216215478595) + (6.908238218594, 47.216215478595) + (6.903537712299, 47.216215478595) + (6.903537712299, 47.2115149723) + (6.898837206003, 47.2115149723) + (6.898837206003, 47.206814466005) + (6.894136699708, 47.206814466005) + (6.889436193413, 47.206814466005) + (6.889436193413, 47.202113959709) + (6.884735687118, 47.202113959709) + (6.880035180822, 47.202113959709) + (6.880035180822, 47.197413453414) + (6.875334674527, 47.197413453414) + (6.875334674527, 47.192712947119) + (6.875334674527, 47.188012440824) + (6.875334674527, 47.183311934529) + (6.870634168232, 47.183311934529) + (6.865933661937, 47.183311934529) + (6.865933661937, 47.178611428233) + (6.861233155642, 47.178611428233) + (6.856532649346, 47.178611428233) + (6.851832143051, 47.178611428233) + (6.851832143051, 47.173910921938) + (6.847131636756, 47.173910921938) + (6.842431130461, 47.173910921938) + (6.842431130461, 47.169210415643) + (6.842431130461, 47.164509909348) + (6.847131636756, 47.164509909348) + (6.851832143051, 47.164509909348) + (6.856532649346, 47.164509909348) + (6.856532649346, 47.159809403053) + (6.851832143051, 47.159809403053) + (6.851832143051, 47.155108896757) + (6.847131636756, 47.155108896757) + (6.842431130461, 47.155108896757) + (6.837730624166, 47.155108896757) + (6.837730624166, 47.150408390462) + (6.83303011787, 47.150408390462) + (6.83303011787, 47.145707884167) + (6.828329611575, 47.145707884167) + (6.82362910528, 47.145707884167) + (6.82362910528, 47.141007377872) + (6.818928598985, 47.141007377872) + (6.818928598985, 47.136306871576) + (6.814228092689, 47.136306871576) + (6.809527586394, 47.136306871576) + (6.804827080099, 47.136306871576) + (6.804827080099, 47.131606365281) + (6.800126573804, 47.131606365281) + (6.800126573804, 47.126905858986) + (6.795426067509, 47.126905858986) + (6.790725561213, 47.126905858986) + (6.786025054918, 47.126905858986) + (6.781324548623, 47.126905858986) + (6.781324548623, 47.122205352691) + (6.776624042328, 47.122205352691) + (6.771923536033, 47.122205352691) + (6.767223029737, 47.122205352691) + (6.762522523442, 47.122205352691) + (6.762522523442, 47.117504846396) + (6.757822017147, 47.117504846396) + (6.753121510852, 47.117504846396) + (6.753121510852, 47.1128043401) + (6.748421004556, 47.1128043401) + (6.748421004556, 47.108103833805) + (6.743720498261, 47.108103833805) + (6.739019991966, 47.108103833805) + (6.739019991966, 47.10340332751) + (6.743720498261, 47.10340332751) + (6.743720498261, 47.098702821215) + (6.743720498261, 47.09400231492) + (6.743720498261, 47.094002314919) + (6.743720498261, 47.089301808624) + (6.739019991966, 47.089301808624) + (6.734319485671, 47.089301808624) + (6.729618979376, 47.089301808624) + (6.72491847308, 47.089301808624) + (6.720217966785, 47.089301808624) + (6.71551746049, 47.089301808624) + (6.71551746049, 47.084601302329) + (6.710816954195, 47.084601302329) + (6.7061164479, 47.084601302329) + (6.7061164479, 47.079900796034) + (6.7061164479, 47.075200289739) + (6.7061164479, 47.070499783443) + (6.701415941604, 47.070499783443) + (6.696715435309, 47.070499783443) + (6.692014929014, 47.070499783443) + (6.692014929014, 47.065799277148) + (6.696715435309, 47.065799277148) + (6.696715435309, 47.061098770853) + (6.701415941604, 47.061098770853) + (6.7061164479, 47.061098770853) + (6.7061164479, 47.056398264558) + (6.710816954195, 47.056398264558) + (6.71551746049, 47.056398264558) + (6.71551746049, 47.051697758263) + (6.71551746049, 47.046997251967) + (6.710816954195, 47.046997251967) + (6.710816954195, 47.042296745672) + (6.7061164479, 47.042296745672) + (6.7061164479, 47.037596239377) + (6.701415941604, 47.037596239377) + (6.696715435309, 47.037596239377) + (6.692014929014, 47.037596239377) + (6.687314422719, 47.037596239377) + (6.687314422719, 47.032895733082) + (6.682613916423, 47.032895733082) + (6.677913410128, 47.032895733082) + (6.673212903833, 47.032895733082) + (6.668512397538, 47.032895733082) + (6.668512397538, 47.028195226786) + (6.663811891243, 47.028195226786) + (6.663811891243, 47.023494720491) + (6.659111384947, 47.023494720491) + (6.654410878652, 47.023494720491) + (6.654410878652, 47.018794214196) + (6.654410878652, 47.014093707901) + (6.649710372357, 47.014093707901) + (6.649710372357, 47.009393201606) + (6.645009866062, 47.009393201606) + (6.640309359767, 47.009393201606) + (6.640309359767, 47.00469269531) + (6.635608853471, 47.00469269531) + (6.635608853471, 46.999992189015) + (6.630908347176, 46.999992189015) + (6.630908347176, 46.99529168272) + (6.626207840881, 46.99529168272) + (6.621507334586, 46.99529168272) + (6.61680682829, 46.99529168272) + (6.612106321995, 46.99529168272) + (6.612106321995, 46.990591176425) + (6.6074058157, 46.990591176425) + (6.602705309405, 46.990591176425) + (6.59800480311, 46.990591176425) + (6.593304296814, 46.990591176425) + (6.588603790519, 46.990591176425) + (6.588603790519, 46.98589067013) + (6.583903284224, 46.98589067013) + (6.579202777929, 46.98589067013) + (6.579202777929, 46.981190163834) + (6.574502271633, 46.981190163834) + (6.569801765338, 46.981190163834) + (6.565101259043, 46.981190163834) + (6.560400752748, 46.981190163834) + (6.560400752748, 46.976489657539) + (6.555700246453, 46.976489657539) + (6.550999740157, 46.976489657539) + (6.546299233862, 46.976489657539) + (6.541598727567, 46.976489657539) + (6.536898221272, 46.976489657539) + (6.536898221272, 46.971789151244) + (6.532197714977, 46.971789151244) + (6.527497208681, 46.971789151244) + (6.522796702386, 46.971789151244) + (6.518096196091, 46.971789151244) + (6.513395689796, 46.971789151244) + (6.513395689796, 46.967088644949) + (6.5086951835, 46.967088644949) + (6.503994677205, 46.967088644949) + (6.49929417091, 46.967088644949) + (6.49929417091, 46.971789151244) + (6.494593664615, 46.971789151244) + (6.48989315832, 46.971789151244) + (6.48989315832, 46.967088644949) + (6.485192652024, 46.967088644949) + (6.485192652024, 46.962388138653) + (6.480492145729, 46.962388138653) + (6.475791639434, 46.962388138653) + (6.475791639434, 46.957687632358) + (6.471091133139, 46.957687632358) + (6.466390626844, 46.957687632358) + (6.466390626844, 46.952987126063) + (6.461690120548, 46.952987126063) + (6.461690120548, 46.948286619768) + (6.456989614253, 46.948286619768) + (6.456989614253, 46.943586113473) + (6.452289107958, 46.943586113473) + (6.452289107958, 46.938885607177) + (6.447588601663, 46.938885607177) + (6.442888095367, 46.938885607177) + (6.442888095367, 46.934185100882) + (6.438187589072, 46.934185100882) + (6.438187589072, 46.929484594587) + (6.433487082777, 46.929484594587) + (6.433487082777, 46.924784088292) + (6.438187589072, 46.924784088292) + (6.438187589072, 46.920083581997) + (6.442888095367, 46.920083581997) + (6.442888095367, 46.915383075701) + (6.447588601663, 46.915383075701) + (6.447588601663, 46.910682569406) + (6.452289107958, 46.910682569406) + (6.452289107958, 46.905982063111) + (6.456989614253, 46.905982063111) + (6.456989614253, 46.901281556816) + (6.456989614253, 46.89658105052) + (6.461690120548, 46.89658105052) + (6.461690120548, 46.891880544225) + (6.461690120548, 46.88718003793) + (6.466390626844, 46.88718003793) + (6.466390626844, 46.882479531635) + (6.466390626844, 46.87777902534) + (6.466390626844, 46.873078519044) + (6.466390626844, 46.868378012749) + (6.466390626844, 46.863677506454) + (6.461690120548, 46.863677506454) + (6.461690120548, 46.858977000159) + (6.461690120548, 46.854276493864) + (6.461690120548, 46.849575987568) + (6.456989614253, 46.849575987568) + (6.456989614253, 46.844875481273) + (6.452289107958, 46.844875481273) + (6.447588601663, 46.844875481273) + (6.447588601663, 46.840174974978) + (6.447588601663, 46.835474468683) + (6.442888095367, 46.835474468683) + (6.442888095367, 46.830773962387) + (6.442888095367, 46.826073456092) + (6.442888095367, 46.821372949797) + (6.442888095367, 46.816672443502) + (6.438187589072, 46.816672443502) + (6.438187589072, 46.811971937207) + (6.433487082777, 46.811971937207) + (6.433487082777, 46.807271430911) + (6.433487082777, 46.802570924616) + (6.438187589072, 46.802570924616) + (6.438187589072, 46.797870418321) + (6.442888095367, 46.797870418321) + (6.447588601663, 46.797870418321) + (6.447588601663, 46.793169912026) + (6.452289107958, 46.793169912026) + (6.452289107958, 46.78846940573) + (6.456989614253, 46.78846940573) + (6.456989614253, 46.783768899435) + (6.456989614253, 46.77906839314) + (6.452289107958, 46.77906839314) + (6.452289107958, 46.774367886845) + (6.447588601663, 46.774367886845) + (6.447588601663, 46.76966738055) + (6.442888095367, 46.76966738055) + (6.442888095367, 46.764966874254) + (6.438187589072, 46.764966874254) + (6.438187589072, 46.760266367959) + (6.433487082777, 46.760266367959) + (6.428786576482, 46.760266367959) + (6.428786576482, 46.755565861664) + (6.424086070187, 46.755565861664) + (6.419385563891, 46.755565861664) + (6.414685057596, 46.755565861664) + (6.409984551301, 46.755565861664) + (6.409984551301, 46.750865355369) + (6.405284045006, 46.750865355369) + (6.400583538711, 46.750865355369) + (6.400583538711, 46.746164849074) + (6.395883032415, 46.746164849074) + (6.39118252612, 46.746164849074) + (6.386482019825, 46.746164849074) + (6.386482019825, 46.741464342778) + (6.39118252612, 46.741464342778) + (6.39118252612, 46.736763836483) + (6.386482019825, 46.736763836483) + (6.386482019825, 46.732063330188) + (6.38178151353, 46.732063330188) + (6.377081007234, 46.732063330188) + (6.372380500939, 46.732063330188) + (6.367679994644, 46.732063330188) + (6.367679994644, 46.727362823893) + (6.372380500939, 46.727362823893) + (6.372380500939, 46.722662317597) + (6.367679994644, 46.722662317597) + (6.362979488349, 46.722662317597) + (6.358278982054, 46.722662317597) + (6.358278982054, 46.717961811302) + (6.353578475758, 46.717961811302) + (6.348877969463, 46.717961811302) + (6.348877969463, 46.713261305007) + (6.344177463168, 46.713261305007) + (6.339476956873, 46.713261305007) + (6.339476956873, 46.708560798712) + (6.334776450578, 46.708560798712) + (6.330075944282, 46.708560798712) + (6.330075944282, 46.703860292417) + (6.325375437987, 46.703860292417) + (6.320674931692, 46.703860292417) + (6.315974425397, 46.703860292417) + (6.315974425397, 46.699159786121) + (6.311273919101, 46.699159786121) + (6.306573412806, 46.699159786121) + (6.301872906511, 46.699159786121) + (6.301872906511, 46.694459279826) + (6.297172400216, 46.694459279826) + (6.292471893921, 46.694459279826) + (6.292471893921, 46.689758773531) + (6.287771387625, 46.689758773531) + (6.28307088133, 46.689758773531) + (6.28307088133, 46.685058267236) + (6.278370375035, 46.685058267236) + (6.27366986874, 46.685058267236) + (6.27366986874, 46.680357760941) + (6.268969362444, 46.680357760941) + (6.268969362444, 46.675657254645) + (6.264268856149, 46.675657254645) + (6.264268856149, 46.67095674835) + (6.259568349854, 46.67095674835) + (6.259568349854, 46.666256242055) + (6.254867843559, 46.666256242055) + (6.250167337264, 46.666256242055) + (6.250167337264, 46.66155573576) + (6.245466830968, 46.66155573576) + (6.245466830968, 46.656855229464) + (6.240766324673, 46.656855229464) + (6.236065818378, 46.656855229464) + (6.236065818378, 46.652154723169) + (6.231365312083, 46.652154723169) + (6.226664805788, 46.652154723169) + (6.226664805788, 46.647454216874) + (6.221964299492, 46.647454216874) + (6.221964299492, 46.642753710579) + (6.217263793197, 46.642753710579) + (6.212563286902, 46.642753710579) + (6.212563286902, 46.638053204284) + (6.207862780607, 46.638053204284) + (6.203162274311, 46.638053204284) + (6.203162274311, 46.633352697988) + (6.198461768016, 46.633352697988) + (6.198461768016, 46.628652191693) + (6.193761261721, 46.628652191693) + (6.193761261721, 46.623951685398) + (6.189060755426, 46.623951685398) + (6.184360249131, 46.623951685398) + (6.184360249131, 46.619251179103) + (6.179659742835, 46.619251179103) + (6.179659742835, 46.614550672808) + (6.17495923654, 46.614550672808) + (6.170258730245, 46.614550672808) + (6.170258730245, 46.609850166512) + (6.16555822395, 46.609850166512) + (6.160857717655, 46.609850166512) + (6.156157211359, 46.609850166512) + (6.156157211359, 46.605149660217) + (6.151456705064, 46.605149660217) + (6.146756198769, 46.605149660217) + (6.146756198769, 46.600449153922) + (6.142055692474, 46.600449153922) + (6.137355186178, 46.600449153922) + (6.137355186178, 46.595748647627) + (6.132654679883, 46.595748647627) + (6.127954173588, 46.595748647627) + (6.127954173588, 46.591048141331) + (6.127954173588, 46.586347635036) + (6.123253667293, 46.586347635036) + (6.123253667293, 46.581647128741) + (6.118553160998, 46.581647128741) + (6.118553160998, 46.576946622446) + (6.113852654702, 46.576946622446) + (6.113852654702, 46.572246116151) + (6.118553160998, 46.572246116151) + (6.123253667293, 46.572246116151) + (6.123253667293, 46.567545609855) + (6.127954173588, 46.567545609855) + (6.127954173588, 46.56284510356) + (6.132654679883, 46.56284510356) + (6.137355186178, 46.56284510356) + (6.137355186178, 46.558144597265) + (6.142055692474, 46.558144597265) + (6.142055692474, 46.55344409097) + (6.146756198769, 46.55344409097) + (6.146756198769, 46.548743584675) + (6.151456705064, 46.548743584675) + (6.156157211359, 46.548743584675) + (6.156157211359, 46.544043078379) + (6.151456705064, 46.544043078379) + (6.151456705064, 46.539342572084) + (6.151456705064, 46.534642065789) + (6.151456705064, 46.529941559494) + (6.146756198769, 46.529941559494) + (6.142055692474, 46.529941559494) + (6.142055692474, 46.534642065789) + (6.137355186178, 46.534642065789) + (6.137355186178, 46.529941559494) + (6.132654679883, 46.529941559494) + (6.132654679883, 46.525241053198) + (6.127954173588, 46.525241053198) + (6.127954173588, 46.520540546903) + (6.123253667293, 46.520540546903) + (6.123253667293, 46.515840040608) + (6.118553160998, 46.515840040608) + (6.118553160998, 46.511139534313) + (6.113852654702, 46.511139534313) + (6.113852654702, 46.506439028018) + (6.109152148407, 46.506439028018) + (6.109152148407, 46.501738521722) + (6.109152148407, 46.497038015427) + (6.104451642112, 46.497038015427) + (6.104451642112, 46.492337509132) + (6.104451642112, 46.487637002837) + (6.099751135817, 46.487637002837) + (6.099751135817, 46.482936496542) + (6.099751135817, 46.482936496541) + (6.099751135817, 46.478235990246) + (6.095050629522, 46.478235990246) + (6.090350123226, 46.478235990246) + (6.090350123226, 46.473535483951) + (6.085649616931, 46.473535483951) + (6.080949110636, 46.473535483951) + (6.080949110636, 46.468834977656) + (6.076248604341, 46.468834977656) + (6.076248604341, 46.464134471361) + (6.076248604341, 46.459433965065) + (6.076248604341, 46.45473345877) + (6.076248604341, 46.450032952475) + (6.080949110636, 46.450032952475) + (6.085649616931, 46.450032952475) + (6.085649616931, 46.44533244618) + (6.085649616931, 46.440631939885) + (6.085649616931, 46.435931433589) + (6.080949110636, 46.435931433589) + (6.080949110636, 46.431230927294) + (6.076248604341, 46.431230927294) + (6.071548098045, 46.431230927294) + (6.071548098045, 46.426530420999) + (6.071548098045, 46.421829914704) + (6.06684759175, 46.421829914704) + (6.06684759175, 46.417129408408) + (6.071548098045, 46.417129408408) + (6.071548098045, 46.412428902113) + (6.076248604341, 46.412428902113) + (6.080949110636, 46.412428902113) + (6.085649616931, 46.412428902113) + (6.085649616931, 46.407728395818) + (6.090350123226, 46.407728395818) + (6.095050629522, 46.407728395818) + (6.099751135817, 46.407728395818) + (6.099751135817, 46.403027889523) + (6.104451642112, 46.403027889523) + (6.104451642112, 46.398327383228) + (6.109152148407, 46.398327383228) + (6.113852654702, 46.398327383228) + (6.118553160998, 46.398327383228) + (6.118553160998, 46.393626876932) + (6.123253667293, 46.393626876932) + (6.127954173588, 46.393626876932) + (6.127954173588, 46.388926370637) + (6.132654679883, 46.388926370637) + (6.137355186178, 46.388926370637) + (6.137355186178, 46.384225864342) + (6.142055692474, 46.384225864342) + (6.146756198769, 46.384225864342) + (6.146756198769, 46.379525358047) + (6.151456705064, 46.379525358047) + (6.156157211359, 46.379525358047) + (6.160857717655, 46.379525358047) + (6.160857717655, 46.374824851752) + (6.16555822395, 46.374824851752) + (6.16555822395, 46.370124345456) + (6.170258730245, 46.370124345456) + (6.170258730245, 46.365423839161) + (6.16555822395, 46.365423839161) + (6.16555822395, 46.360723332866) + (6.160857717655, 46.360723332866) + (6.160857717655, 46.356022826571) + (6.160857717655, 46.351322320275) + (6.156157211359, 46.351322320275) + (6.156157211359, 46.34662181398) + (6.151456705064, 46.34662181398) + (6.146756198769, 46.34662181398) + (6.146756198769, 46.341921307685) + (6.142055692474, 46.341921307685) + (6.142055692474, 46.33722080139) + (6.137355186178, 46.33722080139) + (6.137355186178, 46.332520295095) + (6.137355186178, 46.327819788799) + (6.132654679883, 46.327819788799) + (6.132654679883, 46.323119282504) + (6.127954173588, 46.323119282504) + (6.127954173588, 46.318418776209) + (6.123253667293, 46.318418776209) + (6.123253667293, 46.313718269914) + (6.118553160998, 46.313718269914) + (6.118553160998, 46.309017763619) + (6.118553160998, 46.304317257323) + (6.123253667293, 46.304317257323) + (6.123253667293, 46.299616751028) + (6.118553160998, 46.299616751028) + (6.118553160998, 46.294916244733) + (6.113852654702, 46.294916244733) + (6.113852654702, 46.290215738438) + (6.109152148407, 46.290215738438) + (6.109152148407, 46.285515232142) + (6.104451642112, 46.285515232142) + (6.104451642112, 46.280814725847) + (6.104451642112, 46.276114219552) + (6.109152148407, 46.276114219552) + (6.109152148407, 46.271413713257) + (6.113852654702, 46.271413713257) + (6.113852654702, 46.266713206962) + (6.118553160998, 46.266713206962) + (6.118553160998, 46.262012700666) + (6.123253667293, 46.262012700666) + (6.123253667293, 46.257312194371) + (6.123253667293, 46.252611688076) + (6.123253667293, 46.247911181781) + (6.118553160998, 46.247911181781) + (6.118553160998, 46.243210675486) + (6.113852654702, 46.243210675486) + (6.109152148407, 46.243210675486) + (6.109152148407, 46.23851016919) + (6.104451642112, 46.23851016919) + (6.099751135817, 46.23851016919) + (6.099751135817, 46.243210675486) + (6.095050629522, 46.243210675486) + (6.090350123226, 46.243210675486) + (6.090350123226, 46.247911181781) + (6.085649616931, 46.247911181781) + (6.080949110636, 46.247911181781) + (6.080949110636, 46.243210675486) + (6.076248604341, 46.243210675486) + (6.071548098045, 46.243210675486) + (6.071548098045, 46.23851016919) + (6.06684759175, 46.23851016919) + (6.06684759175, 46.243210675486) + (6.062147085455, 46.243210675486) + (6.05744657916, 46.243210675486) + (6.05744657916, 46.23851016919) + (6.052746072865, 46.23851016919) + (6.052746072865, 46.233809662895) + (6.048045566569, 46.233809662895) + (6.043345060274, 46.233809662895) + (6.038644553979, 46.233809662895) + (6.038644553979, 46.23851016919) + (6.033944047684, 46.23851016919) + (6.029243541389, 46.23851016919) + (6.029243541389, 46.233809662895) + (6.024543035093, 46.233809662895) + (6.019842528798, 46.233809662895) + (6.015142022503, 46.233809662895) + (6.015142022503, 46.2291091566) + (6.010441516208, 46.2291091566) + (6.005741009912, 46.2291091566) + (6.005741009912, 46.224408650305) + (6.001040503617, 46.224408650305) + (5.996339997322, 46.224408650305) + (5.991639491027, 46.224408650305) + (5.991639491027, 46.219708144009) + (5.991639491027, 46.215007637714) + (5.986938984732, 46.215007637714) + (5.982238478436, 46.215007637714) + (5.977537972141, 46.215007637714) + (5.972837465846, 46.215007637714) + (5.972837465846, 46.210307131419) + (5.972837465846, 46.205606625124) + (5.972837465846, 46.200906118829) + (5.968136959551, 46.200906118829) + (5.968136959551, 46.196205612533) + (5.972837465846, 46.196205612533) + (5.972837465846, 46.191505106238) + (5.977537972141, 46.191505106238) + (5.982238478436, 46.191505106238) + (5.986938984732, 46.191505106238) + (5.986938984732, 46.186804599943) + (5.991639491027, 46.186804599943) + (5.991639491027, 46.182104093648) + (5.991639491027, 46.177403587353) + (5.991639491027, 46.177403587352) + (5.991639491027, 46.172703081057) + (5.986938984732, 46.172703081057) + (5.982238478436, 46.172703081057) + (5.982238478436, 46.168002574762) + (5.977537972141, 46.168002574762) + (5.977537972141, 46.163302068467) + (5.977537972141, 46.158601562172) + (5.972837465846, 46.158601562172) + (5.972837465846, 46.153901055876) + (5.968136959551, 46.153901055876) + (5.968136959551, 46.149200549581) + (5.968136959551, 46.144500043286) + (5.963436453256, 46.144500043286) + (5.963436453256, 46.139799536991) + (5.963436453256, 46.135099030696) + (5.95873594696, 46.135099030696) + (5.95873594696, 46.1303985244) + (5.95873594696, 46.125698018105) + (5.963436453256, 46.125698018105) + (5.963436453256, 46.1303985244) + (5.968136959551, 46.1303985244) + (5.972837465846, 46.1303985244) + (5.977537972141, 46.1303985244) + (5.977537972141, 46.135099030696) + (5.982238478436, 46.135099030696) + (5.982238478436, 46.139799536991) + (5.982238478436, 46.144500043286) + (5.986938984732, 46.144500043286) + (5.991639491027, 46.144500043286) + (5.996339997322, 46.144500043286) + (6.001040503617, 46.144500043286) + (6.005741009912, 46.144500043286) + (6.010441516208, 46.144500043286) + (6.015142022503, 46.144500043286) + (6.019842528798, 46.144500043286) + (6.024543035093, 46.144500043286) + (6.024543035093, 46.139799536991) + (6.029243541389, 46.139799536991) + (6.033944047684, 46.139799536991) + (6.038644553979, 46.139799536991) + (6.043345060274, 46.139799536991) + (6.048045566569, 46.139799536991) + (6.048045566569, 46.144500043286) + (6.048045566569, 46.149200549581) + (6.052746072865, 46.149200549581) + (6.05744657916, 46.149200549581) + (6.062147085455, 46.149200549581) + (6.06684759175, 46.149200549581) + (6.071548098045, 46.149200549581) + (6.076248604341, 46.149200549581) + (6.080949110636, 46.149200549581) + (6.085649616931, 46.149200549581) + (6.090350123226, 46.149200549581) + (6.095050629522, 46.149200549581) + (6.099751135817, 46.149200549581) + (6.099751135817, 46.144500043286) + (6.104451642112, 46.144500043286) + (6.109152148407, 46.144500043286) + (6.113852654702, 46.144500043286) + (6.118553160998, 46.144500043286) + (6.118553160998, 46.139799536991) + (6.123253667293, 46.139799536991) + (6.127954173588, 46.139799536991) + (6.132654679883, 46.139799536991) + (6.137355186178, 46.139799536991) + (6.137355186178, 46.144500043286) + (6.142055692474, 46.144500043286) + (6.146756198769, 46.144500043286) + (6.146756198769, 46.149200549581) + (6.151456705064, 46.149200549581) + (6.156157211359, 46.149200549581) + (6.156157211359, 46.153901055876) + (6.160857717655, 46.153901055876) + (6.16555822395, 46.153901055876) + (6.170258730245, 46.153901055876) + (6.170258730245, 46.158601562172) + (6.17495923654, 46.158601562172) + (6.179659742835, 46.158601562172) + (6.179659742835, 46.163302068467) + (6.184360249131, 46.163302068467) + (6.189060755426, 46.163302068467) + (6.189060755426, 46.168002574762) + (6.189060755426, 46.172703081057) + (6.184360249131, 46.172703081057) + (6.184360249131, 46.177403587352) + (6.189060755426, 46.177403587352) + (6.189060755426, 46.182104093648) + (6.193761261721, 46.182104093648) + (6.198461768016, 46.182104093648) + (6.198461768016, 46.186804599943) + (6.203162274311, 46.186804599943) + (6.203162274311, 46.191505106238) + (6.207862780607, 46.191505106238) + (6.212563286902, 46.191505106238) + (6.212563286902, 46.196205612533) + (6.217263793197, 46.196205612533) + (6.217263793197, 46.200906118829) + (6.221964299492, 46.200906118829) + (6.226664805788, 46.200906118829) + (6.226664805788, 46.205606625124) + (6.231365312083, 46.205606625124) + (6.236065818378, 46.205606625124) + (6.240766324673, 46.205606625124) + (6.245466830968, 46.205606625124) + (6.250167337264, 46.205606625124) + (6.254867843559, 46.205606625124) + (6.254867843559, 46.210307131419) + (6.259568349854, 46.210307131419) + (6.264268856149, 46.210307131419) + (6.268969362444, 46.210307131419) + (6.268969362444, 46.215007637714) + (6.27366986874, 46.215007637714) + (6.278370375035, 46.215007637714) + (6.28307088133, 46.215007637714) + (6.28307088133, 46.219708144009) + (6.287771387625, 46.219708144009) + (6.292471893921, 46.219708144009) + (6.292471893921, 46.224408650305) + (6.297172400216, 46.224408650305) + (6.297172400216, 46.2291091566) + (6.301872906511, 46.2291091566) + (6.301872906511, 46.233809662895) + (6.306573412806, 46.233809662895) + (6.306573412806, 46.23851016919) + (6.306573412806, 46.243210675486) + (6.311273919101, 46.243210675486) + (6.311273919101, 46.247911181781) + (6.311273919101, 46.252611688076) + (6.306573412806, 46.252611688076) + (6.301872906511, 46.252611688076) + (6.301872906511, 46.257312194371) + (6.297172400216, 46.257312194371) + (6.297172400216, 46.262012700666) + (6.297172400216, 46.266713206962) + (6.292471893921, 46.266713206962) + (6.292471893921, 46.262012700666) + (6.287771387625, 46.262012700666) + (6.287771387625, 46.257312194371) + (6.28307088133, 46.257312194371) + (6.28307088133, 46.252611688076) + (6.278370375035, 46.252611688076) + (6.27366986874, 46.252611688076) + (6.268969362444, 46.252611688076) + (6.268969362444, 46.247911181781) + (6.264268856149, 46.247911181781) + (6.264268856149, 46.252611688076) + (6.259568349854, 46.252611688076) + (6.259568349854, 46.257312194371) + (6.254867843559, 46.257312194371) + (6.254867843559, 46.262012700666) + (6.250167337264, 46.262012700666) + (6.250167337264, 46.266713206962) + (6.245466830968, 46.266713206962) + (6.245466830968, 46.271413713257) + (6.240766324673, 46.271413713257) + (6.240766324673, 46.276114219552) + (6.240766324673, 46.280814725847) + (6.240766324673, 46.285515232142) + (6.245466830968, 46.285515232142) + (6.250167337264, 46.285515232142) + (6.250167337264, 46.290215738438) + (6.250167337264, 46.294916244733) + (6.250167337264, 46.299616751028) + (6.250167337264, 46.304317257323) + (6.245466830968, 46.304317257323) + (6.240766324673, 46.304317257323) + (6.240766324673, 46.309017763619) + (6.236065818378, 46.309017763619) + (6.231365312083, 46.309017763619) + (6.226664805788, 46.309017763619) + (6.226664805788, 46.313718269914) + (6.221964299492, 46.313718269914) + (6.221964299492, 46.318418776209) + (6.226664805788, 46.318418776209) + (6.226664805788, 46.323119282504) + (6.231365312083, 46.323119282504) + (6.231365312083, 46.327819788799) + (6.236065818378, 46.327819788799) + (6.236065818378, 46.332520295095) + (6.236065818378, 46.33722080139) + (6.240766324673, 46.33722080139) + (6.240766324673, 46.341921307685) + (6.245466830968, 46.341921307685) + (6.245466830968, 46.34662181398) + (6.250167337264, 46.34662181398) + (6.250167337264, 46.351322320275) + (6.250167337264, 46.356022826571) + (6.254867843559, 46.356022826571) + (6.254867843559, 46.360723332866) + (6.259568349854, 46.360723332866) + (6.264268856149, 46.360723332866) + (6.264268856149, 46.365423839161) + (6.268969362444, 46.365423839161) + (6.268969362444, 46.370124345456) + (6.27366986874, 46.370124345456) + (6.278370375035, 46.370124345456) + (6.278370375035, 46.374824851752) + (6.28307088133, 46.374824851752) + (6.287771387625, 46.374824851752) + (6.287771387625, 46.379525358047) + (6.292471893921, 46.379525358047) + (6.292471893921, 46.384225864342) + (6.297172400216, 46.384225864342) + (6.301872906511, 46.384225864342) + (6.301872906511, 46.388926370637) + (6.306573412806, 46.388926370637) + (6.311273919101, 46.388926370637) + (6.311273919101, 46.393626876932) + (6.315974425397, 46.393626876932) + (6.315974425397, 46.398327383228) + (6.320674931692, 46.398327383228) + (6.325375437987, 46.398327383228) + (6.325375437987, 46.403027889523) + (6.330075944282, 46.403027889523) + (6.334776450578, 46.403027889523) + (6.339476956873, 46.403027889523) + (6.344177463168, 46.403027889523) + (6.344177463168, 46.407728395818) + (6.348877969463, 46.407728395818) + (6.353578475758, 46.407728395818) + (6.358278982054, 46.407728395818) + (6.362979488349, 46.407728395818) + (6.367679994644, 46.407728395818) + (6.372380500939, 46.407728395818) + (6.377081007234, 46.407728395818) + (6.38178151353, 46.407728395818) + (6.38178151353, 46.412428902113) + (6.386482019825, 46.412428902113) + (6.39118252612, 46.412428902113) + (6.395883032415, 46.412428902113) + (6.400583538711, 46.412428902113) + (6.405284045006, 46.412428902113) + (6.409984551301, 46.412428902113) + (6.414685057596, 46.412428902113) + (6.419385563891, 46.412428902113) + (6.419385563891, 46.417129408408) + (6.424086070187, 46.417129408408) + (6.428786576482, 46.417129408408) + (6.433487082777, 46.417129408408) + (6.433487082777, 46.421829914704) + (6.438187589072, 46.421829914704) + (6.442888095367, 46.421829914704) + (6.442888095367, 46.426530420999) + (6.447588601663, 46.426530420999) + (6.452289107958, 46.426530420999) + (6.456989614253, 46.426530420999) + (6.456989614253, 46.431230927294) + (6.461690120548, 46.431230927294) + (6.466390626844, 46.431230927294) + (6.466390626844, 46.435931433589) + (6.471091133139, 46.435931433589) + (6.475791639434, 46.435931433589) + (6.480492145729, 46.435931433589) + (6.480492145729, 46.440631939885) + (6.485192652024, 46.440631939885) + (6.48989315832, 46.440631939885) + (6.48989315832, 46.44533244618) + (6.494593664615, 46.44533244618) + (6.49929417091, 46.44533244618) + (6.49929417091, 46.450032952475) + (6.503994677205, 46.450032952475) + (6.5086951835, 46.450032952475) + (6.513395689796, 46.450032952475) + (6.513395689796, 46.45473345877) + (6.518096196091, 46.45473345877) + (6.522796702386, 46.45473345877) + (6.527497208681, 46.45473345877) + (6.532197714977, 46.45473345877) + (6.536898221272, 46.45473345877) + (6.541598727567, 46.45473345877) + (6.546299233862, 46.45473345877) + (6.550999740157, 46.45473345877) + (6.555700246453, 46.45473345877) + (6.560400752748, 46.45473345877) + (6.565101259043, 46.45473345877) + (6.569801765338, 46.45473345877) + (6.574502271633, 46.45473345877) + (6.579202777929, 46.45473345877) + (6.583903284224, 46.45473345877) + (6.588603790519, 46.45473345877) + (6.593304296814, 46.45473345877) + (6.59800480311, 46.45473345877) + (6.602705309405, 46.45473345877) + (6.6074058157, 46.45473345877) + (6.612106321995, 46.45473345877) + (6.61680682829, 46.45473345877) + (6.621507334586, 46.45473345877) + (6.626207840881, 46.45473345877) + (6.630908347176, 46.45473345877) + (6.635608853471, 46.45473345877) + (6.640309359767, 46.45473345877) + (6.645009866062, 46.45473345877) + (6.649710372357, 46.45473345877) + (6.654410878652, 46.45473345877) + (6.659111384947, 46.45473345877) + (6.663811891243, 46.45473345877) + (6.668512397538, 46.45473345877) + (6.673212903833, 46.45473345877) + (6.677913410128, 46.45473345877) + (6.677913410128, 46.450032952475) + (6.682613916423, 46.450032952475) + (6.687314422719, 46.450032952475) + (6.692014929014, 46.450032952475) + (6.696715435309, 46.450032952475) + (6.701415941604, 46.450032952475) + (6.7061164479, 46.450032952475) + (6.7061164479, 46.44533244618) + (6.710816954195, 46.44533244618) + (6.71551746049, 46.44533244618) + (6.720217966785, 46.44533244618) + (6.72491847308, 46.44533244618) + (6.729618979376, 46.44533244618) + (6.734319485671, 46.44533244618) + (6.734319485671, 46.440631939885) + (6.739019991966, 46.440631939885) + (6.743720498261, 46.440631939885) + (6.748421004556, 46.440631939885) + (6.753121510852, 46.440631939885) + (6.757822017147, 46.440631939885) + (6.762522523442, 46.440631939885) + (6.762522523442, 46.435931433589) + (6.767223029737, 46.435931433589) + (6.771923536033, 46.435931433589) + (6.776624042328, 46.435931433589) + (6.781324548623, 46.435931433589) + (6.786025054918, 46.435931433589) + (6.790725561213, 46.435931433589) + (6.790725561213, 46.431230927294) + (6.795426067509, 46.431230927294) + (6.800126573804, 46.431230927294) + (6.804827080099, 46.431230927294) + (6.809527586394, 46.431230927294) + (6.814228092689, 46.431230927294) + (6.818928598985, 46.431230927294) + (6.818928598985, 46.426530420999) + (6.818928598985, 46.421829914704) + (6.814228092689, 46.421829914704) + (6.814228092689, 46.417129408408) + (6.814228092689, 46.412428902113) + (6.809527586394, 46.412428902113) + (6.809527586394, 46.407728395818) + (6.809527586394, 46.403027889523) + (6.804827080099, 46.403027889523) + (6.804827080099, 46.398327383228) + (6.804827080099, 46.393626876932) + (6.804827080099, 46.388926370637) + (6.804827080099, 46.384225864342) + (6.804827080099, 46.379525358047) + (6.800126573804, 46.379525358047) + (6.800126573804, 46.374824851752) + (6.795426067509, 46.374824851752) + (6.795426067509, 46.370124345456) + (6.790725561213, 46.370124345456) + (6.790725561213, 46.365423839161) + (6.786025054918, 46.365423839161) + (6.781324548623, 46.365423839161) + (6.776624042328, 46.365423839161) + (6.776624042328, 46.360723332866) + (6.771923536033, 46.360723332866) + (6.771923536033, 46.356022826571) + (6.771923536033, 46.351322320275) + (6.771923536033, 46.34662181398) + (6.776624042328, 46.34662181398) + (6.781324548623, 46.34662181398) + (6.781324548623, 46.341921307685) + (6.781324548623, 46.33722080139) + (6.786025054918, 46.33722080139) + (6.786025054918, 46.332520295095) + (6.790725561213, 46.332520295095) + (6.795426067509, 46.332520295095) + (6.800126573804, 46.332520295095) + (6.800126573804, 46.327819788799) + (6.800126573804, 46.323119282504) + (6.800126573804, 46.318418776209) + (6.804827080099, 46.318418776209) + (6.809527586394, 46.318418776209) + (6.814228092689, 46.318418776209) + (6.814228092689, 46.313718269914) + (6.818928598985, 46.313718269914) + (6.82362910528, 46.313718269914) + (6.82362910528, 46.309017763619) + (6.828329611575, 46.309017763619) + (6.828329611575, 46.304317257323) + (6.828329611575, 46.299616751028) + (6.83303011787, 46.299616751028) + (6.837730624166, 46.299616751028) + (6.837730624166, 46.294916244733) + (6.842431130461, 46.294916244733) + (6.847131636756, 46.294916244733) + (6.847131636756, 46.290215738438) + (6.851832143051, 46.290215738438) + (6.851832143051, 46.294916244733) + (6.856532649346, 46.294916244733) + (6.856532649346, 46.290215738438) + (6.861233155642, 46.290215738438) + (6.861233155642, 46.285515232142) + (6.861233155642, 46.280814725847) + (6.861233155642, 46.276114219552) + (6.856532649346, 46.276114219552) + (6.856532649346, 46.271413713257) + (6.861233155642, 46.271413713257) + (6.861233155642, 46.266713206962) + (6.856532649346, 46.266713206962) + (6.856532649346, 46.262012700666) + (6.856532649346, 46.257312194371) + (6.856532649346, 46.252611688076) + (6.851832143051, 46.252611688076) + (6.847131636756, 46.252611688076) + (6.847131636756, 46.247911181781) + (6.842431130461, 46.247911181781) + (6.842431130461, 46.243210675486) + (6.837730624166, 46.243210675486) + (6.837730624166, 46.23851016919) + (6.83303011787, 46.23851016919) + (6.828329611575, 46.23851016919) + (6.828329611575, 46.233809662895) + (6.82362910528, 46.233809662895) + (6.82362910528, 46.2291091566) + (6.818928598985, 46.2291091566) + (6.818928598985, 46.224408650305) + (6.818928598985, 46.219708144009) + (6.814228092689, 46.219708144009) + (6.814228092689, 46.215007637714) + (6.809527586394, 46.215007637714) + (6.809527586394, 46.210307131419) + (6.804827080099, 46.210307131419) + (6.804827080099, 46.205606625124) + (6.804827080099, 46.200906118829) + (6.804827080099, 46.196205612533) + (6.809527586394, 46.196205612533) + (6.809527586394, 46.191505106238) + (6.809527586394, 46.186804599943) + (6.814228092689, 46.186804599943) + (6.814228092689, 46.182104093648) + (6.809527586394, 46.182104093648) + (6.809527586394, 46.177403587353) + (6.809527586394, 46.177403587352) + (6.809527586394, 46.172703081057) + (6.804827080099, 46.172703081057) + (6.804827080099, 46.168002574762) + (6.800126573804, 46.168002574762) + (6.800126573804, 46.163302068467) + (6.795426067509, 46.163302068467) + (6.795426067509, 46.158601562172) + (6.790725561213, 46.158601562172) + (6.790725561213, 46.153901055876) + (6.790725561213, 46.149200549581) + (6.795426067509, 46.149200549581) + (6.795426067509, 46.144500043286) + (6.795426067509, 46.139799536991) + (6.800126573804, 46.139799536991) + (6.800126573804, 46.135099030696) + (6.804827080099, 46.135099030696) + (6.809527586394, 46.135099030696) + (6.809527586394, 46.1303985244) + (6.814228092689, 46.1303985244) + (6.818928598985, 46.1303985244) + (6.82362910528, 46.1303985244) + (6.828329611575, 46.1303985244) + (6.83303011787, 46.1303985244) + (6.83303011787, 46.135099030696) + (6.837730624166, 46.135099030696) + (6.842431130461, 46.135099030696) + (6.842431130461, 46.1303985244) + (6.847131636756, 46.1303985244) + (6.847131636756, 46.125698018105) + (6.851832143051, 46.125698018105) + (6.856532649346, 46.125698018105) + (6.861233155642, 46.125698018105) + (6.865933661937, 46.125698018105) + (6.870634168232, 46.125698018105) + (6.875334674527, 46.125698018105) + (6.880035180822, 46.125698018105) + (6.884735687118, 46.125698018105) + (6.889436193413, 46.125698018105) + (6.894136699708, 46.125698018105) + (6.898837206003, 46.125698018105) + (6.898837206003, 46.12099751181) + (6.898837206003, 46.116297005515) + (6.894136699708, 46.116297005515) + (6.894136699708, 46.111596499219) + (6.894136699708, 46.106895992924) + (6.889436193413, 46.106895992924) + (6.889436193413, 46.102195486629) + (6.889436193413, 46.097494980334) + (6.884735687118, 46.097494980334) + (6.884735687118, 46.092794474039) + (6.884735687118, 46.088093967743) + (6.889436193413, 46.088093967743) + (6.889436193413, 46.083393461448) + (6.889436193413, 46.078692955153) + (6.889436193413, 46.073992448858) + (6.884735687118, 46.073992448858) + (6.884735687118, 46.069291942563) + (6.880035180822, 46.069291942563) + (6.880035180822, 46.064591436267) + (6.875334674527, 46.064591436267) + (6.875334674527, 46.059890929972) + (6.875334674527, 46.055190423677) + (6.870634168232, 46.055190423677) + (6.870634168232, 46.050489917382) + (6.875334674527, 46.050489917382) + (6.875334674527, 46.045789411086) + (6.880035180822, 46.045789411086) + (6.884735687118, 46.045789411086) + (6.884735687118, 46.041088904791) + (6.889436193413, 46.041088904791) + (6.889436193413, 46.045789411086) + (6.894136699708, 46.045789411086) + (6.894136699708, 46.050489917382) + (6.898837206003, 46.050489917382) + (6.903537712299, 46.050489917382) + (6.908238218594, 46.050489917382) + (6.912938724889, 46.050489917382) + (6.912938724889, 46.055190423677) + (6.917639231184, 46.055190423677) + (6.917639231184, 46.059890929972) + (6.922339737479, 46.059890929972) + (6.922339737479, 46.064591436267) + (6.927040243775, 46.064591436267) + (6.93174075007, 46.064591436267) + (6.936441256365, 46.064591436267) + (6.936441256365, 46.059890929972) + (6.936441256365, 46.055190423677) + (6.94114176266, 46.055190423677) + (6.94114176266, 46.050489917382) + (6.945842268956, 46.050489917382) + (6.950542775251, 46.050489917382) + (6.950542775251, 46.045789411086) + (6.955243281546, 46.045789411086) + (6.955243281546, 46.041088904791) + (6.955243281546, 46.036388398496) + (6.959943787841, 46.036388398496) + (6.959943787841, 46.031687892201) + (6.964644294136, 46.031687892201) + (6.969344800432, 46.031687892201) + (6.969344800432, 46.026987385906) + (6.974045306727, 46.026987385906) + (6.974045306727, 46.02228687961) + (6.978745813022, 46.02228687961) + (6.978745813022, 46.017586373315) + (6.983446319317, 46.017586373315) + (6.983446319317, 46.01288586702) + (6.983446319317, 46.008185360725) + (6.983446319317, 46.00348485443) + (6.988146825612, 46.00348485443) + (6.992847331908, 46.00348485443) + (6.992847331908, 45.998784348134) + (6.997547838203, 45.998784348134) + (7.002248344498, 45.998784348134) + (7.006948850793, 45.998784348134) + (7.011649357089, 45.998784348134) + (7.011649357089, 45.994083841839) + (7.011649357089, 45.989383335544) + (7.011649357089, 45.984682829249) + (7.016349863384, 45.984682829249) + (7.021050369679, 45.984682829249) + (7.021050369679, 45.979982322953) + (7.021050369679, 45.975281816658) + (7.016349863384, 45.975281816658) + (7.011649357089, 45.975281816658) + (7.011649357089, 45.970581310363) + (7.011649357089, 45.965880804068) + (7.016349863384, 45.965880804068) + (7.016349863384, 45.961180297773) + (7.021050369679, 45.961180297773) + (7.025750875974, 45.961180297773) + (7.025750875974, 45.956479791477) + (7.030451382269, 45.956479791477) + (7.035151888565, 45.956479791477) + (7.035151888565, 45.951779285182) + (7.035151888565, 45.947078778887) + (7.035151888565, 45.942378272592) + (7.035151888565, 45.937677766297) + (7.03985239486, 45.937677766297) + (7.03985239486, 45.932977260001) + (7.03985239486, 45.928276753706) + (7.044552901155, 45.928276753706) + (7.044552901155, 45.923576247411) + (7.044552901155, 45.918875741116) + (7.04925340745, 45.918875741116) + (7.04925340745, 45.91417523482) + (7.053953913745, 45.91417523482) + (7.058654420041, 45.91417523482) + (7.063354926336, 45.91417523482) + (7.063354926336, 45.909474728525) + (7.063354926336, 45.90477422223) + (7.063354926336, 45.900073715935) + (7.068055432631, 45.900073715935) + (7.068055432631, 45.89537320964) + (7.072755938926, 45.89537320964) + (7.077456445222, 45.89537320964) + (7.077456445222, 45.890672703344) + (7.077456445222, 45.885972197049) + (7.082156951517, 45.885972197049) + (7.082156951517, 45.881271690754) + (7.086857457812, 45.881271690754) + (7.091557964107, 45.881271690754) + (7.091557964107, 45.876571184459) + (7.091557964107, 45.871870678164) + (7.096258470402, 45.871870678164) + (7.096258470402, 45.867170171868) + (7.096258470402, 45.862469665573) + (7.100958976698, 45.862469665573) + (7.100958976698, 45.857769159278) + (7.105659482993, 45.857769159278) + (7.110359989288, 45.857769159278) + (7.115060495583, 45.857769159278) + (7.119761001878, 45.857769159278) + (7.119761001878, 45.862469665573) + (7.124461508174, 45.862469665573) + (7.129162014469, 45.862469665573) + (7.129162014469, 45.867170171868) + (7.133862520764, 45.867170171868) + (7.133862520764, 45.871870678164) +```` + Here is the boundary. -````@example refinement +````julia boundary_nodes, points = convert_boundary_points_to_indices(boundary_points) rng = StableRNG(789) tri = triangulate(points; boundary_nodes, rng) @@ -264,25 +5494,45 @@ fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + Now let's refine. -````@example refinement +````julia A = get_area(tri) refine!(tri; min_angle=30.0, max_area=0.001A, rng) ```` -````@example refinement +```` +Delaunay Triangulation. + Number of vertices: 14165 + Number of triangles: 23178 + Number of edges: 37342 + Has boundary nodes: true + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: true +```` + +````julia fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + We see that the triangulation is now adequately refined. There are still triangles near the boundaries whose minimum angle is less than 30 degrees, though, because of the angles that boundary edges meet at in some places. Most of the triangles will satisfy the constraint, though, as we show below. -````@example refinement +````julia stats = statistics(tri) angles = first.(get_all_stat(stats, :angles)) # the first is the smallest fig, ax, sc = scatter(rad2deg.(angles)) @@ -290,10 +5540,14 @@ hlines!(ax, [30.0], color = :red, linewidth = 4) fig ```` +```@raw html + +``` + As we can see, the vast majority of the triangles satisfy the constraint, but there are still some that do not. Here is another set of results with a lower minimum angle constraint. -````@example refinement +````julia boundary_nodes, points = convert_boundary_points_to_indices(boundary_points) rng = StableRNG(789) tri = triangulate(points; boundary_nodes, rng) @@ -310,6 +5564,10 @@ resize_to_layout!(fig) fig ```` +```@raw html + +``` + In this case, all the triangles satisfy the constraint, of course at the expense of some other triangles having lesser quality. ## Just the code diff --git a/docs/src/tutorials/unconstrained.md b/docs/src/tutorials/unconstrained.md index 0a4ccb3ee..3e81b65b1 100644 --- a/docs/src/tutorials/unconstrained.md +++ b/docs/src/tutorials/unconstrained.md @@ -8,7 +8,7 @@ Our first example considers constructing unconstrained Delaunay triangulations. To start, let us load in the packages we will need. -````@example unconstrained +````julia using DelaunayTriangulation using CairoMakie # for plotting using StableRNGs # for reproducibility @@ -18,31 +18,53 @@ using LinearAlgebra # used for computing norms later We consider just triangulating a random set of points. First, generating the points: -````@example unconstrained +````julia rng = StableRNG(123) points = rand(rng, 2, 500) # just do rand(2, 500) if you are not concerned about the RNG ```` +```` +2×500 Matrix{Float64}: + 0.181026 0.669058 0.437991 0.763974 0.515045 0.70134 0.876273 0.739213 0.506876 0.266373 0.351618 0.721093 0.637996 0.363447 0.455205 0.348518 0.809794 0.223906 0.61295 0.329471 0.540632 0.223046 0.539128 0.419776 0.458012 0.687042 0.15147 0.785806 0.336894 0.343754 0.418788 0.256693 0.0639703 0.331352 0.244427 0.425703 0.491863 0.776779 0.360371 0.00263946 0.340133 0.270424 0.115997 0.813952 0.421372 0.722946 0.552395 0.797896 0.523122 0.288461 0.545081 0.437921 0.304731 0.89046 0.637476 0.813697 0.69858 0.151131 0.793309 0.329285 0.562948 0.0815702 0.279641 0.817653 0.801687 0.695043 0.307854 0.377544 0.558266 0.824428 0.796442 0.154541 0.0800997 0.691939 0.167874 0.933698 0.93185 0.791387 0.82006 0.708238 0.95372 0.753526 0.74857 0.659175 0.209896 0.196745 0.127467 0.524392 0.0829614 0.700979 0.134585 0.00688858 0.51353 0.24561 0.163308 0.435777 0.918945 0.166482 0.0568971 0.406672 0.527439 0.4354 0.21018 0.43972 0.301404 0.583691 0.874586 0.387704 0.350605 0.502661 0.582974 0.151539 0.276187 0.880838 0.152898 0.277676 0.549405 0.163404 0.129285 0.131234 0.196663 0.80264 0.869203 0.112288 0.110314 0.458535 0.784782 0.250383 0.917494 0.488987 0.54606 0.185561 0.995848 0.762547 0.308271 0.510413 0.178851 0.634063 0.931508 0.213869 0.183094 0.532255 0.625907 0.65799 0.628808 0.799758 0.481242 0.940936 0.881986 0.374775 0.374894 0.69412 0.932955 0.764663 0.101373 0.74717 0.905268 0.646034 0.230818 0.736922 0.327148 0.624086 0.978315 0.676679 0.675824 0.76549 0.310209 0.0560602 0.977099 0.400777 0.385446 0.153937 0.628224 0.0259813 0.556082 0.00130711 0.587556 0.521749 0.362642 0.517127 0.755883 0.153261 0.199942 0.301887 0.828024 0.0927618 0.622874 0.207796 0.022725 0.234718 0.1874 0.559458 0.402361 0.737495 0.100388 0.394142 0.796617 0.491243 0.435373 0.676698 0.601822 0.912472 0.65373 0.800586 0.665684 0.656845 0.925526 0.733754 0.106838 0.828335 0.431333 0.00736147 0.921623 0.507653 0.971479 0.269747 0.817207 0.215851 0.609782 0.711618 0.226012 0.539521 0.261726 0.66208 0.899939 0.876967 0.284227 0.351236 0.965389 0.949363 0.237952 0.998855 0.315107 0.0404263 0.675675 0.310525 0.791587 0.0233863 0.0955889 0.896359 0.762741 0.828236 0.769262 0.47533 0.063996 0.755876 0.973318 0.146077 0.770016 0.61136 0.263433 0.94654 0.906265 0.827459 0.966827 0.489265 0.987065 0.824262 0.288757 0.30942 0.195225 0.324369 0.529757 0.212361 0.900904 0.88208 0.511181 0.751019 0.420527 0.883097 0.219401 0.323676 0.637138 0.118389 0.868121 0.409298 0.270215 0.453449 0.123123 0.811252 0.389822 0.145426 0.820001 0.257654 0.135927 0.709894 0.462429 0.446925 0.856169 0.806983 0.881146 0.974744 0.167324 0.955413 0.967742 0.341459 0.958273 0.858018 0.621369 0.456395 0.503465 0.323223 0.0752862 0.955472 0.52896 0.902039 0.357986 0.237799 0.571431 0.834022 0.176041 0.788659 0.29665 0.554148 0.644947 0.954224 0.776911 0.620958 0.00291754 0.095197 0.0210285 0.664658 0.762682 0.484171 0.921929 0.901151 0.668319 0.262004 0.386269 0.436472 0.824224 0.683262 0.340386 0.117477 0.733987 0.442351 0.989014 0.978268 0.1671 0.330902 0.741137 0.554488 0.548208 0.616783 0.972508 0.266814 0.170246 0.410809 0.262931 0.755769 0.422182 0.604407 0.817767 0.974785 0.955647 0.739929 0.320489 0.62935 0.21621 0.272473 0.601508 0.414413 0.804268 0.196294 0.974554 0.583934 0.335481 0.539881 0.300205 0.337433 0.0202547 0.296958 0.494453 0.11217 0.0715926 0.564346 0.571969 0.53193 0.157119 0.289274 0.388633 0.779599 0.911604 0.117072 0.898052 0.462633 0.761786 0.505131 0.467784 0.0493592 0.0923198 0.0449557 0.135861 0.635555 0.909697 0.613948 0.279111 0.857699 0.00524744 0.120045 0.429042 0.0882701 0.193549 0.398813 0.610383 0.401103 0.53577 0.170252 0.872609 0.438583 0.750883 0.865202 0.266392 0.711303 0.637627 0.089177 0.410576 0.303547 0.894829 0.125559 0.473098 0.464572 0.806659 0.221016 0.0280905 0.810146 0.00827066 0.804782 0.0616697 0.941801 0.250919 0.237675 0.823915 0.541156 0.720895 0.803985 0.0786536 0.236702 0.956706 0.640619 0.958435 0.82819 0.882578 0.597655 0.564413 0.837944 0.418879 0.53278 0.818377 0.975019 0.382218 0.0698097 0.459689 0.236278 0.235126 0.0313331 0.537227 0.263279 0.460627 0.473966 0.944432 0.623716 0.785133 0.0120468 0.603183 0.0428481 0.145068 0.989866 0.413146 0.47412 0.762582 0.761679 0.968606 0.667712 0.253657 0.713645 0.181444 0.521983 0.0227201 0.0828667 0.259405 0.959931 0.42234 0.875965 0.353899 0.927026 0.62526 0.596537 0.973425 0.941601 0.0438116 0.911062 0.739358 0.864538 0.699831 0.400533 0.337066 0.459817 0.312727 0.0634304 + 0.36749 0.0427306 0.48329 0.924483 0.495042 0.693569 0.944219 0.559545 0.646024 0.253141 0.527389 0.188512 0.427843 0.577647 0.16582 0.737079 0.171167 0.848205 0.952542 0.918373 0.820474 0.598776 0.619535 0.453259 0.836069 0.353959 0.703671 0.551635 0.710355 0.405438 0.346188 0.157176 0.596071 0.0965347 0.128071 0.926538 0.134549 0.597526 0.034642 0.604342 0.0888438 0.290691 0.847073 0.0601803 0.679816 0.737598 0.970875 0.683298 0.855341 0.431233 0.638433 0.775729 0.745173 0.139747 0.856516 0.777063 0.152194 0.324202 0.0924124 0.00563978 0.579165 0.450706 0.0560835 0.50384 0.65171 0.389672 0.381893 0.7932 0.707537 0.515592 0.327837 0.817693 0.0475871 0.819659 0.125727 0.493807 0.311002 0.765118 0.521854 0.0734049 0.17116 0.90863 0.66635 0.63634 0.221245 0.241482 0.478185 0.390411 0.0617778 0.648669 0.308804 0.541835 0.428168 0.496737 0.545666 0.911066 0.0662768 0.649396 0.760846 0.248483 0.401041 0.0396139 0.900348 0.939905 0.873122 0.80144 0.0770524 0.506864 0.428658 0.121242 0.638559 0.974467 0.639326 0.835716 0.207941 0.592121 0.506314 0.186599 0.794883 0.802221 0.160557 0.191487 0.481045 0.0205251 0.751321 0.692231 0.0247294 0.521179 0.42381 0.890044 0.341701 0.48763 0.457178 0.452692 0.724959 0.192477 0.55463 0.513373 0.739426 0.00516507 0.42228 0.409429 0.843826 0.829954 0.53278 0.345138 0.571183 0.509987 0.33359 0.358201 0.0316704 0.686877 0.0452453 0.633021 0.100261 0.801601 0.203674 0.930138 0.222399 0.889327 0.93828 0.387938 0.0555843 0.348795 0.339641 0.294326 0.362177 0.876946 0.569376 0.550425 0.561675 0.154164 0.152203 0.36556 0.111442 0.735052 0.389202 0.886379 0.15633 0.144373 0.237032 0.145793 0.45279 0.0372542 0.440216 0.18769 0.692835 0.808651 0.622941 0.854403 0.373967 0.186052 0.246232 0.579073 0.1812 0.852832 0.999781 0.989092 0.776308 0.423385 0.843372 0.674218 0.1239 0.313695 0.38427 0.559683 0.207026 0.745099 0.331923 0.138651 0.0398031 0.391087 0.840941 0.487405 0.140799 0.904586 0.210664 0.543117 0.999184 0.260491 0.637879 0.154327 0.428806 0.533854 0.584642 0.63172 0.205341 0.473755 0.813529 0.46243 0.534511 0.361381 0.158313 0.151782 0.189559 0.036348 0.645382 0.865508 0.857054 0.529265 0.726127 0.417632 0.103866 0.97594 0.00780044 0.2739 0.930787 0.410755 0.676963 0.0768056 0.762454 0.868867 0.558984 0.736597 0.114093 0.867234 0.482919 0.0028658 0.309163 0.904961 0.828557 0.986628 0.199129 0.567569 0.977771 0.575212 0.401379 0.831577 0.0412443 0.459265 0.82129 0.0788373 0.0171894 0.853996 0.154636 0.062491 0.165524 0.091407 0.448646 0.0171893 0.0980491 0.855286 0.214436 0.1485 0.151223 0.751848 0.239441 0.27903 0.48538 0.00820996 0.560848 0.669526 0.014872 0.133648 0.057047 0.8933 0.401493 0.53216 0.800628 0.380869 0.507253 0.308986 0.952318 0.634803 0.262183 0.826332 0.132768 0.325102 0.407019 0.901277 0.0935133 0.835246 0.069461 0.122496 0.283896 0.486517 0.719179 0.0950475 0.0327314 0.0761925 0.433444 0.0667151 0.0517945 0.194546 0.0116186 0.633291 0.319646 0.455837 0.0323374 0.39123 0.72488 0.366719 0.930497 0.840097 0.560529 0.462569 0.374708 0.683058 0.150342 0.728512 0.0959656 0.286593 0.903991 0.196968 0.989066 0.199721 0.502435 0.14738 0.265107 0.0416473 0.114756 0.0747264 0.170444 0.747839 0.311876 0.497515 0.970706 0.429969 0.940689 0.0109684 0.674098 0.889181 0.642075 0.132777 0.103044 0.00559392 0.917282 0.645921 0.181392 0.76393 0.936732 0.388988 0.56209 0.929056 0.498177 0.707023 0.344282 0.919879 0.284647 0.632842 0.910668 0.0279172 0.328333 0.455078 0.370364 0.58211 0.803457 0.082038 0.861727 0.640028 0.705404 0.15266 0.896605 0.391123 0.420594 0.115443 0.43585 0.00436228 0.152666 0.933136 0.858691 0.0127729 0.964708 0.610086 0.136407 0.892495 0.815915 0.0629032 0.761915 0.17202 0.528866 0.537323 0.0417917 0.20407 0.705418 0.954324 0.576491 0.642704 0.800022 0.564916 0.195492 0.485029 0.0980802 0.0581283 0.960441 0.0577736 0.738122 0.604437 0.0428863 0.894244 0.96158 0.262416 0.573678 0.831426 0.32834 0.494434 0.375363 0.308775 0.964644 0.092962 0.534357 0.230757 0.811912 0.300044 0.614219 0.986509 0.770094 0.321493 0.549143 0.277844 0.929055 0.88323 0.0785272 0.872782 0.303657 0.962391 0.310815 0.47404 0.865449 0.815715 0.934553 0.534671 0.535503 0.458238 0.66025 0.206327 0.349035 0.980125 0.415568 0.171304 0.683687 0.414906 0.317704 0.818032 0.235651 0.0368418 0.0666789 0.813251 0.860372 0.189548 0.222904 0.550917 0.271007 0.0716159 0.188967 0.862459 0.933695 0.554072 0.827465 0.0370543 0.836151 0.0143462 0.494221 0.638122 0.395067 0.175565 0.942264 0.0794176 0.892313 0.606559 +```` + We now triangulate these points by using [`triangulate`](@ref). We pass the `rng` as a keyword argument, but again if you are not concerned about the RNG (or set the seed using `Random.seed!`) then you can ignore this. -````@example unconstrained +````julia tri = triangulate(points; rng=rng) ```` -````@example unconstrained +```` +Delaunay Triangulation. + Number of vertices: 500 + Number of triangles: 980 + Number of edges: 1479 + Has boundary nodes: false + Has ghost triangles: true + Curve-bounded: false + Weighted: false + Constrained: false +```` + +````julia fig, ax, sc = triplot(tri) fig ```` +```@raw html + +``` + This `tri` object is our [`Triangulation`](@ref), and we can interact with it in many ways. ## Iterating over vertices For example, we can iterate over the points in the triangulation using [`each_solid_vertex`](@ref). Here we compute the centroid of the point cloud: -````@example unconstrained +````julia function compute_centroid(tri) s = [0.0, 0.0] for i in each_solid_vertex(tri) @@ -55,35 +77,572 @@ end s = compute_centroid(tri) ```` +```` +2-element Vector{Float64}: + 0.5106629621450203 + 0.477077379328767 +```` + We need to use the `solid` identifier because triangulations are made up of both _solid_ and _ghost_ vertices/edges/triangles, for reasons described in the [manual](../manual/ghost_triangles.md). If we just use [`each_vertex(tri)`](@ref each_vertex), then we also find a vertex `-1` that corresponds to the boundary. For example, the points on the boundary can be obtained using: -````@example unconstrained +````julia get_neighbours(tri, -1) ```` +```` +Set{Int64} with 18 elements: + 456 + 176 + 425 + 258 + 325 + 398 + 197 + 219 + 319 + 262 + 112 + 345 + 371 + 232 + 245 + 163 + 468 + 140 +```` + One reason to be careful with this especially is that `get_point(tri, -1)` does actually correspond to a coordinate, -````@example unconstrained +````julia get_point(tri, -1) ```` +```` +(0.500547641525688, 0.497711096515429) +```` + (This is the pole of inaccessibility for the domain; see [here](../tutorials/pole_of_inaccessibility.md) for more details.) You can use [`each_vertex`](@ref) or [`each_ghost_vertex`](@ref) to consider all types of vertices or only the ghost vertices. If you just want the vertices, use `each_vertex(tri)`, which will also include the ghost vertex. -````@example unconstrained +````julia each_vertex(tri) ```` +```` +Set{Int64} with 501 elements: + 319 + 185 + 420 + 365 + 422 + 263 + 242 + 183 + 224 + 177 + 77 + 172 + 103 + 59 + 211 + 358 + 366 + 414 + 116 + 79 + 279 + 485 + 46 + 152 + 250 + 448 + 438 + 436 + 454 + 154 + 206 + 500 + 40 + 245 + 325 + 145 + 444 + 342 + 457 + 460 + 351 + 158 + 92 + 118 + 162 + 494 + 93 + 304 + 18 + 349 + 368 + 217 + 61 + 412 + 212 + 474 + 223 + 285 + 198 + 331 + 80 + 51 + 490 + 143 + 330 + 284 + 419 + 367 + 186 + 90 + 456 + 316 + 179 + 52 + 369 + 356 + 487 + 85 + 406 + 10 + 261 + 484 + 340 + 329 + 466 + 241 + 236 + 190 + 14 + 357 + 403 + 123 + 305 + 197 + 233 + 196 + 408 + 324 + 54 + 327 + 62 + 205 + 483 + 122 + 58 + 385 + 321 + 318 + 87 + 317 + 248 + 202 + 455 + 160 + 289 + 49 + 396 + 131 + 373 + 53 + 492 + 286 + 181 + 446 + 56 + 429 + 425 + 60 + 220 + 308 + 67 + 215 + 404 + 168 + 431 + 364 + 479 + 75 + 111 + 66 + 280 + 374 + 141 + 278 + 477 + 450 + 135 + 138 + 107 + 170 + 238 + 22 + 391 + 288 + 400 + 113 + 283 + 309 + 55 + 265 + 136 + 117 + 218 + 28 + 84 + 203 + 353 + 292 + 232 + 240 + 147 + 415 + 146 + 390 + 380 + 424 + 193 + 226 + 488 + 17 + 271 + 335 + 426 + 89 + 214 + 48 + 493 + 134 + 473 + 253 + 64 + 394 + 410 + 486 + 300 + 171 + 478 + 216 + 108 + 382 + 2 + 27 + 124 + 273 + 312 + 290 + 20 + 81 + 398 + 9 + 189 + 409 + 249 + 395 + 372 + 88 + 260 + 37 + 121 + 311 + 281 + 174 + 496 + 322 + 269 + 262 + 320 + 151 + 244 + 434 + 277 + 377 + 34 + 50 + 243 + 194 + 301 + 458 + -1 + 106 + 102 + 259 + 379 + 21 + 440 + 192 + 362 + 47 + 407 + 178 + 387 + 306 + 472 + 155 + 293 + 499 + 73 + 251 + 115 + 112 + 86 + 207 + 465 + 430 + 23 + 264 + 41 + 68 + 130 + 125 + 339 + 336 + 343 + 468 + 100 + 230 + 195 + 388 + 222 + 276 + 381 + 247 + 184 + 1 + 435 + 137 + 427 + 237 + 270 + 33 + 254 + 482 + 165 + 142 + 416 + 5 + 45 + 418 + 449 + 282 + 393 + 437 + 148 + 36 + 7 + 95 + 25 + 296 + 476 + 341 + 287 + 19 + 44 + 266 + 31 + 29 + 303 + 159 + 463 + 101 + 360 + 462 + 246 + 97 + 402 + 413 + 110 + 30 + 234 + 272 + 182 + 164 + 470 + 267 + 4 + 359 + 328 + 69 + 11 + 119 + 495 + 307 + 144 + 257 + 352 + 200 + 187 + 213 + 227 + 109 + 445 + 453 + 498 + 120 + 297 + 24 + 464 + 433 + 447 + 314 + 480 + 315 + 268 + 497 + 32 + 471 + 239 + 191 + 150 + 199 + 361 + 98 + 411 + 310 + 169 + 180 + 428 + 347 + 375 + 332 + 229 + 163 + 467 + 338 + 3 + 96 + 35 + 348 + 417 + 333 + 376 + 12 + 82 + 71 + 208 + 26 + 127 + 389 + 295 + 57 + 475 + 397 + 129 + 78 + 133 + 72 + 258 + 252 + 313 + 354 + 299 + 345 + 231 + 432 + 114 + 337 + 275 + 363 + 378 + 176 + 469 + 451 + 157 + 392 + 16 + 370 + 489 + 74 + 228 + 105 + 399 + 421 + 166 + 274 + 15 + 6 + 219 + 153 + 139 + 13 + 405 + 104 + 302 + 43 + 39 + 443 + 126 + 441 + 156 + 439 + 346 + 344 + 294 + 481 + 161 + 383 + 401 + 209 + 323 + 8 + 83 + 201 + 99 + 491 + 386 + 461 + 334 + 423 + 210 + 63 + 91 + 173 + 256 + 188 + 355 + 235 + 204 + 384 + 371 + 76 + 167 + 42 + 132 + 140 + 442 + 255 + 291 + 452 + 94 + 225 + 128 + 70 + 350 + 38 + 326 + 221 + 175 + 459 + 149 + 65 + 298 +```` + ## Iterating over edges We can also iterate over the edges of the triangulation using [`each_solid_edge`](@ref), or [`each_edge`](@ref) for both solid and ghost edges and [`each_ghost_edge`](@ref) for only the ghost edges. To give an example, here we compute the average length of an edge. -````@example unconstrained +````julia function compute_mean_edge_length(tri) ℓ = 0.0 for e in each_solid_edge(tri) @@ -97,12 +656,1517 @@ end ℓ = compute_mean_edge_length(tri) ```` +```` +0.05645693808033534 +```` + By default, the triangulation has ghost edges, so [`each_edge`](@ref) and [`each_solid_edge`](@ref) are not the same. -````@example unconstrained +````julia each_edge(tri) ```` +```` +Set{Tuple{Int64, Int64}} with 1497 elements: + (453, 388) + (276, 329) + (17, 12) + (382, 127) + (4, 197) + (366, 352) + (34, 313) + (407, 106) + (114, 56) + (194, 90) + (263, 136) + (498, 388) + (345, 446) + (343, 47) + (375, 33) + (412, 433) + (292, 304) + (290, 127) + (274, 334) + (427, 176) + (29, 16) + (435, 472) + (124, 320) + (424, 311) + (272, 41) + (63, 413) + (458, 50) + (208, 156) + (404, 171) + (94, 132) + (261, 103) + (229, 139) + (250, 352) + (358, 117) + (412, 240) + (237, 363) + (196, 199) + (55, 158) + (11, 228) + (149, 442) + (299, 286) + (451, 36) + (217, 353) + (241, 471) + (338, 139) + (379, 186) + (410, 496) + (167, 30) + (359, 403) + (452, 371) + (112, -1) + (372, 223) + (480, 195) + (322, 80) + (138, 145) + (277, 284) + (219, 19) + (243, 57) + (24, 336) + (271, 18) + (262, 244) + (140, 413) + (116, 128) + (183, 328) + (312, 82) + (296, 499) + (235, 173) + (239, 274) + (43, 334) + (78, 156) + (150, 483) + (34, 284) + (26, 165) + (494, 65) + (273, 322) + (234, 392) + (356, 224) + (346, 159) + (381, 406) + (262, 198) + (481, 159) + (345, 439) + (423, 210) + (6, 83) + (255, 97) + (154, 38) + (82, 160) + (282, 261) + (147, 9) + (402, 73) + (170, 171) + (445, 23) + (468, -1) + (230, 316) + (11, 14) + (115, 186) + (175, 110) + (24, 228) + (442, 246) + (466, 480) + (248, 191) + (122, 17) + (292, 338) + (430, 252) + (447, 68) + (410, 348) + (48, 249) + (272, 236) + (20, 333) + (174, 212) + (71, 435) + (452, 374) + (300, 93) + (491, 334) + (221, 135) + (279, 132) + (26, 435) + (74, 286) + (44, 484) + (370, 53) + (402, 293) + (19, 47) + (422, 170) + (129, 270) + (483, 193) + (317, 471) + (216, 260) + (195, 186) + (448, 288) + (300, 88) + (36, 406) + (230, 133) + (93, 117) + (104, 36) + (99, 491) + (327, 315) + (474, 144) + (140, 360) + (199, 68) + (279, 384) + (497, 357) + (247, 252) + (423, 44) + (202, 226) + (78, 317) + (296, 406) + (450, 473) + (184, 313) + (438, 42) + (74, 156) + (294, 215) + (447, 16) + (338, 468) + (443, 56) + (354, 139) + (381, 367) + (61, 117) + (480, 392) + (308, 191) + (97, 484) + (160, 268) + (386, 404) + (136, 180) + (369, 227) + (143, 144) + (245, 140) + (89, 124) + (181, 414) + (3, 336) + (6, 286) + (130, 389) + (148, 316) + (155, 320) + (336, 330) + (183, 141) + (151, 281) + (243, 12) + (496, 348) + (60, 366) + (457, 288) + (109, 469) + (452, 303) + (62, 464) + (10, 227) + (371, 479) + (130, 244) + (495, 472) + (254, 78) + (121, 118) + (282, 72) + (461, 7) + (316, 257) + (24, 469) + (478, 460) + (371, 168) + (108, 3) + (291, 266) + (321, 464) + (84, 206) + (279, 141) + (481, 346) + (179, 307) + (106, 376) + (225, 266) + (292, 169) + (412, 291) + (213, 306) + (74, 160) + (280, 426) + (245, 402) + (273, 290) + (390, 500) + (122, 353) + (452, 168) + (220, 315) + (162, 164) + (91, 209) + (385, 297) + (405, 396) + (28, 411) + (273, 2) + (256, 25) + (240, 253) + (126, 45) + (373, 422) + (296, 367) + (129, 230) + (138, 358) + (260, 20) + (206, 462) + (167, 67) + (150, 469) + (488, 206) + (377, 162) + (235, 220) + (335, 206) + (255, 215) + (59, 423) + (350, 476) + (133, 468) + (487, 55) + (22, 116) + (155, 311) + (167, 308) + (42, 308) + (450, 77) + (354, 468) + (166, 435) + (345, 468) + (398, 325) + (350, 323) + (69, 106) + (113, 116) + (145, 462) + (441, 482) + (213, 114) + (215, 365) + (351, 278) + (309, 358) + (25, 389) + (493, 436) + (453, 102) + (322, 2) + (386, 45) + (461, 439) + (272, 313) + (385, 149) + (335, 411) + (345, 197) + (59, 44) + (233, 307) + (205, 200) + (255, 294) + (429, 319) + (499, 260) + (41, 281) + (459, 401) + (215, 232) + (64, 436) + (138, 224) + (11, 458) + (480, 379) + (324, 136) + (318, 352) + (189, 500) + (97, 295) + (493, 134) + (420, 95) + (113, 380) + (316, 76) + (231, 264) + (344, 405) + (476, 127) + (456, 371) + (377, 342) + (119, 72) + (115, 118) + (354, 489) + (447, 52) + (428, 363) + (276, 281) + (486, 310) + (452, 393) + (160, 144) + (377, 444) + (223, 141) + (378, 130) + (489, 468) + (309, 177) + (213, 252) + (370, 105) + (59, 323) + (434, 478) + (437, 212) + (450, 232) + (312, 310) + (109, 50) + (273, 250) + (339, 118) + (432, 86) + (208, 241) + (154, 83) + (414, 220) + (310, 114) + (120, 72) + (96, 362) + (195, 118) + (466, 234) + (499, 20) + (289, 70) + (16, 68) + (370, 68) + (261, 188) + (160, 55) + (23, 9) + (15, 421) + (383, 385) + (373, 117) + (48, 471) + (302, 483) + (480, 186) + (256, 49) + (64, 79) + (494, 266) + (43, 274) + (313, 236) + (438, 308) + (368, 111) + (28, 433) + (173, 405) + (298, 449) + (283, 353) + (175, 396) + (130, 96) + (225, 482) + (306, 229) + (182, 285) + (105, 68) + (279, 437) + (324, 470) + (322, 250) + (340, 135) + (63, 184) + (76, 270) + (499, 216) + (84, 415) + (237, 249) + (147, 422) + (157, 207) + (219, 197) + (461, 247) + (42, 455) + (446, 265) + (103, 393) + (245, 429) + (205, 164) + (382, 426) + (33, 92) + (194, 206) + (328, 223) + (439, 468) + (51, 111) + (163, -1) + (370, 16) + (181, 283) + (466, 91) + (62, 384) + (445, 51) + (194, 154) + (132, 87) + (335, 224) + (254, 409) + (273, 366) + (177, 131) + (46, 286) + (216, 103) + (104, 130) + (78, 387) + (410, 193) + (493, 224) + (330, 31) + (370, 251) + (214, 422) + (116, 418) + (79, 449) + (175, 405) + (54, 107) + (87, 384) + (1, 467) + (456, 303) + (326, 202) + (105, 190) + (298, 289) + (80, 341) + (45, 9) + (85, 159) + (54, 97) + (181, 442) + (150, 330) + (138, 117) + (312, 268) + (91, 58) + (201, 343) + (133, 337) + (185, 289) + (408, 477) + (22, 221) + (105, 251) + (420, 33) + (80, 476) + (185, 270) + (17, 353) + (35, 313) + (60, 140) + (55, 144) + (69, 368) + (448, 131) + (432, 10) + (113, 221) + (378, 178) + (69, 376) + (242, 270) + (100, 410) + (80, 323) + (189, 390) + (340, 29) + (488, 84) + (487, 19) + (437, 467) + (84, 187) + (163, 295) + (470, 37) + (90, 83) + (420, 87) + (420, 137) + (99, 125) + (378, 47) + (309, 117) + (445, 61) + (137, 347) + (54, 210) + (425, 371) + (473, 232) + (429, 234) + (473, 297) + (19, 158) + (415, 187) + (237, 428) + (248, 141) + (267, 93) + (496, 193) + (25, 460) + (487, 201) + (464, 212) + (358, 13) + (307, 281) + (333, 367) + (191, 223) + (472, 134) + (301, 214) + (296, 20) + (476, 290) + (262, 497) + (67, 30) + (205, 66) + (22, 113) + (194, 335) + (457, 131) + (75, 182) + (222, 180) + (267, 88) + (299, 106) + (258, -1) + (279, 248) + (243, 17) + (53, 135) + (279, 87) + (436, 289) + (35, 284) + (307, 348) + (476, 2) + (461, 430) + (175, 388) + (48, 65) + (277, 32) + (243, 59) + (474, 286) + (242, 385) + (157, 275) + (28, 38) + (345, -1) + (438, 455) + (181, 246) + (208, 78) + (104, 451) + (456, 425) + (256, 130) + (397, 458) + (33, 500) + (40, 33) + (357, 431) + (332, 26) + (220, 246) + (465, 361) + (403, 431) + (95, 347) + (310, 82) + (263, 222) + (397, 50) + (76, 123) + (237, 154) + (250, 318) + (395, 297) + (283, 442) + (493, 200) + (93, 5) + (162, 165) + (4, 158) + (93, 142) + (238, 371) + (497, 333) + (278, 110) + (466, 209) + (211, 276) + (176, -1) + (369, 346) + (450, 355) + (32, 121) + (324, 287) + (377, 177) + (69, 9) + (361, 368) + (488, 117) + (361, 376) + (486, 213) + (219, 47) + (482, 253) + (287, 410) + (136, 470) + (240, 291) + (196, 296) + (387, 268) + (366, 388) + (443, 306) + (60, 360) + (322, 203) + (279, 62) + (301, 422) + (264, 116) + (419, 443) + (432, 475) + (494, 202) + (464, 92) + (302, 10) + (331, 254) + (298, 123) + (438, 58) + (148, 253) + (273, 352) + (357, 161) + (188, 251) + (138, 462) + (196, 401) + (359, 216) + (316, 441) + (451, 367) + (207, 77) + (64, 70) + (57, 80) + (27, 221) + (472, 146) + (471, 249) + (299, 143) + (11, 108) + (58, 209) + (169, 304) + (180, 37) + (340, 53) + (390, 391) + (58, 308) + (263, 305) + (172, 339) + (267, 300) + (113, 135) + (228, 458) + (197, 446) + (24, 3) + (489, 252) + (424, 140) + (107, 210) + (401, 362) + (351, 276) + (266, 253) + (481, 10) + (302, 259) + (456, 416) + (485, 233) + (400, 374) + (194, 84) + (228, 50) + (219, -1) + (478, 69) + (11, 171) + (344, 192) + (27, 119) + (100, 193) + (443, 114) + (147, 170) + (331, 202) + (54, 294) + (444, 327) + (463, 436) + (397, 223) + (331, 317) + (213, 229) + (376, 368) + (221, 251) + (35, 121) + (62, 437) + (470, 180) + (203, 173) + (378, 244) + (107, 423) + (454, 105) + (440, 203) + (25, 199) + (348, 281) + (419, 139) + (126, 52) + (140, 293) + (103, 403) + (490, 153) + (24, 108) + (236, 39) + (168, 491) + (14, 418) + (40, 399) + (463, 411) + (6, 90) + (424, 413) + (479, 168) + (89, 234) + (479, 491) + (371, 176) + (75, 364) + (321, 437) + (280, 44) + (162, 327) + (256, 178) + (199, 460) + (309, 101) + (375, 92) + (300, 288) + (248, 437) + (464, 375) + (446, 7) + (181, 220) + (336, 422) + (282, 103) + (394, 164) + (57, 12) + (299, 474) + (271, 188) + (222, 314) + (427, 390) + (107, 44) + (116, 14) + (27, 391) + (169, 338) + (98, 27) + (201, 106) + (353, 210) + (424, 477) + (238, 479) + (435, 146) + (158, 197) + (473, 355) + (34, 307) + (424, 63) + (93, 336) + (342, 305) + (288, 31) + (44, 426) + (153, 295) + (42, 10) + (238, 168) + (457, 305) + (465, 84) + (91, 379) + (299, 376) + (488, 462) + (285, 195) + (463, 79) + (230, 297) + (301, 117) + (241, 317) + (431, 161) + (327, 165) + (314, 180) + (432, 349) + (108, 170) + (450, 215) + (194, 38) + (454, 190) + (318, 396) + (17, 210) + (65, 363) + (266, 226) + (495, 134) + (185, 472) + (459, 362) + (167, 259) + (42, 259) + (124, 402) + (458, 128) + (84, 111) + (27, 188) + (200, 134) + (242, 472) + (104, 244) + (219, 198) + (74, 474) + (372, 30) + (264, 218) + (286, 156) + (481, 475) + (465, 187) + (82, 158) + (166, 71) + (42, 432) + (205, 13) + (368, 23) + (371, -1) + (58, 455) + (98, 500) + (284, 233) + (129, 395) + (61, 23) + (458, 328) + (63, 313) + (37, 110) + (140, -1) + (130, 459) + (211, 329) + (451, 333) + (399, 212) + (62, 87) + (407, 69) + (81, 450) + (58, 1) + (147, 386) + (11, 116) + (488, 111) + (404, 418) + (182, 172) + (60, 39) + (404, 45) + (148, 240) + (359, 103) + (41, 307) + (487, 343) + (289, 270) + (51, 23) + (266, 433) + (179, 233) + (188, 72) + (18, 190) + (369, 233) + (263, 192) + (202, 139) + (237, 65) + (230, 257) + (424, 364) + (201, 143) + (137, 218) + (248, 1) + (447, 199) + (258, 398) + (34, 272) + (94, 458) + (140, 258) + (311, 477) + (40, 176) + (417, 171) + (133, 338) + (428, 154) + (258, 290) + (125, 119) + (445, 488) + (235, 57) + (135, 418) + (466, 399) + (354, 338) + (50, 30) + (319, -1) + (400, 393) + (97, 365) + (211, 102) + (366, 102) + (335, 8) + (88, 101) + (492, 153) + (256, 389) + (15, 37) + (300, 31) + (250, 440) + (15, 348) + (220, 435) + (308, 1) + (60, 184) + (113, 418) + (155, 234) + (321, 62) + (200, 224) + (324, 421) + (485, 369) + (85, 86) + (354, 229) + (216, 431) + (485, 179) + (234, 319) + (25, 459) + (121, 159) + (89, 429) + (196, 105) + (398, 44) + (494, 363) + (39, 281) + (436, 356) + (125, 391) + (463, 28) + (342, 192) + (456, 112) + (330, 469) + (415, 286) + (400, 416) + (66, 435) + (243, 210) + (28, 449) + (340, 370) + (309, 142) + (340, 16) + (382, 476) + (85, 115) + (138, 13) + (147, 373) + (18, 261) + (285, 155) + (117, 5) + (350, 80) + (196, 68) + (273, 476) + (181, 122) + (466, 392) + (486, 7) + (49, 343) + (349, 10) + (382, 323) + (245, -1) + (152, 90) + (249, 83) + (230, 76) + (198, 378) + (81, 215) + (133, 169) + (15, 351) + (293, 477) + (325, -1) + (203, 396) + (243, 423) + (427, 391) + (287, 136) + (7, 265) + (154, 90) + (386, 417) + (220, 327) + (219, 158) + (137, 22) + (380, 418) + (198, 47) + (98, 390) + (419, 306) + (372, 67) + (453, 498) + (216, 161) + (208, 46) + (489, 229) + (262, 431) + (312, 56) + (235, 12) + (190, 251) + (388, 110) + (289, 123) + (20, 161) + (278, 276) + (403, 112) + (104, 96) + (409, 56) + (126, 9) + (462, 117) + (165, 164) + (81, 294) + (54, 157) + (184, 413) + (434, 201) + (203, 405) + (174, 209) + (35, 32) + (260, 161) + (42, 349) + (214, 5) + (243, 341) + (373, 23) + (388, 278) + (24, 109) + (455, 86) + (183, 223) + (421, 410) + (292, 202) + (287, 288) + (364, 339) + (153, 325) + (35, 424) + (352, 175) + (148, 76) + (298, 412) + (457, 377) + (428, 433) + (75, 339) + (194, 8) + (435, 246) + (15, 410) + (386, 9) + (288, 483) + (398, 492) + (478, 126) + (86, 159) + (209, 467) + (163, 365) + (408, 293) + (243, 323) + (3, 422) + (136, 222) + (174, 437) + (344, 342) + (225, 304) + (11, 128) + (344, 444) + (200, 495) + (465, 111) + (258, 366) + (416, 374) + (326, 304) + (408, 155) + (303, 371) + (163, 232) + (167, 372) + (409, 443) + (223, 50) + (64, 289) + (231, 116) + (211, 269) + (48, 317) + (53, 251) + (284, 313) + (456, -1) + (402, 140) + (277, 346) + (393, 374) + (184, 360) + (394, 13) + (404, 14) + (331, 78) + (71, 146) + (414, 12) + (120, 119) + (361, 187) + (478, 49) + (196, 362) + (485, 496) + (429, 73) + (142, 101) + (256, 460) + (343, 19) + (362, 36) + (288, 305) + (312, 160) + (387, 56) + (54, 275) + (60, 236) + (22, 264) + (29, 135) + (441, 169) + (490, 295) + (450, 207) + (189, 33) + (65, 249) + (347, 218) + (40, 212) + (232, 468) + (196, 406) + (49, 178) + (98, 221) + (416, 303) + (97, 107) + (6, 152) + (169, 257) + (151, 39) + (136, 305) + (303, 374) + (301, 373) + (395, 270) + (441, 253) + (427, 479) + (400, 403) + (6, 46) + (430, 7) + (261, 72) + (295, 365) + (177, 88) + (409, 139) + (409, 202) + (198, 244) + (451, 497) + (377, 131) + (242, 395) + (427, 491) + (11, 170) + (282, 334) + (96, 459) + (135, 251) + (318, 440) + (492, 484) + (427, 99) + (172, 118) + (60, 329) + (381, 296) + (197, -1) + (157, 77) + (299, 415) + (10, 475) + (119, 188) + (454, 18) + (350, 382) + (383, 473) + (240, 123) + (132, 347) + (241, 78) + (129, 297) + (262, 104) + (301, 5) + (133, 232) + (283, 157) + (74, 268) + (57, 203) + (133, 297) + (302, 485) + (109, 30) + (428, 38) + (147, 23) + (376, 187) + (75, 155) + (400, 112) + (434, 49) + (395, 385) + (302, 150) + (387, 156) + (448, 88) + (440, 396) + (8, 411) + (137, 95) + (200, 138) + (351, 281) + (455, 432) + (381, 36) + (6, 471) + (413, 360) + (154, 249) + (351, 37) + (310, 4) + (98, 391) + (337, 297) + (262, 219) + (351, 348) + (314, 110) + (275, 353) + (98, 22) + (267, 101) + (254, 56) + (300, 336) + (176, 319) + (40, 92) + (308, 259) + (389, 459) + (453, 278) + (60, 102) + (269, 276) + (420, 375) + (498, 278) + (216, 105) + (437, 209) + (379, 455) + (51, 368) + (40, 189) + (150, 30) + (107, 484) + (495, 66) + (192, 405) + (225, 169) + (151, 276) + (41, 39) + (231, 218) + (302, 193) + (29, 404) + (448, 457) + (323, 426) + (291, 253) + (200, 66) + (133, 257) + (425, -1) + (25, 401) + (341, 323) + (271, 190) + (225, 253) + (179, 496) + (27, 125) + (332, 164) + (108, 228) + (247, 439) + (299, 144) + (420, 500) + (180, 110) + (486, 430) + (399, 319) + (271, 251) + (383, 77) + (119, 334) + (6, 415) + (191, 141) + (359, 431) + (89, 73) + (282, 393) + (344, 315) + (121, 339) + (174, 399) + (283, 275) + (454, 216) + (60, 258) + (285, 118) + (212, 92) + (102, 276) + (444, 342) + (167, 150) + (331, 494) + (445, 111) + (424, 293) + (119, 491) + (3, 170) + (82, 4) + (408, 320) + (448, 300) + (466, 174) + (228, 109) + (368, 9) + (457, 342) + (85, 121) + (345, 265) + (434, 343) + (435, 165) + (81, 207) + (379, 58) + (325, 163) + (390, 176) + (192, 222) + (120, 334) + (179, 348) + (489, 213) + (230, 270) + (231, 128) + (235, 414) + (397, 328) + (402, 429) + (331, 409) + (102, 388) + (277, 233) + (358, 394) + (222, 405) + (32, 159) + (81, 157) + (231, 94) + (417, 170) + (232, 337) + (280, 258) + (148, 441) + (162, 444) + (452, 239) + (420, 98) + (89, 155) + (97, 294) + (185, 134) + (26, 164) + (27, 251) + (34, 233) + (74, 144) + (124, 73) + (70, 79) + (355, 77) + (85, 118) + (262, 403) + (4, 446) + (239, 334) + (262, 357) + (155, 195) + (71, 204) + (235, 315) + (494, 428) + (442, 77) + (29, 418) + (29, 45) + (361, 111) + (383, 297) + (271, 261) + (122, 12) + (35, 63) + (321, 212) + (91, 480) + (332, 66) + (298, 79) + (463, 449) + (150, 31) + (225, 226) + (34, 41) + (122, 217) + (80, 2) + (302, 227) + (97, 492) + (124, 293) + (115, 195) + (145, 206) + (204, 146) + (239, 168) + (239, 491) + (408, 311) + (60, 151) + (326, 226) + (436, 411) + (487, 158) + (471, 83) + (232, -1) + (499, 105) + (192, 305) + (52, 460) + (473, 337) + (308, 223) + (149, 77) + (262, 112) + (100, 483) + (490, 163) + (346, 227) + (132, 183) + (436, 134) + (490, 325) + (481, 227) + (189, 176) + (177, 358) + (478, 407) + (335, 356) + (84, 90) + (441, 257) + (312, 387) + (373, 61) + (157, 442) + (8, 28) + (94, 183) + (162, 394) + (419, 229) + (75, 285) + (59, 426) + (95, 87) + (291, 433) + (383, 149) + (272, 39) + (280, 127) + (255, 365) + (66, 26) + (493, 356) + (76, 240) + (398, 484) + (181, 12) + (175, 314) + (379, 86) + (38, 433) + (262, 451) + (149, 146) + (202, 304) + (435, 327) + (497, 161) + (181, 217) + (235, 203) + (199, 401) + (267, 142) + (247, 468) + (469, 30) + (55, 143) + (310, 7) + (436, 79) + (166, 442) + (269, 329) + (32, 346) + (486, 114) + (46, 471) + (379, 115) + (298, 433) + (439, 265) + (155, 392) + (35, 364) + (282, 274) + (352, 396) + (126, 69) + (242, 146) + (421, 470) + (151, 329) + (312, 114) + (393, 274) + (485, 193) + (115, 86) + (478, 52) + (116, 380) + (310, 446) + (454, 103) + (494, 48) + (298, 240) + (131, 88) + (15, 470) + (433, 449) + (404, 417) + (97, 153) + (204, 149) + (475, 159) + (239, 393) + (8, 38) + (364, 311) + (447, 45) + (54, 81) + (275, 210) + (364, 121) + (447, 126) + (58, 467) + (99, 119) + (132, 218) + (408, 124) + (75, 311) + (268, 156) + (166, 204) + (287, 483) + (203, 80) + (201, 55) + (279, 183) + (434, 407) + (398, -1) + (160, 158) + (322, 440) + (270, 123) + (31, 483) + (247, 430) + (137, 264) + (242, 185) + (461, 265) + (96, 36) + (93, 214) + (14, 171) + (365, 232) + (247, 489) + (94, 218) + (302, 42) + (302, 167) + (432, 159) + (486, 252) + (200, 13) + (72, 334) + (248, 467) + (202, 338) + (495, 435) + (162, 358) + (102, 329) + (195, 392) + (308, 372) + (49, 460) + (287, 100) + (331, 48) + (206, 224) + (444, 315) + (57, 341) + (166, 246) + (62, 375) + (287, 421) + (278, 37) + (356, 411) + (152, 415) + (273, 258) + (296, 105) + (205, 332) + (434, 21) + (494, 226) + (239, 43) + (18, 103) + (283, 217) + (20, 367) + (333, 161) + (145, 224) + (314, 405) + (99, 391) + (393, 403) + (372, 50) + (426, 127) + (262, -1) + (87, 375) + (299, 201) + (436, 185) + (434, 106) + (87, 347) + (52, 199) + (300, 330) + (336, 469) + (277, 369) + (409, 419) + (287, 305) + (176, 479) + (89, 320) + (242, 149) + (344, 235) + (162, 177) + (45, 16) + (152, 84) + (285, 172) + (169, 482) + (94, 128) + (184, 236) + (416, 112) + (383, 355) + (40, 319) + (309, 93) + (381, 451) + (245, 319) + (362, 406) + (453, 276) + (492, 325) + (344, 173) + (407, 21) + (241, 46) + (234, 399) + (78, 56) + (326, 225) + (494, 433) + (280, 398) + (130, 178) + (386, 170) + (204, 442) + (284, 32) + (352, 388) + (191, 1) + (485, 227) + (415, 376) + (93, 422) + (205, 394) + (309, 88) + (21, 106) + (306, 114) + (94, 328) + (343, 378) + (343, 178) + (182, 339) + (488, 61) + (208, 286) + (280, 290) + (298, 70) + (98, 137) +```` + Note also that the edges are all given as unordered, so the set of edges only includes one of `(i, j)` and `(j, i)` for each edge `(i, j)`. @@ -111,7 +2175,7 @@ Similarly, we can iterate over the triangles using [`each_solid_triangle`](@ref) or [`each_triangle`](@ref). By default, ghost triangles are included in the output. Here we compute the area of the domain by getting the area of each triangle. -````@example unconstrained +````julia area(p, q, r) = 0.5 * ((getx(q) - getx(p)) * (gety(r) - gety(p)) - (gety(q) - gety(p)) * (getx(r) - getx(p))) function compute_triangulation_area(tri) A = 0.0 @@ -125,13 +2189,1019 @@ end A = compute_triangulation_area(tri) ```` +```` +0.9683345161527972 +```` + (You can compute areas like this using [`get_area(tri)`](@ref get_area).) You can access the set of `triangles` using [`get_triangles(tri)`](@ref get_triangles): -````@example unconstrained +````julia get_triangles(tri) ```` +```` +Set{Tuple{Int64, Int64, Int64}} with 998 elements: + (59, 426, 44) + (163, 365, 295) + (383, 473, 297) + (499, 260, 216) + (185, 134, 472) + (239, 43, 274) + (300, 31, 288) + (113, 135, 221) + (461, 7, 430) + (230, 257, 316) + (57, 203, 80) + (277, 284, 233) + (74, 144, 474) + (398, 484, 44) + (288, 31, 483) + (361, 368, 111) + (450, 77, 207) + (220, 327, 315) + (151, 329, 276) + (196, 401, 362) + (255, 294, 97) + (35, 121, 364) + (485, 227, 369) + (452, 303, 371) + (150, 330, 469) + (395, 385, 297) + (296, 499, 105) + (335, 356, 411) + (344, 444, 342) + (407, 69, 106) + (382, 127, 426) + (412, 240, 291) + (287, 136, 305) + (354, 489, 229) + (211, 276, 269) + (400, 112, 416) + (420, 500, 33) + (479, 491, 168) + (262, 104, 244) + (282, 261, 103) + (448, 88, 300) + (97, 492, 153) + (3, 422, 170) + (470, 37, 180) + (97, 295, 365) + (196, 199, 401) + (318, 440, 396) + (292, 169, 338) + (99, 119, 491) + (243, 59, 423) + (381, 406, 36) + (332, 164, 26) + (55, 143, 144) + (150, 469, 30) + (335, 206, 224) + (185, 270, 289) + (91, 379, 58) + (220, 246, 435) + (138, 224, 145) + (245, -1, 140) + (75, 311, 364) + (485, 369, 233) + (434, 49, 478) + (344, 405, 173) + (74, 156, 268) + (192, 222, 405) + (29, 135, 418) + (177, 88, 131) + (6, 83, 471) + (20, 333, 161) + (457, 288, 305) + (377, 162, 177) + (408, 311, 155) + (354, 338, 468) + (267, 88, 101) + (478, 69, 407) + (358, 394, 13) + (245, 429, 319) + (107, 423, 44) + (113, 380, 418) + (342, 305, 192) + (398, 325, 492) + (137, 95, 347) + (256, 25, 460) + (369, 227, 346) + (296, 367, 20) + (453, 276, 102) + (27, 188, 119) + (267, 101, 142) + (377, 342, 444) + (352, 396, 175) + (419, 229, 306) + (397, 328, 223) + (354, 468, 489) + (238, 479, 168) + (104, 96, 130) + (454, 18, 190) + (163, -1, 232) + (211, 329, 102) + (402, 73, 429) + (464, 92, 212) + (371, 176, 479) + (434, 106, 201) + (296, 20, 499) + (326, 225, 304) + (216, 260, 161) + (20, 367, 333) + (282, 274, 334) + (248, 1, 191) + (133, 468, 338) + (11, 116, 128) + (261, 72, 188) + (301, 373, 422) + (434, 343, 49) + (174, 212, 399) + (75, 339, 182) + (174, 209, 437) + (345, 439, 468) + (302, 42, 10) + (262, 497, 451) + (466, 234, 392) + (256, 389, 25) + (219, 158, 197) + (332, 26, 66) + (167, 30, 67) + (25, 459, 401) + (497, 357, 161) + (420, 98, 500) + (75, 182, 285) + (463, 449, 28) + (300, 93, 336) + (75, 285, 155) + (98, 221, 27) + (456, 112, -1) + (225, 253, 482) + (366, 352, 388) + (456, 303, 416) + (201, 143, 55) + (312, 114, 310) + (11, 14, 116) + (129, 270, 395) + (299, 474, 144) + (205, 164, 332) + (104, 130, 244) + (96, 36, 362) + (243, 210, 17) + (345, 446, 265) + (76, 123, 270) + (105, 190, 251) + (235, 220, 315) + (94, 458, 128) + (85, 115, 118) + (407, 106, 21) + (478, 49, 460) + (489, 252, 213) + (476, 290, 127) + (133, 337, 232) + (66, 26, 435) + (231, 116, 264) + (113, 116, 380) + (486, 114, 213) + (428, 38, 433) + (18, 103, 261) + (298, 240, 412) + (487, 343, 201) + (302, 10, 227) + (322, 440, 250) + (58, 308, 1) + (32, 346, 159) + (121, 118, 339) + (441, 257, 169) + (107, 44, 484) + (115, 186, 195) + (410, 496, 348) + (126, 45, 9) + (465, 187, 361) + (181, 442, 246) + (487, 55, 158) + (263, 136, 222) + (136, 470, 180) + (43, 334, 274) + (40, 399, 212) + (42, 432, 349) + (242, 146, 149) + (488, 61, 117) + (300, 336, 330) + (463, 411, 436) + (409, 139, 419) + (445, 111, 51) + (109, 50, 30) + (120, 119, 72) + (220, 435, 327) + (429, 234, 319) + (107, 210, 423) + (428, 154, 38) + (438, 42, 308) + (424, 364, 311) + (331, 409, 254) + (438, 58, 455) + (242, 270, 185) + (267, 93, 300) + (420, 33, 375) + (461, 247, 439) + (11, 128, 458) + (255, 215, 294) + (6, 46, 286) + (299, 144, 143) + (404, 171, 417) + (448, 457, 131) + (300, 330, 31) + (235, 12, 414) + (189, 500, 390) + (242, 149, 385) + (208, 286, 46) + (191, 223, 141) + (379, 86, 455) + (318, 396, 352) + (54, 107, 97) + (24, 469, 336) + (219, 198, 47) + (11, 458, 228) + (301, 214, 5) + (175, 110, 388) + (29, 404, 45) + (271, 251, 190) + (194, 84, 206) + (26, 164, 165) + (228, 50, 109) + (242, 185, 472) + (78, 387, 156) + (279, 248, 141) + (299, 415, 286) + (260, 20, 161) + (280, 398, 44) + (434, 201, 343) + (494, 433, 266) + (485, 496, 193) + (262, 451, 104) + (495, 435, 472) + (283, 275, 157) + (494, 48, 65) + (480, 392, 195) + (147, 422, 373) + (245, 402, 429) + (243, 57, 341) + (85, 159, 86) + (435, 146, 472) + (208, 241, 78) + (277, 346, 32) + (344, 192, 405) + (179, 233, 307) + (312, 160, 268) + (243, 323, 59) + (465, 84, 187) + (248, 467, 1) + (452, 371, 168) + (340, 29, 16) + (350, 80, 476) + (239, 334, 43) + (282, 334, 72) + (183, 223, 328) + (478, 460, 52) + (203, 173, 405) + (489, 213, 229) + (345, 197, 446) + (148, 76, 316) + (35, 313, 284) + (211, 102, 276) + (240, 253, 291) + (81, 207, 157) + (279, 384, 62) + (383, 355, 473) + (145, 206, 462) + (176, -1, 319) + (488, 117, 462) + (167, 67, 372) + (344, 315, 444) + (285, 195, 155) + (6, 152, 90) + (237, 154, 428) + (119, 188, 72) + (175, 405, 314) + (202, 338, 139) + (81, 294, 215) + (166, 204, 71) + (455, 86, 432) + (408, 124, 293) + (409, 443, 56) + (15, 351, 37) + (370, 251, 53) + (381, 367, 296) + (78, 56, 387) + (452, 168, 239) + (473, 337, 297) + (147, 9, 386) + (48, 317, 471) + (243, 341, 323) + (312, 56, 114) + (126, 9, 69) + (196, 68, 199) + (271, 18, 261) + (383, 77, 355) + (494, 226, 202) + (345, 468, -1) + (54, 210, 107) + (222, 314, 405) + (194, 38, 154) + (343, 378, 178) + (256, 130, 389) + (456, -1, 425) + (89, 73, 124) + (98, 391, 390) + (89, 320, 155) + (492, 325, 153) + (481, 475, 159) + (345, 265, 439) + (424, 477, 293) + (254, 56, 78) + (60, 366, 102) + (437, 209, 467) + (167, 372, 308) + (445, 51, 23) + (488, 462, 206) + (154, 83, 90) + (40, 212, 92) + (150, 483, 31) + (22, 116, 113) + (415, 376, 187) + (343, 47, 378) + (302, 150, 167) + (427, 391, 99) + (408, 320, 124) + (235, 57, 12) + (51, 368, 23) + (302, 485, 193) + (147, 23, 9) + (205, 332, 66) + (277, 32, 284) + (308, 372, 223) + (436, 134, 185) + (34, 233, 284) + (204, 442, 149) + (166, 71, 435) + (145, 224, 206) + (155, 195, 392) + (371, -1, 176) + (100, 193, 410) + (60, 151, 39) + (27, 251, 188) + (29, 45, 16) + (370, 16, 68) + (179, 307, 348) + (208, 78, 156) + (136, 180, 222) + (205, 13, 394) + (425, -1, 371) + (27, 221, 251) + (386, 404, 417) + (445, 488, 111) + (167, 150, 30) + (157, 77, 442) + (292, 202, 304) + (273, 366, 258) + (95, 87, 347) + (359, 431, 403) + (150, 31, 330) + (377, 177, 131) + (478, 126, 69) + (116, 418, 380) + (273, 322, 250) + (273, 290, 476) + (298, 123, 240) + (352, 175, 388) + (124, 402, 293) + (15, 410, 348) + (124, 73, 402) + (148, 253, 240) + (287, 288, 483) + (494, 266, 226) + (222, 180, 314) + (457, 342, 377) + (63, 184, 313) + (494, 428, 433) + (283, 157, 442) + (351, 276, 278) + (271, 261, 188) + (490, 325, 163) + (372, 50, 223) + (22, 264, 116) + (494, 65, 363) + (63, 413, 184) + (157, 207, 77) + (216, 161, 431) + (262, 198, 219) + (456, 416, 112) + (463, 28, 411) + (298, 289, 123) + (340, 53, 135) + (309, 177, 358) + (35, 32, 121) + (493, 436, 356) + (445, 23, 61) + (370, 68, 105) + (424, 413, 63) + (181, 122, 217) + (194, 154, 90) + (377, 444, 162) + (299, 286, 474) + (436, 185, 289) + (162, 327, 165) + (194, 8, 38) + (167, 308, 259) + (152, 415, 84) + (485, 179, 496) + (250, 440, 318) + (292, 304, 169) + (387, 268, 156) + (368, 9, 23) + (60, 140, 258) + (48, 471, 249) + (198, 378, 47) + (82, 158, 160) + (495, 472, 134) + (287, 100, 410) + (64, 289, 70) + (230, 133, 257) + (452, 239, 393) + (241, 471, 317) + (59, 323, 426) + (181, 283, 442) + (133, 338, 169) + (71, 204, 146) + (133, 169, 257) + (499, 216, 105) + (279, 87, 384) + (54, 157, 275) + (453, 102, 388) + (89, 155, 234) + (490, 163, 295) + (351, 278, 37) + (237, 363, 65) + (271, 188, 251) + (54, 97, 294) + (335, 411, 8) + (440, 203, 396) + (26, 165, 435) + (461, 439, 265) + (24, 3, 108) + (486, 7, 310) + (326, 202, 226) + (132, 218, 347) + (133, 232, 468) + (27, 125, 391) + (490, 153, 325) + (386, 45, 404) + (344, 342, 192) + (419, 139, 229) + (49, 343, 178) + (456, 425, 371) + (282, 72, 261) + (82, 4, 158) + (42, 349, 10) + (182, 172, 285) + (283, 217, 353) + (452, 374, 303) + (298, 70, 289) + (129, 297, 230) + (454, 105, 216) + (181, 414, 12) + (196, 406, 296) + (11, 171, 14) + (262, 219, -1) + (219, 197, -1) + (350, 382, 323) + (196, 362, 406) + (247, 468, 439) + (54, 81, 157) + (478, 52, 126) + (254, 409, 56) + (17, 210, 353) + (280, 258, 398) + (398, -1, 325) + (379, 115, 86) + (424, 293, 140) + (486, 310, 114) + (450, 215, 232) + (298, 433, 449) + (499, 20, 260) + (362, 36, 406) + (175, 314, 110) + (354, 229, 139) + (309, 358, 117) + (298, 449, 79) + (447, 45, 126) + (235, 203, 57) + (262, 112, 403) + (74, 160, 144) + (180, 37, 110) + (200, 495, 134) + (147, 170, 422) + (292, 338, 202) + (493, 356, 224) + (424, 140, 413) + (122, 353, 217) + (279, 132, 87) + (194, 206, 335) + (24, 228, 109) + (60, 184, 360) + (194, 90, 84) + (162, 165, 164) + (60, 39, 236) + (11, 108, 170) + (466, 91, 209) + (262, -1, 112) + (48, 249, 65) + (166, 442, 204) + (42, 455, 432) + (454, 216, 103) + (312, 82, 160) + (481, 10, 475) + (438, 455, 42) + (129, 395, 297) + (448, 300, 288) + (453, 388, 498) + (309, 93, 142) + (280, 127, 290) + (382, 426, 323) + (234, 399, 319) + (447, 52, 199) + (321, 212, 437) + (138, 117, 358) + (97, 153, 295) + (40, 33, 189) + (35, 284, 32) + (398, 492, 484) + (373, 61, 23) + (308, 191, 1) + (116, 14, 418) + (331, 254, 78) + (324, 136, 287) + (381, 296, 406) + (309, 142, 101) + (321, 464, 212) + (93, 214, 422) + (299, 376, 415) + (466, 174, 399) + (480, 186, 379) + (361, 187, 376) + (35, 63, 313) + (302, 483, 150) + (486, 213, 252) + (445, 61, 488) + (397, 50, 458) + (345, -1, 197) + (262, 357, 497) + (335, 224, 356) + (91, 58, 209) + (272, 39, 41) + (400, 374, 393) + (225, 266, 253) + (451, 497, 333) + (487, 19, 343) + (231, 218, 94) + (62, 375, 464) + (41, 281, 307) + (322, 80, 203) + (60, 258, 366) + (486, 430, 7) + (448, 131, 88) + (498, 388, 278) + (450, 355, 77) + (235, 173, 203) + (4, 446, 197) + (273, 2, 322) + (54, 294, 81) + (279, 62, 437) + (155, 392, 234) + (204, 149, 146) + (40, 176, 319) + (463, 79, 449) + (230, 76, 270) + (62, 87, 375) + (262, 244, 198) + (357, 431, 161) + (336, 469, 330) + (28, 433, 38) + (409, 419, 443) + (438, 308, 58) + (432, 159, 475) + (76, 240, 123) + (100, 483, 193) + (154, 249, 83) + (427, 99, 491) + (103, 403, 393) + (343, 19, 47) + (301, 5, 117) + (424, 311, 477) + (228, 458, 50) + (69, 376, 106) + (130, 459, 389) + (138, 145, 462) + (25, 199, 460) + (104, 451, 36) + (457, 305, 342) + (242, 385, 395) + (60, 360, 140) + (420, 87, 95) + (235, 414, 220) + (174, 437, 212) + (75, 155, 311) + (225, 169, 304) + (231, 128, 116) + (481, 346, 227) + (379, 186, 115) + (98, 390, 500) + (35, 364, 424) + (282, 103, 393) + (285, 118, 195) + (248, 437, 467) + (162, 164, 394) + (382, 476, 127) + (25, 389, 459) + (397, 223, 50) + (383, 149, 77) + (213, 114, 306) + (324, 470, 136) + (359, 103, 216) + (162, 358, 177) + (441, 482, 253) + (486, 252, 430) + (302, 193, 483) + (427, 491, 479) + (314, 180, 110) + (181, 246, 220) + (184, 413, 360) + (183, 141, 223) + (271, 190, 18) + (301, 117, 373) + (89, 124, 320) + (258, 140, -1) + (351, 348, 281) + (133, 297, 337) + (379, 455, 58) + (351, 281, 276) + (97, 107, 484) + (397, 458, 328) + (302, 259, 42) + (404, 418, 14) + (277, 233, 369) + (211, 269, 329) + (122, 12, 17) + (243, 423, 210) + (24, 108, 228) + (282, 393, 274) + (122, 17, 353) + (27, 119, 125) + (196, 296, 105) + (434, 478, 407) + (89, 429, 73) + (6, 471, 46) + (471, 83, 249) + (309, 117, 93) + (324, 287, 421) + (208, 46, 241) + (273, 258, 290) + (81, 450, 207) + (85, 86, 115) + (283, 353, 275) + (200, 66, 495) + (378, 244, 130) + (248, 191, 141) + (115, 195, 118) + (25, 401, 199) + (273, 250, 352) + (494, 363, 428) + (326, 304, 202) + (400, 416, 374) + (344, 173, 235) + (287, 410, 421) + (238, 168, 371) + (160, 55, 144) + (151, 276, 281) + (466, 480, 91) + (41, 39, 281) + (310, 7, 446) + (453, 278, 276) + (490, 295, 153) + (378, 130, 178) + (71, 146, 435) + (120, 72, 334) + (24, 109, 469) + (242, 472, 146) + (435, 165, 327) + (113, 418, 135) + (487, 201, 55) + (138, 358, 13) + (11, 228, 108) + (331, 78, 317) + (256, 178, 130) + (221, 135, 251) + (312, 387, 56) + (198, 244, 378) + (493, 134, 436) + (98, 22, 221) + (450, 232, 473) + (456, 371, 303) + (307, 281, 348) + (60, 236, 184) + (241, 317, 78) + (129, 230, 270) + (99, 125, 119) + (247, 430, 252) + (408, 477, 311) + (331, 202, 409) + (232, -1, 468) + (59, 44, 423) + (231, 94, 128) + (194, 335, 8) + (93, 5, 214) + (162, 394, 358) + (162, 444, 327) + (147, 386, 170) + (120, 334, 119) + (137, 264, 22) + (230, 297, 133) + (279, 183, 132) + (74, 474, 286) + (231, 264, 218) + (93, 117, 5) + (420, 95, 137) + (51, 111, 368) + (96, 362, 459) + (373, 117, 61) + (94, 183, 328) + (402, 140, 293) + (310, 446, 4) + (94, 218, 132) + (200, 224, 138) + (255, 97, 365) + (273, 352, 366) + (94, 132, 183) + (81, 215, 450) + (309, 88, 177) + (272, 236, 39) + (280, 426, 127) + (80, 323, 341) + (75, 364, 339) + (119, 334, 491) + (427, 479, 176) + (364, 121, 339) + (256, 49, 178) + (436, 411, 356) + (427, 390, 391) + (443, 114, 56) + (312, 310, 82) + (408, 155, 320) + (453, 498, 278) + (205, 200, 13) + (172, 339, 118) + (432, 86, 159) + (388, 110, 278) + (58, 1, 467) + (447, 68, 16) + (98, 27, 391) + (417, 171, 170) + (432, 10, 349) + (340, 135, 29) + (321, 62, 464) + (381, 451, 367) + (344, 235, 315) + (291, 253, 266) + (301, 422, 214) + (372, 30, 50) + (130, 96, 459) + (326, 226, 225) + (32, 159, 121) + (267, 300, 88) + (64, 70, 79) + (99, 391, 125) + (308, 223, 191) + (91, 480, 379) + (64, 79, 436) + (451, 333, 367) + (464, 375, 92) + (488, 206, 84) + (409, 202, 139) + (340, 16, 370) + (29, 418, 404) + (80, 2, 476) + (298, 79, 70) + (383, 385, 149) + (148, 240, 76) + (278, 110, 37) + (69, 368, 376) + (493, 224, 200) + (6, 415, 152) + (465, 111, 84) + (132, 347, 87) + (205, 394, 164) + (255, 365, 215) + (15, 470, 421) + (277, 369, 346) + (485, 233, 179) + (89, 234, 429) + (420, 137, 98) + (208, 156, 286) + (473, 232, 337) + (35, 424, 63) + (85, 118, 121) + (166, 246, 442) + (443, 306, 114) + (64, 436, 289) + (28, 449, 433) + (366, 388, 102) + (74, 286, 156) + (84, 415, 187) + (256, 460, 49) + (34, 313, 272) + (189, 33, 500) + (181, 217, 283) + (280, 290, 258) + (410, 193, 496) + (427, 176, 390) + (400, 393, 403) + (137, 218, 264) + (34, 307, 233) + (463, 436, 79) + (302, 227, 485) + (466, 399, 234) + (310, 4, 82) + (152, 84, 90) + (151, 281, 39) + (184, 236, 313) + (419, 306, 443) + (242, 395, 270) + (34, 272, 41) + (289, 270, 123) + (239, 274, 393) + (263, 222, 192) + (22, 113, 221) + (203, 405, 396) + (181, 220, 414) + (447, 199, 68) + (447, 16, 45) + (263, 192, 305) + (60, 102, 329) + (269, 276, 329) + (309, 101, 88) + (148, 316, 441) + (279, 437, 248) + (4, 197, 158) + (237, 249, 154) + (272, 313, 236) + (58, 467, 209) + (280, 44, 426) + (312, 268, 387) + (6, 286, 415) + (262, 403, 431) + (299, 106, 376) + (447, 126, 52) + (54, 275, 210) + (273, 476, 2) + (24, 336, 3) + (287, 305, 288) + (267, 142, 93) + (287, 483, 100) + (454, 190, 105) + (52, 460, 199) + (8, 411, 28) + (408, 293, 477) + (350, 323, 80) + (98, 137, 22) + (225, 482, 169) + (247, 489, 468) + (461, 430, 247) + (94, 328, 458) + (62, 384, 87) + (213, 306, 229) + (340, 370, 53) + (322, 203, 440) + (8, 28, 38) + (420, 375, 87) + (316, 257, 441) + (461, 265, 7) + (140, 360, 413) + (239, 168, 491) + (493, 200, 134) + (40, 189, 176) + (200, 138, 13) + (480, 195, 186) + (488, 84, 111) + (3, 336, 422) + (322, 2, 80) + (450, 473, 355) + (215, 365, 232) + (495, 66, 435) + (398, 258, -1) + (181, 12, 122) + (331, 48, 494) + (245, 140, 402) + (175, 396, 405) + (404, 14, 171) + (74, 268, 160) + (109, 30, 469) + (182, 339, 172) + (205, 66, 200) + (466, 392, 480) + (230, 316, 76) + (237, 428, 363) + (299, 143, 201) + (166, 435, 246) + (15, 348, 351) + (219, 19, 158) + (243, 17, 12) + (15, 37, 470) + (457, 377, 131) + (34, 41, 307) + (386, 417, 170) + (40, 319, 399) + (487, 158, 19) + (441, 169, 482) + (291, 266, 433) + (179, 348, 496) + (219, 47, 19) + (383, 297, 385) + (243, 12, 57) + (459, 362, 401) + (138, 462, 117) + (454, 103, 18) + (60, 329, 151) + (238, 371, 479) + (247, 252, 489) + (321, 437, 62) + (434, 21, 106) + (53, 251, 135) + (225, 226, 266) + (42, 259, 308) + (97, 484, 492) + (57, 80, 341) + (412, 291, 433) + (381, 36, 451) + (372, 67, 30) + (149, 442, 77) + (241, 46, 471) + (448, 288, 457) + (262, 431, 357) + (196, 105, 68) + (324, 421, 470) + (386, 9, 45) + (147, 373, 23) + (163, 325, -1) + (263, 305, 136) + (497, 161, 333) + (285, 172, 118) + (69, 9, 368) + (331, 317, 48) + (416, 303, 374) + (361, 376, 368) + (375, 33, 92) + (93, 422, 336) + (245, 319, -1) + (160, 158, 55) + (34, 284, 313) + (189, 390, 176) + (250, 318, 352) + (481, 159, 346) + (6, 90, 83) + (298, 412, 433) + (359, 216, 431) + (481, 227, 10) + (85, 121, 159) + (299, 201, 106) + (452, 393, 374) + (40, 92, 33) + (446, 7, 265) + (279, 141, 183) + (137, 347, 218) + (432, 475, 10) + (163, 232, 365) + (354, 139, 338) + (237, 65, 249) + (302, 167, 259) + (465, 361, 111) + (104, 36, 96) + (350, 476, 382) + (148, 441, 253) + (239, 491, 334) + (108, 3, 170) + (434, 407, 21) + (15, 421, 410) + (466, 209, 174) + (444, 315, 327) + (370, 105, 251) + (400, 403, 112) + (359, 403, 103) + (11, 170, 171) + (275, 353, 210) + (331, 494, 202) +```` + The triangles are all positively oriented, meaning the triangles are given such that the corresponding points are traversed in counter-clockwise order. @@ -143,75 +3213,163 @@ For a given point, there are two type of neighbours: The neighbouring vertices, and the neighbouring triangles. The neighbours can be obtained using [`get_neighbours`](@ref). For example, the set of vertices that share an edge with the fifth vertex is: -````@example unconstrained +````julia get_neighbours(tri, 5) ```` +```` +Set{Int64} with 4 elements: + 93 + 117 + 301 + 214 +```` + The set of triangles that share an edge with the fifth vertex is obtained using [`get_adjacent2vertex`](@ref). This returns a set of edges `(v, w)` such that, for a given vertex `u`, `(u, v, w)` is a positively oriented triangle in the triangulation. For example, -````@example unconstrained +````julia get_adjacent2vertex(tri, 5) ```` +```` +Set{Tuple{Int64, Int64}} with 4 elements: + (93, 117) + (301, 214) + (117, 301) + (214, 93) +```` + means that the triangles that contain `5` as a vertex are `(5, 93, 117)`, `(5, 117, 301)`, `(5, 301, 214)`, and `(5, 214, 93)`. We can verify this: -````@example unconstrained +````julia filter(T -> 5 ∈ triangle_vertices(T), get_triangles(tri)) ```` +```` +Set{Tuple{Int64, Int64, Int64}} with 4 elements: + (93, 5, 214) + (301, 5, 117) + (93, 117, 5) + (301, 214, 5) +```` + These queries can also be applied to the ghost vertices, in which information about the boundary is provided. -````@example unconstrained +````julia get_neighbours(tri, -1) ```` -````@example unconstrained +```` +Set{Int64} with 18 elements: + 456 + 176 + 425 + 258 + 325 + 398 + 197 + 219 + 319 + 262 + 112 + 345 + 371 + 232 + 245 + 163 + 468 + 140 +```` + +````julia get_adjacent2vertex(tri, -1) ```` +```` +Set{Tuple{Int64, Int64}} with 18 elements: + (468, 232) + (398, 258) + (176, 371) + (425, 456) + (232, 163) + (112, 262) + (258, 140) + (319, 176) + (262, 219) + (163, 325) + (371, 425) + (219, 197) + (140, 245) + (325, 398) + (456, 112) + (197, 345) + (245, 319) + (345, 468) +```` + ### Edges For a given edge `(u, v)`, the relevant neighbours are the vertices that are next to it so that a triangle is formed. We can find the vertex `w` such that `(u, v, w)` is a positively oriented triangle in the triangulation using `get_adjacent(tri, u, v)`. For example, -````@example unconstrained +````julia get_adjacent(tri, 163, 365) ```` +```` +295 +```` + means that `(163, 365, 295)` is a positively oriented triangle, as we can verify: -````@example unconstrained +````julia DelaunayTriangulation.triangle_orientation(tri, 163, 365, 295) ```` +```` +Certificate.PositivelyOriented = 6 +```` + (The representation of this predicate using a [`DelaunayTriangulation.Certificate`](@ref) is described in more detail in the [manual](../manual/predicates.md).) The other triangle adjoining the unordered edge `(u, v)`, meaning the oriented edge `(v, u)`, is obtained similarly: -````@example unconstrained +````julia get_adjacent(tri, 365, 163) ```` +```` +232 +```` + If an edge `(u, v)` is on the boundary, oriented so that there is no solid vertex `w` such that `(u, v, w)` is a triangle in the triangulation, then `get_adjacent(tri, u, v)` returns the ghost vertex. For example, -````@example unconstrained +````julia get_adjacent(tri, 398, 258) ```` +```` +-1 +```` + means that `(398, 258)` is a boundary edge and `(398, 258, -1)` is a ghost triangle. You can test for this case using [`DelaunayTriangulation.is_boundary_edge`](@ref): -````@example unconstrained +````julia DelaunayTriangulation.is_boundary_edge(tri, 258, 398) ```` +```` +true +```` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/unconstrained.jl). diff --git a/docs/src/tutorials/voronoi.md b/docs/src/tutorials/voronoi.md index bff13b686..6502668be 100644 --- a/docs/src/tutorials/voronoi.md +++ b/docs/src/tutorials/voronoi.md @@ -9,7 +9,7 @@ tessellations and work with them. Voronoi tessellations are built from a dual Delaunay triangulation using [`voronoi`](@ref). To start, let us load in the packages. -````@example voronoi +````julia using DelaunayTriangulation using CairoMakie using StableRNGs @@ -18,7 +18,7 @@ using StableRNGs We build the tessellation by constructing the triangulation, and then passing that triangulation into `voronoi`. -````@example voronoi +````julia points = [ (-3.0, 7.0), (1.0, 6.0), (-1.0, 3.0), (-2.0, 4.0), (3.0, -2.0), (5.0, 5.0), @@ -29,15 +29,26 @@ tri = triangulate(points; rng) vorn = voronoi(tri) ```` +```` +Voronoi Tessellation. + Number of generators: 8 + Number of polygon vertices: 9 + Number of polygons: 8 +```` + To visualise the tessellation, you can use `voronoiplot`. Here, we also compare the tessellation with its dual triangulation. -````@example voronoi +````julia fig, ax, sc = voronoiplot(vorn, markersize=13, colormap=:matter, strokecolor=:white, strokewidth=5) triplot!(ax, tri) fig ```` +```@raw html + +``` + The polygons each correspond to a *generator*, which is the black point inside it coming from `points`, i.e. the vertices of the triangulation. The polygons are all convex. Note also that the unbounded polygons, @@ -56,27 +67,55 @@ version of `get_points(tri)`. (A separate field is needed so that clipped and ce tessellations can add new generators without affecting the points in `tri`.) These generators can be accessed using `get_generators(vorn)`: -````@example voronoi +````julia DelaunayTriangulation.get_generators(vorn) ```` +```` +Dict{Int64, Tuple{Float64, Float64}} with 8 entries: + 5 => (3.0, -2.0) + 4 => (-2.0, 4.0) + 6 => (5.0, 5.0) + 7 => (-4.0, -3.0) + 2 => (1.0, 6.0) + 8 => (3.0, 8.0) + 3 => (-1.0, 3.0) + 1 => (-3.0, 7.0) +```` + It is preferred that you use [`each_generator(vorn)`](@ref each_generator), though, which is an iterator over the generators: -````@example voronoi +````julia each_generator(vorn) ```` +```` +KeySet for a Dict{Int64, Tuple{Float64, Float64}} with 8 entries. Keys: + 5 + 4 + 6 + 7 + 2 + 8 + 3 + 1 +```` + Note that this is just the keys of the above `Dict`. To access specific generators, you use [`get_generator`](@ref). For example, -````@example voronoi +````julia get_generator(vorn, 3) ```` +```` +(-1.0, 3.0) +```` + To give an example, here is how we can compute the average generator position. -````@example voronoi +````julia function average_generator(vorn) cx, cy = 0.0, 0.0 for i in each_generator(vorn) @@ -93,85 +132,172 @@ end cx, cy = average_generator(vorn) ```` +```` +(0.25, 3.5) +```` + ## Iterating over polygon and polygon vertices You can also look at the individual polygons, and all their vertices. These polygons and their vertices are stored as below: -````@example voronoi +````julia DelaunayTriangulation.get_polygons(vorn) ```` -````@example voronoi +```` +Dict{Int64, Vector{Int64}} with 8 entries: + 5 => [4, 8, -2, -1, 4] + 4 => [1, 9, 3, 7, 1] + 6 => [-1, -3, 6, 5, 4, -1] + 7 => [8, 1, 7, -5, -2, 8] + 2 => [9, 5, 6, 2, 3, 9] + 8 => [-3, -4, 2, 6, -3] + 3 => [4, 5, 9, 1, 8, 4] + 1 => [3, 2, -4, -5, 7, 3] +```` + +````julia DelaunayTriangulation.get_polygon_points(vorn) ```` +```` +9-element Vector{Tuple{Float64, Float64}}: + (-4.166666666666666, 0.8333333333333335) + (-0.2999999999999998, 9.3) + (-1.1363636363636365, 5.954545454545455) + (2.710526315789474, 1.868421052631579) + (2.357142857142857, 2.9285714285714284) + (3.1, 5.9) + (-10.807692307692307, 2.730769230769231) + (-0.7307692307692308, -0.8846153846153846) + (-0.30000000000000004, 4.7) +```` + You should not work with these fields directly, though. If you want to look at a specific polygon, you should use [`get_polygon`](@ref). For example, -````@example voronoi +````julia get_polygon(vorn, 1) ```` +```` +6-element Vector{Int64}: + 3 + 2 + -4 + -5 + 7 + 3 +```` + This is a `Vector` of the vertices of the polygon, in counter-clockwise order, and such that the first and last vertices are the same. The vertices refer to points in the `polygon_points` field, which you could then obtain using [`get_polygon_point`](@ref). For example, the first vertex corresponds to the coordinates: -````@example voronoi +````julia get_polygon_point(vorn, 1) ```` +```` +(-4.166666666666666, 0.8333333333333335) +```` + In `get_polygon(vorn, 1)`, notice that there are two negative indices. These negative indices correspond to vertices out at infinity; their actual values do not matter, just that they are negative. Thus, this polygon is actually an unbounded polygon. This can be checked in two ways: -````@example voronoi +````julia 1 ∈ DelaunayTriangulation.get_unbounded_polygons(vorn) ```` -````@example voronoi +```` +true +```` + +````julia get_area(vorn, 1) == Inf ```` +```` +true +```` + There are several ways that you can iterate over the polygons. If you want each polygon, then you can use [`each_polygon`](@ref): -````@example voronoi +````julia each_polygon(vorn) ```` +```` +ValueIterator for a Dict{Int64, Vector{Int64}} with 8 entries. Values: + [4, 8, -2, -1, 4] + [1, 9, 3, 7, 1] + [-1, -3, 6, 5, 4, -1] + [8, 1, 7, -5, -2, 8] + [9, 5, 6, 2, 3, 9] + [-3, -4, 2, 6, -3] + [4, 5, 9, 1, 8, 4] + [3, 2, -4, -5, 7, 3] +```` + This is an iterator over all the polygon vertices, but you do not get the associated polygon index. If you want an iterator that is over the polygon indices, you use [`each_polygon_index`](@ref): -````@example voronoi +````julia each_polygon_index(vorn) ```` +```` +KeySet for a Dict{Int64, Vector{Int64}} with 8 entries. Keys: + 5 + 4 + 6 + 7 + 2 + 8 + 3 + 1 +```` + If you did want to have both the indices and the vertices together, you can use `zip` on these two iterators. This would be the same as iterating over the internal `polygons` field, but this could be subject to change in the future. To get an iterator over the polygon vertices rather than caring about a specific polygon, you use [`each_polygon_vertex`](@ref): -````@example voronoi +````julia each_polygon_vertex(vorn) ```` +```` +Base.OneTo(9) +```` + This is just an iterator of the indices to pass into `get_polygon_point`. You can also query the number of polygons and polygon vertices as follows: -````@example voronoi +````julia num_polygons(vorn) ```` -````@example voronoi +```` +8 +```` + +````julia num_polygon_vertices(vorn) ```` +```` +9 +```` + To give an example of how we might use these iterators, here we compute the area of all polygons. -````@example voronoi +````julia function get_polygon_area(vorn, i) i ∈ DelaunayTriangulation.get_unbounded_polygons(vorn) && return Inf area = 0.0 @@ -198,9 +324,21 @@ end vorn_areas = get_polygon_areas(vorn) ```` +```` +8-element Vector{Float64}: + Inf + 14.34935064935065 + 20.07578561789088 + 23.92237762237762 + Inf + Inf + Inf + Inf +```` + Note that this could have also been obtained using [`get_area`](@ref): -````@example voronoi +````julia function direct_polygon_areas(vorn) areas = zeros(num_polygons(vorn)) for i in each_polygon_index(vorn) @@ -211,12 +349,20 @@ end vorn_areas ≈ direct_polygon_areas(vorn) ```` +```` +true +```` + Moreover, note that the following is false: -````@example voronoi +````julia vorn_areas ≈ [get_area(vorn, i) for i in each_polygon_index(vorn)] ```` +```` +false +```` + because `each_polygon_index` does not return the polygons in a sorted order. Before we move on, we emphasise that it is not guaranteed that the values of the vertices @@ -228,28 +374,56 @@ of the polygons will be the same, though, as they are derived from the point ind Given an edge in the tessellation, you can use [`get_adjacent`](@ref) to get the polygon that it is a part of (taking care of order). For example, -````@example voronoi +````julia get_adjacent(vorn, 1, 8) ```` +```` +3 +```` + means that the edge `(1, 8)` belongs to the third polygon, as we can easily verify: -````@example voronoi +````julia get_polygon(vorn, 3) ```` +```` +6-element Vector{Int64}: + 4 + 5 + 9 + 1 + 8 + 4 +```` + see that `(1, 8)` at the end. The order is important here, since -````@example voronoi +````julia get_adjacent(vorn, 8, 1) ```` +```` +7 +```` + means that the edge `(8, 1)` belongs to the seventh polygon: -````@example voronoi +````julia get_polygon(vorn, 7) ```` +```` +6-element Vector{Int64}: + 8 + 1 + 7 + -5 + -2 + 8 +```` + ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/voronoi.jl). diff --git a/src/DelaunayTriangulation.jl b/src/DelaunayTriangulation.jl index 4c83f2383..b6dae64d6 100644 --- a/src/DelaunayTriangulation.jl +++ b/src/DelaunayTriangulation.jl @@ -1,3 +1,20 @@ +""" + DelaunayTriangulation + +Module for computing Delaunay triangulations and Voronoi tessellations in two dimensions. There +are many features available, including: + +- Unconstrained and constrained Delaunay triangulations - see `triangulate`. +- Computation of Voronoi tessellations, clipped Voronoi tessellations (clipped to the convex hull), and centroidal Voronoi tessellations - see `voronoi`. +- Mesh refinement, with support custom angles and area constraints, as well as refinement of curve-bounded domains - see `refine!`. +- Dynamic updates such as point insertion and segment insertion - see e.g. `add_point!`, `delete_vertex!`, and `add_segment!`. +- Computation of convex hulls - see `convex_hull` (or use `get_convex_hull` on a computed triangulation). +- Triangulation of convex polygons - see `triangulate_convex`. Lattices can also be triangulated, see `triangulate_rectangle`. +- Point location - see `find_triangle` and `find_polygon`. +- Computation of the pole of inaccessibility - see `DelaunayTriangulation.pole_of_inaccessibility`. + +See the documentation for more, and the package's associated GitHub repository's README. +""" module DelaunayTriangulation include("setup.jl") @@ -16,5 +33,8 @@ include("algorithms.jl") include("validation.jl") include("exports.jl") +@static if VERSION ≥ v"1.11.0-DEV.469" + include("public.jl") +end end \ No newline at end of file diff --git a/src/algorithms/triangulation/main.jl b/src/algorithms/triangulation/main.jl index a4c961849..a5d99c6a9 100644 --- a/src/algorithms/triangulation/main.jl +++ b/src/algorithms/triangulation/main.jl @@ -98,8 +98,6 @@ Computes the Delaunay triangulation of `points`, and then the constrained Delaun - `check_arguments=true`: Whether to check the arguments `points` and `boundary_nodes` are valid. This is done using [`check_args`](@ref). - `polygonise_n=4096`: Number of points to use for polygonising the boundary when considering the poylgon hierarchy for a curve-bounded domain using [`polygonise`](@ref). See [`triangulate_curve_bounded`](@ref). - `coarse_n=0`: Number of points to use for initialising a curve-bounded domain. See [`triangulate_curve_bounded`](@ref). (A value of `0` means the number of points is chosen automatically until the diametral circles of all edges are empty.) -- `conform=false`: If `true`, then the triangulation will be enriched so that all segments are split until each segment's diametral circle contains no other points. This is done by treating the - triangulation as a curve-bounded triangulation and using [`enrich_boundary!`](@ref). # Outputs - `tri::Triangulation`: The triangulation. diff --git a/src/data_structures/trees/polygon_hierarchy.jl b/src/data_structures/trees/polygon_hierarchy.jl index f8f517148..909685d86 100644 --- a/src/data_structures/trees/polygon_hierarchy.jl +++ b/src/data_structures/trees/polygon_hierarchy.jl @@ -17,8 +17,8 @@ Constructs a [`PolygonTree`](@ref) with `parent`, `index`, and `height`, and no """ mutable struct PolygonTree{I} parent::Union{Nothing,PolygonTree{I}} - children::Set{PolygonTree{I}} # would do const, but for compat reasons I don't. can't seem to fix this with @static either - index::I # would do const, but for compat reasons I don't + @const children::Set{PolygonTree{I}} + @const index::I height::Int end PolygonTree{I}(parent::Union{Nothing,PolygonTree{I}}, index, height) where {I} = PolygonTree{I}(parent, Set{PolygonTree{I}}(), index, height) diff --git a/src/data_structures/trees/rtree.jl b/src/data_structures/trees/rtree.jl index 64dcc0e12..f89c14df6 100644 --- a/src/data_structures/trees/rtree.jl +++ b/src/data_structures/trees/rtree.jl @@ -495,7 +495,7 @@ Type for representing a leaf node in an R-tree. mutable struct Leaf{Branch} <: AbstractNode parent::Union{Branch,Nothing} bounding_box::BoundingBox - children::Vector{DiametralBoundingBox} # would do const, but for compat reasons I don't + @const children::Vector{DiametralBoundingBox} Leaf(parent::Branch, bounding_box, children) where {Branch} = new{Branch}(parent, bounding_box, children) Leaf{Branch}(parent::Branch, bounding_box, children) where {Branch} = new{Branch}(parent, bounding_box, children) Leaf{Branch}(::Nothing, bounding_box, children) where {Branch} = new{Branch}(nothing, bounding_box, children) @@ -526,7 +526,7 @@ Type for representing a branch node in an R-tree. mutable struct Branch <: AbstractNode parent::Union{Branch,Nothing} bounding_box::BoundingBox - children::Union{Vector{Branch},Vector{Leaf{Branch}}} # if we do e.g. Branch{C}, it makes resolving some of the other types a bit difficult, especially Leaf{Branch}. (Also: would do const, but for compat reasons I don't) + @const children::Union{Vector{Branch},Vector{Leaf{Branch}}} # if we do e.g. Branch{C}, it makes resolving some of the other types a bit difficult, especially Leaf{Branch}. level::Int end Branch(parent::Union{Branch,Nothing}=nothing, ::Type{C}=Branch) where {C<:AbstractNode} = Branch(parent, InvalidBoundingBox, C[], 1) @@ -754,13 +754,13 @@ The `size_limit` is the node capacity. All node types have the same capacity. mutable struct RTree # linear root::Union{Branch,Leaf{Branch}} num_elements::Int - branch_cache::BranchCache # would do const, but for compat reasons I don't - twig_cache::TwigCache # would do const, but for compat reasons I don't - leaf_cache::LeafCache # would do const, but for compat reasons I don't - fill_factor::Float64 # would do const, but for compat reasons I don't - free_cache::BitVector # would do const, but for compat reasons I don't - detached_cache::Vector{Union{Branch,Leaf{Branch}}} # would do const, but for compat reasons I don't - intersection_cache::NTuple{2,RTreeIntersectionCache} # would do const, but for compat reasons I don't + @const branch_cache::BranchCache + @const twig_cache::TwigCache + @const leaf_cache::LeafCache + @const fill_factor::Float64 + @const free_cache::BitVector + @const detached_cache::Vector{Union{Branch,Leaf{Branch}}} + @const intersection_cache::NTuple{2,RTreeIntersectionCache} function RTree(; size_limit=100, fill_factor=0.7) # https://en.wikipedia.org/wiki/R-tree: "however best performance has been experienced with a minimum fill of 30%–40%) branch_cache = BranchCache(size_limit) twig_cache = TwigCache(size_limit) diff --git a/src/public.jl b/src/public.jl new file mode 100644 index 000000000..e0db1beeb --- /dev/null +++ b/src/public.jl @@ -0,0 +1,264 @@ +public Adjacent, +Adjacent2Vertex, +ConvexHull, +Graph, +InsertionEventHistory, +Triangulation, +VoronoiTessellation, +ZeroWeight, +add_weight!, +all_ghost_vertices, +check_args, +compute_representative_points!, +contains_boundary_edge, +convert_boundary_points_to_indices, +delete_ghost_vertices_from_graph!, +dist, +get_adjacent, +get_adjacent2vertex, +get_all_boundary_nodes, +get_all_segments, +get_area, +get_boundary_curves, +get_boundary_edge_map, +get_boundary_nodes, +get_convex_hull, +get_convex_hull_vertices, +get_curve_index, +get_edges, +get_ghost_vertex_map, +get_ghost_vertex_range, +get_ghost_vertex_ranges, +get_graph, +get_insertion_order, +get_interior_segments, +get_left_boundary_node, +get_neighbours, +get_point, +get_points, +get_representative_point_coordinates, +get_representative_point_list, +get_right_boundary_node, +get_section_index, +get_triangles, +get_vertices, +get_weight, +get_weights, +has_ghost_vertices, +has_vertex, +is_exterior_ghost_vertex, +is_interior_ghost_vertex, +iterated_neighbourhood, +map_ghost_vertex, +num_curves, +num_neighbours, +num_points, +num_sections, +refine!, +retriangulate, +triangulate, +triangulate_convex, +triangulate_rectangle, +validate_triangulation, +add_boundary_information!, +add_ghost_triangles!, +add_point!, +add_segment!, +add_triangle!, +clear_empty_features!, +complete_split_edge_and_legalise!, +complete_split_triangle_and_legalise!, +delete_ghost_triangles!, +delete_holes!, +delete_point!, +delete_triangle!, +flip_edge!, +get_surrounding_polygon, +legalise_edge!, +lock_convex_hull!, +split_edge!, +split_triangle!, +unlock_convex_hull!, +centroidal_smooth, +get_boundary_polygons, +get_centroid, +get_circumcenter_to_triangle, +get_cocircular_circumcenters, +get_generator, +get_generators, +get_polygon, +get_polygon_coordinates, +get_polygon_point, +get_polygon_points, +get_polygons, +get_triangle_to_circumcenter, +get_triangulation, +get_unbounded_polygons, +num_generators, +num_polygon_vertices, +num_polygons, +polygon_bounds, +polygon_features, +toggle_inf_warn!, +voronoi, +convex_hull, +convex_hull!, +AbstractParametricCurve, +BSpline, +BezierCurve, +CatmullRomSpline, +CircularArc, +EllipticalArc, +LineSegment, +angle_between, +arc_length, +curvature, +differentiate, +get_circle_intersection, +get_closest_point, +get_equidistant_split, +get_equivariation_split, +get_inverse, +marked_total_variation, +orientation_markers, +point_position_relative_to_curve, +thrice_differentiate, +total_variation, +twice_differentiate, +each_boundary_edge, +each_edge, +each_generator, +each_ghost_edge, +each_ghost_triangle, +each_ghost_vertex, +each_point, +each_point_index, +each_polygon, +each_polygon_index, +each_polygon_vertex, +each_segment, +each_solid_edge, +each_solid_triangle, +each_solid_vertex, +each_triangle, +each_unbounded_polygon, +each_vertex, +num_edges, +num_ghost_edges, +num_ghost_triangles, +num_ghost_vertices, +num_solid_edges, +num_solid_triangles, +num_solid_vertices, +num_triangles, +num_vertices, +brute_force_search, +find_polygon, +find_triangle, +get_nearest_neighbour, +Certificate, +contains_segment, +contains_triangle, +edge_exists, +find_edge, +has_boundary_nodes, +has_ghost_triangles, +has_multiple_curves, +has_multiple_intersections, +has_multiple_sections, +has_no_intersections, +has_one_intersection, +is_above, +is_acute, +is_below, +is_boundary_edge, +is_boundary_node, +is_boundary_triangle, +is_closer, +is_collinear, +is_constrained, +is_degenerate, +is_equidistant, +is_further, +is_ghost_edge, +is_ghost_triangle, +is_ghost_vertex, +is_illegal, +is_inside, +is_left, +is_legal, +is_multiple, +is_negatively_oriented, +is_negativelyoriented, +is_none, +is_obtuse, +is_on, +is_outside, +is_positively_oriented, +is_positivelyoriented, +is_right, +is_single, +is_touching, +is_weighted, +line_segment_intersection_type, +opposite_angle, +point_closest_to_line, +point_position_on_line_segment, +point_position_relative_to_circle, +point_position_relative_to_circumcircle, +point_position_relative_to_diametral_circle, +point_position_relative_to_diametral_lens, +point_position_relative_to_line, +point_position_relative_to_oriented_outer_halfplane, +point_position_relative_to_triangle, +point_position_relative_to_witness_plane, +triangle_line_segment_intersection, +triangle_orientation, +unoriented_edge_exists, +IndividualTriangleStatistics, +TriangulationStatistics, +get_all_stat, +get_angles, +get_aspect_ratio, +get_circumcenter, +get_circumradius, +get_edge_midpoints, +get_individual_statistics, +get_inradius, +get_largest_angle, +get_largest_area, +get_largest_radius_edge_ratio, +get_lengths, +get_maximum_angle, +get_median_angle, +get_minimum_angle, +get_offcenter, +get_perimeter, +get_radius_edge_ratio, +get_sink, +get_smallest_angle, +get_smallest_area, +get_smallest_radius_edge_ratio, +num_boundary_segments, +num_convex_hull_vertices, +num_interior_segments, +num_segments, +statistics, +triangle_angles, +triangle_area, +triangle_aspect_ratio, +triangle_centroid, +triangle_circumcenter, +triangle_circumradius, +triangle_edge_midpoints, +triangle_inradius, +triangle_lengths, +triangle_offcenter, +triangle_perimeter, +triangle_radius_edge_ratio, +triangle_sink, +clip_polygon, +construct_polygon_hierarchy, +distance_to_polygon, +number_type, +pole_of_inaccessibility \ No newline at end of file diff --git a/src/setup.jl b/src/setup.jl index e1a26faf5..fd257fd75 100644 --- a/src/setup.jl +++ b/src/setup.jl @@ -93,3 +93,10 @@ PREDICATES const USE_EXACTPREDICATES = PREDICATES == "EXACT" const USE_INEXACTPREDICATES = PREDICATES == "INEXACT" +@eval macro $(Symbol("const"))(field) + if VERSION >= v"1.8.0-DEV.1148" + return Expr(:const, esc(field)) + else + return esc(field) + end +end \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index 5da79f241..985b9d120 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -44,6 +44,8 @@ using StructEquality using Aqua using Test +@test isempty(Docs.undocumented_names(DelaunayTriangulation)) + const ALL_TEST_SCRIPTS = Set{String}() const NON_TEST_SCRIPTS = Set{String}(["helper_functions.jl", "triangulation_validation.jl", "runtests.jl", "triangulation\\weighted.jl", "triangulation/weighted.jl"]) include("helper_functions.jl") From 96f985021d4f4bd3dbcdd76228e7e07ecf7adf7b Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 14 Jul 2024 15:49:59 +0100 Subject: [PATCH 02/11] Force news to be updated --- .github/workflows/enforce_news.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/enforce_news.yml diff --git a/.github/workflows/enforce_news.yml b/.github/workflows/enforce_news.yml new file mode 100644 index 000000000..04591989d --- /dev/null +++ b/.github/workflows/enforce_news.yml @@ -0,0 +1,14 @@ +name: "Enforce NEWS" +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled] + +jobs: + changelog: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dangoslen/changelog-enforcer@v3 + with: + changeLogPath: 'NEWS.md' + skipLabels: 'skip-news' \ No newline at end of file From a943078c7ddfb936b7a2dd0bb8df45daf384d0c2 Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 14 Jul 2024 15:52:17 +0100 Subject: [PATCH 03/11] Update news --- NEWS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NEWS.md b/NEWS.md index 716f9c903..f8aadd778 100644 --- a/NEWS.md +++ b/NEWS.md @@ -7,6 +7,12 @@ - Fixed a bug with the currently unused `orient(p, q, r, s)` predicate. See [#131](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/131). - Added private functions `getz`, `_getz`, `getxyz`, and `_getxyz`. See [#131](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/131). - `jump_and_march` has now been renamed to `find_triangle`. For compatibility, `jump_and_march` still works and is simply an alias of `find_triangle`. See [#133](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/133). +- Mutable structs now use `const` on fields that aren't changed. For compatibility with older versions, this is implemented using a macro that is a no-op where this is not supported. See [#140](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/140). +- We now use the `public` word to define public functions. This is only included on Julia versions v1.11 and above. See [#140](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/140). +- We now test on the pre-release. See [#140](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/140). +- The module `DelaunayTriangulation` now has a docstring. See [#140](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/140). +- The `.md` files for tutorials and applications in the docs have been properly updated to match their literate counterparts. See [#140](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/140). +- We now use a workflow to enforce changes to `NEWS.md` for any PRs. See [#140](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/140). ## v1.0.5 From 1ad1cb0b4a5f1108c68ad15dfde4b183503d3219 Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 14 Jul 2024 16:02:59 +0100 Subject: [PATCH 04/11] Fix tests on older versions --- test/runtests.jl | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 985b9d120..2bdbb72ae 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,9 +1,9 @@ # setup LocalPreferences.toml -using Preferences +using Preferences PREDICATES = get(ENV, "PREDICATES", "EXACT") if PREDICATES == "EXACT" set_preferences!("DelaunayTriangulation", "PREDICATES" => "EXACT") -elseif PREDICATES == "INEXACT" +elseif PREDICATES == "INEXACT" set_preferences!("DelaunayTriangulation", "PREDICATES" => "INEXACT") elseif PREDICATES != "DEFAULT" throw("Invalid PREDICATES setting, $PREDICATES.") @@ -44,7 +44,9 @@ using StructEquality using Aqua using Test -@test isempty(Docs.undocumented_names(DelaunayTriangulation)) +if isdefined(Docs, :undocumented_names) + @test isempty(Docs.undocumented_names(DelaunayTriangulation)) +end const ALL_TEST_SCRIPTS = Set{String}() const NON_TEST_SCRIPTS = Set{String}(["helper_functions.jl", "triangulation_validation.jl", "runtests.jl", "triangulation\\weighted.jl", "triangulation/weighted.jl"]) @@ -52,7 +54,7 @@ include("helper_functions.jl") using .HelperFunctions ct() = Dates.format(now(), "HH:MM:SS") -function safe_include(filename; name=filename, push=true, verbose = true) # Workaround for not being able to interpolate into SafeTestset test names +function safe_include(filename; name=filename, push=true, verbose=true) # Workaround for not being able to interpolate into SafeTestset test names push && push!(ALL_TEST_SCRIPTS, normpath(filename)) mod = @eval module $(gensym()) end @info "[$(ct())] Testing $name" @@ -65,9 +67,9 @@ end @testset verbose = true "DelaunayTriangulation.jl" begin @testset verbose = true "Aqua" begin - Aqua.test_all(DelaunayTriangulation; ambiguities=false, project_extras=false, stale_deps = !USE_INEXACTPREDICATES) # don't care about julia < 1.2 + Aqua.test_all(DelaunayTriangulation; ambiguities=false, project_extras=false, stale_deps=!USE_INEXACTPREDICATES) # don't care about julia < 1.2 Aqua.test_ambiguities(DelaunayTriangulation) # don't pick up Base and Core... - end + end @testset verbose = true "Triangulation" begin safe_include("triangulation/rectangle.jl") @@ -104,7 +106,7 @@ end safe_include("data_structures/curves.jl") safe_include("data_structures/rtree.jl") safe_include("data_structures/bst.jl") - safe_include("data_structures/polygon_hierarchy.jl", verbose = false) + safe_include("data_structures/polygon_hierarchy.jl", verbose=false) end @testset verbose = true "Predicates" begin @@ -169,7 +171,7 @@ end mp4_path = joinpath(dirname(dirname(pathof(DelaunayTriangulation))), "cell_simulation.mp4") isfile(mp4_path) && rm(mp4_path) end - + @testset verbose = true "Test the tutorials" begin tut_dir = joinpath(dirname(dirname(pathof(DelaunayTriangulation))), "docs", "src", "literate_tutorials") tut_files = readdir(tut_dir) @@ -177,11 +179,11 @@ end safe_include(joinpath(tut_dir, file); push=false) end end - + @testset verbose = true "Test the readme example" begin safe_include("readme_example.jl") end - + @testset "All script files are included somewhere" begin missing_set = String[] test_dir = joinpath(dirname(dirname(pathof(DelaunayTriangulation))), "test", "") From ab317149397e3d32a1264e685d81be7b98e310f7 Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 14 Jul 2024 16:42:45 +0100 Subject: [PATCH 05/11] Don't execute --- .gitignore | 3 +- NEWS.md | 2 +- docs/Manifest.toml | 69 +- docs/make.jl | 2 +- docs/src/applications/cell_simulations.md | 29 +- docs/src/applications/interpolation.md | 87 +- docs/src/applications/pde_discretisation.md | 33 +- docs/src/tutorials/centroidal.md | 24 +- docs/src/tutorials/clipped.md | 24 +- docs/src/tutorials/clipped_rectangle.md | 41 +- docs/src/tutorials/constrained_edges.md | 73 +- .../constrained_interior_within_interiors.md | 14 +- .../constrained_multiply_connected.md | 157 +- .../src/tutorials/constrained_multipolygon.md | 12 +- .../tutorials/constrained_outer_boundary.md | 217 +- .../constrained_outer_boundary_segmented.md | 130 +- docs/src/tutorials/convex.md | 70 +- docs/src/tutorials/convex_hull.md | 56 +- docs/src/tutorials/curve_bounded.md | 2618 +------- docs/src/tutorials/custom_primitive.md | 40 +- docs/src/tutorials/lattice.md | 153 +- docs/src/tutorials/nearest.md | 32 +- .../operations_convex_hull_locking.md | 28 +- docs/src/tutorials/operations_flip_edge.md | 40 +- .../tutorials/operations_ghost_triangles.md | 125 +- .../src/tutorials/operations_legalise_edge.md | 38 +- .../tutorials/operations_segment_insertion.md | 35 +- docs/src/tutorials/operations_split_edge.md | 32 +- .../tutorials/operations_split_triangle.md | 12 +- .../operations_vertex_insertion_deletion.md | 85 +- docs/src/tutorials/point_in_polygon.md | 21 +- docs/src/tutorials/point_location.md | 163 +- docs/src/tutorials/pole_of_inaccessibility.md | 48 +- docs/src/tutorials/refinement.md | 5298 +---------------- docs/src/tutorials/unconstrained.md | 3202 +--------- docs/src/tutorials/voronoi.md | 224 +- 36 files changed, 402 insertions(+), 12835 deletions(-) diff --git a/.gitignore b/.gitignore index f6b55de47..57bd56781 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,5 @@ test/Manifest.toml docs/Manifest.toml /docs/build/ /.vscode -LocalPreferences.toml \ No newline at end of file +LocalPreferences.toml +docs/src/applications/cell_simulation.mp4 diff --git a/NEWS.md b/NEWS.md index f8aadd778..473c39619 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,6 @@ # Changelog -## v.1.1.0 +## Main (upcoming v.1.1.0) - Added the option to disable ExactPredicates.jl using Preferences.jl. See [#131](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/131) and [#137](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/137). - Added `DelauanyTriangulation.validate_triangulation` for validating triangulations. See [#131](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/pull/131). diff --git a/docs/Manifest.toml b/docs/Manifest.toml index f4a78a756..83edf1baf 100644 --- a/docs/Manifest.toml +++ b/docs/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.11.0-rc1" +julia_version = "1.10.4" manifest_format = "2.0" project_hash = "a5f97bd51af051946996607d64905eb7a7b0c1f9" @@ -54,7 +54,7 @@ version = "0.4.1" [[deps.ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.2" +version = "1.1.1" [[deps.ArrayInterface]] deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] @@ -86,7 +86,6 @@ version = "7.12.0" [[deps.Artifacts]] uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" -version = "1.11.0" [[deps.Automa]] deps = ["PrecompileTools", "TranscodingStreams"] @@ -108,7 +107,6 @@ version = "0.4.7" [[deps.Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" -version = "1.11.0" [[deps.BenchmarkTools]] deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] @@ -134,7 +132,6 @@ version = "0.5.0" [[deps.CRC32c]] uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" -version = "1.11.0" [[deps.CRlibm_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -288,7 +285,6 @@ version = "1.0.0" [[deps.Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" -version = "1.11.0" [[deps.DeepDiffs]] git-tree-sha1 = "9824894295b62a6a4ab6adf1c7bf337b3a9ca34c" @@ -327,7 +323,6 @@ weakdeps = ["ChainRulesCore", "SparseArrays"] [[deps.Distributed]] deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" -version = "1.11.0" [[deps.Distributions]] deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] @@ -452,7 +447,6 @@ version = "0.9.21" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" -version = "1.11.0" [[deps.FillArrays]] deps = ["LinearAlgebra"] @@ -536,7 +530,6 @@ version = "1.0.14+0" [[deps.Future]] deps = ["Random"] uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" -version = "1.11.0" [[deps.GeoInterface]] deps = ["Extents"] @@ -693,7 +686,6 @@ version = "2024.2.0+0" [[deps.InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" -version = "1.11.0" [[deps.Interpolations]] deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] @@ -810,7 +802,6 @@ version = "1.2.2" [[deps.LazyArtifacts]] deps = ["Artifacts", "Pkg"] uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" -version = "1.11.0" [[deps.LazyModules]] git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" @@ -825,17 +816,16 @@ version = "0.6.4" [[deps.LibCURL_jll]] deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.6.0+0" +version = "8.4.0+0" [[deps.LibGit2]] deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" -version = "1.11.0" [[deps.LibGit2_jll]] deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.7.2+0" +version = "1.6.4+0" [[deps.LibSSH2_jll]] deps = ["Artifacts", "Libdl", "MbedTLS_jll"] @@ -844,7 +834,6 @@ version = "1.11.0+1" [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" -version = "1.11.0" [[deps.Libffi_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -897,7 +886,6 @@ version = "7.2.0" [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" -version = "1.11.0" [[deps.LinearAlgebraX]] deps = ["LinearAlgebra", "Mods", "Primes", "SimplePolynomials"] @@ -935,7 +923,6 @@ version = "0.3.28" [[deps.Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" -version = "1.11.0" [[deps.LoggingExtras]] deps = ["Dates", "Logging"] @@ -980,7 +967,6 @@ version = "0.4.2" [[deps.Markdown]] deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" -version = "1.11.0" [[deps.MarkdownAST]] deps = ["AbstractTrees", "Markdown"] @@ -1003,7 +989,7 @@ version = "1.1.9" [[deps.MbedTLS_jll]] deps = ["Artifacts", "Libdl"] uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.6+0" +version = "2.28.2+1" [[deps.Missings]] deps = ["DataAPI"] @@ -1013,7 +999,6 @@ version = "1.2.0" [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" -version = "1.11.0" [[deps.Mods]] git-tree-sha1 = "924f962b524a71eef7a21dae1e6853817f9b658f" @@ -1028,7 +1013,7 @@ version = "0.3.4" [[deps.MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.12.12" +version = "2023.1.10" [[deps.Multisets]] git-tree-sha1 = "8d852646862c96e226367ad10c8af56099b4047e" @@ -1080,7 +1065,7 @@ version = "1.3.5+1" [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.27+1" +version = "0.3.23+4" [[deps.OpenEXR]] deps = ["Colors", "FileIO", "OpenEXR_jll"] @@ -1206,13 +1191,9 @@ uuid = "30392449-352a-5448-841d-b1acce4e97dc" version = "0.43.4+0" [[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.11.0" -weakdeps = ["REPL"] - - [deps.Pkg.extensions] - REPLExt = "REPL" +version = "1.10.0" [[deps.PkgVersion]] deps = ["Pkg"] @@ -1276,11 +1257,10 @@ version = "0.5.6" [[deps.Printf]] deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" -version = "1.11.0" [[deps.Profile]] +deps = ["Printf"] uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" -version = "1.11.0" [[deps.ProgressMeter]] deps = ["Distributed", "Printf"] @@ -1306,14 +1286,12 @@ uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" version = "2.9.4" [[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "StyledStrings", "Unicode"] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" -version = "1.11.0" [[deps.Random]] deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" -version = "1.11.0" [[deps.RangeArrays]] git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" @@ -1412,7 +1390,6 @@ version = "1.2.1" [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" -version = "1.11.0" [[deps.Setfield]] deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] @@ -1429,7 +1406,6 @@ version = "0.4.1" [[deps.SharedArrays]] deps = ["Distributed", "Mmap", "Random", "Serialization"] uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" -version = "1.11.0" [[deps.Showoff]] deps = ["Dates", "Grisu"] @@ -1486,7 +1462,6 @@ version = "0.1.3" [[deps.Sockets]] uuid = "6462fe0b-24de-5631-8697-dd941f90decc" -version = "1.11.0" [[deps.SortingAlgorithms]] deps = ["DataStructures"] @@ -1497,7 +1472,7 @@ version = "1.2.1" [[deps.SparseArrays]] deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.11.0" +version = "1.10.0" [[deps.SpecialFunctions]] deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] @@ -1538,14 +1513,9 @@ uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" version = "1.4.3" [[deps.Statistics]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +deps = ["LinearAlgebra", "SparseArrays"] uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.11.1" -weakdeps = ["SparseArrays"] - - [deps.Statistics.extensions] - SparseArraysExt = ["SparseArrays"] +version = "1.10.0" [[deps.StatsAPI]] deps = ["LinearAlgebra"] @@ -1591,10 +1561,6 @@ version = "0.6.18" SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" -[[deps.StyledStrings]] -uuid = "f489334b-da3d-4c2e-b8f0-e476e12c162b" -version = "1.11.0" - [[deps.SuiteSparse]] deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" @@ -1602,7 +1568,7 @@ uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" [[deps.SuiteSparse_jll]] deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.6.0+0" +version = "7.2.1+1" [[deps.TOML]] deps = ["Dates"] @@ -1635,7 +1601,6 @@ version = "0.1.1" [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -version = "1.11.0" [[deps.TiffImages]] deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"] @@ -1665,7 +1630,6 @@ version = "1.5.1" [[deps.UUIDs]] deps = ["Random", "SHA"] uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" -version = "1.11.0" [[deps.UnPack]] git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" @@ -1674,7 +1638,6 @@ version = "1.0.2" [[deps.Unicode]] uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" -version = "1.11.0" [[deps.UnicodeFun]] deps = ["REPL"] @@ -1829,7 +1792,7 @@ version = "1.3.7+1" [[deps.nghttp2_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.59.0+0" +version = "1.52.0+1" [[deps.oneTBB_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] diff --git a/docs/make.jl b/docs/make.jl index 2fdd198c4..0c9d20411 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -90,7 +90,7 @@ for folder in ("tutorials", "applications") postprocess=editurl_update ∘ post_strip, credit=true, name=splitext(file)[1], - execute=!IS_LIVESERVER, + execute=false, flavor=Literate.DocumenterFlavor(), ) end diff --git a/docs/src/applications/cell_simulations.md b/docs/src/applications/cell_simulations.md index 99c8d0eb7..b5385a9d4 100644 --- a/docs/src/applications/cell_simulations.md +++ b/docs/src/applications/cell_simulations.md @@ -46,7 +46,7 @@ We update the triangulation after each step.[^2] ## Implementation Let us now implement this model. First, we define a struct for storing the parameters of our model. -````julia +````@example cell_simulations using DelaunayTriangulation using StableRNGs using LinearAlgebra @@ -68,7 +68,7 @@ end Let's now write functions for performing the migration step. -````julia +````@example cell_simulations function migrate_cells!(cells::CellModel) # a more efficient way would be to loop over edges rather than vertices tri = cells.tri for i in each_solid_vertex(tri) @@ -90,15 +90,11 @@ function migrate_cells!(cells::CellModel) # a more efficient way would be to loo end ```` -```` -migrate_cells! (generic function with 1 method) -```` - Now we can write the proliferation functions. First, let us write a function that computes the Voronoi areas. If we had the `VoronoiTessellation` computed, we would just use `get_area`, but we are aiming to avoid having to compute $\mathcal V\mathcal T(\mathcal P)$ directly. -````julia +````@example cell_simulations function polygon_area(points) # this is the same function from the Interpolation section n = DelaunayTriangulation.num_points(points) p, q, r, s = get_point(points, 1, 2, n, n - 1) @@ -137,14 +133,10 @@ function get_voronoi_area(tri::Triangulation, i) end ```` -```` -get_voronoi_area (generic function with 1 method) -```` - The function `get_voronoi_area` above returns `0` if the cell is on the boundary. Finally, our function for performing the proliferation step is below. -````julia +````@example cell_simulations function proliferate_cells!(cells::CellModel) E = 0.0 Δt = cells.Δt @@ -172,13 +164,9 @@ function proliferate_cells!(cells::CellModel) end ```` -```` -proliferate_cells! (generic function with 1 method) -```` - Finally, our simulation function is below. -````julia +````@example cell_simulations function perform_step!(cells::CellModel) proliferate_cells!(cells) migrate_cells!(cells) @@ -197,16 +185,12 @@ function simulate_cells(cells::CellModel) end ```` -```` -simulate_cells (generic function with 1 method) -```` - ## Example Let us now give an example. Our initial set of points will be randomly chosen inside the rectangle $[-2, 2] \times [-5, 5]$. We use $\alpha = 5$, $s = 2$, $\Delta t = 10^{-3}$, $\beta = 0.25$, $K = 100^2$, and $\epsilon = 0.5$. -````julia +````@example cell_simulations rng = StableRNG(123444) a, b, c, d = -2.0, 2.0, -5.0, 5.0 points = [(a + (b - a) * rand(rng), c + (d - c) * rand(rng)) for _ in 1:10] @@ -230,6 +214,7 @@ record(fig, "cell_simulation.mp4", 1:10:length(t); framerate=60) do ii i[] = ii title_obs[] = L"t = %$(((ii-1) * Δt))" end; +nothing #hide ```` ![](cell_simulation.mp4) diff --git a/docs/src/applications/interpolation.md b/docs/src/applications/interpolation.md index d71254b82..3cbef179f 100644 --- a/docs/src/applications/interpolation.md +++ b/docs/src/applications/interpolation.md @@ -20,10 +20,41 @@ One way around this is to instead use the Voronoi tessellation to guide the tess We give an example of this below, where we show how $\mathcal D\mathcal T(X)$ may change significant after a small perturbation while $\mathcal V(X)$ does not at the same time. - -```@raw html - -``` +````@example interpolation +using DelaunayTriangulation #hide +using CairoMakie #hide +A, B, C, D, E, F, G, H = (0.3, 1.1), (-0.1, 0.8), (0.2, 0.3), (0.6, 0.2), (0.8, 0.8), (0.3, 0.9), (0.5503600264347, 0.6814266789918), (1.1, 0.5) #hide +G2 = (0.5496217775447, 0.7146478790414) #hide +fig = Figure() #hide +ax = Axis(fig[1, 1], width=400, height=400, title="Original") #hide +xlims!(ax, -0.2, 1.3) #hide +ylims!(ax, 0.1, 1.2) #hide +points = [A, B, C, D, E, F, G, H] #hide +triplot!(ax, points, show_points=true) #hide +scatter!(ax, [G], color=:red, markersize=14) #hide +hidedecorations!(ax) #hide +ax2 = Axis(fig[2, 1], width=400, height=400) #hide +voronoiplot!(ax2, points, clip=(-0.2, 1.3, 0.1, 1.2)) #hide +xlims!(ax2, -0.2, 1.3) #hide +ylims!(ax2, 0.1, 1.2) #hide +scatter!(ax2, [G], color=:red, markersize=14) #hide +hidedecorations!(ax2) #hide +ax3 = Axis(fig[1, 2], width=400, height=400, title="Perturbed") #hide +points = [A, B, C, D, E, F, G2, H] #hide +triplot!(ax3, points, show_points=true) #hide +hidedecorations!(ax3) #hide +xlims!(ax3, -0.2, 1.3) #hide +ylims!(ax3, 0.1, 1.2) #hide +scatter!(ax3, [G2], color=:red, markersize=14) #hide +ax4 = Axis(fig[2, 2], width=400, height=400) #hide +voronoiplot!(ax4, points, clip=(-0.2, 1.3, 0.1, 1.2)) #hide +scatter!(ax4, [G2], color=:red, markersize=14) #hide +xlims!(ax4, -0.2, 1.3) #hide +ylims!(ax4, 0.1, 1.2) #hide +hidedecorations!(ax4) #hide +resize_to_layout!(fig) #hide +fig #hide +```` This observation motivates the use of the Voronoi tessellation to guide the interpolation. @@ -69,7 +100,7 @@ We implement this below.[^1] [^1]: This is more expensive than we need. In NaturalNeighbours.jl, we use the `peek` keyword in `triangulate` to avoid making any changes to the triangulation itself, and use the `InsertionEventHistory` to track all changes made. -````julia +````@example interpolation using DelaunayTriangulation function compute_envelope(tri::Triangulation, point) r = DelaunayTriangulation.num_points(tri) @@ -84,13 +115,9 @@ function compute_envelope(tri::Triangulation, point) end ```` -```` -compute_envelope (generic function with 1 method) -```` - Let's now check that this function works. -````julia +````@example interpolation using CairoMakie using StableRNGs using ElasticArrays @@ -110,10 +137,6 @@ resize_to_layout!(fig) fig ```` -```@raw html - -``` - As we can see, the red region we have computed from our envelope is indeed the envelope we need. ### Computing the Sibsonian coordinates @@ -131,7 +154,7 @@ to compute the part of the area that is contained within the envelope, since eve envelope is unchanged. If we included the entire area, then the area that we subtract off for the intersection we compute later would just cancel it out anyway. Let's zoom in on the envelope and consider a specific example of how we can do this computation. -````julia +````@example interpolation fig = Figure(fontsize=24) ax = Axis(fig[1, 1], width=400, height=400) triplot!(ax, tri, show_points=true) @@ -157,15 +180,11 @@ resize_to_layout!(fig) fig ```` -```@raw html - -``` - The relevant polygon is shown above in blue, associated with the generator shown by the blue point. We need to compute the area of this polygon. This is simple using the [shoelace formula](https://en.wikipedia.org/wiki/Shoelace_formula). Our implementation of this is given below. -````julia +````@example interpolation function polygon_area(points) # this is the first formula in the "Other formulae" section of the above Wikipedia article n = DelaunayTriangulation.num_points(points) p, q, r, s = get_point(points, 1, 2, n, n - 1) @@ -207,14 +226,10 @@ function pre_insertion_area(tri::Triangulation, i, envelope_vertices) # area fro end ```` -```` -pre_insertion_area (generic function with 1 method) -```` - The details for the post-insertion area are similar, but now the triangles that we take the circumcenters of are those where the edges instead join with the inserted vertex. The function we use is below. -````julia +````@example interpolation function post_insertion_area(tri::Triangulation, i, envelope_vertices, point) u = envelope_vertices[i] prev_index = i == 1 ? length(envelope_vertices) - 1 : i - 1 @@ -236,13 +251,9 @@ function post_insertion_area(tri::Triangulation, i, envelope_vertices, point) end ```` -```` -post_insertion_area (generic function with 1 method) -```` - Now that we can compute the pre- and post-insertion areas, we can start computing the Sibsonian coordinates. -````julia +````@example interpolation function compute_sibson_coordinates(tri::Triangulation, envelope_vertices, point) coordinates = zeros(length(envelope_vertices) - 1) w = 0.0 @@ -260,17 +271,13 @@ function compute_sibson_coordinates(tri::Triangulation, envelope_vertices, point end ```` -```` -compute_sibson_coordinates (generic function with 1 method) -```` - This function gives our $\boldsymbol\lambda$ vector. Notice that, in the computation of these coordinates, we need needed to have $\mathcal V(X)$ directly or make use of the data $z_i$. ## Evaluating the Sibsonian interpolant Now we can evaluate our Sibson interpolant. The following function does this for us. -````julia +````@example interpolation function evaluate_sibson_interpolant(tri::Triangulation, z, point) envelope_vertices, _ = compute_envelope(tri, point) λ = compute_sibson_coordinates(tri, envelope_vertices, point) @@ -288,13 +295,9 @@ function evaluate_sibson_interpolant(tri::Triangulation, z, point) end ```` -```` -evaluate_sibson_interpolant (generic function with 1 method) -```` - Let's now use this function to interpolate some data. -````julia +````@example interpolation f = (x, y) -> sin(x * y) - cos(x - y) * exp(-(x - y)^2) trit = triangulate_rectangle(0.0, 1.0, 0.0, 1.0, 30, 30) zz = [f(x, y) for (x, y) in DelaunayTriangulation.each_point(trit)] @@ -310,10 +313,6 @@ resize_to_layout!(fig) fig ```` -```@raw html - -``` - Works perfectly! ## Just the code An uncommented version of this example is given below. diff --git a/docs/src/applications/pde_discretisation.md b/docs/src/applications/pde_discretisation.md index e76c10a98..744985b5b 100644 --- a/docs/src/applications/pde_discretisation.md +++ b/docs/src/applications/pde_discretisation.md @@ -28,7 +28,7 @@ $\Omega = \cup_i\mathcal T_i$. We will then approximate the solution $T$ on each For this decomposition, we simply use $\mathcal D\mathcal T(\Omega)$, where $\mathcal D\mathcal T(\Omega)$ is some Delaunay triangulation of points in $\Omega$ with $\partial\mathcal D\mathcal T(\Omega) = \partial\Omega$. Here is our discretisation of our annulus. -````julia +````@example pde_discretisation using DelaunayTriangulation using CairoMakie using StableRNGs @@ -45,19 +45,22 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - ## Discretisation of the PDE Now let's determine how we can use the discretisation above to solve the PDE. Central to this approach is the idea of a _control volume_ around each point. In particular, connect the centroids of each triangle to the midpoints of the edges of the triangle. This defines a collection of polygons $\Omega_i$ around each point $\vb x_i$, as shown below in blue. - -```@raw html - -``` +````@example pde_discretisation +points = NTuple{2,Float64}[] #hide +for T in each_solid_triangle(tri) #hide + u, v, w = triangle_vertices(T) #hide + p, q, r = get_point(tri, u, v, w) #hide + c = DelaunayTriangulation.triangle_centroid(p, q, r) #hide + push!(points, c, (p .+ q) ./ 2, c, (q .+ r) ./ 2, c, (r .+ p) ./ 2) #hide +end #hide +linesegments!(ax, points, color=:blue) #hide +fig #hide +```` Consider a particular control volume $\Omega_i$. We integrate our PDE over this domain, writing $\grad^2 = \grad \vdot \grad$ and use the divergence theorem: @@ -116,7 +119,7 @@ is the $i$th standard basis vector, and $b_i = 0$. The solution to this system w Let's now implement these ideas. Some details of this implementation, like how we efficient loop over the mesh for building the system by using edges rather than vertices, have been skipped and are described in more detail [here](https://sciml.github.io/FiniteVolumeMethod.jl/dev/math/). -````julia +````@example pde_discretisation using LinearAlgebra using SparseArrays function solve_met_problem(tri::Triangulation, D) @@ -239,24 +242,16 @@ function solve_met_problem(tri::Triangulation, D) end ```` -```` -solve_met_problem (generic function with 1 method) -```` - ## Solving the System Let's now solve this problem, taking $D = 6.25 \times 10^{-4}$. -````julia +````@example pde_discretisation D = 6.25e-4 T = solve_met_problem(tri, D) fig, ax, sc = tricontourf(tri, T, levels=0:5:200, extendhigh=:auto) fig ```` -```@raw html - -``` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_applications/pde_discretisation.jl). diff --git a/docs/src/tutorials/centroidal.md b/docs/src/tutorials/centroidal.md index fc6d49a33..c55a52275 100644 --- a/docs/src/tutorials/centroidal.md +++ b/docs/src/tutorials/centroidal.md @@ -12,7 +12,7 @@ in place. This method is only applicable to clipped tessellations. We give a simple example. First, we compute the clipped tessellation of a point set. -````julia +````@example centroidal using DelaunayTriangulation using CairoMakie using StableRNGs @@ -22,31 +22,17 @@ tri = triangulate(points; rng) vorn = voronoi(tri, clip=true) ```` -```` -Voronoi Tessellation. - Number of generators: 500 - Number of polygon vertices: 1032 - Number of polygons: 500 -```` - To now compute the centroidal tessellation, use [`centroidal_smooth`](@ref). ( If you want to straight from a triangulation to a centroidal tessellation, you can also just use `smooth_vorn = voronoi(tri, clip = true, smooth = true)`.) -````julia +````@example centroidal smooth_vorn = centroidal_smooth(vorn; rng) ```` -```` -Voronoi Tessellation. - Number of generators: 500 - Number of polygon vertices: 1074 - Number of polygons: 500 -```` - Let us now compare the two tessellations. -````julia +````@example centroidal fig = Figure() ax1 = Axis(fig[1, 1], title="Original", width=600, height=400) ax2 = Axis(fig[1, 2], title="Smoothed", width=600, height=400) @@ -56,10 +42,6 @@ resize_to_layout!(fig) fig ```` -```@raw html - -``` - As you can see, the tiles are all reasonably uniform, and their generators do look to be near the centroid of their corresponding tile. Note that this function `centroidal_smooth` is iterative, and you can control the iteration limits diff --git a/docs/src/tutorials/clipped.md b/docs/src/tutorials/clipped.md index 7f96c3a09..596139572 100644 --- a/docs/src/tutorials/clipped.md +++ b/docs/src/tutorials/clipped.md @@ -13,7 +13,7 @@ are on the to-do list, but they are not yet implemented.) In the example below, we clip the tessellation to the convex hull of the point set by using `clip=true` in the keyword arguments. -````julia +````@example clipped using DelaunayTriangulation using CairoMakie using StableRNGs @@ -24,28 +24,14 @@ tri = triangulate(points; rng) vorn = voronoi(tri) ```` -```` -Voronoi Tessellation. - Number of generators: 50 - Number of polygon vertices: 92 - Number of polygons: 50 -```` - -````julia +````@example clipped clipped_vorn = voronoi(tri, clip = true) ```` -```` -Voronoi Tessellation. - Number of generators: 50 - Number of polygon vertices: 119 - Number of polygons: 50 -```` - Note that the clipping has put more polygon vertices in. We compare the clipped tessellations below. -````julia +````@example clipped fig = Figure() ax1 = Axis(fig[1, 1], title="Unclipped", width=600, height=400) ax2 = Axis(fig[1, 2], title="Clipped", width=600, height=400) @@ -55,10 +41,6 @@ resize_to_layout!(fig) fig ```` -```@raw html - -``` - As you can see, the unbounded polygons, and any polygons that included points outside of the convex hull, have now been clipped to the convex hull. ## Just the code diff --git a/docs/src/tutorials/clipped_rectangle.md b/docs/src/tutorials/clipped_rectangle.md index c1c6e41c0..121cfa287 100644 --- a/docs/src/tutorials/clipped_rectangle.md +++ b/docs/src/tutorials/clipped_rectangle.md @@ -15,7 +15,7 @@ but we provide the function [`get_polygon_coordinates`](@ref) for this (this is Let us now demonstrate. First, we construct a tessellation of some example point set. -````julia +````@example clipped_rectangle using DelaunayTriangulation using CairoMakie A = (-3.0, 7.0) @@ -31,43 +31,28 @@ tri = triangulate(points) vorn = voronoi(tri) ```` -```` -Voronoi Tessellation. - Number of generators: 8 - Number of polygon vertices: 9 - Number of polygons: 8 -```` - Let us show the tessellation, and the rectangle we want to clip the tessellation to. -````julia +````@example clipped_rectangle fig, ax, sc = voronoiplot(vorn) a, b, c, d = -2.0, 3.0, 0.0, 7.0 lines!(ax, [(a,c),(b,c),(b,d),(a,d),(a,c)], color = :black, linewidth = 4) fig ```` -```@raw html - -``` - To apply this clipping, we need to provide a bounding box of the form `(xmin, xmax, ymin, ymax)`. Here, we will use -````julia +````@example clipped_rectangle bounding_box = (a, b, c, d) ```` -```` -(-2.0, 3.0, 0.0, 7.0) -```` - You can obtain some reasonable defaults for this bounding box using [DelaunayTriangulation.polygon_bounds(vorn)](@ref polygon_bounds). The coordinates for each polygon clipped to this box can be obtained as follows. -````julia +````@example clipped_rectangle clipped_coords = Vector{Vector{NTuple{2,Float64}}}(undef, num_polygons(vorn)) for i in each_polygon_index(vorn) clipped_coords[i] = get_polygon_coordinates(vorn, i, bounding_box) @@ -75,29 +60,13 @@ end clipped_coords ```` -```` -8-element Vector{Vector{Tuple{Float64, Float64}}}: - [(-2.000000000000001, 7.0), (-2.0, 5.666666666666667), (-1.1363636363636365, 5.954545454545455), (-0.8750000000000009, 7.0), (-2.000000000000001, 7.0)] - [(-0.30000000000000004, 4.7), (2.357142857142857, 2.9285714285714284), (3.0, 5.499999999999999), (3.0, 6.0), (2.0, 7.0), (-0.8750000000000009, 7.0), (-1.1363636363636365, 5.954545454545455), (-0.30000000000000004, 4.7)] - [(0.375, 0.0), (2.710526315789474, 1.868421052631579), (2.357142857142857, 2.9285714285714284), (-0.30000000000000004, 4.7), (-2.0, 3.0), (-2.0, 0.0), (0.375, 0.0)] - [(-2.0, 3.0), (-0.30000000000000004, 4.7), (-1.1363636363636365, 5.954545454545455), (-2.0, 5.666666666666667), (-2.0, 3.0)] - [(3.0, 0.0), (3.0, 1.7857142857142858), (2.710526315789474, 1.868421052631579), (0.375, 0.0), (3.0, 0.0)] - [(3.0, 1.7857142857142858), (3.0, 5.499999999999999), (2.357142857142857, 2.9285714285714284), (2.710526315789474, 1.868421052631579), (3.0, 1.7857142857142858)] - [] - [(3.0, 7.0), (2.0, 7.0), (3.0, 6.0), (3.0, 7.0)] -```` - Now let's plot these. -````julia +````@example clipped_rectangle fig, ax, sc = poly(clipped_coords, color = :white, strokewidth = 4) fig ```` -```@raw html - -``` - As we can see, the polygons have been clipped to the rectangle. Note that if you just want this for plotting, you can also call `voronoiplot` with the `bounding_box` keyword argument. diff --git a/docs/src/tutorials/constrained_edges.md b/docs/src/tutorials/constrained_edges.md index e58e4d561..7c3f82dfa 100644 --- a/docs/src/tutorials/constrained_edges.md +++ b/docs/src/tutorials/constrained_edges.md @@ -10,14 +10,14 @@ starting with the simple case of only having constrained segments, meaning edges that are forced to be in the final triangulation. To start, let us load in the packages we will need. -````julia +````@example constrained_edges using DelaunayTriangulation using CairoMakie ```` We consider triangulating the following set of points: -````julia +````@example constrained_edges a = (0.0, 0.0) b = (0.0, 1.0) c = (0.0, 2.5) @@ -32,35 +32,12 @@ k = (8.0, 2.5) pts = [a, b, c, d, e, f, g, h, i, j, k] ```` -```` -11-element Vector{Tuple{Float64, Float64}}: - (0.0, 0.0) - (0.0, 1.0) - (0.0, 2.5) - (2.0, 0.0) - (6.0, 0.0) - (8.0, 0.0) - (8.0, 0.5) - (7.5, 1.0) - (4.0, 1.0) - (4.0, 2.5) - (8.0, 2.5) -```` - To now define the segments, we define: -````julia +````@example constrained_edges C = Set([(2, 1), (2, 11), (2, 7), (2, 5)]) ```` -```` -Set{Tuple{Int64, Int64}} with 4 elements: - (2, 5) - (2, 11) - (2, 1) - (2, 7) -```` - With this notation, each `Tuple` is an individual edge to include in the triangulation, with `(i, j)` meaning the edge connecting the points @@ -68,39 +45,15 @@ edge to include in the triangulation, with make the triangulation, comparing it to its unconstrained counterpart. -````julia +````@example constrained_edges tri = triangulate(pts) ```` -```` -Delaunay Triangulation. - Number of vertices: 11 - Number of triangles: 11 - Number of edges: 21 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: false -```` - -````julia +````@example constrained_edges cons_tri = triangulate(pts; segments=C) ```` -```` -Delaunay Triangulation. - Number of vertices: 11 - Number of triangles: 11 - Number of edges: 21 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: true -```` - -````julia +````@example constrained_edges fig = Figure() ax1 = Axis(fig[1, 1], xlabel="x", ylabel=L"y", title="(a): Unconstrained", titlealign=:left, @@ -114,28 +67,16 @@ resize_to_layout!(fig) fig ```` -```@raw html - -``` - As you can see, the constrained edges in magenta have now been included in the triangulation in (b), whereas in (a) most were previously not included. You can view the constrained edges by using -````julia +````@example constrained_edges get_interior_segments(cons_tri) ```` -```` -Set{Tuple{Int64, Int64}} with 4 elements: - (1, 2) - (2, 5) - (7, 2) - (11, 2) -```` - There is also a function [`get_all_segments`](@ref), which in this case is the same as [`get_interior_segments`](@ref), but in the case of a triangulation with constrained diff --git a/docs/src/tutorials/constrained_interior_within_interiors.md b/docs/src/tutorials/constrained_interior_within_interiors.md index 540286d32..20178710d 100644 --- a/docs/src/tutorials/constrained_interior_within_interiors.md +++ b/docs/src/tutorials/constrained_interior_within_interiors.md @@ -9,7 +9,7 @@ Now we consider triangulating a domain which has not only an interior boundary, but also an interior boundary inside that interior boundary. To start, let us load the packages. -````julia +````@example constrained_interior_within_interiors using DelaunayTriangulation using CairoMakie using StableRNGs @@ -24,7 +24,7 @@ the orientation of an interior curve is the opposite orientation to the curve it's inside of. Here are the points we will be triangulating. -````julia +````@example constrained_interior_within_interiors curve_1 = [ [(0.0, 0.0), (5.0, 0.0), (10.0, 0.0), (15.0, 0.0), (20.0, 0.0), (25.0, 0.0)], [(25.0, 0.0), (25.0, 5.0), (25.0, 10.0), (25.0, 15.0), (25.0, 20.0), (25.0, 25.0)], @@ -53,23 +53,15 @@ points = [ boundary_nodes, points = convert_boundary_points_to_indices(curves; existing_points=points) ```` -```` -([[[35, 36, 37, 38, 39, 40], [40, 41, 42, 43, 44, 45], [45, 46, 47, 48, 49, 50], [50, 51, 52, 53, 54, 35]], [[55, 56, 57, 58, 59], [59, 60, 61, 62, 63], [63, 64, 65, 66, 67, 55]], [[68, 69, 70, 71, 72, 73, 74, 68]]], [(3.0, 23.0), (9.0, 24.0), (9.2, 22.0), (14.8, 22.8), (16.0, 22.0), (23.0, 23.0), (22.6, 19.0), (23.8, 17.8), (22.0, 14.0), (22.0, 11.0), (24.0, 6.0), (23.0, 2.0), (19.0, 1.0), (16.0, 3.0), (10.0, 1.0), (11.0, 3.0), (6.0, 2.0), (6.2, 3.0), (2.0, 3.0), (2.6, 6.2), (2.0, 8.0), (2.0, 11.0), (5.0, 12.0), (2.0, 17.0), (3.0, 19.0), (6.0, 18.0), (6.5, 14.5), (13.0, 19.0), (13.0, 12.0), (16.0, 8.0), (9.8, 8.0), (7.5, 6.0), (12.0, 13.0), (19.0, 15.0), (0.0, 0.0), (5.0, 0.0), (10.0, 0.0), (15.0, 0.0), (20.0, 0.0), (25.0, 0.0), (25.0, 5.0), (25.0, 10.0), (25.0, 15.0), (25.0, 20.0), (25.0, 25.0), (20.0, 25.0), (15.0, 25.0), (10.0, 25.0), (5.0, 25.0), (0.0, 25.0), (0.0, 20.0), (0.0, 15.0), (0.0, 10.0), (0.0, 5.0), (4.0, 6.0), (4.0, 14.0), (4.0, 20.0), (18.0, 20.0), (20.0, 20.0), (20.0, 16.0), (20.0, 12.0), (20.0, 8.0), (20.0, 4.0), (16.0, 4.0), (12.0, 4.0), (8.0, 4.0), (4.0, 4.0), (12.906, 10.912), (16.0, 12.0), (16.16, 14.46), (16.29, 17.06), (13.13, 16.86), (8.92, 16.4), (8.8, 10.9)]) -```` - To now triangulate: -````julia +````@example constrained_interior_within_interiors rng = StableRNG(123) # triangulation is not unique when there are cocircular points tri = triangulate(points; boundary_nodes, rng) fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/constrained_interior_within_interiors.jl). diff --git a/docs/src/tutorials/constrained_multiply_connected.md b/docs/src/tutorials/constrained_multiply_connected.md index fa26b4e34..e6887f69a 100644 --- a/docs/src/tutorials/constrained_multiply_connected.md +++ b/docs/src/tutorials/constrained_multiply_connected.md @@ -9,7 +9,7 @@ We now consider triangulating a domain which has not only a boundary, but also an interior boundary. To start, let us load the packages. -````julia +````@example constrained_multiply_connected using DelaunayTriangulation using CairoMakie using StableRNGs @@ -26,7 +26,7 @@ the interior boundaries must be clockwise so that the orientations of the interiors relative to the boundaries are consistent. Note again that neighbouring segments must connect. -````julia +````@example constrained_multiply_connected curve_1 = [ [ # first segment (0.0, 0.0), (4.0, 0.0), (8.0, 0.0), (12.0, 0.0), (12.0, 4.0), @@ -65,6 +65,7 @@ points = [ (5.6, 7.8), (5.6, 7.6), (5.6, 7.4), (6.2, 7.4), (6.0, 7.6), (7.0, 7.8), (7.0, 7.4)] boundary_nodes, points = convert_boundary_points_to_indices(curves; existing_points=points); +nothing #hide ```` Notice that `curve_1` and `curve_2` are split up into multiple segments. For `curve_3` @@ -73,192 +74,64 @@ treating them as a single segment. Now let us triangulate. -````julia +````@example constrained_multiply_connected rng = StableRNG(123) # the triangulation is not unique due to cocircular points tri = triangulate(points; boundary_nodes, rng) fig, ax, sc = triplot(tri, show_constrained_edges=true, show_convex_hull=true) fig ```` -```@raw html - -``` - Like before, we examine individual segments by referring to them by their ghost vertices, which are still in the order `-1`, `-2`, and so on in the order of the segments provided in `boundary_nodes`. This is a lot more cumbersome to keep track of than the previous tutorials since there are many more ghost vertices. This is where the boundary fields become much more useful. For instance, the `boundary_edge_map` in this case is given by: -````julia +````@example constrained_multiply_connected get_boundary_edge_map(tri) ```` -```` -Dict{Tuple{Int64, Int64}, Tuple{Tuple{Int64, Int64}, Int64}} with 43 entries: - (61, 62) => ((1, 1), 7) - (58, 59) => ((1, 1), 4) - (93, 90) => ((3, 1), 4) - (56, 57) => ((1, 1), 2) - (55, 56) => ((1, 1), 1) - (96, 97) => ((4, 1), 3) - (92, 93) => ((3, 1), 3) - (75, 76) => ((1, 2), 9) - (97, 94) => ((4, 1), 4) - (71, 72) => ((1, 2), 5) - (67, 68) => ((1, 2), 1) - (77, 78) => ((1, 2), 11) - (60, 61) => ((1, 1), 6) - (88, 89) => ((2, 2), 5) - (66, 67) => ((1, 1), 12) - (69, 70) => ((1, 2), 3) - (76, 77) => ((1, 2), 10) - (73, 74) => ((1, 2), 7) - (91, 92) => ((3, 1), 2) - (64, 65) => ((1, 1), 10) - (80, 81) => ((2, 1), 2) - (84, 85) => ((2, 2), 1) - (89, 79) => ((2, 2), 6) - (87, 88) => ((2, 2), 4) - (68, 69) => ((1, 2), 2) - (59, 60) => ((1, 1), 5) - (70, 71) => ((1, 2), 4) - (81, 82) => ((2, 1), 3) - (94, 95) => ((4, 1), 1) - (90, 91) => ((3, 1), 1) - (72, 73) => ((1, 2), 6) - (62, 63) => ((1, 1), 8) - (83, 84) => ((2, 1), 5) - (65, 66) => ((1, 1), 11) - (74, 75) => ((1, 2), 8) - (78, 55) => ((1, 2), 12) - (85, 86) => ((2, 2), 2) - (86, 87) => ((2, 2), 3) - (95, 96) => ((4, 1), 2) - (63, 64) => ((1, 1), 9) - (57, 58) => ((1, 1), 3) - (82, 83) => ((2, 1), 4) - (79, 80) => ((2, 1), 1) -```` - The `Tuples` in the `values` are now of the form `((I, J), K)`, with `I` the curve index (with `1` being the outer boundary), `J` the segment index, and `K` the position of the edge within the segment. To look at the ghost vertices directly, another useful field is `ghost_vertex_ranges`: -````julia +````@example constrained_multiply_connected get_ghost_vertex_ranges(tri) ```` -```` -Dict{Int64, UnitRange{Int64}} with 6 entries: - -5 => -5:-5 - -1 => -2:-1 - -3 => -4:-3 - -2 => -2:-1 - -4 => -4:-3 - -6 => -6:-6 -```` - This field maps a ghost vertex to the complete set of ghost vertices that might be found on the curve corresponding to that ghost vertex. For example, `-3 => -4:-3` means that the ghost vertex `-3` is part of a curve that, in addition to itself, contains the ghost vertex `-4`. If you want all the ghost vertex, you can use -````julia +````@example constrained_multiply_connected DelaunayTriangulation.all_ghost_vertices(tri) ```` -```` -KeySet for a Dict{Int64, UnitRange{Int64}} with 6 entries. Keys: - -5 - -1 - -3 - -2 - -4 - -6 -```` - which is just `keys(get_ghost_vertex_ranges(tri))`. If you just want to find what curve and what segment a ghost vertex belongs to, you can look at the `ghost_vertex_map`: -````julia +````@example constrained_multiply_connected get_ghost_vertex_map(tri) ```` -```` -Dict{Int64, Tuple{Int64, Int64}} with 6 entries: - -5 => (3, 1) - -1 => (1, 1) - -3 => (2, 1) - -2 => (1, 2) - -4 => (2, 2) - -6 => (4, 1) -```` - So that, for example, `-3 => (2, 1)` means that the ghost vertex `-3` corresponds to the first part (from the second `Tuple` element) of the second curve (from the first `Tuple` element). To get all the boundary nodes, you can use -````julia +````@example constrained_multiply_connected DelaunayTriangulation.get_all_boundary_nodes(tri) ```` -```` -Set{Int64} with 43 elements: - 56 - 55 - 60 - 67 - 73 - 64 - 90 - 63 - 86 - 91 - 62 - 58 - 75 - 92 - 69 - 68 - 82 - 85 - 84 - 77 - 95 - 71 - 66 - 76 - 93 - 59 - 87 - 79 - 81 - 74 - 61 - 94 - 57 - 70 - 88 - 78 - 72 - 83 - 89 - 80 - 96 - 65 - 97 -```` - To give an example of how we can work with this boundary, let us compute the area of the triangulation (a more efficient approach is with [`get_area(tri)`](@ref get_area), but this is just for demonstration). For this, the order of the boundary edges is appropriate, so we must iterate in a way that respects the ordering. -````julia +````@example constrained_multiply_connected function get_triangulation_area(tri) A = 0.0 nc = DelaunayTriangulation.num_curves(tri) @@ -283,17 +156,13 @@ end A = get_triangulation_area(tri) ```` -```` -330.0 -```` - This is of course quite a complicated example since we need to take care of the order. If we don't care about order, then the complexity of the code for iterating over a boundary is much simpler. For example, here we compute the perimeter of the boundary, and we also consider the length of each curve and of each segment. -````julia +````@example constrained_multiply_connected function get_perimeters(tri) total_perimeter = 0.0 nc = DelaunayTriangulation.num_curves(tri) @@ -316,10 +185,6 @@ end ℓ, cℓ, sℓ = get_perimeters(tri) ```` -```` -(150.2711258282229, [92.61427157873052, 24.0, 20.0, 13.65685424949238], Dict((1, 2) => 49.30056307974577, (3, 1) => 20.0, (1, 1) => 43.31370849898476, (4, 1) => 13.65685424949238, (2, 2) => 12.0, (2, 1) => 12.0)) -```` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/constrained_multiply_connected.jl). diff --git a/docs/src/tutorials/constrained_multipolygon.md b/docs/src/tutorials/constrained_multipolygon.md index 19a267696..83e264d05 100644 --- a/docs/src/tutorials/constrained_multipolygon.md +++ b/docs/src/tutorials/constrained_multipolygon.md @@ -11,7 +11,7 @@ with the outer boundaries being counter-clockwise, and all the interior boundaries clockwise (and other interiors inside interiors counter-clockwise, etc., if you please). Here is a simple example. -````julia +````@example constrained_multipolygon using DelaunayTriangulation using CairoMakie @@ -33,13 +33,9 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Here is another example. -````julia +````@example constrained_multipolygon C = (15.7109521325776, 33.244486807457) D = (14.2705719699703, 32.8530791545746) E = (14.3, 27.2) @@ -200,10 +196,6 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/constrained_multipolygon.jl). diff --git a/docs/src/tutorials/constrained_outer_boundary.md b/docs/src/tutorials/constrained_outer_boundary.md index 6a4a77047..88a24b171 100644 --- a/docs/src/tutorials/constrained_outer_boundary.md +++ b/docs/src/tutorials/constrained_outer_boundary.md @@ -10,14 +10,14 @@ having constrained segments, we have a constrained outer boundary. This is especially useful as it allows us to, for example, have a non-convex boundary. To start, let us load in the packages we will need. -````julia +````@example constrained_outer_boundary using DelaunayTriangulation using CairoMakie ```` Now, we define some of the points we will be triangulating. -````julia +````@example constrained_outer_boundary pts = [ (-7.36, 12.55), (-9.32, 8.59), (-9.0, 3.0), (-6.32, -0.27), (-4.78, -1.53), (2.78, -1.41), (-5.42, 1.45), (7.86, 0.67), @@ -28,32 +28,6 @@ pts = [ ] ```` -```` -22-element Vector{Tuple{Float64, Float64}}: - (-7.36, 12.55) - (-9.32, 8.59) - (-9.0, 3.0) - (-6.32, -0.27) - (-4.78, -1.53) - (2.78, -1.41) - (-5.42, 1.45) - (7.86, 0.67) - (10.92, 0.23) - (9.9, 7.39) - (8.14, 4.77) - (13.4, 8.61) - (7.4, 12.27) - (2.2, 13.85) - (-3.48, 10.21) - (-4.56, 7.35) - (3.44, 8.99) - (3.74, 5.87) - (-2.0, 8.0) - (-2.52, 4.81) - (1.34, 6.77) - (1.24, 4.15) -```` - To define a boundary, we need to provide a counter-clockwise sequence of indices corresponding to the boundary points, and the first index must match the last index so the boundary is closed. While we could @@ -63,7 +37,7 @@ tedious to get correct. So, we instead provide the function [`convert_boundary_points_to_indices`](@ref) which takes in a vector of coordinates, and then returns the correct set of indices. Here is how we use it: -````julia +````@example constrained_outer_boundary boundary_points = [ (0.0, 0.0), (2.0, 1.0), (3.98, 2.85), (6.0, 5.0), (7.0, 7.0), (7.0, 9.0), (6.0, 11.0), (4.0, 12.0), @@ -72,113 +46,31 @@ boundary_points = [ (-6.94, 7.13), (-6.0, 5.0), (-4.0, 3.0), (-2.0, 1.0), (0.0, 0.0) ] boundary_nodes, pts = convert_boundary_points_to_indices(boundary_points; existing_points=pts); +nothing #hide ```` The keyword argument `existing_points` is so that the points in `boundary_points` get appended (in-place) to `pts`, as we see: -````julia +````@example constrained_outer_boundary pts ```` -```` -42-element Vector{Tuple{Float64, Float64}}: - (-7.36, 12.55) - (-9.32, 8.59) - (-9.0, 3.0) - (-6.32, -0.27) - (-4.78, -1.53) - (2.78, -1.41) - (-5.42, 1.45) - (7.86, 0.67) - (10.92, 0.23) - (9.9, 7.39) - (8.14, 4.77) - (13.4, 8.61) - (7.4, 12.27) - (2.2, 13.85) - (-3.48, 10.21) - (-4.56, 7.35) - (3.44, 8.99) - (3.74, 5.87) - (-2.0, 8.0) - (-2.52, 4.81) - (1.34, 6.77) - (1.24, 4.15) - (0.0, 0.0) - (2.0, 1.0) - (3.98, 2.85) - (6.0, 5.0) - (7.0, 7.0) - (7.0, 9.0) - (6.0, 11.0) - (4.0, 12.0) - (2.0, 12.0) - (1.0, 11.0) - (0.0, 9.13) - (-1.0, 11.0) - (-2.0, 12.0) - (-4.0, 12.0) - (-6.0, 11.0) - (-7.0, 9.0) - (-6.94, 7.13) - (-6.0, 5.0) - (-4.0, 3.0) - (-2.0, 1.0) -```` - The `boundary_nodes` is then these indices: -````julia +````@example constrained_outer_boundary boundary_nodes ```` -```` -21-element Vector{Int64}: - 23 - 24 - 25 - 26 - 27 - 28 - 29 - 30 - 31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40 - 41 - 42 - 23 -```` - To now triangulate, we use the `boundary_nodes` keyword argument. Like in the last tutorial, we also give a comparison to the unconstrained version. -````julia +````@example constrained_outer_boundary tri = triangulate(pts) cons_tri = triangulate(pts; boundary_nodes) ```` -```` -Delaunay Triangulation. - Number of vertices: 28 - Number of triangles: 34 - Number of edges: 61 - Has boundary nodes: true - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: true -```` - -````julia +````@example constrained_outer_boundary fig = Figure() ax1 = Axis(fig[1, 1], xlabel="x", ylabel=L"y", title="(a): Unconstrained", titlealign=:left, @@ -192,10 +84,6 @@ resize_to_layout!(fig) fig ```` -```@raw html - -``` - Notice now that the boundary in (b) is not convex, as is clear from the convex hull shown in red. You can access the convex hull using [`get_convex_hull(cons_tri)`](@ref get_convex_hull). We also note that the triangulation @@ -203,15 +91,11 @@ no longer contains every point in `pts`, as by default all triangles away from the boundary are deleted, so that we do actually have a boundary. If for some reason you do not want this behaviour, use `delete_holes = false`: -````julia +````@example constrained_outer_boundary full_tri = triangulate(pts; boundary_nodes, delete_holes=false) fig, ax, sc = triplot(full_tri, show_constrained_edges=true, show_convex_hull=true) ```` -```@raw html - -``` - This default behaviour does mean you need to be careful if you use [`DelaunayTriangulation.each_point`](@ref) or [`DelaunayTriangulation.each_point_index`](@ref), as these iterators will contain all points, possibly iterating over points that aren't in the triangulation. For this reason, it is recommended that you @@ -221,35 +105,10 @@ There are multiple methods available for working directly with the boundary nodes. You can get the boundary nodes using `get_boundary_nodes(tri)`: -````julia +````@example constrained_outer_boundary get_boundary_nodes(cons_tri) ```` -```` -21-element Vector{Int64}: - 23 - 24 - 25 - 26 - 27 - 28 - 29 - 30 - 31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40 - 41 - 42 - 23 -```` - Later tutorials also consider other methods for working with the boundary where care needs to be taken with the boundary, or part of the boundary, being considered. For now, here is an example where we use @@ -260,7 +119,7 @@ A = \dfrac{1}{2}\sum_{i=1}^n \left(y_i + y_{i+1}\right)\left(x_i - x_{i+1}\right ``` Here is one implementation. -````julia +````@example constrained_outer_boundary function shoelace_area(tri) bn = get_boundary_nodes(tri) n = num_boundary_edges(bn) # length(bn) - 1 in this case since bn[1] = bn[end] @@ -278,78 +137,38 @@ end shoelace_area(cons_tri) ```` -```` -119.20499999999998 -```` - We also provide a map that contains the edges as the keys (*not* in order), and the values are `Tuple`s `(I, J)` such that `get_boundary_nodes(get_boundary_nodes(cons_tri, I), J)` gives the corresponding edge. The first call, `bn = get_boundary_nodes(cons_tri, I)` is for obtaining the chain of boundary edges containing the boundary edge, and then `get_boundary_nodes(bn, j)` gets the actual edge. -````julia +````@example constrained_outer_boundary get_boundary_edge_map(cons_tri) ```` -```` -Dict{Tuple{Int64, Int64}, Tuple{Vector{Int64}, Int64}} with 20 entries: - (23, 24) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 1) - (40, 41) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 18) - (25, 26) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 3) - (35, 36) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 13) - (30, 31) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 8) - (29, 30) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 7) - (42, 23) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 20) - (33, 34) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 11) - (38, 39) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 16) - (27, 28) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 5) - (26, 27) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 4) - (39, 40) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 17) - (24, 25) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 2) - (28, 29) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 6) - (41, 42) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 19) - (31, 32) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 9) - (32, 33) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 10) - (34, 35) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 12) - (37, 38) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 15) - (36, 37) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 14) -```` - In our case, the `I` is just `boundary_nodes` since we only have one contiguous boundary. To give an example, take -````julia +````@example constrained_outer_boundary bem = get_boundary_edge_map(cons_tri) e, (I, J) = first(bem) ```` -```` -(23, 24) => ([23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 23], 1) -```` - -````julia +````@example constrained_outer_boundary bn = get_boundary_nodes(cons_tri, I) # same as boundary_nodes for this problem; see the later tutorials bn_j = get_boundary_nodes(bn, J) ```` -```` -23 -```` - This returns `23`, which is the start of the edge `e`. The full edge is given by -````julia +````@example constrained_outer_boundary get_boundary_nodes.(Ref(bn), (J, J+1)) # Ref to not broadcast over bn ```` -```` -(23, 24) -```` - To give an example, here's how we compute the perimeter of the triangulation. This only needs the edges, so we only consider the `keys` of the map. -````julia +````@example constrained_outer_boundary function get_perimeter(tri) bem = get_boundary_edge_map(tri) ℓ = 0.0 @@ -363,10 +182,6 @@ end get_perimeter(cons_tri) ```` -```` -44.23794172896859 -```` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/constrained_outer_boundary.jl). diff --git a/docs/src/tutorials/constrained_outer_boundary_segmented.md b/docs/src/tutorials/constrained_outer_boundary_segmented.md index 4030856db..233304d30 100644 --- a/docs/src/tutorials/constrained_outer_boundary_segmented.md +++ b/docs/src/tutorials/constrained_outer_boundary_segmented.md @@ -12,72 +12,44 @@ for the identification of separate parts of a boundary. This is useful, for exam if you want to assign different boundary conditions on different parts of the boundary for a differential equation problem. To start, let us load in the packages we will need. -````julia +````@example constrained_outer_boundary_segmented using DelaunayTriangulation using CairoMakie ```` Now, we define some of the points we will be triangulating. -````julia +````@example constrained_outer_boundary_segmented points = [ (2.0, 8.0), (6.0, 4.0), (2.0, 6.0), (2.0, 4.0), (8.0, 2.0) ] ```` -```` -5-element Vector{Tuple{Float64, Float64}}: - (2.0, 8.0) - (6.0, 4.0) - (2.0, 6.0) - (2.0, 4.0) - (8.0, 2.0) -```` - We now want to define our boundary. The method for providing a boundary to be identified into multiple sections is to provided a vector of vectors of indices, where each vector of indices is a section. The last index of each section must match the first index of the next section, including the last with the first section so that the boundary is closed. Here, we provide three . -````julia +````@example constrained_outer_boundary_segmented section_1 = [(0.0, 0.0), (14.0, 0.0)] section_2 = [(14.0, 0.0), (10.0, 4.0), (4.0, 6.0), (2.0, 12.0), (0.0, 14.0)] section_3 = [(0.0, 14.0), (0.0, 0.0)] boundary_points = [section_1, section_2, section_3] ```` -```` -3-element Vector{Vector{Tuple{Float64, Float64}}}: - [(0.0, 0.0), (14.0, 0.0)] - [(14.0, 0.0), (10.0, 4.0), (4.0, 6.0), (2.0, 12.0), (0.0, 14.0)] - [(0.0, 14.0), (0.0, 0.0)] -```` - We now convert these boundary points to indices using [`convert_boundary_points_to_indices`](@ref), and then we triangulate. We also add a constrained edge. -````julia +````@example constrained_outer_boundary_segmented E = Set(((6, 9),)) # (0, 0) → (4, 6) boundary_nodes, points = convert_boundary_points_to_indices(boundary_points; existing_points=points) tri = triangulate(points; boundary_nodes, segments=E) ```` -```` -Delaunay Triangulation. - Number of vertices: 11 - Number of triangles: 14 - Number of edges: 24 - Has boundary nodes: true - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: true -```` - -````julia +````@example constrained_outer_boundary_segmented fig, ax, sc = triplot(tri, show_constrained_edges=true, constrained_edge_linewidth=6) lines!(ax, section_1, color=:red, linewidth=6) lines!(ax, section_2, color=:green, linewidth=6) @@ -85,10 +57,6 @@ lines!(ax, section_3, color=:blue, linewidth=6) fig ```` -```@raw html - -``` - The first section is in red, the second section is in green, and the third section is in blue. We use ghost vertices to identify the sections, where the first section is identified by `-1`, the second by `-2`, and the third by `-3`. @@ -97,51 +65,25 @@ Before we go into how the sections can be worked with, let us make a note regard now that we have both constrained segments and boundary segments which might technically both be thought of as being constrained edges. If we look at `get_interior_segments(tri)`, we get: -````julia +````@example constrained_outer_boundary_segmented get_interior_segments(tri) ```` -```` -Set{Tuple{Int64, Int64}} with 1 element: - (9, 6) -```` - This is just the constrained segment we provided, and not the boundary segment. If we instead want all constrained segments, considering both the boundary segments and the segments provided, we can instead use [`get_all_segments(tri)`](@ref get_all_segments). -````julia +````@example constrained_outer_boundary_segmented get_all_segments(tri) ```` -```` -Set{Tuple{Int64, Int64}} with 7 elements: - (9, 6) - (7, 8) - (8, 9) - (9, 10) - (6, 7) - (10, 11) - (11, 6) -```` - Let us now explore the several ways available for working with this boundary. First, if we just want to work with the boundary edges without caring about the order, we can again use the boundary edge map. -````julia +````@example constrained_outer_boundary_segmented get_boundary_edge_map(tri) ```` -```` -Dict{Tuple{Int64, Int64}, Tuple{Int64, Int64}} with 6 entries: - (7, 8) => (2, 1) - (8, 9) => (2, 2) - (9, 10) => (2, 3) - (6, 7) => (1, 1) - (10, 11) => (2, 4) - (11, 6) => (3, 1) -```` - Remember that the keys are the edges, and the values are `Tuples` that give us (1) the section index, and (2) the position of the edge within that section (more specifically, the position of the first vertex of the edge). This would be useful if, for example, you don't care about the order of the edges, but you do @@ -164,7 +106,7 @@ f(x, y) = \begin{cases} ``` and $\Gamma_i$ denotes the $i$th section. -````julia +````@example constrained_outer_boundary_segmented function section_function(x, y, section_index) f = if abs(section_index) == 1 1.0 @@ -191,47 +133,25 @@ end s = compute_sum(tri) ```` -```` -2.9351669864789773 -```` - An alternative way to look at each section is to use [`get_adjacent2vertex`](@ref) with the associated ghost vertex. -````julia +````@example constrained_outer_boundary_segmented get_adjacent2vertex(tri, -1) ```` -```` -Set{Tuple{Int64, Int64}} with 1 element: - (7, 6) -```` - -````julia +````@example constrained_outer_boundary_segmented get_adjacent2vertex(tri, -2) ```` -```` -Set{Tuple{Int64, Int64}} with 4 elements: - (10, 9) - (8, 7) - (11, 10) - (9, 8) -```` - -````julia +````@example constrained_outer_boundary_segmented get_adjacent2vertex(tri, -3) ```` -```` -Set{Tuple{Int64, Int64}} with 1 element: - (6, 11) -```` - Note that the provided edges are not in order, but this is helpful for considering specific sections. For example, if we just wanted to compute the above sum over the second section, we could do -````julia +````@example constrained_outer_boundary_segmented function compute_sum_2(tri) edges = get_adjacent2vertex(tri, -2) s = 0.0 @@ -248,41 +168,21 @@ end s = compute_sum_2(tri) ```` -```` -1.1812647321356726 -```` - If your application instead wanted all the nodes on the section rather than the edges, you can look at the neighbours to the ghost vertex. For example, all the nodes on the section section can be identified using -````julia +````@example constrained_outer_boundary_segmented get_neighbours(tri, -2) ```` -```` -Set{Int64} with 5 elements: - 7 - 11 - 10 - 9 - 8 -```` - Another field is the `ghost_vertex_map`, which maps a given ghost vertex to the associated section. This is more so useful for internal methods, but you may sometimes need it. -````julia +````@example constrained_outer_boundary_segmented get_ghost_vertex_map(tri) ```` -```` -Dict{Int64, Int64} with 3 entries: - -1 => 1 - -3 => 3 - -2 => 2 -```` - In this case, the `i`th section just has the ghost vertex `-i`, but this is typically used to deal with the case of multiple boundaries so that we know where a ghost vertex belongs. ## Just the code diff --git a/docs/src/tutorials/convex.md b/docs/src/tutorials/convex.md index cec03d99a..684efabcf 100644 --- a/docs/src/tutorials/convex.md +++ b/docs/src/tutorials/convex.md @@ -8,7 +8,7 @@ In this tutorial, we show how we can triangulate convex polygons. The function [`triangulate_convex`](@ref) is used for this. Let us start with a simple example. -````julia +````@example convex using DelaunayTriangulation using CairoMakie @@ -21,27 +21,11 @@ S = 1:7 tri = triangulate_convex(points, 1:7) ```` -```` -Delaunay Triangulation. - Number of vertices: 7 - Number of triangles: 5 - Number of edges: 11 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: false -```` - -````julia +````@example convex fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - This `tri` is our triangulation of the convex polygon. The first input is the set of points, and `S` defines the vertices to take from these points and their order, @@ -53,7 +37,7 @@ needed. Let us give a larger example. For simplicity, we triangulate a a discretised circle. -````julia +````@example convex θ = LinRange(0, 2π, 5000) |> collect pop!(θ) x = cos.(θ) @@ -63,65 +47,23 @@ S = 1:4999 # can also be [1:4999; 1], if you want the array to be circular tri = triangulate_convex(points, S) ```` -```` -Delaunay Triangulation. - Number of vertices: 4999 - Number of triangles: 4997 - Number of edges: 9995 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: false -```` - -````julia +````@example convex fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Here is a comparison of the time it takes to triangulate this using `triangulate_convex` or `triangulate`. -````julia +````@example convex using BenchmarkTools @benchmark triangulate_convex($points, $S) ```` -```` -BenchmarkTools.Trial: 63 samples with 1 evaluation. - Range (min … max): 49.190 ms … 321.321 ms ┊ GC (min … max): 0.00% … 24.77% - Time (median): 61.254 ms ┊ GC (median): 0.00% - Time (mean ± σ): 80.549 ms ± 44.465 ms ┊ GC (mean ± σ): 12.58% ± 13.85% - - ▄███ ▁ - ████▆▆▇▄▆▄▄▆▁▄▄▁▁▄▁▇▆▁█▁▁▁▆▁▁▁▁▁▁▁▆▁▁▁▁▁▁▁▄▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▄ ▁ - 49.2 ms Histogram: frequency by time 212 ms < - - Memory estimate: 29.43 MiB, allocs estimate: 583522. -```` - -````julia +````@example convex @benchmark triangulate($points) ```` -```` -BenchmarkTools.Trial: 11 samples with 1 evaluation. - Range (min … max): 394.357 ms … 656.843 ms ┊ GC (min … max): 0.00% … 0.00% - Time (median): 455.372 ms ┊ GC (median): 0.00% - Time (mean ± σ): 488.970 ms ± 92.472 ms ┊ GC (mean ± σ): 1.13% ± 3.85% - - █ ▁ ▁▁ ▁ ▁ ▁ ▁ ▁ ▁ - █▁▁▁█▁▁▁▁██▁▁▁█▁▁▁▁█▁▁▁▁▁▁▁▁█▁▁▁▁▁▁█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█▁▁█ ▁ - 394 ms Histogram: frequency by time 657 ms < - - Memory estimate: 32.43 MiB, allocs estimate: 617044. -```` - For the smaller example that we started with above, `triangulate_convex` is also faster, although not by much (≈15.10 μs versus ≈10.7 μs). ## Just the code diff --git a/docs/src/tutorials/convex_hull.md b/docs/src/tutorials/convex_hull.md index fb15bcb51..a4a2dec5d 100644 --- a/docs/src/tutorials/convex_hull.md +++ b/docs/src/tutorials/convex_hull.md @@ -13,7 +13,7 @@ from the point set directly, using the [monotone chain algorithm](https://en.wik Let us first demonstrate how we compute convex hulls from a triangulation. This is only possible from triangulations without a constrained boundary -````julia +````@example convex_hull using DelaunayTriangulation using CairoMakie using StableRNGs @@ -21,72 +21,30 @@ using StableRNGs We construct a triangulation of a point set. -````julia +````@example convex_hull rng = StableRNG(123) points = randn(rng, 2, 250) tri = triangulate(points; rng) ```` -```` -Delaunay Triangulation. - Number of vertices: 250 - Number of triangles: 489 - Number of edges: 738 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: false -```` - To get the convex hull, just use [`get_convex_hull`](@ref): -````julia +````@example convex_hull get_convex_hull(tri) ```` -```` -Convex hull. - Vertices: -10-element Vector{Int64}: - 151 - 96 - 43 - 159 - 25 - 147 - 65 - 206 - 199 - 151 -```` - You can also obtain the vertices directly from [`get_convex_hull_vertices`](@ref): -````julia +````@example convex_hull get_convex_hull_vertices(tri) ```` -```` -10-element Vector{Int64}: - 151 - 96 - 43 - 159 - 25 - 147 - 65 - 206 - 199 - 151 -```` - The vertices refer to indices of points in `points`, and they are given in counter-clockwise order. To obtain the convex hull directly from the points without constructing the triangulation, use [`convex_hull`](@ref): -````julia +````@example convex_hull ch = convex_hull(points) ch_points = [get_point(tri, i) for i in DelaunayTriangulation.get_vertices(ch)] fig, ax, sc = lines(ch_points, color=:red, linewidth=4) @@ -94,10 +52,6 @@ scatter!(ax, points) fig ```` -```@raw html - -``` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/convex_hull.jl). diff --git a/docs/src/tutorials/curve_bounded.md b/docs/src/tutorials/curve_bounded.md index c339b3108..cf245ff55 100644 --- a/docs/src/tutorials/curve_bounded.md +++ b/docs/src/tutorials/curve_bounded.md @@ -10,7 +10,7 @@ of functions introduced in the [refinement tutorial](../tutorials/refinement.md) Let us start by loading in the packages we will need. -````julia +````@example curve_bounded using DelaunayTriangulation using DelaunayTriangulation: EllipticalArc # CairoMakie also exports this using CairoMakie @@ -38,7 +38,7 @@ We start with a simple domain: a circle. In particular, we consider a circle of radius $r = 2$ centered at $(x, y) = (1/2, 2)$. In past tutorials, we would have defined a domain like this by a set of points around a boundary, e.g.: -````julia +````@example curve_bounded n = 50 r = 2.0 xc, yc = 1 / 2, 2.0 @@ -46,2581 +46,50 @@ xc, yc = 1 / 2, 2.0 θ[end] = θ[begin]; x = xc .+ r * cos.(θ) y = yc .+ r * sin.(θ); +nothing #hide ```` One problem with this approach is that we had to decide what value of $n$ to use for discretising this boundary. Instead, we can use `CircularArc`. For this, we use: -````julia +````@example curve_bounded p = (xc + r, yc) c = (xc, yc) arc = CircularArc(p, p, c) ```` -```` -(::CircularArc) (generic function with 1 method) -```` - Here, the syntax is `CircularArc(first_point, last_point, centre)`. Since the circle is closed, we use `p` for both `first_point` and `last_point`. Notice that the `arc` is a function. In particular, -````julia +````@example curve_bounded typeof(arc) |> supertype |> supertype ```` -```` -Function -```` - If we wanted to look at this circle, we would need to evaluate it at a set of $t \in [0, 1]$. -````julia +````@example curve_bounded t = LinRange(0, 1, 2500) points = arc.(t) ```` -```` -2500-element Vector{Tuple{Float64, Float64}}: - (2.5, 2.0) - (2.4999936784002426, 2.00502855437152) - (2.499974713640933, 2.0100570769545323) - (2.4999431058419583, 2.015085535960729) - (2.4998988552031305, 2.0201138996022054) - (2.499841962004185, 2.0251421360916586) - (2.4997724266047774, 2.0301702136425908) - (2.499690249444483, 2.0351981004695077) - (2.4995954310427924, 2.0402257647881212) - (2.49948797199911, 2.0452531748155494) - (2.4993678729927487, 2.0502802987705193) - (2.499235134782926, 2.055307104873564) - (2.4990897582087603, 2.0603335613472287) - (2.498931744189264, 2.065359636416266) - (2.4987610937233384, 2.070385298307842) - (2.4985778078897676, 2.0754105152517326) - (2.498381887847211, 2.0804352554805288) - (2.4981733348341963, 2.0854594872298335) - (2.4979521501691133, 2.0904831787384643) - (2.497718335250202, 2.0955062982486545) - (2.4974718915555476, 2.100528814006253) - (2.4972128206430675, 2.105550694260925) - (2.4969411241505046, 2.1105719072663534) - (2.4966568037954158, 2.1155924212804402) - (2.4963598613751605, 2.1206122045655045) - (2.496050298766889, 2.1256312253884855) - (2.4957281179275332, 2.1306494520211428) - (2.4953933208937915, 2.135666852740256) - (2.495045909782116, 2.1406833958278253) - (2.494685886788701, 2.1456990495712738) - (2.494313254189468, 2.150713782263646) - (2.4939280143400513, 2.155727562203809) - (2.493530169675782, 2.1607403576966524) - (2.493119722711676, 2.165752137053289) - (2.4926966760424136, 2.170762868591257) - (2.492261032342328, 2.175772520634716) - (2.491812794365383, 2.1807810615146512) - (2.49135196494516, 2.1857884595690718) - (2.490878546994839, 2.1907946831432112) - (2.490392543507178, 2.1957997005897285) - (2.4898939575544965, 2.2008034802689056) - (2.489382792288655, 2.2058059905488503) - (2.488859050941037, 2.2108071998056955) - (2.488322736822524, 2.2158070764237974) - (2.487773853323481, 2.2208055887959373) - (2.4872124039137287, 2.2258027053235208) - (2.4866383921425252, 2.2307983944167766) - (2.486051821638544, 2.235792624494959) - (2.485452696109849, 2.240785363986543) - (2.4848410193438717, 2.2457765813294284) - (2.4842167952073875, 2.2507662449711368) - (2.483580027646492, 2.255754323369012) - (2.482930720686575, 2.2607407849904186) - (2.4822688784322953, 2.265725598312942) - (2.481594505067554, 2.2707087318245875) - (2.48090760485547, 2.27569015402398) - (2.4802081821383517, 2.280669833420561) - (2.479496241337669, 2.2856477385347915) - (2.4787717869540273, 2.2906238378983472) - (2.4780348235671372, 2.29559810005432) - (2.4772853558357864, 2.300570493557415) - (2.4765233884978093, 2.3055409869741506) - (2.475748926370059, 2.3105095488830574) - (2.474961974348375, 2.315476147874875) - (2.474162537407552, 2.320440752552753) - (2.4733506206013125, 2.325403331532447) - (2.4725262290622676, 2.3303638534425195) - (2.4716893680018917, 2.3353222869245363) - (2.470840042710485, 2.3402786006332654) - (2.4699782585571426, 2.345232763236875) - (2.469104020989718, 2.3501847434171323) - (2.468217335534793, 2.355134509869601) - (2.4673182077976357, 2.3600820313038375) - (2.466406643462174, 2.365027276443593) - (2.4654826482909513, 2.3699702140270054) - (2.464546228125096, 2.374910812806803) - (2.4635973888842813, 2.3798490415504974) - (2.4626361365666893, 2.384784869040583) - (2.461662477248973, 2.389718264074733) - (2.4606764170862157, 2.394649195466) - (2.459677962311895, 2.3995776320430084) - (2.4586671192378438, 2.404503542650155) - (2.4576438942542067, 2.4094268961478047) - (2.456608293829402, 2.414347661412487) - (2.4555603245100817, 2.419265807337093) - (2.454499992921088, 2.4241813028310735) - (2.4534273057654135, 2.4290941168206324) - (2.452342269824156, 2.4340042182489268) - (2.4512448919564793, 2.4389115760762605) - (2.450135179099567, 2.443816159280281) - (2.4490131382685796, 2.4487179368561764) - (2.4478787765566095, 2.4536168778168714) - (2.446732101134638, 2.4585129511932218) - (2.4455731192514882, 2.4634061260342106) - (2.4444018382337793, 2.468296371407146) - (2.4432182654858816, 2.473183656397853) - (2.4420224084898683, 2.4780679501108724) - (2.4408142748054678, 2.4829492216696547) - (2.439593872070019, 2.4878274402167544) - (2.4383612079984185, 2.492702574914026) - (2.437116290383076, 2.4975745949428196) - (2.4358591270938614, 2.5024434695041746) - (2.434589726078059, 2.507309167819015) - (2.433308095360313, 2.5121716591283425) - (2.4320142430425804, 2.5170309126934343) - (2.4307081773040773, 2.5218868977960334) - (2.429389906401229, 2.5267395837385465) - (2.428059438667616, 2.531588939844234) - (2.4267167825139238, 2.536434935457409) - (2.425361946427886, 2.541277539943626) - (2.4239949389742343, 2.5461167226898773) - (2.4226157687946435, 2.550952453104787) - (2.4212244446076747, 2.555784700618803) - (2.4198209752087223, 2.5606134346843907) - (2.4184053694699594, 2.565438624776225) - (2.4169776363402775, 2.570260240391386) - (2.415537784845235, 2.5750782510495505) - (2.4140858240869965, 2.579892626293182) - (2.4126217632442764, 2.5847033356877276) - (2.4111456115722816, 2.5895103488218085) - (2.409657378402652, 2.5943136353074108) - (2.4081570731434025, 2.5991131647800807) - (2.406644705278862, 2.6039089068991133) - (2.405120284369615, 2.6087008313477464) - (2.4035838200524404, 2.613488907833352) - (2.40203532204025, 2.618273106087626) - (2.40047480012203, 2.623053395866783) - (2.398902264162774, 2.6278297469517438) - (2.3973177241034254, 2.6326021291483284) - (2.3957211899608124, 2.6373705122874465) - (2.3941126718275845, 2.642134866225289) - (2.3924921798721495, 2.646895160843517) - (2.3908597243386094, 2.6516513660494527) - (2.3892153155466946, 2.656403451776271) - (2.387558963891699, 2.661151387983188) - (2.3858906798444153, 2.665895144655651) - (2.3842104739510668, 2.6706346918055286) - (2.382518356833243, 2.675369999471301) - (2.3808143391878316, 2.6801010377182495) - (2.37909843178695, 2.684827776638642) - (2.3773706454778774, 2.689550186351928) - (2.3756309911829874, 2.6942682370049233) - (2.3738794798996787, 2.698981898772) - (2.3721161227003043, 2.7036911418552747) - (2.370340930732102, 2.708395936484798) - (2.3685539152171264, 2.713096252918741) - (2.366755087452173, 2.717792061443584) - (2.3649444588087114, 2.722483332374306) - (2.3631220407328115, 2.7271700360545688) - (2.361287844745071, 2.7318521428569085) - (2.3594418824405423, 2.736529623182919) - (2.3575841654886602, 2.7412024474634427) - (2.3557147056331686, 2.7458705861587536) - (2.3538335146920435, 2.750534009758748) - (2.351940604557422, 2.755192688783129) - (2.350035987195523, 2.759846593781591) - (2.3481196746465764, 2.7644956953340105) - (2.3461916790247432, 2.7691399640506273) - (2.344252012518039, 2.7737793705722344) - (2.34230068738826, 2.7784138855703597) - (2.340337715970902, 2.7830434797474553) - (2.3383631106750853, 2.7876681238370784) - (2.3363768839834744, 2.7922877886040816) - (2.334379048452198, 2.7969024448447923) - (2.332369616710775, 2.801512063387201) - (2.3303486014620267, 2.806116615091144) - (2.3283160154820033, 2.8107160708484886) - (2.3262718716199, 2.815310401583316) - (2.3242161827979757, 2.819899578252107) - (2.3221489620114726, 2.8244835718439227) - (2.320070222328533, 2.829062353380591) - (2.317979976890118, 2.8336358939168864) - (2.3158782389099213, 2.8382041645407177) - (2.31376502167429, 2.8427671363733054) - (2.311640338542138, 2.847324780569368) - (2.3095042029448605, 2.851877068317304) - (2.307356628386253, 2.8564239708393706) - (2.305197628442422, 2.8609654593918714) - (2.3030272167617003, 2.8655015052653328) - (2.3008454070645623, 2.8700320797846883) - (2.2986522131435363, 2.874557154309459) - (2.296447648863116, 2.8790767002339352) - (2.2942317281596734, 2.883590688987357) - (2.292004465041374, 2.8880990920340928) - (2.2897658735880824, 2.892601880873824) - (2.287515967951278, 2.8970990270417216) - (2.285254762353965, 2.9015905021086272) - (2.282982271090579, 2.906076277681234) - (2.2806985085269007, 2.910556325402263) - (2.2784034890999623, 2.915030616950646) - (2.2760972273179587, 2.919499124041703) - (2.2737797377601536, 2.923961818427321) - (2.2714510350767885, 2.928418671896131) - (2.2691111339889893, 2.93286965627369) - (2.2667600492886746, 2.937314743422656) - (2.264397795838461, 2.9417539052429675) - (2.262024388571569, 2.9461871136720204) - (2.2596398424917297, 2.950614340684844) - (2.2572441726730883, 2.955035558294283) - (2.254837394260112, 2.959450738551168) - (2.2524195224674886, 2.9638598535444967) - (2.249990572580038, 2.968262875401609) - (2.2475505599526073, 2.972659776288363) - (2.245099500009981, 2.977050528409311) - (2.242637408246779, 2.9814351040078755) - (2.240164300227359, 2.985813475366525) - (2.2376801915857207, 2.9901856148069474) - (2.235185098025405, 2.994551494690227) - (2.2326790353193946, 2.9989110874170195) - (2.2301620193100145, 3.003264365427724) - (2.2276340659088323, 3.007611301202659) - (2.2250951910965586, 3.011951867262237) - (2.222545410922943, 3.016286036167136) - (2.219984741506676, 3.0206137805184756) - (2.217413199035283, 3.0249350729579874) - (2.2148307997650285, 3.0292498861681905) - (2.2122375600208057, 3.033558192872563) - (2.2096334961960387, 3.037859965835714) - (2.2070186247525765, 3.042155177863557) - (2.2043929622205907, 3.04644380180348) - (2.2017565251984674, 3.0507258105445194) - (2.199109330352708, 3.05500117701753) - (2.1964513944178172, 3.0592698741953552) - (2.193782734196203, 3.063531875093001) - (2.1911033665580675, 3.067787152767803) - (2.1884133084412998, 3.072035680319599) - (2.1857125768513708, 3.0762774308908982) - (2.1830011888612244, 3.080512377667051) - (2.180279161611171, 3.08474049387642) - (2.1775465123087776, 3.0889617527905453) - (2.174803258228758, 3.0931761277243184) - (2.172049416712868, 3.097383592036148) - (2.1692850051697903, 3.1015841191281277) - (2.1665100410750293, 3.105777682446207) - (2.1637245419707964, 3.1099642554803575) - (2.160928525465902, 3.1141438117647398) - (2.158122009235645, 3.1183163248778714) - (2.155305011021695, 3.1224817684427952) - (2.15247754863199, 3.126640116127244) - (2.149639639940614, 3.130791341643808) - (2.1467913028876895, 3.1349354187501) - (2.1439325554792648, 3.139072321248925) - (2.1410634157871957, 3.1432020229884396) - (2.1381839019490356, 3.147324497862323) - (2.135294032167918, 3.1514397198099395) - (2.1323938247124437, 3.1555476628165025) - (2.129483297916562, 3.15964830091324) - (2.1265624701794605, 3.16374160817756) - (2.123631359965441, 3.167827558733211) - (2.1206899858038106, 3.171906126750451) - (2.117738366288759, 3.175977286446204) - (2.114776520079243, 3.180041012084228) - (2.11180446589887, 3.1840972779752765) - (2.1088222225357756, 3.188146058477259) - (2.1058298088425094, 3.1921873279954074) - (2.1028272437359132, 3.196221060982432) - (2.0998145461970017, 3.2002472319386874) - (2.096791735270843, 3.2042658154123322) - (2.093758830066438, 3.208276785999491) - (2.0907158497565987, 3.212280118344412) - (2.0876628135778303, 3.2162757871396304) - (2.084599740830204, 3.2202637671261285) - (2.0815266508772403, 3.224244033093492) - (2.0784435631457843, 3.2282165598800727) - (2.075350497125882, 3.2321813223731466) - (2.0722474723706594, 3.236138295509072) - (2.0691345084961963, 3.2400874542734472) - (2.0660116251814054, 3.2440287737012734) - (2.0628788421679043, 3.247962228877105) - (2.059736179259893, 3.2518877949352127) - (2.0565836563240296, 3.2558054470597404) - (2.0534212932893023, 3.259715160484858) - (2.0502491101469036, 3.263616910494923) - (2.047067126950106, 3.267510672424632) - (2.0438753638141343, 3.2713964216591824) - (2.040673840916037, 3.275274133634422) - (2.0374625784945604, 3.2791437838370077) - (2.0342415968500207, 3.2830053478045595) - (2.031010916344174, 3.286858801125816) - (2.02777055740009, 3.290704119440787) - (2.024520540502021, 3.29454127844091) - (2.021260886195273, 3.2983702538692006) - (2.0179916150860757, 3.30219102152041) - (2.014712747841452, 3.306003557241173) - (2.0114243051890894, 3.309807836930165) - (2.008126307917206, 3.3136038365382534) - (2.0048187768744192, 3.3173915320686467) - (2.0015017329696185, 3.3211708995770506) - (1.998175197171826, 3.324941915171816) - (1.9948391905100709, 3.328704555014092) - (1.9914937340732513, 3.332458795317975) - (1.988138849010004, 3.3362046123506612) - (1.98477455652857, 3.3399419824325935) - (1.9814008778966594, 3.343670881937615) - (1.9780178344413182, 3.3473912872931146) - (1.9746254475487934, 3.351103174980179) - (1.971223738664397, 3.3548065215337406) - (1.9678127292923708, 3.3585013035427242) - (1.9643924409957514, 3.362187497650197) - (1.9609628953962321, 3.3658650805535144) - (1.9575241141740274, 3.36953402900447) - (1.954076119067736, 3.37319431980944) - (1.9506189318742029, 3.376845929829531) - (1.947152574448382, 3.380488835980726) - (1.9436770687031972, 3.3841230152340303) - (1.9401924366094052, 3.387748444615617) - (1.9366987001954552, 3.391365101206973) - (1.9331958815473504, 3.394972962145042) - (1.9296840028085085, 3.3985720046223724) - (1.9261630861796208, 3.402162205887257) - (1.9226331539185137, 3.405743543243881) - (1.9190942283400056, 3.4093159940524638) - (1.915546331815768, 3.4128795357293997) - (1.9119894867741825, 3.416434145747405) - (1.9084237157001995, 3.4199798016356584) - (1.904849041135197, 3.4235164809799423) - (1.901265485676837, 3.427044161422785) - (1.897673071978922, 3.430562820663603) - (1.8940718227512545, 3.43407243645884) - (1.8904617607594907, 3.4375729866221114) - (1.8868429088249967, 3.441064449024339) - (1.883215289824707, 3.444546801593895) - (1.8795789266909766, 3.44802002231674) - (1.8759338424114373, 3.451484089236564) - (1.872280060028854, 3.454938980454921) - (1.8686176026409755, 3.458384674131372) - (1.8649464934003928, 3.4618211484836205) - (1.861266755514388, 3.4652483817876516) - (1.8575784122447914, 3.468666352377868) - (1.8538814869078337, 3.4720750386472266) - (1.8501760028739964, 3.4754744190473783) - (1.8464619835678666, 3.4788644720888002) - (1.8427394524679885, 3.4822451763409337) - (1.8390084331067131, 3.4856165104323207) - (1.8352689490700513, 3.488978453050735) - (1.8315210239975255, 3.492330982943322) - (1.827764681582017, 3.495674078916729) - (1.8239999455696192, 3.499007719837241) - (1.8202268397594867, 3.5023318846309155) - (1.8164453880036846, 3.5056465522837117) - (1.8126556142070362, 3.508951701841629) - (1.808857542326976, 3.5122473124108335) - (1.8050511963733935, 3.515533363157794) - (1.801236600408484, 3.5188098333094144) - (1.7974137785465976, 3.5220767021531603) - (1.793582754954083, 3.5253339490371953) - (1.7897435538491384, 3.5285815533705076) - (1.7858961995016567, 3.5318194946230435) - (1.7820407162330723, 3.535047752325833) - (1.7781771284162065, 3.538266306071124) - (1.774305460475116, 3.541475135512507) - (1.7704257368849357, 3.5446742203650476) - (1.7665379821717249, 3.5478635404054115) - (1.7626422209123134, 3.551043075471994) - (1.7587384777341444, 3.5542128054650464) - (1.7548267773151194, 3.5573727103468045) - (1.7509071443834436, 3.5605227701416147) - (1.7469796037174672, 3.56366296493606) - (1.74304418014553, 3.5667932748790845) - (1.7391008985458056, 3.5699136801821227) - (1.7351497838461412, 3.5730241611192213) - (1.7311908610239026, 3.576124698027165) - (1.7272241551058158, 3.579215271305599) - (1.7232496911678077, 3.5822958614171574) - (1.719267494334848, 3.585366448887582) - (1.7152775897807926, 3.588427014305847) - (1.71128000272822, 3.591477538324284) - (1.7072747584482757, 3.594518001658701) - (1.7032618822605117, 3.5975483850885053) - (1.6992413995327242, 3.6005686694568255) - (1.6952133356807961, 3.6035788356706338) - (1.6911777161685355, 3.6065788647008628) - (1.687134566507513, 3.6095687375825296) - (1.6830839122569026, 3.6125484354148565) - (1.6790257790233196, 3.6155179393613848) - (1.6749601924606579, 3.618477230650099) - (1.6708871782699282, 3.621426290573545) - (1.6668067621990965, 3.6243651004889452) - (1.66271897004292, 3.62729364181832) - (1.658623827642784, 3.6302118960486043) - (1.6545213608865406, 3.6331198447317608) - (1.6504115957083418, 3.6360174694849032) - (1.646294558088479, 3.6389047519904074) - (1.6421702740532154, 3.6417816739960287) - (1.6380387696746246, 3.644648217315018) - (1.633900071070423, 3.6475043638262354) - (1.6297542044038076, 3.6503500954742663) - (1.6256011958832874, 3.6531853942695336) - (1.62144107176252, 3.6560102422884135) - (1.6172738583401458, 3.6588246216733475) - (1.6130995819596197, 3.661628514632955) - (1.6089182690090458, 3.6644219034421477) - (1.6047299459210116, 3.667204770442239) - (1.6005346391724196, 3.6699770980410578) - (1.5963323752843188, 3.6727388687130587) - (1.5921231808217406, 3.675490064999433) - (1.5879070823935275, 3.6782306695082183) - (1.5836841066521659, 3.6809606649144104) - (1.5794542802936185, 3.683680033960071) - (1.5752176300571548, 3.686388759454437) - (1.5709741827251813, 3.689086824274031) - (1.5667239651230744, 3.691774211362765) - (1.5624670041190083, 3.694450903732055) - (1.5582033266237862, 3.6971168844609235) - (1.5539329595906717, 3.6997721366961063) - (1.5496559300152153, 3.702416643652162) - (1.5453722649350858, 3.7050503886115767) - (1.5410819914299003, 3.707673354924868) - (1.5367851366210503, 3.710285526010692) - (1.5324817276715315, 3.7128868853559505) - (1.528171791785774, 3.7154774165158897) - (1.5238553562094668, 3.7180571031142087) - (1.5195324482293877, 3.720625928843161) - (1.5152030951732316, 3.7231838774636588) - (1.510867324409435, 3.725730932805375) - (1.5065251633470054, 3.7282670787668453) - (1.5021766394353475, 3.730792299315569) - (1.4978217801640885, 3.733306578488113) - (1.4934606130629065, 3.735809900390211) - (1.4890931657013537, 3.738302249196863) - (1.4847194656886842, 3.740783609152439) - (1.4803395406736795, 3.7432539645707736) - (1.4759534183444725, 3.745713299835268) - (1.4715611264283721, 3.7481615993989896) - (1.4671626926916908, 3.7505988477847683) - (1.4627581449395661, 3.753025029585295) - (1.4583475110157853, 3.7554401294632207) - (1.4539308188026117, 3.7578441321512495) - (1.4495080962206055, 3.7602370224522383) - (1.4450793712284478, 3.762618785239293) - (1.4406446718227668, 3.7649894054558626) - (1.4362040260379563, 3.7673488681158345) - (1.4317574619460016, 3.7696971583036305) - (1.4273050076563019, 3.7720342611742996) - (1.4228466913154905, 3.774360161953613) - (1.4183825411072588, 3.776674845938157) - (1.4139125852521781, 3.778978298495426) - (1.4094368520075204, 3.7812705050639144) - (1.404955369667079, 3.78355145115321) - (1.4004681665609926, 3.785821122344084) - (1.3959752710555626, 3.788079504288585) - (1.3914767115530766, 3.790326582710125) - (1.386972516491627, 3.7925623434035733) - (1.3824627143449322, 3.794786772235347) - (1.3779473336221562, 3.796999855143496) - (1.3734264028677292, 3.7992015781377972) - (1.3688999506611657, 3.8013919272998375) - (1.3643680056168843, 3.803570888783108) - (1.359830596384029, 3.8057384488130848) - (1.3552877516462836, 3.8078945936873216) - (1.3507395001216946, 3.8100393097755334) - (1.3461858705624885, 3.8121725835196836) - (1.3416268917548881, 3.8142944014340685) - (1.3370625925189326, 3.8164047501054066) - (1.3324930017082957, 3.818503616192916) - (1.3279181482101008, 3.820590986428406) - (1.3233380609447407, 3.8226668476163583) - (1.3187527688656946, 3.824731186634009) - (1.3141623009593433, 3.8267839904314322) - (1.3095666862447874, 3.828825246031625) - (1.3049659537736646, 3.8308549405305854) - (1.3003601326299634, 3.8328730610973984) - (1.2957492519298417, 3.8348795949743124) - (1.2911333408214423, 3.836874529476824) - (1.2865124284847074, 3.8388578519937555) - (1.2818865441311948, 3.840829549987336) - (1.277255717003895, 3.842789610993279) - (1.272619976377043, 3.8447380226208647) - (1.2679793515559352, 3.8466747725530137) - (1.2633338718767453, 3.8485998485463684) - (1.2586835667063363, 3.850513238431369) - (1.2540284654420755, 3.85241493011233) - (1.2493685975116506, 3.8543049115675183) - (1.2447039923728815, 3.856183170849227) - (1.2400346795135344, 3.8580496960838535) - (1.2353606884511374, 3.8599044754719714) - (1.2306820487327905, 3.861747497288408) - (1.225998789934981, 3.863578749882318) - (1.2213109416633974, 3.865398221677254) - (1.2166185335527402, 3.8672059011712445) - (1.2119215952665345, 3.869001776936863) - (1.2072201564969454, 3.870785837621302) - (1.202514246964586, 3.872558071946443) - (1.1978038964183337, 3.874318468708931) - (1.193089134635139, 3.876067016780241) - (1.1883699914198385, 3.8778037051067535) - (1.1836464966049676, 3.879528522709819) - (1.178918680050569, 3.881241458685831) - (1.1741865716440079, 3.8829425022062938) - (1.1694502012997785, 3.884631642517892) - (1.1647095989593192, 3.886308868942555) - (1.1599647945908205, 3.8879741708775297) - (1.1552158181890357, 3.889627537795444) - (1.1504626997750944, 3.8912689592443734) - (1.1457054693963076, 3.8928984248479086) - (1.1409441571259817, 3.894515924305221) - (1.1361787930632279, 3.896121447391125) - (1.1314094073327703, 3.8977149839561473) - (1.126636030084756, 3.899296523926587) - (1.121858691494566, 3.900866057304582) - (1.117077421762623, 3.9024235741681697) - (1.1122922511141997, 3.9039690646713527) - (1.1075032097992306, 3.905502519044158) - (1.1027103280921178, 3.907023927592701) - (1.0979136362915407, 3.9085332806992463) - (1.0931131647202659, 3.9100305688222665) - (1.0883089437249527, 3.9115157824965063) - (1.0835010036759631, 3.912988912333039) - (1.0786893749671709, 3.9144499490193274) - (1.0738740880157658, 3.915898883319282) - (1.0690551732620648, 3.917335706073321) - (1.0642326611693191, 3.9187604081984255) - (1.0594065822235188, 3.9201729806881986) - (1.0545769669332046, 3.9215734146129226) - (1.0497438458292705, 3.9229617011196147) - (1.0449072494647735, 3.9243378314320836) - (1.040067208414741, 3.925701796850984) - (1.0352237532759747, 3.9270535887538722) - (1.030376914666859, 3.9283931985952614) - (1.0255267232271685, 3.929720617906674) - (1.0206732096178723, 3.9310358382966957) - (1.0158164045209397, 3.932338851451031) - (1.0109563386391498, 3.9336296491325515) - (1.0060930426958934, 3.934908223181351) - (1.0012265474349809, 3.936174565514796) - (0.9963568836204479, 3.937428668127577) - (0.9914840820363597, 3.9386705230917594) - (0.9866081734866174, 3.9399001225568338) - (0.9817291887947641, 3.9411174587497633) - (0.9768471588037876, 3.9423225239750366) - (0.9719621143759273, 3.943515310614713) - (0.9670740863924796, 3.944695811128473) - (0.9621831057536001, 3.9458640180536655) - (0.957289203378112, 3.947019924005353) - (0.9523924102033061, 3.9481635216763618) - (0.94749275718475, 3.949294803837324) - (0.9425902752960889, 3.9504137633367264) - (0.93768499552885, 3.951520393100956) - (0.9327769488922502, 3.952614686134342) - (0.9278661664129947, 3.9536966355192016) - (0.9229526791350857, 3.9547662344158834) - (0.9180365181196231, 3.9558234760628124) - (0.9131177144446083, 3.956868353776529) - (0.9081962992047505, 3.957900860951735) - (0.9032723035112667, 3.9589209910613334) - (0.8983457584916864, 3.95992873765647) - (0.8934166952896563, 3.9609240943665736) - (0.8884851450647405, 3.9619070548993975) - (0.8835511389922255, 3.9628776130410595) - (0.8786147082629238, 3.9638357626560783) - (0.8736758840829741, 3.9647814976874165) - (0.8687346976736456, 3.9657148121565156) - (0.8637911802711424, 3.9666357001633346) - (0.8588453631264021, 3.9675441558863884) - (0.853897277504901, 3.968440173582784) - (0.8489469546864565, 3.9693237475882546) - (0.8439944259650278, 3.970194872317201) - (0.8390397226485191, 3.9710535422627196) - (0.8340828760585823, 3.971899751996644) - (0.8291239175304173, 3.972733496169574) - (0.8241628784125745, 3.9735547695109137) - (0.8191997900667587, 3.9743635668289) - (0.8142346838676273, 3.975159883010642) - (0.8092675912025942, 3.975943713022146) - (0.8042985434716319, 3.976715051908353) - (0.7993275720870711, 3.9774738947931674) - (0.7943547084734026, 3.978220236879488) - (0.789379984067081, 3.978954073449239) - (0.7844034303163222, 3.979675399863399) - (0.7794250786809069, 3.9803842115620314) - (0.7744449606319823, 3.9810805040643125) - (0.7694631076518613, 3.981764272968559) - (0.7644795512338238, 3.9824355139522583) - (0.7594943228819198, 3.9830942227720936) - (0.7545074541107673, 3.983740395263971) - (0.7495189764453539, 3.984374027343047) - (0.7445289214208402, 3.984995115003753) - (0.7395373205823557, 3.9856036543198208) - (0.7345442054848037, 3.9861996414443093) - (0.729549607692659, 3.986783072609626) - (0.7245535587797703, 3.9873539441275527) - (0.7195560903291585, 3.9879122523892683) - (0.7145572339328197, 3.9884579938653717) - (0.709557021191523, 3.9889911651059027) - (0.7045554837146113, 3.9895117627403667) - (0.699552653119804, 3.990019783477754) - (0.6945485610329931, 3.9905152241065607) - (0.6895432390880455, 3.9909980814948094) - (0.6845367189266041, 3.991468352590069) - (0.679529032197885, 3.991926034419474) - (0.6745202105584791, 3.9923711240897424) - (0.6695102856721529, 3.992803618787196) - (0.664499289209646, 3.993223515777777) - (0.6594872528484717, 3.9936308124070634) - (0.6544742082727191, 3.99402550610029) - (0.6494601871728488, 3.99440759436236) - (0.6444452212454951, 3.9947770747778657) - (0.6394293421932663, 3.9951339450110996) - (0.6344125817245416, 3.99547820280607) - (0.6293949715532725, 3.9958098459865177) - (0.6243765433987831, 3.9961288724559267) - (0.6193573289855671, 3.9964352801975402) - (0.6143373600430886, 3.9967290672743703) - (0.6093166683055831, 3.997010231829213) - (0.6042952855118533, 3.9972787720846585) - (0.5992732434050723, 3.9975346863431023) - (0.5942505737325798, 3.997777972986758) - (0.5892273082456829, 3.998008630477664) - (0.5842034786994563, 3.998226657357696) - (0.5791791168525392, 3.9984320522485755) - (0.5741542544669357, 3.998624813851878) - (0.5691289233078156, 3.998804940949042) - (0.5641031551433107, 3.998972432401376) - (0.5590769817443153, 3.999127287150066) - (0.5540504348842868, 3.9992695042161825) - (0.5490235463390425, 3.999399082700686) - (0.5439963478865589, 3.9995160217844328) - (0.5389688713067736, 3.999620320728182) - (0.533941148381381, 3.999711978872596) - (0.5289132108936325, 3.999790995638249) - (0.5238850906281376, 3.9998573705256297) - (0.5188568193706594, 3.9999111031151413) - (0.5138284289079161, 3.999952193067109) - (0.5087999510273804, 3.9999806401217777) - (0.503771417517076, 3.9999964440993168) - (0.49874286016538, 3.99999960489982) - (0.49371431076081884, 3.9999901225033057) - (0.48868580109186877, 3.999967996969718) - (0.48365736294675626, 3.999933228438926) - (0.4786290281132537, 3.999885817130722) - (0.47360082837848233, 3.9998257633448215) - (0.46857279552870784, 3.99975306746086) - (0.4635449613491415, 3.999667729938393) - (0.45851735762373785, 3.9995697513168884) - (0.453490016134997, 3.9994591322157294) - (0.4484629686637589, 3.999335873334205) - (0.4434362469890056, 3.999199975451508) - (0.4384098828876596, 3.999051439426732) - (0.433383908134383, 3.9988902661988606) - (0.4283583545013757, 3.9987164567867675) - (0.4233332537581781, 3.998530012289206) - (0.418308637671465, 3.9983309338848025) - (0.4132845380048481, 3.9981192228320532) - (0.4082609865186747, 3.9978948804693086) - (0.40323801496982675, 3.9976579082147725) - (0.398215655111519, 3.997408307566488) - (0.3931939386931021, 3.9971460801023313) - (0.38817289745985645, 3.996871227479999) - (0.3831525631527951, 3.9965837514369986) - (0.3781329675084622, 3.9962836537906394) - (0.3731141422587314, 3.995970936438019) - (0.3680961191306091, 3.995645601356011) - (0.3630789298460281, 3.995307650601253) - (0.3580626061216509, 3.9949570863101345) - (0.3530471796686685, 3.994593910698784) - (0.3480326821925994, 3.9942181260630507) - (0.34301914539308886, 3.993829734778495) - (0.3380066009637116, 3.993428739300372) - (0.3329950805917664, 3.993015142163614) - (0.32798461595807926, 3.992588945982816) - (0.3229752387368022, 3.9921501534522212) - (0.31796698059521294, 3.991698767345699) - (0.31295987319351415, 3.991234790516732) - (0.3079539481846365, 3.9907582258983965) - (0.30294923721403344, 3.990269076503343) - (0.29794577191948457, 3.9897673454237776) - (0.292943583930895, 3.989253035831444) - (0.28794270487009455, 3.988726150977602) - (0.28294316635063954, 3.988186694193006) - (0.277944999977612, 3.9876346688878863) - (0.27294823734741874, 3.987070078551926) - (0.26795291004759275, 3.986492926754238) - (0.2629590496565948, 3.985903217143347) - (0.257966687743611, 3.98530095344716) - (0.2529758558683548, 3.9846861394729465) - (0.24798658558086878, 3.9840587791073157) - (0.2429989084213217, 3.9834188763161875) - (0.23801285591981336, 3.982766435144772) - (0.2330284595961714, 3.982101459717541) - (0.22804575095975455, 3.981423954238203) - (0.22306476150925164, 3.980733922989676) - (0.21808552273248605, 3.9800313703340624) - (0.21310806610621158, 3.9793163007126178) - (0.2081324230959169, 3.9785887186457267) - (0.20315862515562555, 3.977848628732872) - (0.19818670372769742, 3.977096035652605) - (0.19321669024262894, 3.9763309441625188) - (0.1882486161188579, 3.975553359099215) - (0.18328251276255958, 3.974763285378276) - (0.17831841156745182, 3.9739607279942306) - (0.17335634391459548, 3.973145692020526) - (0.1683963411721962, 3.9723181826094933) - (0.1634384346954053, 3.971478204992315) - (0.15848265582612486, 3.970625764478995) - (0.15352903589280453, 3.9697608664583197) - (0.1485776062102469, 3.968883516397829) - (0.14362839807940864, 3.9679937198437782) - (0.13868144278720262, 3.9670914824211057) - (0.13373677160629943, 3.9661768098333945) - (0.12879441579493284, 3.9652497078628395) - (0.12385440659669739, 3.964310182370207) - (0.11891677524035393, 3.963358239294803) - (0.11398155293963175, 3.9623938846544293) - (0.10904877089303083, 3.96141712454535) - (0.1041184602836242, 3.9604279651422525) - (0.09919065227886392, 3.959426412698205) - (0.09426537803037893, 3.958412473544623) - (0.08934266867378182, 3.957386154091223) - (0.08442255532847087, 3.956347460825986) - (0.07950506909743288, 3.955296400315115) - (0.07459024106704815, 3.9542329792029935) - (0.06967810230689275, 3.953157204212145) - (0.06476868386954143, 3.952069082143188) - (0.05986201679037262, 3.9509686198747946) - (0.054958132087371325, 3.949855824363647) - (0.05005706076093469, 3.948730702644393) - (0.04515883379367325, 3.947593261829602) - (0.04026348215021819, 3.946443509109719) - (0.03537103677702291, 3.9452814517530213) - (0.030481528602168406, 3.9441070971055696) - (0.025594988535169227, 3.942920452591164) - (0.0207114474667755, 3.941721525711297) - (0.01583093626877885, 3.9405103240451034) - (0.010953485793817996, 3.9392868552493163) - (0.0060791268751832495, 3.9380511270582153) - (0.0012078903266202201, 3.9368031472835794) - (-0.003660193057863248, 3.9355429238146376) - (-0.008525092504192422, 3.9342704646180175) - (-0.013386777258420968, 3.9329857777376978) - (-0.01824521658692213, 3.9316888712949543) - (-0.023100379776587743, 3.9303797534883103) - (-0.027952236135019404, 3.929058432593485) - (-0.03280075499072321, 3.92772491696334) - (-0.037645905693303394, 3.9263792150278274) - (-0.04248765761365747, 3.925021335293936) - (-0.04732598014416578, 3.9236512863456383) - (-0.052160842698890764, 3.9222690768438353) - (-0.056992214713766476, 3.9208747155263026) - (-0.061820065646792766, 3.919468211207634) - (-0.06664436497822834, 3.9180495727791866) - (-0.0714650822107844, 3.916618809209025) - (-0.07628218686981458, 3.9151759295418644) - (-0.08109564850351203, 3.913720942899012) - (-0.08590543668309869, 3.912253858478311) - (-0.09071152100301905, 3.910774685554082) - (-0.0955138710811323, 3.9092834334770634) - (-0.10031245655890164, 3.907780111674356) - (-0.10510724710159125, 3.9062647296493562) - (-0.10989821239845421, 3.9047372969817045) - (-0.1146853221629257, 3.903197823327218) - (-0.11946854613281366, 3.901646318417833) - (-0.12424785407049144, 3.9000827920615424) - (-0.1290232157630854, 3.8985072541423342) - (-0.13379460102267127, 3.8969197146201293) - (-0.1385619796864609, 3.8953201835307163) - (-0.14332532161699463, 3.8937086709856903) - (-0.14808459670233132, 3.8920851871723894) - (-0.15283977485623934, 3.890449742353828) - (-0.15759082601838426, 3.888802346868634) - (-0.16233772015452286, 3.887143011130982) - (-0.16708042725669037, 3.8854717456305283) - (-0.17181891734339105, 3.8837885609323446) - (-0.17655316045978642, 3.8820934676768513) - (-0.18128312667788704, 3.8803864765797487) - (-0.186008786096739, 3.878667598431952) - (-0.190730108842615, 3.8769368440995207) - (-0.19544706506920295, 3.8751942245235913) - (-0.2001596249577925, 3.873439750720306) - (-0.20486775871746676, 3.8716734337807477) - (-0.20957143658528887, 3.869895284870864) - (-0.21427062882648962, 3.868105315231401) - (-0.2189653057346559, 3.86630353617783) - (-0.22365543763191986, 3.8644899591002773) - (-0.22834099486914472, 3.8626645954634515) - (-0.23302194782611307, 3.860827456806571) - (-0.23769826691171458, 3.8589785547432904) - (-0.24236992256413015, 3.8571179009616294) - (-0.24703688525102319, 3.855245507223896) - (-0.2516991254697236, 3.8533613853666138) - (-0.2563566137474148, 3.851465547300447) - (-0.2610093206413199, 3.8495580050101257) - (-0.2656572167388891, 3.8476387705543686) - (-0.27030027265798173, 3.8457078560658076) - (-0.2749384590470575, 3.843765273750911) - (-0.27957174658535855, 3.8418110358899074) - (-0.2842001059830954, 3.8398451548367056) - (-0.2888235079816325, 3.8378676430188197) - (-0.2934419233536737, 3.8358785129372865) - (-0.2980553229034437, 3.8338777771665917) - (-0.30266367746687806, 3.831865448354586) - (-0.3072669579118036, 3.8298415392224054) - (-0.31186513513812375, 3.827806062564395) - (-0.3164581800780024, 3.825759031248022) - (-0.3210460636960488, 3.8237004582138) - (-0.3256287569894972, 3.821630356475204) - (-0.33020623098839574, 3.819548739118588) - (-0.3347784567557861, 3.8174556193031037) - (-0.33934540538788627, 3.815351010260618) - (-0.3439070480142753, 3.8132349252956255) - (-0.3484633557980751, 3.8111073777851683) - (-0.35301429993612976, 3.808968381178752) - (-0.3575598516591929, 3.8068179489982557) - (-0.3620999822321057, 3.804656094837851) - (-0.36663466295397995, 3.802482832363915) - (-0.37116386515837896, 3.800298175314943) - (-0.37568756021350014, 3.7981021375014623) - (-0.38020571952235216, 3.7958947328059454) - (-0.38471831452294114, 3.7936759751827216) - (-0.3892253166884476, 3.7914458786578873) - (-0.39372669752740774, 3.7892044573292214) - (-0.39822242858389345, 3.786951725366092) - (-0.40271248143769334, 3.7846876970093684) - (-0.4071968277044886, 3.782412386571332) - (-0.411675439036038, 3.780125808435586) - (-0.4161482871203529, 3.77782797705696) - (-0.42061534368187825, 3.775518906961426) - (-0.4250765804816702, 3.7731986127460004) - (-0.4295319693175761, 3.7708671090786536) - (-0.43398148202440934, 3.7685244106982205) - (-0.43842509047413236, 3.7661705324143013) - (-0.4428627665760311, 3.7638054891071726) - (-0.44729448227689317, 3.761429295727692) - (-0.45172020956118586, 3.759041967297202) - (-0.4561399204512334, 3.7566435189074388) - (-0.4605535870073909, 3.754233965720432) - (-0.4649611813282257, 3.7518133229684136) - (-0.46936267555069067, 3.749381605953717) - (-0.4737580418503009, 3.746938830048685) - (-0.47814725244130996, 3.744485010695568) - (-0.482530279576886, 3.7420201634064303) - (-0.48690709554928413, 3.7395443037630507) - (-0.4912776726900263, 3.737057447416822) - (-0.49564198337007326, 3.734559610088655) - (-0.49999999999999956, 3.7320508075688776) - (-0.5043516950301692, 3.7295310557171346) - (-0.5086970409509064, 3.7270003704622896) - (-0.5130360102926739, 3.7244587678023215) - (-0.5173685756262447, 3.7219062638042253) - (-0.5216947095628743, 3.7193428746039094) - (-0.5260143847544758, 3.7167686164060942) - (-0.5303275738937923, 3.7141835054842094) - (-0.5346342497145666, 3.7115875581802924) - (-0.538934384991719, 3.708980790904883) - (-0.5432279525415151, 3.70636322013692) - (-0.5475149252217393, 3.703734862423638) - (-0.5517952759318665, 3.7010957343804636) - (-0.556068977613233, 3.6984458526909068) - (-0.560336003249206, 3.6957852341064594) - (-0.5645963258653581, 3.693113895446488) - (-0.5688499185296347, 3.690431853598125) - (-0.5730967543525256, 3.687739125516167) - (-0.5773368064872342, 3.685035728222962) - (-0.5815700481298491, 3.6823216788083055) - (-0.5857964525195094, 3.6795969944293327) - (-0.5900159929385786, 3.676861692310408) - (-0.5942286427128112, 3.674115789743015) - (-0.5984343752115215, 3.6713593040856516) - (-0.6026331638477518, 3.6685922527637174) - (-0.6068249820784415, 3.665814653269402) - (-0.6110098034045923, 3.663026523161579) - (-0.6151876013714395, 3.6602278800656904) - (-0.6193583495686159, 3.6574187416736375) - (-0.6235220216303214, 3.6545991257436694) - (-0.6276785912354874, 3.6517690501002695) - (-0.6318280321079452, 3.6489285326340424) - (-0.6359703180165892, 3.6460775913016037) - (-0.640105422775546, 3.6432162441254627) - (-0.6442333202443389, 3.6403445091939117) - (-0.6483539843280519, 3.6374624046609094) - (-0.6524673889774961, 3.634569948745967) - (-0.6565735081893742, 3.631667159734032) - (-0.6606723160064429, 3.6287540559753766) - (-0.6647637865176801, 3.6258306558854754) - (-0.668847893858447, 3.6228969779448947) - (-0.6729246122106516, 3.619953040699172) - (-0.6769939158029126, 3.616998862758699) - (-0.6810557789107203, 3.614034462798608) - (-0.6851101758566025, 3.6110598595586487) - (-0.6891570810102843, 3.6080750718430714) - (-0.6931964687888519, 3.60508011852051) - (-0.6972283136569111, 3.602075018523861) - (-0.701252590126753, 3.5990597908501627) - (-0.7052692727585126, 3.5960344545604794) - (-0.7092783361603296, 3.5929990287797744) - (-0.7132797549885108, 3.5899535326967955) - (-0.7172735039476865, 3.58689798556395) - (-0.7212595577909746, 3.5838324066971836) - (-0.7252378913201385, 3.5807568154758593) - (-0.7292084793857465, 3.5776712313426335) - (-0.7331712968873285, 3.5745756738033343) - (-0.7371263187735393, 3.571470162426838) - (-0.7410735200423133, 3.568354716844943) - (-0.7450128757410239, 3.5652293567522513) - (-0.7489443609666413, 3.562094101906037) - (-0.7528679508658898, 3.5589489721261263) - (-0.7567836206354033, 3.5557939872947726) - (-0.7606913455218853, 3.5526291673565256) - (-0.7645911008222634, 3.5494545323181113) - (-0.7684828618838451, 3.5462701022483003) - (-0.7723666041044748, 3.543075897277787) - (-0.776242302932689, 3.539871937599054) - (-0.7801099338678701, 3.5366582434662552) - (-0.7839694724604036, 3.5334348351950773) - (-0.7878208943118312, 3.5302017331626163) - (-0.7916641750750057, 3.5269589578072504) - (-0.7954992904542444, 3.523706529628507) - (-0.7993262162054835, 3.520444469186935) - (-0.8031449281364285, 3.517172797103976) - (-0.8069554021067118, 3.5138915340618304) - (-0.8107576140280421, 3.5106007008033306) - (-0.8145515398643575, 3.507300318131807) - (-0.8183371556319774, 3.5039904069109573) - (-0.8221144373997544, 3.5006709880647158) - (-0.825883361289224, 3.497342082577121) - (-0.8296439034747585, 3.494003711492179) - (-0.833396040183715, 3.490655895913738) - (-0.8371397476965874, 3.487298657005346) - (-0.8408750023471552, 3.483932015990125) - (-0.8446017805226338, 3.480555994150631) - (-0.848320058663822, 3.477170612828724) - (-0.8520298132652544, 3.473775893425429) - (-0.8557310208753472, 3.470371857400804) - (-0.8594236580965473, 3.466958526273801) - (-0.8631077015854798, 3.4635359216221344) - (-0.8667831280530973, 3.46010406508214) - (-0.8704499142648234, 3.4566629783486427) - (-0.8741080370407037, 3.4532126831748147) - (-0.8777574732555502, 3.449753201372041) - (-0.8813981998390881, 3.446284554809781) - (-0.8850301937761016, 3.4428067654154297) - (-0.8886534321065771, 3.4393198551741806) - (-0.8922678919258531, 3.435823846128884) - (-0.8958735503847612, 3.4323187603799097) - (-0.8994703846897716, 3.4288046200850077) - (-0.9030583721031376, 3.4252814474591653) - (-0.9066374899430394, 3.42174926477447) - (-0.9102077155837252, 3.4182080943599678) - (-0.9137690264556582, 3.41465795860152) - (-0.9173214000456564, 3.4110988799416644) - (-0.9208648138970357, 3.407530880879472) - (-0.9243992456097523, 3.403953983970404) - (-0.9279246728405437, 3.40036821182617) - (-0.9314410733030689, 3.3967735871145894) - (-0.9349484247680524, 3.3931701325594394) - (-0.9384467050634218, 3.3895578709403162) - (-0.9419358920744492, 3.385936825092494) - (-0.945415963743891, 3.382307017906774) - (-0.9488868980721277, 3.3786684723293443) - (-0.9523486731173003, 3.3750212113616347) - (-0.955801266995453, 3.3713652580601687) - (-0.9592446578806693, 3.3677006355364205) - (-0.9626788240052102, 3.364027366956666) - (-0.966103743659652, 3.3603454755418394) - (-0.9695193951930243, 3.356654984567384) - (-0.9729257570129435, 3.3529559173631074) - (-0.9763228075857542, 3.349248297313032) - (-0.9797105254366627, 3.3455321478552476) - (-0.9830888891498724, 3.341807492481763) - (-0.98645787736872, 3.3380743547383602) - (-0.9898174687958115, 3.33433275822444) - (-0.9931676421931526, 3.33058272659288) - (-0.9965083763822891, 3.326824283549877) - (-0.9998396502444362, 3.323057452854806) - (-1.0031614427206141, 3.3192822583200616) - (-1.0064737328117808, 3.3154987238109124) - (-1.0097764995789629, 3.3117068732453503) - (-1.0130697221433915, 3.3079067305939365) - (-1.0163533796866315, 3.3040983198796514) - (-1.0196274514507142, 3.300281665177744) - (-1.0228919167382688, 3.2964567906155766) - (-1.0261467549126515, 3.292623720372477) - (-1.0293919453980784, 3.28878247867958) - (-1.032627467679754, 3.284933089819678) - (-1.0358533013040017, 3.281075578127067) - (-1.039069425878393, 3.2772099679873916) - (-1.042275821071874, 3.2733362838374926) - (-1.045472466614899, 3.2694545501652508) - (-1.0486593422995536, 3.2655647915094326) - (-1.0518364279796861, 3.2616670324595347) - (-1.0550037035710311, 3.257761297655631) - (-1.058161149051341, 3.253847611788213) - (-1.0613087444605087, 3.2499259995980365) - (-1.0644464699006961, 3.2459964858759633) - (-1.0675743055364593, 3.2420590954628077) - (-1.0706922315948724, 3.238113853249175) - (-1.073800228365655, 3.234160784175309) - (-1.0768982762012955, 3.230199913230928) - (-1.0799863555171758, 3.226231265455074) - (-1.0830644467916941, 3.22225486593595) - (-1.08613253056639, 3.2182707398107615) - (-1.089190587446065, 3.2142789122655597) - (-1.0922385980989076, 3.210279408535081) - (-1.0952765432566147, 3.2062722539025867) - (-1.0983044037145127, 3.2022574736997047) - (-1.1013221603316798, 3.1982350933062684) - (-1.1043297940310672, 3.1942051381501564) - (-1.107327285799617, 3.1901676337071327) - (-1.1103146166883866, 3.1861226055006853) - (-1.1132917678126661, 3.1820700791018623) - (-1.1162587203520973, 3.1780100801291136) - (-1.119215455550794, 3.173942634248128) - (-1.12216195471746, 3.16986776717167) - (-1.1250981992255058, 3.1657855046594197) - (-1.1280241705131697, 3.1616958725178055) - (-1.130939850083632, 3.1575988965998456) - (-1.1338452195051336, 3.1534946028049813) - (-1.1367402604110917, 3.1493830170789163) - (-1.139624954500217, 3.145264165413448) - (-1.1424992835366272, 3.14113807384631) - (-1.1453632293499647, 3.137004768461001) - (-1.148216773835511, 3.1328642753866243) - (-1.151059898954299, 3.128716620797718) - (-1.1538925867332304, 3.124561830914096) - (-1.156714819265187, 3.1203999320006757) - (-1.1595265787091436, 3.116230950367317) - (-1.1623278472902825, 3.112054912368654) - (-1.1651186073001052, 3.1078718444039266) - (-1.1678988410965438, 3.103681772916816) - (-1.170668531104073, 3.0994847243952774) - (-1.1734276598138216, 3.095280725371371) - (-1.1761762097836812, 3.0910698024210976) - (-1.1789141636384197, 3.0868519821642257) - (-1.1816415040697883, 3.0826272912641266) - (-1.1843582138366326, 3.078395756427606) - (-1.1870642757650014, 3.0741574044047324) - (-1.1897596727482531, 3.069912261988672) - (-1.1924443877471673, 3.065660356015516) - (-1.1951184037900504, 3.0614017133641114) - (-1.1977817039728433, 3.0571363609558935) - (-1.200434271459228, 3.052864325754712) - (-1.203076089480735, 3.0485856347666638) - (-1.2057071413368474, 3.044300315039922) - (-1.2083274103951087, 3.0400083936645617) - (-1.2109368800912268, 3.035709897772392) - (-1.2135355339291787, 3.031404854536784) - (-1.2161233554813147, 3.0270932911724975) - (-1.2187003283884634, 3.0227752349355104) - (-1.2212664363600325, 3.0184507131228466) - (-1.2238216631741148, 3.0141197530724013) - (-1.2263659926775894, 3.009782382162771) - (-1.2288994087862233, 3.005438627813079) - (-1.231421895484774, 3.001088517482801) - (-1.2339334368270904, 2.996732078671593) - (-1.2364340169362127, 2.9923693389191186) - (-1.2389236200044744, 2.9880003258048724) - (-1.2414022302936019, 2.983625066948006) - (-1.2438698321348125, 2.979243590007155) - (-1.2463264099289153, 2.9748559226802627) - (-1.2487719481464088, 2.9704620927044054) - (-1.2512064313275788, 2.9660621278556185) - (-1.2536298440825973, 2.961656055948719) - (-1.2560421710916185, 2.9572439048371293) - (-1.2584433971048767, 2.952825702412703) - (-1.2608335069427825, 2.948401476605547) - (-1.263212485496018, 2.943971255383846) - (-1.2655803177256324, 2.939535066753687) - (-1.2679369886631386, 2.9350929387588773) - (-1.270282483410606, 2.930644899480773) - (-1.2726167871407554, 2.9261909770380976) - (-1.2749398850970535, 2.9217311995867656) - (-1.2772517625938042, 2.917265595319707) - (-1.2795524050162435, 2.9127941924666834) - (-1.2818417978206305, 2.9083170192941137) - (-1.2841199265343413, 2.9038341041048943) - (-1.2863867767559565, 2.899345475238223) - (-1.288642334155357, 2.894851161069413) - (-1.2908865844738118, 2.89035119000972) - (-1.2931195135240685, 2.8858455905061606) - (-1.2953411071904437, 2.88133439104133) - (-1.2975513514289105, 2.876817620133228) - (-1.2997502322671903, 2.8722953063350705) - (-1.301937735804838, 2.8677674782351166) - (-1.3041138482133323, 2.8632341644564825) - (-1.3062785557361616, 2.858695393656963) - (-1.3084318446889105, 2.8541511945288516) - (-1.3105737014593486, 2.8496015957987564) - (-1.3127041125075147, 2.845046626227419) - (-1.3148230643658028, 2.8404863146095343) - (-1.3169305436390475, 2.8359206897735665) - (-1.319026537004608, 2.8313497805815695) - (-1.3211110312124532, 2.8267736159290013) - (-1.323184013085245, 2.822192224744543) - (-1.3252454695184221, 2.817605635989916) - (-1.3272953874802815, 2.813013878659699) - (-1.329333754012063, 2.808416981781143) - (-1.3313605562280284, 2.8038149744139917) - (-1.3333757813155458, 2.799207885650293) - (-1.3353794165351685, 2.7945957446142184) - (-1.3373714492207167, 2.7899785804618773) - (-1.3393518667793571, 2.785356422381134) - (-1.341320656691683, 2.78072929959142) - (-1.3432778065117916, 2.776097241343556) - (-1.3452233038673658, 2.7714602769195595) - (-1.3471571364597497, 2.766818435632463) - (-1.3490792920640275, 2.76217174682613) - (-1.350989758529101, 2.757520239875068) - (-1.3528885237777666, 2.7528639441842393) - (-1.354775575806789, 2.748202889188885) - (-1.356650902686981, 2.7435371043543277) - (-1.3585144925632773, 2.7388666191757918) - (-1.3603663336548077, 2.7341914631782154) - (-1.3622064142549746, 2.729511665916063) - (-1.364034722731525, 2.72482725697314) - (-1.365851247526624, 2.720138265962406) - (-1.3676559771569292, 2.715444722525784) - (-1.369448900213662, 2.7107466563339777) - (-1.3712300053626805, 2.7060440970862816) - (-1.372999281344551, 2.701337074510392) - (-1.374756716974619, 2.696625618362222) - (-1.3765023011430795, 2.691909758425712) - (-1.378236022815048, 2.6871895245126414) - (-1.3799578710306304, 2.682464946462439) - (-1.381667834904991, 2.677736054141997) - (-1.3833659036284232, 2.6730028774454784) - (-1.3850520664664152, 2.6682654462941335) - (-1.3867263127597211, 2.663523790636106) - (-1.3883886319244259, 2.658777940446244) - (-1.390039013452013, 2.654027925725914) - (-1.391677446909431, 2.6492737765028065) - (-1.3933039219391599, 2.6445155228307504) - (-1.3949184282592744, 2.639753194789523) - (-1.3965209556635125, 2.6349868224846538) - (-1.3981114940213373, 2.6302164360472418) - (-1.3996900332780016, 2.6254420656337603) - (-1.4012565634546124, 2.6206637414258687) - (-1.402811074648193, 2.615881493630219) - (-1.4043535570317451, 2.611095352478269) - (-1.405884000854313, 2.6063053482260874) - (-1.4074023964410434, 2.601511511154163) - (-1.408908734193247, 2.596713871567216) - (-1.4104030045884592, 2.591912459794003) - (-1.4118851981805014, 2.587107306187127) - (-1.413355305599538, 2.5822984411228473) - (-1.414813317552139, 2.5774858950008834) - (-1.416259224821336, 2.572669698244226) - (-1.417693018266682, 2.5678498812989425) - (-1.419114688824309, 2.5630264746339875) - (-1.4205242275069845, 2.558199508741006) - (-1.4219216254041689, 2.5533690141341463) - (-1.4233068736820724, 2.548535021349861) - (-1.4246799635837095, 2.5436975609467183) - (-1.4260408864289558, 2.5388566635052054) - (-1.4273896336146015, 2.5340123596275395) - (-1.4287261966144067, 2.5291646799374696) - (-1.4300505669791552, 2.524313655080088) - (-1.4313627363367074, 2.519459315721632) - (-1.432662696392054, 2.5146016925492916) - (-1.4339504389273676, 2.509740816271016) - (-1.4352259558020557, 2.5048767176153204) - (-1.436489238952811, 2.5000094273310878) - (-1.437740280393663, 2.495138976187382) - (-1.438979072216028, 2.490265394973244) - (-1.4402056065887605, 2.485388714497504) - (-1.441419875758201, 2.4805089655885837) - (-1.4426218720482258, 2.4756261790943035) - (-1.4438115878602953, 2.4707403858816854) - (-1.4449890156735021, 2.4658516168367575) - (-1.4461541480446194, 2.460959902864362) - (-1.4473069776081464, 2.4560652748879552) - (-1.448447497076356, 2.4511677638494183) - (-1.4495756992393403, 2.4462674007088547) - (-1.4506915769650572, 2.4413642164443994) - (-1.4517951231993744, 2.4364582420520193) - (-1.452886330966114, 2.4315495085453227) - (-1.4539651933670972, 2.426638046955358) - (-1.455031703582188, 2.4217238883304186) - (-1.4560858548693356, 2.4168070637358494) - (-1.4571276405646176, 2.411887604253846) - (-1.4581570540822815, 2.406965540983265) - (-1.459174088914787, 2.402040905039418) - (-1.460178738632847, 2.397113727553884) - (-1.4611709968854687, 2.3921840396743055) - (-1.4621508573999917, 2.387251872564197) - (-1.4631183139821309, 2.382317257402744) - (-1.4640733605160121, 2.3773802253846106) - (-1.4650159909642138, 2.3724408077197356) - (-1.4659461993678036, 2.367499035633141) - (-1.466863979846376, 2.3625549403647312) - (-1.4677693265980907, 2.357608553169099) - (-1.4686622338997077, 2.3526599053153228) - (-1.469542696106624, 2.3477090280867756) - (-1.4704107076529105, 2.3427559527809207) - (-1.4712662630513451, 2.337800710709118) - (-1.4721093568934494, 2.332843333196424) - (-1.4729399838495212, 2.3278838515813955) - (-1.47375813866867, 2.32292229721589) - (-1.4745638161788477, 2.3179587014648693) - (-1.475357011286884, 2.3129930957061986) - (-1.4761377189785165, 2.30802551133045) - (-1.4769059343184243, 2.3030559797407038) - (-1.477661652450257, 2.2980845323523496) - (-1.4784048685966673, 2.293111200592887) - (-1.47913557805934, 2.2881360159017303) - (-1.4798537762190223, 2.2831590097300056) - (-1.480559458535553, 2.2781802135403537) - (-1.481252620547891, 2.273199658806732) - (-1.4819332578741433, 2.268217377014212) - (-1.4826013662115936, 2.263233399658787) - (-1.4832569413367278, 2.2582477582471667) - (-1.4838999791052625, 2.2532604842965807) - (-1.4845304754521707, 2.2482716093345787) - (-1.4851484263917063, 2.243281164898831) - (-1.4857538280174312, 2.2382891825369304) - (-1.4863466765022384, 2.2332956938061908) - (-1.4869269680983772, 2.22830073027345) - (-1.4874946991374762, 2.2233043235148684) - (-1.4880498660305672, 2.21830650511573) - (-1.488592465268107, 2.2133073066702407) - (-1.489122493420001, 2.2083067597813333) - (-1.4896399471356228, 2.203304896060464) - (-1.4901448231438372, 2.1983017471274136) - (-1.4906371182530205, 2.1932973446100865) - (-1.4911168293510795, 2.1882917201443126) - (-1.4915839534054731, 2.183284905373646) - (-1.49203848746323, 2.1782769319491653) - (-1.4924804286509674, 2.1732678315292757) - (-1.4929097741749102, 2.1682576357795047) - (-1.493326521320908, 2.1632463763723035) - (-1.493730667454452, 2.1582340849868498) - (-1.4941222100206921, 2.1532207933088423) - (-1.4945011465444529, 2.148206533030304) - (-1.4948674746302495, 2.1431913358493837) - (-1.4952211919623022, 2.1381752334701494) - (-1.4955622963045516, 2.133158257602392) - (-1.4958907855006727, 2.1281404399614265) - (-1.4962066574740882, 2.1231218122678865) - (-1.4965099102279817, 2.118102406247527) - (-1.4968005418453112, 2.113082253631026) - (-1.4970785504888195, 2.108061386153777) - (-1.4973439344010473, 2.1030398355556965) - (-1.4975966919043437, 2.098017633581016) - (-1.497836821400877, 2.092994811978087) - (-1.4980643213726448, 2.0879714024991762) - (-1.4982791903814832, 2.0829474369002696) - (-1.498481427069076, 2.0779229469408658) - (-1.4986710301569643, 2.0728979643837797) - (-1.498847998446553, 2.06787252099494) - (-1.4990123308191194, 2.0628466485431876) - (-1.4991640262358203, 2.057820378800076) - (-1.4993030837376977, 2.052793743539673) - (-1.4994295024456856, 2.0477667745383537) - (-1.4995432815606158, 2.042739503574604) - (-1.4996444203632224, 2.0377119624288187) - (-1.499732918214146, 2.0326841828831) - (-1.4998087745539388, 2.0276561967210593) - (-1.4998719889030672, 2.0226280357276125) - (-1.4999225608619158, 2.017599731688781) - (-1.4999604901107884, 2.012571316391489) - (-1.4999857764099118, 2.0075428216233657) - (-1.4999984195994363, 2.0025142791725443) - (-1.4999984195994363, 1.9974857208274561) - (-1.4999857764099118, 1.9924571783766345) - (-1.4999604901107884, 1.9874286836085122) - (-1.4999225608619158, 1.9824002683112198) - (-1.4998719889030672, 1.977371964272388) - (-1.4998087745539388, 1.9723438032789409) - (-1.499732918214146, 1.9673158171169005) - (-1.4996444203632224, 1.9622880375711829) - (-1.499543281560616, 1.9572604964253968) - (-1.4994295024456856, 1.952233225461647) - (-1.4993030837376977, 1.9472062564603274) - (-1.4991640262358203, 1.9421796211999234) - (-1.4990123308191197, 1.9371533514568138) - (-1.498847998446553, 1.9321274790050607) - (-1.4986710301569643, 1.9271020356162214) - (-1.498481427069076, 1.9220770530591345) - (-1.4982791903814832, 1.91705256309973) - (-1.498064321372645, 1.9120285975008242) - (-1.4978368214008773, 1.9070051880219134) - (-1.4975966919043437, 1.9019823664189854) - (-1.4973439344010473, 1.8969601644443042) - (-1.4970785504888195, 1.8919386138462224) - (-1.4968005418453112, 1.8869177463689748) - (-1.4965099102279817, 1.8818975937524727) - (-1.4962066574740882, 1.876878187732115) - (-1.4958907855006727, 1.871859560038574) - (-1.4955622963045516, 1.8668417423976091) - (-1.4952211919623022, 1.8618247665298513) - (-1.4948674746302495, 1.856808664150616) - (-1.494501146544453, 1.8517934669696965) - (-1.4941222100206921, 1.8467792066911584) - (-1.4937306674544522, 1.8417659150131518) - (-1.493326521320908, 1.8367536236276967) - (-1.4929097741749102, 1.831742364220495) - (-1.4924804286509674, 1.8267321684707247) - (-1.4920384874632298, 1.8217230680508343) - (-1.4915839534054731, 1.8167150946263553) - (-1.4911168293510795, 1.811708279855688) - (-1.4906371182530205, 1.806702655389915) - (-1.4901448231438372, 1.801698252872587) - (-1.4896399471356228, 1.7966951039395354) - (-1.4891224934200011, 1.7916932402186674) - (-1.488592465268107, 1.7866926933297596) - (-1.4880498660305672, 1.7816934948842718) - (-1.4874946991374762, 1.7766956764851318) - (-1.486926968098377, 1.7716992697265495) - (-1.4863466765022384, 1.76670430619381) - (-1.4857538280174312, 1.76171081746307) - (-1.4851484263917065, 1.7567188351011702) - (-1.4845304754521707, 1.751728390665422) - (-1.4838999791052625, 1.746739515703419) - (-1.4832569413367278, 1.7417522417528337) - (-1.4826013662115936, 1.7367666003412128) - (-1.4819332578741435, 1.731782622985789) - (-1.481252620547891, 1.7268003411932689) - (-1.4805594585355533, 1.7218197864596476) - (-1.4798537762190225, 1.7168409902699948) - (-1.4791355780593398, 1.7118639840982692) - (-1.4784048685966673, 1.7068887994071138) - (-1.477661652450257, 1.7019154676476511) - (-1.4769059343184245, 1.6969440202592976) - (-1.4761377189785168, 1.6919744886695502) - (-1.475357011286884, 1.687006904293801) - (-1.4745638161788477, 1.6820412985351312) - (-1.4737581386686698, 1.6770777027841097) - (-1.4729399838495214, 1.6721161484186056) - (-1.4721093568934494, 1.6671566668035767) - (-1.4712662630513453, 1.6621992892908837) - (-1.4704107076529105, 1.65724404721908) - (-1.469542696106624, 1.652290971913224) - (-1.4686622338997077, 1.6473400946846777) - (-1.467769326598091, 1.6423914468309015) - (-1.4668639798463765, 1.6374450596352699) - (-1.4659461993678036, 1.6325009643668598) - (-1.4650159909642138, 1.6275591922802641) - (-1.4640733605160121, 1.6226197746153899) - (-1.4631183139821307, 1.6176827425972555) - (-1.462150857399992, 1.6127481274358042) - (-1.4611709968854687, 1.607815960325695) - (-1.4601787386328473, 1.6028862724461168) - (-1.459174088914787, 1.5979590949605824) - (-1.4581570540822812, 1.5930344590167347) - (-1.4571276405646176, 1.5881123957461543) - (-1.4560858548693356, 1.583192936264151) - (-1.4550317035821883, 1.5782761116695818) - (-1.4539651933670974, 1.5733619530446425) - (-1.452886330966114, 1.5684504914546769) - (-1.4517951231993744, 1.5635417579479813) - (-1.4506915769650572, 1.5586357835556013) - (-1.4495756992393403, 1.5537325992911457) - (-1.448447497076356, 1.5488322361505822) - (-1.4473069776081464, 1.5439347251120452) - (-1.4461541480446194, 1.5390400971356386) - (-1.4449890156735024, 1.534148383163243) - (-1.4438115878602953, 1.5292596141183152) - (-1.442621872048226, 1.5243738209056967) - (-1.4414198757582013, 1.5194910344114168) - (-1.4402056065887607, 1.5146112855024962) - (-1.4389790722160283, 1.5097346050267564) - (-1.437740280393663, 1.5048610238126185) - (-1.4364892389528112, 1.4999905726689127) - (-1.4352259558020561, 1.495123282384681) - (-1.4339504389273678, 1.4902591837289845) - (-1.4326626963920543, 1.4853983074507098) - (-1.4313627363367074, 1.4805406842783686) - (-1.4300505669791552, 1.4756863449199122) - (-1.428726196614407, 1.4708353200625308) - (-1.4273896336146015, 1.465987640372461) - (-1.4260408864289562, 1.4611433364947959) - (-1.4246799635837097, 1.4563024390532826) - (-1.4233068736820724, 1.4514649786501383) - (-1.421921625404169, 1.4466309858658541) - (-1.4205242275069843, 1.4418004912589937) - (-1.4191146888243091, 1.4369735253660139) - (-1.417693018266682, 1.432150118701058) - (-1.4162592248213364, 1.4273303017557755) - (-1.4148133175521391, 1.422514104999117) - (-1.413355305599538, 1.4177015588771522) - (-1.4118851981805016, 1.4128926938128736) - (-1.4104030045884595, 1.4080875402059974) - (-1.4089087341932474, 1.4032861284327853) - (-1.4074023964410436, 1.3984884888458373) - (-1.405884000854313, 1.3936946517739124) - (-1.4043535570317454, 1.3889046475217315) - (-1.4028110746481928, 1.3841185063697807) - (-1.4012565634546128, 1.3793362585741327) - (-1.3996900332780018, 1.3745579343662402) - (-1.3981114940213377, 1.3697835639527596) - (-1.3965209556635128, 1.3650131775153467) - (-1.3949184282592744, 1.360246805210477) - (-1.39330392193916, 1.3554844771692498) - (-1.3916774469094313, 1.350726223497194) - (-1.3900390134520135, 1.3459720742740875) - (-1.388388631924426, 1.3412220595537563) - (-1.3867263127597211, 1.3364762093638938) - (-1.3850520664664154, 1.331734553705867) - (-1.383365903628423, 1.3269971225545212) - (-1.3816678349049913, 1.3222639458580043) - (-1.3799578710306304, 1.3175350535375614) - (-1.3782360228150479, 1.3128104754873582) - (-1.3765023011430797, 1.3080902415742885) - (-1.374756716974619, 1.303374381637778) - (-1.3729992813445515, 1.2986629254896092) - (-1.3712300053626807, 1.293955902913719) - (-1.3694489002136625, 1.2892533436660234) - (-1.3676559771569294, 1.2845552774742164) - (-1.365851247526624, 1.2798617340375937) - (-1.3640347227315253, 1.2751727430268605) - (-1.3622064142549748, 1.2704883340839372) - (-1.3603663336548082, 1.265808536821786) - (-1.3585144925632773, 1.2611333808242087) - (-1.3566509026869809, 1.256462895645672) - (-1.354775575806789, 1.2517971108111157) - (-1.3528885237777664, 1.2471360558157603) - (-1.3509897585291017, 1.2424797601249338) - (-1.3490792920640278, 1.2378282531738702) - (-1.34715713645975, 1.2331815643675381) - (-1.345223303867366, 1.2285397230804413) - (-1.3432778065117916, 1.2239027586564437) - (-1.3413206566916833, 1.2192707004085805) - (-1.3393518667793574, 1.2146435776188667) - (-1.3373714492207174, 1.2100214195381238) - (-1.3353794165351687, 1.205404255385782) - (-1.3333757813155456, 1.2007921143497065) - (-1.3313605562280286, 1.1961850255860087) - (-1.3293337540120629, 1.1915830182188567) - (-1.3272953874802822, 1.1869861213403023) - (-1.3252454695184224, 1.1823943640100845) - (-1.3231840130852452, 1.1778077752554577) - (-1.3211110312124534, 1.1732263840709993) - (-1.3190265370046077, 1.1686502194184303) - (-1.3169305436390477, 1.164079310226434) - (-1.314823064365803, 1.159513685390466) - (-1.312704112507515, 1.1549533737725812) - (-1.3105737014593488, 1.150398404201244) - (-1.3084318446889103, 1.145848805471148) - (-1.3062785557361618, 1.1413046063430377) - (-1.3041138482133325, 1.136765835543518) - (-1.3019377358048383, 1.1322325217648839) - (-1.2997502322671906, 1.12770469366493) - (-1.2975513514289108, 1.1231823798667726) - (-1.295341107190444, 1.1186656089586704) - (-1.2931195135240687, 1.1141544094938398) - (-1.290886584473812, 1.1096488099902804) - (-1.2886423341553572, 1.1051488389305877) - (-1.2863867767559567, 1.1006545247617776) - (-1.2841199265343415, 1.0961658958951062) - (-1.2818417978206307, 1.0916829807058868) - (-1.2795524050162437, 1.0872058075333173) - (-1.2772517625938045, 1.0827344046802936) - (-1.274939885097054, 1.0782688004132346) - (-1.2726167871407557, 1.0738090229619028) - (-1.2702824834106066, 1.0693551005192283) - (-1.2679369886631389, 1.064907061241123) - (-1.2655803177256326, 1.0604649332463136) - (-1.2632124854960183, 1.0560287446161543) - (-1.2608335069427827, 1.0515985233944534) - (-1.2584433971048774, 1.0471742975872984) - (-1.2560421710916188, 1.0427560951628712) - (-1.2536298440825975, 1.0383439440512814) - (-1.251206431327579, 1.0339378721443817) - (-1.2487719481464088, 1.0295379072955944) - (-1.246326409928916, 1.0251440773197387) - (-1.2438698321348127, 1.0207564099928454) - (-1.2414022302936025, 1.016374933051995) - (-1.2389236200044746, 1.011999674195128) - (-1.2364340169362125, 1.007630661080881) - (-1.2339334368270907, 1.0032679213284075) - (-1.2314218954847742, 0.9989114825171994) - (-1.228899408786224, 0.994561372186922) - (-1.2263659926775896, 0.9902176178372291) - (-1.2238216631741148, 0.9858802469275982) - (-1.2212664363600327, 0.981549286877154) - (-1.2187003283884632, 0.9772247650644894) - (-1.2161233554813153, 0.9729067088275034) - (-1.213535533929179, 0.9685951454632162) - (-1.2109368800912275, 0.9642901022276089) - (-1.208327410395109, 0.9599916063354388) - (-1.2057071413368472, 0.9556996849600778) - (-1.2030760894807353, 0.9514143652333367) - (-1.2004342714592282, 0.9471356742452883) - (-1.197781703972844, 0.9428636390441079) - (-1.1951184037900509, 0.9385982866358891) - (-1.192444387747167, 0.934339643984484) - (-1.1897596727482533, 0.9300877380113286) - (-1.1870642757650012, 0.9258425955952676) - (-1.1843582138366335, 0.9216042435723952) - (-1.1816415040697885, 0.9173727087358738) - (-1.1789141636384204, 0.9131480178357758) - (-1.1761762097836814, 0.908930197578903) - (-1.1734276598138214, 0.9047192746286288) - (-1.1706685311040739, 0.9005152756047239) - (-1.167898841096544, 0.8963182270831844) - (-1.165118607300106, 0.8921281555960747) - (-1.162327847290283, 0.8879450876313464) - (-1.1595265787091433, 0.8837690496326822) - (-1.1567148192651875, 0.8796000679993248) - (-1.1538925867332306, 0.8754381690859043) - (-1.1510598989542997, 0.8712833792022829) - (-1.1482167738355111, 0.8671357246133764) - (-1.1453632293499645, 0.8629952315389984) - (-1.1424992835366274, 0.8588619261536905) - (-1.1396249545002168, 0.8547358345865519) - (-1.1367402604110926, 0.850616982921085) - (-1.1338452195051338, 0.8465053971950189) - (-1.1309398500836327, 0.8424011034001555) - (-1.12802417051317, 0.8383041274821947) - (-1.1250981992255056, 0.8342144953405799) - (-1.1221619547174602, 0.83013223282833) - (-1.1192154555507943, 0.8260573657518722) - (-1.1162587203520982, 0.8219899198708875) - (-1.1132917678126664, 0.8179299208981383) - (-1.1103146166883864, 0.8138773944993145) - (-1.1073272857996173, 0.8098323662928673) - (-1.104329794031067, 0.8057948618498434) - (-1.1013221603316807, 0.8017649066937327) - (-1.0983044037145129, 0.7977425263002957) - (-1.0952765432566154, 0.7937277460974144) - (-1.092238598098908, 0.7897205914649195) - (-1.0891905874460648, 0.7857210877344398) - (-1.0861325305663905, 0.7817292601892392) - (-1.0830644467916946, 0.7777451340640502) - (-1.0799863555171767, 0.7737687345449269) - (-1.0768982762012957, 0.7698000867690724) - (-1.0738002283656547, 0.7658392158246912) - (-1.0706922315948726, 0.7618861467508253) - (-1.067574305536459, 0.7579409045371923) - (-1.0644464699006964, 0.7540035141240367) - (-1.061308744460509, 0.7500740004019641) - (-1.0581611490513412, 0.7461523882117875) - (-1.0550037035710316, 0.7422387023443695) - (-1.051836427979686, 0.7383329675404648) - (-1.0486593422995538, 0.7344352084905676) - (-1.0454724666148993, 0.7305454498347492) - (-1.0422758210718746, 0.7266637161625074) - (-1.0390694258783932, 0.7227900320126088) - (-1.035853301304002, 0.7189244218729334) - (-1.0326274676797544, 0.7150669101803224) - (-1.0293919453980787, 0.7112175213204206) - (-1.0261467549126517, 0.7073762796275236) - (-1.0228919167382693, 0.7035432093844236) - (-1.019627451450715, 0.6997183348222569) - (-1.016353379686632, 0.6959016801203486) - (-1.013069722143392, 0.692093269406064) - (-1.0097764995789633, 0.6882931267546499) - (-1.0064737328117812, 0.6845012761890881) - (-1.003161442720615, 0.6807177416799393) - (-0.9998396502444364, 0.6769425471451942) - (-0.9965083763822893, 0.6731757164501231) - (-0.9931676421931528, 0.6694172734071209) - (-0.9898174687958112, 0.6656672417755598) - (-0.9864578773687211, 0.6619256452616409) - (-0.9830888891498728, 0.6581925075182371) - (-0.9797105254366636, 0.6544678521447536) - (-0.9763228075857546, 0.6507517026869685) - (-0.9729257570129433, 0.6470440826368922) - (-0.9695193951930245, 0.6433450154326166) - (-0.9661037436596525, 0.6396545244581611) - (-0.9626788240052111, 0.6359726330433351) - (-0.9592446578806697, 0.6322993644635799) - (-0.9558012669954528, 0.6286347419398308) - (-0.9523486731173005, 0.6249787886383655) - (-0.9488868980721274, 0.6213315276706555) - (-0.9454159637438921, 0.6176929820932271) - (-0.9419358920744496, 0.6140631749075065) - (-0.9384467050634226, 0.6104421290596844) - (-0.9349484247680528, 0.6068298674405612) - (-0.9314410733030687, 0.6032264128854101) - (-0.9279246728405439, 0.5996317881738298) - (-0.9243992456097525, 0.5960460160295966) - (-0.9208648138970368, 0.5924691191205291) - (-0.9173214000456567, 0.5889011200583356) - (-0.9137690264556579, 0.5853420413984796) - (-0.9102077155837256, 0.5817919056400327) - (-0.9066374899430392, 0.5782507352255297) - (-0.9030583721031387, 0.5747185525408356) - (-0.899470384689772, 0.5711953799149929) - (-0.8958735503847621, 0.567681239620091) - (-0.8922678919258535, 0.5641761538711163) - (-0.8886534321065769, 0.5606801448258192) - (-0.8850301937761018, 0.5571932345845707) - (-0.8813981998390885, 0.5537154451902193) - (-0.8777574732555513, 0.55024679862796) - (-0.874108037040704, 0.5467873168251858) - (-0.870449914264823, 0.5433370216513571) - (-0.8667831280530978, 0.5398959349178603) - (-0.8631077015854802, 0.5364640783778658) - (-0.8594236580965482, 0.5330414737261999) - (-0.8557310208753477, 0.5296281425991969) - (-0.8520298132652542, 0.5262241065745707) - (-0.8483200586638224, 0.5228293871712766) - (-0.8446017805226333, 0.5194440058493688) - (-0.8408750023471561, 0.5160679840098759) - (-0.8371397476965878, 0.5127013429946541) - (-0.8333960401837162, 0.509344104086263) - (-0.8296439034747587, 0.5059962885078209) - (-0.8258833612892238, 0.5026579174228789) - (-0.8221144373997549, 0.49932901193528445) - (-0.8183371556319776, 0.4960095930890427) - (-0.8145515398643586, 0.4926996818681939) - (-0.8107576140280426, 0.4893992991966696) - (-0.8069554021067116, 0.4861084659381689) - (-0.8031449281364282, 0.48282720289602366) - (-0.799326216205483, 0.47955553081306457) - (-0.7954992904542448, 0.47629347037149317) - (-0.7916641750750062, 0.4730410421927498) - (-0.7878208943118317, 0.4697982668373839) - (-0.7839694724604038, 0.46656516480492316) - (-0.780109933867869, 0.4633417565337439) - (-0.7762423029326895, 0.46012806240094584) - (-0.7723666041044743, 0.45692410272221284) - (-0.7684828618838462, 0.45372989775170014) - (-0.764591100822263, 0.45054546768188874) - (-0.7606913455218851, 0.447370832643474) - (-0.756783620635403, 0.4442060127052272) - (-0.7528679508658895, 0.4410510278738733) - (-0.7489443609666415, 0.4379058980939632) - (-0.7450128757410244, 0.43477064324774917) - (-0.7410735200423137, 0.43164528315505724) - (-0.7371263187735397, 0.42852983757316276) - (-0.7331712968873276, 0.42542432619666504) - (-0.729208479385747, 0.4223287686573669) - (-0.7252378913201383, 0.4192431845241402) - (-0.7212595577909757, 0.4161675933028173) - (-0.7172735039476861, 0.41310201443605) - (-0.7132797549885106, 0.4100464673032045) - (-0.7092783361603301, 0.4070009712202258) - (-0.705269272758513, 0.40396554543952123) - (-0.7012525901267535, 0.4009402091498373) - (-0.6972283136569115, 0.3979249814761394) - (-0.6931964687888523, 0.3949198814794903) - (-0.6891570810102854, 0.39192492815692925) - (-0.685110175856602, 0.38894014044135106) - (-0.6810557789107214, 0.3859655372013926) - (-0.6769939158029123, 0.3830011372413007) - (-0.6729246122106534, 0.38004695930082955) - (-0.6688478938584475, 0.3771030220551055) - (-0.6647637865176805, 0.3741693441145246) - (-0.6606723160064434, 0.37124594402462385) - (-0.6565735081893747, 0.36833284026596824) - (-0.6524673889774972, 0.3654300512540338) - (-0.648353984328053, 0.36253759533909125) - (-0.64423332024434, 0.3596554908060887) - (-0.6401054227755472, 0.3567837558745377) - (-0.6359703180165888, 0.3539224086983961) - (-0.6318280321079464, 0.3510714673659585) - (-0.6276785912354879, 0.3482309498997309) - (-0.6235220216303232, 0.3454008742563317) - (-0.6193583495686164, 0.34258125832636277) - (-0.6151876013714397, 0.33977211993431) - (-0.6110098034045928, 0.3369734768384214) - (-0.6068249820784419, 0.3341853467305984) - (-0.6026331638477529, 0.3314077472362835) - (-0.5984343752115227, 0.32864069591434886) - (-0.5942286427128125, 0.32588421025698566) - (-0.5900159929385798, 0.32313830768959306) - (-0.585796452519509, 0.3204030055706668) - (-0.5815700481298502, 0.31767832119169515) - (-0.5773368064872346, 0.31496427177703845) - (-0.5730967543525274, 0.31226087448383444) - (-0.5688499185296352, 0.30956814640187513) - (-0.5645963258653584, 0.3068861045535125) - (-0.5603360032492064, 0.3042147658935408) - (-0.5560689776132335, 0.3015541473090937) - (-0.5517952759318676, 0.2989042656195371) - (-0.5475149252217406, 0.2962651375763623) - (-0.5432279525415162, 0.2936367798630808) - (-0.5389343849917201, 0.291019209095118) - (-0.5346342497145664, 0.2884124418197074) - (-0.5303275738937918, 0.2858164945157906) - (-0.5260143847544763, 0.2832313835939062) - (-0.5216947095628748, 0.280657125396091) - (-0.5173685756262452, 0.27809373619577493) - (-0.5130360102926743, 0.2755412321976787) - (-0.5086970409509068, 0.2729996295377106) - (-0.5043516950301696, 0.2704689442828656) - (-0.5000000000000009, 0.26794919243112303) - (-0.4956419833700745, 0.2654403899113458) - (-0.491277672690026, 0.2629425525831779) - (-0.4869070955492837, 0.2604556962369493) - (-0.48253027957688566, 0.2579798365935695) - (-0.4781472524413104, 0.25551498930443217) - (-0.47375804185030135, 0.25306116995131545) - (-0.4693626755506911, 0.25061839404628317) - (-0.46496118132822617, 0.2481866770315868) - (-0.46055358700739135, 0.245766034279568) - (-0.45613992045123386, 0.24335648109256147) - (-0.4517202095611855, 0.24095803270279736) - (-0.4472944822768944, 0.23857070427230864) - (-0.44286276657603074, 0.23619451089282717) - (-0.43842509047413203, 0.23382946758569845) - (-0.433981482024409, 0.23147558930177947) - (-0.42953196931757576, 0.22913289092134592) - (-0.42507658048167063, 0.226801387254) - (-0.4206153436818787, 0.2244810930385741) - (-0.41614828712035334, 0.22217202294303995) - (-0.4116754390360384, 0.21987419156441468) - (-0.4071968277044875, 0.21758761342866717) - (-0.4027124814376938, 0.2153123029906321) - (-0.3982224285838931, 0.21304827463390796) - (-0.39372669752740896, 0.21079554267077927) - (-0.3892253166884473, 0.2085541213421125) - (-0.3847183145229408, 0.20632402481727863) - (-0.3802057195223518, 0.20410526719405442) - (-0.3756875602134998, 0.20189786249853747) - (-0.3711638651583794, 0.19970182468505704) - (-0.3666346629539804, 0.19751716763608518) - (-0.36209998223210615, 0.19534390516214906) - (-0.35755985165919335, 0.19318205100174457) - (-0.35301429993612865, 0.19103161882124753) - (-0.3484633557980755, 0.18889262221483172) - (-0.34390704801427496, 0.18676507470437453) - (-0.3393454053878875, 0.18464898973938304) - (-0.33477845675578577, 0.18254438069689605) - (-0.33020623098839574, 0.18045126088141217) - (-0.32562875698949734, 0.17836964352479634) - (-0.3210460636960488, 0.1762995417862001) - (-0.3164581800780033, 0.17424096875197836) - (-0.3118651351381245, 0.17219393743560563) - (-0.30726695791180436, 0.17015846077759478) - (-0.30266367746687894, 0.1681345516454147) - (-0.29805532290344294, 0.16612222283340783) - (-0.29344192335367447, 0.16412148706271368) - (-0.2888235079816326, 0.16213235698118034) - (-0.2842001059830971, 0.1601548451632948) - (-0.27957174658535855, 0.15818896411009264) - (-0.2749384590470576, 0.15623472624908907) - (-0.27030027265798173, 0.15429214393419266) - (-0.2656572167388891, 0.15236122944563157) - (-0.26100932064132076, 0.15044199498987454) - (-0.2563566137474157, 0.14853445269955334) - (-0.2516991254697245, 0.1466386146333869) - (-0.24703688525102407, 0.14475449277610486) - (-0.24236992256412937, 0.14288209903837057) - (-0.23769826691171547, 0.14102144525671) - (-0.23302194782611307, 0.13917254319342898) - (-0.22834099486914639, 0.1373354045365489) - (-0.22365543763191986, 0.13551004089972252) - (-0.2189653057346559, 0.13369646382217004) - (-0.21427062882648962, 0.13189468476859934) - (-0.20957143658528943, 0.13010471512913635) - (-0.20486775871746765, 0.12832656621925254) - (-0.20015962495779338, 0.126560249279694) - (-0.19544706506920384, 0.12480577547640936) - (-0.19073010884261632, 0.12306315590047956) - (-0.18600878609673854, 0.1213324015680477) - (-0.18128312667788837, 0.11961352342025178) - (-0.17655316045978642, 0.11790653232314874) - (-0.17181891734339272, 0.11621143906765607) - (-0.1670804272566908, 0.1145282543694719) - (-0.1623377201545233, 0.1128569888690183) - (-0.1575908260183847, 0.11119765313136631) - (-0.1528397748562399, 0.10955025764617221) - (-0.14808459670233254, 0.10791481282761084) - (-0.14332532161699596, 0.10629132901430993) - (-0.13856197968646222, 0.10467981646928415) - (-0.1337946010226725, 0.10308028537987113) - (-0.12902321576308506, 0.10149274585766532) - (-0.12424785407049266, 0.09991720793845804) - (-0.1194685461328141, 0.09835368158216728) - (-0.11468532216292615, 0.09680217667278224) - (-0.10989821239845476, 0.09526270301829554) - (-0.1051072471015917, 0.09373527035064377) - (-0.10031245655890209, 0.09221988832564443) - (-0.09551387108113274, 0.09071656652293658) - (-0.09071152100302038, 0.08922531444591875) - (-0.08590543668310002, 0.08774614152168958) - (-0.08109564850351336, 0.0862790571009886) - (-0.07628218686981425, 0.08482407045813556) - (-0.07146508221078407, 0.08338119079097472) - (-0.06664436497822879, 0.08195042722081358) - (-0.06182006564679321, 0.08053178879236644) - (-0.05699221471376703, 0.0791252844736976) - (-0.05216084269889132, 0.07773092315616492) - (-0.047325980144166224, 0.07634871365436191) - (-0.042487657613657914, 0.0749786647060644) - (-0.037645905693304726, 0.07362078497217328) - (-0.032800754990724545, 0.07227508303666053) - (-0.02795223613501907, 0.07094156740651503) - (-0.02310037977658741, 0.06962024651168952) - (-0.018245216586921686, 0.06831112870504574) - (-0.013386777258420635, 0.06701422226230203) - (-0.008525092504192866, 0.06572953538198223) - (-0.003660193057863692, 0.06445707618536245) - (0.0012078903266197205, 0.06319685271642062) - (0.00607912687518275, 0.06194887294178475) - (0.010953485793819273, 0.060713144750683457) - (0.015830936268777906, 0.059489675954896626) - (0.02071144746677589, 0.05827847428870303) - (0.025594988535167895, 0.05707954740883636) - (0.030481528602168795, 0.05589290289443061) - (0.03537103677702286, 0.05471854824697897) - (0.04026348215021813, 0.053556490890280806) - (0.04515883379367319, 0.05240673817039809) - (0.05005706076093425, 0.05126929735560681) - (0.054958132087370826, 0.05014417563635276) - (0.05986201679037173, 0.04903138012520536) - (0.06476868386954054, 0.04793091785681214) - (0.06967810230689359, 0.046842795787854774) - (0.07459024106704726, 0.045767020797006674) - (0.07950506909743327, 0.04470359968488524) - (0.0844225553284691, 0.04365253917401457) - (0.08934266867378182, 0.04261384590877704) - (0.09426537803037893, 0.04158752645537711) - (0.09919065227886387, 0.04057358730179472) - (0.10411846028362415, 0.03957203485774774) - (0.10904877089302994, 0.03858287545465) - (0.1139815529396308, 0.0376061153455709) - (0.11891677524035305, 0.0366417607051972) - (0.12385440659669644, 0.03568981762979284) - (0.12879441579493367, 0.03475029213716074) - (0.1337367716062985, 0.03382319016660573) - (0.13868144278720257, 0.03290851757889457) - (0.14362839807940686, 0.03200628015622198) - (0.14857760621024685, 0.03111648360217112) - (0.15352903589280453, 0.030239133541680285) - (0.1584826558261248, 0.029374235521005154) - (0.16343843469540525, 0.028521795007684814) - (0.16839634117219526, 0.027681817390507124) - (0.17335634391459454, 0.0268543079794743) - (0.17831841156745087, 0.02603927200576961) - (0.1832825127625587, 0.025236714621724277) - (0.18824861611885874, 0.024446640900784633) - (0.193216690242628, 0.023669055837481467) - (0.19818670372769737, 0.022903964347394945) - (0.20315862515562372, 0.022151371267128406) - (0.20813242309591684, 0.02141128135427328) - (0.21310806610621152, 0.02068369928738223) - (0.218085522732486, 0.01996862966593782) - (0.22306476150925159, 0.0192660770103239) - (0.22804575095975366, 0.018576045761797166) - (0.23302845959617047, 0.017898540282459185) - (0.23801285591981242, 0.01723356485522798) - (0.24299890842132083, 0.016581123683812704) - (0.24798658558086917, 0.01594122089268457) - (0.25297585586835347, 0.015313860527053524) - (0.257966687743611, 0.014699046552840267) - (0.262959049656593, 0.01409678285665339) - (0.2679529100475927, 0.013507073245761836) - (0.27294823734741824, 0.012929921448074477) - (0.2779449999776115, 0.012365331112113687) - (0.2829431663506391, 0.011813305806994023) - (0.2879427048700936, 0.01127384902239803) - (0.2929435839308936, 0.010746964168555806) - (0.29794577191948324, 0.010232654576222355) - (0.302949237214032, 0.009730923496657384) - (0.30795394818463684, 0.00924177410160354) - (0.31295987319351276, 0.0087652094832682) - (0.31796698059521245, 0.00830123265430105) - (0.3229752387368017, 0.007849846547778982) - (0.3279846159580788, 0.0074110540171838934) - (0.33299508059176597, 0.006984857836386249) - (0.33800660096371116, 0.006571260699628212) - (0.3430191453930884, 0.006170265221504989) - (0.3480326821925981, 0.005781873936949733) - (0.3530471796686671, 0.0054060893012164435) - (0.35806260612164953, 0.005042913689865314) - (0.3630789298460267, 0.0046923493987474085) - (0.36809611913060947, 0.004354398643989343) - (0.37311414225873185, 0.00402906356198085) - (0.3781329675084617, 0.003716346209360344) - (0.3831525631527946, 0.0034162485630013784) - (0.38817289745985595, 0.0031287725200015437) - (0.3931939386931016, 0.0028539198976689217) - (0.3982156551115185, 0.002591692433511872) - (0.40323801496982536, 0.0023420917852274847) - (0.4082609865186734, 0.0021051195306913684) - (0.4132845380048485, 0.0018807771679469898) - (0.41830863767146537, 0.0016690661151972375) - (0.4233332537581785, 0.0014699877107944292) - (0.4283583545013761, 0.0012835432132327629) - (0.4333839081343825, 0.0011097338011394342) - (0.4384098828876591, 0.0009485605732681979) - (0.4434362469890051, 0.0008000245484918178) - (0.4484629686637584, 0.0006641266657951839) - (0.4534900161349965, 0.0005408677842706489) - (0.45851735762373735, 0.00043024868311158926) - (0.4635449613491419, 0.0003322700616072982) - (0.46857279552870645, 0.0002469325391398769) - (0.4736008283784827, 0.00017423665517868336) - (0.47862902811325414, 0.00011418286927789012) - (0.4836573629467562, 6.677156107381954e-5) - (0.4886858010918687, 3.200303028161322e-5) - (0.49371431076081834, 9.877496694121746e-6) - (0.4987428601653795, 3.9510017990629365e-7) - (0.5037714175170755, 3.555900683238633e-6) - (0.5087999510273795, 1.9359878222324767e-5) - (0.513828428907917, 4.780693289108129e-5) - (0.5188568193706581, 8.889688485846925e-5) - (0.5238850906281379, 0.00014262947437027051) - (0.5289132108936312, 0.00020900436175064208) - (0.533941148381381, 0.00028802112740411445) - (0.5389688713067736, 0.0003796792718182562) - (0.5439963478865588, 0.0004839782155670047) - (0.5490235463390419, 0.0006009172993142187) - (0.5540504348842864, 0.0007304957838176751) - (0.5590769817443147, 0.0008727128499341763) - (0.5641031551433098, 0.0010275675986242128) - (0.5691289233078146, 0.0011950590509581804) - (0.5741542544669365, 0.001375186148122376) - (0.5791791168525378, 0.0015679477514247697) - (0.5842034786994568, 0.0017733426423041099) - (0.5892273082456816, 0.0019913695223361394) - (0.5942505737325798, 0.002222027013242034) - (0.5992732434050723, 0.0024653136568975054) - (0.6042952855118532, 0.002721227915341462) - (0.6093166683055826, 0.0029897681707868884) - (0.6143373600430881, 0.003270932725629505) - (0.6193573289855662, 0.0035647198024597593) - (0.6243765433987821, 0.0038711275440728166) - (0.6293949715532716, 0.004190154013482106) - (0.6344125817245421, 0.004521797193929977) - (0.6394293421932649, 0.004866054988900359) - (0.6444452212454955, 0.005222925222134078) - (0.6494601871728469, 0.005592405637639519) - (0.654474208272719, 0.005974493899710165) - (0.6594872528484717, 0.006369187592936587) - (0.6644992892096454, 0.0067764842222231) - (0.6695102856721524, 0.0071963812128037485) - (0.6745202105584787, 0.007628875910257404) - (0.6795290321978841, 0.008073965580526199) - (0.6845367189266031, 0.008531647409930843) - (0.6895432390880445, 0.009001918505190387) - (0.6945485610329935, 0.009484775893439323) - (0.6995526531198026, 0.009980216522245788) - (0.7045554837146117, 0.010488237259633326) - (0.7095570211915211, 0.011008834894097319) - (0.7145572339328197, 0.011542006134628524) - (0.7195560903291585, 0.012087747610731503) - (0.7245535587797698, 0.012646055872447048) - (0.7295496076926585, 0.013216927390373945) - (0.7345442054848028, 0.013800358555690728) - (0.7395373205823547, 0.014396345680179223) - (0.7445289214208388, 0.015004884996247414) - (0.7495189764453526, 0.01562597265695298) - (0.7545074541107671, 0.016259604736029054) - (0.759494322881918, 0.016905777227906205) - (0.7644795512338238, 0.017564486047741523) - (0.7694631076518608, 0.01823572703144083) - (0.7744449606319819, 0.018919495935687758) - (0.7794250786809065, 0.019615788437968407) - (0.7844034303163213, 0.020324600136600868) - (0.7893799840670801, 0.021045926550760985) - (0.7943547084734017, 0.021779763120511664) - (0.7993275720870696, 0.022526105206832403) - (0.8042985434716305, 0.023284948091646607) - (0.8092675912025928, 0.02405628697785378) - (0.8142346838676272, 0.024840116989358174) - (0.8191997900667586, 0.02563643317109965) - (0.8241628784125745, 0.026445230489086535) - (0.8291239175304168, 0.027266503830425837) - (0.8340828760585819, 0.028100248003355865) - (0.8390397226485187, 0.028946457737280218) - (0.8439944259650269, 0.029805127682799082) - (0.8489469546864555, 0.030676252411744986) - (0.8538972775049, 0.03155982641721633) - (0.8588453631264008, 0.032455844113611354) - (0.8637911802711429, 0.033364299836665445) - (0.8687346976736461, 0.034285187843484444) - (0.873675884082974, 0.0352185023125835) - (0.8786147082629236, 0.03616423734392149) - (0.8835511389922255, 0.03712238695894077) - (0.88848514506474, 0.03809294510060246) - (0.8934166952896557, 0.039075905633426666) - (0.8983457584916859, 0.0400712623435302) - (0.9032723035112658, 0.04107900893866634) - (0.9081962992047514, 0.04209913904826501) - (0.9131177144446074, 0.043131646223470765) - (0.9180365181196235, 0.04417652393718785) - (0.9229526791350862, 0.0452337655841164) - (0.927866166412995, 0.04630336448079864) - (0.9327769488922502, 0.04738531386565814) - (0.93768499552885, 0.04847960689904385) - (0.9425902752960883, 0.04958623666327333) - (0.9474927571847496, 0.0507051961626761) - (0.9523924102033057, 0.051836478323638246) - (0.9572892033781127, 0.052980075994646825) - (0.9621831057535992, 0.054135981946334066) - (0.9670740863924799, 0.05530418887152688) - (0.9719621143759258, 0.056484689385286835) - (0.9768471588037875, 0.05767747602496365) - (0.981729188794764, 0.05888254125023673) - (0.9866081734866174, 0.06009987744316647) - (0.9914840820363593, 0.0613294769082402) - (0.9963568836204474, 0.06257133187242281) - (1.0012265474349804, 0.06382543448520384) - (1.0060930426958925, 0.06509177681864875) - (1.010956338639149, 0.06637035086744825) - (1.0158164045209404, 0.0676611485489691) - (1.020673209617871, 0.06896416170330366) - (1.025526723227169, 0.07027938209332629) - (1.0303769146668578, 0.07160680140473819) - (1.0352237532759747, 0.07294641124612755) - (1.040067208414741, 0.0742982031490158) - (1.0449072494647735, 0.07566216856791619) - (1.04974384582927, 0.07703829888038483) - (1.0545769669332041, 0.07842658538707714) - (1.0594065822235184, 0.07982701931180114) - (1.0642326611693183, 0.08123959180157425) - (1.069055173262064, 0.0826642939266784) - (1.0738740880157662, 0.08410111668071774) - (1.0786893749671695, 0.08555005098067214) - (1.0835010036759636, 0.0870110876669612) - (1.0883089437249511, 0.08848421750349322) - (1.0931131647202657, 0.08996943117773348) - (1.0979136362915407, 0.0914667193007539) - (1.1027103280921173, 0.09297607240729877) - (1.1075032097992301, 0.09449748095584187) - (1.1122922511141993, 0.09603093532864704) - (1.117077421762622, 0.0975764258318299) - (1.1218586914945652, 0.09913394269541786) - (1.126636030084755, 0.10070347607341268) - (1.1314094073327707, 0.10228501604385287) - (1.1361787930632266, 0.10387855260887457) - (1.140944157125982, 0.10548407569477947) - (1.1457054693963058, 0.10710157515209073) - (1.1504626997750942, 0.10873104075562656) - (1.1552158181890357, 0.11037246220455588) - (1.15996479459082, 0.11202582912247006) - (1.1647095989593188, 0.11369113105744488) - (1.169450201299778, 0.11536835748210827) - (1.174186571644007, 0.11705749779370578) - (1.1789186800505682, 0.11875854131416874) - (1.1836464966049662, 0.1204714772901807) - (1.188369991419839, 0.12219629489324646) - (1.1930891346351373, 0.12393298321975799) - (1.1978038964183335, 0.12568153129106907) - (1.2025142469645842, 0.12744192805355614) - (1.207220156496945, 0.12921416237869798) - (1.211921595266534, 0.13099822306313658) - (1.2166185335527393, 0.13279409882875504) - (1.2213109416633965, 0.13460177832274534) - (1.2259987899349802, 0.13642125011768158) - (1.2306820487327892, 0.13825250271159106) - (1.2353606884511361, 0.14009552452802798) - (1.2400346795135333, 0.14195030391614605) - (1.2447039923728815, 0.14381682915077287) - (1.2493685975116506, 0.1456950884324817) - (1.2540284654420755, 0.14758506988766995) - (1.2586835667063359, 0.14948676156863105) - (1.2633338718767448, 0.1514001514536314) - (1.2679793515559348, 0.15332522744698607) - (1.272619976377042, 0.15526197737913505) - (1.277255717003894, 0.15721038900672046) - (1.281886544131194, 0.15917045001266383) - (1.286512428484706, 0.16114214800624405) - (1.291133340821441, 0.1631254705231755) - (1.2957492519298421, 0.1651204050256876) - (1.3003601326299634, 0.16712693890260155) - (1.3049659537736646, 0.16914505946941438) - (1.3095666862447874, 0.171174753968375) - (1.3141623009593428, 0.17321600956856753) - (1.3187527688656941, 0.17526881336599076) - (1.3233380609447403, 0.17733315238364122) - (1.3279181482101, 0.17940901357159333) - (1.3324930017082948, 0.18149638380708377) - (1.3370625925189317, 0.18359524989459342) - (1.3416268917548884, 0.1857055985659315) - (1.346185870562489, 0.18782741648031687) - (1.350739500121695, 0.18996069022446682) - (1.3552877516462836, 0.19210540631267858) - (1.3598305963840287, 0.19426155118691524) - (1.3643680056168843, 0.1964291112168921) - (1.3688999506611652, 0.198608072700162) - (1.3734264028677288, 0.20079842186220276) - (1.3779473336221573, 0.20300014485650442) - (1.3824627143449313, 0.20521322776465278) - (1.3869725164916276, 0.20743765659642688) - (1.3914767115530755, 0.20967341728987487) - (1.3959752710555628, 0.21192049571141536) - (1.4004681665609926, 0.21417887765591592) - (1.404955369667079, 0.2164485488467902) - (1.40943685200752, 0.21872949493608562) - (1.4139125852521777, 0.22102170150457412) - (1.4183825411072584, 0.2233251540618426) - (1.4228466913154896, 0.22563983804638643) - (1.427305007656301, 0.22796573882569993) - (1.4317574619460025, 0.23030284169636972) - (1.4362040260379552, 0.23265113188416486) - (1.440644671822767, 0.23501059454413764) - (1.4450793712284467, 0.23738121476070617) - (1.4495080962206055, 0.23976297754776166) - (1.4539308188026117, 0.24215586784875076) - (1.4583475110157853, 0.2445598705367793) - (1.4627581449395657, 0.2469749704147044) - (1.4671626926916903, 0.24940115221523151) - (1.4715611264283717, 0.25183840060101037) - (1.4759534183444716, 0.25428670016473176) - (1.4803395406736788, 0.25674603542922614) - (1.484719465688685, 0.2592163908475613) - (1.4890931657013526, 0.26169775080313595) - (1.493460613062907, 0.26419009960978923) - (1.4978217801640874, 0.26669342151188635) - (1.5021766394353475, 0.26920770068443134) - (1.5065251633470054, 0.27173292123315496) - (1.5108673244094346, 0.2742690671946246) - (1.5152030951732312, 0.2768161225363408) - (1.5195324482293873, 0.27937407115683865) - (1.5238553562094659, 0.2819428968857911) - (1.5281717917857731, 0.28452258348410986) - (1.5324817276715308, 0.2871131146440489) - (1.5367851366210505, 0.28971447398930805) - (1.5410819914298992, 0.2923266450751316) - (1.5453722649350863, 0.29494961138842357) - (1.5496559300152137, 0.2975833563478367) - (1.5539329595906717, 0.3002278633038935) - (1.5582033266237862, 0.3028831155390763) - (1.562467004119008, 0.30554909626794435) - (1.566723965123074, 0.3082257886372346) - (1.5709741827251809, 0.3109131757259691) - (1.575217630057154, 0.31361124054556244) - (1.5794542802936178, 0.3163199660399285) - (1.583684106652165, 0.3190393350855889) - (1.5879070823935277, 0.3217693304917819) - (1.5921231808217393, 0.32450993500056624) - (1.5963323752843188, 0.32726113128694134) - (1.6005346391724178, 0.33002290195894113) - (1.6047299459210116, 0.332795229557761) - (1.6089182690090456, 0.3355780965578523) - (1.613099581959619, 0.33837148536704476) - (1.6172738583401454, 0.34117537832665246) - (1.6214410717625196, 0.343989757711586) - (1.6256011958832866, 0.34681460573046574) - (1.6297542044038067, 0.3496499045257331) - (1.6339000710704221, 0.35249563617376367) - (1.6380387696746248, 0.35535178268498213) - (1.642170274053214, 0.3582183260039702) - (1.646294558088479, 0.3610952480095926) - (1.6504115957083416, 0.36398253051509655) - (1.6545213608865401, 0.366880155268239) - (1.6586238276427836, 0.3697881039513957) - (1.6627189700429192, 0.3727063581816794) - (1.6668067621990958, 0.37563489951105433) - (1.6708871782699275, 0.3785737094264545) - (1.6749601924606567, 0.38152276934990015) - (1.6790257790233185, 0.38448206063861456) - (1.6830839122569028, 0.38745156458514374) - (1.687134566507513, 0.39043126241747017) - (1.6911777161685355, 0.39342113529913747) - (1.6952133356807961, 0.39642116432936647) - (1.6992413995327238, 0.39943133054317426) - (1.7032618822605112, 0.4024516149114945) - (1.7072747584482753, 0.4054819983412987) - (1.7112800027282193, 0.40852246167571526) - (1.7152775897807917, 0.41157298569415235) - (1.7192674943348474, 0.41463355111241773) - (1.723249691167808, 0.41770413858284305) - (1.727224155105816, 0.4207847286944013) - (1.7311908610239028, 0.4238753019728354) - (1.7351497838461412, 0.4269758388807785) - (1.7391008985458054, 0.4300863198178768) - (1.7430441801455299, 0.4332067251209153) - (1.7469796037174667, 0.43633703506394017) - (1.750907144383443, 0.4394772298583849) - (1.7548267773151187, 0.4426272896531951) - (1.7587384777341435, 0.4457871945349532) - (1.7626422209123138, 0.4489569245280065) - (1.766537982171724, 0.4521364595945876) - (1.7704257368849359, 0.45532577963495235) - (1.774305460475116, 0.45852486448749286) - (1.7781771284162065, 0.4617336939288763) - (1.782040716233072, 0.464952247674167) - (1.7858961995016565, 0.46818050537695655) - (1.7897435538491382, 0.47141844662949195) - (1.7935827549540826, 0.47466605096280445) - (1.7974137785465971, 0.4779232978468393) - (1.801236600408485, 0.48119016669058645) - (1.8050511963733926, 0.48446663684220503) - (1.8088575423269764, 0.4877526875891671) - (1.8126556142070354, 0.49104829815837037) - (1.8164453880036846, 0.4943534477162881) - (1.820226839759487, 0.49766811536908473) - (1.8239999455696192, 0.5009922801627587) - (1.8277646815820168, 0.5043259210832711) - (1.831521023997525, 0.5076690170566778) - (1.8352689490700511, 0.5110215469492645) - (1.8390084331067125, 0.5143834895676789) - (1.8427394524679879, 0.5177548236590654) - (1.8464619835678673, 0.5211355279112002) - (1.8501760028739955, 0.524525580952621) - (1.853881486907834, 0.5279249613527737) - (1.8575784122447905, 0.5313336476221313) - (1.861266755514388, 0.5347516182123484) - (1.8649464934003925, 0.5381788515163792) - (1.8686176026409755, 0.5416153258686278) - (1.8722800600288536, 0.5450610195450787) - (1.875933842411437, 0.5485159107634356) - (1.879578926690976, 0.551979977683259) - (1.8832152898247063, 0.5554531984061044) - (1.886842908824996, 0.5589355509756604) - (1.890461760759491, 0.562427013377889) - (1.8940718227512536, 0.5659275635411587) - (1.8976730719789223, 0.5694371793363977) - (1.9012654856768356, 0.572955838577214) - (1.904849041135197, 0.5764835190200579) - (1.9084237157001993, 0.5800201983643414) - (1.911989486774182, 0.5835658542525946) - (1.9155463318157675, 0.5871204642706) - (1.9190942283400052, 0.5906840059475358) - (1.922633153918513, 0.5942564567561179) - (1.9261630861796202, 0.597837794112742) - (1.9296840028085076, 0.6014279953776267) - (1.9331958815473507, 0.605027037854958) - (1.936698700195454, 0.6086348987930261) - (1.9401924366094054, 0.612251555384383) - (1.9436770687031961, 0.6158769847659684) - (1.9471525744483817, 0.6195111640192736) - (1.9506189318742027, 0.6231540701704685) - (1.9540761190677356, 0.6268056801905593) - (1.957524114174027, 0.6304659709955294) - (1.9609628953962315, 0.6341349194464849) - (1.9643924409957507, 0.6378125023498025) - (1.9678127292923702, 0.6414986964572749) - (1.971223738664396, 0.6451934784662583) - (1.9746254475487937, 0.648896825019821) - (1.9780178344413173, 0.6526087127068845) - (1.9814008778966594, 0.6563291180623854) - (1.98477455652857, 0.6600580175674065) - (1.9881388490100038, 0.6637953876493388) - (1.9914937340732508, 0.6675412046820244) - (1.9948391905100704, 0.6712954449859074) - (1.9981751971718256, 0.6750580848281833) - (2.0015017329696176, 0.6788291004229488) - (2.004818776874419, 0.6826084679313524) - (2.0081263079172045, 0.6863961634617459) - (2.0114243051890885, 0.6901921630698338) - (2.014712747841452, 0.6939964427588274) - (2.0179916150860757, 0.6978089784795902) - (2.0212608861952726, 0.701629746130799) - (2.024520540502021, 0.70545872155909) - (2.02777055740009, 0.7092958805592124) - (2.0310109163441736, 0.7131411988741836) - (2.03424159685002, 0.7169946521954398) - (2.03746257849456, 0.7208562161629914) - (2.0406738409160363, 0.7247258663655769) - (2.0438753638141347, 0.7286035783408178) - (2.0470671269501066, 0.7324893275753679) - (2.050249110146904, 0.7363830895050776) - (2.0534212932893023, 0.740284839515142) - (2.0565836563240296, 0.7441945529402596) - (2.059736179259893, 0.7481122050647868) - (2.062878842167904, 0.7520377711228949) - (2.066011625181405, 0.7559712262987264) - (2.0691345084961963, 0.7599125457265519) - (2.072247472370659, 0.7638617044909277) - (2.0753504971258825, 0.7678186776268541) - (2.0784435631457834, 0.7717834401199262) - (2.0815266508772408, 0.7757559669065084) - (2.084599740830204, 0.7797362328738717) - (2.0876628135778303, 0.7837242128603694) - (2.0907158497565987, 0.7877198816555881) - (2.093758830066438, 0.791723214000509) - (2.096791735270843, 0.7957341845876673) - (2.0998145461970017, 0.7997527680613123) - (2.102827243735913, 0.8037789390175676) - (2.1058298088425103, 0.8078126720045933) - (2.1088222225357747, 0.8118539415227395) - (2.11180446589887, 0.8159027220247239) - (2.1147765200792423, 0.8199589879157707) - (2.1177383662887594, 0.8240227135537963) - (2.1206899858038106, 0.8280938732495491) - (2.123631359965441, 0.8321724412667886) - (2.12656247017946, 0.8362583918224402) - (2.129483297916562, 0.8403516990867599) - (2.1323938247124428, 0.8444523371834973) - (2.1352940321679177, 0.8485602801900598) - (2.138183901949035, 0.852675502137676) - (2.141063415787196, 0.8567979770115608) - (2.143932555479264, 0.860927678751074) - (2.14679130288769, 0.8650645812499) - (2.149639639940613, 0.8692086583561911) - (2.15247754863199, 0.8733598838727561) - (2.155305011021695, 0.8775182315572045) - (2.1581220092356443, 0.8816836751221282) - (2.160928525465902, 0.8858561882352598) - (2.1637245419707956, 0.8900357445196418) - (2.1665100410750284, 0.8942223175537922) - (2.16928500516979, 0.8984158808718716) - (2.172049416712867, 0.9026164079638515) - (2.1748032582287586, 0.9068238722756821) - (2.1775465123087767, 0.9110382472094536) - (2.180279161611171, 0.9152595061235804) - (2.1830011888612235, 0.9194876223329473) - (2.1857125768513708, 0.9237225691091018) - (2.1884133084412998, 0.927964319680401) - (2.191103366558067, 0.9322128472321969) - (2.193782734196203, 0.9364681249069988) - (2.196451394417817, 0.9407301258046443) - (2.1991093303527074, 0.9449988229824695) - (2.2017565251984674, 0.9492741894554797) - (2.20439296222059, 0.953556198196519) - (2.207018624752577, 0.9578448221364435) - (2.2096334961960378, 0.9621400341642845) - (2.2122375600208057, 0.966441807127437) - (2.2148307997650276, 0.970750113831808) - (2.217413199035283, 0.9750649270420126) - (2.2199847415066754, 0.9793862194815244) - (2.222545410922943, 0.9837139638328636) - (2.2250951910965586, 0.9880481327377626) - (2.2276340659088323, 0.9923886987973403) - (2.230162019310014, 0.9967356345722753) - (2.2326790353193937, 1.0010889125829796) - (2.235185098025404, 1.0054485053097717) - (2.237680191585721, 1.009814385193053) - (2.240164300227358, 1.0141865246334736) - (2.242637408246779, 1.0185648959921243) - (2.2450995000099803, 1.0229494715906873) - (2.2475505599526073, 1.027340223711637) - (2.2499905725800375, 1.0317371245983906) - (2.2524195224674886, 1.036140146455503) - (2.254837394260111, 1.0405492614488314) - (2.2572441726730883, 1.0449644417057162) - (2.259639842491729, 1.0493856593151547) - (2.2620243885715685, 1.0538128863279788) - (2.2643977958384607, 1.0582460947570311) - (2.266760049288675, 1.062685256577344) - (2.2691111339889893, 1.0671303437263102) - (2.2714510350767885, 1.071581328103869) - (2.2737797377601536, 1.0760381815726792) - (2.2760972273179583, 1.0805008759582964) - (2.2784034890999623, 1.0849693830493532) - (2.2806985085269003, 1.0894436745977365) - (2.282982271090579, 1.0939237223187654) - (2.285254762353965, 1.0984094978913714) - (2.287515967951278, 1.102900972958277) - (2.289765873588083, 1.1073981191261764) - (2.292004465041374, 1.1119009079659075) - (2.294231728159674, 1.1164093110126434) - (2.296447648863116, 1.1209232997660645) - (2.2986522131435363, 1.1254428456905408) - (2.3008454070645623, 1.1299679202153117) - (2.3030272167617003, 1.1344984947346668) - (2.3051976284424214, 1.1390345406081281) - (2.3073566283862528, 1.1435760291606285) - (2.3095042029448614, 1.148122931682697) - (2.311640338542137, 1.1526752194306307) - (2.3137650216742904, 1.157232863626695) - (2.3158782389099217, 1.1617958354592826) - (2.317979976890118, 1.1663641060831136) - (2.320070222328533, 1.170937646619409) - (2.3221489620114726, 1.1755164281560768) - (2.3242161827979757, 1.1801004217478925) - (2.3262718716198996, 1.1846895984166832) - (2.328316015482003, 1.1892839291515107) - (2.3303486014620267, 1.1938833849088568) - (2.3323696167107744, 1.198487936612798) - (2.334379048452199, 1.203097555155208) - (2.3363768839834735, 1.2077122113959171) - (2.3383631106750853, 1.2123318761629216) - (2.340337715970902, 1.216956520252545) - (2.34230068738826, 1.22158611442964) - (2.344252012518039, 1.2262206294277656) - (2.346191679024743, 1.2308600359493722) - (2.3481196746465764, 1.235504304665989) - (2.3500359871955228, 1.2401534062184083) - (2.3519406045574214, 1.2448073112168703) - (2.353833514692044, 1.2494659902412524) - (2.355714705633168, 1.2541294138412453) - (2.3575841654886607, 1.258797552536558) - (2.3594418824405414, 1.2634703768170796) - (2.361287844745071, 1.2681478571430918) - (2.3631220407328115, 1.2728299639454312) - (2.3649444588087114, 1.277516667625694) - (2.366755087452173, 1.2822079385564156) - (2.368553915217126, 1.2869037470812588) - (2.3703409307321017, 1.2916040635152015) - (2.3721161227003034, 1.2963088581447244) - (2.373879479899678, 1.301018101227999) - (2.3756309911829874, 1.305731762995077) - (2.3773706454778765, 1.3104498136480704) - (2.37909843178695, 1.3151722233613583) - (2.3808143391878316, 1.3198989622817492) - (2.382518356833243, 1.3246300005286986) - (2.3842104739510668, 1.3293653081944714) - (2.3858906798444153, 1.334104855344349) - (2.3875589638916987, 1.3388486120168117) - (2.389215315546694, 1.3435965482237284) - (2.3908597243386094, 1.3483486339505464) - (2.392492179872149, 1.3531048391564822) - (2.394112671827584, 1.3578651337747099) - (2.3957211899608124, 1.362629487712554) - (2.397317724103425, 1.3673978708516703) - (2.398902264162774, 1.3721702530482567) - (2.4004748001220295, 1.3769466041332152) - (2.40203532204025, 1.3817268939123737) - (2.4035838200524404, 1.386511092166648) - (2.4051202843696147, 1.3912991686522531) - (2.406644705278862, 1.396091093100886) - (2.408157073143402, 1.4008868352199184) - (2.4096573784026516, 1.4056863646925881) - (2.411145611572281, 1.4104896511781906) - (2.412621763244276, 1.415296664312271) - (2.4140858240869965, 1.4201073737068186) - (2.4155377848452346, 1.4249217489504482) - (2.4169776363402775, 1.4297397596086137) - (2.4184053694699585, 1.4345613752237731) - (2.4198209752087223, 1.4393865653156093) - (2.4212244446076743, 1.4442152993811965) - (2.422615768794643, 1.4490475468952122) - (2.423994938974234, 1.4538832773101218) - (2.4253619464278855, 1.4587224600563733) - (2.4267167825139233, 1.46356506454259) - (2.4280594386676158, 1.4684110601557647) - (2.4293899064012283, 1.4732604162614524) - (2.4307081773040773, 1.4781131022039669) - (2.4320142430425795, 1.4829690873065644) - (2.433308095360313, 1.4878283408716575) - (2.434589726078059, 1.492690832180985) - (2.4358591270938614, 1.497556530495825) - (2.4371162903830754, 1.5024254050571797) - (2.4383612079984185, 1.5072974250859732) - (2.4395938720700188, 1.512172559783245) - (2.4408142748054678, 1.5170507783303444) - (2.442022408489868, 1.5219320498891262) - (2.443218265485881, 1.5268163436021458) - (2.4444018382337793, 1.5317036285928545) - (2.4455731192514882, 1.5365938739657894) - (2.446732101134638, 1.5414870488067782) - (2.4478787765566095, 1.5463831221831283) - (2.449013138268579, 1.551282063143823) - (2.4501351790995667, 1.5561838407197186) - (2.4512448919564793, 1.561088423923739) - (2.4523422698241557, 1.5659957817510723) - (2.453427305765413, 1.5709058831793665) - (2.454499992921088, 1.5758186971689256) - (2.4555603245100817, 1.5807341926629075) - (2.456608293829402, 1.5856523385875134) - (2.4576438942542067, 1.5905731038521953) - (2.4586671192378438, 1.595496457349845) - (2.459677962311895, 1.6004223679569913) - (2.4606764170862157, 1.6053508045339997) - (2.4616624772489724, 1.6102817359252664) - (2.4626361365666893, 1.6152151309594167) - (2.4635973888842817, 1.6201509584495035) - (2.464546228125096, 1.625089187193196) - (2.4654826482909513, 1.630029785972995) - (2.4664066434621734, 1.634972723556406) - (2.4673182077976357, 1.6399179686961627) - (2.468217335534793, 1.6448654901303994) - (2.469104020989718, 1.6498152565828677) - (2.469978258557142, 1.6547672367631248) - (2.470840042710485, 1.6597213993667344) - (2.4716893680018917, 1.6646777130754633) - (2.4725262290622676, 1.6696361465574798) - (2.473350620601312, 1.6745966684675522) - (2.4741625374075524, 1.6795592474472478) - (2.4749619743483744, 1.6845238521251238) - (2.475748926370059, 1.689490451116943) - (2.4765233884978093, 1.694459013025848) - (2.4772853558357864, 1.6994295064425853) - (2.4780348235671372, 1.70440189994568) - (2.4787717869540273, 1.7093761621016526) - (2.479496241337669, 1.7143522614652082) - (2.4802081821383517, 1.7193301665794385) - (2.48090760485547, 1.7243098459760196) - (2.4815945050675534, 1.7292912681754116) - (2.482268878432295, 1.734274401687057) - (2.482930720686575, 1.739259215009582) - (2.483580027646492, 1.7442456766309866) - (2.484216795207388, 1.7492337550288635) - (2.4848410193438712, 1.7542234186705703) - (2.485452696109849, 1.7592146360134573) - (2.486051821638544, 1.7642073755050414) - (2.4866383921425252, 1.769201605583223) - (2.4872124039137287, 1.774197294676479) - (2.487773853323481, 1.779194411204062) - (2.488322736822524, 1.784192923576202) - (2.488859050941037, 1.7891928001943036) - (2.489382792288655, 1.7941940094511484) - (2.4898939575544965, 1.799196519731095) - (2.490392543507178, 1.8042002994102704) - (2.490878546994839, 1.8092053168567888) - (2.49135196494516, 1.8142115404309265) - (2.491812794365383, 1.8192189384853488) - (2.492261032342328, 1.8242274793652837) - (2.4926966760424136, 1.8292371314087426) - (2.4931197227116755, 1.8342478629467103) - (2.4935301696757817, 1.8392596423033472) - (2.4939280143400513, 1.8442724377961903) - (2.494313254189468, 1.849286217736353) - (2.494685886788701, 1.854300950428725) - (2.4950459097821165, 1.8593166041721751) - (2.4953933208937915, 1.8643331472597429) - (2.4957281179275332, 1.8693505479788575) - (2.496050298766889, 1.8743687746115127) - (2.4963598613751605, 1.8793877954344955) - (2.4966568037954158, 1.8844075787195596) - (2.4969411241505046, 1.889428092733646) - (2.4972128206430675, 1.8944493057390746) - (2.4974718915555476, 1.8994711859937463) - (2.497718335250202, 1.9044937017513446) - (2.4979521501691133, 1.9095168212615343) - (2.4981733348341963, 1.9145405127701651) - (2.498381887847211, 1.9195647445194712) - (2.4985778078897676, 1.9245894847482656) - (2.4987610937233384, 1.9296147016921583) - (2.498931744189264, 1.934640363583734) - (2.4990897582087603, 1.939666438652771) - (2.499235134782926, 1.9446928951264353) - (2.4993678729927487, 1.9497197012294802) - (2.49948797199911, 1.9547468251844495) - (2.4995954310427924, 1.9597742352118779) - (2.499690249444483, 1.9648018995304912) - (2.4997724266047774, 1.969829786357408) - (2.499841962004185, 1.9748578639083398) - (2.4998988552031305, 1.9798861003977948) - (2.4999431058419583, 1.984914464039271) - (2.499974713640933, 1.9899429230454677) - (2.4999936784002426, 1.9949714456284795) - (2.5, 2.0) -```` - -````julia +````@example curve_bounded fig, ax, sc = lines(points) ```` -```@raw html - -``` - Let's now triangulate this domain. We need to put the arc into its own vector, and we still need to pass a set of points into `triangulate`: -````julia +````@example curve_bounded points = NTuple{2,Float64}[] rng = StableRNG(123) tri = triangulate(points; boundary_nodes=[arc], rng) ```` -```` -Delaunay Triangulation. - Number of vertices: 8 - Number of triangles: 6 - Number of edges: 13 - Has boundary nodes: true - Has ghost triangles: true - Curve-bounded: true - Weighted: false - Constrained: true -```` - -````julia +````@example curve_bounded fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Notice that the domain doesn't look like a circle yet. This is because using `triangulate` on the curve just by itself isn't enough. In fact, the triangulation returned in this case is simply one where: @@ -2630,16 +99,12 @@ curve just by itself isn't enough. In fact, the triangulation returned in this c This is probably not what we actually want, though. Instead, we need to refine the domain using mesh refinement. The syntax for this is the same as in the [refinement tutorial](../tutorials/refinement.md): -````julia +````@example curve_bounded refine!(tri; max_area=1e-1, rng) fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Much better! We have now triangulated our first curve-bounded domain. ## A Boundary Defined by Multiple Parametric Curves @@ -2647,24 +112,10 @@ We now take a domain which is defined by three separate curves: a circular arc, For piecewise linear curves, we use the same method as we would in previous tutorials, where instead of using coordinates to define the boundary we use numbers that refer to points in the point set. To start, the point set we will be using is -````julia +````@example curve_bounded points = [(0.1, 0.1), (0.15, 0.15), (0.23, 0.23), (0.009, 0.11), (0.0, -2.0), (0.2, -1.7), (0.000591, 0.00019), (0.111, -0.005), (-0.0001, -0.00991), (1.0, 0.0)] ```` -```` -10-element Vector{Tuple{Float64, Float64}}: - (0.1, 0.1) - (0.15, 0.15) - (0.23, 0.23) - (0.009, 0.11) - (0.0, -2.0) - (0.2, -1.7) - (0.000591, 0.00019) - (0.111, -0.005) - (-0.0001, -0.00991) - (1.0, 0.0) -```` - Now, for the boundary, we will take: - A circular arc defined between $(1, 0)$ and $(0, 1)$ centred at $(0, 0)$. @@ -2673,37 +124,26 @@ Now, for the boundary, we will take: We can define these curves as follows: -````julia +````@example curve_bounded arc = CircularArc((1.0, 0.0), (0.0, 1.0), (0.0, 0.0)) bspl = BSpline([(0.0, 1.0), (-1.0, 2.0), (-2.0, 0.0), (-2.0, -1.0), (0.0, -2.0)]) pce = [5, 6, 10] ```` -```` -3-element Vector{Int64}: - 5 - 6 - 10 -```` - Notice that we still must make sure that the curves connect, and that together the curves define a positively-oriented boundary. The domain we get from this looks like: -````julia +````@example curve_bounded t = LinRange(0, 1, 1000) pts = vcat(arc.(t), bspl.(t), points[pce]) fig, ax, sc = lines(pts) fig ```` -```@raw html - -``` - Let's now get a triangulation of this domain. We will use a custom constraint to force triangles closer to the origin to be smaller than those outside of it. -````julia +````@example curve_bounded curve = [[arc], [bspl], pce] rng = StableRNG(123) tri = triangulate(points; boundary_nodes=curve, rng) @@ -2717,15 +157,11 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - ## A Complicated Multiply-Connected Disjoint Domain For our last example, we take a complicated case with a domain that is disjoint, and where the individual domains are multiply-connected. Let us give the domain followed by an explanation of how it is defined: -````julia +````@example curve_bounded curve = [ [ [1, 2, 3], [EllipticalArc((2.0, 0.0), (-2.0, 0.0), (0.0, 0.0), 2, 1 / 2, 0.0)] @@ -2763,10 +199,6 @@ fig[1, 2] = Legend(fig, ax, "Curve") fig ```` -```@raw html - -``` - Let's walk through the definition of `curve`. - The first domain that is defined is the red curve in the above figure, defined in terms of a piecewise linear portion and an elliptical arc. @@ -2786,7 +218,7 @@ the curves connect at the correct points. Let's now triangulate. -````julia +````@example curve_bounded rng = StableRNG(123) tri = triangulate(copy(points); boundary_nodes=curve, rng) # copying so that we don't mutate for the next section refine!(tri; max_area=1e-2) @@ -2794,10 +226,6 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - ### Using Custom Constraints to Control Refinement Let's give another example of using custom constraints to better control the refinement within different domains. Referencing the previous figure where we showed each domain by colour, let us try and use a coarse mesh in the region bounded between the red and green @@ -2807,7 +235,7 @@ purple and orange curves. To do this, we must have a method for deciding which r To write this function, we note that the indices of these polygons are 1, 3, and 4 for the red, blue, and purple regions, respectively. -````julia +````@example curve_bounded poly_constraint = (_tri, T) -> begin i, j, k = triangle_vertices(T) p, q, r = get_point(_tri, i, j, k) @@ -2833,10 +261,6 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - ## Defining a New Parametric Curve Let us now give an example where we define a domain by a parametric curve that is not provided natively by this package. For this example, we consider the astroid, where @@ -2856,7 +280,7 @@ with this package we need: Let's now meet these requirements. -````julia +````@example curve_bounded struct Astroid <: DelaunayTriangulation.AbstractParametricCurve lookup_table::Vector{NTuple{2,Float64}} end @@ -2887,7 +311,7 @@ end Let's now define an astroid curve and triangulate it. -````julia +````@example curve_bounded function Astroid(n::Int) lookup_table = Vector{NTuple{2,Float64}}(undef, n) c = Astroid(lookup_table) @@ -2904,10 +328,6 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/curve_bounded.jl). diff --git a/docs/src/tutorials/custom_primitive.md b/docs/src/tutorials/custom_primitive.md index 124994060..576392a13 100644 --- a/docs/src/tutorials/custom_primitive.md +++ b/docs/src/tutorials/custom_primitive.md @@ -13,17 +13,18 @@ already defined for most methods that can be overloaded for these primitives, bu completely new structs you are required to define many new methods. The packages we will be using are loaded below. -````julia +````@example custom_primitive using DelaunayTriangulation using CairoMakie using Random using StableRNGs const DT = DelaunayTriangulation; +nothing #hide ```` Let us now define our custom structs. -````julia +````@example custom_primitive struct CustomPoint x::Float64 y::Float64 @@ -60,7 +61,7 @@ end Now, depending on your application you might not need to define all possible methods. For example, if you just want an unconstrained triangulation, all you need are `CustomPoint` and `CustomPoints`. So, let's define our methods for increasing complexity. First, for unconstrained triangulations, all we need to define are: -````julia +````@example custom_primitive DT.getx(p::CustomPoint) = p.x DT.gety(p::CustomPoint) = p.y DT.number_type(::Type{CustomPoint}) = Float64 @@ -86,13 +87,9 @@ Base.length(triangles::CustomTriangles) = length(triangles.triangles) CustomTriangles() = CustomTriangles(Vector{CustomTriangle}()) ```` -```` -Main.var"##254".CustomTriangles -```` - Now let's suppose we want to add in some segments. For this, we also need the following methods. -````julia +````@example custom_primitive DT.construct_edge(::Type{CustomSegment}, i, j) = CustomSegment(i, j) DT.initial(e::CustomSegment) = e.i DT.terminal(e::CustomSegment) = e.j @@ -106,13 +103,9 @@ Base.length(segments::CustomSegments) = length(segments.segments) CustomSegments() = CustomSegments(Set{CustomSegment}()) ```` -```` -Main.var"##254".CustomSegments -```` - Next, we want to allow for defining a boundary. For this, we need the following methods. -````julia +````@example custom_primitive DT.has_multiple_curves(::CustomPolygons{N}) where {N} = N > 1 DT.has_multiple_curves(::CustomPolygon) = false DT.has_multiple_curves(::CustomPolygonSegment) = false @@ -133,13 +126,13 @@ for working with Voronoi tessellations and centroidal Voronoi tessellations. For triangulations, so you of course would not have to define the methods we have just defined for segments and boundaries. For Voronoi tessellations, no extra methods are needed, except for -````julia +````@example custom_primitive Base.empty!(segments::CustomSegments) = empty!(segments.segments) ```` if we specify `EdgesType` inside `triangulate` together with `clip=true` (and not otherwise). For centroidal Voronoi tessellations, we need -````julia +````@example custom_primitive DT.set_point!(points::CustomPoints, i, x, y) = points.points[i] = CustomPoint(x, y) ```` @@ -147,7 +140,7 @@ We also need to consider methods needed for mesh refinement. We could also consi but an example of this is already given in the [curve bounded tutorial](../tutorials/curve_bounded.md), so we will only consider methods with piecewise linear boundaries. For refinement, we need the following methods: -````julia +````@example custom_primitive Base.pop!(points::CustomPoints) = pop!(points.points) DT.push_point!(points::CustomPoints, x, y) = push!(points.points, CustomPoint(x, y)) @@ -166,7 +159,7 @@ end Now we have all that we need. Let's now demonstrate that this works. First, let's define the points, segments, and the boundary. -````julia +````@example custom_primitive p1 = CustomPoint(0.0, 0.0) p2 = CustomPoint(1.0, 0.0) p3 = CustomPoint(1.0, 1.0) @@ -186,11 +179,12 @@ inner_polygon = CustomPolygon([ CustomPolygonSegment([CustomSegment(6, 9), CustomSegment(9, 8), CustomSegment(8, 7), CustomSegment(7, 6)]), ]) polygons = CustomPolygons((outer_polygon, inner_polygon)); +nothing #hide ```` Now we triangulate and refine. -````julia +````@example custom_primitive rng = StableRNG(123) tri = triangulate(points; boundary_nodes=polygons, segments, IntegerType=Int32, @@ -205,14 +199,10 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Now let's give an example of a centroidal Voronoi tessellation to show that this all works. -````julia +````@example custom_primitive rng = StableRNG(123) points = CustomPoints([p1, p2, p3, p4, p5, p6, p7, p8, p9]) tri = triangulate(points; @@ -227,10 +217,6 @@ fig, ax, sc = voronoiplot(vorn) fig ```` -```@raw html - -``` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/custom_primitive.jl). diff --git a/docs/src/tutorials/lattice.md b/docs/src/tutorials/lattice.md index f0177d501..a4cb9b0a2 100644 --- a/docs/src/tutorials/lattice.md +++ b/docs/src/tutorials/lattice.md @@ -10,7 +10,7 @@ $[a, b] \times [c, d]$. Rather than using `triangulate`, you can use [`triangulate_rectangle`](@ref) for this purpose. To start, we give a simple example -````julia +````@example lattice using DelaunayTriangulation using CairoMakie @@ -21,189 +21,52 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - This can be much faster than if we just construct the points in the lattice manually and `triangulate` those. Here's a comparison of the times. -````julia +````@example lattice using BenchmarkTools points = get_points(tri) @benchmark triangulate($points; randomise=$false) # randomise=false because points are already in lattice order, i.e. spatially sorted ```` -```` -BenchmarkTools.Trial: 625 samples with 1 evaluation. - Range (min … max): 4.273 ms … 212.990 ms ┊ GC (min … max): 0.00% … 45.64% - Time (median): 5.902 ms ┊ GC (median): 0.00% - Time (mean ± σ): 7.978 ms ± 12.950 ms ┊ GC (mean ± σ): 12.79% ± 8.21% - - ▆█ - ██▆▅▄▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▁▁▂▁▂▂▁▁▂ ▂ - 4.27 ms Histogram: frequency by time 75.7 ms < - - Memory estimate: 2.95 MiB, allocs estimate: 70952. -```` - -````julia +````@example lattice @benchmark triangulate_rectangle($a, $b, $c, $d, $nx, $ny) ```` -```` -BenchmarkTools.Trial: 7182 samples with 1 evaluation. - Range (min … max): 277.700 μs … 55.996 ms ┊ GC (min … max): 0.00% … 98.48% - Time (median): 516.100 μs ┊ GC (median): 0.00% - Time (mean ± σ): 687.669 μs ± 1.109 ms ┊ GC (mean ± σ): 15.57% ± 11.52% - - █▃▃ - ████▇▆▅▄▃▃▂▂▂▂▂▂▂▂▂▂▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂▁▂▂▂▂▂▂▂▂▂▂▂▂ ▃ - 278 μs Histogram: frequency by time 5.79 ms < - - Memory estimate: 916.06 KiB, allocs estimate: 2797. -```` - This difference would be more pronounced for larger `nx, ny`. Note that the output of `triangulate_rectangle` treats the boundary as a constrained boundary: -````julia +````@example lattice get_boundary_nodes(tri) ```` -```` -4-element Vector{Vector{Int64}}: - [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250] - [250, 249, 248, 247, 246, 245, 244, 243, 242, 241] - [241, 231, 221, 211, 201, 191, 181, 171, 161, 151, 141, 131, 121, 111, 101, 91, 81, 71, 61, 51, 41, 31, 21, 11, 1] -```` - This boundary is split into four separate sections, one for each side of the rectangle. If you would prefer to keep the boundary as one contiguous section, use `single_boundary=true`. Moreover, note that this `tri` has ghost triangles: -````julia +````@example lattice tri ```` -```` -Delaunay Triangulation. - Number of vertices: 250 - Number of triangles: 432 - Number of edges: 681 - Has boundary nodes: true - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: true -```` - You can opt into not having these by using `delete_ghosts=true`: -````julia +````@example lattice tri = triangulate_rectangle(a, b, c, d, nx, ny; single_boundary=true, delete_ghosts=true) tri ```` -```` -Delaunay Triangulation. - Number of vertices: 250 - Number of triangles: 432 - Number of edges: 681 - Has boundary nodes: true - Has ghost triangles: false - Curve-bounded: false - Weighted: false - Constrained: true -```` - -````julia +````@example lattice get_boundary_nodes(tri) ```` -```` -67-element Vector{Int64}: - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 20 - 30 - 40 - 50 - 60 - 70 - 80 - 90 - 100 - 110 - 120 - 130 - 140 - 150 - 160 - 170 - 180 - 190 - 200 - 210 - 220 - 230 - 240 - 250 - 249 - 248 - 247 - 246 - 245 - 244 - 243 - 242 - 241 - 231 - 221 - 211 - 201 - 191 - 181 - 171 - 161 - 151 - 141 - 131 - 121 - 111 - 101 - 91 - 81 - 71 - 61 - 51 - 41 - 31 - 21 - 11 - 1 -```` - -````julia +````@example lattice DelaunayTriangulation.has_ghost_triangles(tri) ```` -```` -false -```` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/lattice.jl). diff --git a/docs/src/tutorials/nearest.md b/docs/src/tutorials/nearest.md index a4901d69c..cd3974818 100644 --- a/docs/src/tutorials/nearest.md +++ b/docs/src/tutorials/nearest.md @@ -12,7 +12,7 @@ given a point `p` find the Voronoi tile `P` containing it. Here we give an examp of how we can use triangulations or tessellations to find the nearest neighbour in the point set to a given point. First, we load in the packages we need. -````julia +````@example nearest using DelaunayTriangulation using CairoMakie ```` @@ -20,7 +20,7 @@ using CairoMakie Now we define the tessellation we will use for this example. The white points shown are the points that we will query. -````julia +````@example nearest points = [ (-3.0, 7.0), (2.0, 6.0), (0.0, 3.0), (0.0, 0.0), (-5.0, 5.0), (-3.0, 1.0), @@ -34,48 +34,28 @@ scatter!(ax,[p,q],color=:white,strokecolor=:black,strokewidth=2,markersize=14) fig ```` -```@raw html - -``` - To get the nearest neighbour of a point, we use [`get_nearest_neighbour`](@ref). -````julia +````@example nearest np = get_nearest_neighbour(vorn, p) ```` -```` -1 -```` - -````julia +````@example nearest nq = get_nearest_neighbour(vorn, q) ```` -```` -3 -```` - We see that the nearest point in `points` to `p` is the first point, and to `q` it is the third point. We note that we could have also performed this query without constructing `vorn` directly, instead using `tri`: -````julia +````@example nearest np_tri = get_nearest_neighbour(tri, p) ```` -```` -1 -```` - -````julia +````@example nearest nq_tri = get_nearest_neighbour(tri, q) ```` -```` -3 -```` - Both methods lead to the same results because they use the same algorithm. ## Just the code An uncommented version of this example is given below. diff --git a/docs/src/tutorials/operations_convex_hull_locking.md b/docs/src/tutorials/operations_convex_hull_locking.md index 67a6c0a4f..845a2eb05 100644 --- a/docs/src/tutorials/operations_convex_hull_locking.md +++ b/docs/src/tutorials/operations_convex_hull_locking.md @@ -15,7 +15,7 @@ inside `refine!` when providing an unconstrained triangulation for mesh refinement. Let us give an example of how this can be done, in case you want to do this for your own application. -````julia +````@example operations_convex_hull_locking using DelaunayTriangulation using CairoMakie @@ -24,46 +24,24 @@ tri = triangulate(points) get_boundary_nodes(tri) ```` -```` -Int64[] -```` - As you can see, the boundary nodes field is empty. We can lock the convex hull using [`lock_convex_hull!`](@ref): -````julia +````@example operations_convex_hull_locking lock_convex_hull!(tri) get_boundary_nodes(tri) ```` -```` -10-element Vector{Int64}: - 8 - 27 - 37 - 32 - 3 - 41 - 22 - 10 - 21 - 8 -```` - Now the boundary nodes field is not empty. Note that if you try and lock the convex hull again, you will get an error because `DelaunayTriangulation.has_boundary_nodes(tri)` is now true. To now unlock the convex hull, we use [`unlock_convex_hull!`](@ref): -````julia +````@example operations_convex_hull_locking unlock_convex_hull!(tri) get_boundary_nodes(tri) ```` -```` -Int64[] -```` - This function will error if it detects that the existing boundary isn't actually equal to the convex hull. diff --git a/docs/src/tutorials/operations_flip_edge.md b/docs/src/tutorials/operations_flip_edge.md index 7c286fe9b..197ac1672 100644 --- a/docs/src/tutorials/operations_flip_edge.md +++ b/docs/src/tutorials/operations_flip_edge.md @@ -9,10 +9,31 @@ This tutorial shows we can flip edges in a triangulation. Edge flipping is the f edge `(i, j)` to the edge `(k, ℓ)`, where `(i, j)` and `(k, ℓ)` are diagonals of the quadrilateral formed by $p_ip_jp_kp_l$. The edge flip is illustrated below. - -```@raw html - -``` +````@example operations_flip_edge +using CairoMakie #hide +points = [(0.0, -1.0), (1.0, 0.0), (0.0, 1.0), (-1.0, 0.0)] #hide +T1 = points[[1, 2, 3]] #hide +T2 = points[[1, 3, 4]] #hide +T3 = points[[1, 2, 4]] #hide +T4 = points[[2, 3, 4]] #hide +fig = Figure() #hide +ax1 = Axis(fig[1, 1], width = 600, height = 400) #hide +ax2 = Axis(fig[1, 2], width = 600, height = 400) #hide +poly!(ax1, [T1; T2], color=(:white, 0.0), strokewidth=3) #hide +poly!(ax2, [T3; T4], color=(:white, 0.0), strokewidth=3) #hide +for ax in (ax1, ax2) #hide + hidedecorations!(ax) #hide + hidespines!(ax) #hide + text!(ax, [(0.05, -1.1)]; text=[L"p_j"], fontsize=43) #hide + text!(ax, [(0.9, 0.1)]; text=[L"p_k"], fontsize=43) #hide + text!(ax, [(0.05, 1.0)]; text=[L"p_i"], fontsize=43) #hide + text!(ax, [(-1.05, 0.05)]; text=[L"p_\ell"], fontsize=43) #hide + xlims!(ax, -1.1, 1.1) #hide + ylims!(ax, -1.3, 1.3) #hide +end #hide +resize_to_layout!(fig) #hide +fig #hide +```` Note that this edge flip only makes sense if the quadrilateral is convex. If the quadrilateral is not convex, then the edge flip @@ -22,22 +43,23 @@ quadrilateral is convex inside the [`flip_edge!`](@ref) function. Let us now showcase how we can flip edges. First, we load in the packages we need. -````julia +````@example operations_flip_edge using DelaunayTriangulation using CairoMakie ```` Let us now define our initial triangulation. -````julia +````@example operations_flip_edge points = [(0.0, 0.0), (0.8, 0.0), (1.3, 1.0), (0.0, 1.0)] tri = triangulate(points); +nothing #hide ```` Now, flipping the edge is simple. We simply provide the indices `i` and `j` for the edge we want to flip. Let us flip the edge `(2, 4)`. -````julia +````@example operations_flip_edge fig, ax, sc = triplot(tri, axis = (title = "Before flipping",)) ax2 = Axis(fig[1, 2], title = "After flipping") flip_edge!(tri, 2, 4) @@ -45,10 +67,6 @@ triplot!(ax2, tri) fig ```` -```@raw html - -``` - As simple as that. Note that no checks are made for whether the edge is actually in the triangulation, on the boundary, or if the associated quadrilateral is convex. It is up to you to check this if needed; one way to check would be to use [`DelaunayTriangulation.is_legal`](@ref), diff --git a/docs/src/tutorials/operations_ghost_triangles.md b/docs/src/tutorials/operations_ghost_triangles.md index 277e1440e..0e41d6bd9 100644 --- a/docs/src/tutorials/operations_ghost_triangles.md +++ b/docs/src/tutorials/operations_ghost_triangles.md @@ -11,39 +11,23 @@ As we discussed in the [vertex insertion/deletion example](operations_vertex_ins ghost triangles are needed when we are making updates outside of the boundary of the current triangulation. -````julia +````@example operations_ghost_triangles using DelaunayTriangulation using CairoMakie ```` Let us take an example triangulation. -````julia +````@example operations_ghost_triangles points = [(-1.0, -1.0), (1.0, -1.0), (0.0, 1.0)] tri = triangulate(points) ```` -```` -Delaunay Triangulation. - Number of vertices: 3 - Number of triangles: 1 - Number of edges: 3 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: false -```` - -````julia +````@example operations_ghost_triangles fig, ax, sc = triplot(tri, show_ghost_edges = true) fig ```` -```@raw html - -``` - The ghost triangles are represented by the convex regions bounded by the blue lines. By default, `triangulate` will keep these ghost triangles. If you want to remove them, you'd have to use @@ -52,163 +36,88 @@ ghost triangles. If you want to remove them, you'd have to use If you do need to query whether your triangulation already has ghost triangles, use -````julia +````@example operations_ghost_triangles DelaunayTriangulation.has_ghost_triangles(tri) ```` -```` -true -```` - To clear the ghost triangles, use -````julia +````@example operations_ghost_triangles delete_ghost_triangles!(tri) DelaunayTriangulation.has_ghost_triangles(tri) ```` -```` -false -```` - An important note for us to make is that ghost triangles are not just there as a concept, but they are actually physically stored. Adding them back with [`add_ghost_triangles!`](@ref), we have: -````julia +````@example operations_ghost_triangles add_ghost_triangles!(tri) get_triangles(tri) ```` -```` -Set{Tuple{Int64, Int64, Int64}} with 4 elements: - (3, 2, -1) - (2, 3, 1) - (1, 3, -1) - (2, 1, -1) -```` - See that there is not just the triangle `(1, 2, 3)`, but also `(3, 2, -1)`, `(1, 3, -1)`, and `(2, 1, -1)` (where the ghost triangles are also oriented counter-clockwise). For example, -````julia +````@example operations_ghost_triangles get_adjacent(tri, 3, 2) ```` -```` --1 -```` - -````julia +````@example operations_ghost_triangles get_adjacent(tri, 3, -1) ```` -```` -1 -```` - -````julia +````@example operations_ghost_triangles get_adjacent(tri, -1, 2) ```` -```` -1 -```` - -````julia +````@example operations_ghost_triangles get_neighbours(tri, -1) ```` -```` -Set{Int64} with 3 elements: - 2 - 3 - 1 -```` - -````julia +````@example operations_ghost_triangles get_adjacent2vertex(tri, -1) ```` -```` -Set{Tuple{Int64, Int64}} with 3 elements: - (3, 2) - (1, 3) - (2, 1) -```` - If we delete them, they are no longer there. -````julia +````@example operations_ghost_triangles delete_ghost_triangles!(tri) get_triangles(tri) ```` -```` -Set{Tuple{Int64, Int64, Int64}} with 1 element: - (2, 3, 1) -```` - As a last note, we remark that the ghost vertices that define the vertex of these ghost triangles is still there regardless of whether the triangulation has ghost triangles. Thus, for example, the following still work -````julia +````@example operations_ghost_triangles get_neighbours(tri, -1) ```` -```` -Set{Int64} with 3 elements: - 2 - 3 - 1 -```` - -````julia +````@example operations_ghost_triangles get_adjacent2vertex(tri, -1) ```` -```` -Set{Tuple{Int64, Int64}} with 3 elements: - (3, 2) - (1, 3) - (2, 1) -```` - -````julia +````@example operations_ghost_triangles get_adjacent(tri, 3, 2) ```` -```` --1 -```` - You can remove them from the graph, using -````julia +````@example operations_ghost_triangles DelaunayTriangulation.delete_ghost_vertices_from_graph!(tri) ```` -```` -Graph - Number of edges: 6 - Number of vertices: 3 -```` - so that e.g. `get_neighbours(tri, -1)` is then an error. This will still not remove them from the `adjacent` and `adjacent2vertex` maps, but it does mean for example that -````julia +````@example operations_ghost_triangles collect(each_solid_vertex(tri)) == collect(each_vertex(tri)) ```` -```` -true -```` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/operations_ghost_triangles.jl). diff --git a/docs/src/tutorials/operations_legalise_edge.md b/docs/src/tutorials/operations_legalise_edge.md index 05281145d..87f7f5a03 100644 --- a/docs/src/tutorials/operations_legalise_edge.md +++ b/docs/src/tutorials/operations_legalise_edge.md @@ -27,7 +27,7 @@ such an insertion; this is the main step of the algorithm of Guibas et al. (1992 We use this tutorial to demonstrate how this can be used. First, let us define some initial triangulation. -````julia +````@example operations_legalise_edge using DelaunayTriangulation using CairoMakie @@ -44,17 +44,13 @@ scatter!(ax, [p], markersize=14) fig ```` -```@raw html - -``` - The blue point is the point to be added. It is inside the triangle `(9, 14, 3)`. To insert it, follow Guibas et al. (1992) and connect the edges of `(9, 14, 3)` to the new point. This is done using [`split_triangle!`](@ref). (Note: the function [`DelaunayTriangulation.complete_split_triangle_and_legalise!`](@ref) does the splitting and the legalising all in the same step, but we do not demonstrate this here.) -````julia +````@example operations_legalise_edge push!(points, p) r = length(points) i, j, k = 9, 14, 3 @@ -63,23 +59,31 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - This splitting introduces some new illegal edges, shown in red below. - -```@raw html - -``` +````@example operations_legalise_edge +function get_all_illegal_edges(tri) #hide + T = NTuple{2,Float64}[] #hide + for E in each_edge(tri) #hide + cert = DelaunayTriangulation.is_legal(tri, E...) #hide + if DelaunayTriangulation.is_illegal(cert) #hide + push!(T, get_point(tri, E...)...) #hide + end #hide + end #hide + return T #hide +end #hide +fig, ax, sc = triplot(tri) #hide +T = get_all_illegal_edges(tri) #hide +linesegments!(ax, T, color=:red, linewidth=3) #hide +fig #hide +```` To fix this, we use `legalise_edge!`. This functions take in a single edge, so to legalise all the new edges we apply the function to each edge of the triangle that the point resides in. (The function [`DelaunayTriangulation.legalise_split_triangle!`](@ref) also performs these three calls below.) -````julia +````@example operations_legalise_edge legalise_edge!(tri, i, j, r) legalise_edge!(tri, j, k, r) legalise_edge!(tri, k, i, r) @@ -87,10 +91,6 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - The triangulation is now Delaunay, and there are no more illegal edges. ## Just the code An uncommented version of this example is given below. diff --git a/docs/src/tutorials/operations_segment_insertion.md b/docs/src/tutorials/operations_segment_insertion.md index a7c89f6eb..666f79175 100644 --- a/docs/src/tutorials/operations_segment_insertion.md +++ b/docs/src/tutorials/operations_segment_insertion.md @@ -7,14 +7,14 @@ EditURL = "https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/d This tutorial shows how we can add segments into a triangulation. First, load the packages we need: -````julia +````@example operations_segment_insertion using DelaunayTriangulation using CairoMakie ```` Let us now define our initial triangulation. -````julia +````@example operations_segment_insertion points = [(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.9, 0.9), (0.5, 0.5), (0.2, 0.5), (0.5, 0.8)] tri = triangulate(points) @@ -22,38 +22,23 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - To add a segment, we use [`add_segment!`](@ref), providing the vertices for the points that a segment should be added between. Let us add a segment between `(0.0, 0.0)` and `(1.0, 1.0)`, which corresponds to vertices `1` and `3`. -````julia +````@example operations_segment_insertion add_segment!(tri, 1, 3) fig, ax, sc = triplot(tri, show_constrained_edges = true) fig ```` -```@raw html - -``` - Of course, this changed nothing since the segment was already there. We do note, though, that if we look at the constrained edges -````julia +````@example operations_segment_insertion get_interior_segments(tri) ```` -```` -Set{Tuple{Int64, Int64}} with 3 elements: - (1, 6) - (5, 3) - (5, 6) -```` - then we notice that the segment `(1, 3)` was converted into the segments `(1, 6)`, `(5, 3)`, and `(5, 6)`. This is because the segment `(1, 3)` crossed through other vertices, and so the algorithm automatically breaks down the segments into a sequence of connected collinear @@ -61,30 +46,22 @@ segments. Now we add a segment that was not already there. -````julia +````@example operations_segment_insertion add_segment!(tri, 1, 8) fig, ax, sc = triplot(tri, show_constrained_edges = true) fig ```` -```@raw html - -``` - Currently, the segments that you add must not intersect at an angle (they can be collinear with other edges as we have demonstrated above). To see what happens if we do this: -````julia +````@example operations_segment_insertion add_segment!(tri, 8, 2) fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - The other constrained edge was partially removed. ## Just the code An uncommented version of this example is given below. diff --git a/docs/src/tutorials/operations_split_edge.md b/docs/src/tutorials/operations_split_edge.md index 1a971463b..66ad0a5c9 100644 --- a/docs/src/tutorials/operations_split_edge.md +++ b/docs/src/tutorials/operations_split_edge.md @@ -10,7 +10,7 @@ close to being on, an edge `(i, j)`. In this tutorial, we show how the [`split_edge!`](@ref) function can be used for putting a point on this edge. First, let us consider the following triangulation. -````julia +````@example operations_split_edge using DelaunayTriangulation using CairoMakie @@ -24,14 +24,10 @@ scatter!(ax, [p], markersize=14) fig ```` -```@raw html - -``` - We want to add the blue point onto the edge shown, which is `(1, 2)`. To do this, we can use the function `split_edge!`. -````julia +````@example operations_split_edge push!(points, p) r = length(points) i, j = 1, 2 @@ -40,29 +36,21 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Notice that this has only split the edge in one direction. This is because the edges in this case are treated as being oriented. To split the edge in the other direction, we simply swap the indices. -````julia +````@example operations_split_edge split_edge!(tri, j, i, r) fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - If you also want to restore the Delaunay property of the triangulation following this splitting, you need to use [`legalise_edge!`](@ref). In this example, though, there are no illegal edges. If there were, we would use -````julia +````@example operations_split_edge k = get_adjacent(tri, i, r) # get_adjacent(tri, i, j) before split_edge!(tri, i, j) legalise_edge!(tri, j, k, r) legalise_edge!(tri, k, i, r) @@ -71,18 +59,6 @@ legalise_edge!(tri, i, k, r) legalise_edge!(tri, k, j, r) ```` -```` -Delaunay Triangulation. - Number of vertices: 10 - Number of triangles: 14 - Number of edges: 23 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: false -```` - These steps, in particular the steps of splitting both sides of the edge and then legalising, are also implemented in [`DelaunayTriangulation.complete_split_edge_and_legalise!`](@ref). ## Just the code diff --git a/docs/src/tutorials/operations_split_triangle.md b/docs/src/tutorials/operations_split_triangle.md index afb7e0ee4..ab25037f5 100644 --- a/docs/src/tutorials/operations_split_triangle.md +++ b/docs/src/tutorials/operations_split_triangle.md @@ -12,7 +12,7 @@ that triangle into three new triangles. This is called *triangle splitting*. Let us give an example. -````julia +````@example operations_split_triangle using DelaunayTriangulation using CairoMakie @@ -24,17 +24,13 @@ scatter!(ax, [p], markersize=14) fig ```` -```@raw html - -``` - The blue point shows the point we want to add into the triangulation using [`split_triangle!`](@ref). To use this, we provide (1) the index of the point in `points` and (2) the triangle that the point is in. The index of the point will be `4` after pushing `p` into `points`, and in this simple example the triangle that `p` is in is `(1, 2, 3)`. -````julia +````@example operations_split_triangle push!(points, p) r = length(points) i, j, k = 1, 2, 3 @@ -43,10 +39,6 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - See the [`legalise_edge!` tutorial](operations_legalise_edge.md) for more discussion about restoring the Delaunay property of the triangulation after using `split_triangle!`. diff --git a/docs/src/tutorials/operations_vertex_insertion_deletion.md b/docs/src/tutorials/operations_vertex_insertion_deletion.md index ce6d161a9..f36d3e3c2 100644 --- a/docs/src/tutorials/operations_vertex_insertion_deletion.md +++ b/docs/src/tutorials/operations_vertex_insertion_deletion.md @@ -9,7 +9,7 @@ This tutorial demonstrates how to insert and delete vertices from a triangulation while maintaining the Delaunay property of the triangulation. First, load the packages we need: -````julia +````@example operations_vertex_insertion_deletion using DelaunayTriangulation using CairoMakie using StableRNGs @@ -17,17 +17,13 @@ using StableRNGs Let us now define our initial triangulation. -````julia +````@example operations_vertex_insertion_deletion points = [(0.0, 0.0), (2.0, 0.0), (1.0, 2.0)] tri = triangulate(points) fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Note that we use a structure for `points` that is mutable so that points can be pushed into it. @@ -37,40 +33,31 @@ is a method which uses the index of the vertex rather than the coordinates, but we don't use that here as the points to be added are not already in `points`. Here, we add a point at `(1.0, 0.5)`. -````julia +````@example operations_vertex_insertion_deletion add_point!(tri, 1.0, 0.5) fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - This is still a valid Delaunay triangulation, unsurprisingly due to the small number of points. We can also add points that are outside of the triangulation: -````julia +````@example operations_vertex_insertion_deletion add_point!(tri, 0.0, 1.0) fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - One important thing to note here is that, if not for the ghost triangles inside `tri`, adding a point outside of the triangulation would not work. Here is an example of this failing. -````julia +````@example operations_vertex_insertion_deletion delete_ghost_triangles!(tri) +try #hide add_point!(tri, 2.0, 1.5) -```` - -```` -BoundsError([(0.0, 0.0), (2.0, 0.0), (1.0, 2.0), (1.0, 0.5), (0.0, 1.0)], (0,)) - +catch e #hide +println(e) #hide +end #hide ```` This is a `BoundsError`, because the triangulation has had to @@ -80,70 +67,38 @@ perform some operation including a point outside of the boundary, you need to be sure that you have ghost triangles, which you can query using [`DelaunayTriangulation.has_ghost_triangles`](@ref). -````julia +````@example operations_vertex_insertion_deletion DelaunayTriangulation.has_ghost_triangles(tri) ```` -```` -false -```` - -````julia +````@example operations_vertex_insertion_deletion add_ghost_triangles!(tri) ```` -```` -Delaunay Triangulation. - Number of vertices: 5 - Number of triangles: 4 - Number of edges: 8 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: false -```` - -````julia +````@example operations_vertex_insertion_deletion DelaunayTriangulation.has_ghost_triangles(tri) ```` -```` -true -```` - Another issue is that the convex hull is not updated as we add (or delete) points for performance reasons: -````julia +````@example operations_vertex_insertion_deletion get_convex_hull_vertices(tri) ```` -```` -4-element Vector{Int64}: - 3 - 1 - 2 - 3 -```` - If we do want to fix the convex hull, we can use [`convex_hull!(tri)`](@ref). -````julia +````@example operations_vertex_insertion_deletion convex_hull!(tri) fig, ax, sc = triplot(tri, show_convex_hull=true) fig ```` -```@raw html - -``` - We now have the same triangulation that we would have had if we had done `triangulate` on this set of points originally. To now push this further, let's add in a bunch of random points. -````julia +````@example operations_vertex_insertion_deletion rng = StableRNG(123) for _ in 1:1000 new_point = 2rand(rng, 2) @@ -153,16 +108,12 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Let us now demonstrate how to delete points. To do this, we use [`delete_point!`](@ref). This function takes vertices rather than coordinates, identifying the corresponding point in `points` by its index. Let us demonstrate this operation by deleting all points within a distance of `1/2` around `(1.0, 1.0)`. -````julia +````@example operations_vertex_insertion_deletion vertices_to_delete = Iterators.filter(each_solid_vertex(tri)) do i p = get_point(tri, i) r2 = (getx(p) - 1.0)^2 + (gety(p) - 1.0)^2 @@ -175,10 +126,6 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Note that in this situation, `points` still contains those points that we have now deleted. This is the reason to be careful about using, say, [`DelaunayTriangulation.each_point`](@ref) rather than [`each_solid_vertex`](@ref). This triangulation is also still Delaunay. diff --git a/docs/src/tutorials/point_in_polygon.md b/docs/src/tutorials/point_in_polygon.md index 0ea2a8e75..b8a9bb6f0 100644 --- a/docs/src/tutorials/point_in_polygon.md +++ b/docs/src/tutorials/point_in_polygon.md @@ -7,7 +7,7 @@ EditURL = "https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/d This tutorial shows how we can perform point-in-polygon testing, and how we can find a polygon containing a point. First, let us build this ploygon. -````julia +````@example point_in_polygon using DelaunayTriangulation using CairoMakie using StableRNGs @@ -179,10 +179,6 @@ end fig ```` -```@raw html - -``` - To now determine which of these query points are inside any of the magenta regions, we have several methods: - Using [`DelaunayTriangulation.distance_to_polygon`](@ref), check if the distance to the polygon is positive (inside) or negative (outside). - Triangulate the domain and use [`DelaunayTriangulation.dist`](@ref) to get the distance from a point to the triangulation. @@ -194,37 +190,36 @@ for example, you might already have a triangulation and want to use that. We als here do not use exact arithmetic, unlike other predicates in this package, so there may be some robustness issues for points very close to the boundary. Here is the first approach: -````julia +````@example point_in_polygon is_inside = [DelaunayTriangulation.distance_to_polygon(q, points, nodes) > 0 for q in query_points] scatter!(ax, query_points[is_inside], color=:blue) scatter!(ax, query_points[.!is_inside], color=:red) fig ```` -```@raw html - -``` - Here is the second method. -````julia +````@example point_in_polygon tri = triangulate(points; boundary_nodes=nodes) is_inside_2 = [DelaunayTriangulation.dist(tri, q) > 0 for q in query_points]; +nothing #hide ```` The third method is to use [`find_polygon`](@ref) to find the polygon containing the point. If no such polygon exists, `find_polygon` returns `0`, so this is what we use to determine if a point is inside or outside the polygon. -````julia +````@example point_in_polygon is_inside_3 = [find_polygon(tri, q) ≠ 0 for q in query_points]; +nothing #hide ```` This test is not exactly the same as the previous one (with a difference of about five points) due to points near the boundary. The fourth method is: -````julia +````@example point_in_polygon hierarchy = DelaunayTriangulation.construct_polygon_hierarchy(points, nodes) is_inside_4 = [find_polygon(hierarchy, points, nodes, q) ≠ 0 for q in query_points]; +nothing #hide ```` ## Just the code diff --git a/docs/src/tutorials/point_location.md b/docs/src/tutorials/point_location.md index a8307db77..a490b361f 100644 --- a/docs/src/tutorials/point_location.md +++ b/docs/src/tutorials/point_location.md @@ -19,7 +19,7 @@ a keyword argument `concavity_protection` to make an extra check to guarantee ev We start with a simple example, demonstrating point location on an unconstrained triangulation. -````julia +````@example point_location using DelaunayTriangulation using CairoMakie using StableRNGs @@ -36,57 +36,37 @@ scatter!(ax, q) fig ```` -```@raw html - -``` - The aim is to, from `tri`, find which triangle contains the point `q` shown. Using the `find_triangle` function, this is simple. -````julia +````@example point_location V = find_triangle(tri, q) ```` -```` -(2, 7, 6) -```` - The result means that the triangle `(2, 7, 6)` contains the point, as we can easily check: -````julia +````@example point_location DelaunayTriangulation.point_position_relative_to_triangle(tri, V, q) ```` -```` -Certificate.Inside = 0 -```` - When we provide no keyword arguments, the default behaviour of `find_triangle` is to first sample some number of points (defaults to $\lceil \sqrt[3]{n}\rceil$, where $n$ is the number of points), and then start at the point that is closest to `q` out of those sampled, then marching along the triangulation until `q` is found. This number of samples can be changed using the `m` keyword argument. For example, -````julia +````@example point_location V = find_triangle(tri, q, m=10) ```` -```` -(6, 2, 7) -```` - means that we get a sample of size 10, and start at whichever point is the closest. (For technical reasons, this sampling is with replacement, so it is possible that the same point is sampled more than once.) You could also instead specify the point to start at using the `k` keyword argument, in which case no points are sampled. For example, -````julia +````@example point_location V = find_triangle(tri, q, k=6) ```` -```` -(2, 7, 6) -```` - starts the algorithm at the point `6`. Note also that the triangles found from `find_triangle` do not have to be given in the same order as they appear @@ -95,49 +75,37 @@ or `(k, i, j)` could be returned. The point `q` does not have to be in the triangulation. For example, consider the following point. -````julia +````@example point_location q = (-5.0, 8.0) fig, ax, sc = triplot(tri) scatter!(ax, q) fig ```` -```@raw html - -``` - We obtain: -````julia +````@example point_location V = find_triangle(tri, q) ```` -```` -(1, 5, -1) -```` - See that the result is a ghost triangle `(1, 5, -1)`. As discussed in the [manual](../manual/ghost_triangles.md), this can be interpreted as meaning that `q` is between the two lines through the points `1` and `5` that start at a central point of the triangulation. (The index `-1` is just the ghost vertex.) This can be visualised. -````julia +````@example point_location fig, ax, sc = triplot(tri, show_ghost_edges=true) scatter!(ax, q) fig ```` -```@raw html - -``` - ## Region with concave boundaries and holes Now we give an example of point location for a reason with holes. Since the case where all boundaries are convex is reasonably straight forward, here we consider concave boundaries and discuss methods for improving the speed of the algorithm in this case. First, let us give our example triangulation. -````julia +````@example point_location a, b, c = (0.0, 8.0), (0.0, 6.0), (0.0, 4.0) d, e, f = (0.0, 2.0), (0.0, 0.0), (2.0, 0.0) g, h, i = (4.0, 0.0), (6.0, 0.0), (8.0, 0.0) @@ -152,24 +120,21 @@ boundary_nodes, points = convert_boundary_points_to_indices([outer, inner]) rng = StableRNG(125123) tri = triangulate(points; rng, boundary_nodes) refine!(tri; max_area=0.01get_area(tri), rng); +nothing #hide ```` The issue with concavity is that the ghost triangles can no longer be sensibly defined. To demonstrate this, see the following plot: -````julia +````@example point_location fig, ax, sc = triplot(tri, show_ghost_edges=true) fig ```` -```@raw html - -``` - The ghost edges now intersect the boundary, which doesn't make sense, and creates difficulties. Let us now demonstrate how the function still works here. We try finding the blue points shown below. -````julia +````@example point_location qs = [ (4.0, 5.0), (1.0, 5.6), (0.2, 5.0), (0.0, -1.0), (0.5, 3.5), (2.5, 1.5), @@ -181,76 +146,36 @@ scatter!(ax, qs, color=:blue, markersize=16) fig ```` -```@raw html - -``` - Now let's find the triangles. -````julia +````@example point_location Vs = [find_triangle(tri, q; rng) for q in qs] ```` -```` -12-element Vector{Tuple{Int64, Int64, Int64}}: - (35, 12, -3) - (77, 56, 76) - (84, 55, 74) - (71, 6, -2) - (102, 47, 89) - (-4, 54, 25) - (24, -4, 18) - (57, 60, 37) - (69, 70, 39) - (94, 17, -3) - (17, 81, 80) - (24, -4, 18) -```` - While we do find some triangles, they may not all be correct. For example, the triangle found for `(1.2, 1.6)` is -````julia +````@example point_location Vs[end] ```` -```` -(24, -4, 18) -```` - but the point `(1.2, 1.6)` is actually inside the triangulation. To protect against this, you need to use `concavity_protection=true`, which will enable a check to be made that the point is actually outside the triangulation whenever a ghost triangle is to be returned. If the check finds this to not be the case, it restarts. With these results, we now compute: -````julia +````@example point_location Vs = [find_triangle(tri, q; rng, concavity_protection=true) for q in qs] ```` -```` -12-element Vector{Tuple{Int64, Int64, Int64}}: - (35, 12, -3) - (77, 56, 76) - (55, 74, 84) - (71, 6, -2) - (89, 102, 47) - (-4, 54, 25) - (18, 24, -4) - (50, 59, 37) - (39, 69, 70) - (94, 17, -3) - (17, 81, 80) - (23, 41, 22) -```` - Here is how we can actually test that these results are now correct. We cannot directly use [`DelaunayTriangulation.point_position_relative_to_triangle`](@ref) because it does not know that the ghost triangles are invalid. Instead, we find the distance of each point to the triangulation's boundary using [`DelaunayTriangulation.dist`](@ref) so that we can classify it as being inside or outside of the triangulation, and then check the type of the found triangle. -````julia +````@example point_location δs = [DelaunayTriangulation.dist(tri, q) for q in qs] results = Vector{Bool}(undef, length(qs)) for (j, (q, δ, V)) in (enumerate ∘ zip)(qs, δs, Vs) @@ -266,22 +191,6 @@ end results ```` -```` -12-element Vector{Bool}: - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 -```` - As we see, the triangles are now all correct. ## Disjoint domains @@ -290,7 +199,7 @@ domains that are disjoint to the current domain, thus allowing us to demonstrate how `find_triangle` applies here. The new domain is below, along with the points we will be searching for. -````julia +````@example point_location m₁, n₁, o₁ = (6.0, 8.0), (8.0, 8.0), (8.0, 4.0) p₁, q₁, r₁ = (10.0, 4.0), (6.0, 6.0), (8.0, 6.0) s₁, t₁, u₁ = (9.0, 7.0), (4.0, 4.0), (5.0, 4.0) @@ -314,35 +223,16 @@ scatter!(ax, qs, color=:blue, markersize=16) fig ```` -```@raw html - -``` - Here are the `find_triangle` results. -````julia +````@example point_location Vs = [find_triangle(tri, q; rng, concavity_protection=true) for q in qs] ```` -```` -11-element Vector{Tuple{Int64, Int64, Int64}}: - (422, 348, 368) - (435, 797, 434) - (180, 46, -3) - (486, 88, -2) - (947, 777, 773) - (748, 642, 718) - (575, 620, 815) - (117, 803, 918) - (237, 804, 840) - (18, -4, 294) - (715, 29, -5) -```` - Again, we can verify that these are all correct as follows. Without `concavity_protection=true`, these would not be all correct. -````julia +````@example point_location δs = [DelaunayTriangulation.dist(tri, q) for q in qs] results = Vector{Bool}(undef, length(qs)) for (j, (q, δ, V)) in (enumerate ∘ zip)(qs, δs, Vs) @@ -358,21 +248,6 @@ end results ```` -```` -11-element Vector{Bool}: - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 -```` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/point_location.jl). diff --git a/docs/src/tutorials/pole_of_inaccessibility.md b/docs/src/tutorials/pole_of_inaccessibility.md index 8c3fc9e59..6a1d546ec 100644 --- a/docs/src/tutorials/pole_of_inaccessibility.md +++ b/docs/src/tutorials/pole_of_inaccessibility.md @@ -13,7 +13,7 @@ triangulation tutorials. In particular, the algorithm we use works for polygons interior holes, or even nested holes, as well as for multipolygons. We give a simple example. First, let us define our polygon. -````julia +````@example pole_of_inaccessibility using DelaunayTriangulation using CairoMakie @@ -70,29 +70,17 @@ end fig ```` -```@raw html - -``` - To now find the pole of inaccessibility, use [`DelaunayTriangulation.pole_of_inaccessibility`](@ref): -````julia +````@example pole_of_inaccessibility pole = DelaunayTriangulation.pole_of_inaccessibility(points, boundary_nodes) ```` -```` -(-1.0785225000000003, 5.3725974999999995) -```` - -````julia +````@example pole_of_inaccessibility scatter!(ax, pole, color=:blue, markersize=16) fig ```` -```@raw html - -``` - This shows that the point inside the red region that is furthest from the boundary is the blue point shown. @@ -100,7 +88,7 @@ We note that triangulations also store the poles of inaccessibility for each bou as these are used to define the orientation of a ghost edge. Here is an example. First, we get the triangulation. -````julia +````@example pole_of_inaccessibility θ = LinRange(0, 2π, 20) |> collect θ[end] = 0 # need to make sure that 2π gives the exact same coordinates as 0 xy = Vector{Vector{Vector{NTuple{2,Float64}}}}() @@ -117,36 +105,16 @@ boundary_nodes, points = convert_boundary_points_to_indices(xy) tri = triangulate(points; boundary_nodes=boundary_nodes) ```` -```` -Delaunay Triangulation. - Number of vertices: 76 - Number of triangles: 76 - Number of edges: 152 - Has boundary nodes: true - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: true -```` - To see the poles, called representative points, we use -````julia +````@example pole_of_inaccessibility DelaunayTriangulation.get_representative_point_list(tri) ```` -```` -Dict{Int64, DelaunayTriangulation.RepresentativeCoordinates{Int64, Float64}} with 4 entries: - 4 => RepresentativeCoordinates{Int64, Float64}(3.0, -4.79892e-17, 0) - 2 => RepresentativeCoordinates{Int64, Float64}(-1.7996e-17, -2.02455e-17, 0) - 3 => RepresentativeCoordinates{Int64, Float64}(3.0, -4.49899e-17, 0) - 1 => RepresentativeCoordinates{Int64, Float64}(0.50341, -0.499994, 0) -```` - The keys of the `Dict` refer to the curve index, and the values contain the coordinates. -````julia +````@example pole_of_inaccessibility fig, ax, sc = triplot(tri, show_ghost_edges=true) colors = (:red, :blue, :darkgreen, :purple) for i in eachindex(boundary_nodes) @@ -157,10 +125,6 @@ end fig ```` -```@raw html - -``` - Note that the green and purple boundaries have the same pole of inaccessibility. The first curve, the red curve, is the only one that has the pole of inaccessibility computed with respect to all other boundaries. You can also see that indeed the ghost edges are all diff --git a/docs/src/tutorials/refinement.md b/docs/src/tutorials/refinement.md index a70183c9c..ff83b9455 100644 --- a/docs/src/tutorials/refinement.md +++ b/docs/src/tutorials/refinement.md @@ -16,7 +16,7 @@ can also be refined as discussed in [this tutorial](../tutorials/curve_bounded.m Let us start by loading in the packages we will need. -````julia +````@example refinement using DelaunayTriangulation using CairoMakie using StableRNGs @@ -30,7 +30,7 @@ total area. Note that below we need to make sure `points` is mutable, else it is not possible to push points into the triangulation. Here we use a vector, but you could also use e.g. an `ElasticMatrix` from [ElasticArrays.jl](https://github.com/JuliaArrays/ElasticArrays.jl). -````julia +````@example refinement rng = StableRNG(123) x = rand(rng, 50) y = rand(rng, 50) @@ -41,137 +41,65 @@ A = get_area(tri) refine!(tri; min_angle=30.0, max_area=0.01A, rng) ```` -```` -Delaunay Triangulation. - Number of vertices: 293 - Number of triangles: 522 - Number of edges: 814 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: false -```` - The [`refine!`](@ref) function operates on `tri` in-place. If we wanted to review the statistics of the refined mesh, we can use [`statistics`](@ref): -````julia +````@example refinement statistics(tri) ```` -```` -Delaunay Triangulation Statistics. - Triangulation area: 0.6676219360027273 - Number of vertices: 294 - Number of solid vertices: 293 - Number of ghost vertices: 1 - Number of edges: 876 - Number of solid edges: 814 - Number of ghost edges: 62 - Number of triangles: 584 - Number of solid triangles: 522 - Number of ghost triangles: 62 - Number of boundary segments: 0 - Number of interior segments: 0 - Number of segments: 0 - Number of convex hull vertices: 62 - Smallest angle: 30.093123918976033° - Largest angle: 115.1681501036418° - Smallest area: 2.101315544214238e-5 - Largest area: 0.006504759798840958 - Smallest radius-edge ratio: 0.5783859342412219 - Largest radius-edge ratio: 0.997194082313877 -```` - As we can see, the maximum area of a triangle is about 0.0064, which is indeed less than 1% of the triangulation's area, which is about 0.0067. Moreover, the smallest angle is indeed greater than 30. Let us compare the triangulation pre- and post-refinement. -````julia +````@example refinement fig, ax, sc = triplot(orig_tri, axis=(title="Pre-refinement",)) ax = Axis(fig[1, 2], title="Post-refinement") triplot!(ax, tri) fig ```` -```@raw html - -``` - The triangulation is now much finer. There are still some parts with many more triangles than other regions, but these are mostly near a boundary or where was a cluster of random points. If we wanted, we could refine again to try and improve this. -````julia +````@example refinement refine!(tri; min_angle=30.0, max_area=0.001A, rng) # 0.1% instead of 1% fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - The quality has now been improved. We could also try improving the minimum angle further, but even 30 is a bit closer to the limit of convergence (which is about 33.9 degrees). For example, if we try a minimum angle of 35 degrees, the algorithm just doesn't even converge, instead it reaches the maximum number of points. -````julia +````@example refinement test_tri = deepcopy(tri) refine!(test_tri; min_angle=35.0, max_area=0.001A, max_points = 5_000, rng) # 20_000 so that it doesn't just keep going statistics(test_tri) ```` -```` -Delaunay Triangulation Statistics. - Triangulation area: 0.6676219360027283 - Number of vertices: 5001 - Number of solid vertices: 5000 - Number of ghost vertices: 1 - Number of edges: 14997 - Number of solid edges: 14855 - Number of ghost edges: 142 - Number of triangles: 9998 - Number of solid triangles: 9856 - Number of ghost triangles: 142 - Number of boundary segments: 0 - Number of interior segments: 0 - Number of segments: 0 - Number of convex hull vertices: 142 - Smallest angle: 29.178318890457142° - Largest angle: 117.10742856878393° - Smallest area: 3.296647038397725e-6 - Largest area: 0.0006659872224699419 - Smallest radius-edge ratio: 0.5773574317028193 - Largest radius-edge ratio: 1.0255793759836065 -```` - As we can see, the smallest angle is about 29 degrees instead of 35 degrees, and there are now 5000 points in the triangulation. The resulting triangulation is given below: -````julia +````@example refinement fig, ax, sc = triplot(test_tri) fig ```` -```@raw html - -``` - This is certainly not a suitable triangulation. One useful figure to look at for these plots are histograms that look at the areas and angles. Looking to `tri`, we can plot these as follows: -````julia +````@example refinement stats = statistics(tri) fig = Figure(fontsize=33) areas = get_all_stat(stats, :area) ./ A @@ -185,10 +113,6 @@ resize_to_layout!(fig) fig ```` -```@raw html - -``` - We see that indeed many of the triangle areas are very small, and the angles are all greater than 30 degrees. @@ -198,7 +122,7 @@ case where the mesh refinement is needed. For this example, we consider an examp with holes, but note that any triangulation can be refined, regardless of the type. Here is the triangulation we consider. -````julia +````@example refinement n = 100 θ = LinRange(0, 2π, n + 1) θ = [θ[1:n]; 0] @@ -218,23 +142,15 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Let us now refine this triangulation. -````julia +````@example refinement A = get_area(tri) refine!(tri; min_angle=27.3, max_area=0.01A, rng) fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - We inspect the plot, and we might think that it's perhaps not fine enough. Let's use finer constraints and see what happens. Since `refine!` operates on `tri` in-place, refining it again @@ -242,16 +158,12 @@ with the constraints below is going to take roughly the same amount of time as if we had refined it with these constraints in the first place. -````julia +````@example refinement refine!(tri; min_angle=33.9, max_area=0.001A, rng) fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - This is indeed much better, but notice that the inner hole is much more fine than the outer. This is because we are applying the same area constraint inside and outside, when really we should try and take note @@ -265,7 +177,7 @@ instead of applying constraints so that the triangles are limited to 1% of the t triangulation area, we do 0.5% or 0.1% of the area of the inner or outer domain, respectively. -````julia +````@example refinement outer_area = π * (r₁^2 - r₂^2) inner_area = π * r₃^2 function in_inner(p, q, r) @@ -284,14 +196,10 @@ function area_constraint(_tri, T) end ```` -```` -area_constraint (generic function with 1 method) -```` - Let's now refine. We recompute the triangulation so that we can see the new results. -````julia +````@example refinement boundary_nodes, points = convert_boundary_points_to_indices(x, y) rng = StableRNG(456) tri = triangulate(points; boundary_nodes, rng) @@ -300,16 +208,12 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - This is now much better, and the two parts of the domain are appropriately refined. Let us extend our custom constraint function to also require that any triangle has minimum angle less than 33 degrees inside the innermost domain, and less than 20 degrees outside the innermost domain. -````julia +````@example refinement function angle_constraint(_tri, T) i, j, k = triangle_vertices(T) p, q, r = get_point(_tri, i, j, k) @@ -327,10 +231,6 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Indeed, the inner domain is much finer. These examples could be extended to more complicated cases, for example using adaptive mesh refinement for a numerical PDE solution so that triangles are refined based on some *a posteriori* error estimate, implemented @@ -344,7 +244,7 @@ algorithm will still try its best to refine in these locations. Let's consider a example with many small angles. We consider the boundary of Switzerland, as obtained in this [NaturalNeighbours.jl example](https://danielvandh.github.io/NaturalNeighbours.jl/stable/swiss/). -````julia +````@example refinement using Downloads using DelimitedFiles boundary_url = "https://gist.githubusercontent.com/DanielVandH/13687b0918e45a416a5c93cd52c91449/raw/a8da6cdc94859fd66bcff85a2307f0f9cd57a18c/boundary.txt" @@ -354,5139 +254,9 @@ boundary_points = [(boundary[i, 1], boundary[i, 2]) for i in axes(boundary, 1)] reverse!(boundary_points) ```` -```` -5126-element Vector{Tuple{Float64, Float64}}: - (7.133862520764, 45.871870678164) - (7.138563027059, 45.871870678164) - (7.138563027059, 45.876571184459) - (7.143263533355, 45.876571184459) - (7.14796403965, 45.876571184459) - (7.152664545945, 45.876571184459) - (7.15736505224, 45.876571184459) - (7.162065558535, 45.876571184459) - (7.162065558535, 45.871870678164) - (7.166766064831, 45.871870678164) - (7.166766064831, 45.867170171868) - (7.171466571126, 45.867170171868) - (7.171466571126, 45.862469665573) - (7.176167077421, 45.862469665573) - (7.180867583716, 45.862469665573) - (7.185568090011, 45.862469665573) - (7.185568090011, 45.857769159278) - (7.190268596307, 45.857769159278) - (7.194969102602, 45.857769159278) - (7.194969102602, 45.862469665573) - (7.199669608897, 45.862469665573) - (7.199669608897, 45.867170171868) - (7.199669608897, 45.871870678164) - (7.199669608897, 45.876571184459) - (7.204370115192, 45.876571184459) - (7.209070621488, 45.876571184459) - (7.209070621488, 45.881271690754) - (7.213771127783, 45.881271690754) - (7.213771127783, 45.885972197049) - (7.218471634078, 45.885972197049) - (7.218471634078, 45.890672703344) - (7.223172140373, 45.890672703344) - (7.227872646668, 45.890672703344) - (7.232573152964, 45.890672703344) - (7.237273659259, 45.890672703344) - (7.241974165554, 45.890672703344) - (7.246674671849, 45.890672703344) - (7.251375178144, 45.890672703344) - (7.25607568444, 45.890672703344) - (7.260776190735, 45.890672703344) - (7.260776190735, 45.89537320964) - (7.26547669703, 45.89537320964) - (7.270177203325, 45.89537320964) - (7.270177203325, 45.900073715935) - (7.274877709621, 45.900073715935) - (7.279578215916, 45.900073715935) - (7.279578215916, 45.90477422223) - (7.279578215916, 45.909474728525) - (7.284278722211, 45.909474728525) - (7.284278722211, 45.91417523482) - (7.288979228506, 45.91417523482) - (7.288979228506, 45.918875741116) - (7.293679734801, 45.918875741116) - (7.298380241097, 45.918875741116) - (7.303080747392, 45.918875741116) - (7.307781253687, 45.918875741116) - (7.312481759982, 45.918875741116) - (7.312481759982, 45.91417523482) - (7.317182266278, 45.91417523482) - (7.317182266278, 45.909474728525) - (7.321882772573, 45.909474728525) - (7.326583278868, 45.909474728525) - (7.331283785163, 45.909474728525) - (7.335984291458, 45.909474728525) - (7.335984291458, 45.91417523482) - (7.340684797754, 45.91417523482) - (7.345385304049, 45.91417523482) - (7.350085810344, 45.91417523482) - (7.350085810344, 45.909474728525) - (7.354786316639, 45.909474728525) - (7.354786316639, 45.90477422223) - (7.359486822934, 45.90477422223) - (7.36418732923, 45.90477422223) - (7.368887835525, 45.90477422223) - (7.37358834182, 45.90477422223) - (7.37358834182, 45.900073715935) - (7.378288848115, 45.900073715935) - (7.382989354411, 45.900073715935) - (7.382989354411, 45.89537320964) - (7.387689860706, 45.89537320964) - (7.387689860706, 45.900073715935) - (7.392390367001, 45.900073715935) - (7.397090873296, 45.900073715935) - (7.397090873296, 45.90477422223) - (7.397090873296, 45.909474728525) - (7.401791379591, 45.909474728525) - (7.406491885887, 45.909474728525) - (7.411192392182, 45.909474728525) - (7.415892898477, 45.909474728525) - (7.420593404772, 45.909474728525) - (7.420593404772, 45.91417523482) - (7.425293911067, 45.91417523482) - (7.429994417363, 45.91417523482) - (7.429994417363, 45.918875741116) - (7.434694923658, 45.918875741116) - (7.434694923658, 45.923576247411) - (7.439395429953, 45.923576247411) - (7.439395429953, 45.928276753706) - (7.444095936248, 45.928276753706) - (7.448796442544, 45.928276753706) - (7.448796442544, 45.932977260001) - (7.453496948839, 45.932977260001) - (7.458197455134, 45.932977260001) - (7.462897961429, 45.932977260001) - (7.462897961429, 45.937677766297) - (7.467598467724, 45.937677766297) - (7.467598467724, 45.932977260001) - (7.47229897402, 45.932977260001) - (7.47229897402, 45.937677766297) - (7.47229897402, 45.942378272592) - (7.47229897402, 45.947078778887) - (7.47229897402, 45.951779285182) - (7.476999480315, 45.951779285182) - (7.48169998661, 45.951779285182) - (7.48169998661, 45.956479791477) - (7.486400492905, 45.956479791477) - (7.4911009992, 45.956479791477) - (7.495801505496, 45.956479791477) - (7.495801505496, 45.961180297773) - (7.500502011791, 45.961180297773) - (7.505202518086, 45.961180297773) - (7.509903024381, 45.961180297773) - (7.514603530677, 45.961180297773) - (7.519304036972, 45.961180297773) - (7.524004543267, 45.961180297773) - (7.524004543267, 45.956479791477) - (7.528705049562, 45.956479791477) - (7.533405555857, 45.956479791477) - (7.538106062153, 45.956479791477) - (7.542806568448, 45.956479791477) - (7.542806568448, 45.961180297773) - (7.547507074743, 45.961180297773) - (7.547507074743, 45.965880804068) - (7.547507074743, 45.970581310363) - (7.542806568448, 45.970581310363) - (7.542806568448, 45.975281816658) - (7.542806568448, 45.979982322953) - (7.542806568448, 45.984682829249) - (7.547507074743, 45.984682829249) - (7.552207581038, 45.984682829249) - (7.556908087333, 45.984682829249) - (7.561608593629, 45.984682829249) - (7.566309099924, 45.984682829249) - (7.566309099924, 45.989383335544) - (7.571009606219, 45.989383335544) - (7.575710112514, 45.989383335544) - (7.575710112514, 45.984682829249) - (7.58041061881, 45.984682829249) - (7.58041061881, 45.979982322953) - (7.58041061881, 45.975281816658) - (7.585111125105, 45.975281816658) - (7.585111125105, 45.970581310363) - (7.5898116314, 45.970581310363) - (7.594512137695, 45.970581310363) - (7.59921264399, 45.970581310363) - (7.603913150286, 45.970581310363) - (7.608613656581, 45.970581310363) - (7.613314162876, 45.970581310363) - (7.618014669171, 45.970581310363) - (7.622715175467, 45.970581310363) - (7.627415681762, 45.970581310363) - (7.632116188057, 45.970581310363) - (7.636816694352, 45.970581310363) - (7.641517200647, 45.970581310363) - (7.646217706943, 45.970581310363) - (7.646217706943, 45.975281816658) - (7.650918213238, 45.975281816658) - (7.655618719533, 45.975281816658) - (7.660319225828, 45.975281816658) - (7.665019732123, 45.975281816658) - (7.669720238419, 45.975281816658) - (7.669720238419, 45.970581310363) - (7.674420744714, 45.970581310363) - (7.674420744714, 45.965880804068) - (7.679121251009, 45.965880804068) - (7.679121251009, 45.961180297773) - (7.679121251009, 45.956479791477) - (7.683821757304, 45.956479791477) - (7.6885222636, 45.956479791477) - (7.693222769895, 45.956479791477) - (7.69792327619, 45.956479791477) - (7.69792327619, 45.951779285182) - (7.702623782485, 45.951779285182) - (7.70732428878, 45.951779285182) - (7.70732428878, 45.947078778887) - (7.70732428878, 45.942378272592) - (7.70732428878, 45.937677766297) - (7.70732428878, 45.932977260001) - (7.712024795076, 45.932977260001) - (7.712024795076, 45.928276753706) - (7.716725301371, 45.928276753706) - (7.716725301371, 45.923576247411) - (7.721425807666, 45.923576247411) - (7.726126313961, 45.923576247411) - (7.730826820256, 45.923576247411) - (7.735527326552, 45.923576247411) - (7.735527326552, 45.928276753706) - (7.740227832847, 45.928276753706) - (7.740227832847, 45.932977260001) - (7.744928339142, 45.932977260001) - (7.744928339142, 45.937677766297) - (7.749628845437, 45.937677766297) - (7.749628845437, 45.942378272592) - (7.754329351733, 45.942378272592) - (7.754329351733, 45.937677766297) - (7.759029858028, 45.937677766297) - (7.763730364323, 45.937677766297) - (7.768430870618, 45.937677766297) - (7.768430870618, 45.932977260001) - (7.773131376913, 45.932977260001) - (7.777831883209, 45.932977260001) - (7.777831883209, 45.928276753706) - (7.782532389504, 45.928276753706) - (7.787232895799, 45.928276753706) - (7.787232895799, 45.923576247411) - (7.791933402094, 45.923576247411) - (7.796633908389, 45.923576247411) - (7.796633908389, 45.918875741116) - (7.801334414685, 45.918875741116) - (7.80603492098, 45.918875741116) - (7.80603492098, 45.923576247411) - (7.810735427275, 45.923576247411) - (7.81543593357, 45.923576247411) - (7.820136439866, 45.923576247411) - (7.824836946161, 45.923576247411) - (7.829537452456, 45.923576247411) - (7.834237958751, 45.923576247411) - (7.838938465046, 45.923576247411) - (7.843638971342, 45.923576247411) - (7.848339477637, 45.923576247411) - (7.848339477637, 45.918875741116) - (7.853039983932, 45.918875741116) - (7.857740490227, 45.918875741116) - (7.862440996522, 45.918875741116) - (7.867141502818, 45.918875741116) - (7.871842009113, 45.918875741116) - (7.871842009113, 45.923576247411) - (7.876542515408, 45.923576247411) - (7.876542515408, 45.928276753706) - (7.871842009113, 45.928276753706) - (7.871842009113, 45.932977260001) - (7.867141502818, 45.932977260001) - (7.867141502818, 45.937677766297) - (7.867141502818, 45.942378272592) - (7.871842009113, 45.942378272592) - (7.871842009113, 45.947078778887) - (7.871842009113, 45.951779285182) - (7.876542515408, 45.951779285182) - (7.876542515408, 45.956479791477) - (7.876542515408, 45.961180297773) - (7.881243021703, 45.961180297773) - (7.881243021703, 45.965880804068) - (7.881243021703, 45.970581310363) - (7.876542515408, 45.970581310363) - (7.876542515408, 45.975281816658) - (7.881243021703, 45.975281816658) - (7.885943527999, 45.975281816658) - (7.890644034294, 45.975281816658) - (7.890644034294, 45.979982322953) - (7.895344540589, 45.979982322953) - (7.895344540589, 45.984682829249) - (7.900045046884, 45.984682829249) - (7.900045046884, 45.989383335544) - (7.904745553179, 45.989383335544) - (7.904745553179, 45.994083841839) - (7.909446059475, 45.994083841839) - (7.909446059475, 45.998784348134) - (7.91414656577, 45.998784348134) - (7.918847072065, 45.998784348134) - (7.92354757836, 45.998784348134) - (7.928248084656, 45.998784348134) - (7.932948590951, 45.998784348134) - (7.937649097246, 45.998784348134) - (7.942349603541, 45.998784348134) - (7.947050109836, 45.998784348134) - (7.951750616132, 45.998784348134) - (7.956451122427, 45.998784348134) - (7.961151628722, 45.998784348134) - (7.965852135017, 45.998784348134) - (7.970552641312, 45.998784348134) - (7.975253147608, 45.998784348134) - (7.979953653903, 45.998784348134) - (7.984654160198, 45.998784348134) - (7.989354666493, 45.998784348134) - (7.994055172789, 45.998784348134) - (7.994055172789, 46.00348485443) - (7.998755679084, 46.00348485443) - (7.998755679084, 46.008185360725) - (7.998755679084, 46.01288586702) - (8.003456185379, 46.01288586702) - (8.008156691674, 46.01288586702) - (8.012857197969, 46.01288586702) - (8.012857197969, 46.017586373315) - (8.012857197969, 46.02228687961) - (8.017557704265, 46.02228687961) - (8.017557704265, 46.026987385906) - (8.017557704265, 46.031687892201) - (8.017557704265, 46.036388398496) - (8.02225821056, 46.036388398496) - (8.02225821056, 46.041088904791) - (8.026958716855, 46.041088904791) - (8.026958716855, 46.045789411086) - (8.03165922315, 46.045789411086) - (8.03165922315, 46.050489917382) - (8.026958716855, 46.050489917382) - (8.026958716855, 46.055190423677) - (8.026958716855, 46.059890929972) - (8.026958716855, 46.064591436267) - (8.02225821056, 46.064591436267) - (8.02225821056, 46.069291942563) - (8.02225821056, 46.073992448858) - (8.02225821056, 46.078692955153) - (8.026958716855, 46.078692955153) - (8.026958716855, 46.083393461448) - (8.03165922315, 46.083393461448) - (8.03165922315, 46.088093967743) - (8.03165922315, 46.092794474039) - (8.03165922315, 46.097494980334) - (8.036359729445, 46.097494980334) - (8.036359729445, 46.102195486629) - (8.041060235741, 46.102195486629) - (8.045760742036, 46.102195486629) - (8.050461248331, 46.102195486629) - (8.055161754626, 46.102195486629) - (8.059862260922, 46.102195486629) - (8.064562767217, 46.102195486629) - (8.064562767217, 46.106895992924) - (8.069263273512, 46.106895992924) - (8.073963779807, 46.106895992924) - (8.078664286102, 46.106895992924) - (8.083364792398, 46.106895992924) - (8.088065298693, 46.106895992924) - (8.092765804988, 46.106895992924) - (8.097466311283, 46.106895992924) - (8.097466311283, 46.111596499219) - (8.102166817578, 46.111596499219) - (8.106867323874, 46.111596499219) - (8.106867323874, 46.116297005515) - (8.111567830169, 46.116297005515) - (8.116268336464, 46.116297005515) - (8.116268336464, 46.12099751181) - (8.116268336464, 46.125698018105) - (8.116268336464, 46.1303985244) - (8.120968842759, 46.1303985244) - (8.120968842759, 46.135099030696) - (8.125669349055, 46.135099030696) - (8.13036985535, 46.135099030696) - (8.135070361645, 46.135099030696) - (8.13977086794, 46.135099030696) - (8.144471374235, 46.135099030696) - (8.149171880531, 46.135099030696) - (8.149171880531, 46.139799536991) - (8.153872386826, 46.139799536991) - (8.153872386826, 46.144500043286) - (8.153872386826, 46.149200549581) - (8.153872386826, 46.153901055876) - (8.149171880531, 46.153901055876) - (8.149171880531, 46.158601562172) - (8.149171880531, 46.163302068467) - (8.153872386826, 46.163302068467) - (8.153872386826, 46.168002574762) - (8.153872386826, 46.172703081057) - (8.158572893121, 46.172703081057) - (8.163273399416, 46.172703081057) - (8.163273399416, 46.177403587352) - (8.167973905711, 46.177403587352) - (8.167973905711, 46.182104093648) - (8.163273399416, 46.182104093648) - (8.163273399416, 46.186804599943) - (8.158572893121, 46.186804599943) - (8.158572893121, 46.191505106238) - (8.153872386826, 46.191505106238) - (8.153872386826, 46.196205612533) - (8.149171880531, 46.196205612533) - (8.149171880531, 46.200906118829) - (8.149171880531, 46.205606625124) - (8.144471374235, 46.205606625124) - (8.144471374235, 46.210307131419) - (8.144471374235, 46.215007637714) - (8.13977086794, 46.215007637714) - (8.13977086794, 46.219708144009) - (8.13977086794, 46.224408650305) - (8.135070361645, 46.224408650305) - (8.135070361645, 46.2291091566) - (8.13036985535, 46.2291091566) - (8.125669349055, 46.2291091566) - (8.120968842759, 46.2291091566) - (8.120968842759, 46.233809662895) - (8.116268336464, 46.233809662895) - (8.116268336464, 46.23851016919) - (8.116268336464, 46.243210675486) - (8.111567830169, 46.243210675486) - (8.111567830169, 46.247911181781) - (8.106867323874, 46.247911181781) - (8.106867323874, 46.252611688076) - (8.102166817578, 46.252611688076) - (8.097466311283, 46.252611688076) - (8.092765804988, 46.252611688076) - (8.088065298693, 46.252611688076) - (8.083364792398, 46.252611688076) - (8.083364792398, 46.257312194371) - (8.078664286102, 46.257312194371) - (8.078664286102, 46.262012700666) - (8.083364792398, 46.262012700666) - (8.083364792398, 46.266713206962) - (8.088065298693, 46.266713206962) - (8.092765804988, 46.266713206962) - (8.092765804988, 46.271413713257) - (8.097466311283, 46.271413713257) - (8.097466311283, 46.276114219552) - (8.102166817578, 46.276114219552) - (8.106867323874, 46.276114219552) - (8.106867323874, 46.280814725847) - (8.111567830169, 46.280814725847) - (8.116268336464, 46.280814725847) - (8.116268336464, 46.285515232142) - (8.116268336464, 46.290215738438) - (8.120968842759, 46.290215738438) - (8.120968842759, 46.294916244733) - (8.125669349055, 46.294916244733) - (8.125669349055, 46.299616751028) - (8.13036985535, 46.299616751028) - (8.135070361645, 46.299616751028) - (8.135070361645, 46.304317257323) - (8.13977086794, 46.304317257323) - (8.13977086794, 46.299616751028) - (8.144471374235, 46.299616751028) - (8.149171880531, 46.299616751028) - (8.153872386826, 46.299616751028) - (8.153872386826, 46.294916244733) - (8.158572893121, 46.294916244733) - (8.163273399416, 46.294916244733) - (8.167973905711, 46.294916244733) - (8.172674412007, 46.294916244733) - (8.177374918302, 46.294916244733) - (8.177374918302, 46.299616751028) - (8.182075424597, 46.299616751028) - (8.186775930892, 46.299616751028) - (8.191476437188, 46.299616751028) - (8.191476437188, 46.304317257323) - (8.196176943483, 46.304317257323) - (8.200877449778, 46.304317257323) - (8.205577956073, 46.304317257323) - (8.210278462368, 46.304317257323) - (8.210278462368, 46.309017763619) - (8.214978968664, 46.309017763619) - (8.214978968664, 46.313718269914) - (8.214978968664, 46.318418776209) - (8.219679474959, 46.318418776209) - (8.219679474959, 46.323119282504) - (8.224379981254, 46.323119282504) - (8.224379981254, 46.327819788799) - (8.224379981254, 46.332520295095) - (8.229080487549, 46.332520295095) - (8.229080487549, 46.33722080139) - (8.233780993844, 46.33722080139) - (8.23848150014, 46.33722080139) - (8.243182006435, 46.33722080139) - (8.243182006435, 46.341921307685) - (8.24788251273, 46.341921307685) - (8.252583019025, 46.341921307685) - (8.252583019025, 46.34662181398) - (8.257283525321, 46.34662181398) - (8.261984031616, 46.34662181398) - (8.261984031616, 46.351322320275) - (8.261984031616, 46.356022826571) - (8.261984031616, 46.360723332866) - (8.261984031616, 46.365423839161) - (8.266684537911, 46.365423839161) - (8.271385044206, 46.365423839161) - (8.276085550501, 46.365423839161) - (8.280786056797, 46.365423839161) - (8.285486563092, 46.365423839161) - (8.285486563092, 46.370124345456) - (8.290187069387, 46.370124345456) - (8.294887575682, 46.370124345456) - (8.294887575682, 46.374824851752) - (8.299588081978, 46.374824851752) - (8.304288588273, 46.374824851752) - (8.308989094568, 46.374824851752) - (8.308989094568, 46.379525358047) - (8.313689600863, 46.379525358047) - (8.313689600863, 46.384225864342) - (8.318390107158, 46.384225864342) - (8.318390107158, 46.388926370637) - (8.313689600863, 46.388926370637) - (8.313689600863, 46.393626876932) - (8.313689600863, 46.398327383228) - (8.313689600863, 46.403027889523) - (8.308989094568, 46.403027889523) - (8.304288588273, 46.403027889523) - (8.299588081978, 46.403027889523) - (8.294887575682, 46.403027889523) - (8.294887575682, 46.407728395818) - (8.290187069387, 46.407728395818) - (8.290187069387, 46.412428902113) - (8.294887575682, 46.412428902113) - (8.294887575682, 46.417129408408) - (8.299588081978, 46.417129408408) - (8.299588081978, 46.421829914704) - (8.304288588273, 46.421829914704) - (8.308989094568, 46.421829914704) - (8.308989094568, 46.426530420999) - (8.313689600863, 46.426530420999) - (8.318390107158, 46.426530420999) - (8.323090613454, 46.426530420999) - (8.327791119749, 46.426530420999) - (8.332491626044, 46.426530420999) - (8.332491626044, 46.431230927294) - (8.337192132339, 46.431230927294) - (8.341892638634, 46.431230927294) - (8.341892638634, 46.435931433589) - (8.34659314493, 46.435931433589) - (8.34659314493, 46.440631939885) - (8.351293651225, 46.440631939885) - (8.35599415752, 46.440631939885) - (8.35599415752, 46.44533244618) - (8.360694663815, 46.44533244618) - (8.360694663815, 46.450032952475) - (8.365395170111, 46.450032952475) - (8.370095676406, 46.450032952475) - (8.370095676406, 46.45473345877) - (8.374796182701, 46.45473345877) - (8.379496688996, 46.45473345877) - (8.384197195291, 46.45473345877) - (8.388897701587, 46.45473345877) - (8.393598207882, 46.45473345877) - (8.398298714177, 46.45473345877) - (8.402999220472, 46.45473345877) - (8.407699726767, 46.45473345877) - (8.407699726767, 46.459433965065) - (8.412400233063, 46.459433965065) - (8.417100739358, 46.459433965065) - (8.421801245653, 46.459433965065) - (8.426501751948, 46.459433965065) - (8.426501751948, 46.464134471361) - (8.431202258244, 46.464134471361) - (8.435902764539, 46.464134471361) - (8.440603270834, 46.464134471361) - (8.445303777129, 46.464134471361) - (8.450004283424, 46.464134471361) - (8.450004283424, 46.459433965065) - (8.45470478972, 46.459433965065) - (8.45470478972, 46.45473345877) - (8.459405296015, 46.45473345877) - (8.459405296015, 46.450032952475) - (8.46410580231, 46.450032952475) - (8.46410580231, 46.44533244618) - (8.46410580231, 46.440631939885) - (8.459405296015, 46.440631939885) - (8.459405296015, 46.435931433589) - (8.459405296015, 46.431230927294) - (8.459405296015, 46.426530420999) - (8.459405296015, 46.421829914704) - (8.459405296015, 46.417129408408) - (8.46410580231, 46.417129408408) - (8.46410580231, 46.412428902113) - (8.468806308605, 46.412428902113) - (8.468806308605, 46.407728395818) - (8.46410580231, 46.407728395818) - (8.46410580231, 46.403027889523) - (8.46410580231, 46.398327383228) - (8.468806308605, 46.398327383228) - (8.468806308605, 46.393626876932) - (8.46410580231, 46.393626876932) - (8.46410580231, 46.388926370637) - (8.46410580231, 46.384225864342) - (8.46410580231, 46.379525358047) - (8.46410580231, 46.374824851752) - (8.468806308605, 46.374824851752) - (8.468806308605, 46.370124345456) - (8.468806308605, 46.365423839161) - (8.468806308605, 46.360723332866) - (8.46410580231, 46.360723332866) - (8.46410580231, 46.356022826571) - (8.46410580231, 46.351322320275) - (8.46410580231, 46.34662181398) - (8.46410580231, 46.341921307685) - (8.46410580231, 46.33722080139) - (8.46410580231, 46.332520295095) - (8.46410580231, 46.327819788799) - (8.459405296015, 46.327819788799) - (8.45470478972, 46.327819788799) - (8.45470478972, 46.323119282504) - (8.450004283424, 46.323119282504) - (8.450004283424, 46.318418776209) - (8.445303777129, 46.318418776209) - (8.440603270834, 46.318418776209) - (8.440603270834, 46.313718269914) - (8.440603270834, 46.309017763619) - (8.440603270834, 46.304317257323) - (8.435902764539, 46.304317257323) - (8.431202258244, 46.304317257323) - (8.431202258244, 46.299616751028) - (8.431202258244, 46.294916244733) - (8.431202258244, 46.290215738438) - (8.435902764539, 46.290215738438) - (8.435902764539, 46.285515232142) - (8.440603270834, 46.285515232142) - (8.440603270834, 46.280814725847) - (8.445303777129, 46.280814725847) - (8.445303777129, 46.276114219552) - (8.450004283424, 46.276114219552) - (8.450004283424, 46.271413713257) - (8.450004283424, 46.266713206962) - (8.450004283424, 46.262012700666) - (8.450004283424, 46.257312194371) - (8.445303777129, 46.257312194371) - (8.445303777129, 46.252611688076) - (8.445303777129, 46.247911181781) - (8.450004283424, 46.247911181781) - (8.45470478972, 46.247911181781) - (8.45470478972, 46.243210675486) - (8.459405296015, 46.243210675486) - (8.46410580231, 46.243210675486) - (8.46410580231, 46.23851016919) - (8.468806308605, 46.23851016919) - (8.468806308605, 46.233809662895) - (8.4735068149, 46.233809662895) - (8.4735068149, 46.2291091566) - (8.478207321196, 46.2291091566) - (8.482907827491, 46.2291091566) - (8.487608333786, 46.2291091566) - (8.492308840081, 46.2291091566) - (8.497009346377, 46.2291091566) - (8.497009346377, 46.224408650305) - (8.501709852672, 46.224408650305) - (8.506410358967, 46.224408650305) - (8.511110865262, 46.224408650305) - (8.515811371557, 46.224408650305) - (8.515811371557, 46.219708144009) - (8.520511877853, 46.219708144009) - (8.525212384148, 46.219708144009) - (8.529912890443, 46.219708144009) - (8.534613396738, 46.219708144009) - (8.534613396738, 46.215007637714) - (8.534613396738, 46.210307131419) - (8.534613396738, 46.205606625124) - (8.539313903033, 46.205606625124) - (8.539313903033, 46.200906118829) - (8.539313903033, 46.196205612533) - (8.544014409329, 46.196205612533) - (8.548714915624, 46.196205612533) - (8.548714915624, 46.191505106238) - (8.553415421919, 46.191505106238) - (8.553415421919, 46.186804599943) - (8.558115928214, 46.186804599943) - (8.558115928214, 46.182104093648) - (8.56281643451, 46.182104093648) - (8.567516940805, 46.182104093648) - (8.567516940805, 46.177403587352) - (8.5722174471, 46.177403587352) - (8.5722174471, 46.172703081057) - (8.5722174471, 46.168002574762) - (8.576917953395, 46.168002574762) - (8.576917953395, 46.163302068467) - (8.58161845969, 46.163302068467) - (8.586318965986, 46.163302068467) - (8.586318965986, 46.158601562172) - (8.591019472281, 46.158601562172) - (8.595719978576, 46.158601562172) - (8.595719978576, 46.153901055876) - (8.600420484871, 46.153901055876) - (8.600420484871, 46.149200549581) - (8.595719978576, 46.149200549581) - (8.595719978576, 46.144500043286) - (8.595719978576, 46.139799536991) - (8.600420484871, 46.139799536991) - (8.605120991167, 46.139799536991) - (8.605120991167, 46.135099030696) - (8.609821497462, 46.135099030696) - (8.609821497462, 46.1303985244) - (8.609821497462, 46.125698018105) - (8.614522003757, 46.125698018105) - (8.614522003757, 46.12099751181) - (8.619222510052, 46.12099751181) - (8.623923016347, 46.12099751181) - (8.628623522643, 46.12099751181) - (8.633324028938, 46.12099751181) - (8.638024535233, 46.12099751181) - (8.642725041528, 46.12099751181) - (8.647425547823, 46.12099751181) - (8.652126054119, 46.12099751181) - (8.652126054119, 46.116297005515) - (8.656826560414, 46.116297005515) - (8.656826560414, 46.111596499219) - (8.661527066709, 46.111596499219) - (8.666227573004, 46.111596499219) - (8.666227573004, 46.106895992924) - (8.6709280793, 46.106895992924) - (8.675628585595, 46.106895992924) - (8.675628585595, 46.111596499219) - (8.68032909189, 46.111596499219) - (8.68032909189, 46.106895992924) - (8.685029598185, 46.106895992924) - (8.685029598185, 46.102195486629) - (8.68973010448, 46.102195486629) - (8.694430610776, 46.102195486629) - (8.699131117071, 46.102195486629) - (8.703831623366, 46.102195486629) - (8.703831623366, 46.097494980334) - (8.708532129661, 46.097494980334) - (8.713232635956, 46.097494980334) - (8.717933142252, 46.097494980334) - (8.717933142252, 46.102195486629) - (8.717933142252, 46.106895992924) - (8.722633648547, 46.106895992924) - (8.722633648547, 46.111596499219) - (8.727334154842, 46.111596499219) - (8.732034661137, 46.111596499219) - (8.732034661137, 46.116297005515) - (8.736735167433, 46.116297005515) - (8.736735167433, 46.12099751181) - (8.741435673728, 46.12099751181) - (8.746136180023, 46.12099751181) - (8.746136180023, 46.116297005515) - (8.750836686318, 46.116297005515) - (8.750836686318, 46.111596499219) - (8.755537192613, 46.111596499219) - (8.755537192613, 46.106895992924) - (8.755537192613, 46.102195486629) - (8.760237698909, 46.102195486629) - (8.764938205204, 46.102195486629) - (8.764938205204, 46.097494980334) - (8.769638711499, 46.097494980334) - (8.774339217794, 46.097494980334) - (8.779039724089, 46.097494980334) - (8.783740230385, 46.097494980334) - (8.78844073668, 46.097494980334) - (8.793141242975, 46.097494980334) - (8.79784174927, 46.097494980334) - (8.802542255566, 46.097494980334) - (8.802542255566, 46.102195486629) - (8.807242761861, 46.102195486629) - (8.811943268156, 46.102195486629) - (8.811943268156, 46.097494980334) - (8.816643774451, 46.097494980334) - (8.821344280746, 46.097494980334) - (8.821344280746, 46.092794474039) - (8.826044787042, 46.092794474039) - (8.830745293337, 46.092794474039) - (8.830745293337, 46.088093967743) - (8.835445799632, 46.088093967743) - (8.835445799632, 46.083393461448) - (8.840146305927, 46.083393461448) - (8.840146305927, 46.078692955153) - (8.844846812222, 46.078692955153) - (8.849547318518, 46.078692955153) - (8.849547318518, 46.073992448858) - (8.854247824813, 46.073992448858) - (8.854247824813, 46.069291942563) - (8.854247824813, 46.064591436267) - (8.854247824813, 46.059890929972) - (8.849547318518, 46.059890929972) - (8.849547318518, 46.055190423677) - (8.849547318518, 46.050489917382) - (8.844846812222, 46.050489917382) - (8.840146305927, 46.050489917382) - (8.835445799632, 46.050489917382) - (8.830745293337, 46.050489917382) - (8.830745293337, 46.045789411086) - (8.830745293337, 46.041088904791) - (8.830745293337, 46.036388398496) - (8.826044787042, 46.036388398496) - (8.826044787042, 46.031687892201) - (8.826044787042, 46.026987385906) - (8.821344280746, 46.026987385906) - (8.816643774451, 46.026987385906) - (8.811943268156, 46.026987385906) - (8.811943268156, 46.02228687961) - (8.807242761861, 46.02228687961) - (8.802542255566, 46.02228687961) - (8.802542255566, 46.017586373315) - (8.79784174927, 46.017586373315) - (8.79784174927, 46.01288586702) - (8.79784174927, 46.008185360725) - (8.793141242975, 46.008185360725) - (8.793141242975, 46.00348485443) - (8.793141242975, 45.998784348134) - (8.78844073668, 45.998784348134) - (8.78844073668, 45.994083841839) - (8.78844073668, 45.989383335544) - (8.793141242975, 45.989383335544) - (8.793141242975, 45.994083841839) - (8.79784174927, 45.994083841839) - (8.802542255566, 45.994083841839) - (8.807242761861, 45.994083841839) - (8.807242761861, 45.989383335544) - (8.811943268156, 45.989383335544) - (8.816643774451, 45.989383335544) - (8.821344280746, 45.989383335544) - (8.826044787042, 45.989383335544) - (8.830745293337, 45.989383335544) - (8.830745293337, 45.984682829249) - (8.835445799632, 45.984682829249) - (8.840146305927, 45.984682829249) - (8.840146305927, 45.979982322953) - (8.844846812222, 45.979982322953) - (8.844846812222, 45.975281816658) - (8.849547318518, 45.975281816658) - (8.849547318518, 45.970581310363) - (8.854247824813, 45.970581310363) - (8.858948331108, 45.970581310363) - (8.858948331108, 45.965880804068) - (8.863648837403, 45.965880804068) - (8.868349343699, 45.965880804068) - (8.868349343699, 45.961180297773) - (8.873049849994, 45.961180297773) - (8.873049849994, 45.956479791477) - (8.877750356289, 45.956479791477) - (8.882450862584, 45.956479791477) - (8.887151368879, 45.956479791477) - (8.891851875175, 45.956479791477) - (8.89655238147, 45.956479791477) - (8.89655238147, 45.951779285182) - (8.89655238147, 45.947078778887) - (8.89655238147, 45.942378272592) - (8.89655238147, 45.937677766297) - (8.89655238147, 45.932977260001) - (8.89655238147, 45.928276753706) - (8.89655238147, 45.923576247411) - (8.901252887765, 45.923576247411) - (8.901252887765, 45.918875741116) - (8.90595339406, 45.918875741116) - (8.910653900356, 45.918875741116) - (8.915354406651, 45.918875741116) - (8.915354406651, 45.91417523482) - (8.920054912946, 45.91417523482) - (8.920054912946, 45.909474728525) - (8.920054912946, 45.90477422223) - (8.924755419241, 45.90477422223) - (8.924755419241, 45.900073715935) - (8.924755419241, 45.89537320964) - (8.924755419241, 45.890672703344) - (8.929455925536, 45.890672703344) - (8.929455925536, 45.885972197049) - (8.934156431832, 45.885972197049) - (8.934156431832, 45.881271690754) - (8.934156431832, 45.876571184459) - (8.934156431832, 45.871870678164) - (8.934156431832, 45.867170171868) - (8.938856938127, 45.867170171868) - (8.943557444422, 45.867170171868) - (8.943557444422, 45.862469665573) - (8.938856938127, 45.862469665573) - (8.934156431832, 45.862469665573) - (8.934156431832, 45.857769159278) - (8.929455925536, 45.857769159278) - (8.929455925536, 45.853068652983) - (8.924755419241, 45.853068652983) - (8.920054912946, 45.853068652983) - (8.920054912946, 45.848368146687) - (8.915354406651, 45.848368146687) - (8.915354406651, 45.843667640392) - (8.915354406651, 45.838967134097) - (8.910653900356, 45.838967134097) - (8.910653900356, 45.834266627802) - (8.915354406651, 45.834266627802) - (8.915354406651, 45.829566121507) - (8.920054912946, 45.829566121507) - (8.924755419241, 45.829566121507) - (8.924755419241, 45.834266627802) - (8.929455925536, 45.834266627802) - (8.934156431832, 45.834266627802) - (8.934156431832, 45.838967134097) - (8.938856938127, 45.838967134097) - (8.943557444422, 45.838967134097) - (8.943557444422, 45.843667640392) - (8.948257950717, 45.843667640392) - (8.952958457012, 45.843667640392) - (8.957658963308, 45.843667640392) - (8.957658963308, 45.838967134097) - (8.962359469603, 45.838967134097) - (8.962359469603, 45.834266627802) - (8.967059975898, 45.834266627802) - (8.971760482193, 45.834266627802) - (8.976460988489, 45.834266627802) - (8.981161494784, 45.834266627802) - (8.985862001079, 45.834266627802) - (8.990562507374, 45.834266627802) - (8.995263013669, 45.834266627802) - (8.995263013669, 45.829566121507) - (8.995263013669, 45.824865615211) - (8.995263013669, 45.820165108916) - (8.999963519965, 45.820165108916) - (9.00466402626, 45.820165108916) - (9.009364532555, 45.820165108916) - (9.01406503885, 45.820165108916) - (9.018765545145, 45.820165108916) - (9.023466051441, 45.820165108916) - (9.028166557736, 45.820165108916) - (9.032867064031, 45.820165108916) - (9.032867064031, 45.824865615211) - (9.032867064031, 45.829566121507) - (9.037567570326, 45.829566121507) - (9.037567570326, 45.834266627802) - (9.037567570326, 45.838967134097) - (9.037567570326, 45.843667640392) - (9.042268076622, 45.843667640392) - (9.042268076622, 45.848368146687) - (9.046968582917, 45.848368146687) - (9.046968582917, 45.853068652983) - (9.051669089212, 45.853068652983) - (9.051669089212, 45.857769159278) - (9.051669089212, 45.862469665573) - (9.051669089212, 45.867170171868) - (9.051669089212, 45.871870678164) - (9.056369595507, 45.871870678164) - (9.056369595507, 45.876571184459) - (9.061070101802, 45.876571184459) - (9.065770608098, 45.876571184459) - (9.070471114393, 45.876571184459) - (9.070471114393, 45.881271690754) - (9.075171620688, 45.881271690754) - (9.075171620688, 45.885972197049) - (9.079872126983, 45.885972197049) - (9.079872126983, 45.890672703344) - (9.084572633278, 45.890672703344) - (9.084572633278, 45.89537320964) - (9.089273139574, 45.89537320964) - (9.089273139574, 45.900073715935) - (9.084572633278, 45.900073715935) - (9.079872126983, 45.900073715935) - (9.075171620688, 45.900073715935) - (9.075171620688, 45.90477422223) - (9.075171620688, 45.909474728525) - (9.075171620688, 45.91417523482) - (9.070471114393, 45.91417523482) - (9.065770608098, 45.91417523482) - (9.061070101802, 45.91417523482) - (9.061070101802, 45.918875741116) - (9.061070101802, 45.923576247411) - (9.056369595507, 45.923576247411) - (9.056369595507, 45.918875741116) - (9.051669089212, 45.918875741116) - (9.051669089212, 45.923576247411) - (9.046968582917, 45.923576247411) - (9.046968582917, 45.928276753706) - (9.042268076622, 45.928276753706) - (9.037567570326, 45.928276753706) - (9.032867064031, 45.928276753706) - (9.028166557736, 45.928276753706) - (9.023466051441, 45.928276753706) - (9.018765545145, 45.928276753706) - (9.018765545145, 45.932977260001) - (9.023466051441, 45.932977260001) - (9.023466051441, 45.937677766297) - (9.018765545145, 45.937677766297) - (9.018765545145, 45.942378272592) - (9.01406503885, 45.942378272592) - (9.01406503885, 45.947078778887) - (9.018765545145, 45.947078778887) - (9.018765545145, 45.951779285182) - (9.01406503885, 45.951779285182) - (9.01406503885, 45.956479791477) - (9.01406503885, 45.961180297773) - (9.009364532555, 45.961180297773) - (9.00466402626, 45.961180297773) - (9.00466402626, 45.965880804068) - (8.999963519965, 45.965880804068) - (8.995263013669, 45.965880804068) - (8.990562507374, 45.965880804068) - (8.990562507374, 45.970581310363) - (8.995263013669, 45.970581310363) - (8.995263013669, 45.975281816658) - (8.995263013669, 45.979982322953) - (8.999963519965, 45.979982322953) - (9.00466402626, 45.979982322953) - (9.009364532555, 45.979982322953) - (9.009364532555, 45.984682829249) - (9.009364532555, 45.989383335544) - (9.01406503885, 45.989383335544) - (9.018765545145, 45.989383335544) - (9.023466051441, 45.989383335544) - (9.023466051441, 45.994083841839) - (9.028166557736, 45.994083841839) - (9.028166557736, 45.998784348134) - (9.023466051441, 45.998784348134) - (9.023466051441, 46.00348485443) - (9.023466051441, 46.008185360725) - (9.023466051441, 46.01288586702) - (9.023466051441, 46.017586373315) - (9.018765545145, 46.017586373315) - (9.018765545145, 46.02228687961) - (9.01406503885, 46.02228687961) - (9.01406503885, 46.026987385906) - (9.009364532555, 46.026987385906) - (9.009364532555, 46.031687892201) - (9.009364532555, 46.036388398496) - (9.009364532555, 46.041088904791) - (9.01406503885, 46.041088904791) - (9.018765545145, 46.041088904791) - (9.018765545145, 46.045789411086) - (9.018765545145, 46.050489917382) - (9.023466051441, 46.050489917382) - (9.023466051441, 46.055190423677) - (9.028166557736, 46.055190423677) - (9.032867064031, 46.055190423677) - (9.037567570326, 46.055190423677) - (9.037567570326, 46.059890929972) - (9.042268076622, 46.059890929972) - (9.046968582917, 46.059890929972) - (9.051669089212, 46.059890929972) - (9.056369595507, 46.059890929972) - (9.061070101802, 46.059890929972) - (9.065770608098, 46.059890929972) - (9.070471114393, 46.059890929972) - (9.070471114393, 46.064591436267) - (9.075171620688, 46.064591436267) - (9.079872126983, 46.064591436267) - (9.079872126983, 46.069291942563) - (9.079872126983, 46.073992448858) - (9.079872126983, 46.078692955153) - (9.084572633278, 46.078692955153) - (9.084572633278, 46.083393461448) - (9.089273139574, 46.083393461448) - (9.089273139574, 46.088093967743) - (9.084572633278, 46.088093967743) - (9.084572633278, 46.092794474039) - (9.084572633278, 46.097494980334) - (9.079872126983, 46.097494980334) - (9.079872126983, 46.102195486629) - (9.079872126983, 46.106895992924) - (9.075171620688, 46.106895992924) - (9.075171620688, 46.111596499219) - (9.075171620688, 46.116297005515) - (9.075171620688, 46.12099751181) - (9.079872126983, 46.12099751181) - (9.084572633278, 46.12099751181) - (9.084572633278, 46.125698018105) - (9.089273139574, 46.125698018105) - (9.093973645869, 46.125698018105) - (9.098674152164, 46.125698018105) - (9.098674152164, 46.1303985244) - (9.103374658459, 46.1303985244) - (9.108075164755, 46.1303985244) - (9.108075164755, 46.135099030696) - (9.11277567105, 46.135099030696) - (9.117476177345, 46.135099030696) - (9.12217668364, 46.135099030696) - (9.12217668364, 46.139799536991) - (9.126877189935, 46.139799536991) - (9.126877189935, 46.144500043286) - (9.131577696231, 46.144500043286) - (9.131577696231, 46.149200549581) - (9.136278202526, 46.149200549581) - (9.136278202526, 46.153901055876) - (9.140978708821, 46.153901055876) - (9.145679215116, 46.153901055876) - (9.145679215116, 46.158601562172) - (9.150379721411, 46.158601562172) - (9.155080227707, 46.158601562172) - (9.155080227707, 46.163302068467) - (9.159780734002, 46.163302068467) - (9.159780734002, 46.168002574762) - (9.164481240297, 46.168002574762) - (9.164481240297, 46.172703081057) - (9.169181746592, 46.172703081057) - (9.173882252888, 46.172703081057) - (9.178582759183, 46.172703081057) - (9.183283265478, 46.172703081057) - (9.187983771773, 46.172703081057) - (9.187983771773, 46.177403587352) - (9.192684278068, 46.177403587352) - (9.192684278068, 46.182104093648) - (9.197384784364, 46.182104093648) - (9.197384784364, 46.186804599943) - (9.197384784364, 46.191505106238) - (9.192684278068, 46.191505106238) - (9.192684278068, 46.196205612533) - (9.197384784364, 46.196205612533) - (9.197384784364, 46.200906118829) - (9.202085290659, 46.200906118829) - (9.202085290659, 46.205606625124) - (9.202085290659, 46.210307131419) - (9.206785796954, 46.210307131419) - (9.211486303249, 46.210307131419) - (9.216186809544, 46.210307131419) - (9.216186809544, 46.215007637714) - (9.22088731584, 46.215007637714) - (9.22088731584, 46.219708144009) - (9.22088731584, 46.224408650305) - (9.22088731584, 46.2291091566) - (9.225587822135, 46.2291091566) - (9.225587822135, 46.233809662895) - (9.23028832843, 46.233809662895) - (9.234988834725, 46.233809662895) - (9.239689341021, 46.233809662895) - (9.244389847316, 46.233809662895) - (9.249090353611, 46.233809662895) - (9.249090353611, 46.23851016919) - (9.249090353611, 46.243210675486) - (9.249090353611, 46.247911181781) - (9.249090353611, 46.252611688076) - (9.249090353611, 46.257312194371) - (9.249090353611, 46.262012700666) - (9.253790859906, 46.262012700666) - (9.253790859906, 46.266713206962) - (9.253790859906, 46.271413713257) - (9.258491366201, 46.271413713257) - (9.258491366201, 46.276114219552) - (9.258491366201, 46.280814725847) - (9.263191872497, 46.280814725847) - (9.267892378792, 46.280814725847) - (9.267892378792, 46.285515232142) - (9.272592885087, 46.285515232142) - (9.272592885087, 46.290215738438) - (9.277293391382, 46.290215738438) - (9.277293391382, 46.294916244733) - (9.281993897678, 46.294916244733) - (9.281993897678, 46.299616751028) - (9.281993897678, 46.304317257323) - (9.281993897678, 46.309017763619) - (9.286694403973, 46.309017763619) - (9.286694403973, 46.313718269914) - (9.291394910268, 46.313718269914) - (9.291394910268, 46.318418776209) - (9.296095416563, 46.318418776209) - (9.296095416563, 46.323119282504) - (9.296095416563, 46.327819788799) - (9.296095416563, 46.332520295095) - (9.291394910268, 46.332520295095) - (9.291394910268, 46.33722080139) - (9.296095416563, 46.33722080139) - (9.296095416563, 46.341921307685) - (9.300795922858, 46.341921307685) - (9.300795922858, 46.34662181398) - (9.300795922858, 46.351322320275) - (9.296095416563, 46.351322320275) - (9.296095416563, 46.356022826571) - (9.291394910268, 46.356022826571) - (9.286694403973, 46.356022826571) - (9.281993897678, 46.356022826571) - (9.281993897678, 46.360723332866) - (9.277293391382, 46.360723332866) - (9.277293391382, 46.365423839161) - (9.277293391382, 46.370124345456) - (9.277293391382, 46.374824851752) - (9.277293391382, 46.379525358047) - (9.281993897678, 46.379525358047) - (9.281993897678, 46.384225864342) - (9.281993897678, 46.388926370637) - (9.277293391382, 46.388926370637) - (9.277293391382, 46.393626876932) - (9.277293391382, 46.398327383228) - (9.281993897678, 46.398327383228) - (9.281993897678, 46.403027889523) - (9.281993897678, 46.407728395818) - (9.281993897678, 46.412428902113) - (9.277293391382, 46.412428902113) - (9.277293391382, 46.417129408408) - (9.272592885087, 46.417129408408) - (9.272592885087, 46.421829914704) - (9.267892378792, 46.421829914704) - (9.263191872497, 46.421829914704) - (9.258491366201, 46.421829914704) - (9.258491366201, 46.426530420999) - (9.253790859906, 46.426530420999) - (9.253790859906, 46.431230927294) - (9.249090353611, 46.431230927294) - (9.249090353611, 46.435931433589) - (9.249090353611, 46.440631939885) - (9.249090353611, 46.44533244618) - (9.249090353611, 46.450032952475) - (9.253790859906, 46.450032952475) - (9.258491366201, 46.450032952475) - (9.263191872497, 46.450032952475) - (9.263191872497, 46.45473345877) - (9.267892378792, 46.45473345877) - (9.272592885087, 46.45473345877) - (9.272592885087, 46.459433965065) - (9.277293391382, 46.459433965065) - (9.277293391382, 46.464134471361) - (9.272592885087, 46.464134471361) - (9.272592885087, 46.468834977656) - (9.277293391382, 46.468834977656) - (9.277293391382, 46.473535483951) - (9.277293391382, 46.478235990246) - (9.277293391382, 46.482936496541) - (9.277293391382, 46.482936496542) - (9.277293391382, 46.487637002837) - (9.281993897678, 46.487637002837) - (9.281993897678, 46.492337509132) - (9.286694403973, 46.492337509132) - (9.286694403973, 46.497038015427) - (9.291394910268, 46.497038015427) - (9.296095416563, 46.497038015427) - (9.300795922858, 46.497038015427) - (9.300795922858, 46.501738521722) - (9.305496429154, 46.501738521722) - (9.310196935449, 46.501738521722) - (9.314897441744, 46.501738521722) - (9.314897441744, 46.506439028018) - (9.319597948039, 46.506439028018) - (9.324298454334, 46.506439028018) - (9.32899896063, 46.506439028018) - (9.333699466925, 46.506439028018) - (9.33839997322, 46.506439028018) - (9.343100479515, 46.506439028018) - (9.347800985811, 46.506439028018) - (9.352501492106, 46.506439028018) - (9.357201998401, 46.506439028018) - (9.361902504696, 46.506439028018) - (9.366603010991, 46.506439028018) - (9.371303517287, 46.506439028018) - (9.371303517287, 46.501738521722) - (9.371303517287, 46.497038015427) - (9.371303517287, 46.492337509132) - (9.371303517287, 46.487637002837) - (9.376004023582, 46.487637002837) - (9.380704529877, 46.487637002837) - (9.380704529877, 46.482936496541) - (9.385405036172, 46.482936496541) - (9.385405036172, 46.478235990246) - (9.390105542467, 46.478235990246) - (9.390105542467, 46.473535483951) - (9.394806048763, 46.473535483951) - (9.394806048763, 46.468834977656) - (9.399506555058, 46.468834977656) - (9.404207061353, 46.468834977656) - (9.408907567648, 46.468834977656) - (9.413608073944, 46.468834977656) - (9.418308580239, 46.468834977656) - (9.418308580239, 46.473535483951) - (9.423009086534, 46.473535483951) - (9.423009086534, 46.478235990246) - (9.423009086534, 46.482936496541) - (9.423009086534, 46.482936496542) - (9.423009086534, 46.487637002837) - (9.427709592829, 46.487637002837) - (9.427709592829, 46.492337509132) - (9.432410099124, 46.492337509132) - (9.432410099124, 46.497038015427) - (9.43711060542, 46.497038015427) - (9.43711060542, 46.501738521722) - (9.441811111715, 46.501738521722) - (9.44651161801, 46.501738521722) - (9.451212124305, 46.501738521722) - (9.451212124305, 46.506439028018) - (9.4559126306, 46.506439028018) - (9.460613136896, 46.506439028018) - (9.460613136896, 46.501738521722) - (9.460613136896, 46.497038015427) - (9.460613136896, 46.492337509132) - (9.460613136896, 46.487637002837) - (9.460613136896, 46.482936496542) - (9.4559126306, 46.482936496542) - (9.451212124305, 46.482936496542) - (9.451212124305, 46.478235990246) - (9.4559126306, 46.478235990246) - (9.460613136896, 46.478235990246) - (9.465313643191, 46.478235990246) - (9.465313643191, 46.473535483951) - (9.465313643191, 46.468834977656) - (9.465313643191, 46.464134471361) - (9.460613136896, 46.464134471361) - (9.460613136896, 46.459433965065) - (9.460613136896, 46.45473345877) - (9.460613136896, 46.450032952475) - (9.460613136896, 46.44533244618) - (9.460613136896, 46.440631939885) - (9.4559126306, 46.440631939885) - (9.4559126306, 46.435931433589) - (9.4559126306, 46.431230927294) - (9.4559126306, 46.426530420999) - (9.4559126306, 46.421829914704) - (9.4559126306, 46.417129408408) - (9.4559126306, 46.412428902113) - (9.460613136896, 46.412428902113) - (9.460613136896, 46.407728395818) - (9.465313643191, 46.407728395818) - (9.465313643191, 46.403027889523) - (9.465313643191, 46.398327383228) - (9.465313643191, 46.393626876932) - (9.465313643191, 46.388926370637) - (9.465313643191, 46.384225864342) - (9.465313643191, 46.379525358047) - (9.465313643191, 46.374824851752) - (9.465313643191, 46.370124345456) - (9.470014149486, 46.370124345456) - (9.474714655781, 46.370124345456) - (9.479415162077, 46.370124345456) - (9.479415162077, 46.365423839161) - (9.484115668372, 46.365423839161) - (9.488816174667, 46.365423839161) - (9.493516680962, 46.365423839161) - (9.493516680962, 46.360723332866) - (9.498217187257, 46.360723332866) - (9.498217187257, 46.356022826571) - (9.502917693553, 46.356022826571) - (9.502917693553, 46.351322320275) - (9.507618199848, 46.351322320275) - (9.507618199848, 46.34662181398) - (9.507618199848, 46.341921307685) - (9.512318706143, 46.341921307685) - (9.512318706143, 46.33722080139) - (9.512318706143, 46.332520295095) - (9.517019212438, 46.332520295095) - (9.517019212438, 46.327819788799) - (9.521719718733, 46.327819788799) - (9.521719718733, 46.323119282504) - (9.526420225029, 46.323119282504) - (9.526420225029, 46.318418776209) - (9.531120731324, 46.318418776209) - (9.531120731324, 46.313718269914) - (9.535821237619, 46.313718269914) - (9.535821237619, 46.309017763619) - (9.540521743914, 46.309017763619) - (9.540521743914, 46.304317257323) - (9.54522225021, 46.304317257323) - (9.549922756505, 46.304317257323) - (9.5546232628, 46.304317257323) - (9.559323769095, 46.304317257323) - (9.56402427539, 46.304317257323) - (9.56402427539, 46.299616751028) - (9.568724781686, 46.299616751028) - (9.573425287981, 46.299616751028) - (9.573425287981, 46.294916244733) - (9.578125794276, 46.294916244733) - (9.582826300571, 46.294916244733) - (9.587526806867, 46.294916244733) - (9.592227313162, 46.294916244733) - (9.596927819457, 46.294916244733) - (9.601628325752, 46.294916244733) - (9.606328832047, 46.294916244733) - (9.611029338343, 46.294916244733) - (9.615729844638, 46.294916244733) - (9.615729844638, 46.290215738438) - (9.620430350933, 46.290215738438) - (9.620430350933, 46.285515232142) - (9.625130857228, 46.285515232142) - (9.629831363523, 46.285515232142) - (9.634531869819, 46.285515232142) - (9.639232376114, 46.285515232142) - (9.643932882409, 46.285515232142) - (9.643932882409, 46.290215738438) - (9.648633388704, 46.290215738438) - (9.653333895, 46.290215738438) - (9.653333895, 46.294916244733) - (9.658034401295, 46.294916244733) - (9.66273490759, 46.294916244733) - (9.667435413885, 46.294916244733) - (9.667435413885, 46.299616751028) - (9.67213592018, 46.299616751028) - (9.676836426476, 46.299616751028) - (9.681536932771, 46.299616751028) - (9.686237439066, 46.299616751028) - (9.686237439066, 46.294916244733) - (9.690937945361, 46.294916244733) - (9.695638451656, 46.294916244733) - (9.695638451656, 46.290215738438) - (9.700338957952, 46.290215738438) - (9.705039464247, 46.290215738438) - (9.709739970542, 46.290215738438) - (9.709739970542, 46.294916244733) - (9.714440476837, 46.294916244733) - (9.714440476837, 46.299616751028) - (9.719140983133, 46.299616751028) - (9.719140983133, 46.304317257323) - (9.719140983133, 46.309017763619) - (9.723841489428, 46.309017763619) - (9.723841489428, 46.313718269914) - (9.728541995723, 46.313718269914) - (9.728541995723, 46.318418776209) - (9.723841489428, 46.318418776209) - (9.723841489428, 46.323119282504) - (9.719140983133, 46.323119282504) - (9.719140983133, 46.327819788799) - (9.723841489428, 46.327819788799) - (9.723841489428, 46.332520295095) - (9.728541995723, 46.332520295095) - (9.728541995723, 46.33722080139) - (9.723841489428, 46.33722080139) - (9.723841489428, 46.341921307685) - (9.728541995723, 46.341921307685) - (9.728541995723, 46.34662181398) - (9.733242502018, 46.34662181398) - (9.733242502018, 46.351322320275) - (9.737943008313, 46.351322320275) - (9.742643514609, 46.351322320275) - (9.747344020904, 46.351322320275) - (9.747344020904, 46.34662181398) - (9.752044527199, 46.34662181398) - (9.756745033494, 46.34662181398) - (9.756745033494, 46.341921307685) - (9.761445539789, 46.341921307685) - (9.761445539789, 46.33722080139) - (9.766146046085, 46.33722080139) - (9.77084655238, 46.33722080139) - (9.77084655238, 46.332520295095) - (9.775547058675, 46.332520295095) - (9.78024756497, 46.332520295095) - (9.78024756497, 46.33722080139) - (9.784948071266, 46.33722080139) - (9.789648577561, 46.33722080139) - (9.789648577561, 46.341921307685) - (9.794349083856, 46.341921307685) - (9.799049590151, 46.341921307685) - (9.803750096446, 46.341921307685) - (9.803750096446, 46.34662181398) - (9.808450602742, 46.34662181398) - (9.813151109037, 46.34662181398) - (9.817851615332, 46.34662181398) - (9.817851615332, 46.351322320275) - (9.822552121627, 46.351322320275) - (9.822552121627, 46.356022826571) - (9.827252627922, 46.356022826571) - (9.831953134218, 46.356022826571) - (9.831953134218, 46.360723332866) - (9.836653640513, 46.360723332866) - (9.841354146808, 46.360723332866) - (9.846054653103, 46.360723332866) - (9.850755159399, 46.360723332866) - (9.850755159399, 46.365423839161) - (9.855455665694, 46.365423839161) - (9.860156171989, 46.365423839161) - (9.864856678284, 46.365423839161) - (9.869557184579, 46.365423839161) - (9.874257690875, 46.365423839161) - (9.87895819717, 46.365423839161) - (9.87895819717, 46.370124345456) - (9.883658703465, 46.370124345456) - (9.883658703465, 46.374824851752) - (9.88835920976, 46.374824851752) - (9.893059716056, 46.374824851752) - (9.897760222351, 46.374824851752) - (9.897760222351, 46.379525358047) - (9.902460728646, 46.379525358047) - (9.907161234941, 46.379525358047) - (9.911861741236, 46.379525358047) - (9.911861741236, 46.374824851752) - (9.916562247532, 46.374824851752) - (9.916562247532, 46.370124345456) - (9.921262753827, 46.370124345456) - (9.925963260122, 46.370124345456) - (9.925963260122, 46.365423839161) - (9.930663766417, 46.365423839161) - (9.930663766417, 46.370124345456) - (9.935364272712, 46.370124345456) - (9.935364272712, 46.374824851752) - (9.940064779008, 46.374824851752) - (9.940064779008, 46.379525358047) - (9.944765285303, 46.379525358047) - (9.949465791598, 46.379525358047) - (9.954166297893, 46.379525358047) - (9.958866804189, 46.379525358047) - (9.958866804189, 46.374824851752) - (9.958866804189, 46.370124345456) - (9.963567310484, 46.370124345456) - (9.963567310484, 46.365423839161) - (9.968267816779, 46.365423839161) - (9.968267816779, 46.360723332866) - (9.972968323074, 46.360723332866) - (9.977668829369, 46.360723332866) - (9.977668829369, 46.356022826571) - (9.982369335665, 46.356022826571) - (9.98706984196, 46.356022826571) - (9.98706984196, 46.351322320275) - (9.991770348255, 46.351322320275) - (9.99647085455, 46.351322320275) - (9.99647085455, 46.34662181398) - (9.99647085455, 46.341921307685) - (9.991770348255, 46.341921307685) - (9.991770348255, 46.33722080139) - (9.98706984196, 46.33722080139) - (9.98706984196, 46.332520295095) - (9.98706984196, 46.327819788799) - (9.982369335665, 46.327819788799) - (9.982369335665, 46.323119282504) - (9.98706984196, 46.323119282504) - (9.98706984196, 46.318418776209) - (9.991770348255, 46.318418776209) - (9.991770348255, 46.313718269914) - (9.99647085455, 46.313718269914) - (10.001171360845, 46.313718269914) - (10.001171360845, 46.309017763619) - (10.001171360845, 46.304317257323) - (9.99647085455, 46.304317257323) - (9.99647085455, 46.299616751028) - (9.99647085455, 46.294916244733) - (9.991770348255, 46.294916244733) - (9.991770348255, 46.290215738438) - (9.99647085455, 46.290215738438) - (9.99647085455, 46.285515232142) - (10.001171360845, 46.285515232142) - (10.001171360845, 46.280814725847) - (10.005871867141, 46.280814725847) - (10.010572373436, 46.280814725847) - (10.015272879731, 46.280814725847) - (10.019973386026, 46.280814725847) - (10.019973386026, 46.276114219552) - (10.024673892322, 46.276114219552) - (10.029374398617, 46.276114219552) - (10.034074904912, 46.276114219552) - (10.038775411207, 46.276114219552) - (10.038775411207, 46.271413713257) - (10.043475917502, 46.271413713257) - (10.048176423798, 46.271413713257) - (10.048176423798, 46.266713206962) - (10.052876930093, 46.266713206962) - (10.052876930093, 46.262012700666) - (10.057577436388, 46.262012700666) - (10.057577436388, 46.257312194371) - (10.057577436388, 46.252611688076) - (10.057577436388, 46.247911181781) - (10.057577436388, 46.243210675486) - (10.057577436388, 46.23851016919) - (10.052876930093, 46.23851016919) - (10.052876930093, 46.233809662895) - (10.048176423798, 46.233809662895) - (10.043475917502, 46.233809662895) - (10.043475917502, 46.2291091566) - (10.048176423798, 46.2291091566) - (10.048176423798, 46.224408650305) - (10.052876930093, 46.224408650305) - (10.057577436388, 46.224408650305) - (10.057577436388, 46.219708144009) - (10.062277942683, 46.219708144009) - (10.066978448978, 46.219708144009) - (10.071678955274, 46.219708144009) - (10.076379461569, 46.219708144009) - (10.076379461569, 46.224408650305) - (10.081079967864, 46.224408650305) - (10.085780474159, 46.224408650305) - (10.090480980455, 46.224408650305) - (10.09518148675, 46.224408650305) - (10.09518148675, 46.2291091566) - (10.099881993045, 46.2291091566) - (10.10458249934, 46.2291091566) - (10.10458249934, 46.224408650305) - (10.109283005635, 46.224408650305) - (10.113983511931, 46.224408650305) - (10.118684018226, 46.224408650305) - (10.123384524521, 46.224408650305) - (10.128085030816, 46.224408650305) - (10.132785537111, 46.224408650305) - (10.137486043407, 46.224408650305) - (10.137486043407, 46.2291091566) - (10.142186549702, 46.2291091566) - (10.146887055997, 46.2291091566) - (10.146887055997, 46.233809662895) - (10.146887055997, 46.23851016919) - (10.151587562292, 46.23851016919) - (10.156288068588, 46.23851016919) - (10.156288068588, 46.243210675486) - (10.160988574883, 46.243210675486) - (10.160988574883, 46.247911181781) - (10.165689081178, 46.247911181781) - (10.170389587473, 46.247911181781) - (10.170389587473, 46.252611688076) - (10.175090093768, 46.252611688076) - (10.175090093768, 46.257312194371) - (10.175090093768, 46.262012700666) - (10.175090093768, 46.266713206962) - (10.170389587473, 46.266713206962) - (10.170389587473, 46.271413713257) - (10.165689081178, 46.271413713257) - (10.160988574883, 46.271413713257) - (10.160988574883, 46.276114219552) - (10.160988574883, 46.280814725847) - (10.160988574883, 46.285515232142) - (10.156288068588, 46.285515232142) - (10.156288068588, 46.290215738438) - (10.156288068588, 46.294916244733) - (10.151587562292, 46.294916244733) - (10.146887055997, 46.294916244733) - (10.142186549702, 46.294916244733) - (10.142186549702, 46.299616751028) - (10.137486043407, 46.299616751028) - (10.137486043407, 46.304317257323) - (10.137486043407, 46.309017763619) - (10.132785537111, 46.309017763619) - (10.128085030816, 46.309017763619) - (10.128085030816, 46.313718269914) - (10.123384524521, 46.313718269914) - (10.118684018226, 46.313718269914) - (10.118684018226, 46.318418776209) - (10.113983511931, 46.318418776209) - (10.113983511931, 46.323119282504) - (10.113983511931, 46.327819788799) - (10.109283005635, 46.327819788799) - (10.109283005635, 46.332520295095) - (10.10458249934, 46.332520295095) - (10.10458249934, 46.33722080139) - (10.10458249934, 46.341921307685) - (10.10458249934, 46.34662181398) - (10.109283005635, 46.34662181398) - (10.109283005635, 46.351322320275) - (10.113983511931, 46.351322320275) - (10.113983511931, 46.356022826571) - (10.118684018226, 46.356022826571) - (10.118684018226, 46.360723332866) - (10.123384524521, 46.360723332866) - (10.128085030816, 46.360723332866) - (10.132785537111, 46.360723332866) - (10.132785537111, 46.365423839161) - (10.128085030816, 46.365423839161) - (10.128085030816, 46.370124345456) - (10.128085030816, 46.374824851752) - (10.128085030816, 46.379525358047) - (10.132785537111, 46.379525358047) - (10.132785537111, 46.384225864342) - (10.137486043407, 46.384225864342) - (10.142186549702, 46.384225864342) - (10.146887055997, 46.384225864342) - (10.151587562292, 46.384225864342) - (10.156288068588, 46.384225864342) - (10.160988574883, 46.384225864342) - (10.160988574883, 46.388926370637) - (10.160988574883, 46.393626876932) - (10.165689081178, 46.393626876932) - (10.165689081178, 46.398327383228) - (10.165689081178, 46.403027889523) - (10.165689081178, 46.407728395818) - (10.165689081178, 46.412428902113) - (10.160988574883, 46.412428902113) - (10.156288068588, 46.412428902113) - (10.151587562292, 46.412428902113) - (10.146887055997, 46.412428902113) - (10.146887055997, 46.417129408408) - (10.146887055997, 46.421829914704) - (10.142186549702, 46.421829914704) - (10.142186549702, 46.426530420999) - (10.137486043407, 46.426530420999) - (10.132785537111, 46.426530420999) - (10.132785537111, 46.431230927294) - (10.128085030816, 46.431230927294) - (10.123384524521, 46.431230927294) - (10.123384524521, 46.426530420999) - (10.118684018226, 46.426530420999) - (10.113983511931, 46.426530420999) - (10.109283005635, 46.426530420999) - (10.10458249934, 46.426530420999) - (10.10458249934, 46.421829914704) - (10.099881993045, 46.421829914704) - (10.09518148675, 46.421829914704) - (10.090480980455, 46.421829914704) - (10.085780474159, 46.421829914704) - (10.081079967864, 46.421829914704) - (10.076379461569, 46.421829914704) - (10.076379461569, 46.426530420999) - (10.071678955274, 46.426530420999) - (10.066978448978, 46.426530420999) - (10.062277942683, 46.426530420999) - (10.057577436388, 46.426530420999) - (10.057577436388, 46.431230927294) - (10.057577436388, 46.435931433589) - (10.052876930093, 46.435931433589) - (10.052876930093, 46.440631939885) - (10.048176423798, 46.440631939885) - (10.043475917502, 46.440631939885) - (10.043475917502, 46.44533244618) - (10.038775411207, 46.44533244618) - (10.038775411207, 46.450032952475) - (10.043475917502, 46.450032952475) - (10.043475917502, 46.45473345877) - (10.048176423798, 46.45473345877) - (10.048176423798, 46.459433965065) - (10.052876930093, 46.459433965065) - (10.052876930093, 46.464134471361) - (10.052876930093, 46.468834977656) - (10.052876930093, 46.473535483951) - (10.048176423798, 46.473535483951) - (10.048176423798, 46.478235990246) - (10.043475917502, 46.478235990246) - (10.043475917502, 46.482936496541) - (10.043475917502, 46.482936496542) - (10.043475917502, 46.487637002837) - (10.048176423798, 46.487637002837) - (10.048176423798, 46.492337509132) - (10.048176423798, 46.497038015427) - (10.048176423798, 46.501738521722) - (10.048176423798, 46.506439028018) - (10.043475917502, 46.506439028018) - (10.043475917502, 46.511139534313) - (10.048176423798, 46.511139534313) - (10.048176423798, 46.515840040608) - (10.052876930093, 46.515840040608) - (10.052876930093, 46.520540546903) - (10.052876930093, 46.525241053198) - (10.052876930093, 46.529941559494) - (10.048176423798, 46.529941559494) - (10.048176423798, 46.534642065789) - (10.048176423798, 46.539342572084) - (10.048176423798, 46.544043078379) - (10.052876930093, 46.544043078379) - (10.057577436388, 46.544043078379) - (10.062277942683, 46.544043078379) - (10.062277942683, 46.548743584675) - (10.066978448978, 46.548743584675) - (10.066978448978, 46.55344409097) - (10.071678955274, 46.55344409097) - (10.071678955274, 46.558144597265) - (10.076379461569, 46.558144597265) - (10.076379461569, 46.56284510356) - (10.081079967864, 46.56284510356) - (10.085780474159, 46.56284510356) - (10.085780474159, 46.567545609855) - (10.081079967864, 46.567545609855) - (10.081079967864, 46.572246116151) - (10.081079967864, 46.576946622446) - (10.085780474159, 46.576946622446) - (10.090480980455, 46.576946622446) - (10.09518148675, 46.576946622446) - (10.09518148675, 46.581647128741) - (10.099881993045, 46.581647128741) - (10.099881993045, 46.586347635036) - (10.099881993045, 46.591048141331) - (10.099881993045, 46.595748647627) - (10.099881993045, 46.600449153922) - (10.099881993045, 46.605149660217) - (10.099881993045, 46.609850166512) - (10.10458249934, 46.609850166512) - (10.109283005635, 46.609850166512) - (10.113983511931, 46.609850166512) - (10.118684018226, 46.609850166512) - (10.123384524521, 46.609850166512) - (10.128085030816, 46.609850166512) - (10.132785537111, 46.609850166512) - (10.137486043407, 46.609850166512) - (10.142186549702, 46.609850166512) - (10.146887055997, 46.609850166512) - (10.151587562292, 46.609850166512) - (10.151587562292, 46.614550672808) - (10.156288068588, 46.614550672808) - (10.160988574883, 46.614550672808) - (10.165689081178, 46.614550672808) - (10.165689081178, 46.619251179103) - (10.170389587473, 46.619251179103) - (10.175090093768, 46.619251179103) - (10.175090093768, 46.623951685398) - (10.179790600064, 46.623951685398) - (10.184491106359, 46.623951685398) - (10.189191612654, 46.623951685398) - (10.193892118949, 46.623951685398) - (10.198592625244, 46.623951685398) - (10.20329313154, 46.623951685398) - (10.20329313154, 46.619251179103) - (10.207993637835, 46.619251179103) - (10.21269414413, 46.619251179103) - (10.217394650425, 46.619251179103) - (10.217394650425, 46.623951685398) - (10.222095156721, 46.623951685398) - (10.222095156721, 46.628652191693) - (10.226795663016, 46.628652191693) - (10.231496169311, 46.628652191693) - (10.231496169311, 46.633352697988) - (10.236196675606, 46.633352697988) - (10.240897181901, 46.633352697988) - (10.240897181901, 46.628652191693) - (10.240897181901, 46.623951685398) - (10.245597688197, 46.623951685398) - (10.245597688197, 46.619251179103) - (10.250298194492, 46.619251179103) - (10.250298194492, 46.614550672808) - (10.254998700787, 46.614550672808) - (10.254998700787, 46.609850166512) - (10.254998700787, 46.605149660217) - (10.254998700787, 46.600449153922) - (10.250298194492, 46.600449153922) - (10.245597688197, 46.600449153922) - (10.245597688197, 46.595748647627) - (10.245597688197, 46.591048141331) - (10.245597688197, 46.586347635036) - (10.245597688197, 46.581647128741) - (10.245597688197, 46.576946622446) - (10.245597688197, 46.572246116151) - (10.250298194492, 46.572246116151) - (10.254998700787, 46.572246116151) - (10.259699207082, 46.572246116151) - (10.259699207082, 46.576946622446) - (10.264399713378, 46.576946622446) - (10.269100219673, 46.576946622446) - (10.273800725968, 46.576946622446) - (10.273800725968, 46.572246116151) - (10.278501232263, 46.572246116151) - (10.283201738558, 46.572246116151) - (10.283201738558, 46.567545609855) - (10.287902244854, 46.567545609855) - (10.287902244854, 46.56284510356) - (10.292602751149, 46.56284510356) - (10.292602751149, 46.558144597265) - (10.297303257444, 46.558144597265) - (10.297303257444, 46.55344409097) - (10.297303257444, 46.548743584675) - (10.302003763739, 46.548743584675) - (10.306704270034, 46.548743584675) - (10.31140477633, 46.548743584675) - (10.316105282625, 46.548743584675) - (10.32080578892, 46.548743584675) - (10.325506295215, 46.548743584675) - (10.330206801511, 46.548743584675) - (10.334907307806, 46.548743584675) - (10.334907307806, 46.544043078379) - (10.339607814101, 46.544043078379) - (10.344308320396, 46.544043078379) - (10.344308320396, 46.548743584675) - (10.349008826691, 46.548743584675) - (10.349008826691, 46.55344409097) - (10.353709332987, 46.55344409097) - (10.358409839282, 46.55344409097) - (10.363110345577, 46.55344409097) - (10.367810851872, 46.55344409097) - (10.372511358167, 46.55344409097) - (10.377211864463, 46.55344409097) - (10.377211864463, 46.548743584675) - (10.381912370758, 46.548743584675) - (10.386612877053, 46.548743584675) - (10.391313383348, 46.548743584675) - (10.391313383348, 46.544043078379) - (10.396013889644, 46.544043078379) - (10.400714395939, 46.544043078379) - (10.405414902234, 46.544043078379) - (10.405414902234, 46.548743584675) - (10.410115408529, 46.548743584675) - (10.414815914824, 46.548743584675) - (10.41951642112, 46.548743584675) - (10.424216927415, 46.548743584675) - (10.424216927415, 46.544043078379) - (10.42891743371, 46.544043078379) - (10.42891743371, 46.539342572084) - (10.433617940005, 46.539342572084) - (10.4383184463, 46.539342572084) - (10.4383184463, 46.534642065789) - (10.443018952596, 46.534642065789) - (10.447719458891, 46.534642065789) - (10.452419965186, 46.534642065789) - (10.457120471481, 46.534642065789) - (10.461820977777, 46.534642065789) - (10.461820977777, 46.539342572084) - (10.461820977777, 46.544043078379) - (10.466521484072, 46.544043078379) - (10.471221990367, 46.544043078379) - (10.471221990367, 46.548743584675) - (10.471221990367, 46.55344409097) - (10.475922496662, 46.55344409097) - (10.475922496662, 46.558144597265) - (10.475922496662, 46.56284510356) - (10.475922496662, 46.567545609855) - (10.475922496662, 46.572246116151) - (10.480623002957, 46.572246116151) - (10.480623002957, 46.576946622446) - (10.485323509253, 46.576946622446) - (10.485323509253, 46.581647128741) - (10.485323509253, 46.586347635036) - (10.485323509253, 46.591048141331) - (10.485323509253, 46.595748647627) - (10.485323509253, 46.600449153922) - (10.485323509253, 46.605149660217) - (10.490024015548, 46.605149660217) - (10.490024015548, 46.609850166512) - (10.490024015548, 46.614550672808) - (10.485323509253, 46.614550672808) - (10.485323509253, 46.619251179103) - (10.480623002957, 46.619251179103) - (10.480623002957, 46.623951685398) - (10.475922496662, 46.623951685398) - (10.471221990367, 46.623951685398) - (10.471221990367, 46.628652191693) - (10.466521484072, 46.628652191693) - (10.461820977777, 46.628652191693) - (10.461820977777, 46.633352697988) - (10.457120471481, 46.633352697988) - (10.452419965186, 46.633352697988) - (10.452419965186, 46.638053204284) - (10.447719458891, 46.638053204284) - (10.443018952596, 46.638053204284) - (10.4383184463, 46.638053204284) - (10.433617940005, 46.638053204284) - (10.42891743371, 46.638053204284) - (10.424216927415, 46.638053204284) - (10.41951642112, 46.638053204284) - (10.414815914824, 46.638053204284) - (10.410115408529, 46.638053204284) - (10.405414902234, 46.638053204284) - (10.400714395939, 46.638053204284) - (10.400714395939, 46.642753710579) - (10.396013889644, 46.642753710579) - (10.396013889644, 46.647454216874) - (10.396013889644, 46.652154723169) - (10.391313383348, 46.652154723169) - (10.391313383348, 46.656855229464) - (10.391313383348, 46.66155573576) - (10.391313383348, 46.666256242055) - (10.391313383348, 46.67095674835) - (10.386612877053, 46.67095674835) - (10.386612877053, 46.675657254645) - (10.386612877053, 46.680357760941) - (10.381912370758, 46.680357760941) - (10.381912370758, 46.685058267236) - (10.386612877053, 46.685058267236) - (10.386612877053, 46.689758773531) - (10.391313383348, 46.689758773531) - (10.396013889644, 46.689758773531) - (10.396013889644, 46.694459279826) - (10.396013889644, 46.699159786121) - (10.400714395939, 46.699159786121) - (10.400714395939, 46.703860292417) - (10.405414902234, 46.703860292417) - (10.405414902234, 46.708560798712) - (10.410115408529, 46.708560798712) - (10.414815914824, 46.708560798712) - (10.414815914824, 46.713261305007) - (10.414815914824, 46.717961811302) - (10.414815914824, 46.722662317597) - (10.410115408529, 46.722662317597) - (10.410115408529, 46.727362823893) - (10.405414902234, 46.727362823893) - (10.405414902234, 46.732063330188) - (10.400714395939, 46.732063330188) - (10.400714395939, 46.736763836483) - (10.405414902234, 46.736763836483) - (10.405414902234, 46.741464342778) - (10.410115408529, 46.741464342778) - (10.414815914824, 46.741464342778) - (10.41951642112, 46.741464342778) - (10.41951642112, 46.746164849074) - (10.424216927415, 46.746164849074) - (10.424216927415, 46.750865355369) - (10.42891743371, 46.750865355369) - (10.433617940005, 46.750865355369) - (10.4383184463, 46.750865355369) - (10.4383184463, 46.755565861664) - (10.443018952596, 46.755565861664) - (10.443018952596, 46.760266367959) - (10.443018952596, 46.764966874254) - (10.443018952596, 46.76966738055) - (10.4383184463, 46.76966738055) - (10.4383184463, 46.774367886845) - (10.433617940005, 46.774367886845) - (10.433617940005, 46.77906839314) - (10.42891743371, 46.77906839314) - (10.42891743371, 46.783768899435) - (10.424216927415, 46.783768899435) - (10.424216927415, 46.78846940573) - (10.424216927415, 46.788469405731) - (10.424216927415, 46.793169912026) - (10.42891743371, 46.793169912026) - (10.42891743371, 46.797870418321) - (10.433617940005, 46.797870418321) - (10.4383184463, 46.797870418321) - (10.443018952596, 46.797870418321) - (10.447719458891, 46.797870418321) - (10.447719458891, 46.802570924616) - (10.447719458891, 46.807271430911) - (10.452419965186, 46.807271430911) - (10.452419965186, 46.811971937207) - (10.457120471481, 46.811971937207) - (10.457120471481, 46.816672443502) - (10.457120471481, 46.821372949797) - (10.457120471481, 46.826073456092) - (10.457120471481, 46.830773962387) - (10.461820977777, 46.830773962387) - (10.461820977777, 46.835474468683) - (10.466521484072, 46.835474468683) - (10.466521484072, 46.840174974978) - (10.466521484072, 46.844875481273) - (10.471221990367, 46.844875481273) - (10.471221990367, 46.849575987568) - (10.471221990367, 46.854276493864) - (10.471221990367, 46.858977000159) - (10.466521484072, 46.858977000159) - (10.466521484072, 46.863677506454) - (10.471221990367, 46.863677506454) - (10.471221990367, 46.868378012749) - (10.471221990367, 46.873078519044) - (10.471221990367, 46.87777902534) - (10.471221990367, 46.882479531635) - (10.466521484072, 46.882479531635) - (10.466521484072, 46.88718003793) - (10.471221990367, 46.88718003793) - (10.471221990367, 46.891880544225) - (10.475922496662, 46.891880544225) - (10.475922496662, 46.89658105052) - (10.475922496662, 46.901281556816) - (10.475922496662, 46.905982063111) - (10.480623002957, 46.905982063111) - (10.480623002957, 46.910682569406) - (10.485323509253, 46.910682569406) - (10.485323509253, 46.915383075701) - (10.485323509253, 46.920083581997) - (10.485323509253, 46.924784088292) - (10.490024015548, 46.924784088292) - (10.490024015548, 46.929484594587) - (10.485323509253, 46.929484594587) - (10.485323509253, 46.934185100882) - (10.490024015548, 46.934185100882) - (10.490024015548, 46.938885607177) - (10.485323509253, 46.938885607177) - (10.480623002957, 46.938885607177) - (10.475922496662, 46.938885607177) - (10.475922496662, 46.943586113473) - (10.471221990367, 46.943586113473) - (10.471221990367, 46.948286619768) - (10.466521484072, 46.948286619768) - (10.461820977777, 46.948286619768) - (10.457120471481, 46.948286619768) - (10.457120471481, 46.952987126063) - (10.452419965186, 46.952987126063) - (10.447719458891, 46.952987126063) - (10.443018952596, 46.952987126063) - (10.4383184463, 46.952987126063) - (10.4383184463, 46.957687632358) - (10.433617940005, 46.957687632358) - (10.42891743371, 46.957687632358) - (10.424216927415, 46.957687632358) - (10.424216927415, 46.962388138653) - (10.424216927415, 46.967088644949) - (10.424216927415, 46.971789151244) - (10.42891743371, 46.971789151244) - (10.42891743371, 46.976489657539) - (10.424216927415, 46.976489657539) - (10.424216927415, 46.981190163834) - (10.41951642112, 46.981190163834) - (10.414815914824, 46.981190163834) - (10.410115408529, 46.981190163834) - (10.410115408529, 46.98589067013) - (10.405414902234, 46.98589067013) - (10.405414902234, 46.990591176425) - (10.400714395939, 46.990591176425) - (10.400714395939, 46.99529168272) - (10.396013889644, 46.99529168272) - (10.396013889644, 46.999992189015) - (10.391313383348, 46.999992189015) - (10.386612877053, 46.999992189015) - (10.381912370758, 46.999992189015) - (10.381912370758, 46.99529168272) - (10.377211864463, 46.99529168272) - (10.377211864463, 46.990591176425) - (10.372511358167, 46.990591176425) - (10.367810851872, 46.990591176425) - (10.363110345577, 46.990591176425) - (10.358409839282, 46.990591176425) - (10.353709332987, 46.990591176425) - (10.349008826691, 46.990591176425) - (10.344308320396, 46.990591176425) - (10.344308320396, 46.98589067013) - (10.344308320396, 46.981190163834) - (10.339607814101, 46.981190163834) - (10.339607814101, 46.976489657539) - (10.334907307806, 46.976489657539) - (10.334907307806, 46.971789151244) - (10.334907307806, 46.967088644949) - (10.330206801511, 46.967088644949) - (10.330206801511, 46.962388138653) - (10.330206801511, 46.957687632358) - (10.330206801511, 46.952987126063) - (10.325506295215, 46.952987126063) - (10.32080578892, 46.952987126063) - (10.316105282625, 46.952987126063) - (10.31140477633, 46.952987126063) - (10.31140477633, 46.948286619768) - (10.306704270034, 46.948286619768) - (10.306704270034, 46.943586113473) - (10.306704270034, 46.938885607177) - (10.31140477633, 46.938885607177) - (10.31140477633, 46.934185100882) - (10.316105282625, 46.934185100882) - (10.316105282625, 46.929484594587) - (10.316105282625, 46.924784088292) - (10.31140477633, 46.924784088292) - (10.306704270034, 46.924784088292) - (10.302003763739, 46.924784088292) - (10.297303257444, 46.924784088292) - (10.297303257444, 46.920083581997) - (10.292602751149, 46.920083581997) - (10.292602751149, 46.924784088292) - (10.287902244854, 46.924784088292) - (10.283201738558, 46.924784088292) - (10.278501232263, 46.924784088292) - (10.273800725968, 46.924784088292) - (10.273800725968, 46.929484594587) - (10.269100219673, 46.929484594587) - (10.264399713378, 46.929484594587) - (10.259699207082, 46.929484594587) - (10.254998700787, 46.929484594587) - (10.250298194492, 46.929484594587) - (10.245597688197, 46.929484594587) - (10.240897181901, 46.929484594587) - (10.240897181901, 46.924784088292) - (10.240897181901, 46.920083581997) - (10.240897181901, 46.915383075701) - (10.236196675606, 46.915383075701) - (10.236196675606, 46.910682569406) - (10.236196675606, 46.905982063111) - (10.236196675606, 46.901281556816) - (10.231496169311, 46.901281556816) - (10.231496169311, 46.89658105052) - (10.226795663016, 46.89658105052) - (10.226795663016, 46.891880544225) - (10.226795663016, 46.88718003793) - (10.231496169311, 46.88718003793) - (10.236196675606, 46.88718003793) - (10.236196675606, 46.882479531635) - (10.236196675606, 46.87777902534) - (10.231496169311, 46.87777902534) - (10.231496169311, 46.873078519044) - (10.231496169311, 46.868378012749) - (10.226795663016, 46.868378012749) - (10.222095156721, 46.868378012749) - (10.217394650425, 46.868378012749) - (10.217394650425, 46.863677506454) - (10.21269414413, 46.863677506454) - (10.207993637835, 46.863677506454) - (10.20329313154, 46.863677506454) - (10.198592625244, 46.863677506454) - (10.198592625244, 46.868378012749) - (10.193892118949, 46.868378012749) - (10.193892118949, 46.863677506454) - (10.189191612654, 46.863677506454) - (10.189191612654, 46.858977000159) - (10.184491106359, 46.858977000159) - (10.184491106359, 46.854276493864) - (10.179790600064, 46.854276493864) - (10.175090093768, 46.854276493864) - (10.170389587473, 46.854276493864) - (10.170389587473, 46.849575987568) - (10.165689081178, 46.849575987568) - (10.160988574883, 46.849575987568) - (10.156288068588, 46.849575987568) - (10.151587562292, 46.849575987568) - (10.146887055997, 46.849575987568) - (10.142186549702, 46.849575987568) - (10.137486043407, 46.849575987568) - (10.132785537111, 46.849575987568) - (10.128085030816, 46.849575987568) - (10.123384524521, 46.849575987568) - (10.123384524521, 46.844875481273) - (10.118684018226, 46.844875481273) - (10.113983511931, 46.844875481273) - (10.113983511931, 46.840174974978) - (10.109283005635, 46.840174974978) - (10.10458249934, 46.840174974978) - (10.10458249934, 46.844875481273) - (10.099881993045, 46.844875481273) - (10.099881993045, 46.849575987568) - (10.09518148675, 46.849575987568) - (10.090480980455, 46.849575987568) - (10.090480980455, 46.854276493864) - (10.090480980455, 46.858977000159) - (10.085780474159, 46.858977000159) - (10.081079967864, 46.858977000159) - (10.076379461569, 46.858977000159) - (10.076379461569, 46.863677506454) - (10.071678955274, 46.863677506454) - (10.071678955274, 46.858977000159) - (10.066978448978, 46.858977000159) - (10.066978448978, 46.863677506454) - (10.062277942683, 46.863677506454) - (10.062277942683, 46.858977000159) - (10.057577436388, 46.858977000159) - (10.057577436388, 46.863677506454) - (10.052876930093, 46.863677506454) - (10.052876930093, 46.868378012749) - (10.052876930093, 46.873078519044) - (10.052876930093, 46.87777902534) - (10.048176423798, 46.87777902534) - (10.043475917502, 46.87777902534) - (10.043475917502, 46.882479531635) - (10.038775411207, 46.882479531635) - (10.038775411207, 46.88718003793) - (10.034074904912, 46.88718003793) - (10.029374398617, 46.88718003793) - (10.029374398617, 46.891880544225) - (10.029374398617, 46.89658105052) - (10.024673892322, 46.89658105052) - (10.019973386026, 46.89658105052) - (10.019973386026, 46.901281556816) - (10.015272879731, 46.901281556816) - (10.010572373436, 46.901281556816) - (10.005871867141, 46.901281556816) - (10.001171360845, 46.901281556816) - (9.99647085455, 46.901281556816) - (9.991770348255, 46.901281556816) - (9.98706984196, 46.901281556816) - (9.98706984196, 46.905982063111) - (9.982369335665, 46.905982063111) - (9.982369335665, 46.910682569406) - (9.982369335665, 46.915383075701) - (9.977668829369, 46.915383075701) - (9.972968323074, 46.915383075701) - (9.968267816779, 46.915383075701) - (9.968267816779, 46.910682569406) - (9.963567310484, 46.910682569406) - (9.963567310484, 46.915383075701) - (9.958866804189, 46.915383075701) - (9.954166297893, 46.915383075701) - (9.949465791598, 46.915383075701) - (9.949465791598, 46.910682569406) - (9.944765285303, 46.910682569406) - (9.944765285303, 46.915383075701) - (9.940064779008, 46.915383075701) - (9.935364272712, 46.915383075701) - (9.930663766417, 46.915383075701) - (9.925963260122, 46.915383075701) - (9.925963260122, 46.920083581997) - (9.921262753827, 46.920083581997) - (9.916562247532, 46.920083581997) - (9.916562247532, 46.924784088292) - (9.911861741236, 46.924784088292) - (9.907161234941, 46.924784088292) - (9.902460728646, 46.924784088292) - (9.902460728646, 46.929484594587) - (9.897760222351, 46.929484594587) - (9.893059716056, 46.929484594587) - (9.893059716056, 46.934185100882) - (9.88835920976, 46.934185100882) - (9.883658703465, 46.934185100882) - (9.87895819717, 46.934185100882) - (9.87895819717, 46.938885607177) - (9.87895819717, 46.943586113473) - (9.87895819717, 46.948286619768) - (9.874257690875, 46.948286619768) - (9.874257690875, 46.952987126063) - (9.87895819717, 46.952987126063) - (9.87895819717, 46.957687632358) - (9.874257690875, 46.957687632358) - (9.874257690875, 46.962388138653) - (9.874257690875, 46.967088644949) - (9.874257690875, 46.971789151244) - (9.874257690875, 46.976489657539) - (9.87895819717, 46.976489657539) - (9.883658703465, 46.976489657539) - (9.883658703465, 46.981190163834) - (9.883658703465, 46.98589067013) - (9.88835920976, 46.98589067013) - (9.893059716056, 46.98589067013) - (9.893059716056, 46.990591176425) - (9.88835920976, 46.990591176425) - (9.88835920976, 46.99529168272) - (9.88835920976, 46.999992189015) - (9.883658703465, 46.999992189015) - (9.883658703465, 47.00469269531) - (9.87895819717, 47.00469269531) - (9.874257690875, 47.00469269531) - (9.874257690875, 47.009393201606) - (9.869557184579, 47.009393201606) - (9.869557184579, 47.014093707901) - (9.874257690875, 47.014093707901) - (9.87895819717, 47.014093707901) - (9.87895819717, 47.018794214196) - (9.874257690875, 47.018794214196) - (9.874257690875, 47.023494720491) - (9.869557184579, 47.023494720491) - (9.864856678284, 47.023494720491) - (9.860156171989, 47.023494720491) - (9.860156171989, 47.018794214196) - (9.855455665694, 47.018794214196) - (9.850755159399, 47.018794214196) - (9.850755159399, 47.014093707901) - (9.846054653103, 47.014093707901) - (9.841354146808, 47.014093707901) - (9.836653640513, 47.014093707901) - (9.831953134218, 47.014093707901) - (9.827252627922, 47.014093707901) - (9.827252627922, 47.018794214196) - (9.822552121627, 47.018794214196) - (9.817851615332, 47.018794214196) - (9.817851615332, 47.023494720491) - (9.813151109037, 47.023494720491) - (9.808450602742, 47.023494720491) - (9.803750096446, 47.023494720491) - (9.803750096446, 47.028195226786) - (9.799049590151, 47.028195226786) - (9.794349083856, 47.028195226786) - (9.794349083856, 47.032895733082) - (9.789648577561, 47.032895733082) - (9.789648577561, 47.037596239377) - (9.784948071266, 47.037596239377) - (9.78024756497, 47.037596239377) - (9.775547058675, 47.037596239377) - (9.77084655238, 47.037596239377) - (9.766146046085, 47.037596239377) - (9.761445539789, 47.037596239377) - (9.756745033494, 47.037596239377) - (9.752044527199, 47.037596239377) - (9.747344020904, 47.037596239377) - (9.747344020904, 47.042296745672) - (9.742643514609, 47.042296745672) - (9.737943008313, 47.042296745672) - (9.733242502018, 47.042296745672) - (9.728541995723, 47.042296745672) - (9.723841489428, 47.042296745672) - (9.719140983133, 47.042296745672) - (9.719140983133, 47.046997251967) - (9.714440476837, 47.046997251967) - (9.709739970542, 47.046997251967) - (9.705039464247, 47.046997251967) - (9.705039464247, 47.051697758263) - (9.700338957952, 47.051697758263) - (9.695638451656, 47.051697758263) - (9.690937945361, 47.051697758263) - (9.690937945361, 47.056398264558) - (9.686237439066, 47.056398264558) - (9.681536932771, 47.056398264558) - (9.681536932771, 47.061098770853) - (9.676836426476, 47.061098770853) - (9.67213592018, 47.061098770853) - (9.667435413885, 47.061098770853) - (9.66273490759, 47.061098770853) - (9.66273490759, 47.056398264558) - (9.658034401295, 47.056398264558) - (9.653333895, 47.056398264558) - (9.653333895, 47.061098770853) - (9.648633388704, 47.061098770853) - (9.643932882409, 47.061098770853) - (9.643932882409, 47.056398264558) - (9.639232376114, 47.056398264558) - (9.639232376114, 47.051697758263) - (9.634531869819, 47.051697758263) - (9.629831363523, 47.051697758263) - (9.625130857228, 47.051697758263) - (9.620430350933, 47.051697758263) - (9.615729844638, 47.051697758263) - (9.615729844638, 47.056398264558) - (9.611029338343, 47.056398264558) - (9.611029338343, 47.061098770853) - (9.606328832047, 47.061098770853) - (9.601628325752, 47.061098770853) - (9.596927819457, 47.061098770853) - (9.596927819457, 47.056398264558) - (9.592227313162, 47.056398264558) - (9.587526806867, 47.056398264558) - (9.582826300571, 47.056398264558) - (9.582826300571, 47.051697758263) - (9.578125794276, 47.051697758263) - (9.573425287981, 47.051697758263) - (9.568724781686, 47.051697758263) - (9.56402427539, 47.051697758263) - (9.559323769095, 47.051697758263) - (9.559323769095, 47.046997251967) - (9.5546232628, 47.046997251967) - (9.5546232628, 47.051697758263) - (9.5546232628, 47.056398264558) - (9.549922756505, 47.056398264558) - (9.549922756505, 47.061098770853) - (9.54522225021, 47.061098770853) - (9.54522225021, 47.065799277148) - (9.540521743914, 47.065799277148) - (9.535821237619, 47.065799277148) - (9.531120731324, 47.065799277148) - (9.531120731324, 47.061098770853) - (9.526420225029, 47.061098770853) - (9.521719718733, 47.061098770853) - (9.517019212438, 47.061098770853) - (9.517019212438, 47.056398264558) - (9.512318706143, 47.056398264558) - (9.507618199848, 47.056398264558) - (9.502917693553, 47.056398264558) - (9.498217187257, 47.056398264558) - (9.493516680962, 47.056398264558) - (9.488816174667, 47.056398264558) - (9.488816174667, 47.051697758263) - (9.484115668372, 47.051697758263) - (9.484115668372, 47.056398264558) - (9.479415162077, 47.056398264558) - (9.474714655781, 47.056398264558) - (9.474714655781, 47.061098770853) - (9.474714655781, 47.065799277148) - (9.479415162077, 47.065799277148) - (9.479415162077, 47.070499783443) - (9.484115668372, 47.070499783443) - (9.488816174667, 47.070499783443) - (9.488816174667, 47.075200289739) - (9.493516680962, 47.075200289739) - (9.498217187257, 47.075200289739) - (9.498217187257, 47.079900796034) - (9.502917693553, 47.079900796034) - (9.507618199848, 47.079900796034) - (9.507618199848, 47.084601302329) - (9.512318706143, 47.084601302329) - (9.517019212438, 47.084601302329) - (9.517019212438, 47.089301808624) - (9.517019212438, 47.094002314919) - (9.517019212438, 47.09400231492) - (9.517019212438, 47.098702821215) - (9.521719718733, 47.098702821215) - (9.521719718733, 47.10340332751) - (9.521719718733, 47.108103833805) - (9.517019212438, 47.108103833805) - (9.517019212438, 47.1128043401) - (9.517019212438, 47.117504846396) - (9.517019212438, 47.122205352691) - (9.512318706143, 47.122205352691) - (9.512318706143, 47.126905858986) - (9.512318706143, 47.131606365281) - (9.512318706143, 47.136306871576) - (9.507618199848, 47.136306871576) - (9.507618199848, 47.141007377872) - (9.507618199848, 47.145707884167) - (9.502917693553, 47.145707884167) - (9.502917693553, 47.150408390462) - (9.498217187257, 47.150408390462) - (9.498217187257, 47.155108896757) - (9.493516680962, 47.155108896757) - (9.493516680962, 47.159809403053) - (9.493516680962, 47.164509909348) - (9.488816174667, 47.164509909348) - (9.488816174667, 47.169210415643) - (9.488816174667, 47.173910921938) - (9.488816174667, 47.178611428233) - (9.484115668372, 47.178611428233) - (9.484115668372, 47.183311934529) - (9.488816174667, 47.183311934529) - (9.488816174667, 47.188012440824) - (9.488816174667, 47.192712947119) - (9.488816174667, 47.197413453414) - (9.493516680962, 47.197413453414) - (9.493516680962, 47.202113959709) - (9.493516680962, 47.206814466005) - (9.498217187257, 47.206814466005) - (9.498217187257, 47.2115149723) - (9.498217187257, 47.216215478595) - (9.502917693553, 47.216215478595) - (9.502917693553, 47.22091598489) - (9.502917693553, 47.225616491186) - (9.507618199848, 47.225616491186) - (9.507618199848, 47.230316997481) - (9.512318706143, 47.230316997481) - (9.512318706143, 47.235017503776) - (9.517019212438, 47.235017503776) - (9.517019212438, 47.239718010071) - (9.517019212438, 47.244418516366) - (9.521719718733, 47.244418516366) - (9.521719718733, 47.249119022662) - (9.521719718733, 47.253819528957) - (9.526420225029, 47.253819528957) - (9.526420225029, 47.258520035252) - (9.526420225029, 47.263220541547) - (9.531120731324, 47.263220541547) - (9.531120731324, 47.267921047842) - (9.531120731324, 47.272621554138) - (9.535821237619, 47.272621554138) - (9.535821237619, 47.277322060433) - (9.540521743914, 47.277322060433) - (9.54522225021, 47.277322060433) - (9.54522225021, 47.282022566728) - (9.549922756505, 47.282022566728) - (9.549922756505, 47.286723073023) - (9.5546232628, 47.286723073023) - (9.5546232628, 47.291423579319) - (9.5546232628, 47.296124085614) - (9.5546232628, 47.300824591909) - (9.559323769095, 47.300824591909) - (9.56402427539, 47.300824591909) - (9.56402427539, 47.305525098204) - (9.568724781686, 47.305525098204) - (9.573425287981, 47.305525098204) - (9.573425287981, 47.310225604499) - (9.578125794276, 47.310225604499) - (9.582826300571, 47.310225604499) - (9.582826300571, 47.314926110795) - (9.587526806867, 47.314926110795) - (9.587526806867, 47.31962661709) - (9.592227313162, 47.31962661709) - (9.592227313162, 47.324327123385) - (9.592227313162, 47.32902762968) - (9.592227313162, 47.333728135975) - (9.596927819457, 47.333728135975) - (9.596927819457, 47.338428642271) - (9.596927819457, 47.343129148566) - (9.601628325752, 47.343129148566) - (9.601628325752, 47.347829654861) - (9.606328832047, 47.347829654861) - (9.606328832047, 47.352530161156) - (9.611029338343, 47.352530161156) - (9.611029338343, 47.357230667452) - (9.615729844638, 47.357230667452) - (9.615729844638, 47.361931173747) - (9.620430350933, 47.361931173747) - (9.620430350933, 47.366631680042) - (9.625130857228, 47.366631680042) - (9.629831363523, 47.366631680042) - (9.634531869819, 47.366631680042) - (9.639232376114, 47.366631680042) - (9.643932882409, 47.366631680042) - (9.648633388704, 47.366631680042) - (9.653333895, 47.366631680042) - (9.658034401295, 47.366631680042) - (9.658034401295, 47.371332186337) - (9.66273490759, 47.371332186337) - (9.667435413885, 47.371332186337) - (9.667435413885, 47.376032692632) - (9.67213592018, 47.376032692632) - (9.67213592018, 47.380733198928) - (9.67213592018, 47.385433705223) - (9.67213592018, 47.390134211518) - (9.67213592018, 47.394834717813) - (9.667435413885, 47.394834717813) - (9.66273490759, 47.394834717813) - (9.66273490759, 47.399535224108) - (9.658034401295, 47.399535224108) - (9.658034401295, 47.404235730404) - (9.653333895, 47.404235730404) - (9.653333895, 47.408936236699) - (9.653333895, 47.413636742994) - (9.653333895, 47.418337249289) - (9.648633388704, 47.418337249289) - (9.648633388704, 47.423037755585) - (9.648633388704, 47.42773826188) - (9.643932882409, 47.42773826188) - (9.643932882409, 47.432438768175) - (9.643932882409, 47.43713927447) - (9.648633388704, 47.43713927447) - (9.648633388704, 47.441839780765) - (9.653333895, 47.441839780765) - (9.653333895, 47.446540287061) - (9.658034401295, 47.446540287061) - (9.658034401295, 47.451240793356) - (9.658034401295, 47.455941299651) - (9.653333895, 47.455941299651) - (9.648633388704, 47.455941299651) - (9.643932882409, 47.455941299651) - (9.639232376114, 47.455941299651) - (9.634531869819, 47.455941299651) - (9.629831363523, 47.455941299651) - (9.625130857228, 47.455941299651) - (9.620430350933, 47.455941299651) - (9.620430350933, 47.460641805946) - (9.615729844638, 47.460641805946) - (9.615729844638, 47.465342312242) - (9.611029338343, 47.465342312242) - (9.611029338343, 47.470042818537) - (9.606328832047, 47.470042818537) - (9.606328832047, 47.465342312242) - (9.606328832047, 47.460641805946) - (9.601628325752, 47.460641805946) - (9.596927819457, 47.460641805946) - (9.596927819457, 47.465342312242) - (9.592227313162, 47.465342312242) - (9.592227313162, 47.470042818537) - (9.587526806867, 47.470042818537) - (9.587526806867, 47.474743324832) - (9.587526806867, 47.479443831127) - (9.582826300571, 47.479443831127) - (9.582826300571, 47.484144337422) - (9.578125794276, 47.484144337422) - (9.578125794276, 47.488844843718) - (9.573425287981, 47.488844843718) - (9.568724781686, 47.488844843718) - (9.568724781686, 47.493545350013) - (9.56402427539, 47.493545350013) - (9.56402427539, 47.498245856308) - (9.559323769095, 47.498245856308) - (9.559323769095, 47.502946362603) - (9.559323769095, 47.507646868898) - (9.559323769095, 47.512347375194) - (9.559323769095, 47.517047881489) - (9.5546232628, 47.517047881489) - (9.5546232628, 47.521748387784) - (9.5546232628, 47.526448894079) - (9.5546232628, 47.531149400375) - (9.549922756505, 47.531149400375) - (9.549922756505, 47.53584990667) - (9.54522225021, 47.53584990667) - (9.540521743914, 47.53584990667) - (9.535821237619, 47.53584990667) - (9.531120731324, 47.53584990667) - (9.526420225029, 47.53584990667) - (9.521719718733, 47.53584990667) - (9.517019212438, 47.53584990667) - (9.512318706143, 47.53584990667) - (9.512318706143, 47.540550412965) - (9.507618199848, 47.540550412965) - (9.507618199848, 47.54525091926) - (9.502917693553, 47.54525091926) - (9.502917693553, 47.549951425555) - (9.498217187257, 47.549951425555) - (9.498217187257, 47.554651931851) - (9.493516680962, 47.554651931851) - (9.493516680962, 47.559352438146) - (9.488816174667, 47.559352438146) - (9.484115668372, 47.559352438146) - (9.484115668372, 47.564052944441) - (9.479415162077, 47.564052944441) - (9.479415162077, 47.568753450736) - (9.474714655781, 47.568753450736) - (9.474714655781, 47.573453957031) - (9.470014149486, 47.573453957031) - (9.470014149486, 47.578154463327) - (9.465313643191, 47.578154463327) - (9.465313643191, 47.582854969622) - (9.460613136896, 47.582854969622) - (9.460613136896, 47.587555475917) - (9.4559126306, 47.587555475917) - (9.451212124305, 47.587555475917) - (9.451212124305, 47.592255982212) - (9.44651161801, 47.592255982212) - (9.44651161801, 47.596956488508) - (9.441811111715, 47.596956488508) - (9.43711060542, 47.596956488508) - (9.432410099124, 47.596956488508) - (9.432410099124, 47.601656994803) - (9.427709592829, 47.601656994803) - (9.423009086534, 47.601656994803) - (9.418308580239, 47.601656994803) - (9.418308580239, 47.606357501098) - (9.413608073944, 47.606357501098) - (9.408907567648, 47.606357501098) - (9.404207061353, 47.606357501098) - (9.404207061353, 47.611058007393) - (9.399506555058, 47.611058007393) - (9.394806048763, 47.611058007393) - (9.390105542467, 47.611058007393) - (9.390105542467, 47.615758513688) - (9.385405036172, 47.615758513688) - (9.380704529877, 47.615758513688) - (9.376004023582, 47.615758513688) - (9.376004023582, 47.620459019984) - (9.371303517287, 47.620459019984) - (9.366603010991, 47.620459019984) - (9.366603010991, 47.625159526279) - (9.361902504696, 47.625159526279) - (9.357201998401, 47.625159526279) - (9.352501492106, 47.625159526279) - (9.352501492106, 47.629860032574) - (9.347800985811, 47.629860032574) - (9.343100479515, 47.629860032574) - (9.33839997322, 47.629860032574) - (9.33839997322, 47.634560538869) - (9.333699466925, 47.634560538869) - (9.32899896063, 47.634560538869) - (9.324298454334, 47.634560538869) - (9.324298454334, 47.639261045164) - (9.319597948039, 47.639261045164) - (9.314897441744, 47.639261045164) - (9.310196935449, 47.639261045164) - (9.310196935449, 47.64396155146) - (9.305496429154, 47.64396155146) - (9.300795922858, 47.64396155146) - (9.296095416563, 47.64396155146) - (9.296095416563, 47.648662057755) - (9.291394910268, 47.648662057755) - (9.286694403973, 47.648662057755) - (9.281993897678, 47.648662057755) - (9.281993897678, 47.65336256405) - (9.277293391382, 47.65336256405) - (9.272592885087, 47.65336256405) - (9.267892378792, 47.65336256405) - (9.267892378792, 47.658063070345) - (9.263191872497, 47.658063070345) - (9.258491366201, 47.658063070345) - (9.253790859906, 47.658063070345) - (9.249090353611, 47.658063070345) - (9.244389847316, 47.658063070345) - (9.239689341021, 47.658063070345) - (9.234988834725, 47.658063070345) - (9.23028832843, 47.658063070345) - (9.225587822135, 47.658063070345) - (9.22088731584, 47.658063070345) - (9.216186809544, 47.658063070345) - (9.211486303249, 47.658063070345) - (9.206785796954, 47.658063070345) - (9.206785796954, 47.65336256405) - (9.202085290659, 47.65336256405) - (9.202085290659, 47.658063070345) - (9.197384784364, 47.658063070345) - (9.192684278068, 47.658063070345) - (9.187983771773, 47.658063070345) - (9.183283265478, 47.658063070345) - (9.178582759183, 47.658063070345) - (9.178582759183, 47.65336256405) - (9.173882252888, 47.65336256405) - (9.169181746592, 47.65336256405) - (9.169181746592, 47.658063070345) - (9.164481240297, 47.658063070345) - (9.164481240297, 47.662763576641) - (9.159780734002, 47.662763576641) - (9.159780734002, 47.667464082936) - (9.155080227707, 47.667464082936) - (9.150379721411, 47.667464082936) - (9.145679215116, 47.667464082936) - (9.145679215116, 47.662763576641) - (9.140978708821, 47.662763576641) - (9.136278202526, 47.662763576641) - (9.136278202526, 47.667464082936) - (9.131577696231, 47.667464082936) - (9.126877189935, 47.667464082936) - (9.12217668364, 47.667464082936) - (9.117476177345, 47.667464082936) - (9.117476177345, 47.672164589231) - (9.11277567105, 47.672164589231) - (9.108075164755, 47.672164589231) - (9.108075164755, 47.676865095526) - (9.103374658459, 47.676865095526) - (9.098674152164, 47.676865095526) - (9.093973645869, 47.676865095526) - (9.089273139574, 47.676865095526) - (9.089273139574, 47.681565601821) - (9.084572633278, 47.681565601821) - (9.084572633278, 47.676865095526) - (9.079872126983, 47.676865095526) - (9.075171620688, 47.676865095526) - (9.075171620688, 47.681565601821) - (9.070471114393, 47.681565601821) - (9.065770608098, 47.681565601821) - (9.061070101802, 47.681565601821) - (9.056369595507, 47.681565601821) - (9.056369595507, 47.686266108117) - (9.051669089212, 47.686266108117) - (9.046968582917, 47.686266108117) - (9.042268076622, 47.686266108117) - (9.037567570326, 47.686266108117) - (9.032867064031, 47.686266108117) - (9.028166557736, 47.686266108117) - (9.023466051441, 47.686266108117) - (9.018765545145, 47.686266108117) - (9.01406503885, 47.686266108117) - (9.009364532555, 47.686266108117) - (9.009364532555, 47.681565601821) - (9.00466402626, 47.681565601821) - (8.999963519965, 47.681565601821) - (8.995263013669, 47.681565601821) - (8.995263013669, 47.676865095526) - (8.990562507374, 47.676865095526) - (8.985862001079, 47.676865095526) - (8.981161494784, 47.676865095526) - (8.981161494784, 47.672164589231) - (8.976460988489, 47.672164589231) - (8.971760482193, 47.672164589231) - (8.971760482193, 47.667464082936) - (8.967059975898, 47.667464082936) - (8.962359469603, 47.667464082936) - (8.962359469603, 47.662763576641) - (8.957658963308, 47.662763576641) - (8.952958457012, 47.662763576641) - (8.952958457012, 47.658063070345) - (8.948257950717, 47.658063070345) - (8.943557444422, 47.658063070345) - (8.938856938127, 47.658063070345) - (8.934156431832, 47.658063070345) - (8.929455925536, 47.658063070345) - (8.929455925536, 47.65336256405) - (8.924755419241, 47.65336256405) - (8.920054912946, 47.65336256405) - (8.915354406651, 47.65336256405) - (8.910653900356, 47.65336256405) - (8.910653900356, 47.648662057755) - (8.90595339406, 47.648662057755) - (8.901252887765, 47.648662057755) - (8.89655238147, 47.648662057755) - (8.891851875175, 47.648662057755) - (8.887151368879, 47.648662057755) - (8.887151368879, 47.65336256405) - (8.882450862584, 47.65336256405) - (8.877750356289, 47.65336256405) - (8.873049849994, 47.65336256405) - (8.873049849994, 47.658063070345) - (8.873049849994, 47.662763576641) - (8.873049849994, 47.667464082936) - (8.873049849994, 47.672164589231) - (8.868349343699, 47.672164589231) - (8.868349343699, 47.676865095526) - (8.863648837403, 47.676865095526) - (8.863648837403, 47.681565601821) - (8.858948331108, 47.681565601821) - (8.854247824813, 47.681565601821) - (8.849547318518, 47.681565601821) - (8.849547318518, 47.686266108117) - (8.854247824813, 47.686266108117) - (8.854247824813, 47.690966614412) - (8.858948331108, 47.690966614412) - (8.858948331108, 47.695667120707) - (8.863648837403, 47.695667120707) - (8.868349343699, 47.695667120707) - (8.873049849994, 47.695667120707) - (8.873049849994, 47.700367627002) - (8.873049849994, 47.705068133297) - (8.868349343699, 47.705068133297) - (8.863648837403, 47.705068133297) - (8.858948331108, 47.705068133297) - (8.854247824813, 47.705068133297) - (8.849547318518, 47.705068133297) - (8.844846812222, 47.705068133297) - (8.844846812222, 47.709768639593) - (8.844846812222, 47.714469145888) - (8.840146305927, 47.714469145888) - (8.835445799632, 47.714469145888) - (8.830745293337, 47.714469145888) - (8.830745293337, 47.709768639593) - (8.826044787042, 47.709768639593) - (8.821344280746, 47.709768639593) - (8.821344280746, 47.714469145888) - (8.826044787042, 47.714469145888) - (8.826044787042, 47.719169652183) - (8.821344280746, 47.719169652183) - (8.816643774451, 47.719169652183) - (8.816643774451, 47.723870158478) - (8.811943268156, 47.723870158478) - (8.807242761861, 47.723870158478) - (8.807242761861, 47.728570664774) - (8.811943268156, 47.728570664774) - (8.811943268156, 47.733271171069) - (8.807242761861, 47.733271171069) - (8.807242761861, 47.737971677364) - (8.802542255566, 47.737971677364) - (8.79784174927, 47.737971677364) - (8.79784174927, 47.733271171069) - (8.79784174927, 47.728570664774) - (8.793141242975, 47.728570664774) - (8.78844073668, 47.728570664774) - (8.783740230385, 47.728570664774) - (8.783740230385, 47.723870158478) - (8.779039724089, 47.723870158478) - (8.774339217794, 47.723870158478) - (8.774339217794, 47.719169652183) - (8.769638711499, 47.719169652183) - (8.769638711499, 47.714469145888) - (8.769638711499, 47.709768639593) - (8.769638711499, 47.705068133297) - (8.774339217794, 47.705068133297) - (8.779039724089, 47.705068133297) - (8.783740230385, 47.705068133297) - (8.78844073668, 47.705068133297) - (8.793141242975, 47.705068133297) - (8.79784174927, 47.705068133297) - (8.79784174927, 47.700367627002) - (8.79784174927, 47.695667120707) - (8.802542255566, 47.695667120707) - (8.807242761861, 47.695667120707) - (8.811943268156, 47.695667120707) - (8.811943268156, 47.690966614412) - (8.807242761861, 47.690966614412) - (8.802542255566, 47.690966614412) - (8.79784174927, 47.690966614412) - (8.79784174927, 47.686266108117) - (8.793141242975, 47.686266108117) - (8.793141242975, 47.681565601821) - (8.793141242975, 47.676865095526) - (8.78844073668, 47.676865095526) - (8.783740230385, 47.676865095526) - (8.779039724089, 47.676865095526) - (8.779039724089, 47.681565601821) - (8.774339217794, 47.681565601821) - (8.769638711499, 47.681565601821) - (8.769638711499, 47.686266108117) - (8.764938205204, 47.686266108117) - (8.760237698909, 47.686266108117) - (8.760237698909, 47.690966614412) - (8.755537192613, 47.690966614412) - (8.750836686318, 47.690966614412) - (8.746136180023, 47.690966614412) - (8.741435673728, 47.690966614412) - (8.736735167433, 47.690966614412) - (8.732034661137, 47.690966614412) - (8.727334154842, 47.690966614412) - (8.727334154842, 47.695667120707) - (8.727334154842, 47.700367627002) - (8.727334154842, 47.705068133297) - (8.732034661137, 47.705068133297) - (8.732034661137, 47.709768639593) - (8.732034661137, 47.714469145888) - (8.736735167433, 47.714469145888) - (8.736735167433, 47.719169652183) - (8.732034661137, 47.719169652183) - (8.727334154842, 47.719169652183) - (8.722633648547, 47.719169652183) - (8.722633648547, 47.723870158478) - (8.717933142252, 47.723870158478) - (8.713232635956, 47.723870158478) - (8.713232635956, 47.728570664774) - (8.713232635956, 47.733271171069) - (8.713232635956, 47.737971677364) - (8.717933142252, 47.737971677364) - (8.717933142252, 47.742672183659) - (8.722633648547, 47.742672183659) - (8.722633648547, 47.747372689954) - (8.727334154842, 47.747372689954) - (8.732034661137, 47.747372689954) - (8.736735167433, 47.747372689954) - (8.741435673728, 47.747372689954) - (8.741435673728, 47.75207319625) - (8.736735167433, 47.75207319625) - (8.736735167433, 47.756773702545) - (8.732034661137, 47.756773702545) - (8.732034661137, 47.76147420884) - (8.727334154842, 47.76147420884) - (8.722633648547, 47.76147420884) - (8.717933142252, 47.76147420884) - (8.717933142252, 47.766174715135) - (8.713232635956, 47.766174715135) - (8.708532129661, 47.766174715135) - (8.708532129661, 47.76147420884) - (8.703831623366, 47.76147420884) - (8.699131117071, 47.76147420884) - (8.699131117071, 47.756773702545) - (8.694430610776, 47.756773702545) - (8.68973010448, 47.756773702545) - (8.68973010448, 47.76147420884) - (8.685029598185, 47.76147420884) - (8.685029598185, 47.766174715135) - (8.685029598185, 47.77087522143) - (8.68973010448, 47.77087522143) - (8.68973010448, 47.775575727726) - (8.685029598185, 47.775575727726) - (8.685029598185, 47.780276234021) - (8.68032909189, 47.780276234021) - (8.68032909189, 47.784976740316) - (8.675628585595, 47.784976740316) - (8.6709280793, 47.784976740316) - (8.6709280793, 47.789677246611) - (8.666227573004, 47.789677246611) - (8.661527066709, 47.789677246611) - (8.656826560414, 47.789677246611) - (8.656826560414, 47.794377752907) - (8.661527066709, 47.794377752907) - (8.661527066709, 47.799078259202) - (8.656826560414, 47.799078259202) - (8.652126054119, 47.799078259202) - (8.647425547823, 47.799078259202) - (8.647425547823, 47.794377752907) - (8.647425547823, 47.789677246611) - (8.647425547823, 47.784976740316) - (8.647425547823, 47.780276234021) - (8.647425547823, 47.775575727726) - (8.652126054119, 47.775575727726) - (8.652126054119, 47.77087522143) - (8.647425547823, 47.77087522143) - (8.647425547823, 47.766174715135) - (8.642725041528, 47.766174715135) - (8.638024535233, 47.766174715135) - (8.638024535233, 47.76147420884) - (8.633324028938, 47.76147420884) - (8.628623522643, 47.76147420884) - (8.623923016347, 47.76147420884) - (8.623923016347, 47.766174715135) - (8.619222510052, 47.766174715135) - (8.619222510052, 47.77087522143) - (8.619222510052, 47.775575727726) - (8.623923016347, 47.775575727726) - (8.623923016347, 47.780276234021) - (8.619222510052, 47.780276234021) - (8.614522003757, 47.780276234021) - (8.614522003757, 47.784976740316) - (8.619222510052, 47.784976740316) - (8.619222510052, 47.789677246611) - (8.619222510052, 47.794377752907) - (8.619222510052, 47.799078259202) - (8.614522003757, 47.799078259202) - (8.609821497462, 47.799078259202) - (8.609821497462, 47.803778765497) - (8.605120991167, 47.803778765497) - (8.600420484871, 47.803778765497) - (8.595719978576, 47.803778765497) - (8.595719978576, 47.799078259202) - (8.591019472281, 47.799078259202) - (8.591019472281, 47.803778765497) - (8.586318965986, 47.803778765497) - (8.58161845969, 47.803778765497) - (8.58161845969, 47.799078259202) - (8.576917953395, 47.799078259202) - (8.5722174471, 47.799078259202) - (8.5722174471, 47.803778765497) - (8.5722174471, 47.808479271792) - (8.567516940805, 47.808479271792) - (8.567516940805, 47.803778765497) - (8.56281643451, 47.803778765497) - (8.56281643451, 47.799078259202) - (8.56281643451, 47.794377752907) - (8.567516940805, 47.794377752907) - (8.567516940805, 47.789677246611) - (8.5722174471, 47.789677246611) - (8.5722174471, 47.784976740316) - (8.576917953395, 47.784976740316) - (8.576917953395, 47.780276234021) - (8.5722174471, 47.780276234021) - (8.567516940805, 47.780276234021) - (8.56281643451, 47.780276234021) - (8.558115928214, 47.780276234021) - (8.558115928214, 47.784976740316) - (8.553415421919, 47.784976740316) - (8.548714915624, 47.784976740316) - (8.548714915624, 47.780276234021) - (8.544014409329, 47.780276234021) - (8.539313903033, 47.780276234021) - (8.534613396738, 47.780276234021) - (8.529912890443, 47.780276234021) - (8.529912890443, 47.775575727726) - (8.525212384148, 47.775575727726) - (8.520511877853, 47.775575727726) - (8.520511877853, 47.77087522143) - (8.515811371557, 47.77087522143) - (8.515811371557, 47.775575727726) - (8.511110865262, 47.775575727726) - (8.506410358967, 47.775575727726) - (8.501709852672, 47.775575727726) - (8.501709852672, 47.77087522143) - (8.497009346377, 47.77087522143) - (8.492308840081, 47.77087522143) - (8.487608333786, 47.77087522143) - (8.482907827491, 47.77087522143) - (8.482907827491, 47.766174715135) - (8.478207321196, 47.766174715135) - (8.4735068149, 47.766174715135) - (8.4735068149, 47.76147420884) - (8.468806308605, 47.76147420884) - (8.468806308605, 47.756773702545) - (8.468806308605, 47.75207319625) - (8.46410580231, 47.75207319625) - (8.459405296015, 47.75207319625) - (8.459405296015, 47.747372689954) - (8.45470478972, 47.747372689954) - (8.45470478972, 47.742672183659) - (8.45470478972, 47.737971677364) - (8.450004283424, 47.737971677364) - (8.450004283424, 47.733271171069) - (8.450004283424, 47.728570664774) - (8.45470478972, 47.728570664774) - (8.45470478972, 47.723870158478) - (8.450004283424, 47.723870158478) - (8.445303777129, 47.723870158478) - (8.440603270834, 47.723870158478) - (8.440603270834, 47.719169652183) - (8.435902764539, 47.719169652183) - (8.435902764539, 47.714469145888) - (8.431202258244, 47.714469145888) - (8.431202258244, 47.709768639593) - (8.426501751948, 47.709768639593) - (8.421801245653, 47.709768639593) - (8.417100739358, 47.709768639593) - (8.412400233063, 47.709768639593) - (8.412400233063, 47.705068133297) - (8.412400233063, 47.700367627002) - (8.407699726767, 47.700367627002) - (8.402999220472, 47.700367627002) - (8.402999220472, 47.695667120707) - (8.407699726767, 47.695667120707) - (8.412400233063, 47.695667120707) - (8.412400233063, 47.690966614412) - (8.417100739358, 47.690966614412) - (8.417100739358, 47.686266108117) - (8.421801245653, 47.686266108117) - (8.421801245653, 47.681565601821) - (8.417100739358, 47.681565601821) - (8.412400233063, 47.681565601821) - (8.412400233063, 47.676865095526) - (8.407699726767, 47.676865095526) - (8.407699726767, 47.672164589231) - (8.407699726767, 47.667464082936) - (8.412400233063, 47.667464082936) - (8.417100739358, 47.667464082936) - (8.421801245653, 47.667464082936) - (8.426501751948, 47.667464082936) - (8.426501751948, 47.662763576641) - (8.431202258244, 47.662763576641) - (8.431202258244, 47.658063070345) - (8.435902764539, 47.658063070345) - (8.440603270834, 47.658063070345) - (8.440603270834, 47.65336256405) - (8.445303777129, 47.65336256405) - (8.450004283424, 47.65336256405) - (8.45470478972, 47.65336256405) - (8.459405296015, 47.65336256405) - (8.46410580231, 47.65336256405) - (8.46410580231, 47.648662057755) - (8.46410580231, 47.64396155146) - (8.468806308605, 47.64396155146) - (8.468806308605, 47.639261045164) - (8.4735068149, 47.639261045164) - (8.478207321196, 47.639261045164) - (8.478207321196, 47.64396155146) - (8.478207321196, 47.648662057755) - (8.482907827491, 47.648662057755) - (8.482907827491, 47.64396155146) - (8.487608333786, 47.64396155146) - (8.492308840081, 47.64396155146) - (8.497009346377, 47.64396155146) - (8.497009346377, 47.648662057755) - (8.501709852672, 47.648662057755) - (8.506410358967, 47.648662057755) - (8.511110865262, 47.648662057755) - (8.515811371557, 47.648662057755) - (8.520511877853, 47.648662057755) - (8.520511877853, 47.64396155146) - (8.525212384148, 47.64396155146) - (8.529912890443, 47.64396155146) - (8.529912890443, 47.648662057755) - (8.529912890443, 47.65336256405) - (8.529912890443, 47.658063070345) - (8.525212384148, 47.658063070345) - (8.525212384148, 47.662763576641) - (8.529912890443, 47.662763576641) - (8.534613396738, 47.662763576641) - (8.534613396738, 47.658063070345) - (8.539313903033, 47.658063070345) - (8.539313903033, 47.662763576641) - (8.539313903033, 47.667464082936) - (8.544014409329, 47.667464082936) - (8.548714915624, 47.667464082936) - (8.553415421919, 47.667464082936) - (8.558115928214, 47.667464082936) - (8.56281643451, 47.667464082936) - (8.567516940805, 47.667464082936) - (8.567516940805, 47.662763576641) - (8.5722174471, 47.662763576641) - (8.576917953395, 47.662763576641) - (8.58161845969, 47.662763576641) - (8.586318965986, 47.662763576641) - (8.586318965986, 47.667464082936) - (8.591019472281, 47.667464082936) - (8.595719978576, 47.667464082936) - (8.595719978576, 47.672164589231) - (8.600420484871, 47.672164589231) - (8.605120991167, 47.672164589231) - (8.605120991167, 47.667464082936) - (8.609821497462, 47.667464082936) - (8.609821497462, 47.662763576641) - (8.614522003757, 47.662763576641) - (8.619222510052, 47.662763576641) - (8.619222510052, 47.658063070345) - (8.623923016347, 47.658063070345) - (8.628623522643, 47.658063070345) - (8.628623522643, 47.65336256405) - (8.628623522643, 47.648662057755) - (8.628623522643, 47.64396155146) - (8.623923016347, 47.64396155146) - (8.623923016347, 47.639261045164) - (8.619222510052, 47.639261045164) - (8.614522003757, 47.639261045164) - (8.609821497462, 47.639261045164) - (8.605120991167, 47.639261045164) - (8.605120991167, 47.64396155146) - (8.609821497462, 47.64396155146) - (8.614522003757, 47.64396155146) - (8.614522003757, 47.648662057755) - (8.609821497462, 47.648662057755) - (8.609821497462, 47.65336256405) - (8.605120991167, 47.65336256405) - (8.600420484871, 47.65336256405) - (8.600420484871, 47.648662057755) - (8.600420484871, 47.64396155146) - (8.595719978576, 47.64396155146) - (8.595719978576, 47.639261045164) - (8.595719978576, 47.634560538869) - (8.595719978576, 47.629860032574) - (8.600420484871, 47.629860032574) - (8.600420484871, 47.625159526279) - (8.600420484871, 47.620459019984) - (8.605120991167, 47.620459019984) - (8.605120991167, 47.615758513688) - (8.605120991167, 47.611058007393) - (8.600420484871, 47.611058007393) - (8.600420484871, 47.606357501098) - (8.595719978576, 47.606357501098) - (8.591019472281, 47.606357501098) - (8.591019472281, 47.601656994803) - (8.586318965986, 47.601656994803) - (8.586318965986, 47.596956488508) - (8.58161845969, 47.596956488508) - (8.576917953395, 47.596956488508) - (8.5722174471, 47.596956488508) - (8.567516940805, 47.596956488508) - (8.56281643451, 47.596956488508) - (8.56281643451, 47.601656994803) - (8.56281643451, 47.606357501098) - (8.567516940805, 47.606357501098) - (8.567516940805, 47.611058007393) - (8.5722174471, 47.611058007393) - (8.5722174471, 47.615758513688) - (8.567516940805, 47.615758513688) - (8.567516940805, 47.620459019984) - (8.56281643451, 47.620459019984) - (8.558115928214, 47.620459019984) - (8.558115928214, 47.625159526279) - (8.553415421919, 47.625159526279) - (8.548714915624, 47.625159526279) - (8.544014409329, 47.625159526279) - (8.544014409329, 47.629860032574) - (8.539313903033, 47.629860032574) - (8.534613396738, 47.629860032574) - (8.534613396738, 47.634560538869) - (8.529912890443, 47.634560538869) - (8.525212384148, 47.634560538869) - (8.520511877853, 47.634560538869) - (8.515811371557, 47.634560538869) - (8.515811371557, 47.629860032574) - (8.515811371557, 47.625159526279) - (8.511110865262, 47.625159526279) - (8.511110865262, 47.620459019984) - (8.506410358967, 47.620459019984) - (8.506410358967, 47.615758513688) - (8.501709852672, 47.615758513688) - (8.497009346377, 47.615758513688) - (8.492308840081, 47.615758513688) - (8.487608333786, 47.615758513688) - (8.482907827491, 47.615758513688) - (8.482907827491, 47.611058007393) - (8.478207321196, 47.611058007393) - (8.4735068149, 47.611058007393) - (8.4735068149, 47.606357501098) - (8.468806308605, 47.606357501098) - (8.468806308605, 47.601656994803) - (8.46410580231, 47.601656994803) - (8.459405296015, 47.601656994803) - (8.459405296015, 47.596956488508) - (8.459405296015, 47.592255982212) - (8.459405296015, 47.587555475917) - (8.46410580231, 47.587555475917) - (8.46410580231, 47.582854969622) - (8.468806308605, 47.582854969622) - (8.4735068149, 47.582854969622) - (8.478207321196, 47.582854969622) - (8.478207321196, 47.587555475917) - (8.482907827491, 47.587555475917) - (8.487608333786, 47.587555475917) - (8.492308840081, 47.587555475917) - (8.492308840081, 47.582854969622) - (8.492308840081, 47.578154463327) - (8.487608333786, 47.578154463327) - (8.482907827491, 47.578154463327) - (8.478207321196, 47.578154463327) - (8.478207321196, 47.573453957031) - (8.4735068149, 47.573453957031) - (8.468806308605, 47.573453957031) - (8.46410580231, 47.573453957031) - (8.459405296015, 47.573453957031) - (8.45470478972, 47.573453957031) - (8.45470478972, 47.568753450736) - (8.450004283424, 47.568753450736) - (8.445303777129, 47.568753450736) - (8.440603270834, 47.568753450736) - (8.440603270834, 47.564052944441) - (8.435902764539, 47.564052944441) - (8.431202258244, 47.564052944441) - (8.426501751948, 47.564052944441) - (8.426501751948, 47.568753450736) - (8.421801245653, 47.568753450736) - (8.417100739358, 47.568753450736) - (8.412400233063, 47.568753450736) - (8.412400233063, 47.573453957031) - (8.407699726767, 47.573453957031) - (8.402999220472, 47.573453957031) - (8.402999220472, 47.578154463327) - (8.398298714177, 47.578154463327) - (8.398298714177, 47.573453957031) - (8.393598207882, 47.573453957031) - (8.388897701587, 47.573453957031) - (8.388897701587, 47.568753450736) - (8.384197195291, 47.568753450736) - (8.384197195291, 47.564052944441) - (8.379496688996, 47.564052944441) - (8.379496688996, 47.568753450736) - (8.374796182701, 47.568753450736) - (8.370095676406, 47.568753450736) - (8.365395170111, 47.568753450736) - (8.360694663815, 47.568753450736) - (8.35599415752, 47.568753450736) - (8.351293651225, 47.568753450736) - (8.34659314493, 47.568753450736) - (8.341892638634, 47.568753450736) - (8.337192132339, 47.568753450736) - (8.332491626044, 47.568753450736) - (8.327791119749, 47.568753450736) - (8.327791119749, 47.573453957031) - (8.323090613454, 47.573453957031) - (8.318390107158, 47.573453957031) - (8.318390107158, 47.578154463327) - (8.313689600863, 47.578154463327) - (8.313689600863, 47.582854969622) - (8.308989094568, 47.582854969622) - (8.304288588273, 47.582854969622) - (8.304288588273, 47.587555475917) - (8.299588081978, 47.587555475917) - (8.294887575682, 47.587555475917) - (8.294887575682, 47.592255982212) - (8.294887575682, 47.596956488508) - (8.294887575682, 47.601656994803) - (8.294887575682, 47.606357501098) - (8.294887575682, 47.611058007393) - (8.290187069387, 47.611058007393) - (8.285486563092, 47.611058007393) - (8.280786056797, 47.611058007393) - (8.276085550501, 47.611058007393) - (8.271385044206, 47.611058007393) - (8.266684537911, 47.611058007393) - (8.261984031616, 47.611058007393) - (8.261984031616, 47.615758513688) - (8.257283525321, 47.615758513688) - (8.252583019025, 47.615758513688) - (8.24788251273, 47.615758513688) - (8.24788251273, 47.611058007393) - (8.243182006435, 47.611058007393) - (8.23848150014, 47.611058007393) - (8.233780993844, 47.611058007393) - (8.233780993844, 47.606357501098) - (8.229080487549, 47.606357501098) - (8.224379981254, 47.606357501098) - (8.224379981254, 47.611058007393) - (8.219679474959, 47.611058007393) - (8.219679474959, 47.615758513688) - (8.214978968664, 47.615758513688) - (8.214978968664, 47.620459019984) - (8.210278462368, 47.620459019984) - (8.205577956073, 47.620459019984) - (8.200877449778, 47.620459019984) - (8.196176943483, 47.620459019984) - (8.196176943483, 47.615758513688) - (8.191476437188, 47.615758513688) - (8.191476437188, 47.611058007393) - (8.186775930892, 47.611058007393) - (8.186775930892, 47.606357501098) - (8.182075424597, 47.606357501098) - (8.182075424597, 47.601656994803) - (8.177374918302, 47.601656994803) - (8.172674412007, 47.601656994803) - (8.172674412007, 47.596956488508) - (8.167973905711, 47.596956488508) - (8.167973905711, 47.592255982212) - (8.163273399416, 47.592255982212) - (8.158572893121, 47.592255982212) - (8.158572893121, 47.596956488508) - (8.153872386826, 47.596956488508) - (8.149171880531, 47.596956488508) - (8.144471374235, 47.596956488508) - (8.144471374235, 47.592255982212) - (8.13977086794, 47.592255982212) - (8.13977086794, 47.587555475917) - (8.135070361645, 47.587555475917) - (8.135070361645, 47.582854969622) - (8.13036985535, 47.582854969622) - (8.125669349055, 47.582854969622) - (8.120968842759, 47.582854969622) - (8.116268336464, 47.582854969622) - (8.111567830169, 47.582854969622) - (8.106867323874, 47.582854969622) - (8.106867323874, 47.578154463327) - (8.102166817578, 47.578154463327) - (8.102166817578, 47.573453957031) - (8.102166817578, 47.568753450736) - (8.102166817578, 47.564052944441) - (8.097466311283, 47.564052944441) - (8.097466311283, 47.559352438146) - (8.092765804988, 47.559352438146) - (8.088065298693, 47.559352438146) - (8.083364792398, 47.559352438146) - (8.078664286102, 47.559352438146) - (8.078664286102, 47.564052944441) - (8.073963779807, 47.564052944441) - (8.069263273512, 47.564052944441) - (8.064562767217, 47.564052944441) - (8.059862260922, 47.564052944441) - (8.055161754626, 47.564052944441) - (8.055161754626, 47.559352438146) - (8.050461248331, 47.559352438146) - (8.050461248331, 47.554651931851) - (8.045760742036, 47.554651931851) - (8.041060235741, 47.554651931851) - (8.036359729445, 47.554651931851) - (8.03165922315, 47.554651931851) - (8.03165922315, 47.549951425555) - (8.026958716855, 47.549951425555) - (8.02225821056, 47.549951425555) - (8.017557704265, 47.549951425555) - (8.012857197969, 47.549951425555) - (8.008156691674, 47.549951425555) - (8.008156691674, 47.554651931851) - (8.003456185379, 47.554651931851) - (7.998755679084, 47.554651931851) - (7.994055172789, 47.554651931851) - (7.989354666493, 47.554651931851) - (7.984654160198, 47.554651931851) - (7.979953653903, 47.554651931851) - (7.975253147608, 47.554651931851) - (7.970552641312, 47.554651931851) - (7.965852135017, 47.554651931851) - (7.965852135017, 47.559352438146) - (7.961151628722, 47.559352438146) - (7.961151628722, 47.554651931851) - (7.956451122427, 47.554651931851) - (7.951750616132, 47.554651931851) - (7.951750616132, 47.549951425555) - (7.951750616132, 47.54525091926) - (7.947050109836, 47.54525091926) - (7.942349603541, 47.54525091926) - (7.937649097246, 47.54525091926) - (7.932948590951, 47.54525091926) - (7.928248084656, 47.54525091926) - (7.92354757836, 47.54525091926) - (7.918847072065, 47.54525091926) - (7.918847072065, 47.549951425555) - (7.91414656577, 47.549951425555) - (7.909446059475, 47.549951425555) - (7.909446059475, 47.554651931851) - (7.909446059475, 47.559352438146) - (7.909446059475, 47.564052944441) - (7.909446059475, 47.568753450736) - (7.909446059475, 47.573453957031) - (7.904745553179, 47.573453957031) - (7.904745553179, 47.578154463327) - (7.900045046884, 47.578154463327) - (7.900045046884, 47.582854969622) - (7.895344540589, 47.582854969622) - (7.895344540589, 47.587555475917) - (7.890644034294, 47.587555475917) - (7.885943527999, 47.587555475917) - (7.881243021703, 47.587555475917) - (7.881243021703, 47.592255982212) - (7.876542515408, 47.592255982212) - (7.876542515408, 47.587555475917) - (7.871842009113, 47.587555475917) - (7.867141502818, 47.587555475917) - (7.862440996522, 47.587555475917) - (7.857740490227, 47.587555475917) - (7.857740490227, 47.582854969622) - (7.853039983932, 47.582854969622) - (7.848339477637, 47.582854969622) - (7.843638971342, 47.582854969622) - (7.838938465046, 47.582854969622) - (7.834237958751, 47.582854969622) - (7.834237958751, 47.587555475917) - (7.829537452456, 47.587555475917) - (7.824836946161, 47.587555475917) - (7.820136439866, 47.587555475917) - (7.81543593357, 47.587555475917) - (7.81543593357, 47.582854969622) - (7.81543593357, 47.578154463327) - (7.81543593357, 47.573453957031) - (7.810735427275, 47.573453957031) - (7.810735427275, 47.568753450736) - (7.80603492098, 47.568753450736) - (7.801334414685, 47.568753450736) - (7.801334414685, 47.564052944441) - (7.801334414685, 47.559352438146) - (7.796633908389, 47.559352438146) - (7.791933402094, 47.559352438146) - (7.791933402094, 47.554651931851) - (7.787232895799, 47.554651931851) - (7.782532389504, 47.554651931851) - (7.777831883209, 47.554651931851) - (7.777831883209, 47.549951425555) - (7.773131376913, 47.549951425555) - (7.768430870618, 47.549951425555) - (7.763730364323, 47.549951425555) - (7.759029858028, 47.549951425555) - (7.754329351733, 47.549951425555) - (7.754329351733, 47.54525091926) - (7.749628845437, 47.54525091926) - (7.744928339142, 47.54525091926) - (7.740227832847, 47.54525091926) - (7.735527326552, 47.54525091926) - (7.730826820256, 47.54525091926) - (7.726126313961, 47.54525091926) - (7.721425807666, 47.54525091926) - (7.721425807666, 47.540550412965) - (7.716725301371, 47.540550412965) - (7.712024795076, 47.540550412965) - (7.70732428878, 47.540550412965) - (7.70732428878, 47.53584990667) - (7.702623782485, 47.53584990667) - (7.69792327619, 47.53584990667) - (7.69792327619, 47.531149400375) - (7.693222769895, 47.531149400375) - (7.6885222636, 47.531149400375) - (7.683821757304, 47.531149400375) - (7.679121251009, 47.531149400375) - (7.674420744714, 47.531149400375) - (7.674420744714, 47.53584990667) - (7.669720238419, 47.53584990667) - (7.665019732123, 47.53584990667) - (7.665019732123, 47.540550412965) - (7.660319225828, 47.540550412965) - (7.660319225828, 47.54525091926) - (7.655618719533, 47.54525091926) - (7.650918213238, 47.54525091926) - (7.650918213238, 47.549951425555) - (7.646217706943, 47.549951425555) - (7.646217706943, 47.554651931851) - (7.641517200647, 47.554651931851) - (7.641517200647, 47.559352438146) - (7.636816694352, 47.559352438146) - (7.636816694352, 47.564052944441) - (7.641517200647, 47.564052944441) - (7.646217706943, 47.564052944441) - (7.650918213238, 47.564052944441) - (7.655618719533, 47.564052944441) - (7.660319225828, 47.564052944441) - (7.665019732123, 47.564052944441) - (7.669720238419, 47.564052944441) - (7.674420744714, 47.564052944441) - (7.679121251009, 47.564052944441) - (7.679121251009, 47.568753450736) - (7.683821757304, 47.568753450736) - (7.6885222636, 47.568753450736) - (7.6885222636, 47.573453957031) - (7.683821757304, 47.573453957031) - (7.683821757304, 47.578154463327) - (7.683821757304, 47.582854969622) - (7.679121251009, 47.582854969622) - (7.674420744714, 47.582854969622) - (7.674420744714, 47.587555475917) - (7.674420744714, 47.592255982212) - (7.669720238419, 47.592255982212) - (7.665019732123, 47.592255982212) - (7.660319225828, 47.592255982212) - (7.660319225828, 47.596956488508) - (7.655618719533, 47.596956488508) - (7.650918213238, 47.596956488508) - (7.646217706943, 47.596956488508) - (7.646217706943, 47.592255982212) - (7.641517200647, 47.592255982212) - (7.641517200647, 47.587555475917) - (7.636816694352, 47.587555475917) - (7.632116188057, 47.587555475917) - (7.632116188057, 47.582854969622) - (7.627415681762, 47.582854969622) - (7.627415681762, 47.578154463327) - (7.622715175467, 47.578154463327) - (7.618014669171, 47.578154463327) - (7.613314162876, 47.578154463327) - (7.608613656581, 47.578154463327) - (7.603913150286, 47.578154463327) - (7.603913150286, 47.582854969622) - (7.603913150286, 47.587555475917) - (7.59921264399, 47.587555475917) - (7.594512137695, 47.587555475917) - (7.5898116314, 47.587555475917) - (7.585111125105, 47.587555475917) - (7.585111125105, 47.582854969622) - (7.585111125105, 47.578154463327) - (7.58041061881, 47.578154463327) - (7.575710112514, 47.578154463327) - (7.571009606219, 47.578154463327) - (7.566309099924, 47.578154463327) - (7.561608593629, 47.578154463327) - (7.561608593629, 47.573453957031) - (7.556908087333, 47.573453957031) - (7.556908087333, 47.568753450736) - (7.556908087333, 47.564052944441) - (7.552207581038, 47.564052944441) - (7.547507074743, 47.564052944441) - (7.547507074743, 47.559352438146) - (7.542806568448, 47.559352438146) - (7.538106062153, 47.559352438146) - (7.538106062153, 47.554651931851) - (7.533405555857, 47.554651931851) - (7.528705049562, 47.554651931851) - (7.528705049562, 47.549951425555) - (7.524004543267, 47.549951425555) - (7.519304036972, 47.549951425555) - (7.514603530677, 47.549951425555) - (7.514603530677, 47.54525091926) - (7.509903024381, 47.54525091926) - (7.505202518086, 47.54525091926) - (7.505202518086, 47.540550412965) - (7.500502011791, 47.540550412965) - (7.500502011791, 47.53584990667) - (7.500502011791, 47.531149400375) - (7.505202518086, 47.531149400375) - (7.505202518086, 47.526448894079) - (7.509903024381, 47.526448894079) - (7.509903024381, 47.531149400375) - (7.514603530677, 47.531149400375) - (7.519304036972, 47.531149400375) - (7.524004543267, 47.531149400375) - (7.528705049562, 47.531149400375) - (7.528705049562, 47.526448894079) - (7.528705049562, 47.521748387784) - (7.524004543267, 47.521748387784) - (7.524004543267, 47.517047881489) - (7.519304036972, 47.517047881489) - (7.514603530677, 47.517047881489) - (7.509903024381, 47.517047881489) - (7.505202518086, 47.517047881489) - (7.500502011791, 47.517047881489) - (7.500502011791, 47.512347375194) - (7.505202518086, 47.512347375194) - (7.505202518086, 47.507646868898) - (7.509903024381, 47.507646868898) - (7.509903024381, 47.502946362603) - (7.509903024381, 47.498245856308) - (7.509903024381, 47.493545350013) - (7.505202518086, 47.493545350013) - (7.500502011791, 47.493545350013) - (7.500502011791, 47.488844843718) - (7.495801505496, 47.488844843718) - (7.495801505496, 47.484144337422) - (7.4911009992, 47.484144337422) - (7.486400492905, 47.484144337422) - (7.48169998661, 47.484144337422) - (7.48169998661, 47.479443831127) - (7.476999480315, 47.479443831127) - (7.47229897402, 47.479443831127) - (7.47229897402, 47.484144337422) - (7.467598467724, 47.484144337422) - (7.462897961429, 47.484144337422) - (7.462897961429, 47.488844843718) - (7.458197455134, 47.488844843718) - (7.453496948839, 47.488844843718) - (7.453496948839, 47.493545350013) - (7.448796442544, 47.493545350013) - (7.444095936248, 47.493545350013) - (7.439395429953, 47.493545350013) - (7.439395429953, 47.498245856308) - (7.434694923658, 47.498245856308) - (7.429994417363, 47.498245856308) - (7.429994417363, 47.493545350013) - (7.429994417363, 47.488844843718) - (7.425293911067, 47.488844843718) - (7.425293911067, 47.484144337422) - (7.420593404772, 47.484144337422) - (7.420593404772, 47.479443831127) - (7.425293911067, 47.479443831127) - (7.429994417363, 47.479443831127) - (7.434694923658, 47.479443831127) - (7.439395429953, 47.479443831127) - (7.444095936248, 47.479443831127) - (7.448796442544, 47.479443831127) - (7.448796442544, 47.474743324832) - (7.453496948839, 47.474743324832) - (7.453496948839, 47.470042818537) - (7.453496948839, 47.465342312242) - (7.448796442544, 47.465342312242) - (7.448796442544, 47.460641805946) - (7.444095936248, 47.460641805946) - (7.439395429953, 47.460641805946) - (7.434694923658, 47.460641805946) - (7.429994417363, 47.460641805946) - (7.429994417363, 47.455941299651) - (7.429994417363, 47.451240793356) - (7.425293911067, 47.451240793356) - (7.425293911067, 47.446540287061) - (7.420593404772, 47.446540287061) - (7.415892898477, 47.446540287061) - (7.415892898477, 47.441839780765) - (7.411192392182, 47.441839780765) - (7.406491885887, 47.441839780765) - (7.406491885887, 47.43713927447) - (7.401791379591, 47.43713927447) - (7.397090873296, 47.43713927447) - (7.392390367001, 47.43713927447) - (7.392390367001, 47.432438768175) - (7.387689860706, 47.432438768175) - (7.382989354411, 47.432438768175) - (7.378288848115, 47.432438768175) - (7.37358834182, 47.432438768175) - (7.368887835525, 47.432438768175) - (7.36418732923, 47.432438768175) - (7.359486822934, 47.432438768175) - (7.354786316639, 47.432438768175) - (7.350085810344, 47.432438768175) - (7.350085810344, 47.43713927447) - (7.345385304049, 47.43713927447) - (7.340684797754, 47.43713927447) - (7.335984291458, 47.43713927447) - (7.331283785163, 47.43713927447) - (7.326583278868, 47.43713927447) - (7.321882772573, 47.43713927447) - (7.317182266278, 47.43713927447) - (7.312481759982, 47.43713927447) - (7.312481759982, 47.441839780765) - (7.307781253687, 47.441839780765) - (7.307781253687, 47.43713927447) - (7.303080747392, 47.43713927447) - (7.298380241097, 47.43713927447) - (7.298380241097, 47.432438768175) - (7.293679734801, 47.432438768175) - (7.288979228506, 47.432438768175) - (7.284278722211, 47.432438768175) - (7.279578215916, 47.432438768175) - (7.274877709621, 47.432438768175) - (7.270177203325, 47.432438768175) - (7.270177203325, 47.42773826188) - (7.26547669703, 47.42773826188) - (7.260776190735, 47.42773826188) - (7.260776190735, 47.423037755585) - (7.25607568444, 47.423037755585) - (7.251375178144, 47.423037755585) - (7.246674671849, 47.423037755585) - (7.241974165554, 47.423037755585) - (7.241974165554, 47.42773826188) - (7.241974165554, 47.432438768175) - (7.237273659259, 47.432438768175) - (7.237273659259, 47.43713927447) - (7.232573152964, 47.43713927447) - (7.227872646668, 47.43713927447) - (7.227872646668, 47.441839780765) - (7.223172140373, 47.441839780765) - (7.223172140373, 47.43713927447) - (7.218471634078, 47.43713927447) - (7.213771127783, 47.43713927447) - (7.209070621488, 47.43713927447) - (7.209070621488, 47.432438768175) - (7.204370115192, 47.432438768175) - (7.199669608897, 47.432438768175) - (7.199669608897, 47.43713927447) - (7.194969102602, 47.43713927447) - (7.190268596307, 47.43713927447) - (7.190268596307, 47.441839780765) - (7.185568090011, 47.441839780765) - (7.180867583716, 47.441839780765) - (7.176167077421, 47.441839780765) - (7.171466571126, 47.441839780765) - (7.171466571126, 47.446540287061) - (7.176167077421, 47.446540287061) - (7.176167077421, 47.451240793356) - (7.176167077421, 47.455941299651) - (7.176167077421, 47.460641805946) - (7.176167077421, 47.465342312242) - (7.176167077421, 47.470042818537) - (7.180867583716, 47.470042818537) - (7.180867583716, 47.474743324832) - (7.180867583716, 47.479443831127) - (7.185568090011, 47.479443831127) - (7.185568090011, 47.484144337422) - (7.190268596307, 47.484144337422) - (7.190268596307, 47.488844843718) - (7.194969102602, 47.488844843718) - (7.199669608897, 47.488844843718) - (7.199669608897, 47.493545350013) - (7.194969102602, 47.493545350013) - (7.190268596307, 47.493545350013) - (7.185568090011, 47.493545350013) - (7.180867583716, 47.493545350013) - (7.180867583716, 47.488844843718) - (7.176167077421, 47.488844843718) - (7.171466571126, 47.488844843718) - (7.166766064831, 47.488844843718) - (7.162065558535, 47.488844843718) - (7.162065558535, 47.493545350013) - (7.15736505224, 47.493545350013) - (7.15736505224, 47.498245856308) - (7.152664545945, 47.498245856308) - (7.14796403965, 47.498245856308) - (7.143263533355, 47.498245856308) - (7.143263533355, 47.502946362603) - (7.138563027059, 47.502946362603) - (7.133862520764, 47.502946362603) - (7.129162014469, 47.502946362603) - (7.124461508174, 47.502946362603) - (7.124461508174, 47.498245856308) - (7.119761001878, 47.498245856308) - (7.119761001878, 47.493545350013) - (7.115060495583, 47.493545350013) - (7.110359989288, 47.493545350013) - (7.105659482993, 47.493545350013) - (7.100958976698, 47.493545350013) - (7.096258470402, 47.493545350013) - (7.091557964107, 47.493545350013) - (7.091557964107, 47.488844843718) - (7.086857457812, 47.488844843718) - (7.082156951517, 47.488844843718) - (7.077456445222, 47.488844843718) - (7.072755938926, 47.488844843718) - (7.068055432631, 47.488844843718) - (7.068055432631, 47.493545350013) - (7.063354926336, 47.493545350013) - (7.058654420041, 47.493545350013) - (7.053953913745, 47.493545350013) - (7.04925340745, 47.493545350013) - (7.044552901155, 47.493545350013) - (7.044552901155, 47.498245856308) - (7.03985239486, 47.498245856308) - (7.035151888565, 47.498245856308) - (7.030451382269, 47.498245856308) - (7.030451382269, 47.502946362603) - (7.025750875974, 47.502946362603) - (7.021050369679, 47.502946362603) - (7.016349863384, 47.502946362603) - (7.011649357089, 47.502946362603) - (7.006948850793, 47.502946362603) - (7.002248344498, 47.502946362603) - (7.002248344498, 47.498245856308) - (6.997547838203, 47.498245856308) - (6.992847331908, 47.498245856308) - (6.992847331908, 47.493545350013) - (6.988146825612, 47.493545350013) - (6.988146825612, 47.488844843718) - (6.988146825612, 47.484144337422) - (6.988146825612, 47.479443831127) - (6.988146825612, 47.474743324832) - (6.992847331908, 47.474743324832) - (6.992847331908, 47.470042818537) - (6.992847331908, 47.465342312242) - (6.997547838203, 47.465342312242) - (6.997547838203, 47.470042818537) - (7.002248344498, 47.470042818537) - (7.002248344498, 47.465342312242) - (7.002248344498, 47.460641805946) - (6.997547838203, 47.460641805946) - (6.997547838203, 47.455941299651) - (7.002248344498, 47.455941299651) - (7.002248344498, 47.451240793356) - (6.997547838203, 47.451240793356) - (6.992847331908, 47.451240793356) - (6.988146825612, 47.451240793356) - (6.983446319317, 47.451240793356) - (6.983446319317, 47.446540287061) - (6.978745813022, 47.446540287061) - (6.974045306727, 47.446540287061) - (6.969344800432, 47.446540287061) - (6.969344800432, 47.441839780765) - (6.969344800432, 47.43713927447) - (6.964644294136, 47.43713927447) - (6.959943787841, 47.43713927447) - (6.959943787841, 47.432438768175) - (6.955243281546, 47.432438768175) - (6.955243281546, 47.43713927447) - (6.950542775251, 47.43713927447) - (6.945842268956, 47.43713927447) - (6.945842268956, 47.432438768175) - (6.94114176266, 47.432438768175) - (6.94114176266, 47.42773826188) - (6.94114176266, 47.423037755585) - (6.94114176266, 47.418337249289) - (6.94114176266, 47.413636742994) - (6.94114176266, 47.408936236699) - (6.94114176266, 47.404235730404) - (6.936441256365, 47.404235730404) - (6.93174075007, 47.404235730404) - (6.927040243775, 47.404235730404) - (6.922339737479, 47.404235730404) - (6.917639231184, 47.404235730404) - (6.917639231184, 47.399535224108) - (6.912938724889, 47.399535224108) - (6.912938724889, 47.394834717813) - (6.912938724889, 47.390134211518) - (6.912938724889, 47.385433705223) - (6.908238218594, 47.385433705223) - (6.903537712299, 47.385433705223) - (6.898837206003, 47.385433705223) - (6.898837206003, 47.380733198928) - (6.894136699708, 47.380733198928) - (6.889436193413, 47.380733198928) - (6.889436193413, 47.376032692632) - (6.884735687118, 47.376032692632) - (6.884735687118, 47.371332186337) - (6.884735687118, 47.366631680042) - (6.884735687118, 47.361931173747) - (6.880035180822, 47.361931173747) - (6.880035180822, 47.357230667452) - (6.880035180822, 47.352530161156) - (6.884735687118, 47.352530161156) - (6.889436193413, 47.352530161156) - (6.889436193413, 47.357230667452) - (6.894136699708, 47.357230667452) - (6.898837206003, 47.357230667452) - (6.903537712299, 47.357230667452) - (6.908238218594, 47.357230667452) - (6.912938724889, 47.357230667452) - (6.917639231184, 47.357230667452) - (6.922339737479, 47.357230667452) - (6.927040243775, 47.357230667452) - (6.93174075007, 47.357230667452) - (6.936441256365, 47.357230667452) - (6.94114176266, 47.357230667452) - (6.945842268956, 47.357230667452) - (6.950542775251, 47.357230667452) - (6.955243281546, 47.357230667452) - (6.959943787841, 47.357230667452) - (6.964644294136, 47.357230667452) - (6.964644294136, 47.361931173747) - (6.969344800432, 47.361931173747) - (6.974045306727, 47.361931173747) - (6.978745813022, 47.361931173747) - (6.983446319317, 47.361931173747) - (6.988146825612, 47.361931173747) - (6.992847331908, 47.361931173747) - (6.997547838203, 47.361931173747) - (6.997547838203, 47.366631680042) - (7.002248344498, 47.366631680042) - (7.006948850793, 47.366631680042) - (7.011649357089, 47.366631680042) - (7.011649357089, 47.371332186337) - (7.016349863384, 47.371332186337) - (7.021050369679, 47.371332186337) - (7.025750875974, 47.371332186337) - (7.030451382269, 47.371332186337) - (7.035151888565, 47.371332186337) - (7.035151888565, 47.366631680042) - (7.035151888565, 47.361931173747) - (7.03985239486, 47.361931173747) - (7.044552901155, 47.361931173747) - (7.04925340745, 47.361931173747) - (7.04925340745, 47.357230667452) - (7.04925340745, 47.352530161156) - (7.04925340745, 47.347829654861) - (7.053953913745, 47.347829654861) - (7.058654420041, 47.347829654861) - (7.058654420041, 47.343129148566) - (7.058654420041, 47.338428642271) - (7.053953913745, 47.338428642271) - (7.053953913745, 47.333728135975) - (7.04925340745, 47.333728135975) - (7.04925340745, 47.32902762968) - (7.044552901155, 47.32902762968) - (7.03985239486, 47.32902762968) - (7.035151888565, 47.32902762968) - (7.030451382269, 47.32902762968) - (7.025750875974, 47.32902762968) - (7.025750875974, 47.324327123385) - (7.021050369679, 47.324327123385) - (7.016349863384, 47.324327123385) - (7.011649357089, 47.324327123385) - (7.006948850793, 47.324327123385) - (7.006948850793, 47.31962661709) - (7.011649357089, 47.31962661709) - (7.016349863384, 47.31962661709) - (7.016349863384, 47.314926110795) - (7.016349863384, 47.310225604499) - (7.011649357089, 47.310225604499) - (7.011649357089, 47.305525098204) - (7.006948850793, 47.305525098204) - (7.006948850793, 47.300824591909) - (7.002248344498, 47.300824591909) - (6.997547838203, 47.300824591909) - (6.997547838203, 47.296124085614) - (6.992847331908, 47.296124085614) - (6.988146825612, 47.296124085614) - (6.983446319317, 47.296124085614) - (6.978745813022, 47.296124085614) - (6.974045306727, 47.296124085614) - (6.974045306727, 47.291423579319) - (6.969344800432, 47.291423579319) - (6.964644294136, 47.291423579319) - (6.959943787841, 47.291423579319) - (6.955243281546, 47.291423579319) - (6.950542775251, 47.291423579319) - (6.945842268956, 47.291423579319) - (6.945842268956, 47.286723073023) - (6.94114176266, 47.286723073023) - (6.94114176266, 47.282022566728) - (6.945842268956, 47.282022566728) - (6.945842268956, 47.277322060433) - (6.950542775251, 47.277322060433) - (6.950542775251, 47.272621554138) - (6.950542775251, 47.267921047842) - (6.950542775251, 47.263220541547) - (6.950542775251, 47.258520035252) - (6.950542775251, 47.253819528957) - (6.945842268956, 47.253819528957) - (6.945842268956, 47.249119022662) - (6.950542775251, 47.249119022662) - (6.950542775251, 47.244418516366) - (6.950542775251, 47.239718010071) - (6.945842268956, 47.239718010071) - (6.94114176266, 47.239718010071) - (6.94114176266, 47.235017503776) - (6.94114176266, 47.230316997481) - (6.936441256365, 47.230316997481) - (6.93174075007, 47.230316997481) - (6.927040243775, 47.230316997481) - (6.927040243775, 47.225616491186) - (6.922339737479, 47.225616491186) - (6.922339737479, 47.22091598489) - (6.917639231184, 47.22091598489) - (6.912938724889, 47.22091598489) - (6.912938724889, 47.216215478595) - (6.908238218594, 47.216215478595) - (6.903537712299, 47.216215478595) - (6.903537712299, 47.2115149723) - (6.898837206003, 47.2115149723) - (6.898837206003, 47.206814466005) - (6.894136699708, 47.206814466005) - (6.889436193413, 47.206814466005) - (6.889436193413, 47.202113959709) - (6.884735687118, 47.202113959709) - (6.880035180822, 47.202113959709) - (6.880035180822, 47.197413453414) - (6.875334674527, 47.197413453414) - (6.875334674527, 47.192712947119) - (6.875334674527, 47.188012440824) - (6.875334674527, 47.183311934529) - (6.870634168232, 47.183311934529) - (6.865933661937, 47.183311934529) - (6.865933661937, 47.178611428233) - (6.861233155642, 47.178611428233) - (6.856532649346, 47.178611428233) - (6.851832143051, 47.178611428233) - (6.851832143051, 47.173910921938) - (6.847131636756, 47.173910921938) - (6.842431130461, 47.173910921938) - (6.842431130461, 47.169210415643) - (6.842431130461, 47.164509909348) - (6.847131636756, 47.164509909348) - (6.851832143051, 47.164509909348) - (6.856532649346, 47.164509909348) - (6.856532649346, 47.159809403053) - (6.851832143051, 47.159809403053) - (6.851832143051, 47.155108896757) - (6.847131636756, 47.155108896757) - (6.842431130461, 47.155108896757) - (6.837730624166, 47.155108896757) - (6.837730624166, 47.150408390462) - (6.83303011787, 47.150408390462) - (6.83303011787, 47.145707884167) - (6.828329611575, 47.145707884167) - (6.82362910528, 47.145707884167) - (6.82362910528, 47.141007377872) - (6.818928598985, 47.141007377872) - (6.818928598985, 47.136306871576) - (6.814228092689, 47.136306871576) - (6.809527586394, 47.136306871576) - (6.804827080099, 47.136306871576) - (6.804827080099, 47.131606365281) - (6.800126573804, 47.131606365281) - (6.800126573804, 47.126905858986) - (6.795426067509, 47.126905858986) - (6.790725561213, 47.126905858986) - (6.786025054918, 47.126905858986) - (6.781324548623, 47.126905858986) - (6.781324548623, 47.122205352691) - (6.776624042328, 47.122205352691) - (6.771923536033, 47.122205352691) - (6.767223029737, 47.122205352691) - (6.762522523442, 47.122205352691) - (6.762522523442, 47.117504846396) - (6.757822017147, 47.117504846396) - (6.753121510852, 47.117504846396) - (6.753121510852, 47.1128043401) - (6.748421004556, 47.1128043401) - (6.748421004556, 47.108103833805) - (6.743720498261, 47.108103833805) - (6.739019991966, 47.108103833805) - (6.739019991966, 47.10340332751) - (6.743720498261, 47.10340332751) - (6.743720498261, 47.098702821215) - (6.743720498261, 47.09400231492) - (6.743720498261, 47.094002314919) - (6.743720498261, 47.089301808624) - (6.739019991966, 47.089301808624) - (6.734319485671, 47.089301808624) - (6.729618979376, 47.089301808624) - (6.72491847308, 47.089301808624) - (6.720217966785, 47.089301808624) - (6.71551746049, 47.089301808624) - (6.71551746049, 47.084601302329) - (6.710816954195, 47.084601302329) - (6.7061164479, 47.084601302329) - (6.7061164479, 47.079900796034) - (6.7061164479, 47.075200289739) - (6.7061164479, 47.070499783443) - (6.701415941604, 47.070499783443) - (6.696715435309, 47.070499783443) - (6.692014929014, 47.070499783443) - (6.692014929014, 47.065799277148) - (6.696715435309, 47.065799277148) - (6.696715435309, 47.061098770853) - (6.701415941604, 47.061098770853) - (6.7061164479, 47.061098770853) - (6.7061164479, 47.056398264558) - (6.710816954195, 47.056398264558) - (6.71551746049, 47.056398264558) - (6.71551746049, 47.051697758263) - (6.71551746049, 47.046997251967) - (6.710816954195, 47.046997251967) - (6.710816954195, 47.042296745672) - (6.7061164479, 47.042296745672) - (6.7061164479, 47.037596239377) - (6.701415941604, 47.037596239377) - (6.696715435309, 47.037596239377) - (6.692014929014, 47.037596239377) - (6.687314422719, 47.037596239377) - (6.687314422719, 47.032895733082) - (6.682613916423, 47.032895733082) - (6.677913410128, 47.032895733082) - (6.673212903833, 47.032895733082) - (6.668512397538, 47.032895733082) - (6.668512397538, 47.028195226786) - (6.663811891243, 47.028195226786) - (6.663811891243, 47.023494720491) - (6.659111384947, 47.023494720491) - (6.654410878652, 47.023494720491) - (6.654410878652, 47.018794214196) - (6.654410878652, 47.014093707901) - (6.649710372357, 47.014093707901) - (6.649710372357, 47.009393201606) - (6.645009866062, 47.009393201606) - (6.640309359767, 47.009393201606) - (6.640309359767, 47.00469269531) - (6.635608853471, 47.00469269531) - (6.635608853471, 46.999992189015) - (6.630908347176, 46.999992189015) - (6.630908347176, 46.99529168272) - (6.626207840881, 46.99529168272) - (6.621507334586, 46.99529168272) - (6.61680682829, 46.99529168272) - (6.612106321995, 46.99529168272) - (6.612106321995, 46.990591176425) - (6.6074058157, 46.990591176425) - (6.602705309405, 46.990591176425) - (6.59800480311, 46.990591176425) - (6.593304296814, 46.990591176425) - (6.588603790519, 46.990591176425) - (6.588603790519, 46.98589067013) - (6.583903284224, 46.98589067013) - (6.579202777929, 46.98589067013) - (6.579202777929, 46.981190163834) - (6.574502271633, 46.981190163834) - (6.569801765338, 46.981190163834) - (6.565101259043, 46.981190163834) - (6.560400752748, 46.981190163834) - (6.560400752748, 46.976489657539) - (6.555700246453, 46.976489657539) - (6.550999740157, 46.976489657539) - (6.546299233862, 46.976489657539) - (6.541598727567, 46.976489657539) - (6.536898221272, 46.976489657539) - (6.536898221272, 46.971789151244) - (6.532197714977, 46.971789151244) - (6.527497208681, 46.971789151244) - (6.522796702386, 46.971789151244) - (6.518096196091, 46.971789151244) - (6.513395689796, 46.971789151244) - (6.513395689796, 46.967088644949) - (6.5086951835, 46.967088644949) - (6.503994677205, 46.967088644949) - (6.49929417091, 46.967088644949) - (6.49929417091, 46.971789151244) - (6.494593664615, 46.971789151244) - (6.48989315832, 46.971789151244) - (6.48989315832, 46.967088644949) - (6.485192652024, 46.967088644949) - (6.485192652024, 46.962388138653) - (6.480492145729, 46.962388138653) - (6.475791639434, 46.962388138653) - (6.475791639434, 46.957687632358) - (6.471091133139, 46.957687632358) - (6.466390626844, 46.957687632358) - (6.466390626844, 46.952987126063) - (6.461690120548, 46.952987126063) - (6.461690120548, 46.948286619768) - (6.456989614253, 46.948286619768) - (6.456989614253, 46.943586113473) - (6.452289107958, 46.943586113473) - (6.452289107958, 46.938885607177) - (6.447588601663, 46.938885607177) - (6.442888095367, 46.938885607177) - (6.442888095367, 46.934185100882) - (6.438187589072, 46.934185100882) - (6.438187589072, 46.929484594587) - (6.433487082777, 46.929484594587) - (6.433487082777, 46.924784088292) - (6.438187589072, 46.924784088292) - (6.438187589072, 46.920083581997) - (6.442888095367, 46.920083581997) - (6.442888095367, 46.915383075701) - (6.447588601663, 46.915383075701) - (6.447588601663, 46.910682569406) - (6.452289107958, 46.910682569406) - (6.452289107958, 46.905982063111) - (6.456989614253, 46.905982063111) - (6.456989614253, 46.901281556816) - (6.456989614253, 46.89658105052) - (6.461690120548, 46.89658105052) - (6.461690120548, 46.891880544225) - (6.461690120548, 46.88718003793) - (6.466390626844, 46.88718003793) - (6.466390626844, 46.882479531635) - (6.466390626844, 46.87777902534) - (6.466390626844, 46.873078519044) - (6.466390626844, 46.868378012749) - (6.466390626844, 46.863677506454) - (6.461690120548, 46.863677506454) - (6.461690120548, 46.858977000159) - (6.461690120548, 46.854276493864) - (6.461690120548, 46.849575987568) - (6.456989614253, 46.849575987568) - (6.456989614253, 46.844875481273) - (6.452289107958, 46.844875481273) - (6.447588601663, 46.844875481273) - (6.447588601663, 46.840174974978) - (6.447588601663, 46.835474468683) - (6.442888095367, 46.835474468683) - (6.442888095367, 46.830773962387) - (6.442888095367, 46.826073456092) - (6.442888095367, 46.821372949797) - (6.442888095367, 46.816672443502) - (6.438187589072, 46.816672443502) - (6.438187589072, 46.811971937207) - (6.433487082777, 46.811971937207) - (6.433487082777, 46.807271430911) - (6.433487082777, 46.802570924616) - (6.438187589072, 46.802570924616) - (6.438187589072, 46.797870418321) - (6.442888095367, 46.797870418321) - (6.447588601663, 46.797870418321) - (6.447588601663, 46.793169912026) - (6.452289107958, 46.793169912026) - (6.452289107958, 46.78846940573) - (6.456989614253, 46.78846940573) - (6.456989614253, 46.783768899435) - (6.456989614253, 46.77906839314) - (6.452289107958, 46.77906839314) - (6.452289107958, 46.774367886845) - (6.447588601663, 46.774367886845) - (6.447588601663, 46.76966738055) - (6.442888095367, 46.76966738055) - (6.442888095367, 46.764966874254) - (6.438187589072, 46.764966874254) - (6.438187589072, 46.760266367959) - (6.433487082777, 46.760266367959) - (6.428786576482, 46.760266367959) - (6.428786576482, 46.755565861664) - (6.424086070187, 46.755565861664) - (6.419385563891, 46.755565861664) - (6.414685057596, 46.755565861664) - (6.409984551301, 46.755565861664) - (6.409984551301, 46.750865355369) - (6.405284045006, 46.750865355369) - (6.400583538711, 46.750865355369) - (6.400583538711, 46.746164849074) - (6.395883032415, 46.746164849074) - (6.39118252612, 46.746164849074) - (6.386482019825, 46.746164849074) - (6.386482019825, 46.741464342778) - (6.39118252612, 46.741464342778) - (6.39118252612, 46.736763836483) - (6.386482019825, 46.736763836483) - (6.386482019825, 46.732063330188) - (6.38178151353, 46.732063330188) - (6.377081007234, 46.732063330188) - (6.372380500939, 46.732063330188) - (6.367679994644, 46.732063330188) - (6.367679994644, 46.727362823893) - (6.372380500939, 46.727362823893) - (6.372380500939, 46.722662317597) - (6.367679994644, 46.722662317597) - (6.362979488349, 46.722662317597) - (6.358278982054, 46.722662317597) - (6.358278982054, 46.717961811302) - (6.353578475758, 46.717961811302) - (6.348877969463, 46.717961811302) - (6.348877969463, 46.713261305007) - (6.344177463168, 46.713261305007) - (6.339476956873, 46.713261305007) - (6.339476956873, 46.708560798712) - (6.334776450578, 46.708560798712) - (6.330075944282, 46.708560798712) - (6.330075944282, 46.703860292417) - (6.325375437987, 46.703860292417) - (6.320674931692, 46.703860292417) - (6.315974425397, 46.703860292417) - (6.315974425397, 46.699159786121) - (6.311273919101, 46.699159786121) - (6.306573412806, 46.699159786121) - (6.301872906511, 46.699159786121) - (6.301872906511, 46.694459279826) - (6.297172400216, 46.694459279826) - (6.292471893921, 46.694459279826) - (6.292471893921, 46.689758773531) - (6.287771387625, 46.689758773531) - (6.28307088133, 46.689758773531) - (6.28307088133, 46.685058267236) - (6.278370375035, 46.685058267236) - (6.27366986874, 46.685058267236) - (6.27366986874, 46.680357760941) - (6.268969362444, 46.680357760941) - (6.268969362444, 46.675657254645) - (6.264268856149, 46.675657254645) - (6.264268856149, 46.67095674835) - (6.259568349854, 46.67095674835) - (6.259568349854, 46.666256242055) - (6.254867843559, 46.666256242055) - (6.250167337264, 46.666256242055) - (6.250167337264, 46.66155573576) - (6.245466830968, 46.66155573576) - (6.245466830968, 46.656855229464) - (6.240766324673, 46.656855229464) - (6.236065818378, 46.656855229464) - (6.236065818378, 46.652154723169) - (6.231365312083, 46.652154723169) - (6.226664805788, 46.652154723169) - (6.226664805788, 46.647454216874) - (6.221964299492, 46.647454216874) - (6.221964299492, 46.642753710579) - (6.217263793197, 46.642753710579) - (6.212563286902, 46.642753710579) - (6.212563286902, 46.638053204284) - (6.207862780607, 46.638053204284) - (6.203162274311, 46.638053204284) - (6.203162274311, 46.633352697988) - (6.198461768016, 46.633352697988) - (6.198461768016, 46.628652191693) - (6.193761261721, 46.628652191693) - (6.193761261721, 46.623951685398) - (6.189060755426, 46.623951685398) - (6.184360249131, 46.623951685398) - (6.184360249131, 46.619251179103) - (6.179659742835, 46.619251179103) - (6.179659742835, 46.614550672808) - (6.17495923654, 46.614550672808) - (6.170258730245, 46.614550672808) - (6.170258730245, 46.609850166512) - (6.16555822395, 46.609850166512) - (6.160857717655, 46.609850166512) - (6.156157211359, 46.609850166512) - (6.156157211359, 46.605149660217) - (6.151456705064, 46.605149660217) - (6.146756198769, 46.605149660217) - (6.146756198769, 46.600449153922) - (6.142055692474, 46.600449153922) - (6.137355186178, 46.600449153922) - (6.137355186178, 46.595748647627) - (6.132654679883, 46.595748647627) - (6.127954173588, 46.595748647627) - (6.127954173588, 46.591048141331) - (6.127954173588, 46.586347635036) - (6.123253667293, 46.586347635036) - (6.123253667293, 46.581647128741) - (6.118553160998, 46.581647128741) - (6.118553160998, 46.576946622446) - (6.113852654702, 46.576946622446) - (6.113852654702, 46.572246116151) - (6.118553160998, 46.572246116151) - (6.123253667293, 46.572246116151) - (6.123253667293, 46.567545609855) - (6.127954173588, 46.567545609855) - (6.127954173588, 46.56284510356) - (6.132654679883, 46.56284510356) - (6.137355186178, 46.56284510356) - (6.137355186178, 46.558144597265) - (6.142055692474, 46.558144597265) - (6.142055692474, 46.55344409097) - (6.146756198769, 46.55344409097) - (6.146756198769, 46.548743584675) - (6.151456705064, 46.548743584675) - (6.156157211359, 46.548743584675) - (6.156157211359, 46.544043078379) - (6.151456705064, 46.544043078379) - (6.151456705064, 46.539342572084) - (6.151456705064, 46.534642065789) - (6.151456705064, 46.529941559494) - (6.146756198769, 46.529941559494) - (6.142055692474, 46.529941559494) - (6.142055692474, 46.534642065789) - (6.137355186178, 46.534642065789) - (6.137355186178, 46.529941559494) - (6.132654679883, 46.529941559494) - (6.132654679883, 46.525241053198) - (6.127954173588, 46.525241053198) - (6.127954173588, 46.520540546903) - (6.123253667293, 46.520540546903) - (6.123253667293, 46.515840040608) - (6.118553160998, 46.515840040608) - (6.118553160998, 46.511139534313) - (6.113852654702, 46.511139534313) - (6.113852654702, 46.506439028018) - (6.109152148407, 46.506439028018) - (6.109152148407, 46.501738521722) - (6.109152148407, 46.497038015427) - (6.104451642112, 46.497038015427) - (6.104451642112, 46.492337509132) - (6.104451642112, 46.487637002837) - (6.099751135817, 46.487637002837) - (6.099751135817, 46.482936496542) - (6.099751135817, 46.482936496541) - (6.099751135817, 46.478235990246) - (6.095050629522, 46.478235990246) - (6.090350123226, 46.478235990246) - (6.090350123226, 46.473535483951) - (6.085649616931, 46.473535483951) - (6.080949110636, 46.473535483951) - (6.080949110636, 46.468834977656) - (6.076248604341, 46.468834977656) - (6.076248604341, 46.464134471361) - (6.076248604341, 46.459433965065) - (6.076248604341, 46.45473345877) - (6.076248604341, 46.450032952475) - (6.080949110636, 46.450032952475) - (6.085649616931, 46.450032952475) - (6.085649616931, 46.44533244618) - (6.085649616931, 46.440631939885) - (6.085649616931, 46.435931433589) - (6.080949110636, 46.435931433589) - (6.080949110636, 46.431230927294) - (6.076248604341, 46.431230927294) - (6.071548098045, 46.431230927294) - (6.071548098045, 46.426530420999) - (6.071548098045, 46.421829914704) - (6.06684759175, 46.421829914704) - (6.06684759175, 46.417129408408) - (6.071548098045, 46.417129408408) - (6.071548098045, 46.412428902113) - (6.076248604341, 46.412428902113) - (6.080949110636, 46.412428902113) - (6.085649616931, 46.412428902113) - (6.085649616931, 46.407728395818) - (6.090350123226, 46.407728395818) - (6.095050629522, 46.407728395818) - (6.099751135817, 46.407728395818) - (6.099751135817, 46.403027889523) - (6.104451642112, 46.403027889523) - (6.104451642112, 46.398327383228) - (6.109152148407, 46.398327383228) - (6.113852654702, 46.398327383228) - (6.118553160998, 46.398327383228) - (6.118553160998, 46.393626876932) - (6.123253667293, 46.393626876932) - (6.127954173588, 46.393626876932) - (6.127954173588, 46.388926370637) - (6.132654679883, 46.388926370637) - (6.137355186178, 46.388926370637) - (6.137355186178, 46.384225864342) - (6.142055692474, 46.384225864342) - (6.146756198769, 46.384225864342) - (6.146756198769, 46.379525358047) - (6.151456705064, 46.379525358047) - (6.156157211359, 46.379525358047) - (6.160857717655, 46.379525358047) - (6.160857717655, 46.374824851752) - (6.16555822395, 46.374824851752) - (6.16555822395, 46.370124345456) - (6.170258730245, 46.370124345456) - (6.170258730245, 46.365423839161) - (6.16555822395, 46.365423839161) - (6.16555822395, 46.360723332866) - (6.160857717655, 46.360723332866) - (6.160857717655, 46.356022826571) - (6.160857717655, 46.351322320275) - (6.156157211359, 46.351322320275) - (6.156157211359, 46.34662181398) - (6.151456705064, 46.34662181398) - (6.146756198769, 46.34662181398) - (6.146756198769, 46.341921307685) - (6.142055692474, 46.341921307685) - (6.142055692474, 46.33722080139) - (6.137355186178, 46.33722080139) - (6.137355186178, 46.332520295095) - (6.137355186178, 46.327819788799) - (6.132654679883, 46.327819788799) - (6.132654679883, 46.323119282504) - (6.127954173588, 46.323119282504) - (6.127954173588, 46.318418776209) - (6.123253667293, 46.318418776209) - (6.123253667293, 46.313718269914) - (6.118553160998, 46.313718269914) - (6.118553160998, 46.309017763619) - (6.118553160998, 46.304317257323) - (6.123253667293, 46.304317257323) - (6.123253667293, 46.299616751028) - (6.118553160998, 46.299616751028) - (6.118553160998, 46.294916244733) - (6.113852654702, 46.294916244733) - (6.113852654702, 46.290215738438) - (6.109152148407, 46.290215738438) - (6.109152148407, 46.285515232142) - (6.104451642112, 46.285515232142) - (6.104451642112, 46.280814725847) - (6.104451642112, 46.276114219552) - (6.109152148407, 46.276114219552) - (6.109152148407, 46.271413713257) - (6.113852654702, 46.271413713257) - (6.113852654702, 46.266713206962) - (6.118553160998, 46.266713206962) - (6.118553160998, 46.262012700666) - (6.123253667293, 46.262012700666) - (6.123253667293, 46.257312194371) - (6.123253667293, 46.252611688076) - (6.123253667293, 46.247911181781) - (6.118553160998, 46.247911181781) - (6.118553160998, 46.243210675486) - (6.113852654702, 46.243210675486) - (6.109152148407, 46.243210675486) - (6.109152148407, 46.23851016919) - (6.104451642112, 46.23851016919) - (6.099751135817, 46.23851016919) - (6.099751135817, 46.243210675486) - (6.095050629522, 46.243210675486) - (6.090350123226, 46.243210675486) - (6.090350123226, 46.247911181781) - (6.085649616931, 46.247911181781) - (6.080949110636, 46.247911181781) - (6.080949110636, 46.243210675486) - (6.076248604341, 46.243210675486) - (6.071548098045, 46.243210675486) - (6.071548098045, 46.23851016919) - (6.06684759175, 46.23851016919) - (6.06684759175, 46.243210675486) - (6.062147085455, 46.243210675486) - (6.05744657916, 46.243210675486) - (6.05744657916, 46.23851016919) - (6.052746072865, 46.23851016919) - (6.052746072865, 46.233809662895) - (6.048045566569, 46.233809662895) - (6.043345060274, 46.233809662895) - (6.038644553979, 46.233809662895) - (6.038644553979, 46.23851016919) - (6.033944047684, 46.23851016919) - (6.029243541389, 46.23851016919) - (6.029243541389, 46.233809662895) - (6.024543035093, 46.233809662895) - (6.019842528798, 46.233809662895) - (6.015142022503, 46.233809662895) - (6.015142022503, 46.2291091566) - (6.010441516208, 46.2291091566) - (6.005741009912, 46.2291091566) - (6.005741009912, 46.224408650305) - (6.001040503617, 46.224408650305) - (5.996339997322, 46.224408650305) - (5.991639491027, 46.224408650305) - (5.991639491027, 46.219708144009) - (5.991639491027, 46.215007637714) - (5.986938984732, 46.215007637714) - (5.982238478436, 46.215007637714) - (5.977537972141, 46.215007637714) - (5.972837465846, 46.215007637714) - (5.972837465846, 46.210307131419) - (5.972837465846, 46.205606625124) - (5.972837465846, 46.200906118829) - (5.968136959551, 46.200906118829) - (5.968136959551, 46.196205612533) - (5.972837465846, 46.196205612533) - (5.972837465846, 46.191505106238) - (5.977537972141, 46.191505106238) - (5.982238478436, 46.191505106238) - (5.986938984732, 46.191505106238) - (5.986938984732, 46.186804599943) - (5.991639491027, 46.186804599943) - (5.991639491027, 46.182104093648) - (5.991639491027, 46.177403587353) - (5.991639491027, 46.177403587352) - (5.991639491027, 46.172703081057) - (5.986938984732, 46.172703081057) - (5.982238478436, 46.172703081057) - (5.982238478436, 46.168002574762) - (5.977537972141, 46.168002574762) - (5.977537972141, 46.163302068467) - (5.977537972141, 46.158601562172) - (5.972837465846, 46.158601562172) - (5.972837465846, 46.153901055876) - (5.968136959551, 46.153901055876) - (5.968136959551, 46.149200549581) - (5.968136959551, 46.144500043286) - (5.963436453256, 46.144500043286) - (5.963436453256, 46.139799536991) - (5.963436453256, 46.135099030696) - (5.95873594696, 46.135099030696) - (5.95873594696, 46.1303985244) - (5.95873594696, 46.125698018105) - (5.963436453256, 46.125698018105) - (5.963436453256, 46.1303985244) - (5.968136959551, 46.1303985244) - (5.972837465846, 46.1303985244) - (5.977537972141, 46.1303985244) - (5.977537972141, 46.135099030696) - (5.982238478436, 46.135099030696) - (5.982238478436, 46.139799536991) - (5.982238478436, 46.144500043286) - (5.986938984732, 46.144500043286) - (5.991639491027, 46.144500043286) - (5.996339997322, 46.144500043286) - (6.001040503617, 46.144500043286) - (6.005741009912, 46.144500043286) - (6.010441516208, 46.144500043286) - (6.015142022503, 46.144500043286) - (6.019842528798, 46.144500043286) - (6.024543035093, 46.144500043286) - (6.024543035093, 46.139799536991) - (6.029243541389, 46.139799536991) - (6.033944047684, 46.139799536991) - (6.038644553979, 46.139799536991) - (6.043345060274, 46.139799536991) - (6.048045566569, 46.139799536991) - (6.048045566569, 46.144500043286) - (6.048045566569, 46.149200549581) - (6.052746072865, 46.149200549581) - (6.05744657916, 46.149200549581) - (6.062147085455, 46.149200549581) - (6.06684759175, 46.149200549581) - (6.071548098045, 46.149200549581) - (6.076248604341, 46.149200549581) - (6.080949110636, 46.149200549581) - (6.085649616931, 46.149200549581) - (6.090350123226, 46.149200549581) - (6.095050629522, 46.149200549581) - (6.099751135817, 46.149200549581) - (6.099751135817, 46.144500043286) - (6.104451642112, 46.144500043286) - (6.109152148407, 46.144500043286) - (6.113852654702, 46.144500043286) - (6.118553160998, 46.144500043286) - (6.118553160998, 46.139799536991) - (6.123253667293, 46.139799536991) - (6.127954173588, 46.139799536991) - (6.132654679883, 46.139799536991) - (6.137355186178, 46.139799536991) - (6.137355186178, 46.144500043286) - (6.142055692474, 46.144500043286) - (6.146756198769, 46.144500043286) - (6.146756198769, 46.149200549581) - (6.151456705064, 46.149200549581) - (6.156157211359, 46.149200549581) - (6.156157211359, 46.153901055876) - (6.160857717655, 46.153901055876) - (6.16555822395, 46.153901055876) - (6.170258730245, 46.153901055876) - (6.170258730245, 46.158601562172) - (6.17495923654, 46.158601562172) - (6.179659742835, 46.158601562172) - (6.179659742835, 46.163302068467) - (6.184360249131, 46.163302068467) - (6.189060755426, 46.163302068467) - (6.189060755426, 46.168002574762) - (6.189060755426, 46.172703081057) - (6.184360249131, 46.172703081057) - (6.184360249131, 46.177403587352) - (6.189060755426, 46.177403587352) - (6.189060755426, 46.182104093648) - (6.193761261721, 46.182104093648) - (6.198461768016, 46.182104093648) - (6.198461768016, 46.186804599943) - (6.203162274311, 46.186804599943) - (6.203162274311, 46.191505106238) - (6.207862780607, 46.191505106238) - (6.212563286902, 46.191505106238) - (6.212563286902, 46.196205612533) - (6.217263793197, 46.196205612533) - (6.217263793197, 46.200906118829) - (6.221964299492, 46.200906118829) - (6.226664805788, 46.200906118829) - (6.226664805788, 46.205606625124) - (6.231365312083, 46.205606625124) - (6.236065818378, 46.205606625124) - (6.240766324673, 46.205606625124) - (6.245466830968, 46.205606625124) - (6.250167337264, 46.205606625124) - (6.254867843559, 46.205606625124) - (6.254867843559, 46.210307131419) - (6.259568349854, 46.210307131419) - (6.264268856149, 46.210307131419) - (6.268969362444, 46.210307131419) - (6.268969362444, 46.215007637714) - (6.27366986874, 46.215007637714) - (6.278370375035, 46.215007637714) - (6.28307088133, 46.215007637714) - (6.28307088133, 46.219708144009) - (6.287771387625, 46.219708144009) - (6.292471893921, 46.219708144009) - (6.292471893921, 46.224408650305) - (6.297172400216, 46.224408650305) - (6.297172400216, 46.2291091566) - (6.301872906511, 46.2291091566) - (6.301872906511, 46.233809662895) - (6.306573412806, 46.233809662895) - (6.306573412806, 46.23851016919) - (6.306573412806, 46.243210675486) - (6.311273919101, 46.243210675486) - (6.311273919101, 46.247911181781) - (6.311273919101, 46.252611688076) - (6.306573412806, 46.252611688076) - (6.301872906511, 46.252611688076) - (6.301872906511, 46.257312194371) - (6.297172400216, 46.257312194371) - (6.297172400216, 46.262012700666) - (6.297172400216, 46.266713206962) - (6.292471893921, 46.266713206962) - (6.292471893921, 46.262012700666) - (6.287771387625, 46.262012700666) - (6.287771387625, 46.257312194371) - (6.28307088133, 46.257312194371) - (6.28307088133, 46.252611688076) - (6.278370375035, 46.252611688076) - (6.27366986874, 46.252611688076) - (6.268969362444, 46.252611688076) - (6.268969362444, 46.247911181781) - (6.264268856149, 46.247911181781) - (6.264268856149, 46.252611688076) - (6.259568349854, 46.252611688076) - (6.259568349854, 46.257312194371) - (6.254867843559, 46.257312194371) - (6.254867843559, 46.262012700666) - (6.250167337264, 46.262012700666) - (6.250167337264, 46.266713206962) - (6.245466830968, 46.266713206962) - (6.245466830968, 46.271413713257) - (6.240766324673, 46.271413713257) - (6.240766324673, 46.276114219552) - (6.240766324673, 46.280814725847) - (6.240766324673, 46.285515232142) - (6.245466830968, 46.285515232142) - (6.250167337264, 46.285515232142) - (6.250167337264, 46.290215738438) - (6.250167337264, 46.294916244733) - (6.250167337264, 46.299616751028) - (6.250167337264, 46.304317257323) - (6.245466830968, 46.304317257323) - (6.240766324673, 46.304317257323) - (6.240766324673, 46.309017763619) - (6.236065818378, 46.309017763619) - (6.231365312083, 46.309017763619) - (6.226664805788, 46.309017763619) - (6.226664805788, 46.313718269914) - (6.221964299492, 46.313718269914) - (6.221964299492, 46.318418776209) - (6.226664805788, 46.318418776209) - (6.226664805788, 46.323119282504) - (6.231365312083, 46.323119282504) - (6.231365312083, 46.327819788799) - (6.236065818378, 46.327819788799) - (6.236065818378, 46.332520295095) - (6.236065818378, 46.33722080139) - (6.240766324673, 46.33722080139) - (6.240766324673, 46.341921307685) - (6.245466830968, 46.341921307685) - (6.245466830968, 46.34662181398) - (6.250167337264, 46.34662181398) - (6.250167337264, 46.351322320275) - (6.250167337264, 46.356022826571) - (6.254867843559, 46.356022826571) - (6.254867843559, 46.360723332866) - (6.259568349854, 46.360723332866) - (6.264268856149, 46.360723332866) - (6.264268856149, 46.365423839161) - (6.268969362444, 46.365423839161) - (6.268969362444, 46.370124345456) - (6.27366986874, 46.370124345456) - (6.278370375035, 46.370124345456) - (6.278370375035, 46.374824851752) - (6.28307088133, 46.374824851752) - (6.287771387625, 46.374824851752) - (6.287771387625, 46.379525358047) - (6.292471893921, 46.379525358047) - (6.292471893921, 46.384225864342) - (6.297172400216, 46.384225864342) - (6.301872906511, 46.384225864342) - (6.301872906511, 46.388926370637) - (6.306573412806, 46.388926370637) - (6.311273919101, 46.388926370637) - (6.311273919101, 46.393626876932) - (6.315974425397, 46.393626876932) - (6.315974425397, 46.398327383228) - (6.320674931692, 46.398327383228) - (6.325375437987, 46.398327383228) - (6.325375437987, 46.403027889523) - (6.330075944282, 46.403027889523) - (6.334776450578, 46.403027889523) - (6.339476956873, 46.403027889523) - (6.344177463168, 46.403027889523) - (6.344177463168, 46.407728395818) - (6.348877969463, 46.407728395818) - (6.353578475758, 46.407728395818) - (6.358278982054, 46.407728395818) - (6.362979488349, 46.407728395818) - (6.367679994644, 46.407728395818) - (6.372380500939, 46.407728395818) - (6.377081007234, 46.407728395818) - (6.38178151353, 46.407728395818) - (6.38178151353, 46.412428902113) - (6.386482019825, 46.412428902113) - (6.39118252612, 46.412428902113) - (6.395883032415, 46.412428902113) - (6.400583538711, 46.412428902113) - (6.405284045006, 46.412428902113) - (6.409984551301, 46.412428902113) - (6.414685057596, 46.412428902113) - (6.419385563891, 46.412428902113) - (6.419385563891, 46.417129408408) - (6.424086070187, 46.417129408408) - (6.428786576482, 46.417129408408) - (6.433487082777, 46.417129408408) - (6.433487082777, 46.421829914704) - (6.438187589072, 46.421829914704) - (6.442888095367, 46.421829914704) - (6.442888095367, 46.426530420999) - (6.447588601663, 46.426530420999) - (6.452289107958, 46.426530420999) - (6.456989614253, 46.426530420999) - (6.456989614253, 46.431230927294) - (6.461690120548, 46.431230927294) - (6.466390626844, 46.431230927294) - (6.466390626844, 46.435931433589) - (6.471091133139, 46.435931433589) - (6.475791639434, 46.435931433589) - (6.480492145729, 46.435931433589) - (6.480492145729, 46.440631939885) - (6.485192652024, 46.440631939885) - (6.48989315832, 46.440631939885) - (6.48989315832, 46.44533244618) - (6.494593664615, 46.44533244618) - (6.49929417091, 46.44533244618) - (6.49929417091, 46.450032952475) - (6.503994677205, 46.450032952475) - (6.5086951835, 46.450032952475) - (6.513395689796, 46.450032952475) - (6.513395689796, 46.45473345877) - (6.518096196091, 46.45473345877) - (6.522796702386, 46.45473345877) - (6.527497208681, 46.45473345877) - (6.532197714977, 46.45473345877) - (6.536898221272, 46.45473345877) - (6.541598727567, 46.45473345877) - (6.546299233862, 46.45473345877) - (6.550999740157, 46.45473345877) - (6.555700246453, 46.45473345877) - (6.560400752748, 46.45473345877) - (6.565101259043, 46.45473345877) - (6.569801765338, 46.45473345877) - (6.574502271633, 46.45473345877) - (6.579202777929, 46.45473345877) - (6.583903284224, 46.45473345877) - (6.588603790519, 46.45473345877) - (6.593304296814, 46.45473345877) - (6.59800480311, 46.45473345877) - (6.602705309405, 46.45473345877) - (6.6074058157, 46.45473345877) - (6.612106321995, 46.45473345877) - (6.61680682829, 46.45473345877) - (6.621507334586, 46.45473345877) - (6.626207840881, 46.45473345877) - (6.630908347176, 46.45473345877) - (6.635608853471, 46.45473345877) - (6.640309359767, 46.45473345877) - (6.645009866062, 46.45473345877) - (6.649710372357, 46.45473345877) - (6.654410878652, 46.45473345877) - (6.659111384947, 46.45473345877) - (6.663811891243, 46.45473345877) - (6.668512397538, 46.45473345877) - (6.673212903833, 46.45473345877) - (6.677913410128, 46.45473345877) - (6.677913410128, 46.450032952475) - (6.682613916423, 46.450032952475) - (6.687314422719, 46.450032952475) - (6.692014929014, 46.450032952475) - (6.696715435309, 46.450032952475) - (6.701415941604, 46.450032952475) - (6.7061164479, 46.450032952475) - (6.7061164479, 46.44533244618) - (6.710816954195, 46.44533244618) - (6.71551746049, 46.44533244618) - (6.720217966785, 46.44533244618) - (6.72491847308, 46.44533244618) - (6.729618979376, 46.44533244618) - (6.734319485671, 46.44533244618) - (6.734319485671, 46.440631939885) - (6.739019991966, 46.440631939885) - (6.743720498261, 46.440631939885) - (6.748421004556, 46.440631939885) - (6.753121510852, 46.440631939885) - (6.757822017147, 46.440631939885) - (6.762522523442, 46.440631939885) - (6.762522523442, 46.435931433589) - (6.767223029737, 46.435931433589) - (6.771923536033, 46.435931433589) - (6.776624042328, 46.435931433589) - (6.781324548623, 46.435931433589) - (6.786025054918, 46.435931433589) - (6.790725561213, 46.435931433589) - (6.790725561213, 46.431230927294) - (6.795426067509, 46.431230927294) - (6.800126573804, 46.431230927294) - (6.804827080099, 46.431230927294) - (6.809527586394, 46.431230927294) - (6.814228092689, 46.431230927294) - (6.818928598985, 46.431230927294) - (6.818928598985, 46.426530420999) - (6.818928598985, 46.421829914704) - (6.814228092689, 46.421829914704) - (6.814228092689, 46.417129408408) - (6.814228092689, 46.412428902113) - (6.809527586394, 46.412428902113) - (6.809527586394, 46.407728395818) - (6.809527586394, 46.403027889523) - (6.804827080099, 46.403027889523) - (6.804827080099, 46.398327383228) - (6.804827080099, 46.393626876932) - (6.804827080099, 46.388926370637) - (6.804827080099, 46.384225864342) - (6.804827080099, 46.379525358047) - (6.800126573804, 46.379525358047) - (6.800126573804, 46.374824851752) - (6.795426067509, 46.374824851752) - (6.795426067509, 46.370124345456) - (6.790725561213, 46.370124345456) - (6.790725561213, 46.365423839161) - (6.786025054918, 46.365423839161) - (6.781324548623, 46.365423839161) - (6.776624042328, 46.365423839161) - (6.776624042328, 46.360723332866) - (6.771923536033, 46.360723332866) - (6.771923536033, 46.356022826571) - (6.771923536033, 46.351322320275) - (6.771923536033, 46.34662181398) - (6.776624042328, 46.34662181398) - (6.781324548623, 46.34662181398) - (6.781324548623, 46.341921307685) - (6.781324548623, 46.33722080139) - (6.786025054918, 46.33722080139) - (6.786025054918, 46.332520295095) - (6.790725561213, 46.332520295095) - (6.795426067509, 46.332520295095) - (6.800126573804, 46.332520295095) - (6.800126573804, 46.327819788799) - (6.800126573804, 46.323119282504) - (6.800126573804, 46.318418776209) - (6.804827080099, 46.318418776209) - (6.809527586394, 46.318418776209) - (6.814228092689, 46.318418776209) - (6.814228092689, 46.313718269914) - (6.818928598985, 46.313718269914) - (6.82362910528, 46.313718269914) - (6.82362910528, 46.309017763619) - (6.828329611575, 46.309017763619) - (6.828329611575, 46.304317257323) - (6.828329611575, 46.299616751028) - (6.83303011787, 46.299616751028) - (6.837730624166, 46.299616751028) - (6.837730624166, 46.294916244733) - (6.842431130461, 46.294916244733) - (6.847131636756, 46.294916244733) - (6.847131636756, 46.290215738438) - (6.851832143051, 46.290215738438) - (6.851832143051, 46.294916244733) - (6.856532649346, 46.294916244733) - (6.856532649346, 46.290215738438) - (6.861233155642, 46.290215738438) - (6.861233155642, 46.285515232142) - (6.861233155642, 46.280814725847) - (6.861233155642, 46.276114219552) - (6.856532649346, 46.276114219552) - (6.856532649346, 46.271413713257) - (6.861233155642, 46.271413713257) - (6.861233155642, 46.266713206962) - (6.856532649346, 46.266713206962) - (6.856532649346, 46.262012700666) - (6.856532649346, 46.257312194371) - (6.856532649346, 46.252611688076) - (6.851832143051, 46.252611688076) - (6.847131636756, 46.252611688076) - (6.847131636756, 46.247911181781) - (6.842431130461, 46.247911181781) - (6.842431130461, 46.243210675486) - (6.837730624166, 46.243210675486) - (6.837730624166, 46.23851016919) - (6.83303011787, 46.23851016919) - (6.828329611575, 46.23851016919) - (6.828329611575, 46.233809662895) - (6.82362910528, 46.233809662895) - (6.82362910528, 46.2291091566) - (6.818928598985, 46.2291091566) - (6.818928598985, 46.224408650305) - (6.818928598985, 46.219708144009) - (6.814228092689, 46.219708144009) - (6.814228092689, 46.215007637714) - (6.809527586394, 46.215007637714) - (6.809527586394, 46.210307131419) - (6.804827080099, 46.210307131419) - (6.804827080099, 46.205606625124) - (6.804827080099, 46.200906118829) - (6.804827080099, 46.196205612533) - (6.809527586394, 46.196205612533) - (6.809527586394, 46.191505106238) - (6.809527586394, 46.186804599943) - (6.814228092689, 46.186804599943) - (6.814228092689, 46.182104093648) - (6.809527586394, 46.182104093648) - (6.809527586394, 46.177403587353) - (6.809527586394, 46.177403587352) - (6.809527586394, 46.172703081057) - (6.804827080099, 46.172703081057) - (6.804827080099, 46.168002574762) - (6.800126573804, 46.168002574762) - (6.800126573804, 46.163302068467) - (6.795426067509, 46.163302068467) - (6.795426067509, 46.158601562172) - (6.790725561213, 46.158601562172) - (6.790725561213, 46.153901055876) - (6.790725561213, 46.149200549581) - (6.795426067509, 46.149200549581) - (6.795426067509, 46.144500043286) - (6.795426067509, 46.139799536991) - (6.800126573804, 46.139799536991) - (6.800126573804, 46.135099030696) - (6.804827080099, 46.135099030696) - (6.809527586394, 46.135099030696) - (6.809527586394, 46.1303985244) - (6.814228092689, 46.1303985244) - (6.818928598985, 46.1303985244) - (6.82362910528, 46.1303985244) - (6.828329611575, 46.1303985244) - (6.83303011787, 46.1303985244) - (6.83303011787, 46.135099030696) - (6.837730624166, 46.135099030696) - (6.842431130461, 46.135099030696) - (6.842431130461, 46.1303985244) - (6.847131636756, 46.1303985244) - (6.847131636756, 46.125698018105) - (6.851832143051, 46.125698018105) - (6.856532649346, 46.125698018105) - (6.861233155642, 46.125698018105) - (6.865933661937, 46.125698018105) - (6.870634168232, 46.125698018105) - (6.875334674527, 46.125698018105) - (6.880035180822, 46.125698018105) - (6.884735687118, 46.125698018105) - (6.889436193413, 46.125698018105) - (6.894136699708, 46.125698018105) - (6.898837206003, 46.125698018105) - (6.898837206003, 46.12099751181) - (6.898837206003, 46.116297005515) - (6.894136699708, 46.116297005515) - (6.894136699708, 46.111596499219) - (6.894136699708, 46.106895992924) - (6.889436193413, 46.106895992924) - (6.889436193413, 46.102195486629) - (6.889436193413, 46.097494980334) - (6.884735687118, 46.097494980334) - (6.884735687118, 46.092794474039) - (6.884735687118, 46.088093967743) - (6.889436193413, 46.088093967743) - (6.889436193413, 46.083393461448) - (6.889436193413, 46.078692955153) - (6.889436193413, 46.073992448858) - (6.884735687118, 46.073992448858) - (6.884735687118, 46.069291942563) - (6.880035180822, 46.069291942563) - (6.880035180822, 46.064591436267) - (6.875334674527, 46.064591436267) - (6.875334674527, 46.059890929972) - (6.875334674527, 46.055190423677) - (6.870634168232, 46.055190423677) - (6.870634168232, 46.050489917382) - (6.875334674527, 46.050489917382) - (6.875334674527, 46.045789411086) - (6.880035180822, 46.045789411086) - (6.884735687118, 46.045789411086) - (6.884735687118, 46.041088904791) - (6.889436193413, 46.041088904791) - (6.889436193413, 46.045789411086) - (6.894136699708, 46.045789411086) - (6.894136699708, 46.050489917382) - (6.898837206003, 46.050489917382) - (6.903537712299, 46.050489917382) - (6.908238218594, 46.050489917382) - (6.912938724889, 46.050489917382) - (6.912938724889, 46.055190423677) - (6.917639231184, 46.055190423677) - (6.917639231184, 46.059890929972) - (6.922339737479, 46.059890929972) - (6.922339737479, 46.064591436267) - (6.927040243775, 46.064591436267) - (6.93174075007, 46.064591436267) - (6.936441256365, 46.064591436267) - (6.936441256365, 46.059890929972) - (6.936441256365, 46.055190423677) - (6.94114176266, 46.055190423677) - (6.94114176266, 46.050489917382) - (6.945842268956, 46.050489917382) - (6.950542775251, 46.050489917382) - (6.950542775251, 46.045789411086) - (6.955243281546, 46.045789411086) - (6.955243281546, 46.041088904791) - (6.955243281546, 46.036388398496) - (6.959943787841, 46.036388398496) - (6.959943787841, 46.031687892201) - (6.964644294136, 46.031687892201) - (6.969344800432, 46.031687892201) - (6.969344800432, 46.026987385906) - (6.974045306727, 46.026987385906) - (6.974045306727, 46.02228687961) - (6.978745813022, 46.02228687961) - (6.978745813022, 46.017586373315) - (6.983446319317, 46.017586373315) - (6.983446319317, 46.01288586702) - (6.983446319317, 46.008185360725) - (6.983446319317, 46.00348485443) - (6.988146825612, 46.00348485443) - (6.992847331908, 46.00348485443) - (6.992847331908, 45.998784348134) - (6.997547838203, 45.998784348134) - (7.002248344498, 45.998784348134) - (7.006948850793, 45.998784348134) - (7.011649357089, 45.998784348134) - (7.011649357089, 45.994083841839) - (7.011649357089, 45.989383335544) - (7.011649357089, 45.984682829249) - (7.016349863384, 45.984682829249) - (7.021050369679, 45.984682829249) - (7.021050369679, 45.979982322953) - (7.021050369679, 45.975281816658) - (7.016349863384, 45.975281816658) - (7.011649357089, 45.975281816658) - (7.011649357089, 45.970581310363) - (7.011649357089, 45.965880804068) - (7.016349863384, 45.965880804068) - (7.016349863384, 45.961180297773) - (7.021050369679, 45.961180297773) - (7.025750875974, 45.961180297773) - (7.025750875974, 45.956479791477) - (7.030451382269, 45.956479791477) - (7.035151888565, 45.956479791477) - (7.035151888565, 45.951779285182) - (7.035151888565, 45.947078778887) - (7.035151888565, 45.942378272592) - (7.035151888565, 45.937677766297) - (7.03985239486, 45.937677766297) - (7.03985239486, 45.932977260001) - (7.03985239486, 45.928276753706) - (7.044552901155, 45.928276753706) - (7.044552901155, 45.923576247411) - (7.044552901155, 45.918875741116) - (7.04925340745, 45.918875741116) - (7.04925340745, 45.91417523482) - (7.053953913745, 45.91417523482) - (7.058654420041, 45.91417523482) - (7.063354926336, 45.91417523482) - (7.063354926336, 45.909474728525) - (7.063354926336, 45.90477422223) - (7.063354926336, 45.900073715935) - (7.068055432631, 45.900073715935) - (7.068055432631, 45.89537320964) - (7.072755938926, 45.89537320964) - (7.077456445222, 45.89537320964) - (7.077456445222, 45.890672703344) - (7.077456445222, 45.885972197049) - (7.082156951517, 45.885972197049) - (7.082156951517, 45.881271690754) - (7.086857457812, 45.881271690754) - (7.091557964107, 45.881271690754) - (7.091557964107, 45.876571184459) - (7.091557964107, 45.871870678164) - (7.096258470402, 45.871870678164) - (7.096258470402, 45.867170171868) - (7.096258470402, 45.862469665573) - (7.100958976698, 45.862469665573) - (7.100958976698, 45.857769159278) - (7.105659482993, 45.857769159278) - (7.110359989288, 45.857769159278) - (7.115060495583, 45.857769159278) - (7.119761001878, 45.857769159278) - (7.119761001878, 45.862469665573) - (7.124461508174, 45.862469665573) - (7.129162014469, 45.862469665573) - (7.129162014469, 45.867170171868) - (7.133862520764, 45.867170171868) - (7.133862520764, 45.871870678164) -```` - Here is the boundary. -````julia +````@example refinement boundary_nodes, points = convert_boundary_points_to_indices(boundary_points) rng = StableRNG(789) tri = triangulate(points; boundary_nodes, rng) @@ -5494,45 +264,25 @@ fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - Now let's refine. -````julia +````@example refinement A = get_area(tri) refine!(tri; min_angle=30.0, max_area=0.001A, rng) ```` -```` -Delaunay Triangulation. - Number of vertices: 14165 - Number of triangles: 23178 - Number of edges: 37342 - Has boundary nodes: true - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: true -```` - -````julia +````@example refinement fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - We see that the triangulation is now adequately refined. There are still triangles near the boundaries whose minimum angle is less than 30 degrees, though, because of the angles that boundary edges meet at in some places. Most of the triangles will satisfy the constraint, though, as we show below. -````julia +````@example refinement stats = statistics(tri) angles = first.(get_all_stat(stats, :angles)) # the first is the smallest fig, ax, sc = scatter(rad2deg.(angles)) @@ -5540,14 +290,10 @@ hlines!(ax, [30.0], color = :red, linewidth = 4) fig ```` -```@raw html - -``` - As we can see, the vast majority of the triangles satisfy the constraint, but there are still some that do not. Here is another set of results with a lower minimum angle constraint. -````julia +````@example refinement boundary_nodes, points = convert_boundary_points_to_indices(boundary_points) rng = StableRNG(789) tri = triangulate(points; boundary_nodes, rng) @@ -5564,10 +310,6 @@ resize_to_layout!(fig) fig ```` -```@raw html - -``` - In this case, all the triangles satisfy the constraint, of course at the expense of some other triangles having lesser quality. ## Just the code diff --git a/docs/src/tutorials/unconstrained.md b/docs/src/tutorials/unconstrained.md index 3e81b65b1..0a4ccb3ee 100644 --- a/docs/src/tutorials/unconstrained.md +++ b/docs/src/tutorials/unconstrained.md @@ -8,7 +8,7 @@ Our first example considers constructing unconstrained Delaunay triangulations. To start, let us load in the packages we will need. -````julia +````@example unconstrained using DelaunayTriangulation using CairoMakie # for plotting using StableRNGs # for reproducibility @@ -18,53 +18,31 @@ using LinearAlgebra # used for computing norms later We consider just triangulating a random set of points. First, generating the points: -````julia +````@example unconstrained rng = StableRNG(123) points = rand(rng, 2, 500) # just do rand(2, 500) if you are not concerned about the RNG ```` -```` -2×500 Matrix{Float64}: - 0.181026 0.669058 0.437991 0.763974 0.515045 0.70134 0.876273 0.739213 0.506876 0.266373 0.351618 0.721093 0.637996 0.363447 0.455205 0.348518 0.809794 0.223906 0.61295 0.329471 0.540632 0.223046 0.539128 0.419776 0.458012 0.687042 0.15147 0.785806 0.336894 0.343754 0.418788 0.256693 0.0639703 0.331352 0.244427 0.425703 0.491863 0.776779 0.360371 0.00263946 0.340133 0.270424 0.115997 0.813952 0.421372 0.722946 0.552395 0.797896 0.523122 0.288461 0.545081 0.437921 0.304731 0.89046 0.637476 0.813697 0.69858 0.151131 0.793309 0.329285 0.562948 0.0815702 0.279641 0.817653 0.801687 0.695043 0.307854 0.377544 0.558266 0.824428 0.796442 0.154541 0.0800997 0.691939 0.167874 0.933698 0.93185 0.791387 0.82006 0.708238 0.95372 0.753526 0.74857 0.659175 0.209896 0.196745 0.127467 0.524392 0.0829614 0.700979 0.134585 0.00688858 0.51353 0.24561 0.163308 0.435777 0.918945 0.166482 0.0568971 0.406672 0.527439 0.4354 0.21018 0.43972 0.301404 0.583691 0.874586 0.387704 0.350605 0.502661 0.582974 0.151539 0.276187 0.880838 0.152898 0.277676 0.549405 0.163404 0.129285 0.131234 0.196663 0.80264 0.869203 0.112288 0.110314 0.458535 0.784782 0.250383 0.917494 0.488987 0.54606 0.185561 0.995848 0.762547 0.308271 0.510413 0.178851 0.634063 0.931508 0.213869 0.183094 0.532255 0.625907 0.65799 0.628808 0.799758 0.481242 0.940936 0.881986 0.374775 0.374894 0.69412 0.932955 0.764663 0.101373 0.74717 0.905268 0.646034 0.230818 0.736922 0.327148 0.624086 0.978315 0.676679 0.675824 0.76549 0.310209 0.0560602 0.977099 0.400777 0.385446 0.153937 0.628224 0.0259813 0.556082 0.00130711 0.587556 0.521749 0.362642 0.517127 0.755883 0.153261 0.199942 0.301887 0.828024 0.0927618 0.622874 0.207796 0.022725 0.234718 0.1874 0.559458 0.402361 0.737495 0.100388 0.394142 0.796617 0.491243 0.435373 0.676698 0.601822 0.912472 0.65373 0.800586 0.665684 0.656845 0.925526 0.733754 0.106838 0.828335 0.431333 0.00736147 0.921623 0.507653 0.971479 0.269747 0.817207 0.215851 0.609782 0.711618 0.226012 0.539521 0.261726 0.66208 0.899939 0.876967 0.284227 0.351236 0.965389 0.949363 0.237952 0.998855 0.315107 0.0404263 0.675675 0.310525 0.791587 0.0233863 0.0955889 0.896359 0.762741 0.828236 0.769262 0.47533 0.063996 0.755876 0.973318 0.146077 0.770016 0.61136 0.263433 0.94654 0.906265 0.827459 0.966827 0.489265 0.987065 0.824262 0.288757 0.30942 0.195225 0.324369 0.529757 0.212361 0.900904 0.88208 0.511181 0.751019 0.420527 0.883097 0.219401 0.323676 0.637138 0.118389 0.868121 0.409298 0.270215 0.453449 0.123123 0.811252 0.389822 0.145426 0.820001 0.257654 0.135927 0.709894 0.462429 0.446925 0.856169 0.806983 0.881146 0.974744 0.167324 0.955413 0.967742 0.341459 0.958273 0.858018 0.621369 0.456395 0.503465 0.323223 0.0752862 0.955472 0.52896 0.902039 0.357986 0.237799 0.571431 0.834022 0.176041 0.788659 0.29665 0.554148 0.644947 0.954224 0.776911 0.620958 0.00291754 0.095197 0.0210285 0.664658 0.762682 0.484171 0.921929 0.901151 0.668319 0.262004 0.386269 0.436472 0.824224 0.683262 0.340386 0.117477 0.733987 0.442351 0.989014 0.978268 0.1671 0.330902 0.741137 0.554488 0.548208 0.616783 0.972508 0.266814 0.170246 0.410809 0.262931 0.755769 0.422182 0.604407 0.817767 0.974785 0.955647 0.739929 0.320489 0.62935 0.21621 0.272473 0.601508 0.414413 0.804268 0.196294 0.974554 0.583934 0.335481 0.539881 0.300205 0.337433 0.0202547 0.296958 0.494453 0.11217 0.0715926 0.564346 0.571969 0.53193 0.157119 0.289274 0.388633 0.779599 0.911604 0.117072 0.898052 0.462633 0.761786 0.505131 0.467784 0.0493592 0.0923198 0.0449557 0.135861 0.635555 0.909697 0.613948 0.279111 0.857699 0.00524744 0.120045 0.429042 0.0882701 0.193549 0.398813 0.610383 0.401103 0.53577 0.170252 0.872609 0.438583 0.750883 0.865202 0.266392 0.711303 0.637627 0.089177 0.410576 0.303547 0.894829 0.125559 0.473098 0.464572 0.806659 0.221016 0.0280905 0.810146 0.00827066 0.804782 0.0616697 0.941801 0.250919 0.237675 0.823915 0.541156 0.720895 0.803985 0.0786536 0.236702 0.956706 0.640619 0.958435 0.82819 0.882578 0.597655 0.564413 0.837944 0.418879 0.53278 0.818377 0.975019 0.382218 0.0698097 0.459689 0.236278 0.235126 0.0313331 0.537227 0.263279 0.460627 0.473966 0.944432 0.623716 0.785133 0.0120468 0.603183 0.0428481 0.145068 0.989866 0.413146 0.47412 0.762582 0.761679 0.968606 0.667712 0.253657 0.713645 0.181444 0.521983 0.0227201 0.0828667 0.259405 0.959931 0.42234 0.875965 0.353899 0.927026 0.62526 0.596537 0.973425 0.941601 0.0438116 0.911062 0.739358 0.864538 0.699831 0.400533 0.337066 0.459817 0.312727 0.0634304 - 0.36749 0.0427306 0.48329 0.924483 0.495042 0.693569 0.944219 0.559545 0.646024 0.253141 0.527389 0.188512 0.427843 0.577647 0.16582 0.737079 0.171167 0.848205 0.952542 0.918373 0.820474 0.598776 0.619535 0.453259 0.836069 0.353959 0.703671 0.551635 0.710355 0.405438 0.346188 0.157176 0.596071 0.0965347 0.128071 0.926538 0.134549 0.597526 0.034642 0.604342 0.0888438 0.290691 0.847073 0.0601803 0.679816 0.737598 0.970875 0.683298 0.855341 0.431233 0.638433 0.775729 0.745173 0.139747 0.856516 0.777063 0.152194 0.324202 0.0924124 0.00563978 0.579165 0.450706 0.0560835 0.50384 0.65171 0.389672 0.381893 0.7932 0.707537 0.515592 0.327837 0.817693 0.0475871 0.819659 0.125727 0.493807 0.311002 0.765118 0.521854 0.0734049 0.17116 0.90863 0.66635 0.63634 0.221245 0.241482 0.478185 0.390411 0.0617778 0.648669 0.308804 0.541835 0.428168 0.496737 0.545666 0.911066 0.0662768 0.649396 0.760846 0.248483 0.401041 0.0396139 0.900348 0.939905 0.873122 0.80144 0.0770524 0.506864 0.428658 0.121242 0.638559 0.974467 0.639326 0.835716 0.207941 0.592121 0.506314 0.186599 0.794883 0.802221 0.160557 0.191487 0.481045 0.0205251 0.751321 0.692231 0.0247294 0.521179 0.42381 0.890044 0.341701 0.48763 0.457178 0.452692 0.724959 0.192477 0.55463 0.513373 0.739426 0.00516507 0.42228 0.409429 0.843826 0.829954 0.53278 0.345138 0.571183 0.509987 0.33359 0.358201 0.0316704 0.686877 0.0452453 0.633021 0.100261 0.801601 0.203674 0.930138 0.222399 0.889327 0.93828 0.387938 0.0555843 0.348795 0.339641 0.294326 0.362177 0.876946 0.569376 0.550425 0.561675 0.154164 0.152203 0.36556 0.111442 0.735052 0.389202 0.886379 0.15633 0.144373 0.237032 0.145793 0.45279 0.0372542 0.440216 0.18769 0.692835 0.808651 0.622941 0.854403 0.373967 0.186052 0.246232 0.579073 0.1812 0.852832 0.999781 0.989092 0.776308 0.423385 0.843372 0.674218 0.1239 0.313695 0.38427 0.559683 0.207026 0.745099 0.331923 0.138651 0.0398031 0.391087 0.840941 0.487405 0.140799 0.904586 0.210664 0.543117 0.999184 0.260491 0.637879 0.154327 0.428806 0.533854 0.584642 0.63172 0.205341 0.473755 0.813529 0.46243 0.534511 0.361381 0.158313 0.151782 0.189559 0.036348 0.645382 0.865508 0.857054 0.529265 0.726127 0.417632 0.103866 0.97594 0.00780044 0.2739 0.930787 0.410755 0.676963 0.0768056 0.762454 0.868867 0.558984 0.736597 0.114093 0.867234 0.482919 0.0028658 0.309163 0.904961 0.828557 0.986628 0.199129 0.567569 0.977771 0.575212 0.401379 0.831577 0.0412443 0.459265 0.82129 0.0788373 0.0171894 0.853996 0.154636 0.062491 0.165524 0.091407 0.448646 0.0171893 0.0980491 0.855286 0.214436 0.1485 0.151223 0.751848 0.239441 0.27903 0.48538 0.00820996 0.560848 0.669526 0.014872 0.133648 0.057047 0.8933 0.401493 0.53216 0.800628 0.380869 0.507253 0.308986 0.952318 0.634803 0.262183 0.826332 0.132768 0.325102 0.407019 0.901277 0.0935133 0.835246 0.069461 0.122496 0.283896 0.486517 0.719179 0.0950475 0.0327314 0.0761925 0.433444 0.0667151 0.0517945 0.194546 0.0116186 0.633291 0.319646 0.455837 0.0323374 0.39123 0.72488 0.366719 0.930497 0.840097 0.560529 0.462569 0.374708 0.683058 0.150342 0.728512 0.0959656 0.286593 0.903991 0.196968 0.989066 0.199721 0.502435 0.14738 0.265107 0.0416473 0.114756 0.0747264 0.170444 0.747839 0.311876 0.497515 0.970706 0.429969 0.940689 0.0109684 0.674098 0.889181 0.642075 0.132777 0.103044 0.00559392 0.917282 0.645921 0.181392 0.76393 0.936732 0.388988 0.56209 0.929056 0.498177 0.707023 0.344282 0.919879 0.284647 0.632842 0.910668 0.0279172 0.328333 0.455078 0.370364 0.58211 0.803457 0.082038 0.861727 0.640028 0.705404 0.15266 0.896605 0.391123 0.420594 0.115443 0.43585 0.00436228 0.152666 0.933136 0.858691 0.0127729 0.964708 0.610086 0.136407 0.892495 0.815915 0.0629032 0.761915 0.17202 0.528866 0.537323 0.0417917 0.20407 0.705418 0.954324 0.576491 0.642704 0.800022 0.564916 0.195492 0.485029 0.0980802 0.0581283 0.960441 0.0577736 0.738122 0.604437 0.0428863 0.894244 0.96158 0.262416 0.573678 0.831426 0.32834 0.494434 0.375363 0.308775 0.964644 0.092962 0.534357 0.230757 0.811912 0.300044 0.614219 0.986509 0.770094 0.321493 0.549143 0.277844 0.929055 0.88323 0.0785272 0.872782 0.303657 0.962391 0.310815 0.47404 0.865449 0.815715 0.934553 0.534671 0.535503 0.458238 0.66025 0.206327 0.349035 0.980125 0.415568 0.171304 0.683687 0.414906 0.317704 0.818032 0.235651 0.0368418 0.0666789 0.813251 0.860372 0.189548 0.222904 0.550917 0.271007 0.0716159 0.188967 0.862459 0.933695 0.554072 0.827465 0.0370543 0.836151 0.0143462 0.494221 0.638122 0.395067 0.175565 0.942264 0.0794176 0.892313 0.606559 -```` - We now triangulate these points by using [`triangulate`](@ref). We pass the `rng` as a keyword argument, but again if you are not concerned about the RNG (or set the seed using `Random.seed!`) then you can ignore this. -````julia +````@example unconstrained tri = triangulate(points; rng=rng) ```` -```` -Delaunay Triangulation. - Number of vertices: 500 - Number of triangles: 980 - Number of edges: 1479 - Has boundary nodes: false - Has ghost triangles: true - Curve-bounded: false - Weighted: false - Constrained: false -```` - -````julia +````@example unconstrained fig, ax, sc = triplot(tri) fig ```` -```@raw html - -``` - This `tri` object is our [`Triangulation`](@ref), and we can interact with it in many ways. ## Iterating over vertices For example, we can iterate over the points in the triangulation using [`each_solid_vertex`](@ref). Here we compute the centroid of the point cloud: -````julia +````@example unconstrained function compute_centroid(tri) s = [0.0, 0.0] for i in each_solid_vertex(tri) @@ -77,572 +55,35 @@ end s = compute_centroid(tri) ```` -```` -2-element Vector{Float64}: - 0.5106629621450203 - 0.477077379328767 -```` - We need to use the `solid` identifier because triangulations are made up of both _solid_ and _ghost_ vertices/edges/triangles, for reasons described in the [manual](../manual/ghost_triangles.md). If we just use [`each_vertex(tri)`](@ref each_vertex), then we also find a vertex `-1` that corresponds to the boundary. For example, the points on the boundary can be obtained using: -````julia +````@example unconstrained get_neighbours(tri, -1) ```` -```` -Set{Int64} with 18 elements: - 456 - 176 - 425 - 258 - 325 - 398 - 197 - 219 - 319 - 262 - 112 - 345 - 371 - 232 - 245 - 163 - 468 - 140 -```` - One reason to be careful with this especially is that `get_point(tri, -1)` does actually correspond to a coordinate, -````julia +````@example unconstrained get_point(tri, -1) ```` -```` -(0.500547641525688, 0.497711096515429) -```` - (This is the pole of inaccessibility for the domain; see [here](../tutorials/pole_of_inaccessibility.md) for more details.) You can use [`each_vertex`](@ref) or [`each_ghost_vertex`](@ref) to consider all types of vertices or only the ghost vertices. If you just want the vertices, use `each_vertex(tri)`, which will also include the ghost vertex. -````julia +````@example unconstrained each_vertex(tri) ```` -```` -Set{Int64} with 501 elements: - 319 - 185 - 420 - 365 - 422 - 263 - 242 - 183 - 224 - 177 - 77 - 172 - 103 - 59 - 211 - 358 - 366 - 414 - 116 - 79 - 279 - 485 - 46 - 152 - 250 - 448 - 438 - 436 - 454 - 154 - 206 - 500 - 40 - 245 - 325 - 145 - 444 - 342 - 457 - 460 - 351 - 158 - 92 - 118 - 162 - 494 - 93 - 304 - 18 - 349 - 368 - 217 - 61 - 412 - 212 - 474 - 223 - 285 - 198 - 331 - 80 - 51 - 490 - 143 - 330 - 284 - 419 - 367 - 186 - 90 - 456 - 316 - 179 - 52 - 369 - 356 - 487 - 85 - 406 - 10 - 261 - 484 - 340 - 329 - 466 - 241 - 236 - 190 - 14 - 357 - 403 - 123 - 305 - 197 - 233 - 196 - 408 - 324 - 54 - 327 - 62 - 205 - 483 - 122 - 58 - 385 - 321 - 318 - 87 - 317 - 248 - 202 - 455 - 160 - 289 - 49 - 396 - 131 - 373 - 53 - 492 - 286 - 181 - 446 - 56 - 429 - 425 - 60 - 220 - 308 - 67 - 215 - 404 - 168 - 431 - 364 - 479 - 75 - 111 - 66 - 280 - 374 - 141 - 278 - 477 - 450 - 135 - 138 - 107 - 170 - 238 - 22 - 391 - 288 - 400 - 113 - 283 - 309 - 55 - 265 - 136 - 117 - 218 - 28 - 84 - 203 - 353 - 292 - 232 - 240 - 147 - 415 - 146 - 390 - 380 - 424 - 193 - 226 - 488 - 17 - 271 - 335 - 426 - 89 - 214 - 48 - 493 - 134 - 473 - 253 - 64 - 394 - 410 - 486 - 300 - 171 - 478 - 216 - 108 - 382 - 2 - 27 - 124 - 273 - 312 - 290 - 20 - 81 - 398 - 9 - 189 - 409 - 249 - 395 - 372 - 88 - 260 - 37 - 121 - 311 - 281 - 174 - 496 - 322 - 269 - 262 - 320 - 151 - 244 - 434 - 277 - 377 - 34 - 50 - 243 - 194 - 301 - 458 - -1 - 106 - 102 - 259 - 379 - 21 - 440 - 192 - 362 - 47 - 407 - 178 - 387 - 306 - 472 - 155 - 293 - 499 - 73 - 251 - 115 - 112 - 86 - 207 - 465 - 430 - 23 - 264 - 41 - 68 - 130 - 125 - 339 - 336 - 343 - 468 - 100 - 230 - 195 - 388 - 222 - 276 - 381 - 247 - 184 - 1 - 435 - 137 - 427 - 237 - 270 - 33 - 254 - 482 - 165 - 142 - 416 - 5 - 45 - 418 - 449 - 282 - 393 - 437 - 148 - 36 - 7 - 95 - 25 - 296 - 476 - 341 - 287 - 19 - 44 - 266 - 31 - 29 - 303 - 159 - 463 - 101 - 360 - 462 - 246 - 97 - 402 - 413 - 110 - 30 - 234 - 272 - 182 - 164 - 470 - 267 - 4 - 359 - 328 - 69 - 11 - 119 - 495 - 307 - 144 - 257 - 352 - 200 - 187 - 213 - 227 - 109 - 445 - 453 - 498 - 120 - 297 - 24 - 464 - 433 - 447 - 314 - 480 - 315 - 268 - 497 - 32 - 471 - 239 - 191 - 150 - 199 - 361 - 98 - 411 - 310 - 169 - 180 - 428 - 347 - 375 - 332 - 229 - 163 - 467 - 338 - 3 - 96 - 35 - 348 - 417 - 333 - 376 - 12 - 82 - 71 - 208 - 26 - 127 - 389 - 295 - 57 - 475 - 397 - 129 - 78 - 133 - 72 - 258 - 252 - 313 - 354 - 299 - 345 - 231 - 432 - 114 - 337 - 275 - 363 - 378 - 176 - 469 - 451 - 157 - 392 - 16 - 370 - 489 - 74 - 228 - 105 - 399 - 421 - 166 - 274 - 15 - 6 - 219 - 153 - 139 - 13 - 405 - 104 - 302 - 43 - 39 - 443 - 126 - 441 - 156 - 439 - 346 - 344 - 294 - 481 - 161 - 383 - 401 - 209 - 323 - 8 - 83 - 201 - 99 - 491 - 386 - 461 - 334 - 423 - 210 - 63 - 91 - 173 - 256 - 188 - 355 - 235 - 204 - 384 - 371 - 76 - 167 - 42 - 132 - 140 - 442 - 255 - 291 - 452 - 94 - 225 - 128 - 70 - 350 - 38 - 326 - 221 - 175 - 459 - 149 - 65 - 298 -```` - ## Iterating over edges We can also iterate over the edges of the triangulation using [`each_solid_edge`](@ref), or [`each_edge`](@ref) for both solid and ghost edges and [`each_ghost_edge`](@ref) for only the ghost edges. To give an example, here we compute the average length of an edge. -````julia +````@example unconstrained function compute_mean_edge_length(tri) ℓ = 0.0 for e in each_solid_edge(tri) @@ -656,1517 +97,12 @@ end ℓ = compute_mean_edge_length(tri) ```` -```` -0.05645693808033534 -```` - By default, the triangulation has ghost edges, so [`each_edge`](@ref) and [`each_solid_edge`](@ref) are not the same. -````julia +````@example unconstrained each_edge(tri) ```` -```` -Set{Tuple{Int64, Int64}} with 1497 elements: - (453, 388) - (276, 329) - (17, 12) - (382, 127) - (4, 197) - (366, 352) - (34, 313) - (407, 106) - (114, 56) - (194, 90) - (263, 136) - (498, 388) - (345, 446) - (343, 47) - (375, 33) - (412, 433) - (292, 304) - (290, 127) - (274, 334) - (427, 176) - (29, 16) - (435, 472) - (124, 320) - (424, 311) - (272, 41) - (63, 413) - (458, 50) - (208, 156) - (404, 171) - (94, 132) - (261, 103) - (229, 139) - (250, 352) - (358, 117) - (412, 240) - (237, 363) - (196, 199) - (55, 158) - (11, 228) - (149, 442) - (299, 286) - (451, 36) - (217, 353) - (241, 471) - (338, 139) - (379, 186) - (410, 496) - (167, 30) - (359, 403) - (452, 371) - (112, -1) - (372, 223) - (480, 195) - (322, 80) - (138, 145) - (277, 284) - (219, 19) - (243, 57) - (24, 336) - (271, 18) - (262, 244) - (140, 413) - (116, 128) - (183, 328) - (312, 82) - (296, 499) - (235, 173) - (239, 274) - (43, 334) - (78, 156) - (150, 483) - (34, 284) - (26, 165) - (494, 65) - (273, 322) - (234, 392) - (356, 224) - (346, 159) - (381, 406) - (262, 198) - (481, 159) - (345, 439) - (423, 210) - (6, 83) - (255, 97) - (154, 38) - (82, 160) - (282, 261) - (147, 9) - (402, 73) - (170, 171) - (445, 23) - (468, -1) - (230, 316) - (11, 14) - (115, 186) - (175, 110) - (24, 228) - (442, 246) - (466, 480) - (248, 191) - (122, 17) - (292, 338) - (430, 252) - (447, 68) - (410, 348) - (48, 249) - (272, 236) - (20, 333) - (174, 212) - (71, 435) - (452, 374) - (300, 93) - (491, 334) - (221, 135) - (279, 132) - (26, 435) - (74, 286) - (44, 484) - (370, 53) - (402, 293) - (19, 47) - (422, 170) - (129, 270) - (483, 193) - (317, 471) - (216, 260) - (195, 186) - (448, 288) - (300, 88) - (36, 406) - (230, 133) - (93, 117) - (104, 36) - (99, 491) - (327, 315) - (474, 144) - (140, 360) - (199, 68) - (279, 384) - (497, 357) - (247, 252) - (423, 44) - (202, 226) - (78, 317) - (296, 406) - (450, 473) - (184, 313) - (438, 42) - (74, 156) - (294, 215) - (447, 16) - (338, 468) - (443, 56) - (354, 139) - (381, 367) - (61, 117) - (480, 392) - (308, 191) - (97, 484) - (160, 268) - (386, 404) - (136, 180) - (369, 227) - (143, 144) - (245, 140) - (89, 124) - (181, 414) - (3, 336) - (6, 286) - (130, 389) - (148, 316) - (155, 320) - (336, 330) - (183, 141) - (151, 281) - (243, 12) - (496, 348) - (60, 366) - (457, 288) - (109, 469) - (452, 303) - (62, 464) - (10, 227) - (371, 479) - (130, 244) - (495, 472) - (254, 78) - (121, 118) - (282, 72) - (461, 7) - (316, 257) - (24, 469) - (478, 460) - (371, 168) - (108, 3) - (291, 266) - (321, 464) - (84, 206) - (279, 141) - (481, 346) - (179, 307) - (106, 376) - (225, 266) - (292, 169) - (412, 291) - (213, 306) - (74, 160) - (280, 426) - (245, 402) - (273, 290) - (390, 500) - (122, 353) - (452, 168) - (220, 315) - (162, 164) - (91, 209) - (385, 297) - (405, 396) - (28, 411) - (273, 2) - (256, 25) - (240, 253) - (126, 45) - (373, 422) - (296, 367) - (129, 230) - (138, 358) - (260, 20) - (206, 462) - (167, 67) - (150, 469) - (488, 206) - (377, 162) - (235, 220) - (335, 206) - (255, 215) - (59, 423) - (350, 476) - (133, 468) - (487, 55) - (22, 116) - (155, 311) - (167, 308) - (42, 308) - (450, 77) - (354, 468) - (166, 435) - (345, 468) - (398, 325) - (350, 323) - (69, 106) - (113, 116) - (145, 462) - (441, 482) - (213, 114) - (215, 365) - (351, 278) - (309, 358) - (25, 389) - (493, 436) - (453, 102) - (322, 2) - (386, 45) - (461, 439) - (272, 313) - (385, 149) - (335, 411) - (345, 197) - (59, 44) - (233, 307) - (205, 200) - (255, 294) - (429, 319) - (499, 260) - (41, 281) - (459, 401) - (215, 232) - (64, 436) - (138, 224) - (11, 458) - (480, 379) - (324, 136) - (318, 352) - (189, 500) - (97, 295) - (493, 134) - (420, 95) - (113, 380) - (316, 76) - (231, 264) - (344, 405) - (476, 127) - (456, 371) - (377, 342) - (119, 72) - (115, 118) - (354, 489) - (447, 52) - (428, 363) - (276, 281) - (486, 310) - (452, 393) - (160, 144) - (377, 444) - (223, 141) - (378, 130) - (489, 468) - (309, 177) - (213, 252) - (370, 105) - (59, 323) - (434, 478) - (437, 212) - (450, 232) - (312, 310) - (109, 50) - (273, 250) - (339, 118) - (432, 86) - (208, 241) - (154, 83) - (414, 220) - (310, 114) - (120, 72) - (96, 362) - (195, 118) - (466, 234) - (499, 20) - (289, 70) - (16, 68) - (370, 68) - (261, 188) - (160, 55) - (23, 9) - (15, 421) - (383, 385) - (373, 117) - (48, 471) - (302, 483) - (480, 186) - (256, 49) - (64, 79) - (494, 266) - (43, 274) - (313, 236) - (438, 308) - (368, 111) - (28, 433) - (173, 405) - (298, 449) - (283, 353) - (175, 396) - (130, 96) - (225, 482) - (306, 229) - (182, 285) - (105, 68) - (279, 437) - (324, 470) - (322, 250) - (340, 135) - (63, 184) - (76, 270) - (499, 216) - (84, 415) - (237, 249) - (147, 422) - (157, 207) - (219, 197) - (461, 247) - (42, 455) - (446, 265) - (103, 393) - (245, 429) - (205, 164) - (382, 426) - (33, 92) - (194, 206) - (328, 223) - (439, 468) - (51, 111) - (163, -1) - (370, 16) - (181, 283) - (466, 91) - (62, 384) - (445, 51) - (194, 154) - (132, 87) - (335, 224) - (254, 409) - (273, 366) - (177, 131) - (46, 286) - (216, 103) - (104, 130) - (78, 387) - (410, 193) - (493, 224) - (330, 31) - (370, 251) - (214, 422) - (116, 418) - (79, 449) - (175, 405) - (54, 107) - (87, 384) - (1, 467) - (456, 303) - (326, 202) - (105, 190) - (298, 289) - (80, 341) - (45, 9) - (85, 159) - (54, 97) - (181, 442) - (150, 330) - (138, 117) - (312, 268) - (91, 58) - (201, 343) - (133, 337) - (185, 289) - (408, 477) - (22, 221) - (105, 251) - (420, 33) - (80, 476) - (185, 270) - (17, 353) - (35, 313) - (60, 140) - (55, 144) - (69, 368) - (448, 131) - (432, 10) - (113, 221) - (378, 178) - (69, 376) - (242, 270) - (100, 410) - (80, 323) - (189, 390) - (340, 29) - (488, 84) - (487, 19) - (437, 467) - (84, 187) - (163, 295) - (470, 37) - (90, 83) - (420, 87) - (420, 137) - (99, 125) - (378, 47) - (309, 117) - (445, 61) - (137, 347) - (54, 210) - (425, 371) - (473, 232) - (429, 234) - (473, 297) - (19, 158) - (415, 187) - (237, 428) - (248, 141) - (267, 93) - (496, 193) - (25, 460) - (487, 201) - (464, 212) - (358, 13) - (307, 281) - (333, 367) - (191, 223) - (472, 134) - (301, 214) - (296, 20) - (476, 290) - (262, 497) - (67, 30) - (205, 66) - (22, 113) - (194, 335) - (457, 131) - (75, 182) - (222, 180) - (267, 88) - (299, 106) - (258, -1) - (279, 248) - (243, 17) - (53, 135) - (279, 87) - (436, 289) - (35, 284) - (307, 348) - (476, 2) - (461, 430) - (175, 388) - (48, 65) - (277, 32) - (243, 59) - (474, 286) - (242, 385) - (157, 275) - (28, 38) - (345, -1) - (438, 455) - (181, 246) - (208, 78) - (104, 451) - (456, 425) - (256, 130) - (397, 458) - (33, 500) - (40, 33) - (357, 431) - (332, 26) - (220, 246) - (465, 361) - (403, 431) - (95, 347) - (310, 82) - (263, 222) - (397, 50) - (76, 123) - (237, 154) - (250, 318) - (395, 297) - (283, 442) - (493, 200) - (93, 5) - (162, 165) - (4, 158) - (93, 142) - (238, 371) - (497, 333) - (278, 110) - (466, 209) - (211, 276) - (176, -1) - (369, 346) - (450, 355) - (32, 121) - (324, 287) - (377, 177) - (69, 9) - (361, 368) - (488, 117) - (361, 376) - (486, 213) - (219, 47) - (482, 253) - (287, 410) - (136, 470) - (240, 291) - (196, 296) - (387, 268) - (366, 388) - (443, 306) - (60, 360) - (322, 203) - (279, 62) - (301, 422) - (264, 116) - (419, 443) - (432, 475) - (494, 202) - (464, 92) - (302, 10) - (331, 254) - (298, 123) - (438, 58) - (148, 253) - (273, 352) - (357, 161) - (188, 251) - (138, 462) - (196, 401) - (359, 216) - (316, 441) - (451, 367) - (207, 77) - (64, 70) - (57, 80) - (27, 221) - (472, 146) - (471, 249) - (299, 143) - (11, 108) - (58, 209) - (169, 304) - (180, 37) - (340, 53) - (390, 391) - (58, 308) - (263, 305) - (172, 339) - (267, 300) - (113, 135) - (228, 458) - (197, 446) - (24, 3) - (489, 252) - (424, 140) - (107, 210) - (401, 362) - (351, 276) - (266, 253) - (481, 10) - (302, 259) - (456, 416) - (485, 233) - (400, 374) - (194, 84) - (228, 50) - (219, -1) - (478, 69) - (11, 171) - (344, 192) - (27, 119) - (100, 193) - (443, 114) - (147, 170) - (331, 202) - (54, 294) - (444, 327) - (463, 436) - (397, 223) - (331, 317) - (213, 229) - (376, 368) - (221, 251) - (35, 121) - (62, 437) - (470, 180) - (203, 173) - (378, 244) - (107, 423) - (454, 105) - (440, 203) - (25, 199) - (348, 281) - (419, 139) - (126, 52) - (140, 293) - (103, 403) - (490, 153) - (24, 108) - (236, 39) - (168, 491) - (14, 418) - (40, 399) - (463, 411) - (6, 90) - (424, 413) - (479, 168) - (89, 234) - (479, 491) - (371, 176) - (75, 364) - (321, 437) - (280, 44) - (162, 327) - (256, 178) - (199, 460) - (309, 101) - (375, 92) - (300, 288) - (248, 437) - (464, 375) - (446, 7) - (181, 220) - (336, 422) - (282, 103) - (394, 164) - (57, 12) - (299, 474) - (271, 188) - (222, 314) - (427, 390) - (107, 44) - (116, 14) - (27, 391) - (169, 338) - (98, 27) - (201, 106) - (353, 210) - (424, 477) - (238, 479) - (435, 146) - (158, 197) - (473, 355) - (34, 307) - (424, 63) - (93, 336) - (342, 305) - (288, 31) - (44, 426) - (153, 295) - (42, 10) - (238, 168) - (457, 305) - (465, 84) - (91, 379) - (299, 376) - (488, 462) - (285, 195) - (463, 79) - (230, 297) - (301, 117) - (241, 317) - (431, 161) - (327, 165) - (314, 180) - (432, 349) - (108, 170) - (450, 215) - (194, 38) - (454, 190) - (318, 396) - (17, 210) - (65, 363) - (266, 226) - (495, 134) - (185, 472) - (459, 362) - (167, 259) - (42, 259) - (124, 402) - (458, 128) - (84, 111) - (27, 188) - (200, 134) - (242, 472) - (104, 244) - (219, 198) - (74, 474) - (372, 30) - (264, 218) - (286, 156) - (481, 475) - (465, 187) - (82, 158) - (166, 71) - (42, 432) - (205, 13) - (368, 23) - (371, -1) - (58, 455) - (98, 500) - (284, 233) - (129, 395) - (61, 23) - (458, 328) - (63, 313) - (37, 110) - (140, -1) - (130, 459) - (211, 329) - (451, 333) - (399, 212) - (62, 87) - (407, 69) - (81, 450) - (58, 1) - (147, 386) - (11, 116) - (488, 111) - (404, 418) - (182, 172) - (60, 39) - (404, 45) - (148, 240) - (359, 103) - (41, 307) - (487, 343) - (289, 270) - (51, 23) - (266, 433) - (179, 233) - (188, 72) - (18, 190) - (369, 233) - (263, 192) - (202, 139) - (237, 65) - (230, 257) - (424, 364) - (201, 143) - (137, 218) - (248, 1) - (447, 199) - (258, 398) - (34, 272) - (94, 458) - (140, 258) - (311, 477) - (40, 176) - (417, 171) - (133, 338) - (428, 154) - (258, 290) - (125, 119) - (445, 488) - (235, 57) - (135, 418) - (466, 399) - (354, 338) - (50, 30) - (319, -1) - (400, 393) - (97, 365) - (211, 102) - (366, 102) - (335, 8) - (88, 101) - (492, 153) - (256, 389) - (15, 37) - (300, 31) - (250, 440) - (15, 348) - (220, 435) - (308, 1) - (60, 184) - (113, 418) - (155, 234) - (321, 62) - (200, 224) - (324, 421) - (485, 369) - (85, 86) - (354, 229) - (216, 431) - (485, 179) - (234, 319) - (25, 459) - (121, 159) - (89, 429) - (196, 105) - (398, 44) - (494, 363) - (39, 281) - (436, 356) - (125, 391) - (463, 28) - (342, 192) - (456, 112) - (330, 469) - (415, 286) - (400, 416) - (66, 435) - (243, 210) - (28, 449) - (340, 370) - (309, 142) - (340, 16) - (382, 476) - (85, 115) - (138, 13) - (147, 373) - (18, 261) - (285, 155) - (117, 5) - (350, 80) - (196, 68) - (273, 476) - (181, 122) - (466, 392) - (486, 7) - (49, 343) - (349, 10) - (382, 323) - (245, -1) - (152, 90) - (249, 83) - (230, 76) - (198, 378) - (81, 215) - (133, 169) - (15, 351) - (293, 477) - (325, -1) - (203, 396) - (243, 423) - (427, 391) - (287, 136) - (7, 265) - (154, 90) - (386, 417) - (220, 327) - (219, 158) - (137, 22) - (380, 418) - (198, 47) - (98, 390) - (419, 306) - (372, 67) - (453, 498) - (216, 161) - (208, 46) - (489, 229) - (262, 431) - (312, 56) - (235, 12) - (190, 251) - (388, 110) - (289, 123) - (20, 161) - (278, 276) - (403, 112) - (104, 96) - (409, 56) - (126, 9) - (462, 117) - (165, 164) - (81, 294) - (54, 157) - (184, 413) - (434, 201) - (203, 405) - (174, 209) - (35, 32) - (260, 161) - (42, 349) - (214, 5) - (243, 341) - (373, 23) - (388, 278) - (24, 109) - (455, 86) - (183, 223) - (421, 410) - (292, 202) - (287, 288) - (364, 339) - (153, 325) - (35, 424) - (352, 175) - (148, 76) - (298, 412) - (457, 377) - (428, 433) - (75, 339) - (194, 8) - (435, 246) - (15, 410) - (386, 9) - (288, 483) - (398, 492) - (478, 126) - (86, 159) - (209, 467) - (163, 365) - (408, 293) - (243, 323) - (3, 422) - (136, 222) - (174, 437) - (344, 342) - (225, 304) - (11, 128) - (344, 444) - (200, 495) - (465, 111) - (258, 366) - (416, 374) - (326, 304) - (408, 155) - (303, 371) - (163, 232) - (167, 372) - (409, 443) - (223, 50) - (64, 289) - (231, 116) - (211, 269) - (48, 317) - (53, 251) - (284, 313) - (456, -1) - (402, 140) - (277, 346) - (393, 374) - (184, 360) - (394, 13) - (404, 14) - (331, 78) - (71, 146) - (414, 12) - (120, 119) - (361, 187) - (478, 49) - (196, 362) - (485, 496) - (429, 73) - (142, 101) - (256, 460) - (343, 19) - (362, 36) - (288, 305) - (312, 160) - (387, 56) - (54, 275) - (60, 236) - (22, 264) - (29, 135) - (441, 169) - (490, 295) - (450, 207) - (189, 33) - (65, 249) - (347, 218) - (40, 212) - (232, 468) - (196, 406) - (49, 178) - (98, 221) - (416, 303) - (97, 107) - (6, 152) - (169, 257) - (151, 39) - (136, 305) - (303, 374) - (301, 373) - (395, 270) - (441, 253) - (427, 479) - (400, 403) - (6, 46) - (430, 7) - (261, 72) - (295, 365) - (177, 88) - (409, 139) - (409, 202) - (198, 244) - (451, 497) - (377, 131) - (242, 395) - (427, 491) - (11, 170) - (282, 334) - (96, 459) - (135, 251) - (318, 440) - (492, 484) - (427, 99) - (172, 118) - (60, 329) - (381, 296) - (197, -1) - (157, 77) - (299, 415) - (10, 475) - (119, 188) - (454, 18) - (350, 382) - (383, 473) - (240, 123) - (132, 347) - (241, 78) - (129, 297) - (262, 104) - (301, 5) - (133, 232) - (283, 157) - (74, 268) - (57, 203) - (133, 297) - (302, 485) - (109, 30) - (428, 38) - (147, 23) - (376, 187) - (75, 155) - (400, 112) - (434, 49) - (395, 385) - (302, 150) - (387, 156) - (448, 88) - (440, 396) - (8, 411) - (137, 95) - (200, 138) - (351, 281) - (455, 432) - (381, 36) - (6, 471) - (413, 360) - (154, 249) - (351, 37) - (310, 4) - (98, 391) - (337, 297) - (262, 219) - (351, 348) - (314, 110) - (275, 353) - (98, 22) - (267, 101) - (254, 56) - (300, 336) - (176, 319) - (40, 92) - (308, 259) - (389, 459) - (453, 278) - (60, 102) - (269, 276) - (420, 375) - (498, 278) - (216, 105) - (437, 209) - (379, 455) - (51, 368) - (40, 189) - (150, 30) - (107, 484) - (495, 66) - (192, 405) - (225, 169) - (151, 276) - (41, 39) - (231, 218) - (302, 193) - (29, 404) - (448, 457) - (323, 426) - (291, 253) - (200, 66) - (133, 257) - (425, -1) - (25, 401) - (341, 323) - (271, 190) - (225, 253) - (179, 496) - (27, 125) - (332, 164) - (108, 228) - (247, 439) - (299, 144) - (420, 500) - (180, 110) - (486, 430) - (399, 319) - (271, 251) - (383, 77) - (119, 334) - (6, 415) - (191, 141) - (359, 431) - (89, 73) - (282, 393) - (344, 315) - (121, 339) - (174, 399) - (283, 275) - (454, 216) - (60, 258) - (285, 118) - (212, 92) - (102, 276) - (444, 342) - (167, 150) - (331, 494) - (445, 111) - (424, 293) - (119, 491) - (3, 170) - (82, 4) - (408, 320) - (448, 300) - (466, 174) - (228, 109) - (368, 9) - (457, 342) - (85, 121) - (345, 265) - (434, 343) - (435, 165) - (81, 207) - (379, 58) - (325, 163) - (390, 176) - (192, 222) - (120, 334) - (179, 348) - (489, 213) - (230, 270) - (231, 128) - (235, 414) - (397, 328) - (402, 429) - (331, 409) - (102, 388) - (277, 233) - (358, 394) - (222, 405) - (32, 159) - (81, 157) - (231, 94) - (417, 170) - (232, 337) - (280, 258) - (148, 441) - (162, 444) - (452, 239) - (420, 98) - (89, 155) - (97, 294) - (185, 134) - (26, 164) - (27, 251) - (34, 233) - (74, 144) - (124, 73) - (70, 79) - (355, 77) - (85, 118) - (262, 403) - (4, 446) - (239, 334) - (262, 357) - (155, 195) - (71, 204) - (235, 315) - (494, 428) - (442, 77) - (29, 418) - (29, 45) - (361, 111) - (383, 297) - (271, 261) - (122, 12) - (35, 63) - (321, 212) - (91, 480) - (332, 66) - (298, 79) - (463, 449) - (150, 31) - (225, 226) - (34, 41) - (122, 217) - (80, 2) - (302, 227) - (97, 492) - (124, 293) - (115, 195) - (145, 206) - (204, 146) - (239, 168) - (239, 491) - (408, 311) - (60, 151) - (326, 226) - (436, 411) - (487, 158) - (471, 83) - (232, -1) - (499, 105) - (192, 305) - (52, 460) - (473, 337) - (308, 223) - (149, 77) - (262, 112) - (100, 483) - (490, 163) - (346, 227) - (132, 183) - (436, 134) - (490, 325) - (481, 227) - (189, 176) - (177, 358) - (478, 407) - (335, 356) - (84, 90) - (441, 257) - (312, 387) - (373, 61) - (157, 442) - (8, 28) - (94, 183) - (162, 394) - (419, 229) - (75, 285) - (59, 426) - (95, 87) - (291, 433) - (383, 149) - (272, 39) - (280, 127) - (255, 365) - (66, 26) - (493, 356) - (76, 240) - (398, 484) - (181, 12) - (175, 314) - (379, 86) - (38, 433) - (262, 451) - (149, 146) - (202, 304) - (435, 327) - (497, 161) - (181, 217) - (235, 203) - (199, 401) - (267, 142) - (247, 468) - (469, 30) - (55, 143) - (310, 7) - (436, 79) - (166, 442) - (269, 329) - (32, 346) - (486, 114) - (46, 471) - (379, 115) - (298, 433) - (439, 265) - (155, 392) - (35, 364) - (282, 274) - (352, 396) - (126, 69) - (242, 146) - (421, 470) - (151, 329) - (312, 114) - (393, 274) - (485, 193) - (115, 86) - (478, 52) - (116, 380) - (310, 446) - (454, 103) - (494, 48) - (298, 240) - (131, 88) - (15, 470) - (433, 449) - (404, 417) - (97, 153) - (204, 149) - (475, 159) - (239, 393) - (8, 38) - (364, 311) - (447, 45) - (54, 81) - (275, 210) - (364, 121) - (447, 126) - (58, 467) - (99, 119) - (132, 218) - (408, 124) - (75, 311) - (268, 156) - (166, 204) - (287, 483) - (203, 80) - (201, 55) - (279, 183) - (434, 407) - (398, -1) - (160, 158) - (322, 440) - (270, 123) - (31, 483) - (247, 430) - (137, 264) - (242, 185) - (461, 265) - (96, 36) - (93, 214) - (14, 171) - (365, 232) - (247, 489) - (94, 218) - (302, 42) - (302, 167) - (432, 159) - (486, 252) - (200, 13) - (72, 334) - (248, 467) - (202, 338) - (495, 435) - (162, 358) - (102, 329) - (195, 392) - (308, 372) - (49, 460) - (287, 100) - (331, 48) - (206, 224) - (444, 315) - (57, 341) - (166, 246) - (62, 375) - (287, 421) - (278, 37) - (356, 411) - (152, 415) - (273, 258) - (296, 105) - (205, 332) - (434, 21) - (494, 226) - (239, 43) - (18, 103) - (283, 217) - (20, 367) - (333, 161) - (145, 224) - (314, 405) - (99, 391) - (393, 403) - (372, 50) - (426, 127) - (262, -1) - (87, 375) - (299, 201) - (436, 185) - (434, 106) - (87, 347) - (52, 199) - (300, 330) - (336, 469) - (277, 369) - (409, 419) - (287, 305) - (176, 479) - (89, 320) - (242, 149) - (344, 235) - (162, 177) - (45, 16) - (152, 84) - (285, 172) - (169, 482) - (94, 128) - (184, 236) - (416, 112) - (383, 355) - (40, 319) - (309, 93) - (381, 451) - (245, 319) - (362, 406) - (453, 276) - (492, 325) - (344, 173) - (407, 21) - (241, 46) - (234, 399) - (78, 56) - (326, 225) - (494, 433) - (280, 398) - (130, 178) - (386, 170) - (204, 442) - (284, 32) - (352, 388) - (191, 1) - (485, 227) - (415, 376) - (93, 422) - (205, 394) - (309, 88) - (21, 106) - (306, 114) - (94, 328) - (343, 378) - (343, 178) - (182, 339) - (488, 61) - (208, 286) - (280, 290) - (298, 70) - (98, 137) -```` - Note also that the edges are all given as unordered, so the set of edges only includes one of `(i, j)` and `(j, i)` for each edge `(i, j)`. @@ -2175,7 +111,7 @@ Similarly, we can iterate over the triangles using [`each_solid_triangle`](@ref) or [`each_triangle`](@ref). By default, ghost triangles are included in the output. Here we compute the area of the domain by getting the area of each triangle. -````julia +````@example unconstrained area(p, q, r) = 0.5 * ((getx(q) - getx(p)) * (gety(r) - gety(p)) - (gety(q) - gety(p)) * (getx(r) - getx(p))) function compute_triangulation_area(tri) A = 0.0 @@ -2189,1019 +125,13 @@ end A = compute_triangulation_area(tri) ```` -```` -0.9683345161527972 -```` - (You can compute areas like this using [`get_area(tri)`](@ref get_area).) You can access the set of `triangles` using [`get_triangles(tri)`](@ref get_triangles): -````julia +````@example unconstrained get_triangles(tri) ```` -```` -Set{Tuple{Int64, Int64, Int64}} with 998 elements: - (59, 426, 44) - (163, 365, 295) - (383, 473, 297) - (499, 260, 216) - (185, 134, 472) - (239, 43, 274) - (300, 31, 288) - (113, 135, 221) - (461, 7, 430) - (230, 257, 316) - (57, 203, 80) - (277, 284, 233) - (74, 144, 474) - (398, 484, 44) - (288, 31, 483) - (361, 368, 111) - (450, 77, 207) - (220, 327, 315) - (151, 329, 276) - (196, 401, 362) - (255, 294, 97) - (35, 121, 364) - (485, 227, 369) - (452, 303, 371) - (150, 330, 469) - (395, 385, 297) - (296, 499, 105) - (335, 356, 411) - (344, 444, 342) - (407, 69, 106) - (382, 127, 426) - (412, 240, 291) - (287, 136, 305) - (354, 489, 229) - (211, 276, 269) - (400, 112, 416) - (420, 500, 33) - (479, 491, 168) - (262, 104, 244) - (282, 261, 103) - (448, 88, 300) - (97, 492, 153) - (3, 422, 170) - (470, 37, 180) - (97, 295, 365) - (196, 199, 401) - (318, 440, 396) - (292, 169, 338) - (99, 119, 491) - (243, 59, 423) - (381, 406, 36) - (332, 164, 26) - (55, 143, 144) - (150, 469, 30) - (335, 206, 224) - (185, 270, 289) - (91, 379, 58) - (220, 246, 435) - (138, 224, 145) - (245, -1, 140) - (75, 311, 364) - (485, 369, 233) - (434, 49, 478) - (344, 405, 173) - (74, 156, 268) - (192, 222, 405) - (29, 135, 418) - (177, 88, 131) - (6, 83, 471) - (20, 333, 161) - (457, 288, 305) - (377, 162, 177) - (408, 311, 155) - (354, 338, 468) - (267, 88, 101) - (478, 69, 407) - (358, 394, 13) - (245, 429, 319) - (107, 423, 44) - (113, 380, 418) - (342, 305, 192) - (398, 325, 492) - (137, 95, 347) - (256, 25, 460) - (369, 227, 346) - (296, 367, 20) - (453, 276, 102) - (27, 188, 119) - (267, 101, 142) - (377, 342, 444) - (352, 396, 175) - (419, 229, 306) - (397, 328, 223) - (354, 468, 489) - (238, 479, 168) - (104, 96, 130) - (454, 18, 190) - (163, -1, 232) - (211, 329, 102) - (402, 73, 429) - (464, 92, 212) - (371, 176, 479) - (434, 106, 201) - (296, 20, 499) - (326, 225, 304) - (216, 260, 161) - (20, 367, 333) - (282, 274, 334) - (248, 1, 191) - (133, 468, 338) - (11, 116, 128) - (261, 72, 188) - (301, 373, 422) - (434, 343, 49) - (174, 212, 399) - (75, 339, 182) - (174, 209, 437) - (345, 439, 468) - (302, 42, 10) - (262, 497, 451) - (466, 234, 392) - (256, 389, 25) - (219, 158, 197) - (332, 26, 66) - (167, 30, 67) - (25, 459, 401) - (497, 357, 161) - (420, 98, 500) - (75, 182, 285) - (463, 449, 28) - (300, 93, 336) - (75, 285, 155) - (98, 221, 27) - (456, 112, -1) - (225, 253, 482) - (366, 352, 388) - (456, 303, 416) - (201, 143, 55) - (312, 114, 310) - (11, 14, 116) - (129, 270, 395) - (299, 474, 144) - (205, 164, 332) - (104, 130, 244) - (96, 36, 362) - (243, 210, 17) - (345, 446, 265) - (76, 123, 270) - (105, 190, 251) - (235, 220, 315) - (94, 458, 128) - (85, 115, 118) - (407, 106, 21) - (478, 49, 460) - (489, 252, 213) - (476, 290, 127) - (133, 337, 232) - (66, 26, 435) - (231, 116, 264) - (113, 116, 380) - (486, 114, 213) - (428, 38, 433) - (18, 103, 261) - (298, 240, 412) - (487, 343, 201) - (302, 10, 227) - (322, 440, 250) - (58, 308, 1) - (32, 346, 159) - (121, 118, 339) - (441, 257, 169) - (107, 44, 484) - (115, 186, 195) - (410, 496, 348) - (126, 45, 9) - (465, 187, 361) - (181, 442, 246) - (487, 55, 158) - (263, 136, 222) - (136, 470, 180) - (43, 334, 274) - (40, 399, 212) - (42, 432, 349) - (242, 146, 149) - (488, 61, 117) - (300, 336, 330) - (463, 411, 436) - (409, 139, 419) - (445, 111, 51) - (109, 50, 30) - (120, 119, 72) - (220, 435, 327) - (429, 234, 319) - (107, 210, 423) - (428, 154, 38) - (438, 42, 308) - (424, 364, 311) - (331, 409, 254) - (438, 58, 455) - (242, 270, 185) - (267, 93, 300) - (420, 33, 375) - (461, 247, 439) - (11, 128, 458) - (255, 215, 294) - (6, 46, 286) - (299, 144, 143) - (404, 171, 417) - (448, 457, 131) - (300, 330, 31) - (235, 12, 414) - (189, 500, 390) - (242, 149, 385) - (208, 286, 46) - (191, 223, 141) - (379, 86, 455) - (318, 396, 352) - (54, 107, 97) - (24, 469, 336) - (219, 198, 47) - (11, 458, 228) - (301, 214, 5) - (175, 110, 388) - (29, 404, 45) - (271, 251, 190) - (194, 84, 206) - (26, 164, 165) - (228, 50, 109) - (242, 185, 472) - (78, 387, 156) - (279, 248, 141) - (299, 415, 286) - (260, 20, 161) - (280, 398, 44) - (434, 201, 343) - (494, 433, 266) - (485, 496, 193) - (262, 451, 104) - (495, 435, 472) - (283, 275, 157) - (494, 48, 65) - (480, 392, 195) - (147, 422, 373) - (245, 402, 429) - (243, 57, 341) - (85, 159, 86) - (435, 146, 472) - (208, 241, 78) - (277, 346, 32) - (344, 192, 405) - (179, 233, 307) - (312, 160, 268) - (243, 323, 59) - (465, 84, 187) - (248, 467, 1) - (452, 371, 168) - (340, 29, 16) - (350, 80, 476) - (239, 334, 43) - (282, 334, 72) - (183, 223, 328) - (478, 460, 52) - (203, 173, 405) - (489, 213, 229) - (345, 197, 446) - (148, 76, 316) - (35, 313, 284) - (211, 102, 276) - (240, 253, 291) - (81, 207, 157) - (279, 384, 62) - (383, 355, 473) - (145, 206, 462) - (176, -1, 319) - (488, 117, 462) - (167, 67, 372) - (344, 315, 444) - (285, 195, 155) - (6, 152, 90) - (237, 154, 428) - (119, 188, 72) - (175, 405, 314) - (202, 338, 139) - (81, 294, 215) - (166, 204, 71) - (455, 86, 432) - (408, 124, 293) - (409, 443, 56) - (15, 351, 37) - (370, 251, 53) - (381, 367, 296) - (78, 56, 387) - (452, 168, 239) - (473, 337, 297) - (147, 9, 386) - (48, 317, 471) - (243, 341, 323) - (312, 56, 114) - (126, 9, 69) - (196, 68, 199) - (271, 18, 261) - (383, 77, 355) - (494, 226, 202) - (345, 468, -1) - (54, 210, 107) - (222, 314, 405) - (194, 38, 154) - (343, 378, 178) - (256, 130, 389) - (456, -1, 425) - (89, 73, 124) - (98, 391, 390) - (89, 320, 155) - (492, 325, 153) - (481, 475, 159) - (345, 265, 439) - (424, 477, 293) - (254, 56, 78) - (60, 366, 102) - (437, 209, 467) - (167, 372, 308) - (445, 51, 23) - (488, 462, 206) - (154, 83, 90) - (40, 212, 92) - (150, 483, 31) - (22, 116, 113) - (415, 376, 187) - (343, 47, 378) - (302, 150, 167) - (427, 391, 99) - (408, 320, 124) - (235, 57, 12) - (51, 368, 23) - (302, 485, 193) - (147, 23, 9) - (205, 332, 66) - (277, 32, 284) - (308, 372, 223) - (436, 134, 185) - (34, 233, 284) - (204, 442, 149) - (166, 71, 435) - (145, 224, 206) - (155, 195, 392) - (371, -1, 176) - (100, 193, 410) - (60, 151, 39) - (27, 251, 188) - (29, 45, 16) - (370, 16, 68) - (179, 307, 348) - (208, 78, 156) - (136, 180, 222) - (205, 13, 394) - (425, -1, 371) - (27, 221, 251) - (386, 404, 417) - (445, 488, 111) - (167, 150, 30) - (157, 77, 442) - (292, 202, 304) - (273, 366, 258) - (95, 87, 347) - (359, 431, 403) - (150, 31, 330) - (377, 177, 131) - (478, 126, 69) - (116, 418, 380) - (273, 322, 250) - (273, 290, 476) - (298, 123, 240) - (352, 175, 388) - (124, 402, 293) - (15, 410, 348) - (124, 73, 402) - (148, 253, 240) - (287, 288, 483) - (494, 266, 226) - (222, 180, 314) - (457, 342, 377) - (63, 184, 313) - (494, 428, 433) - (283, 157, 442) - (351, 276, 278) - (271, 261, 188) - (490, 325, 163) - (372, 50, 223) - (22, 264, 116) - (494, 65, 363) - (63, 413, 184) - (157, 207, 77) - (216, 161, 431) - (262, 198, 219) - (456, 416, 112) - (463, 28, 411) - (298, 289, 123) - (340, 53, 135) - (309, 177, 358) - (35, 32, 121) - (493, 436, 356) - (445, 23, 61) - (370, 68, 105) - (424, 413, 63) - (181, 122, 217) - (194, 154, 90) - (377, 444, 162) - (299, 286, 474) - (436, 185, 289) - (162, 327, 165) - (194, 8, 38) - (167, 308, 259) - (152, 415, 84) - (485, 179, 496) - (250, 440, 318) - (292, 304, 169) - (387, 268, 156) - (368, 9, 23) - (60, 140, 258) - (48, 471, 249) - (198, 378, 47) - (82, 158, 160) - (495, 472, 134) - (287, 100, 410) - (64, 289, 70) - (230, 133, 257) - (452, 239, 393) - (241, 471, 317) - (59, 323, 426) - (181, 283, 442) - (133, 338, 169) - (71, 204, 146) - (133, 169, 257) - (499, 216, 105) - (279, 87, 384) - (54, 157, 275) - (453, 102, 388) - (89, 155, 234) - (490, 163, 295) - (351, 278, 37) - (237, 363, 65) - (271, 188, 251) - (54, 97, 294) - (335, 411, 8) - (440, 203, 396) - (26, 165, 435) - (461, 439, 265) - (24, 3, 108) - (486, 7, 310) - (326, 202, 226) - (132, 218, 347) - (133, 232, 468) - (27, 125, 391) - (490, 153, 325) - (386, 45, 404) - (344, 342, 192) - (419, 139, 229) - (49, 343, 178) - (456, 425, 371) - (282, 72, 261) - (82, 4, 158) - (42, 349, 10) - (182, 172, 285) - (283, 217, 353) - (452, 374, 303) - (298, 70, 289) - (129, 297, 230) - (454, 105, 216) - (181, 414, 12) - (196, 406, 296) - (11, 171, 14) - (262, 219, -1) - (219, 197, -1) - (350, 382, 323) - (196, 362, 406) - (247, 468, 439) - (54, 81, 157) - (478, 52, 126) - (254, 409, 56) - (17, 210, 353) - (280, 258, 398) - (398, -1, 325) - (379, 115, 86) - (424, 293, 140) - (486, 310, 114) - (450, 215, 232) - (298, 433, 449) - (499, 20, 260) - (362, 36, 406) - (175, 314, 110) - (354, 229, 139) - (309, 358, 117) - (298, 449, 79) - (447, 45, 126) - (235, 203, 57) - (262, 112, 403) - (74, 160, 144) - (180, 37, 110) - (200, 495, 134) - (147, 170, 422) - (292, 338, 202) - (493, 356, 224) - (424, 140, 413) - (122, 353, 217) - (279, 132, 87) - (194, 206, 335) - (24, 228, 109) - (60, 184, 360) - (194, 90, 84) - (162, 165, 164) - (60, 39, 236) - (11, 108, 170) - (466, 91, 209) - (262, -1, 112) - (48, 249, 65) - (166, 442, 204) - (42, 455, 432) - (454, 216, 103) - (312, 82, 160) - (481, 10, 475) - (438, 455, 42) - (129, 395, 297) - (448, 300, 288) - (453, 388, 498) - (309, 93, 142) - (280, 127, 290) - (382, 426, 323) - (234, 399, 319) - (447, 52, 199) - (321, 212, 437) - (138, 117, 358) - (97, 153, 295) - (40, 33, 189) - (35, 284, 32) - (398, 492, 484) - (373, 61, 23) - (308, 191, 1) - (116, 14, 418) - (331, 254, 78) - (324, 136, 287) - (381, 296, 406) - (309, 142, 101) - (321, 464, 212) - (93, 214, 422) - (299, 376, 415) - (466, 174, 399) - (480, 186, 379) - (361, 187, 376) - (35, 63, 313) - (302, 483, 150) - (486, 213, 252) - (445, 61, 488) - (397, 50, 458) - (345, -1, 197) - (262, 357, 497) - (335, 224, 356) - (91, 58, 209) - (272, 39, 41) - (400, 374, 393) - (225, 266, 253) - (451, 497, 333) - (487, 19, 343) - (231, 218, 94) - (62, 375, 464) - (41, 281, 307) - (322, 80, 203) - (60, 258, 366) - (486, 430, 7) - (448, 131, 88) - (498, 388, 278) - (450, 355, 77) - (235, 173, 203) - (4, 446, 197) - (273, 2, 322) - (54, 294, 81) - (279, 62, 437) - (155, 392, 234) - (204, 149, 146) - (40, 176, 319) - (463, 79, 449) - (230, 76, 270) - (62, 87, 375) - (262, 244, 198) - (357, 431, 161) - (336, 469, 330) - (28, 433, 38) - (409, 419, 443) - (438, 308, 58) - (432, 159, 475) - (76, 240, 123) - (100, 483, 193) - (154, 249, 83) - (427, 99, 491) - (103, 403, 393) - (343, 19, 47) - (301, 5, 117) - (424, 311, 477) - (228, 458, 50) - (69, 376, 106) - (130, 459, 389) - (138, 145, 462) - (25, 199, 460) - (104, 451, 36) - (457, 305, 342) - (242, 385, 395) - (60, 360, 140) - (420, 87, 95) - (235, 414, 220) - (174, 437, 212) - (75, 155, 311) - (225, 169, 304) - (231, 128, 116) - (481, 346, 227) - (379, 186, 115) - (98, 390, 500) - (35, 364, 424) - (282, 103, 393) - (285, 118, 195) - (248, 437, 467) - (162, 164, 394) - (382, 476, 127) - (25, 389, 459) - (397, 223, 50) - (383, 149, 77) - (213, 114, 306) - (324, 470, 136) - (359, 103, 216) - (162, 358, 177) - (441, 482, 253) - (486, 252, 430) - (302, 193, 483) - (427, 491, 479) - (314, 180, 110) - (181, 246, 220) - (184, 413, 360) - (183, 141, 223) - (271, 190, 18) - (301, 117, 373) - (89, 124, 320) - (258, 140, -1) - (351, 348, 281) - (133, 297, 337) - (379, 455, 58) - (351, 281, 276) - (97, 107, 484) - (397, 458, 328) - (302, 259, 42) - (404, 418, 14) - (277, 233, 369) - (211, 269, 329) - (122, 12, 17) - (243, 423, 210) - (24, 108, 228) - (282, 393, 274) - (122, 17, 353) - (27, 119, 125) - (196, 296, 105) - (434, 478, 407) - (89, 429, 73) - (6, 471, 46) - (471, 83, 249) - (309, 117, 93) - (324, 287, 421) - (208, 46, 241) - (273, 258, 290) - (81, 450, 207) - (85, 86, 115) - (283, 353, 275) - (200, 66, 495) - (378, 244, 130) - (248, 191, 141) - (115, 195, 118) - (25, 401, 199) - (273, 250, 352) - (494, 363, 428) - (326, 304, 202) - (400, 416, 374) - (344, 173, 235) - (287, 410, 421) - (238, 168, 371) - (160, 55, 144) - (151, 276, 281) - (466, 480, 91) - (41, 39, 281) - (310, 7, 446) - (453, 278, 276) - (490, 295, 153) - (378, 130, 178) - (71, 146, 435) - (120, 72, 334) - (24, 109, 469) - (242, 472, 146) - (435, 165, 327) - (113, 418, 135) - (487, 201, 55) - (138, 358, 13) - (11, 228, 108) - (331, 78, 317) - (256, 178, 130) - (221, 135, 251) - (312, 387, 56) - (198, 244, 378) - (493, 134, 436) - (98, 22, 221) - (450, 232, 473) - (456, 371, 303) - (307, 281, 348) - (60, 236, 184) - (241, 317, 78) - (129, 230, 270) - (99, 125, 119) - (247, 430, 252) - (408, 477, 311) - (331, 202, 409) - (232, -1, 468) - (59, 44, 423) - (231, 94, 128) - (194, 335, 8) - (93, 5, 214) - (162, 394, 358) - (162, 444, 327) - (147, 386, 170) - (120, 334, 119) - (137, 264, 22) - (230, 297, 133) - (279, 183, 132) - (74, 474, 286) - (231, 264, 218) - (93, 117, 5) - (420, 95, 137) - (51, 111, 368) - (96, 362, 459) - (373, 117, 61) - (94, 183, 328) - (402, 140, 293) - (310, 446, 4) - (94, 218, 132) - (200, 224, 138) - (255, 97, 365) - (273, 352, 366) - (94, 132, 183) - (81, 215, 450) - (309, 88, 177) - (272, 236, 39) - (280, 426, 127) - (80, 323, 341) - (75, 364, 339) - (119, 334, 491) - (427, 479, 176) - (364, 121, 339) - (256, 49, 178) - (436, 411, 356) - (427, 390, 391) - (443, 114, 56) - (312, 310, 82) - (408, 155, 320) - (453, 498, 278) - (205, 200, 13) - (172, 339, 118) - (432, 86, 159) - (388, 110, 278) - (58, 1, 467) - (447, 68, 16) - (98, 27, 391) - (417, 171, 170) - (432, 10, 349) - (340, 135, 29) - (321, 62, 464) - (381, 451, 367) - (344, 235, 315) - (291, 253, 266) - (301, 422, 214) - (372, 30, 50) - (130, 96, 459) - (326, 226, 225) - (32, 159, 121) - (267, 300, 88) - (64, 70, 79) - (99, 391, 125) - (308, 223, 191) - (91, 480, 379) - (64, 79, 436) - (451, 333, 367) - (464, 375, 92) - (488, 206, 84) - (409, 202, 139) - (340, 16, 370) - (29, 418, 404) - (80, 2, 476) - (298, 79, 70) - (383, 385, 149) - (148, 240, 76) - (278, 110, 37) - (69, 368, 376) - (493, 224, 200) - (6, 415, 152) - (465, 111, 84) - (132, 347, 87) - (205, 394, 164) - (255, 365, 215) - (15, 470, 421) - (277, 369, 346) - (485, 233, 179) - (89, 234, 429) - (420, 137, 98) - (208, 156, 286) - (473, 232, 337) - (35, 424, 63) - (85, 118, 121) - (166, 246, 442) - (443, 306, 114) - (64, 436, 289) - (28, 449, 433) - (366, 388, 102) - (74, 286, 156) - (84, 415, 187) - (256, 460, 49) - (34, 313, 272) - (189, 33, 500) - (181, 217, 283) - (280, 290, 258) - (410, 193, 496) - (427, 176, 390) - (400, 393, 403) - (137, 218, 264) - (34, 307, 233) - (463, 436, 79) - (302, 227, 485) - (466, 399, 234) - (310, 4, 82) - (152, 84, 90) - (151, 281, 39) - (184, 236, 313) - (419, 306, 443) - (242, 395, 270) - (34, 272, 41) - (289, 270, 123) - (239, 274, 393) - (263, 222, 192) - (22, 113, 221) - (203, 405, 396) - (181, 220, 414) - (447, 199, 68) - (447, 16, 45) - (263, 192, 305) - (60, 102, 329) - (269, 276, 329) - (309, 101, 88) - (148, 316, 441) - (279, 437, 248) - (4, 197, 158) - (237, 249, 154) - (272, 313, 236) - (58, 467, 209) - (280, 44, 426) - (312, 268, 387) - (6, 286, 415) - (262, 403, 431) - (299, 106, 376) - (447, 126, 52) - (54, 275, 210) - (273, 476, 2) - (24, 336, 3) - (287, 305, 288) - (267, 142, 93) - (287, 483, 100) - (454, 190, 105) - (52, 460, 199) - (8, 411, 28) - (408, 293, 477) - (350, 323, 80) - (98, 137, 22) - (225, 482, 169) - (247, 489, 468) - (461, 430, 247) - (94, 328, 458) - (62, 384, 87) - (213, 306, 229) - (340, 370, 53) - (322, 203, 440) - (8, 28, 38) - (420, 375, 87) - (316, 257, 441) - (461, 265, 7) - (140, 360, 413) - (239, 168, 491) - (493, 200, 134) - (40, 189, 176) - (200, 138, 13) - (480, 195, 186) - (488, 84, 111) - (3, 336, 422) - (322, 2, 80) - (450, 473, 355) - (215, 365, 232) - (495, 66, 435) - (398, 258, -1) - (181, 12, 122) - (331, 48, 494) - (245, 140, 402) - (175, 396, 405) - (404, 14, 171) - (74, 268, 160) - (109, 30, 469) - (182, 339, 172) - (205, 66, 200) - (466, 392, 480) - (230, 316, 76) - (237, 428, 363) - (299, 143, 201) - (166, 435, 246) - (15, 348, 351) - (219, 19, 158) - (243, 17, 12) - (15, 37, 470) - (457, 377, 131) - (34, 41, 307) - (386, 417, 170) - (40, 319, 399) - (487, 158, 19) - (441, 169, 482) - (291, 266, 433) - (179, 348, 496) - (219, 47, 19) - (383, 297, 385) - (243, 12, 57) - (459, 362, 401) - (138, 462, 117) - (454, 103, 18) - (60, 329, 151) - (238, 371, 479) - (247, 252, 489) - (321, 437, 62) - (434, 21, 106) - (53, 251, 135) - (225, 226, 266) - (42, 259, 308) - (97, 484, 492) - (57, 80, 341) - (412, 291, 433) - (381, 36, 451) - (372, 67, 30) - (149, 442, 77) - (241, 46, 471) - (448, 288, 457) - (262, 431, 357) - (196, 105, 68) - (324, 421, 470) - (386, 9, 45) - (147, 373, 23) - (163, 325, -1) - (263, 305, 136) - (497, 161, 333) - (285, 172, 118) - (69, 9, 368) - (331, 317, 48) - (416, 303, 374) - (361, 376, 368) - (375, 33, 92) - (93, 422, 336) - (245, 319, -1) - (160, 158, 55) - (34, 284, 313) - (189, 390, 176) - (250, 318, 352) - (481, 159, 346) - (6, 90, 83) - (298, 412, 433) - (359, 216, 431) - (481, 227, 10) - (85, 121, 159) - (299, 201, 106) - (452, 393, 374) - (40, 92, 33) - (446, 7, 265) - (279, 141, 183) - (137, 347, 218) - (432, 475, 10) - (163, 232, 365) - (354, 139, 338) - (237, 65, 249) - (302, 167, 259) - (465, 361, 111) - (104, 36, 96) - (350, 476, 382) - (148, 441, 253) - (239, 491, 334) - (108, 3, 170) - (434, 407, 21) - (15, 421, 410) - (466, 209, 174) - (444, 315, 327) - (370, 105, 251) - (400, 403, 112) - (359, 403, 103) - (11, 170, 171) - (275, 353, 210) - (331, 494, 202) -```` - The triangles are all positively oriented, meaning the triangles are given such that the corresponding points are traversed in counter-clockwise order. @@ -3213,163 +143,75 @@ For a given point, there are two type of neighbours: The neighbouring vertices, and the neighbouring triangles. The neighbours can be obtained using [`get_neighbours`](@ref). For example, the set of vertices that share an edge with the fifth vertex is: -````julia +````@example unconstrained get_neighbours(tri, 5) ```` -```` -Set{Int64} with 4 elements: - 93 - 117 - 301 - 214 -```` - The set of triangles that share an edge with the fifth vertex is obtained using [`get_adjacent2vertex`](@ref). This returns a set of edges `(v, w)` such that, for a given vertex `u`, `(u, v, w)` is a positively oriented triangle in the triangulation. For example, -````julia +````@example unconstrained get_adjacent2vertex(tri, 5) ```` -```` -Set{Tuple{Int64, Int64}} with 4 elements: - (93, 117) - (301, 214) - (117, 301) - (214, 93) -```` - means that the triangles that contain `5` as a vertex are `(5, 93, 117)`, `(5, 117, 301)`, `(5, 301, 214)`, and `(5, 214, 93)`. We can verify this: -````julia +````@example unconstrained filter(T -> 5 ∈ triangle_vertices(T), get_triangles(tri)) ```` -```` -Set{Tuple{Int64, Int64, Int64}} with 4 elements: - (93, 5, 214) - (301, 5, 117) - (93, 117, 5) - (301, 214, 5) -```` - These queries can also be applied to the ghost vertices, in which information about the boundary is provided. -````julia +````@example unconstrained get_neighbours(tri, -1) ```` -```` -Set{Int64} with 18 elements: - 456 - 176 - 425 - 258 - 325 - 398 - 197 - 219 - 319 - 262 - 112 - 345 - 371 - 232 - 245 - 163 - 468 - 140 -```` - -````julia +````@example unconstrained get_adjacent2vertex(tri, -1) ```` -```` -Set{Tuple{Int64, Int64}} with 18 elements: - (468, 232) - (398, 258) - (176, 371) - (425, 456) - (232, 163) - (112, 262) - (258, 140) - (319, 176) - (262, 219) - (163, 325) - (371, 425) - (219, 197) - (140, 245) - (325, 398) - (456, 112) - (197, 345) - (245, 319) - (345, 468) -```` - ### Edges For a given edge `(u, v)`, the relevant neighbours are the vertices that are next to it so that a triangle is formed. We can find the vertex `w` such that `(u, v, w)` is a positively oriented triangle in the triangulation using `get_adjacent(tri, u, v)`. For example, -````julia +````@example unconstrained get_adjacent(tri, 163, 365) ```` -```` -295 -```` - means that `(163, 365, 295)` is a positively oriented triangle, as we can verify: -````julia +````@example unconstrained DelaunayTriangulation.triangle_orientation(tri, 163, 365, 295) ```` -```` -Certificate.PositivelyOriented = 6 -```` - (The representation of this predicate using a [`DelaunayTriangulation.Certificate`](@ref) is described in more detail in the [manual](../manual/predicates.md).) The other triangle adjoining the unordered edge `(u, v)`, meaning the oriented edge `(v, u)`, is obtained similarly: -````julia +````@example unconstrained get_adjacent(tri, 365, 163) ```` -```` -232 -```` - If an edge `(u, v)` is on the boundary, oriented so that there is no solid vertex `w` such that `(u, v, w)` is a triangle in the triangulation, then `get_adjacent(tri, u, v)` returns the ghost vertex. For example, -````julia +````@example unconstrained get_adjacent(tri, 398, 258) ```` -```` --1 -```` - means that `(398, 258)` is a boundary edge and `(398, 258, -1)` is a ghost triangle. You can test for this case using [`DelaunayTriangulation.is_boundary_edge`](@ref): -````julia +````@example unconstrained DelaunayTriangulation.is_boundary_edge(tri, 258, 398) ```` -```` -true -```` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/unconstrained.jl). diff --git a/docs/src/tutorials/voronoi.md b/docs/src/tutorials/voronoi.md index 6502668be..bff13b686 100644 --- a/docs/src/tutorials/voronoi.md +++ b/docs/src/tutorials/voronoi.md @@ -9,7 +9,7 @@ tessellations and work with them. Voronoi tessellations are built from a dual Delaunay triangulation using [`voronoi`](@ref). To start, let us load in the packages. -````julia +````@example voronoi using DelaunayTriangulation using CairoMakie using StableRNGs @@ -18,7 +18,7 @@ using StableRNGs We build the tessellation by constructing the triangulation, and then passing that triangulation into `voronoi`. -````julia +````@example voronoi points = [ (-3.0, 7.0), (1.0, 6.0), (-1.0, 3.0), (-2.0, 4.0), (3.0, -2.0), (5.0, 5.0), @@ -29,26 +29,15 @@ tri = triangulate(points; rng) vorn = voronoi(tri) ```` -```` -Voronoi Tessellation. - Number of generators: 8 - Number of polygon vertices: 9 - Number of polygons: 8 -```` - To visualise the tessellation, you can use `voronoiplot`. Here, we also compare the tessellation with its dual triangulation. -````julia +````@example voronoi fig, ax, sc = voronoiplot(vorn, markersize=13, colormap=:matter, strokecolor=:white, strokewidth=5) triplot!(ax, tri) fig ```` -```@raw html - -``` - The polygons each correspond to a *generator*, which is the black point inside it coming from `points`, i.e. the vertices of the triangulation. The polygons are all convex. Note also that the unbounded polygons, @@ -67,55 +56,27 @@ version of `get_points(tri)`. (A separate field is needed so that clipped and ce tessellations can add new generators without affecting the points in `tri`.) These generators can be accessed using `get_generators(vorn)`: -````julia +````@example voronoi DelaunayTriangulation.get_generators(vorn) ```` -```` -Dict{Int64, Tuple{Float64, Float64}} with 8 entries: - 5 => (3.0, -2.0) - 4 => (-2.0, 4.0) - 6 => (5.0, 5.0) - 7 => (-4.0, -3.0) - 2 => (1.0, 6.0) - 8 => (3.0, 8.0) - 3 => (-1.0, 3.0) - 1 => (-3.0, 7.0) -```` - It is preferred that you use [`each_generator(vorn)`](@ref each_generator), though, which is an iterator over the generators: -````julia +````@example voronoi each_generator(vorn) ```` -```` -KeySet for a Dict{Int64, Tuple{Float64, Float64}} with 8 entries. Keys: - 5 - 4 - 6 - 7 - 2 - 8 - 3 - 1 -```` - Note that this is just the keys of the above `Dict`. To access specific generators, you use [`get_generator`](@ref). For example, -````julia +````@example voronoi get_generator(vorn, 3) ```` -```` -(-1.0, 3.0) -```` - To give an example, here is how we can compute the average generator position. -````julia +````@example voronoi function average_generator(vorn) cx, cy = 0.0, 0.0 for i in each_generator(vorn) @@ -132,172 +93,85 @@ end cx, cy = average_generator(vorn) ```` -```` -(0.25, 3.5) -```` - ## Iterating over polygon and polygon vertices You can also look at the individual polygons, and all their vertices. These polygons and their vertices are stored as below: -````julia +````@example voronoi DelaunayTriangulation.get_polygons(vorn) ```` -```` -Dict{Int64, Vector{Int64}} with 8 entries: - 5 => [4, 8, -2, -1, 4] - 4 => [1, 9, 3, 7, 1] - 6 => [-1, -3, 6, 5, 4, -1] - 7 => [8, 1, 7, -5, -2, 8] - 2 => [9, 5, 6, 2, 3, 9] - 8 => [-3, -4, 2, 6, -3] - 3 => [4, 5, 9, 1, 8, 4] - 1 => [3, 2, -4, -5, 7, 3] -```` - -````julia +````@example voronoi DelaunayTriangulation.get_polygon_points(vorn) ```` -```` -9-element Vector{Tuple{Float64, Float64}}: - (-4.166666666666666, 0.8333333333333335) - (-0.2999999999999998, 9.3) - (-1.1363636363636365, 5.954545454545455) - (2.710526315789474, 1.868421052631579) - (2.357142857142857, 2.9285714285714284) - (3.1, 5.9) - (-10.807692307692307, 2.730769230769231) - (-0.7307692307692308, -0.8846153846153846) - (-0.30000000000000004, 4.7) -```` - You should not work with these fields directly, though. If you want to look at a specific polygon, you should use [`get_polygon`](@ref). For example, -````julia +````@example voronoi get_polygon(vorn, 1) ```` -```` -6-element Vector{Int64}: - 3 - 2 - -4 - -5 - 7 - 3 -```` - This is a `Vector` of the vertices of the polygon, in counter-clockwise order, and such that the first and last vertices are the same. The vertices refer to points in the `polygon_points` field, which you could then obtain using [`get_polygon_point`](@ref). For example, the first vertex corresponds to the coordinates: -````julia +````@example voronoi get_polygon_point(vorn, 1) ```` -```` -(-4.166666666666666, 0.8333333333333335) -```` - In `get_polygon(vorn, 1)`, notice that there are two negative indices. These negative indices correspond to vertices out at infinity; their actual values do not matter, just that they are negative. Thus, this polygon is actually an unbounded polygon. This can be checked in two ways: -````julia +````@example voronoi 1 ∈ DelaunayTriangulation.get_unbounded_polygons(vorn) ```` -```` -true -```` - -````julia +````@example voronoi get_area(vorn, 1) == Inf ```` -```` -true -```` - There are several ways that you can iterate over the polygons. If you want each polygon, then you can use [`each_polygon`](@ref): -````julia +````@example voronoi each_polygon(vorn) ```` -```` -ValueIterator for a Dict{Int64, Vector{Int64}} with 8 entries. Values: - [4, 8, -2, -1, 4] - [1, 9, 3, 7, 1] - [-1, -3, 6, 5, 4, -1] - [8, 1, 7, -5, -2, 8] - [9, 5, 6, 2, 3, 9] - [-3, -4, 2, 6, -3] - [4, 5, 9, 1, 8, 4] - [3, 2, -4, -5, 7, 3] -```` - This is an iterator over all the polygon vertices, but you do not get the associated polygon index. If you want an iterator that is over the polygon indices, you use [`each_polygon_index`](@ref): -````julia +````@example voronoi each_polygon_index(vorn) ```` -```` -KeySet for a Dict{Int64, Vector{Int64}} with 8 entries. Keys: - 5 - 4 - 6 - 7 - 2 - 8 - 3 - 1 -```` - If you did want to have both the indices and the vertices together, you can use `zip` on these two iterators. This would be the same as iterating over the internal `polygons` field, but this could be subject to change in the future. To get an iterator over the polygon vertices rather than caring about a specific polygon, you use [`each_polygon_vertex`](@ref): -````julia +````@example voronoi each_polygon_vertex(vorn) ```` -```` -Base.OneTo(9) -```` - This is just an iterator of the indices to pass into `get_polygon_point`. You can also query the number of polygons and polygon vertices as follows: -````julia +````@example voronoi num_polygons(vorn) ```` -```` -8 -```` - -````julia +````@example voronoi num_polygon_vertices(vorn) ```` -```` -9 -```` - To give an example of how we might use these iterators, here we compute the area of all polygons. -````julia +````@example voronoi function get_polygon_area(vorn, i) i ∈ DelaunayTriangulation.get_unbounded_polygons(vorn) && return Inf area = 0.0 @@ -324,21 +198,9 @@ end vorn_areas = get_polygon_areas(vorn) ```` -```` -8-element Vector{Float64}: - Inf - 14.34935064935065 - 20.07578561789088 - 23.92237762237762 - Inf - Inf - Inf - Inf -```` - Note that this could have also been obtained using [`get_area`](@ref): -````julia +````@example voronoi function direct_polygon_areas(vorn) areas = zeros(num_polygons(vorn)) for i in each_polygon_index(vorn) @@ -349,20 +211,12 @@ end vorn_areas ≈ direct_polygon_areas(vorn) ```` -```` -true -```` - Moreover, note that the following is false: -````julia +````@example voronoi vorn_areas ≈ [get_area(vorn, i) for i in each_polygon_index(vorn)] ```` -```` -false -```` - because `each_polygon_index` does not return the polygons in a sorted order. Before we move on, we emphasise that it is not guaranteed that the values of the vertices @@ -374,56 +228,28 @@ of the polygons will be the same, though, as they are derived from the point ind Given an edge in the tessellation, you can use [`get_adjacent`](@ref) to get the polygon that it is a part of (taking care of order). For example, -````julia +````@example voronoi get_adjacent(vorn, 1, 8) ```` -```` -3 -```` - means that the edge `(1, 8)` belongs to the third polygon, as we can easily verify: -````julia +````@example voronoi get_polygon(vorn, 3) ```` -```` -6-element Vector{Int64}: - 4 - 5 - 9 - 1 - 8 - 4 -```` - see that `(1, 8)` at the end. The order is important here, since -````julia +````@example voronoi get_adjacent(vorn, 8, 1) ```` -```` -7 -```` - means that the edge `(8, 1)` belongs to the seventh polygon: -````julia +````@example voronoi get_polygon(vorn, 7) ```` -```` -6-element Vector{Int64}: - 8 - 1 - 7 - -5 - -2 - 8 -```` - ## Just the code An uncommented version of this example is given below. You can view the source code for this file [here](https://github.com/JuliaGeometry/DelaunayTriangulation.jl/tree/main/docs/src/literate_tutorials/voronoi.jl). From 1cbf14d41e76bce8ef347f70287984c2a2f73fd7 Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 14 Jul 2024 23:15:54 +0100 Subject: [PATCH 06/11] Maybe --- Project.toml | 2 +- src/DelaunayTriangulation.jl | 5 +- src/public.jl | 533 ++++++++++++++++++----------------- 3 files changed, 271 insertions(+), 269 deletions(-) diff --git a/Project.toml b/Project.toml index 32264f5bf..7f339e737 100644 --- a/Project.toml +++ b/Project.toml @@ -12,10 +12,10 @@ Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" [compat] EnumX = "1.0" ExactPredicates = "2.2" +Preferences = "1.4" Random = "1" Test = "1" julia = "1" -Preferences = "1.4" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" diff --git a/src/DelaunayTriangulation.jl b/src/DelaunayTriangulation.jl index b6dae64d6..778e1ea09 100644 --- a/src/DelaunayTriangulation.jl +++ b/src/DelaunayTriangulation.jl @@ -32,9 +32,6 @@ include("utils.jl") include("algorithms.jl") include("validation.jl") include("exports.jl") - -@static if VERSION ≥ v"1.11.0-DEV.469" - include("public.jl") -end +include("public.jl") end \ No newline at end of file diff --git a/src/public.jl b/src/public.jl index e0db1beeb..431385d97 100644 --- a/src/public.jl +++ b/src/public.jl @@ -1,264 +1,269 @@ -public Adjacent, -Adjacent2Vertex, -ConvexHull, -Graph, -InsertionEventHistory, -Triangulation, -VoronoiTessellation, -ZeroWeight, -add_weight!, -all_ghost_vertices, -check_args, -compute_representative_points!, -contains_boundary_edge, -convert_boundary_points_to_indices, -delete_ghost_vertices_from_graph!, -dist, -get_adjacent, -get_adjacent2vertex, -get_all_boundary_nodes, -get_all_segments, -get_area, -get_boundary_curves, -get_boundary_edge_map, -get_boundary_nodes, -get_convex_hull, -get_convex_hull_vertices, -get_curve_index, -get_edges, -get_ghost_vertex_map, -get_ghost_vertex_range, -get_ghost_vertex_ranges, -get_graph, -get_insertion_order, -get_interior_segments, -get_left_boundary_node, -get_neighbours, -get_point, -get_points, -get_representative_point_coordinates, -get_representative_point_list, -get_right_boundary_node, -get_section_index, -get_triangles, -get_vertices, -get_weight, -get_weights, -has_ghost_vertices, -has_vertex, -is_exterior_ghost_vertex, -is_interior_ghost_vertex, -iterated_neighbourhood, -map_ghost_vertex, -num_curves, -num_neighbours, -num_points, -num_sections, -refine!, -retriangulate, -triangulate, -triangulate_convex, -triangulate_rectangle, -validate_triangulation, -add_boundary_information!, -add_ghost_triangles!, -add_point!, -add_segment!, -add_triangle!, -clear_empty_features!, -complete_split_edge_and_legalise!, -complete_split_triangle_and_legalise!, -delete_ghost_triangles!, -delete_holes!, -delete_point!, -delete_triangle!, -flip_edge!, -get_surrounding_polygon, -legalise_edge!, -lock_convex_hull!, -split_edge!, -split_triangle!, -unlock_convex_hull!, -centroidal_smooth, -get_boundary_polygons, -get_centroid, -get_circumcenter_to_triangle, -get_cocircular_circumcenters, -get_generator, -get_generators, -get_polygon, -get_polygon_coordinates, -get_polygon_point, -get_polygon_points, -get_polygons, -get_triangle_to_circumcenter, -get_triangulation, -get_unbounded_polygons, -num_generators, -num_polygon_vertices, -num_polygons, -polygon_bounds, -polygon_features, -toggle_inf_warn!, -voronoi, -convex_hull, -convex_hull!, -AbstractParametricCurve, -BSpline, -BezierCurve, -CatmullRomSpline, -CircularArc, -EllipticalArc, -LineSegment, -angle_between, -arc_length, -curvature, -differentiate, -get_circle_intersection, -get_closest_point, -get_equidistant_split, -get_equivariation_split, -get_inverse, -marked_total_variation, -orientation_markers, -point_position_relative_to_curve, -thrice_differentiate, -total_variation, -twice_differentiate, -each_boundary_edge, -each_edge, -each_generator, -each_ghost_edge, -each_ghost_triangle, -each_ghost_vertex, -each_point, -each_point_index, -each_polygon, -each_polygon_index, -each_polygon_vertex, -each_segment, -each_solid_edge, -each_solid_triangle, -each_solid_vertex, -each_triangle, -each_unbounded_polygon, -each_vertex, -num_edges, -num_ghost_edges, -num_ghost_triangles, -num_ghost_vertices, -num_solid_edges, -num_solid_triangles, -num_solid_vertices, -num_triangles, -num_vertices, -brute_force_search, -find_polygon, -find_triangle, -get_nearest_neighbour, -Certificate, -contains_segment, -contains_triangle, -edge_exists, -find_edge, -has_boundary_nodes, -has_ghost_triangles, -has_multiple_curves, -has_multiple_intersections, -has_multiple_sections, -has_no_intersections, -has_one_intersection, -is_above, -is_acute, -is_below, -is_boundary_edge, -is_boundary_node, -is_boundary_triangle, -is_closer, -is_collinear, -is_constrained, -is_degenerate, -is_equidistant, -is_further, -is_ghost_edge, -is_ghost_triangle, -is_ghost_vertex, -is_illegal, -is_inside, -is_left, -is_legal, -is_multiple, -is_negatively_oriented, -is_negativelyoriented, -is_none, -is_obtuse, -is_on, -is_outside, -is_positively_oriented, -is_positivelyoriented, -is_right, -is_single, -is_touching, -is_weighted, -line_segment_intersection_type, -opposite_angle, -point_closest_to_line, -point_position_on_line_segment, -point_position_relative_to_circle, -point_position_relative_to_circumcircle, -point_position_relative_to_diametral_circle, -point_position_relative_to_diametral_lens, -point_position_relative_to_line, -point_position_relative_to_oriented_outer_halfplane, -point_position_relative_to_triangle, -point_position_relative_to_witness_plane, -triangle_line_segment_intersection, -triangle_orientation, -unoriented_edge_exists, -IndividualTriangleStatistics, -TriangulationStatistics, -get_all_stat, -get_angles, -get_aspect_ratio, -get_circumcenter, -get_circumradius, -get_edge_midpoints, -get_individual_statistics, -get_inradius, -get_largest_angle, -get_largest_area, -get_largest_radius_edge_ratio, -get_lengths, -get_maximum_angle, -get_median_angle, -get_minimum_angle, -get_offcenter, -get_perimeter, -get_radius_edge_ratio, -get_sink, -get_smallest_angle, -get_smallest_area, -get_smallest_radius_edge_ratio, -num_boundary_segments, -num_convex_hull_vertices, -num_interior_segments, -num_segments, -statistics, -triangle_angles, -triangle_area, -triangle_aspect_ratio, -triangle_centroid, -triangle_circumcenter, -triangle_circumradius, -triangle_edge_midpoints, -triangle_inradius, -triangle_lengths, -triangle_offcenter, -triangle_perimeter, -triangle_radius_edge_ratio, -triangle_sink, -clip_polygon, -construct_polygon_hierarchy, -distance_to_polygon, -number_type, -pole_of_inaccessibility \ No newline at end of file +@static if VERSION >= v"1.11.0-DEV.469" + eval(Meta.parse( + """ + public Adjacent, + Adjacent2Vertex, + ConvexHull, + Graph, + InsertionEventHistory, + Triangulation, + VoronoiTessellation, + ZeroWeight, + add_weight!, + all_ghost_vertices, + check_args, + compute_representative_points!, + contains_boundary_edge, + convert_boundary_points_to_indices, + delete_ghost_vertices_from_graph!, + dist, + get_adjacent, + get_adjacent2vertex, + get_all_boundary_nodes, + get_all_segments, + get_area, + get_boundary_curves, + get_boundary_edge_map, + get_boundary_nodes, + get_convex_hull, + get_convex_hull_vertices, + get_curve_index, + get_edges, + get_ghost_vertex_map, + get_ghost_vertex_range, + get_ghost_vertex_ranges, + get_graph, + get_insertion_order, + get_interior_segments, + get_left_boundary_node, + get_neighbours, + get_point, + get_points, + get_representative_point_coordinates, + get_representative_point_list, + get_right_boundary_node, + get_section_index, + get_triangles, + get_vertices, + get_weight, + get_weights, + has_ghost_vertices, + has_vertex, + is_exterior_ghost_vertex, + is_interior_ghost_vertex, + iterated_neighbourhood, + map_ghost_vertex, + num_curves, + num_neighbours, + num_points, + num_sections, + refine!, + retriangulate, + triangulate, + triangulate_convex, + triangulate_rectangle, + validate_triangulation, + add_boundary_information!, + add_ghost_triangles!, + add_point!, + add_segment!, + add_triangle!, + clear_empty_features!, + complete_split_edge_and_legalise!, + complete_split_triangle_and_legalise!, + delete_ghost_triangles!, + delete_holes!, + delete_point!, + delete_triangle!, + flip_edge!, + get_surrounding_polygon, + legalise_edge!, + lock_convex_hull!, + split_edge!, + split_triangle!, + unlock_convex_hull!, + centroidal_smooth, + get_boundary_polygons, + get_centroid, + get_circumcenter_to_triangle, + get_cocircular_circumcenters, + get_generator, + get_generators, + get_polygon, + get_polygon_coordinates, + get_polygon_point, + get_polygon_points, + get_polygons, + get_triangle_to_circumcenter, + get_triangulation, + get_unbounded_polygons, + num_generators, + num_polygon_vertices, + num_polygons, + polygon_bounds, + polygon_features, + toggle_inf_warn!, + voronoi, + convex_hull, + convex_hull!, + AbstractParametricCurve, + BSpline, + BezierCurve, + CatmullRomSpline, + CircularArc, + EllipticalArc, + LineSegment, + angle_between, + arc_length, + curvature, + differentiate, + get_circle_intersection, + get_closest_point, + get_equidistant_split, + get_equivariation_split, + get_inverse, + marked_total_variation, + orientation_markers, + point_position_relative_to_curve, + thrice_differentiate, + total_variation, + twice_differentiate, + each_boundary_edge, + each_edge, + each_generator, + each_ghost_edge, + each_ghost_triangle, + each_ghost_vertex, + each_point, + each_point_index, + each_polygon, + each_polygon_index, + each_polygon_vertex, + each_segment, + each_solid_edge, + each_solid_triangle, + each_solid_vertex, + each_triangle, + each_unbounded_polygon, + each_vertex, + num_edges, + num_ghost_edges, + num_ghost_triangles, + num_ghost_vertices, + num_solid_edges, + num_solid_triangles, + num_solid_vertices, + num_triangles, + num_vertices, + brute_force_search, + find_polygon, + find_triangle, + get_nearest_neighbour, + Certificate, + contains_segment, + contains_triangle, + edge_exists, + find_edge, + has_boundary_nodes, + has_ghost_triangles, + has_multiple_curves, + has_multiple_intersections, + has_multiple_sections, + has_no_intersections, + has_one_intersection, + is_above, + is_acute, + is_below, + is_boundary_edge, + is_boundary_node, + is_boundary_triangle, + is_closer, + is_collinear, + is_constrained, + is_degenerate, + is_equidistant, + is_further, + is_ghost_edge, + is_ghost_triangle, + is_ghost_vertex, + is_illegal, + is_inside, + is_left, + is_legal, + is_multiple, + is_negatively_oriented, + is_negativelyoriented, + is_none, + is_obtuse, + is_on, + is_outside, + is_positively_oriented, + is_positivelyoriented, + is_right, + is_single, + is_touching, + is_weighted, + line_segment_intersection_type, + opposite_angle, + point_closest_to_line, + point_position_on_line_segment, + point_position_relative_to_circle, + point_position_relative_to_circumcircle, + point_position_relative_to_diametral_circle, + point_position_relative_to_diametral_lens, + point_position_relative_to_line, + point_position_relative_to_oriented_outer_halfplane, + point_position_relative_to_triangle, + point_position_relative_to_witness_plane, + triangle_line_segment_intersection, + triangle_orientation, + unoriented_edge_exists, + IndividualTriangleStatistics, + TriangulationStatistics, + get_all_stat, + get_angles, + get_aspect_ratio, + get_circumcenter, + get_circumradius, + get_edge_midpoints, + get_individual_statistics, + get_inradius, + get_largest_angle, + get_largest_area, + get_largest_radius_edge_ratio, + get_lengths, + get_maximum_angle, + get_median_angle, + get_minimum_angle, + get_offcenter, + get_perimeter, + get_radius_edge_ratio, + get_sink, + get_smallest_angle, + get_smallest_area, + get_smallest_radius_edge_ratio, + num_boundary_segments, + num_convex_hull_vertices, + num_interior_segments, + num_segments, + statistics, + triangle_angles, + triangle_area, + triangle_aspect_ratio, + triangle_centroid, + triangle_circumcenter, + triangle_circumradius, + triangle_edge_midpoints, + triangle_inradius, + triangle_lengths, + triangle_offcenter, + triangle_perimeter, + triangle_radius_edge_ratio, + triangle_sink, + clip_polygon, + construct_polygon_hierarchy, + distance_to_polygon, + number_type, + pole_of_inaccessibility + """)) +end \ No newline at end of file From 3dfd0463bc7a49a24c27778607512f43a6022dde Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 21 Jul 2024 15:32:28 +0100 Subject: [PATCH 07/11] Fix tests on prerelease --- .github/workflows/CI.yml | 3 + docs/Manifest.toml | 1818 -------------------------------------- docs/Project.toml | 20 +- test/Project.toml | 32 + test/utils.jl | 3 - 5 files changed, 54 insertions(+), 1822 deletions(-) delete mode 100644 docs/Manifest.toml diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 582e47f78..27289e979 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -81,6 +81,9 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: | julia --project=docs -e ' + using Pkg + Pkg.develop(PackageSpec(path=pwd())) + Pkg.instantiate() using Documenter: DocMeta, doctest using DelaunayTriangulation DocMeta.setdocmeta!(DelaunayTriangulation, :DocTestSetup, :(using DelaunayTriangulation); recursive=true) diff --git a/docs/Manifest.toml b/docs/Manifest.toml deleted file mode 100644 index 83edf1baf..000000000 --- a/docs/Manifest.toml +++ /dev/null @@ -1,1818 +0,0 @@ -# This file is machine-generated - editing it directly is not advised - -julia_version = "1.10.4" -manifest_format = "2.0" -project_hash = "a5f97bd51af051946996607d64905eb7a7b0c1f9" - -[[deps.ANSIColoredPrinters]] -git-tree-sha1 = "574baf8110975760d391c710b6341da1afa48d8c" -uuid = "a4c015fc-c6ff-483c-b24f-f7ea428134e9" -version = "0.0.1" - -[[deps.AbstractFFTs]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" -uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" -version = "1.5.0" -weakdeps = ["ChainRulesCore", "Test"] - - [deps.AbstractFFTs.extensions] - AbstractFFTsChainRulesCoreExt = "ChainRulesCore" - AbstractFFTsTestExt = "Test" - -[[deps.AbstractLattices]] -git-tree-sha1 = "222ee9e50b98f51b5d78feb93dd928880df35f06" -uuid = "398f06c4-4d28-53ec-89ca-5b2656b7603d" -version = "0.3.0" - -[[deps.AbstractTrees]] -git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" -uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" -version = "0.4.5" - -[[deps.Adapt]] -deps = ["LinearAlgebra", "Requires"] -git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" -uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" -version = "4.0.4" -weakdeps = ["StaticArrays"] - - [deps.Adapt.extensions] - AdaptStaticArraysExt = "StaticArrays" - -[[deps.AliasTables]] -deps = ["PtrArrays", "Random"] -git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" -uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" -version = "1.1.3" - -[[deps.Animations]] -deps = ["Colors"] -git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d" -uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" -version = "0.4.1" - -[[deps.ArgTools]] -uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" -version = "1.1.1" - -[[deps.ArrayInterface]] -deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "5c9b74c973181571deb6442d41e5c902e6b9f38e" -uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" -version = "7.12.0" - - [deps.ArrayInterface.extensions] - ArrayInterfaceBandedMatricesExt = "BandedMatrices" - ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" - ArrayInterfaceCUDAExt = "CUDA" - ArrayInterfaceCUDSSExt = "CUDSS" - ArrayInterfaceChainRulesExt = "ChainRules" - ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" - ArrayInterfaceReverseDiffExt = "ReverseDiff" - ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" - ArrayInterfaceTrackerExt = "Tracker" - - [deps.ArrayInterface.weakdeps] - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" - CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" - CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" - ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" - GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" - ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" - StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" - Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" - -[[deps.Artifacts]] -uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" - -[[deps.Automa]] -deps = ["PrecompileTools", "TranscodingStreams"] -git-tree-sha1 = "014bc22d6c400a7703c0f5dc1fdc302440cf88be" -uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" -version = "1.0.4" - -[[deps.AxisAlgorithms]] -deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] -git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" -uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" -version = "1.1.0" - -[[deps.AxisArrays]] -deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] -git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" -uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" -version = "0.4.7" - -[[deps.Base64]] -uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" - -[[deps.BenchmarkTools]] -deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] -git-tree-sha1 = "f1dff6729bc61f4d49e140da1af55dcd1ac97b2f" -uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" -version = "1.5.0" - -[[deps.BitFlags]] -git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" -uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" -version = "0.1.9" - -[[deps.Bzip2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" -uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" -version = "1.0.8+1" - -[[deps.CEnum]] -git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" -uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" -version = "0.5.0" - -[[deps.CRC32c]] -uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" - -[[deps.CRlibm_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" -uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" -version = "1.0.1+0" - -[[deps.Cairo]] -deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] -git-tree-sha1 = "d0b3f8b4ad16cb0a2988c6788646a5e6a17b6b1b" -uuid = "159f3aea-2a34-519c-b102-8c37f9878175" -version = "1.0.5" - -[[deps.CairoMakie]] -deps = ["CRC32c", "Cairo", "Cairo_jll", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] -git-tree-sha1 = "e4da5095557f24713bae4c9f50e34ff4d3b959c0" -uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" -version = "0.12.5" - -[[deps.Cairo_jll]] -deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] -git-tree-sha1 = "a2f1c8c668c8e3cb4cca4e57a8efdb09067bb3fd" -uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" -version = "1.18.0+2" - -[[deps.Calculus]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" -uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" -version = "0.5.1" - -[[deps.ChainRulesCore]] -deps = ["Compat", "LinearAlgebra"] -git-tree-sha1 = "71acdbf594aab5bbb2cec89b208c41b4c411e49f" -uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" -version = "1.24.0" -weakdeps = ["SparseArrays"] - - [deps.ChainRulesCore.extensions] - ChainRulesCoreSparseArraysExt = "SparseArrays" - -[[deps.CodecZlib]] -deps = ["TranscodingStreams", "Zlib_jll"] -git-tree-sha1 = "b8fe8546d52ca154ac556809e10c75e6e7430ac8" -uuid = "944b1d66-785c-5afd-91f1-9de20f533193" -version = "0.7.5" - -[[deps.ColorBrewer]] -deps = ["Colors", "JSON", "Test"] -git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4" -uuid = "a2cac450-b92f-5266-8821-25eda20663c8" -version = "0.4.0" - -[[deps.ColorSchemes]] -deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] -git-tree-sha1 = "4b270d6465eb21ae89b732182c20dc165f8bf9f2" -uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" -version = "3.25.0" - -[[deps.ColorTypes]] -deps = ["FixedPointNumbers", "Random"] -git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" -uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" -version = "0.11.5" - -[[deps.ColorVectorSpace]] -deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] -git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" -uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" -version = "0.10.0" -weakdeps = ["SpecialFunctions"] - - [deps.ColorVectorSpace.extensions] - SpecialFunctionsExt = "SpecialFunctions" - -[[deps.Colors]] -deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] -git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" -uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" -version = "0.12.11" - -[[deps.Combinatorics]] -git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" -uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" -version = "1.0.2" - -[[deps.CommonSubexpressions]] -deps = ["MacroTools", "Test"] -git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" -uuid = "bbf7d656-a473-5ed7-a52c-81e309532950" -version = "0.3.0" - -[[deps.Compat]] -deps = ["TOML", "UUIDs"] -git-tree-sha1 = "b1c55339b7c6c350ee89f2c1604299660525b248" -uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.15.0" -weakdeps = ["Dates", "LinearAlgebra"] - - [deps.Compat.extensions] - CompatLinearAlgebraExt = "LinearAlgebra" - -[[deps.CompilerSupportLibraries_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" -version = "1.1.1+0" - -[[deps.ConcurrentUtilities]] -deps = ["Serialization", "Sockets"] -git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1" -uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" -version = "2.4.2" - -[[deps.ConstructionBase]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2" -uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" -version = "1.5.5" -weakdeps = ["IntervalSets", "StaticArrays"] - - [deps.ConstructionBase.extensions] - ConstructionBaseIntervalSetsExt = "IntervalSets" - ConstructionBaseStaticArraysExt = "StaticArrays" - -[[deps.Contour]] -git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" -uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" -version = "0.6.3" - -[[deps.Crayons]] -git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" -uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" -version = "4.1.1" - -[[deps.DataAPI]] -git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" -uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" -version = "1.16.0" - -[[deps.DataStructures]] -deps = ["Compat", "InteractiveUtils", "OrderedCollections"] -git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" -uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" -version = "0.18.20" - -[[deps.DataValueInterfaces]] -git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" -uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" -version = "1.0.0" - -[[deps.Dates]] -deps = ["Printf"] -uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" - -[[deps.DeepDiffs]] -git-tree-sha1 = "9824894295b62a6a4ab6adf1c7bf337b3a9ca34c" -uuid = "ab62b9b5-e342-54a8-a765-a90f495de1a6" -version = "1.2.0" - -[[deps.DelaunayTriangulation]] -deps = ["EnumX", "ExactPredicates", "Preferences", "Random"] -path = ".." -uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" -version = "1.1.0" - -[[deps.DiffResults]] -deps = ["StaticArraysCore"] -git-tree-sha1 = "782dd5f4561f5d267313f23853baaaa4c52ea621" -uuid = "163ba53b-c6d8-5494-b064-1a9d43ac40c5" -version = "1.1.0" - -[[deps.DiffRules]] -deps = ["IrrationalConstants", "LogExpFunctions", "NaNMath", "Random", "SpecialFunctions"] -git-tree-sha1 = "23163d55f885173722d1e4cf0f6110cdbaf7e272" -uuid = "b552c78f-8df3-52c6-915a-8e097449b14b" -version = "1.15.1" - -[[deps.Distances]] -deps = ["LinearAlgebra", "Statistics", "StatsAPI"] -git-tree-sha1 = "66c4c81f259586e8f002eacebc177e1fb06363b0" -uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" -version = "0.10.11" -weakdeps = ["ChainRulesCore", "SparseArrays"] - - [deps.Distances.extensions] - DistancesChainRulesCoreExt = "ChainRulesCore" - DistancesSparseArraysExt = "SparseArrays" - -[[deps.Distributed]] -deps = ["Random", "Serialization", "Sockets"] -uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" - -[[deps.Distributions]] -deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] -git-tree-sha1 = "9c405847cc7ecda2dc921ccf18b47ca150d7317e" -uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" -version = "0.25.109" - - [deps.Distributions.extensions] - DistributionsChainRulesCoreExt = "ChainRulesCore" - DistributionsDensityInterfaceExt = "DensityInterface" - DistributionsTestExt = "Test" - - [deps.Distributions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" - Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[deps.DocStringExtensions]] -deps = ["LibGit2"] -git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" -uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" -version = "0.9.3" - -[[deps.Documenter]] -deps = ["ANSIColoredPrinters", "AbstractTrees", "Base64", "CodecZlib", "Dates", "DocStringExtensions", "Downloads", "Git", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "MarkdownAST", "Pkg", "PrecompileTools", "REPL", "RegistryInstances", "SHA", "TOML", "Test", "Unicode"] -git-tree-sha1 = "76deb8c15f37a3853f13ea2226b8f2577652de05" -uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "1.5.0" - -[[deps.DocumenterTools]] -deps = ["AbstractTrees", "Base64", "DocStringExtensions", "Documenter", "FileWatching", "Gumbo", "LibGit2", "OpenSSH_jll", "Sass"] -git-tree-sha1 = "7605a88f75625836ce47102b8915041fae231ff5" -uuid = "35a29f4d-8980-5a13-9543-d66fff28ecb8" -version = "0.1.19" - -[[deps.Downloads]] -deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] -uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" -version = "1.6.0" - -[[deps.DualNumbers]] -deps = ["Calculus", "NaNMath", "SpecialFunctions"] -git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" -uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" -version = "0.6.8" - -[[deps.EarCut_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" -uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" -version = "2.2.4+0" - -[[deps.ElasticArrays]] -deps = ["Adapt"] -git-tree-sha1 = "75e5697f521c9ab89816d3abeea806dfc5afb967" -uuid = "fdbdab4c-e67f-52f5-8c3f-e7b388dad3d4" -version = "1.2.12" - -[[deps.EnumX]] -git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" -uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" -version = "1.0.4" - -[[deps.ExactPredicates]] -deps = ["IntervalArithmetic", "Random", "StaticArrays"] -git-tree-sha1 = "b3f2ff58735b5f024c392fde763f29b057e4b025" -uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" -version = "2.2.8" - -[[deps.ExceptionUnwrapping]] -deps = ["Test"] -git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" -uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" -version = "0.1.10" - -[[deps.Expat_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" -uuid = "2e619515-83b5-522b-bb60-26c02a35a201" -version = "2.6.2+0" - -[[deps.Extents]] -git-tree-sha1 = "94997910aca72897524d2237c41eb852153b0f65" -uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" -version = "0.1.3" - -[[deps.FFMPEG_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Pkg", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] -git-tree-sha1 = "74faea50c1d007c85837327f6775bea60b5492dd" -uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" -version = "4.4.2+2" - -[[deps.FFTW]] -deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] -git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" -uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" -version = "1.8.0" - -[[deps.FFTW_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" -uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" -version = "3.3.10+0" - -[[deps.FileIO]] -deps = ["Pkg", "Requires", "UUIDs"] -git-tree-sha1 = "82d8afa92ecf4b52d78d869f038ebfb881267322" -uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" -version = "1.16.3" - -[[deps.FilePaths]] -deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] -git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" -uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" -version = "0.8.3" - -[[deps.FilePathsBase]] -deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] -git-tree-sha1 = "9f00e42f8d99fdde64d40c8ea5d14269a2e2c1aa" -uuid = "48062228-2e41-5def-b9a4-89aafe57970f" -version = "0.9.21" - -[[deps.FileWatching]] -uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" - -[[deps.FillArrays]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "0653c0a2396a6da5bc4766c43041ef5fd3efbe57" -uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.11.0" -weakdeps = ["PDMats", "SparseArrays", "Statistics"] - - [deps.FillArrays.extensions] - FillArraysPDMatsExt = "PDMats" - FillArraysSparseArraysExt = "SparseArrays" - FillArraysStatisticsExt = "Statistics" - -[[deps.FiniteDiff]] -deps = ["ArrayInterface", "LinearAlgebra", "Requires", "Setfield", "SparseArrays"] -git-tree-sha1 = "2de436b72c3422940cbe1367611d137008af7ec3" -uuid = "6a86dc24-6348-571c-b903-95158fe2bd41" -version = "2.23.1" - - [deps.FiniteDiff.extensions] - FiniteDiffBandedMatricesExt = "BandedMatrices" - FiniteDiffBlockBandedMatricesExt = "BlockBandedMatrices" - FiniteDiffStaticArraysExt = "StaticArrays" - - [deps.FiniteDiff.weakdeps] - BandedMatrices = "aae01518-5342-5314-be14-df237901396f" - BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.FixedPointNumbers]] -deps = ["Statistics"] -git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" -uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" -version = "0.8.5" - -[[deps.Fontconfig_jll]] -deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] -git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" -uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" -version = "2.13.96+0" - -[[deps.Format]] -git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" -uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" -version = "1.3.7" - -[[deps.ForwardDiff]] -deps = ["CommonSubexpressions", "DiffResults", "DiffRules", "LinearAlgebra", "LogExpFunctions", "NaNMath", "Preferences", "Printf", "Random", "SpecialFunctions"] -git-tree-sha1 = "cf0fe81336da9fb90944683b8c41984b08793dad" -uuid = "f6369f11-7733-5829-9624-2563aa707210" -version = "0.10.36" -weakdeps = ["StaticArrays"] - - [deps.ForwardDiff.extensions] - ForwardDiffStaticArraysExt = "StaticArrays" - -[[deps.FreeType]] -deps = ["CEnum", "FreeType2_jll"] -git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" -uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" -version = "4.1.1" - -[[deps.FreeType2_jll]] -deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc" -uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" -version = "2.13.2+0" - -[[deps.FreeTypeAbstraction]] -deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] -git-tree-sha1 = "2493cdfd0740015955a8e46de4ef28f49460d8bc" -uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" -version = "0.10.3" - -[[deps.FriBidi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" -uuid = "559328eb-81f9-559d-9380-de523a88c83c" -version = "1.0.14+0" - -[[deps.Future]] -deps = ["Random"] -uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" - -[[deps.GeoInterface]] -deps = ["Extents"] -git-tree-sha1 = "9fff8990361d5127b770e3454488360443019bb3" -uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" -version = "1.3.5" - -[[deps.GeometryBasics]] -deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "b62f2b2d76cee0d61a2ef2b3118cd2a3215d3134" -uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" -version = "0.4.11" - -[[deps.Gettext_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] -git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" -uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" -version = "0.21.0+0" - -[[deps.Git]] -deps = ["Git_jll"] -git-tree-sha1 = "51764e6c2e84c37055e846c516e9015b4a291c7d" -uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" -version = "1.3.0" - -[[deps.Git_jll]] -deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "d8be4aab0f4e043cc40984e9097417307cce4c03" -uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" -version = "2.36.1+2" - -[[deps.Glib_jll]] -deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] -git-tree-sha1 = "7c82e6a6cd34e9d935e9aa4051b66c6ff3af59ba" -uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" -version = "2.80.2+0" - -[[deps.Graphics]] -deps = ["Colors", "LinearAlgebra", "NaNMath"] -git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" -uuid = "a2bd30eb-e257-5431-a919-1863eab51364" -version = "1.1.2" - -[[deps.Graphite2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" -uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" -version = "1.3.14+0" - -[[deps.GridLayoutBase]] -deps = ["GeometryBasics", "InteractiveUtils", "Observables"] -git-tree-sha1 = "fc713f007cff99ff9e50accba6373624ddd33588" -uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" -version = "0.11.0" - -[[deps.Grisu]] -git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" -uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" -version = "1.0.2" - -[[deps.Gumbo]] -deps = ["AbstractTrees", "Gumbo_jll", "Libdl"] -git-tree-sha1 = "a1a138dfbf9df5bace489c7a9d5196d6afdfa140" -uuid = "708ec375-b3d6-5a57-a7ce-8257bf98657a" -version = "0.8.2" - -[[deps.Gumbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "29070dee9df18d9565276d68a596854b1764aa38" -uuid = "528830af-5a63-567c-a44a-034ed33b8444" -version = "0.10.2+0" - -[[deps.HTTP]] -deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] -git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed" -uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" -version = "1.10.8" - -[[deps.HarfBuzz_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] -git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" -uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" -version = "2.8.1+1" - -[[deps.HypergeometricFunctions]] -deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] -git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" -uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" -version = "0.3.23" - -[[deps.IOCapture]] -deps = ["Logging", "Random"] -git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" -uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" -version = "0.2.5" - -[[deps.ImageAxes]] -deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] -git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" -uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" -version = "0.6.11" - -[[deps.ImageBase]] -deps = ["ImageCore", "Reexport"] -git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" -uuid = "c817782e-172a-44cc-b673-b171935fbb9e" -version = "0.1.7" - -[[deps.ImageCore]] -deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] -git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0" -uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" -version = "0.10.2" - -[[deps.ImageIO]] -deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] -git-tree-sha1 = "437abb322a41d527c197fa800455f79d414f0a3c" -uuid = "82e4d734-157c-48bb-816b-45c225c6df19" -version = "0.6.8" - -[[deps.ImageMetadata]] -deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] -git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" -uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" -version = "0.9.9" - -[[deps.Imath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" -uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" -version = "3.1.11+0" - -[[deps.IndirectArrays]] -git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" -uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" -version = "1.0.0" - -[[deps.Inflate]] -git-tree-sha1 = "d1b1b796e47d94588b3757fe84fbf65a5ec4a80d" -uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" -version = "0.1.5" - -[[deps.IntegerMathUtils]] -git-tree-sha1 = "b8ffb903da9f7b8cf695a8bead8e01814aa24b30" -uuid = "18e54dd8-cb9d-406c-a71d-865a43cbb235" -version = "0.1.2" - -[[deps.IntelOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "14eb2b542e748570b56446f4c50fbfb2306ebc45" -uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" -version = "2024.2.0+0" - -[[deps.InteractiveUtils]] -deps = ["Markdown"] -uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" - -[[deps.Interpolations]] -deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] -git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" -uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" -version = "0.15.1" -weakdeps = ["Unitful"] - - [deps.Interpolations.extensions] - InterpolationsUnitfulExt = "Unitful" - -[[deps.IntervalArithmetic]] -deps = ["CRlibm_jll", "MacroTools", "RoundingEmulator"] -git-tree-sha1 = "433b0bb201cd76cb087b017e49244f10394ebe9c" -uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" -version = "0.22.14" -weakdeps = ["DiffRules", "ForwardDiff", "RecipesBase"] - - [deps.IntervalArithmetic.extensions] - IntervalArithmeticDiffRulesExt = "DiffRules" - IntervalArithmeticForwardDiffExt = "ForwardDiff" - IntervalArithmeticRecipesBaseExt = "RecipesBase" - -[[deps.IntervalSets]] -git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" -uuid = "8197267c-284f-5f27-9208-e0e47529a953" -version = "0.7.10" -weakdeps = ["Random", "RecipesBase", "Statistics"] - - [deps.IntervalSets.extensions] - IntervalSetsRandomExt = "Random" - IntervalSetsRecipesBaseExt = "RecipesBase" - IntervalSetsStatisticsExt = "Statistics" - -[[deps.IrrationalConstants]] -git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" -uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" -version = "0.2.2" - -[[deps.Isoband]] -deps = ["isoband_jll"] -git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" -uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" -version = "0.1.1" - -[[deps.IterTools]] -git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" -uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" -version = "1.10.0" - -[[deps.IteratorInterfaceExtensions]] -git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" -uuid = "82899510-4779-5014-852e-03e436cf321d" -version = "1.0.0" - -[[deps.JLLWrappers]] -deps = ["Artifacts", "Preferences"] -git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" -uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" -version = "1.5.0" - -[[deps.JSON]] -deps = ["Dates", "Mmap", "Parsers", "Unicode"] -git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" -uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" -version = "0.21.4" - -[[deps.JpegTurbo]] -deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] -git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" -uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" -version = "0.1.5" - -[[deps.JpegTurbo_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "c84a835e1a09b289ffcd2271bf2a337bbdda6637" -uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" -version = "3.0.3+0" - -[[deps.KernelDensity]] -deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] -git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1" -uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" -version = "0.6.9" - -[[deps.LAME_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" -uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" -version = "3.100.2+0" - -[[deps.LLVMOpenMP_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" -uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" -version = "15.0.7+0" - -[[deps.LZO_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d" -uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" -version = "2.10.2+0" - -[[deps.LaTeXStrings]] -git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" -uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" -version = "1.3.1" - -[[deps.LazilyInitializedFields]] -git-tree-sha1 = "8f7f3cabab0fd1800699663533b6d5cb3fc0e612" -uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" -version = "1.2.2" - -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" - -[[deps.LazyModules]] -git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" -uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" -version = "0.3.1" - -[[deps.LibCURL]] -deps = ["LibCURL_jll", "MozillaCACerts_jll"] -uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" -version = "0.6.4" - -[[deps.LibCURL_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] -uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" -version = "8.4.0+0" - -[[deps.LibGit2]] -deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] -uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" - -[[deps.LibGit2_jll]] -deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] -uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" -version = "1.6.4+0" - -[[deps.LibSSH2_jll]] -deps = ["Artifacts", "Libdl", "MbedTLS_jll"] -uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" -version = "1.11.0+1" - -[[deps.Libdl]] -uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" - -[[deps.Libffi_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" -uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" -version = "3.2.2+1" - -[[deps.Libgcrypt_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] -git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" -uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" -version = "1.8.11+0" - -[[deps.Libgpg_error_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed" -uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" -version = "1.49.0+0" - -[[deps.Libiconv_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" -uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" -version = "1.17.0+0" - -[[deps.Libmount_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e" -uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" -version = "2.40.1+0" - -[[deps.Libuuid_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807" -uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" -version = "2.40.1+0" - -[[deps.LightXML]] -deps = ["Libdl", "XML2_jll"] -git-tree-sha1 = "3a994404d3f6709610701c7dabfc03fed87a81f8" -uuid = "9c8b4983-aa76-5018-a973-4c85ecc9e179" -version = "0.9.1" - -[[deps.LineSearches]] -deps = ["LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "Printf"] -git-tree-sha1 = "7bbea35cec17305fc70a0e5b4641477dc0789d9d" -uuid = "d3d80556-e9d4-5f37-9878-2ab0fcc64255" -version = "7.2.0" - -[[deps.LinearAlgebra]] -deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] -uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" - -[[deps.LinearAlgebraX]] -deps = ["LinearAlgebra", "Mods", "Primes", "SimplePolynomials"] -git-tree-sha1 = "d76cec8007ec123c2b681269d40f94b053473fcf" -uuid = "9b3f67b0-2d00-526e-9884-9e4938f8fb88" -version = "0.2.7" - -[[deps.Literate]] -deps = ["Base64", "IOCapture", "JSON", "REPL"] -git-tree-sha1 = "eef2e1fc1dc38af90a18eb16e519e06d1fd10c2a" -uuid = "98b081ad-f1c9-55d3-8b20-4c87d4299306" -version = "2.19.0" - -[[deps.LiveServer]] -deps = ["HTTP", "LoggingExtras", "MIMEs", "Pkg", "Sockets", "Test"] -git-tree-sha1 = "1e46b873b8ef176e23ee43f96e72cd45c20bafb4" -uuid = "16fef848-5104-11e9-1b77-fb7a48bbb589" -version = "1.3.1" - -[[deps.LogExpFunctions]] -deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] -git-tree-sha1 = "a2d09619db4e765091ee5c6ffe8872849de0feea" -uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" -version = "0.3.28" - - [deps.LogExpFunctions.extensions] - LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" - LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" - LogExpFunctionsInverseFunctionsExt = "InverseFunctions" - - [deps.LogExpFunctions.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.Logging]] -uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" - -[[deps.LoggingExtras]] -deps = ["Dates", "Logging"] -git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" -uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" -version = "1.0.3" - -[[deps.MIMEs]] -git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" -uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" -version = "0.1.4" - -[[deps.MKL_jll]] -deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] -git-tree-sha1 = "f046ccd0c6db2832a9f639e2c669c6fe867e5f4f" -uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" -version = "2024.2.0+0" - -[[deps.MacroTools]] -deps = ["Markdown", "Random"] -git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" -uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" -version = "0.5.13" - -[[deps.Makie]] -deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "InteractiveUtils", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] -git-tree-sha1 = "863b9e666b5a099c8835e85476a5834f9d77c4c1" -uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" -version = "0.21.5" - -[[deps.MakieCore]] -deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] -git-tree-sha1 = "c1c950560397ee68ad7302ee0e3efa1b07466a2f" -uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" -version = "0.8.4" - -[[deps.MappedArrays]] -git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" -uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" -version = "0.4.2" - -[[deps.Markdown]] -deps = ["Base64"] -uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" - -[[deps.MarkdownAST]] -deps = ["AbstractTrees", "Markdown"] -git-tree-sha1 = "465a70f0fc7d443a00dcdc3267a497397b8a3899" -uuid = "d0879d2d-cac2-40c8-9cee-1863dc0c7391" -version = "0.1.2" - -[[deps.MathTeXEngine]] -deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] -git-tree-sha1 = "1865d0b8a2d91477c8b16b49152a32764c7b1f5f" -uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" -version = "0.6.0" - -[[deps.MbedTLS]] -deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] -git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" -uuid = "739be429-bea8-5141-9913-cc70e7f3736d" -version = "1.1.9" - -[[deps.MbedTLS_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" -version = "2.28.2+1" - -[[deps.Missings]] -deps = ["DataAPI"] -git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" -uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" -version = "1.2.0" - -[[deps.Mmap]] -uuid = "a63ad114-7e13-5084-954f-fe012c677804" - -[[deps.Mods]] -git-tree-sha1 = "924f962b524a71eef7a21dae1e6853817f9b658f" -uuid = "7475f97c-0381-53b1-977b-4c60186c8d62" -version = "2.2.4" - -[[deps.MosaicViews]] -deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] -git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" -uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" -version = "0.3.4" - -[[deps.MozillaCACerts_jll]] -uuid = "14a3606d-f60d-562e-9121-12d972cd8159" -version = "2023.1.10" - -[[deps.Multisets]] -git-tree-sha1 = "8d852646862c96e226367ad10c8af56099b4047e" -uuid = "3b2b4ff1-bcff-5658-a3ee-dbcf1ce5ac09" -version = "0.4.4" - -[[deps.NLSolversBase]] -deps = ["DiffResults", "Distributed", "FiniteDiff", "ForwardDiff"] -git-tree-sha1 = "a0b464d183da839699f4c79e7606d9d186ec172c" -uuid = "d41bc354-129a-5804-8e4c-c37616107c6c" -version = "7.8.3" - -[[deps.NaNMath]] -deps = ["OpenLibm_jll"] -git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" -uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "1.0.2" - -[[deps.Netpbm]] -deps = ["FileIO", "ImageCore", "ImageMetadata"] -git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" -uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" -version = "1.1.1" - -[[deps.NetworkOptions]] -uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" -version = "1.2.0" - -[[deps.Observables]] -git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" -uuid = "510215fc-4207-5dde-b226-833fc4488ee2" -version = "0.5.5" - -[[deps.OffsetArrays]] -git-tree-sha1 = "1a27764e945a152f7ca7efa04de513d473e9542e" -uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" -version = "1.14.1" -weakdeps = ["Adapt"] - - [deps.OffsetArrays.extensions] - OffsetArraysAdaptExt = "Adapt" - -[[deps.Ogg_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" -uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" -version = "1.3.5+1" - -[[deps.OpenBLAS_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] -uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" -version = "0.3.23+4" - -[[deps.OpenEXR]] -deps = ["Colors", "FileIO", "OpenEXR_jll"] -git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" -uuid = "52e1d378-f018-4a11-a4be-720524705ac7" -version = "0.3.2" - -[[deps.OpenEXR_jll]] -deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" -uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" -version = "3.2.4+0" - -[[deps.OpenLibm_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "05823500-19ac-5b8b-9628-191a04bc5112" -version = "0.8.1+2" - -[[deps.OpenSSH_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "OpenSSL_jll", "Pkg", "Zlib_jll"] -git-tree-sha1 = "1b2f042897343a9dfdcc9366e4ecbd3d00780c49" -uuid = "9bd350c2-7e96-507f-8002-3f2e150b4e1b" -version = "8.9.0+1" - -[[deps.OpenSSL]] -deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] -git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" -uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" -version = "1.4.3" - -[[deps.OpenSSL_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "a12e56c72edee3ce6b96667745e6cbbe5498f200" -uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "1.1.23+0" - -[[deps.OpenSpecFun_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" -uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" -version = "0.5.5+0" - -[[deps.Optim]] -deps = ["Compat", "FillArrays", "ForwardDiff", "LineSearches", "LinearAlgebra", "NLSolversBase", "NaNMath", "Parameters", "PositiveFactorizations", "Printf", "SparseArrays", "StatsBase"] -git-tree-sha1 = "d9b79c4eed437421ac4285148fcadf42e0700e89" -uuid = "429524aa-4258-5aef-a3af-852621145aeb" -version = "1.9.4" - - [deps.Optim.extensions] - OptimMOIExt = "MathOptInterface" - - [deps.Optim.weakdeps] - MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" - -[[deps.Opus_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" -uuid = "91d4177d-7536-5919-b921-800302f37372" -version = "1.3.2+0" - -[[deps.OrderedCollections]] -git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" -uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" -version = "1.6.3" - -[[deps.PCRE2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" -version = "10.42.0+1" - -[[deps.PDMats]] -deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] -git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" -uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" -version = "0.11.31" - -[[deps.PNGFiles]] -deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] -git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd" -uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" -version = "0.4.3" - -[[deps.Packing]] -deps = ["GeometryBasics"] -git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501" -uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" -version = "0.5.0" - -[[deps.PaddedViews]] -deps = ["OffsetArrays"] -git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" -uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" -version = "0.5.12" - -[[deps.Pango_jll]] -deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] -git-tree-sha1 = "cb5a2ab6763464ae0f19c86c56c63d4a2b0f5bda" -uuid = "36c8627f-9965-5494-a995-c6b170f724f3" -version = "1.52.2+0" - -[[deps.Parameters]] -deps = ["OrderedCollections", "UnPack"] -git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" -uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" -version = "0.12.3" - -[[deps.Parsers]] -deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" -uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.8.1" - -[[deps.Permutations]] -deps = ["Combinatorics", "LinearAlgebra", "Random"] -git-tree-sha1 = "4ca430561cf37c75964c8478eddae2d79e96ca9b" -uuid = "2ae35dd2-176d-5d53-8349-f30d82d94d4f" -version = "0.4.21" - -[[deps.Pixman_jll]] -deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] -git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" -uuid = "30392449-352a-5448-841d-b1acce4e97dc" -version = "0.43.4+0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.10.0" - -[[deps.PkgVersion]] -deps = ["Pkg"] -git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" -uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" -version = "0.3.3" - -[[deps.PlotUtils]] -deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] -git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" -uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" -version = "1.4.1" - -[[deps.PolygonOps]] -git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" -uuid = "647866c9-e3ac-4575-94e7-e3d426903924" -version = "0.1.2" - -[[deps.Polynomials]] -deps = ["LinearAlgebra", "RecipesBase", "Requires", "Setfield", "SparseArrays"] -git-tree-sha1 = "1a9cfb2dc2c2f1bd63f1906d72af39a79b49b736" -uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" -version = "4.0.11" - - [deps.Polynomials.extensions] - PolynomialsChainRulesCoreExt = "ChainRulesCore" - PolynomialsFFTWExt = "FFTW" - PolynomialsMakieCoreExt = "MakieCore" - PolynomialsMutableArithmeticsExt = "MutableArithmetics" - - [deps.Polynomials.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" - MakieCore = "20f20a25-4f0e-4fdf-b5d1-57303727442b" - MutableArithmetics = "d8a4904e-b15c-11e9-3269-09a3773c0cb0" - -[[deps.PositiveFactorizations]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "17275485f373e6673f7e7f97051f703ed5b15b20" -uuid = "85a6dd25-e78a-55b7-8502-1745935b8125" -version = "0.2.4" - -[[deps.PrecompileTools]] -deps = ["Preferences"] -git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" -uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" -version = "1.2.1" - -[[deps.Preferences]] -deps = ["TOML"] -git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" -uuid = "21216c6a-2e73-6563-6e65-726566657250" -version = "1.4.3" - -[[deps.Primes]] -deps = ["IntegerMathUtils"] -git-tree-sha1 = "cb420f77dc474d23ee47ca8d14c90810cafe69e7" -uuid = "27ebfcd6-29c5-5fa9-bf4b-fb8fc14df3ae" -version = "0.5.6" - -[[deps.Printf]] -deps = ["Unicode"] -uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" - -[[deps.Profile]] -deps = ["Printf"] -uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" - -[[deps.ProgressMeter]] -deps = ["Distributed", "Printf"] -git-tree-sha1 = "80686d28ecb3ee7fb3ac5371cacaa0d673eb0d4a" -uuid = "92933f4c-e287-5a05-a399-4b506db050ca" -version = "1.10.1" - -[[deps.PtrArrays]] -git-tree-sha1 = "f011fbb92c4d401059b2212c05c0601b70f8b759" -uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" -version = "1.2.0" - -[[deps.QOI]] -deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] -git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" -uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" -version = "1.0.0" - -[[deps.QuadGK]] -deps = ["DataStructures", "LinearAlgebra"] -git-tree-sha1 = "9b23c31e76e333e6fb4c1595ae6afa74966a729e" -uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" -version = "2.9.4" - -[[deps.REPL]] -deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] -uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" - -[[deps.Random]] -deps = ["SHA"] -uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" - -[[deps.RangeArrays]] -git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" -uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" -version = "0.3.2" - -[[deps.Ratios]] -deps = ["Requires"] -git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" -uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" -version = "0.4.5" -weakdeps = ["FixedPointNumbers"] - - [deps.Ratios.extensions] - RatiosFixedPointNumbersExt = "FixedPointNumbers" - -[[deps.RecipesBase]] -deps = ["PrecompileTools"] -git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" -uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" -version = "1.3.4" - -[[deps.Reexport]] -git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" -uuid = "189a3867-3050-52da-a836-e630ba90ab69" -version = "1.2.2" - -[[deps.ReferenceTests]] -deps = ["Colors", "DeepDiffs", "Distances", "FileIO", "ImageCore", "LazyModules", "Random", "SHA", "Test", "XTermColors"] -git-tree-sha1 = "ce6661add3d5a76c6e2e2c56f14b41a50577276c" -uuid = "324d217c-45ce-50fc-942e-d289b448e8cf" -version = "0.10.4" - -[[deps.RegistryInstances]] -deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] -git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" -uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" -version = "0.1.0" - -[[deps.RelocatableFolders]] -deps = ["SHA", "Scratch"] -git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" -uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" -version = "1.0.1" - -[[deps.Requires]] -deps = ["UUIDs"] -git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" -uuid = "ae029012-a4dd-5104-9daa-d747884805df" -version = "1.3.0" - -[[deps.RingLists]] -deps = ["Random"] -git-tree-sha1 = "f39da63aa6d2d88e0c1bd20ed6a3ff9ea7171ada" -uuid = "286e9d63-9694-5540-9e3c-4e6708fa07b2" -version = "0.2.8" - -[[deps.Rmath]] -deps = ["Random", "Rmath_jll"] -git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" -uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" -version = "0.7.1" - -[[deps.Rmath_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "d483cd324ce5cf5d61b77930f0bbd6cb61927d21" -uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" -version = "0.4.2+0" - -[[deps.RoundingEmulator]] -git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" -uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" -version = "0.2.1" - -[[deps.SHA]] -uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" -version = "0.7.0" - -[[deps.SIMD]] -deps = ["PrecompileTools"] -git-tree-sha1 = "2803cab51702db743f3fda07dd1745aadfbf43bd" -uuid = "fdea26ae-647d-5447-a871-4b548cad5224" -version = "3.5.0" - -[[deps.Sass]] -deps = ["libsass_jll"] -git-tree-sha1 = "aa841c3738cec78b5dbccd56dda332710f35f6a5" -uuid = "322a6be2-4ae8-5d68-aaf1-3e960788d1d9" -version = "0.2.0" - -[[deps.Scratch]] -deps = ["Dates"] -git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" -uuid = "6c6a2e73-6563-6170-7368-637461726353" -version = "1.2.1" - -[[deps.Serialization]] -uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" - -[[deps.Setfield]] -deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] -git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" -uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" -version = "1.1.1" - -[[deps.ShaderAbstractions]] -deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"] -git-tree-sha1 = "79123bc60c5507f035e6d1d9e563bb2971954ec8" -uuid = "65257c39-d410-5151-9873-9b3e5be5013e" -version = "0.4.1" - -[[deps.SharedArrays]] -deps = ["Distributed", "Mmap", "Random", "Serialization"] -uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" - -[[deps.Showoff]] -deps = ["Dates", "Grisu"] -git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" -uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" -version = "1.0.3" - -[[deps.SignedDistanceFields]] -deps = ["Random", "Statistics", "Test"] -git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" -uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" -version = "0.4.0" - -[[deps.SimpleBufferStream]] -git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" -uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" -version = "1.1.0" - -[[deps.SimpleGraphs]] -deps = ["AbstractLattices", "Combinatorics", "DataStructures", "IterTools", "LightXML", "LinearAlgebra", "LinearAlgebraX", "Optim", "Primes", "Random", "RingLists", "SimplePartitions", "SimplePolynomials", "SimpleRandom", "SparseArrays", "Statistics"] -git-tree-sha1 = "f65caa24a622f985cc341de81d3f9744435d0d0f" -uuid = "55797a34-41de-5266-9ec1-32ac4eb504d3" -version = "0.8.6" - -[[deps.SimplePartitions]] -deps = ["AbstractLattices", "DataStructures", "Permutations"] -git-tree-sha1 = "e182b9e5afb194142d4668536345a365ea19363a" -uuid = "ec83eff0-a5b5-5643-ae32-5cbf6eedec9d" -version = "0.3.2" - -[[deps.SimplePolynomials]] -deps = ["Mods", "Multisets", "Polynomials", "Primes"] -git-tree-sha1 = "7063828369cafa93f3187b3d0159f05582011405" -uuid = "cc47b68c-3164-5771-a705-2bc0097375a0" -version = "0.2.17" - -[[deps.SimpleRandom]] -deps = ["Distributions", "LinearAlgebra", "Random"] -git-tree-sha1 = "3a6fb395e37afab81aeea85bae48a4db5cd7244a" -uuid = "a6525b86-64cd-54fa-8f65-62fc48bdc0e8" -version = "0.3.1" - -[[deps.SimpleTraits]] -deps = ["InteractiveUtils", "MacroTools"] -git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" -uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" -version = "0.9.4" - -[[deps.Sixel]] -deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] -git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" -uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" -version = "0.1.3" - -[[deps.Sockets]] -uuid = "6462fe0b-24de-5631-8697-dd941f90decc" - -[[deps.SortingAlgorithms]] -deps = ["DataStructures"] -git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" -uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" -version = "1.2.1" - -[[deps.SparseArrays]] -deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] -uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" -version = "1.10.0" - -[[deps.SpecialFunctions]] -deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" -uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.4.0" -weakdeps = ["ChainRulesCore"] - - [deps.SpecialFunctions.extensions] - SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" - -[[deps.StableRNGs]] -deps = ["Random"] -git-tree-sha1 = "83e6cce8324d49dfaf9ef059227f91ed4441a8e5" -uuid = "860ef19b-820b-49d6-a774-d7a799459cd3" -version = "1.0.2" - -[[deps.StackViews]] -deps = ["OffsetArrays"] -git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" -uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" -version = "0.1.1" - -[[deps.StaticArrays]] -deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] -git-tree-sha1 = "eeafab08ae20c62c44c8399ccb9354a04b80db50" -uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.9.7" -weakdeps = ["ChainRulesCore", "Statistics"] - - [deps.StaticArrays.extensions] - StaticArraysChainRulesCoreExt = "ChainRulesCore" - StaticArraysStatisticsExt = "Statistics" - -[[deps.StaticArraysCore]] -git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" -uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" -version = "1.4.3" - -[[deps.Statistics]] -deps = ["LinearAlgebra", "SparseArrays"] -uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" -version = "1.10.0" - -[[deps.StatsAPI]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" -uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" -version = "1.7.0" - -[[deps.StatsBase]] -deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] -git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" -uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" -version = "0.34.3" - -[[deps.StatsFuns]] -deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a" -uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "1.3.1" - - [deps.StatsFuns.extensions] - StatsFunsChainRulesCoreExt = "ChainRulesCore" - StatsFunsInverseFunctionsExt = "InverseFunctions" - - [deps.StatsFuns.weakdeps] - ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.StructArrays]] -deps = ["ConstructionBase", "DataAPI", "Tables"] -git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be" -uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" -version = "0.6.18" - - [deps.StructArrays.extensions] - StructArraysAdaptExt = "Adapt" - StructArraysGPUArraysCoreExt = "GPUArraysCore" - StructArraysSparseArraysExt = "SparseArrays" - StructArraysStaticArraysExt = "StaticArrays" - - [deps.StructArrays.weakdeps] - Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" - GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" - SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" - StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" - -[[deps.SuiteSparse]] -deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] -uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" - -[[deps.SuiteSparse_jll]] -deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] -uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" -version = "7.2.1+1" - -[[deps.TOML]] -deps = ["Dates"] -uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" -version = "1.0.3" - -[[deps.TableTraits]] -deps = ["IteratorInterfaceExtensions"] -git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" -uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" -version = "1.0.1" - -[[deps.Tables]] -deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits"] -git-tree-sha1 = "cb76cf677714c095e535e3501ac7954732aeea2d" -uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" -version = "1.11.1" - -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" -version = "1.10.0" - -[[deps.TensorCore]] -deps = ["LinearAlgebra"] -git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" -uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" -version = "0.1.1" - -[[deps.Test]] -deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] -uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" - -[[deps.TiffImages]] -deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"] -git-tree-sha1 = "bc7fd5c91041f44636b2c134041f7e5263ce58ae" -uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" -version = "0.10.0" - -[[deps.TranscodingStreams]] -git-tree-sha1 = "60df3f8126263c0d6b357b9a1017bb94f53e3582" -uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" -version = "0.11.0" -weakdeps = ["Random", "Test"] - - [deps.TranscodingStreams.extensions] - TestExt = ["Test", "Random"] - -[[deps.TriplotBase]] -git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" -uuid = "981d1d27-644d-49a2-9326-4793e63143c3" -version = "0.1.0" - -[[deps.URIs]] -git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" -uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.5.1" - -[[deps.UUIDs]] -deps = ["Random", "SHA"] -uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" - -[[deps.UnPack]] -git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" -uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" -version = "1.0.2" - -[[deps.Unicode]] -uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" - -[[deps.UnicodeFun]] -deps = ["REPL"] -git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" -uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" -version = "0.4.1" - -[[deps.Unitful]] -deps = ["Dates", "LinearAlgebra", "Random"] -git-tree-sha1 = "dd260903fdabea27d9b6021689b3cd5401a57748" -uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" -version = "1.20.0" - - [deps.Unitful.extensions] - ConstructionBaseUnitfulExt = "ConstructionBase" - InverseFunctionsUnitfulExt = "InverseFunctions" - - [deps.Unitful.weakdeps] - ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" - InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" - -[[deps.WoodburyMatrices]] -deps = ["LinearAlgebra", "SparseArrays"] -git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" -uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" -version = "1.0.0" - -[[deps.XML2_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] -git-tree-sha1 = "d9717ce3518dc68a99e6b96300813760d887a01d" -uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" -version = "2.13.1+0" - -[[deps.XSLT_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] -git-tree-sha1 = "a54ee957f4c86b526460a720dbc882fa5edcbefc" -uuid = "aed1982a-8fda-507f-9586-7b0439959a61" -version = "1.1.41+0" - -[[deps.XTermColors]] -deps = ["Crayons", "ImageBase", "OffsetArrays"] -git-tree-sha1 = "bc27b7622a51f570c57b80bd839d1c0d43605b38" -uuid = "c8c2cc18-de81-4e68-b407-38a3a0c0491f" -version = "0.2.1" - -[[deps.Xorg_libX11_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] -git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" -uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" -version = "1.8.6+0" - -[[deps.Xorg_libXau_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" -uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" -version = "1.0.11+0" - -[[deps.Xorg_libXdmcp_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" -uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" -version = "1.1.4+0" - -[[deps.Xorg_libXext_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" -uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" -version = "1.3.6+0" - -[[deps.Xorg_libXrender_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] -git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" -uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" -version = "0.9.11+0" - -[[deps.Xorg_libpthread_stubs_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" -uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" -version = "0.1.1+0" - -[[deps.Xorg_libxcb_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] -git-tree-sha1 = "bcd466676fef0878338c61e655629fa7bbc69d8e" -uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" -version = "1.17.0+0" - -[[deps.Xorg_xtrans_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" -uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" -version = "1.5.0+0" - -[[deps.Zlib_jll]] -deps = ["Libdl"] -uuid = "83775a58-1f1d-513f-b197-d71354ab007a" -version = "1.2.13+1" - -[[deps.isoband_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" -uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" -version = "0.2.3+0" - -[[deps.libaom_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d" -uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" -version = "3.9.0+0" - -[[deps.libass_jll]] -deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] -git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" -uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" -version = "0.15.1+0" - -[[deps.libblastrampoline_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" -version = "5.8.0+1" - -[[deps.libfdk_aac_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" -uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" -version = "2.0.2+0" - -[[deps.libpng_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] -git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" -uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" -version = "1.6.43+1" - -[[deps.libsass_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "6044ffe7e7bf0602e2039dc747c3332a097ac74b" -uuid = "47bcb7c8-5119-555a-9eeb-0afcc36cd728" -version = "3.6.6+0" - -[[deps.libsixel_jll]] -deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] -git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" -uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" -version = "1.10.3+0" - -[[deps.libvorbis_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] -git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" -uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" -version = "1.3.7+1" - -[[deps.nghttp2_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" -version = "1.52.0+1" - -[[deps.oneTBB_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493" -uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" -version = "2021.12.0+0" - -[[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+2" - -[[deps.x264_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" -uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" -version = "2021.5.5+0" - -[[deps.x265_jll]] -deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] -git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" -uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" -version = "3.5.0+0" diff --git a/docs/Project.toml b/docs/Project.toml index 9809d0605..06c3b8832 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -2,7 +2,6 @@ BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" -DelaunayTriangulation = "927a84f5-c5f4-47a5-9785-b46e178433df" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" DocumenterTools = "35a29f4d-8980-5a13-9543-d66fff28ecb8" ElasticArrays = "fdbdab4c-e67f-52f5-8c3f-e7b388dad3d4" @@ -17,3 +16,22 @@ SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[compat] +BenchmarkTools = "1.5" +CairoMakie = "0.12" +Documenter = "1.5.0" +DocumenterTools = "0.1" +ElasticArrays = "1.2" +Literate = "2.19" +LiveServer = "1.3" +Preferences = "1.4" +ReferenceTests = "0.10" +SimpleGraphs = "0.8" +StableRNGs = "1.0" +StatsBase = "0.34" +Dates = "1.11" +InteractiveUtils = "1.11" +LinearAlgebra = "1.11" +SparseArrays = "1.11" +Test = "1.11" \ No newline at end of file diff --git a/test/Project.toml b/test/Project.toml index 676712c9d..f45c1aab6 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -35,3 +35,35 @@ Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [compat] Aqua = "0.8.7" +BenchmarkTools = "1.5" +CairoMakie = "0.12" +ColorSchemes = "3.26" +DataStructures = "0.18" +DelimitedFiles = "1.9" +Documenter = "1.5" +DocumenterTools = "0.1" +ElasticArrays = "1.2" +ExactPredicates = "2.2" +FastGaussQuadrature = "1.0" +ForwardDiff = "0.10" +GeometryBasics = "0.4" +OrderedCollections = "1.6" +Preferences = "1.4" +ReferenceTests = "0.10" +SafeTestsets = "0.1" +Setfield = "1.1" +SimpleGraphs = "0.8" +SpatialIndexing = "0.1" +StableRNGs = "1.0" +StaticArrays = "1.9" +StaticArraysCore = "1.4" +StatsBase = "0.34" +StructEquality = "2.1" +Dates = "1.11" +Downloads = "1.6" +InteractiveUtils = "1.11" +LinearAlgebra = "1.11" +Pkg = "1.11" +Random = "1.11" +SparseArrays = "1.11" +Test = "1.11" \ No newline at end of file diff --git a/test/utils.jl b/test/utils.jl index 461fdc825..feca28365 100644 --- a/test/utils.jl +++ b/test/utils.jl @@ -1545,12 +1545,10 @@ end b6 = @ballocated basic_def2($tup, $arg, $6) b7 = @ballocated basic_def2($tup, $arg, $7) @test all(iszero, (a1, a2, a3, a4, a5, a6, a7)) - @test all(!iszero, (b1, b2, b3, b4, b5, b6, b7)) for i in 1:7 global basic_def2 @test DT.eval_fnc_in_het_tuple(tup, arg, i) == basic_def2(tup, arg, i) @inferred DT.eval_fnc_in_het_tuple(tup, arg, i) - @test_throws Exception @inferred basic_def2(tup, arg, i) end end @@ -1579,7 +1577,6 @@ end end end @test all(iszero, a .- 16) || all(iszero, a) - @test all(!iszero, b) end @testset "_to_val" begin From caeb76bb318a299b991dda29ad8167bc9e273b47 Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 21 Jul 2024 15:34:01 +0100 Subject: [PATCH 08/11] Missing case --- test/triangulation/triangulate.jl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/test/triangulation/triangulate.jl b/test/triangulation/triangulate.jl index 60ffd176f..7dca5e067 100644 --- a/test/triangulation/triangulate.jl +++ b/test/triangulation/triangulate.jl @@ -35,11 +35,13 @@ end @test tri == _tri && !DelaunayTriangulation.has_vertex(_tri, 5) && validate_triangulation(_tri) end -@testset "Lots of collinearity" begin - _tri = triangulate_rectangle(-3.0, 2.0, 5.0, 17.3, 23, 57; single_boundary=true) - @test validate_triangulation(_tri) - for _ in 1:10 - tri = triangulate(_tri.points) - @test validate_triangulation(tri) +if !USE_INEXACTPREDICATES + @testset "Lots of collinearity" begin + _tri = triangulate_rectangle(-3.0, 2.0, 5.0, 17.3, 23, 57; single_boundary=true) + @test validate_triangulation(_tri) + for _ in 1:10 + tri = triangulate(_tri.points) + @test validate_triangulation(tri) + end end end \ No newline at end of file From 173f5cbc21497e5a19f72181ba05c403c33a00e0 Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 21 Jul 2024 15:37:24 +0100 Subject: [PATCH 09/11] undo --- test/Project.toml | 34 +--------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/test/Project.toml b/test/Project.toml index f45c1aab6..114345b1c 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -34,36 +34,4 @@ StructEquality = "6ec83bb0-ed9f-11e9-3b4c-2b04cb4e219c" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [compat] -Aqua = "0.8.7" -BenchmarkTools = "1.5" -CairoMakie = "0.12" -ColorSchemes = "3.26" -DataStructures = "0.18" -DelimitedFiles = "1.9" -Documenter = "1.5" -DocumenterTools = "0.1" -ElasticArrays = "1.2" -ExactPredicates = "2.2" -FastGaussQuadrature = "1.0" -ForwardDiff = "0.10" -GeometryBasics = "0.4" -OrderedCollections = "1.6" -Preferences = "1.4" -ReferenceTests = "0.10" -SafeTestsets = "0.1" -Setfield = "1.1" -SimpleGraphs = "0.8" -SpatialIndexing = "0.1" -StableRNGs = "1.0" -StaticArrays = "1.9" -StaticArraysCore = "1.4" -StatsBase = "0.34" -StructEquality = "2.1" -Dates = "1.11" -Downloads = "1.6" -InteractiveUtils = "1.11" -LinearAlgebra = "1.11" -Pkg = "1.11" -Random = "1.11" -SparseArrays = "1.11" -Test = "1.11" \ No newline at end of file +Aqua = "0.8.7" \ No newline at end of file From f8f8179d1c1fe3f5b596a4fd18d61384400b118d Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 21 Jul 2024 19:47:35 +0100 Subject: [PATCH 10/11] Dunno --- test/refinement/refine.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/refinement/refine.jl b/test/refinement/refine.jl index c13dc423a..3af4dfcc0 100644 --- a/test/refinement/refine.jl +++ b/test/refinement/refine.jl @@ -1217,7 +1217,7 @@ end in_dt_encroached_edges_lens_20, not_in_dt_encroached_edges_lens_20 = slow_encroachment_test_diametral_lens(tri, 20.0) in_dt_encroached_edges_lens_10, not_in_dt_encroached_edges_lens_10 = slow_encroachment_test_diametral_lens(tri, 10.0) all_bn = DT.get_all_boundary_nodes(tri) - for (lens_angle, not_in_dt_encroached_edges) in zip((45.0, 30.0, 20.0, 10.0), (not_in_dt_encroached_edges_lens_45, not_in_dt_encroached_edges_lens_30, not_in_dt_encroached_edges_lens_20, not_in_dt_encroached_edges_lens_10)) + for (lens_angle, not_in_dt_encroached_edges) in zip((45.0, 30.0, 20.0, 15.0), (not_in_dt_encroached_edges_lens_45, not_in_dt_encroached_edges_lens_30, not_in_dt_encroached_edges_lens_20, not_in_dt_encroached_edges_lens_10)) @info "Testing encroached edge detection. lens angle: $lens_angle" args = DT.RefinementArguments(tri; use_lens=true, min_angle=lens_angle) for (e, (b, k)) in not_in_dt_encroached_edges @@ -1231,7 +1231,7 @@ end end end end - for (lens_angle, in_dt_encroached_edges) in zip((45.0, 30.0, 20.0, 10.0), (in_dt_encroached_edges_lens_45, in_dt_encroached_edges_lens_30, in_dt_encroached_edges_lens_20, in_dt_encroached_edges_lens_10)) + for (lens_angle, in_dt_encroached_edges) in zip((45.0, 30.0, 20.0, 15.0), (in_dt_encroached_edges_lens_45, in_dt_encroached_edges_lens_30, in_dt_encroached_edges_lens_20, in_dt_encroached_edges_lens_10)) args = DT.RefinementArguments(tri; use_lens=true, min_angle=lens_angle) for (e, (b, k)) in in_dt_encroached_edges if DT.initial(e) ∈ all_bn && DT.terminal(e) ∈ all_bn && !DT.contains_segment(tri, e) From 69e912ebb4780ba4f38cd33f05c777668bfc49c6 Mon Sep 17 00:00:00 2001 From: DanielVandH Date: Sun, 21 Jul 2024 22:01:34 +0100 Subject: [PATCH 11/11] mismatch --- test/refinement/refine.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/refinement/refine.jl b/test/refinement/refine.jl index 3af4dfcc0..28a8413ec 100644 --- a/test/refinement/refine.jl +++ b/test/refinement/refine.jl @@ -1215,7 +1215,7 @@ end in_dt_encroached_edges_lens_45, not_in_dt_encroached_edges_lens_45 = slow_encroachment_test_diametral_lens(tri, 45.0) in_dt_encroached_edges_lens_30, not_in_dt_encroached_edges_lens_30 = slow_encroachment_test_diametral_lens(tri, 30.0) in_dt_encroached_edges_lens_20, not_in_dt_encroached_edges_lens_20 = slow_encroachment_test_diametral_lens(tri, 20.0) - in_dt_encroached_edges_lens_10, not_in_dt_encroached_edges_lens_10 = slow_encroachment_test_diametral_lens(tri, 10.0) + in_dt_encroached_edges_lens_10, not_in_dt_encroached_edges_lens_10 = slow_encroachment_test_diametral_lens(tri, 15.0) all_bn = DT.get_all_boundary_nodes(tri) for (lens_angle, not_in_dt_encroached_edges) in zip((45.0, 30.0, 20.0, 15.0), (not_in_dt_encroached_edges_lens_45, not_in_dt_encroached_edges_lens_30, not_in_dt_encroached_edges_lens_20, not_in_dt_encroached_edges_lens_10)) @info "Testing encroached edge detection. lens angle: $lens_angle"