├── .gitignore
├── DelaunayTriangulation.sln
├── DelaunayTriangulation.vcxproj
├── DelaunayTriangulation.vcxproj.filters
├── Header
├── DataStructure.h
├── DotCloud.h
├── Triangulation.h
└── Visualization.h
├── Main.cpp
├── README.md
├── Resource
├── random_out.txt
└── sample.txt
├── SampleResult
├── FullSphereResult.jpg
├── PartialSphereResult.jpg
├── TriangleSearching.jpg
└── TriangleSearchingInLargeScale.jpg
├── Source
├── DelaunayTriangulation.cpp
├── DotCloudGenerator.cpp
├── DotCloudReader.cpp
├── Triangle.cpp
├── Vector3D.cpp
└── Visualization.cpp
├── license.mit
└── packages.config
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.suo
8 | *.user
9 | *.userosscache
10 | *.sln.docstates
11 |
12 | # User-specific files (MonoDevelop/Xamarin Studio)
13 | *.userprefs
14 |
15 | # Build results
16 | [Dd]ebug/
17 | [Dd]ebugPublic/
18 | [Rr]elease/
19 | [Rr]eleases/
20 | x64/
21 | x86/
22 | bld/
23 | [Bb]in/
24 | [Oo]bj/
25 | [Ll]og/
26 |
27 | # Visual Studio 2015/2017 cache/options directory
28 | .vs/
29 | # Uncomment if you have tasks that create the project's static files in wwwroot
30 | #wwwroot/
31 |
32 | # Visual Studio 2017 auto generated files
33 | Generated\ Files/
34 |
35 | # MSTest test Results
36 | [Tt]est[Rr]esult*/
37 | [Bb]uild[Ll]og.*
38 |
39 | # NUNIT
40 | *.VisualState.xml
41 | TestResult.xml
42 |
43 | # Build Results of an ATL Project
44 | [Dd]ebugPS/
45 | [Rr]eleasePS/
46 | dlldata.c
47 |
48 | # Benchmark Results
49 | BenchmarkDotNet.Artifacts/
50 |
51 | # .NET Core
52 | project.lock.json
53 | project.fragment.lock.json
54 | artifacts/
55 | **/Properties/launchSettings.json
56 |
57 | # StyleCop
58 | StyleCopReport.xml
59 |
60 | # Files built by Visual Studio
61 | *_i.c
62 | *_p.c
63 | *_i.h
64 | *.ilk
65 | *.meta
66 | *.obj
67 | *.pch
68 | *.pdb
69 | *.pgc
70 | *.pgd
71 | *.rsp
72 | *.sbr
73 | *.tlb
74 | *.tli
75 | *.tlh
76 | *.tmp
77 | *.tmp_proj
78 | *.log
79 | *.vspscc
80 | *.vssscc
81 | .builds
82 | *.pidb
83 | *.svclog
84 | *.scc
85 |
86 | # Chutzpah Test files
87 | _Chutzpah*
88 |
89 | # Visual C++ cache files
90 | ipch/
91 | *.aps
92 | *.ncb
93 | *.opendb
94 | *.opensdf
95 | *.sdf
96 | *.cachefile
97 | *.VC.db
98 | *.VC.VC.opendb
99 |
100 | # Visual Studio profiler
101 | *.psess
102 | *.vsp
103 | *.vspx
104 | *.sap
105 |
106 | # Visual Studio Trace Files
107 | *.e2e
108 |
109 | # TFS 2012 Local Workspace
110 | $tf/
111 |
112 | # Guidance Automation Toolkit
113 | *.gpState
114 |
115 | # ReSharper is a .NET coding add-in
116 | _ReSharper*/
117 | *.[Rr]e[Ss]harper
118 | *.DotSettings.user
119 |
120 | # JustCode is a .NET coding add-in
121 | .JustCode
122 |
123 | # TeamCity is a build add-in
124 | _TeamCity*
125 |
126 | # DotCover is a Code Coverage Tool
127 | *.dotCover
128 |
129 | # AxoCover is a Code Coverage Tool
130 | .axoCover/*
131 | !.axoCover/settings.json
132 |
133 | # Visual Studio code coverage results
134 | *.coverage
135 | *.coveragexml
136 |
137 | # NCrunch
138 | _NCrunch_*
139 | .*crunch*.local.xml
140 | nCrunchTemp_*
141 |
142 | # MightyMoose
143 | *.mm.*
144 | AutoTest.Net/
145 |
146 | # Web workbench (sass)
147 | .sass-cache/
148 |
149 | # Installshield output folder
150 | [Ee]xpress/
151 |
152 | # DocProject is a documentation generator add-in
153 | DocProject/buildhelp/
154 | DocProject/Help/*.HxT
155 | DocProject/Help/*.HxC
156 | DocProject/Help/*.hhc
157 | DocProject/Help/*.hhk
158 | DocProject/Help/*.hhp
159 | DocProject/Help/Html2
160 | DocProject/Help/html
161 |
162 | # Click-Once directory
163 | publish/
164 |
165 | # Publish Web Output
166 | *.[Pp]ublish.xml
167 | *.azurePubxml
168 | # Note: Comment the next line if you want to checkin your web deploy settings,
169 | # but database connection strings (with potential passwords) will be unencrypted
170 | *.pubxml
171 | *.publishproj
172 |
173 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
174 | # checkin your Azure Web App publish settings, but sensitive information contained
175 | # in these scripts will be unencrypted
176 | PublishScripts/
177 |
178 | # NuGet Packages
179 | *.nupkg
180 | # The packages folder can be ignored because of Package Restore
181 | **/[Pp]ackages/*
182 | # except build/, which is used as an MSBuild target.
183 | !**/[Pp]ackages/build/
184 | # Uncomment if necessary however generally it will be regenerated when needed
185 | #!**/[Pp]ackages/repositories.config
186 | # NuGet v3's project.json files produces more ignorable files
187 | *.nuget.props
188 | *.nuget.targets
189 |
190 | # Microsoft Azure Build Output
191 | csx/
192 | *.build.csdef
193 |
194 | # Microsoft Azure Emulator
195 | ecf/
196 | rcf/
197 |
198 | # Windows Store app package directories and files
199 | AppPackages/
200 | BundleArtifacts/
201 | Package.StoreAssociation.xml
202 | _pkginfo.txt
203 | *.appx
204 |
205 | # Visual Studio cache files
206 | # files ending in .cache can be ignored
207 | *.[Cc]ache
208 | # but keep track of directories ending in .cache
209 | !*.[Cc]ache/
210 |
211 | # Others
212 | ClientBin/
213 | ~$*
214 | *~
215 | *.dbmdl
216 | *.dbproj.schemaview
217 | *.jfm
218 | *.pfx
219 | *.publishsettings
220 | orleans.codegen.cs
221 |
222 | # Including strong name files can present a security risk
223 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
224 | #*.snk
225 |
226 | # Since there are multiple workflows, uncomment next line to ignore bower_components
227 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
228 | #bower_components/
229 |
230 | # RIA/Silverlight projects
231 | Generated_Code/
232 |
233 | # Backup & report files from converting an old project file
234 | # to a newer Visual Studio version. Backup files are not needed,
235 | # because we have git ;-)
236 | _UpgradeReport_Files/
237 | Backup*/
238 | UpgradeLog*.XML
239 | UpgradeLog*.htm
240 | ServiceFabricBackup/
241 |
242 | # SQL Server files
243 | *.mdf
244 | *.ldf
245 | *.ndf
246 |
247 | # Business Intelligence projects
248 | *.rdl.data
249 | *.bim.layout
250 | *.bim_*.settings
251 | *.rptproj.rsuser
252 |
253 | # Microsoft Fakes
254 | FakesAssemblies/
255 |
256 | # GhostDoc plugin setting file
257 | *.GhostDoc.xml
258 |
259 | # Node.js Tools for Visual Studio
260 | .ntvs_analysis.dat
261 | node_modules/
262 |
263 | # Visual Studio 6 build log
264 | *.plg
265 |
266 | # Visual Studio 6 workspace options file
267 | *.opt
268 |
269 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
270 | *.vbw
271 |
272 | # Visual Studio LightSwitch build output
273 | **/*.HTMLClient/GeneratedArtifacts
274 | **/*.DesktopClient/GeneratedArtifacts
275 | **/*.DesktopClient/ModelManifest.xml
276 | **/*.Server/GeneratedArtifacts
277 | **/*.Server/ModelManifest.xml
278 | _Pvt_Extensions
279 |
280 | # Paket dependency manager
281 | .paket/paket.exe
282 | paket-files/
283 |
284 | # FAKE - F# Make
285 | .fake/
286 |
287 | # JetBrains Rider
288 | .idea/
289 | *.sln.iml
290 |
291 | # CodeRush
292 | .cr/
293 |
294 | # Python Tools for Visual Studio (PTVS)
295 | __pycache__/
296 | *.pyc
297 |
298 | # Cake - Uncomment if you are using it
299 | # tools/**
300 | # !tools/packages.config
301 |
302 | # Tabs Studio
303 | *.tss
304 |
305 | # Telerik's JustMock configuration file
306 | *.jmconfig
307 |
308 | # BizTalk build output
309 | *.btp.cs
310 | *.btm.cs
311 | *.odx.cs
312 | *.xsd.cs
313 |
314 | # OpenCover UI analysis results
315 | OpenCover/
316 |
317 | # Azure Stream Analytics local run output
318 | ASALocalRun/
319 |
320 | # MSBuild Binary and Structured Log
321 | *.binlog
322 |
323 | # NVidia Nsight GPU debugger configuration file
324 | *.nvuser
325 |
--------------------------------------------------------------------------------
/DelaunayTriangulation.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.27428.2015
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DelaunayTriangulation", "DelaunayTriangulation.vcxproj", "{21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|x64 = Debug|x64
11 | Debug|x86 = Debug|x86
12 | Release|x64 = Release|x64
13 | Release|x86 = Release|x86
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}.Debug|x64.ActiveCfg = Debug|x64
17 | {21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}.Debug|x64.Build.0 = Debug|x64
18 | {21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}.Debug|x86.ActiveCfg = Debug|Win32
19 | {21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}.Debug|x86.Build.0 = Debug|Win32
20 | {21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}.Release|x64.ActiveCfg = Release|x64
21 | {21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}.Release|x64.Build.0 = Release|x64
22 | {21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}.Release|x86.ActiveCfg = Release|Win32
23 | {21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}.Release|x86.Build.0 = Release|Win32
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {D6126430-8AA7-4F31-9183-30A08065C868}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/DelaunayTriangulation.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | Win32
7 |
8 |
9 | Release
10 | Win32
11 |
12 |
13 | Debug
14 | x64
15 |
16 |
17 | Release
18 | x64
19 |
20 |
21 |
22 | 15.0
23 | {21E1EF05-9DFA-4C77-BF99-F4FDB0D5393F}
24 | DelaunayTriangulation
25 | 10.0.16299.0
26 |
27 |
28 |
29 | Application
30 | true
31 | v141
32 | MultiByte
33 |
34 |
35 | Application
36 | false
37 | v141
38 | true
39 | MultiByte
40 |
41 |
42 | Application
43 | true
44 | v141
45 | MultiByte
46 |
47 |
48 | Application
49 | false
50 | v141
51 | true
52 | MultiByte
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 | Level3
76 | Disabled
77 | true
78 | true
79 |
80 |
81 |
82 |
83 | Level3
84 | Disabled
85 | true
86 | true
87 | NotUsing
88 |
89 |
90 |
91 |
92 | Level3
93 | MaxSpeed
94 | true
95 | true
96 | true
97 | true
98 |
99 |
100 | true
101 | true
102 |
103 |
104 |
105 |
106 | Level3
107 | MaxSpeed
108 | true
109 | true
110 | true
111 | true
112 |
113 |
114 | true
115 | true
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 | This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
143 |
144 |
145 |
146 |
--------------------------------------------------------------------------------
/DelaunayTriangulation.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
7 |
8 |
9 | {93995380-89BD-4b04-88EB-625FBE52EBFB}
10 | h;hh;hpp;hxx;hm;inl;inc;ipp;xsd
11 |
12 |
13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
15 |
16 |
17 |
18 |
19 |
20 | Source Files
21 |
22 |
23 | Source Files
24 |
25 |
26 | Source Files
27 |
28 |
29 | Source Files
30 |
31 |
32 | Source Files
33 |
34 |
35 | Source Files
36 |
37 |
38 |
39 |
40 | Header Files
41 |
42 |
43 | Header Files
44 |
45 |
46 | Header Files
47 |
48 |
49 | Header Files
50 |
51 |
52 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/Header/DataStructure.h:
--------------------------------------------------------------------------------
1 | #ifndef DATASTRUCTURE_H
2 | #define DATASTRUCTURE_H
3 |
4 | namespace dt
5 | {
6 | class Vector3D
7 | {
8 | private:
9 | int GenerateRunningId();
10 | public:
11 | int Id = 0;
12 |
13 | // coordinate
14 | double X, Y, Z;
15 |
16 | // color
17 | uint8_t R, G, B;
18 |
19 | bool IsVisited = false;
20 | bool IsAuxiliaryDot = false;
21 |
22 | Vector3D(double x, double y, double z, uint8_t r = 255, uint8_t g = 248, uint8_t b = 220);
23 | Vector3D(double x, double y, double z, bool isAuxiliaryDot, uint8_t r = 255, uint8_t g = 248, uint8_t b = 220);
24 | Vector3D(Vector3D* dot, double lengthAfterProjection);
25 | ~Vector3D();
26 |
27 | bool IsCoincidentWith(Vector3D* dot);
28 | std::string ToString();
29 | };
30 |
31 | class Triangle
32 | {
33 | private:
34 | int GenerateRunningId();
35 | public:
36 | int Id = 0;
37 |
38 | // pointers pointing to 3 vertices
39 | Vector3D* Vertex[3];
40 |
41 | // pointers pointing to 3 neighbors
42 | Triangle* Neighbor[3];
43 |
44 | Triangle(Vector3D* v0, Vector3D* v1, Vector3D* v2);
45 | ~Triangle();
46 |
47 | bool HasVertexCoincidentWith(Vector3D* dot);
48 | void AssignNeighbors(Triangle* n0, Triangle* n1, Triangle* n2);
49 | std::string ToString();
50 | };
51 | }
52 |
53 | #endif
--------------------------------------------------------------------------------
/Header/DotCloud.h:
--------------------------------------------------------------------------------
1 | #ifndef DOTCLOUD_H
2 | #define DOTCLOUD_H
3 |
4 | #include "DataStructure.h"
5 |
6 | namespace dt
7 | {
8 | class DotCloudGenerator
9 | {
10 | private:
11 | Vector3D* GetRandomDot();
12 | Vector3D* GetRandomDotEvenlyDistributed();
13 | public:
14 | std::vector GetSphericalDots();
15 | };
16 |
17 | class DotCloudReader
18 | {
19 | public:
20 | std::vector GetDotCloud();
21 | };
22 | }
23 |
24 | #endif
--------------------------------------------------------------------------------
/Header/Triangulation.h:
--------------------------------------------------------------------------------
1 | #ifndef TRIANGULATION_H
2 | #define TRIANGULATION_H
3 |
4 | #define INIT_VERTICES_COUNT 6 /* count of vertices in the initial hull */
5 | #define INIT_FACES_COUNT 8 /* count of faces in the initial hull */
6 | #define VECTOR_LENGTH 1 /* radius of unit sphere the dots projected into */
7 |
8 | #include "DataStructure.h"
9 |
10 | namespace dt
11 | {
12 | class DelaunayTriangulation
13 | {
14 | private:
15 | Vector3D * _AuxiliaryDots[INIT_VERTICES_COUNT];
16 | std::vector* _ProjectedDots;
17 | std::vector* _Mesh;
18 |
19 | // 0: triangle search operations
20 | // 1: local optimizations
21 | // 2: start time; 3: end time;
22 | long _Statistics[4];
23 |
24 | void BuildInitialHull(std::vector* dots);
25 | void InsertDot(Vector3D* dot);
26 | void RemoveExtraTriangles();
27 | void SplitTriangle(Triangle* triangle, Vector3D* dot);
28 | void FixNeighborhood(Triangle* target, Triangle* oldNeighbor, Triangle* newNeighbor);
29 | void DoLocalOptimization(Triangle* t0, Triangle* t1);
30 | bool TrySwapDiagonal(Triangle* t0, Triangle* t1);
31 | bool IsMinimumValueInArray(double arr[], int length, int index);
32 | double GetDistance(Vector3D* v0, Vector3D* v1);
33 | double GetDeterminant(Vector3D* v0, Vector3D* v1, Vector3D* v2);
34 | double GetDeterminant(double matrix[]);
35 |
36 | public:
37 | DelaunayTriangulation();
38 | ~DelaunayTriangulation();
39 |
40 | std::vector*> GetTriangulationResult(std::vector &dots);
41 | std::string GetStatistics();
42 | };
43 | }
44 |
45 | #endif
--------------------------------------------------------------------------------
/Header/Visualization.h:
--------------------------------------------------------------------------------
1 | #ifndef VISUALIZATION_H
2 | #define VISUALIZATION_H
3 |
4 | #include "DataStructure.h"
5 |
6 | namespace dt
7 | {
8 | class Visualization
9 | {
10 | public:
11 | bool IsShowWireframe;
12 |
13 | Visualization(bool isShowWireframe = false);
14 | ~Visualization();
15 |
16 | void ReconstructIn3D(std::vector &dots, std::vector*> &mesh);
17 | };
18 | }
19 |
20 | #endif
--------------------------------------------------------------------------------
/Main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include "Header/DotCloud.h"
5 | #include "Header/Triangulation.h"
6 | #include "Header/Visualization.h"
7 |
8 | using namespace std;
9 | using namespace dt;
10 |
11 | void ClearMemory(vector&, vector*>&);
12 |
13 | int main()
14 | {
15 | try
16 | {
17 | int cmd;
18 | cout << "Choose dot cloud source by key in [1/2]:\n 1 = Random generator\n 2 = Dot cloud file\n";
19 | cin >> cmd;
20 |
21 | vector dots
22 | = cmd == 1
23 | ? DotCloudGenerator().GetSphericalDots()
24 | : DotCloudReader().GetDotCloud();
25 |
26 | DelaunayTriangulation triangulation = DelaunayTriangulation();
27 | vector*> mesh = triangulation.GetTriangulationResult(dots);
28 | cout << triangulation.GetStatistics() << endl;
29 |
30 | Visualization visualization = Visualization(false);
31 | visualization.ReconstructIn3D(dots, mesh);
32 |
33 | ClearMemory(dots, mesh);
34 | }
35 | catch (exception e)
36 | {
37 | cout << e.what() << endl;
38 | system("pause");
39 | }
40 |
41 | return 0;
42 | }
43 |
44 | void ClearMemory(vector &dots, vector*> &mesh)
45 | {
46 | vector::iterator itDots;
47 | for (itDots = dots.begin(); itDots != dots.end(); itDots++)
48 | {
49 | delete *itDots;
50 | }
51 |
52 | vector*>::iterator itMesh;
53 | for (itMesh = mesh.begin(); itMesh != mesh.end(); itMesh++)
54 | {
55 | delete *itMesh;
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # DelaunayTriangulation
2 | Delaunay triangulation in 3D space, to reconstruct convex hull from spherical dot cloud.
3 | * 3D spherical dot cloud based on real environment layout can be generated by laser scanner or stereo camera.
4 | * Triangulation helps reveal the geometry structure of the dot cloud and is the most important step towards reconstruction.
5 | ## Getting Started
6 | 1. Change solution configuration to release mode(VTK lib in this project only support release mode).
7 | 2. Build to restore VTK package from nuget.org, compile and run.
8 | 3. From command window, you can choose to use random dot cloud generator or import your own dot cloud file.
9 | 1. For dot cloud file format, you can refer to [sample.txt](Resource/sample.txt): "# x y z Red Green Blue"
10 | 2. Random dot cloud generator will also save [a file](Resource/random_out.txt) when executing.
11 | 4. Sample output:
12 | 
13 | 
14 |
15 | ## How it works
16 | Will explain later with image
17 |
18 | ## To Do
19 | * ~~Handle holes left due to removing auxiliary triangles~~
20 | * ~~Fix potential dealoop in triangle searching operation~~
21 |
--------------------------------------------------------------------------------
/Resource/random_out.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xialinbo/DelaunayTriangulation/c66bac5294f74f505a4576304753a0c6d0eaf0e8/Resource/random_out.txt
--------------------------------------------------------------------------------
/Resource/sample.txt:
--------------------------------------------------------------------------------
1 | # 48.2366 -84.263 -23.937 255 248 220
2 | # -94.4127 -19.8855 -26.2834 255 248 220
3 | # 38.7306 69.7693 60.2676 255 248 220
4 | # 75.6774 28.9688 -58.5981 255 248 220
5 | # -5.78656 92.6921 -37.0768 255 248 220
6 | # -11.462 -34.7745 -93.0557 255 248 220
7 | # 33.4525 -64.6848 -68.5333 255 248 220
8 | # 66.1055 -46.1704 59.147 255 248 220
9 | # 69.7138 -67.5053 24.1458 255 248 220
10 | # 84.0544 31.8638 -43.8127 255 248 220
11 | # 91.7857 12.9132 -37.5318 255 248 220
12 | # -70.2729 0.772229 71.1416 255 248 220
13 | # 75.6187 64.816 -8.98327 255 248 220
14 | # 46.8684 53.8118 70.0546 255 248 220
15 | # -85.8557 49.1756 -14.5108 255 248 220
16 | # 57.4944 -72.9708 -37.0088 255 248 220
17 | # 18.3816 90.7766 -37.7058 255 248 220
18 | # 60.8 64.6721 -46.0531 255 248 220
19 | # 79.5284 -10.0321 59.7879 255 248 220
20 | # -26.8573 21.9134 93.8002 255 248 220
21 | # -81.769 6.13267 57.2383 255 248 220
22 | # -37.5996 -21.4457 90.1463 255 248 220
23 | # -95.4421 10.9133 27.7794 255 248 220
24 | # 27.2038 -87.9304 -39.0921 255 248 220
25 | # -63.7333 3.44928 76.9816 255 248 220
26 | # 70.5293 63.138 -32.2369 255 248 220
27 | # -59.5451 -55.35 -58.2302 255 248 220
28 | # 59.9736 34.0413 72.4179 255 248 220
29 | # 49.3457 85.5962 15.4368 255 248 220
30 | # 56.0091 -49.4732 66.4484 255 248 220
31 | # 30.7417 45.8549 83.3803 255 248 220
32 | # -63.144 76.9437 9.61796 255 248 220
33 | # 20.8375 43.0911 87.8007 255 248 220
34 | # 87.5121 -48.3276 -2.46717 255 248 220
35 | # 7.58008 73.9292 -66.9106 255 248 220
36 | # 52.1923 78.4476 -33.4954 255 248 220
37 | # -30.2966 -33.0623 -89.3812 255 248 220
38 | # 89.0345 -43.0002 -14.9611 255 248 220
39 | # 4.06203 43.804 89.8037 255 248 220
40 | # 50.5313 81.1238 29.4196 255 248 220
41 | # -46.696 55.6885 -68.6897 255 248 220
42 | # 25.5461 58.9406 76.6382 255 248 220
43 | # -78.0847 36.8842 50.4215 255 248 220
44 | # 87.464 12.2822 -46.8956 255 248 220
45 | # 49.2622 69.3888 -52.5208 255 248 220
46 | # 59.1048 -62.966 -50.4173 255 248 220
47 | # 17.8162 84.4516 -50.5026 255 248 220
48 | # -2.27639 -32.9318 94.3945 255 248 220
49 | # 56.9159 81.4662 -11.1283 255 248 220
50 | # 52.8672 70.981 -46.5484 255 248 220
51 | # -70.6554 -1.02996 70.7584 255 248 220
52 | # 59.2738 -41.0413 -69.2981 255 248 220
53 | # -1.0131 90.7735 41.9422 255 248 220
54 | # -12.4085 -52.7363 -84.053 255 248 220
55 | # -86.0504 3.77954 -50.804 255 248 220
56 | # -77.4298 60.2232 -19.4371 255 248 220
57 | # 4.72921 -65.4566 75.4524 255 248 220
58 | # 6.60056 -63.3133 77.1224 255 248 220
59 | # -32.7242 42.6222 84.3355 255 248 220
60 | # 32.1051 10.5551 94.1162 255 248 220
61 | # -26.749 -76.9777 -57.9562 255 248 220
62 | # -22.5967 -70.2279 -67.5088 255 248 220
63 | # -16.933 -95.1571 25.6592 255 248 220
64 | # 37.1215 -34.7028 -86.1261 255 248 220
65 | # 75.2879 -56.1372 34.3563 255 248 220
66 | # -42.4177 67.4386 60.4383 255 248 220
67 | # 8.60817 -67.5204 73.2591 255 248 220
68 | # 67.7417 16.2102 71.7516 255 248 220
69 | # -83.9496 7.62159 -53.7995 255 248 220
70 | # 2.72358 -14.478 -98.9089 255 248 220
71 | # -74.8207 56.6104 -34.5996 255 248 220
72 | # -87.8168 39.5176 26.9549 255 248 220
73 | # -51.588 -70.1596 -49.156 255 248 220
74 | # 45.3716 85.2319 26.0182 255 248 220
75 | # 19.4279 49.7306 84.5543 255 248 220
76 | # -13.2221 -96.42 -22.9862 255 248 220
77 | # 57.7695 -56.756 58.6638 255 248 220
78 | # 74.7884 63.8716 -18.0861 255 248 220
79 | # 19.9083 -67.1904 -71.338 255 248 220
80 | # 28.8146 54.0007 -79.08 255 248 220
81 | # 5.10398 -65.686 -75.2283 255 248 220
82 | # -57.3411 -43.3463 -69.5205 255 248 220
83 | # -16.6901 -51.6598 83.9804 255 248 220
84 | # 45.3812 1.07353 -89.1033 255 248 220
85 | # -47.5365 -47.4615 -74.0789 255 248 220
86 | # -67.854 73.2136 5.9663 255 248 220
87 | # -76.3683 -44.2636 -46.9959 255 248 220
88 | # 37.1821 -67.2745 -63.9659 255 248 220
89 | # 75.4406 49.6826 42.8994 255 248 220
90 | # 55.1832 -16.2303 81.8009 255 248 220
91 | # 0.536264 -62.2067 78.2946 255 248 220
92 | # -32.4134 -63.5038 70.1188 255 248 220
93 | # 71.4355 -16.9723 67.889 255 248 220
94 | # -62.6622 36.9969 68.5907 255 248 220
95 | # -63.1973 -55.3119 -54.2834 255 248 220
96 | # 51.0322 -36.7307 77.7597 255 248 220
97 | # -59.928 -2.44776 -80.0165 255 248 220
98 | # -93.6176 -26.3822 23.2321 255 248 220
99 | # -88.1854 -45.8503 -11.0041 255 248 220
100 | # -36.2206 -37.6904 -85.2496 255 248 220
101 | # -59.704 -71.0245 37.2956 255 248 220
102 | # 3.47385 99.107 -12.8737 255 248 220
103 | # 11.8802 47.3888 87.2534 255 248 220
104 | # -0.859993 27.3764 96.1758 255 248 220
105 | # -21.1086 88.7249 41.016 255 248 220
106 | # -44.5465 -50.1149 74.1897 255 248 220
107 | # 94.6714 -24.9415 -20.3777 255 248 220
108 | # -7.08162 61.8799 -78.2351 255 248 220
109 | # -47.6206 -64.8709 59.3637 255 248 220
110 | # -37.5424 18.069 -90.907 255 248 220
111 | # 26.2467 65.1076 -71.2188 255 248 220
112 | # -67.5437 -57.5739 -46.077 255 248 220
113 | # -58.9104 -31.2776 74.5069 255 248 220
114 | # 63.8099 -41.7429 64.698 255 248 220
115 | # -63.7605 75.498 15.3184 255 248 220
116 | # -79.2091 1.7327 -61.0157 255 248 220
117 | # -28.2602 -95.5708 -8.22114 255 248 220
118 | # -25.6473 25.1894 -93.3151 255 248 220
119 | # -53.1879 -80.4283 26.5016 255 248 220
120 | # -76.0899 -38.6836 -52.0951 255 248 220
121 | # -22.3049 -32.4435 -91.9234 255 248 220
122 | # 4.43089 36.3638 93.0486 255 248 220
123 | # -64.4167 -20.1255 -73.7933 255 248 220
124 | # 33.7636 -40.2435 -85.091 255 248 220
125 | # 13.2123 -27.5903 95.2061 255 248 220
126 | # -60.5057 49.1324 -62.6504 255 248 220
127 | # 72.7584 -68.5637 2.288 255 248 220
128 | # 12.9434 -69.2192 -71.0012 255 248 220
129 | # -41.5234 77.2209 -48.0909 255 248 220
130 | # -27.4947 39.5857 87.6186 255 248 220
131 | # 74.4399 -19.2008 -63.9533 255 248 220
132 | # -39.3305 -55.1354 -73.5744 255 248 220
133 | # -82.3959 -1.95573 -56.6312 255 248 220
134 | # 93.8601 1.07761 34.4836 255 248 220
135 | # 97.3667 4.47092 22.3546 255 248 220
136 | # 84.3895 43.0925 31.9603 255 248 220
137 | # 36.4093 92.9815 -5.36711 255 248 220
138 | # 16.8544 -35.1599 -92.0854 255 248 220
139 | # 9.86654 71.9403 -68.755 255 248 220
140 | # 25.7437 28.4897 92.3342 255 248 220
141 | # 68.9555 2.66817 72.3741 255 248 220
142 | # -37.4823 -57.6291 72.622 255 248 220
143 | # -60.0723 48.245 -63.7475 255 248 220
144 | # 3.8164 -63.8003 -76.9088 255 248 220
145 | # 81.8618 45.7083 34.7762 255 248 220
146 | # 72.8654 -61.3249 30.494 255 248 220
147 | # -87.8424 14.4399 -45.5543 255 248 220
148 | # 2.67977 -99.9172 -3.0626 255 248 220
149 | # -73.3813 45.8431 50.1358 255 248 220
150 | # -32.8068 -50.5323 -79.8136 255 248 220
151 | # -46.0214 -59.0234 -66.3195 255 248 220
152 | # -23.1463 -39.5109 -88.8996 255 248 220
153 | # -7.81969 82.628 -55.7804 255 248 220
154 | # -29.6263 -80.1297 -51.976 255 248 220
155 | # -39.3793 29.2697 -87.1352 255 248 220
156 | # 28.9798 -27.8206 -91.5761 255 248 220
157 | # 60.3846 -75.0982 26.7199 255 248 220
158 | # -88.7689 -13.9851 -43.8692 255 248 220
159 | # -34.6721 66.2871 66.3616 255 248 220
160 | # -85.1632 16.9593 49.5945 255 248 220
161 | # -44.8447 -89.0284 7.93042 255 248 220
162 | # -85.8425 -46.4313 21.7993 255 248 220
163 | # 3.62775 -40.0151 91.5731 255 248 220
164 | # -6.49033 -98.9002 -13.2897 255 248 220
165 | # -66.0547 15.8138 -73.3941 255 248 220
166 | # 76.361 -52.3003 -37.8639 255 248 220
167 | # -90.2011 -41.6781 11.2561 255 248 220
168 | # 72.2345 -38.209 -57.6389 255 248 220
169 | # 46.6231 -76.6007 44.2564 255 248 220
170 | # 61.8493 -24.1985 -74.7603 255 248 220
171 | # 65.0826 -69.9958 29.4082 255 248 220
172 | # -8.76798 -73.0665 -67.7083 255 248 220
173 | # -73.7332 -7.00047 67.1893 255 248 220
174 | # -34.4192 62.9981 69.6172 255 248 220
175 | # 67.5555 67.8899 -28.7613 255 248 220
176 | # 36.9623 -62.514 -68.7444 255 248 220
177 | # 76.295 -56.0085 -32.282 255 248 220
178 | # -50.5039 86.121 5.7043 255 248 220
179 | # 34.137 33.2835 87.9026 255 248 220
180 | # 65.1563 9.89198 -75.2118 255 248 220
181 | # -68.8457 -55.117 -47.1422 255 248 220
182 | # 67.6939 52.5943 -51.4915 255 248 220
183 | # 74.8072 58.4324 -31.457 255 248 220
184 | # -17.8449 -63.67 75.018 255 248 220
185 | # 76.3946 -16.6617 -62.3398 255 248 220
186 | # 81.3474 33.8527 -47.2927 255 248 220
187 | # 39.8689 -45.4472 79.6557 255 248 220
188 | # 58.8719 75.3111 29.3657 255 248 220
189 | # 2.06461 69.0171 -72.3352 255 248 220
190 | # 69.4767 24.8414 -67.4973 255 248 220
191 | # 24.717 80.046 54.605 255 248 220
192 | # -30.3792 -56.6245 -76.6209 255 248 220
193 | # 42.5093 -90.0886 -8.77486 255 248 220
194 | # 27.8635 -78.8187 54.8748 255 248 220
195 | # 71.6278 -58.4426 -38.1302 255 248 220
196 | # 70.3823 14.3825 69.5663 255 248 220
197 | # 4.90187 69.366 71.8632 255 248 220
198 | # -63.273 54.1243 -55.3813 255 248 220
199 | # 72.6119 42.4914 -54.0555 255 248 220
200 | # 28.5592 -69.9153 65.5456 255 248 220
201 | # 54.747 64.1659 53.7169 255 248 220
202 | # -67.0115 38.4983 -63.4613 255 248 220
203 | # 87.9988 -21.2834 42.4645 255 248 220
204 | # -58.8124 -60.2267 53.9801 255 248 220
205 | # 56.4386 57.8664 -58.8742 255 248 220
206 | # 66.5963 -62.8563 -40.1749 255 248 220
207 | # -5.81732 -92.2838 38.077 255 248 220
208 | # 75.9169 63.0202 16.281 255 248 220
209 | # -1.42904 -60.9445 79.2699 255 248 220
210 | # -27.7908 -71.029 -64.6726 255 248 220
211 | # -57.4458 44.5668 -68.657 255 248 220
212 | # 45.8967 -2.89874 -88.798 255 248 220
213 | # -3.95903 -80.3598 -59.3854 255 248 220
214 | # 85.5017 -51.758 -3.25135 255 248 220
215 | # 36.0789 -50.0185 78.7176 255 248 220
216 | # -68.401 40.3537 -60.7691 255 248 220
217 | # -27.9612 -57.0139 -77.2501 255 248 220
218 | # -31.421 -14.2823 -93.8549 255 248 220
219 | # -70.0889 -18.7273 -68.8246 255 248 220
220 | # -99.4251 -2.00353 10.5185 255 248 220
221 | # -59.5049 73.348 -32.8517 255 248 220
222 | # -42.1682 -89.1531 16.5401 255 248 220
223 | # -45.1701 -75.5658 47.4286 255 248 220
224 | # -26.6389 -42.6965 86.414 255 248 220
225 | # 12.4141 -19.7353 -97.2441 255 248 220
226 | # 46.6634 22.5371 85.5255 255 248 220
227 | # 62.023 57.011 -53.8785 255 248 220
228 | # 28.6489 52.8904 -79.8865 255 248 220
229 | # -86.1005 -24.4056 -44.6214 255 248 220
230 | # -52.5335 -85.0772 1.44853 255 248 220
231 | # 83.2425 11.879 -54.1255 255 248 220
232 | # -51.6942 -66.8779 53.4328 255 248 220
233 | # -58.9624 -64.1901 49.021 255 248 220
234 | # -30.3679 43.4813 -84.7771 255 248 220
235 | # -23.2161 94.0791 -24.7008 255 248 220
236 | # -70.5142 -46.9708 53.1176 255 248 220
237 | # -1.2318 85.8152 51.3249 255 248 220
238 | # -43.3388 61.5356 65.8417 255 248 220
239 | # 45.8958 68.2882 -56.8356 255 248 220
240 | # -57.2772 29.0571 76.6486 255 248 220
241 | # -51.326 43.9104 73.7395 255 248 220
242 | # 5.18061 -73.6459 -67.4495 255 248 220
243 | # 49.1013 -61.5998 -61.5998 255 248 220
244 | # 71.3872 21.2424 -66.728 255 248 220
245 | # 50.7049 82.2999 -25.6073 255 248 220
246 | # -90.6859 38.8372 16.3629 255 248 220
247 | # 74.1929 64.136 -19.5444 255 248 220
248 | # -56.0524 63.526 -53.1279 255 248 220
249 | # 69.9791 -59.8525 -38.9948 255 248 220
250 | # 48.2485 14.2997 -86.4153 255 248 220
251 | # -62.796 -52.5245 57.4268 255 248 220
252 | # 78.8304 -35.4016 -50.3239 255 248 220
253 | # 70.0907 68.4738 19.9657 255 248 220
254 | # -56.8299 58.4887 57.8743 255 248 220
255 | # 88.135 -44.5195 15.8191 255 248 220
256 | # -52.2118 27.7331 -80.6524 255 248 220
257 | # -57.5765 20.586 79.1275 255 248 220
258 | # 61.9026 -21.8665 75.4316 255 248 220
259 | # 19.9414 -2.93256 97.9476 255 248 220
260 | # -60.3947 -32.8644 72.6113 255 248 220
261 | # 68.6779 -29.2934 66.5225 255 248 220
262 | # 17.8998 -86.236 -47.3599 255 248 220
263 | # -33.3999 -78.6713 -51.916 255 248 220
264 | # 96.5824 -22.9709 -12.0075 255 248 220
265 | # 56.7237 82.1105 6.34671 255 248 220
266 | # 67.0056 -71.7842 18.9018 255 248 220
267 | # -73.9726 58.3028 -33.5982 255 248 220
268 | # 30.4705 -62.7511 71.6509 255 248 220
269 | # -61.923 -17.8222 -76.4717 255 248 220
270 | # -80.5958 -38.9817 -44.5505 255 248 220
271 | # -53.9352 74.6795 -38.9096 255 248 220
272 | # 80.6647 23.7201 54.1346 255 248 220
273 | # 24.8419 94.3245 -22.0402 255 248 220
274 | # -64.0144 45.1866 62.1316 255 248 220
275 | # -92.088 7.29966 38.2951 255 248 220
276 | # -74.63 51.4082 -42.2796 255 248 220
277 | # -61.8121 -71.4155 32.8496 255 248 220
278 | # 0.47155 -92.801 37.2524 255 248 220
279 | # 59.6368 -71.6802 -36.1303 255 248 220
280 | # -96.3704 -14.7044 22.2828 255 248 220
281 | # -17.7811 -78.7575 -59.0008 255 248 220
282 | # -31.3383 -66.618 67.6754 255 248 220
283 | # -45.4474 6.87964 88.81 255 248 220
284 | # 3.84316 41.8478 90.7414 255 248 220
285 | # -39.0391 27.1791 87.9616 255 248 220
286 | # 23.2779 58.1948 -77.9198 255 248 220
287 | # 18.643 -80.4142 56.4446 255 248 220
288 | # 18.8414 82.7564 -52.8808 255 248 220
289 | # 52.7036 24.882 81.2602 255 248 220
290 | # 30.7673 -32.5609 89.4045 255 248 220
291 | # -58.9152 -52.5516 61.3786 255 248 220
292 | # -60.4093 -64.8295 -46.345 255 248 220
293 | # -86.9013 -29.3252 39.8522 255 248 220
294 | # -84.4116 13.541 51.878 255 248 220
295 | # -44.4447 34.3264 82.7428 255 248 220
296 | # -77.3496 60.9847 -17.2598 255 248 220
297 | # 70.6941 41.2531 -57.4502 255 248 220
298 | # -22.6929 -77.7061 -58.7094 255 248 220
299 | # 24.0356 95.0682 19.6045 255 248 220
300 | # 16.629 -84.1526 51.3986 255 248 220
301 | # 10.1443 37.2354 -92.253 255 248 220
302 | # -57.5704 64.0895 -50.7758 255 248 220
303 | # 80.233 59.5277 4.3731 255 248 220
304 | # 72.8115 -37.8695 -57.1348 255 248 220
305 | # -41.7415 28.2037 86.384 255 248 220
306 | # 0.105366 -61.0067 -79.2349 255 248 220
307 | # 77.5618 -27.5793 56.7762 255 248 220
308 | # 70.6884 28.2287 64.856 255 248 220
309 | # -65.089 65.089 39.0748 255 248 220
310 | # 2.72044 -48.9679 87.1478 255 248 220
311 | # -52.6786 -84.4127 -9.97357 255 248 220
312 | # 2.56011 -70.5451 70.8296 255 248 220
313 | # 68.4793 9.33809 72.2729 255 248 220
314 | # -52.2406 59.8018 -60.7837 255 248 220
315 | # 39.9963 12.4391 -90.8051 255 248 220
316 | # -56.9633 -77.2986 -27.9304 255 248 220
317 | # 9.77751 -56.6391 81.8316 255 248 220
318 | # 25.151 -88.6602 38.8175 255 248 220
319 | # 6.88128 57.9993 81.171 255 248 220
320 | # 47.7301 -87.5051 -8.0434 255 248 220
321 | # -50.9863 67.8458 52.8898 255 248 220
322 | # -3.91085 -98.6914 15.6434 255 248 220
323 | # 80.6552 41.7606 41.8425 255 248 220
324 | # 64.3287 76.0922 -8.47297 255 248 220
325 | # 49.6789 51.04 70.1921 255 248 220
326 | # 46.3977 -37.8439 -80.0943 255 248 220
327 | # 61.658 -69.5197 36.9499 255 248 220
328 | # -91.4518 -19.2804 35.5646 255 248 220
329 | # -11.1043 35.287 -92.906 255 248 220
330 | # -57.4385 33.5441 -74.67 255 248 220
331 | # -57.0929 -45.0916 -68.6086 255 248 220
332 | # -56.9145 14.0508 -81.0143 255 248 220
333 | # 79.0361 58.3106 18.7926 255 248 220
334 | # 87.638 36.5877 -31.3198 255 248 220
335 | # 42.3015 -75.4808 -50.1322 255 248 220
336 | # -1.29455 -44.9394 89.324 255 248 220
337 | # 56.7382 -8.27682 -81.9285 255 248 220
338 | # 69.5232 67.9134 -23.5433 255 248 220
339 | # 74.3449 64.8873 16.2013 255 248 220
340 | # -86.7517 -36.2239 34.0877 255 248 220
341 | # 40.7461 74.1094 53.3625 255 248 220
342 | # -11.237 -36.3866 92.4648 255 248 220
343 | # 9.59295 -13.2282 98.6559 255 248 220
344 | # -3.77864 64.931 75.9585 255 248 220
345 | # 63.2344 -77.3082 -4.98448 255 248 220
346 | # -75.2333 -58.8658 29.5765 255 248 220
347 | # 36.5295 78.0481 -50.7355 255 248 220
348 | # 85.3821 22.7875 46.8041 255 248 220
349 | # -75.9552 36.4478 -53.8736 255 248 220
350 | # -69.9346 5.2451 -71.2856 255 248 220
351 | # 38.6901 -71.388 58.368 255 248 220
352 | # -52.4964 51.311 67.9066 255 248 220
353 | # 84.0613 38.0113 -38.5855 255 248 220
354 | # -4.36107 3.44295 -99.8455 255 248 220
355 | # 59.087 58.5808 -55.4709 255 248 220
356 | # 50.2086 -80.1919 -32.3784 255 248 220
357 | # 99.7292 -2.78885 6.80479 255 248 220
358 | # 68.5138 64.5624 -33.7277 255 248 220
359 | # 17.4463 -87.2317 -45.6755 255 248 220
360 | # -24.9542 39.5967 88.3708 255 248 220
361 | # -11.3384 -72.9355 -67.4674 255 248 220
362 | # -71.587 52.4691 -46.0684 255 248 220
363 | # 70.7182 21.1205 -67.4749 255 248 220
364 | # -45.6296 -67.0361 -58.5158 255 248 220
365 | # -83.8274 -41.7656 -35.0515 255 248 220
366 | # -91.1025 12.2835 39.363 255 248 220
367 | # -51.8693 -14.7559 84.2131 255 248 220
368 | # -67.9037 73.206 -5.47335 255 248 220
369 | # -44.9451 88.8028 9.69581 255 248 220
370 | # 87.4633 40.9925 25.8801 255 248 220
371 | # -52.7127 57.5523 -62.5228 255 248 220
372 | # -29.5437 94.2443 -15.6581 255 248 220
373 | # -32.3996 30.7796 -89.4588 255 248 220
374 | # -32.8209 24.4572 91.2394 255 248 220
375 | # -23.7664 97.0378 4.33909 255 248 220
376 | # 39.5661 -84.7845 35.3002 255 248 220
377 | # 92.4876 19.5647 32.6078 255 248 220
378 | # -92.8756 33.0522 16.7835 255 248 220
379 | # -10.0426 48.6951 -86.7637 255 248 220
380 | # 35.8486 -81.9515 44.7083 255 248 220
381 | # -92.8056 -10.1592 -35.8317 255 248 220
382 | # -54.8862 -75.5692 -35.7324 255 248 220
383 | # -79.5985 36.3484 -48.4032 255 248 220
384 | # -65.9449 -58.0398 -47.7771 255 248 220
385 | # 61.7529 -78.6168 2.44405 255 248 220
386 | # 51.9851 74.561 41.6919 255 248 220
387 | # -73.56 -0.485011 67.7399 255 248 220
388 | # 57.5772 -76.5036 -28.8456 255 248 220
389 | # -35.1751 -62.3559 -69.8173 255 248 220
390 | # -14.7298 34.8354 92.5718 255 248 220
391 | # 78.2159 -13.631 -60.7986 255 248 220
392 | # -70.9084 -58.3152 39.64 255 248 220
393 | # 78.0979 -61.9103 -8.23578 255 248 220
394 | # 21.864 69.5443 -68.4511 255 248 220
395 | # -92.5548 31.6582 -20.7694 255 248 220
396 | # 66.0078 -13.531 -73.891 255 248 220
397 | # -49.3475 86.9727 -0.756284 255 248 220
398 | # 72.2538 -17.4406 66.897 255 248 220
399 | # 86.1766 48.0075 -16.3972 255 248 220
400 | # -19.914 -78.9392 58.0693 255 248 220
401 | # -75.4387 -34.0596 -56.1155 255 248 220
402 | # 67.0389 -41.2786 -61.6592 255 248 220
403 | # -37.3537 -73.1064 57.0977 255 248 220
404 | # 14.8282 -98.0433 12.947 255 248 220
405 | # 17.476 -74.3231 64.5807 255 248 220
406 | # 57.9488 57.2118 -58.0409 255 248 220
407 | # 39.8886 86.7659 -29.6746 255 248 220
408 | # 64.2863 5.9271 -76.3685 255 248 220
409 | # -66.4144 37.3765 64.7467 255 248 220
410 | # 47.0192 -76.6176 -43.8057 255 248 220
411 | # 70.1496 30.1586 -64.5716 255 248 220
412 | # -83.5912 -20.2309 51.0218 255 248 220
413 | # -74.6499 13.5174 65.1512 255 248 220
414 | # 41.313 -8.31298 -90.687 255 248 220
415 | # -28.3898 50.2589 -81.6582 255 248 220
416 | # -79.7385 -37.2457 -47.4818 255 248 220
417 | # -61.6849 49.6455 -61.0762 255 248 220
418 | # -34.0311 -60.0433 72.3649 255 248 220
419 | # -70.5603 57.4936 -41.4215 255 248 220
420 | # -49.5134 4.49271 -86.7654 255 248 220
421 | # 10.628 1.88204 99.4158 255 248 220
422 | # 80.058 0.846279 -59.9166 255 248 220
423 | # -62.4681 12.3811 77.1002 255 248 220
424 | # 61.5414 -9.32059 -78.2674 255 248 220
425 | # 12.4732 -12.145 98.4729 255 248 220
426 | # -3.94189 -71.4847 -69.8169 255 248 220
427 | # 39.8342 -55.7833 72.8111 255 248 220
428 | # 45.8935 -88.2747 10.0685 255 248 220
429 | # -26.408 -25.7986 92.9357 255 248 220
430 | # 67.2387 72.6933 13.9512 255 248 220
431 | # 20.4775 -46.2509 -86.2643 255 248 220
432 | # 67.1384 62.549 39.7501 255 248 220
433 | # -82.3908 -56.3435 -6.09618 255 248 220
434 | # 63.0229 36.4563 -68.5496 255 248 220
435 | # 60.9377 -79.1918 3.9051 255 248 220
436 | # -30.4969 -85.7387 -41.4585 255 248 220
437 | # -15.931 -98.6272 4.34481 255 248 220
438 | # 70.1068 38.7389 -59.8693 255 248 220
439 | # 57.3487 -65.7178 48.9111 255 248 220
440 | # -11.7748 -45.761 -88.1322 255 248 220
441 | # -82.8062 54.8414 -11.6429 255 248 220
442 | # -95.9927 -22.7983 16.2988 255 248 220
443 | # -87.1533 45.3271 -18.702 255 248 220
444 | # 55.1989 -82.4698 -12.3212 255 248 220
445 | # -74.7497 -65.2642 -12.3724 255 248 220
446 | # -95.2622 6.0977 29.7982 255 248 220
447 | # 36.903 -12.7895 -92.0576 255 248 220
448 | # 88.2395 23.4986 40.7628 255 248 220
449 | # 32.7491 -26.8318 -90.5955 255 248 220
450 | # 58.7942 -80.4725 8.21148 255 248 220
451 | # -14.1133 -74.8617 64.7808 255 248 220
452 | # 67.0356 30.9845 67.4254 255 248 220
453 | # 23.1797 -66.4434 71.0491 255 248 220
454 | # 46.1225 74.0285 -48.9131 255 248 220
455 | # -35.2566 3.16676 93.5251 255 248 220
456 | # -63.3936 -75.593 16.3386 255 248 220
457 | # -12.4949 54.9776 82.5914 255 248 220
458 | # 74.3556 -18.9361 -64.1301 255 248 220
459 | # 60.9667 -79.2129 -2.89482 255 248 220
460 | # -39.7549 33.7053 -85.3434 255 248 220
461 | # -0.873339 90.0787 43.4174 255 248 220
462 | # -13.7243 -65.3173 74.4668 255 248 220
463 | # -59.1358 49.4694 -63.6847 255 248 220
464 | # 21.8544 -90.0105 37.6896 255 248 220
465 | # -60.7213 55.6002 -56.7586 255 248 220
466 | # 22.034 71.1171 66.7597 255 248 220
467 | # 74.6292 -53.9794 -38.9449 255 248 220
468 | # -16.2543 27.24 -94.8355 255 248 220
469 | # -59.5963 -72.5696 34.3793 255 248 220
470 | # 26.1809 -65.4523 70.9265 255 248 220
471 | # -45.2225 84.7921 -27.6627 255 248 220
472 | # -66.0749 -55.3499 -50.7 255 248 220
473 | # 11.6471 14.5301 98.2508 255 248 220
474 | # -59.8261 -65.9771 45.4737 255 248 220
475 | # 63.4488 -60.26 48.4043 255 248 220
476 | # -22.7486 -65.0507 72.4632 255 248 220
477 | # 56.7785 -62.1526 53.9746 255 248 220
478 | # 35.1959 82.1979 -44.7745 255 248 220
479 | # -45.827 -65.0282 -60.5906 255 248 220
480 | # 32.7099 17.9275 -92.7829 255 248 220
481 | # -62.5326 -45.8235 63.1655 255 248 220
482 | # -72.3448 -43.1998 53.8518 255 248 220
483 | # -43.6787 66.3391 -60.7561 255 248 220
484 | # 74.7259 -14.7595 -64.7934 255 248 220
485 | # -80.7126 23.2562 -54.2644 255 248 220
486 | # 97.6821 21.389 -0.842087 255 248 220
487 | # -76.4866 15.8815 62.4306 255 248 220
488 | # 40.2576 43.2572 -80.6731 255 248 220
489 | # -44.3996 53.5278 -71.8572 255 248 220
490 | # 19.7808 98.0098 -1.67634 255 248 220
491 | # 34.6442 75.0363 -56.2969 255 248 220
492 | # 10.3327 2.25068 -99.4393 255 248 220
493 | # 77.4058 -48.4405 40.7659 255 248 220
494 | # 14.3811 -83.1005 -53.7354 255 248 220
495 | # 23.5632 4.20772 97.0931 255 248 220
496 | # 98.321 1.71847 -18.1667 255 248 220
497 | # -69.9906 -19.9382 -68.5842 255 248 220
498 | # -80.2582 20.8749 -55.8825 255 248 220
499 | # 57.5918 49.0268 65.4183 255 248 220
500 | # 45.5479 -46.4619 -75.9386 255 248 220
501 | # -15.7252 16.583 97.3536 255 248 220
502 | # 50.9325 -27.2777 81.6199 255 248 220
503 | # -37.1408 -76.6623 -52.378 255 248 220
504 | # 46.001 -41.8101 78.3315 255 248 220
505 | # -29.6774 90.5943 -30.1981 255 248 220
506 | # 67.0347 0 -74.2048 255 248 220
507 | # 89.9931 -43.3262 4.90682 255 248 220
508 | # -81.8674 53.6275 -20.5382 255 248 220
509 | # -66.1914 58.5778 46.769 255 248 220
510 | # 18.0887 87.3373 45.2217 255 248 220
511 | # 50.8665 82.1273 -25.8398 255 248 220
512 | # -43.7317 66.1721 60.8999 255 248 220
513 | # -25.0015 75.7713 60.2796 255 248 220
514 | # -24.5087 -51.6169 82.0672 255 248 220
515 | # -42.3096 25.9523 86.8123 255 248 220
516 | # -72.3273 -27.3124 -63.4255 255 248 220
517 | # 21.9127 -89.718 -38.3472 255 248 220
518 | # 36.1047 47.6423 -80.1664 255 248 220
519 | # -52.5442 66.0452 53.6389 255 248 220
520 | # 75.805 65.0794 4.27411 255 248 220
521 | # 48.8346 0.187465 -87.2648 255 248 220
522 | # -70.7787 60.3591 36.7036 255 248 220
523 | # 67.383 -47.5644 56.5434 255 248 220
524 | # 8.17077 38.5193 -91.9212 255 248 220
525 | # -98.5119 12.2069 12.0998 255 248 220
526 | # 57.4265 -55.8077 59.8974 255 248 220
527 | # -36.0832 93.2626 -0.286375 255 248 220
528 | # 8.16663 81.5829 -57.2497 255 248 220
529 | # -57.731 -74.6374 33.1116 255 248 220
530 | # -64.1832 63.0833 -43.6006 255 248 220
531 | # 56.1157 -81.8812 -12.1034 255 248 220
532 | # -93.0364 -31.8982 -18.0756 255 248 220
533 | # 91.9939 11.4153 -37.5074 255 248 220
534 | # -39.3201 -86.4865 -31.2092 255 248 220
535 | # 51.7318 -21.8677 82.7383 255 248 220
536 | # -26.8088 -44.8822 -85.246 255 248 220
537 | # 95.0753 1.4223 30.9624 255 248 220
538 | # -29.86 22.8615 -92.6592 255 248 220
539 | # 65.0457 -44.8677 61.2858 255 248 220
540 | # 6.33504 30.798 -94.9281 255 248 220
541 | # -26.8741 -69.0213 -67.1852 255 248 220
542 | # -76.216 -27.798 58.4671 255 248 220
543 | # 23.6246 55.2107 79.9603 255 248 220
544 | # -54.5228 8.58708 -83.3878 255 248 220
545 | # 52.297 -64.944 -55.2024 255 248 220
546 | # 16.1616 48.838 -85.7535 255 248 220
547 | # 54.4075 -32.5294 -77.3412 255 248 220
548 | # -46.6569 45.4008 -75.9072 255 248 220
549 | # 82.5759 11.3898 55.2404 255 248 220
550 | # -42.45 63.3303 -64.7092 255 248 220
551 | # -74.5694 -50.16 -43.8564 255 248 220
552 | # 19.4437 87.2376 44.8502 255 248 220
553 | # -63.8663 -62.3837 45.0485 255 248 220
554 | # -91.655 -39.4993 6.25869 255 248 220
555 | # -64.917 -65.4907 -38.6879 255 248 220
556 | # -7.22306 -77.9919 -62.1699 255 248 220
557 | # 56.8682 34.9038 74.4831 255 248 220
558 | # -58.3721 71.3795 -38.6997 255 248 220
559 | # -79.6066 29.4409 -52.8774 255 248 220
560 | # -48.7615 36.657 79.2375 255 248 220
561 | # 34.5007 93.1248 11.7248 255 248 220
562 | # 29.2056 52.4373 -79.9835 255 248 220
563 | # 46.8619 -77.8591 41.7364 255 248 220
564 | # 90.3584 37.0629 -21.4871 255 248 220
565 | # 56.9595 -79.1425 -22.183 255 248 220
566 | # -86.2165 39.8583 31.2734 255 248 220
567 | # -55.5885 -74.6903 36.4867 255 248 220
568 | # -67.4009 41.3392 61.2225 255 248 220
569 | # 16.8068 -25.9842 -95.0913 255 248 220
570 | # -45.8448 58.6017 66.8139 255 248 220
571 | # -80.5197 -22.6557 -54.8024 255 248 220
572 | # -57.7637 51.6764 63.1894 255 248 220
573 | # -44.7003 83.2757 32.6656 255 248 220
574 | # -5.89354 93.0559 36.1367 255 248 220
575 | # 83.4725 26.9459 48.0236 255 248 220
576 | # 63.5685 8.94668 76.6746 255 248 220
577 | # -58.635 69.0493 -42.3572 255 248 220
578 | # -2.08261 71.2715 -70.1145 255 248 220
579 | # 11.4805 98.3089 14.2671 255 248 220
580 | # -16.0261 -78.7267 59.5422 255 248 220
581 | # -92.4359 27.8042 26.1255 255 248 220
582 | # -80.2444 39.5284 -44.7028 255 248 220
583 | # -63.175 48.9208 -60.1304 255 248 220
584 | # 10.5055 98.2488 15.3884 255 248 220
585 | # -19.064 51.6847 -83.4581 255 248 220
586 | # -72.0747 50.1472 47.8591 255 248 220
587 | # 21.2819 -87.9959 -42.4712 255 248 220
588 | # 37.4512 -33.0125 -86.6463 255 248 220
589 | # 17.5995 49.4172 -85.1363 255 248 220
590 | # 59.7304 -12.0632 79.2891 255 248 220
591 | # -89.8944 -43.4589 5.50678 255 248 220
592 | # -86.1129 43.4287 26.4295 255 248 220
593 | # -33.0967 -48.4631 -80.9688 255 248 220
594 | # -51.7285 79.0369 32.8226 255 248 220
595 | # -98.8646 9.27891 -11.8196 255 248 220
596 | # -45.318 -63.2724 -62.7923 255 248 220
597 | # 11.2764 90.1159 41.8566 255 248 220
598 | # 68.272 -71.3466 -15.7672 255 248 220
599 | # 11.058 -94.929 29.4314 255 248 220
600 | # 22.6601 -59.6318 -77.0102 255 248 220
601 | # -89.3166 -0.720295 -44.967 255 248 220
602 | # 67.9579 70.6107 -19.8958 255 248 220
603 | # 47.0807 -69.4865 -54.3602 255 248 220
604 | # -95.1044 -20.0818 23.4919 255 248 220
605 | # 40.8555 14.5513 90.106 255 248 220
606 | # -92.1171 -38.4808 5.80172 255 248 220
607 | # 53.6226 44.2687 -71.8672 255 248 220
608 | # -21.8499 -77.0947 59.8247 255 248 220
609 | # -16.4094 -98.3088 8.1308 255 248 220
610 | # -60.3461 34.0736 -72.0925 255 248 220
611 | # -57.1156 -60.6464 55.3156 255 248 220
612 | # -64.0903 65.8154 -39.5065 255 248 220
613 | # 72.0425 56.8247 -39.7597 255 248 220
614 | # -42.3653 -88.7782 17.9895 255 248 220
615 | # -44.4384 -63.4196 -63.2707 255 248 220
616 | # -79.0225 61.2529 -1.88149 255 248 220
617 | # -66.9907 -46.0646 -58.2262 255 248 220
618 | # 80.4078 16.3328 -57.1649 255 248 220
619 | # 38.78 58.0197 71.6228 255 248 220
620 | # -64.3288 29.1197 -70.8085 255 248 220
621 | # -18.0452 -27.1476 -94.5377 255 248 220
622 | # -79.5276 -53.8964 -27.7587 255 248 220
623 | # -58.1164 -45.3764 67.5534 255 248 220
624 | # 52.3754 -73.6628 42.7856 255 248 220
625 | # -81.2419 50.2085 29.6457 255 248 220
626 | # 46.4716 -24.1182 85.198 255 248 220
627 | # 69.9338 -64.4825 30.8426 255 248 220
628 | # -70.1312 -71.0199 6.14667 255 248 220
629 | # -45.3651 20.0252 86.839 255 248 220
630 | # -57.0161 -54.6182 61.3678 255 248 220
631 | # 55.1583 -49.7938 66.919 255 248 220
632 | # 17.5768 38.5337 90.5881 255 248 220
633 | # 76.802 -20.595 -60.6407 255 248 220
634 | # -34.3568 48.9672 80.1363 255 248 220
635 | # -11.5077 32.1788 -93.9792 255 248 220
636 | # 59.8048 61.1136 -51.8509 255 248 220
637 | # -39.8102 6.12465 91.5294 255 248 220
638 | # -62.0028 -24.7821 -74.4413 255 248 220
639 | # -92.2104 -23.8475 -30.4718 255 248 220
640 | # -46.5383 -71.9991 -51.4812 255 248 220
641 | # -14.5427 91.3765 -37.9321 255 248 220
642 | # -32.6449 -36.6797 87.1143 255 248 220
643 | # -14.219 43.9089 -88.7121 255 248 220
644 | # 44.7441 -89.3686 -3.34983 255 248 220
645 | # -76.2146 38.3021 52.1947 255 248 220
646 | # -81.5751 -57.2702 8.10163 255 248 220
647 | # -49.0098 -66.3338 -56.5497 255 248 220
648 | # 48.2774 -6.94184 87.2989 255 248 220
649 | # 45.0186 -89.2806 -1.51323 255 248 220
650 | # -84.2111 24.5823 48.002 255 248 220
651 | # 1.09182 22.5643 -97.4149 255 248 220
652 | # -26.94 -69.8788 -66.2661 255 248 220
653 | # 99.1781 11.3587 -5.88968 255 248 220
654 | # -65.0915 52.4123 54.9186 255 248 220
655 | # 32.8413 80.4792 -49.4424 255 248 220
656 | # -36.2571 78.8197 -49.7281 255 248 220
657 | # 52.9014 -26.3029 80.6821 255 248 220
658 | # -17.547 -46.084 -86.9963 255 248 220
659 | # -56.1353 77.9788 -27.7153 255 248 220
660 | # -80.4584 -59.1489 5.27759 255 248 220
661 | # -66.7001 51.5527 -53.7904 255 248 220
662 | # 3.25126 52.2444 85.2054 255 248 220
663 | # 79.6932 -23.972 -55.4467 255 248 220
664 | # -27.8184 -46.7441 83.9114 255 248 220
665 | # -60.2435 53.1094 59.5829 255 248 220
666 | # -22.3875 -94.582 23.5171 255 248 220
667 | # 96.1246 2.62033 27.4445 255 248 220
668 | # 3.17827 -99.4936 9.53481 255 248 220
669 | # 2.56392 50.4237 86.3185 255 248 220
670 | # 29.1688 -81.3164 -50.367 255 248 220
671 | # -34.6139 93.8057 1.53612 255 248 220
672 | # -37.3858 61.2247 -69.6695 255 248 220
673 | # 9.77092 79.4998 59.8691 255 248 220
674 | # 14.7048 80.8765 56.9452 255 248 220
675 | # -54.8884 -79.9438 -24.4184 255 248 220
676 | # -76.9767 -47.4945 42.6481 255 248 220
677 | # -57.7573 -50.1549 64.4095 255 248 220
678 | # 91.1896 30.4622 27.5047 255 248 220
679 | # 6.43489 -35.3919 93.306 255 248 220
680 | # 92.4215 -7.96247 -37.3478 255 248 220
681 | # 62.8318 61.8161 47.2327 255 248 220
682 | # 16.1192 98.4191 -7.33884 255 248 220
683 | # 15.0176 3.75441 98.7946 255 248 220
684 | # -48.5064 -79.751 -35.8735 255 248 220
685 | # 11.7926 48.8084 -86.4793 255 248 220
686 | # 90.968 -25.9777 32.4033 255 248 220
687 | # -53.2625 -22.9997 -81.4501 255 248 220
688 | # -76.9887 -7.76543 63.3438 255 248 220
689 | # 71.545 57.6471 -39.4731 255 248 220
690 | # 74.9268 -19.8768 -63.1735 255 248 220
691 | # 92.3088 38.3901 -2.30053 255 248 220
692 | # 46.7603 63.9402 61.0338 255 248 220
693 | # 68.7849 -34.6264 63.7937 255 248 220
694 | # 74.4968 65.1535 -14.3263 255 248 220
695 | # 32.8228 80.4437 -49.5124 255 248 220
696 | # -2.5441 44.5218 -89.5061 255 248 220
697 | # 47.5991 22.9698 -84.8924 255 248 220
698 | # -43.7679 -89.2778 -10.6698 255 248 220
699 | # -70.5708 -70.8497 0.278936 255 248 220
700 | # -51.5852 -57.5942 63.4183 255 248 220
701 | # -48.0904 -85.6541 18.7265 255 248 220
702 | # 75.8892 -3.09752 -65.0479 255 248 220
703 | # -16.75 -82.8324 -53.4624 255 248 220
704 | # 69.8948 1.45455 -71.5025 255 248 220
705 | # 48.8608 34.0569 80.329 255 248 220
706 | # -74.6379 34.3353 -57.0112 255 248 220
707 | # 17.7833 50.0852 -84.7067 255 248 220
708 | # -15.2705 98.7627 3.56974 255 248 220
709 | # -10.2648 67.3814 73.1737 255 248 220
710 | # 22.6254 52.8988 -81.7913 255 248 220
711 | # -84.0658 0.8975 54.1492 255 248 220
712 | # 68.18 40.8399 60.6926 255 248 220
713 | # -40.3381 -77.4316 -48.7565 255 248 220
714 | # -75.2454 -49.3966 43.5672 255 248 220
715 | # 11.1371 75.7321 -64.3476 255 248 220
716 | # 67.9896 1.12803 -73.3222 255 248 220
717 | # 21.3883 71.6182 -66.4332 255 248 220
718 | # -81.4172 -42.3074 -39.7657 255 248 220
719 | # -77.6983 62.7151 5.45814 255 248 220
720 | # 67.3596 -67.9415 29.097 255 248 220
721 | # 68.6791 -0.528882 -72.6835 255 248 220
722 | # -82.2396 8.53149 56.2483 255 248 220
723 | # 15.6944 68.1513 -71.4779 255 248 220
724 | # 89.7697 41.2559 -15.471 255 248 220
725 | # -11.8742 -95.9073 25.7058 255 248 220
726 | # 33.0846 90.7515 25.8762 255 248 220
727 | # 76.9348 63.6701 -5.2111 255 248 220
728 | # 37.5269 -88.4563 -27.6985 255 248 220
729 | # 39.9316 -85.1312 34.0314 255 248 220
730 | # -66.4762 -10.9878 73.893 255 248 220
731 | # 29.7894 68.2553 66.7369 255 248 220
732 | # -6.95844 83.7001 -54.2759 255 248 220
733 | # -70.681 -70.0769 9.66578 255 248 220
734 | # -71.8252 32.1228 -61.7192 255 248 220
735 | # -55.825 65.894 50.4137 255 248 220
736 | # -50.3126 71.3702 48.7333 255 248 220
737 | # 13.6433 95.2043 -27.3862 255 248 220
738 | # 77.0141 -60.6445 19.7754 255 248 220
739 | # -14.2511 -94.6458 28.9669 255 248 220
740 | # -32.7863 84.2483 -42.7467 255 248 220
741 | # 74.2453 -39.0461 -54.4337 255 248 220
742 | # -24.4294 -71.0538 65.9891 255 248 220
743 | # -77.4604 -37.4107 -50.9934 255 248 220
744 | # -57.7177 -59.4514 -55.984 255 248 220
745 | # -88.8536 6.19909 45.46 255 248 220
746 | # 10.4922 -29.5845 -94.9456 255 248 220
747 | # -38.165 70.4641 -59.8184 255 248 220
748 | # 12.8771 30.2785 -94.4319 255 248 220
749 | # 63.2596 -45.5347 62.6484 255 248 220
750 | # 42.4701 87.3998 -23.6127 255 248 220
751 | # 72.6005 -68.425 6.86944 255 248 220
752 | # -44.318 30.1123 84.4344 255 248 220
753 | # 11.5916 -5.5198 -99.1724 255 248 220
754 | # 60.6411 -55.2253 57.2086 255 248 220
755 | # 62.1906 42.6578 65.6706 255 248 220
756 | # -91.1371 -1.98124 -41.1108 255 248 220
757 | # -35.1085 17.1307 -92.054 255 248 220
758 | # -53.5355 66.3485 52.2669 255 248 220
759 | # 4.34723 85.2957 52.0169 255 248 220
760 | # -52.3994 -65.9844 -53.8549 255 248 220
761 | # -82.2394 -37.0398 -43.1826 255 248 220
762 | # -65.6432 -61.8089 43.2509 255 248 220
763 | # -69.2167 -70.3639 -16.0613 255 248 220
764 | # 14.3364 39.5194 -90.7342 255 248 220
765 | # 50.2913 69.3637 -51.5699 255 248 220
766 | # -39.2965 5.38742 91.7974 255 248 220
767 | # 70.6926 -70.0595 9.70704 255 248 220
768 | # 41.2423 23.8006 87.9352 255 248 220
769 | # -40.4506 -65.0489 64.2836 255 248 220
770 | # -33.9803 -28.8695 -89.5092 255 248 220
771 | # 76.1329 -53.8198 -36.1554 255 248 220
772 | # 67.3344 64.4068 -36.302 255 248 220
773 | # 48.7575 -70.2719 51.8128 255 248 220
774 | # -64.9523 75.3599 10.1037 255 248 220
775 | # 73.0786 -0.229446 -68.2603 255 248 220
776 | # 38.6244 -62.7646 -67.5926 255 248 220
777 | # -74.2337 51.999 42.2547 255 248 220
778 | # -80.5734 56.9412 -16.298 255 248 220
779 | # 79.3824 -47.7451 -37.6674 255 248 220
780 | # -23.3358 -56.256 79.314 255 248 220
781 | # -84.2346 -19.538 -50.2274 255 248 220
782 | # 22.4798 -68.3881 -69.4099 255 248 220
783 | # 23.7423 -53.9264 -80.7976 255 248 220
784 | # -80.8843 53.9228 -23.4534 255 248 220
785 | # 50.7271 19.8768 -83.8551 255 248 220
786 | # 59.7597 -40.2326 -69.355 255 248 220
787 | # -5.01325 55.5725 -82.9854 255 248 220
788 | # 73.1989 2.84821 -68.0721 255 248 220
789 | # -95.8374 -5.94853 -27.925 255 248 220
790 | # -75.3251 -34.2191 -56.171 255 248 220
791 | # -81.9068 35.1029 -45.3769 255 248 220
792 | # 53.513 -18.1545 82.5032 255 248 220
793 | # 57.325 -40.4156 71.2771 255 248 220
794 | # 30.5019 88.9177 34.1067 255 248 220
795 | # 73.165 59.2126 33.775 255 248 220
796 | # -46.4756 42.6382 77.6015 255 248 220
797 | # -84.5963 50.0474 -18.4045 255 248 220
798 | # -21.9395 97.4958 -3.63703 255 248 220
799 | # -51.9002 -69.6073 -49.6105 255 248 220
800 | # 65.7322 -55.8877 -50.5553 255 248 220
801 | # -67.071 13.33 -72.9643 255 248 220
802 | # 0.359324 -94.5023 32.6985 255 248 220
803 | # -51.8304 72.6677 45.089 255 248 220
804 | # -62.9476 50.5066 59.0482 255 248 220
805 | # -40.8627 29.8554 -86.249 255 248 220
806 | # 75.0287 51.2593 41.7515 255 248 220
807 | # -33.9063 1.38176 -94.0662 255 248 220
808 | # -19.8708 10.8497 97.4035 255 248 220
809 | # -46.9701 -55.7314 68.4677 255 248 220
810 | # 60.1849 73.3728 -31.5311 255 248 220
811 | # 62.5808 76.1946 -16.6742 255 248 220
812 | # 14.2071 -62.3441 76.8855 255 248 220
813 | # 7.06289 -36.2438 92.9328 255 248 220
814 | # -56.2236 81.108 16.1367 255 248 220
815 | # 10.0402 -19.5882 97.5474 255 248 220
816 | # -67.4632 65.039 -34.9091 255 248 220
817 | # -60.5713 -68.9581 39.6975 255 248 220
818 | # -55.1832 64.4476 52.9276 255 248 220
819 | # -61.193 37.873 69.4338 255 248 220
820 | # 77.5887 58.5054 -23.603 255 248 220
821 | # -3.92233 63.9458 76.7825 255 248 220
822 | # 1.09355 -82.5019 56.4999 255 248 220
823 | # 49.3753 -51.623 69.9796 255 248 220
824 | # 99.6082 -2.95448 -8.33585 255 248 220
825 | # 31.5933 -92.2829 -22.0393 255 248 220
826 | # -64.3901 -53.6785 -54.521 255 248 220
827 | # 67.2245 10.8963 -73.2267 255 248 220
828 | # 4.66538 -50.6788 86.0807 255 248 220
829 | # 8.72785 -38.8637 -91.7248 255 248 220
830 | # -26.3967 82.771 49.5194 255 248 220
831 | # -67.7812 3.56743 -73.4369 255 248 220
832 | # 61.8167 10.6487 -77.88 255 248 220
833 | # -15.3945 -69.6305 -70.1042 255 248 220
834 | # -31.046 82.4961 -47.2286 255 248 220
835 | # 14.5914 -14.3482 97.8837 255 248 220
836 | # -40.1846 75.6735 -51.5627 255 248 220
837 | # 74.3599 -32.129 58.6373 255 248 220
838 | # 68.532 -55.3374 -47.3407 255 248 220
839 | # 15.9092 31.0886 93.7038 255 248 220
840 | # 35.6157 -88.1286 31.0625 255 248 220
841 | # 20.3469 87.0258 44.8612 255 248 220
842 | # 70.0838 57.4121 -42.3334 255 248 220
843 | # -81.3779 26.9512 51.4904 255 248 220
844 | # -68.5464 -12.3853 -71.7495 255 248 220
845 | # -77.3424 -12.6773 -62.1083 255 248 220
846 | # -76.4033 -64.133 -7.035 255 248 220
847 | # -66.2398 -42.452 61.7262 255 248 220
848 | # -49.4858 -53.8522 68.1989 255 248 220
849 | # -99.4501 -8.99211 5.36843 255 248 220
850 | # -63.6398 -77.0431 -3.78565 255 248 220
851 | # -83.1438 53.3416 -15.549 255 248 220
852 | # -80.0552 -15.7569 -57.8177 255 248 220
853 | # -68.4028 -49.6388 -53.4514 255 248 220
854 | # 78.0774 24.6482 57.4142 255 248 220
855 | # 2.80841 -9.94645 -99.4645 255 248 220
856 | # 35.6402 78.6664 -50.4121 255 248 220
857 | # 32.5144 74.422 -58.3454 255 248 220
858 | # 58.3395 61.8942 -52.5891 255 248 220
859 | # 10.2108 30.9268 -94.5477 255 248 220
860 | # -48.7398 81.1484 32.2393 255 248 220
861 | # -90.1807 3.99371 43.0291 255 248 220
862 | # -26.8591 51.0323 -81.6964 255 248 220
863 | # -68.3043 18.7837 -70.5811 255 248 220
864 | # -82.1665 56.8613 -3.9319 255 248 220
865 | # 17.1926 -62.0466 76.5156 255 248 220
866 | # 69.6609 49.4182 52.0116 255 248 220
867 | # -61.5033 78.0941 10.893 255 248 220
868 | # 53.1529 -24.5832 81.0582 255 248 220
869 | # 52.0219 72.4548 -45.2109 255 248 220
870 | # -4.05828 -16.4264 -98.5581 255 248 220
871 | # -20.1261 -85.3834 -48.0064 255 248 220
872 | # 42.6644 74.3471 -51.5002 255 248 220
873 | # 48.5046 -4.58551 87.3286 255 248 220
874 | # -73.336 -66.8273 -12.4876 255 248 220
875 | # -30.8079 73.1005 60.8867 255 248 220
876 | # 44.9415 -15.623 -87.9556 255 248 220
877 | # -48.2042 -52.4397 70.1885 255 248 220
878 | # -30.8446 89.5522 -32.0784 255 248 220
879 | # -22.687 -42.7928 87.4876 255 248 220
880 | # 36.3253 -35.495 86.1428 255 248 220
881 | # -61.2849 -38.2867 -69.1252 255 248 220
882 | # 63.292 -74.4729 -21.1639 255 248 220
883 | # -14.1979 -98.9766 1.43 255 248 220
884 | # 41.8142 -26.167 86.9877 255 248 220
885 | # -50.1595 85.8515 10.6556 255 248 220
886 | # 88.0709 45.1424 -14.3416 255 248 220
887 | # -60.4736 22.7849 76.3138 255 248 220
888 | # -50.5645 61.971 -60.0236 255 248 220
889 | # 65.9291 -18.722 72.8206 255 248 220
890 | # -12.1286 70.9059 69.464 255 248 220
891 | # 98.8328 14.2184 5.46862 255 248 220
892 | # 34.6871 -88.1967 -31.9085 255 248 220
893 | # 50.4452 -73.9205 -44.6211 255 248 220
894 | # 92.4111 31.2144 -22.0418 255 248 220
895 | # 13.3643 90.1338 -41.1983 255 248 220
896 | # -58.7266 14.5974 79.6122 255 248 220
897 | # -32.583 86.3678 38.4571 255 248 220
898 | # 4.28934 -87.717 47.8261 255 248 220
899 | # -98.0962 19.1741 -3.08155 255 248 220
900 | # 90.0165 38.8002 19.7881 255 248 220
901 | # 61.6385 -70.3233 35.4306 255 248 220
902 | # -11.3931 48.8705 86.4978 255 248 220
903 | # 30.292 -40.0238 -86.4898 255 248 220
904 | # 79.661 -45.3511 39.9674 255 248 220
905 | # -40.2257 54.5514 73.5258 255 248 220
906 | # 80.3498 -59.5283 0.533886 255 248 220
907 | # -64.0398 -35.509 -68.103 255 248 220
908 | # -18.4917 -29.5504 93.7274 255 248 220
909 | # 39.7891 57.5376 71.458 255 248 220
910 | # 45.1767 -65.0806 -61.0212 255 248 220
911 | # -7.36956 30.7065 94.8831 255 248 220
912 | # -24.9437 93.8951 23.6965 255 248 220
913 | # 91.7028 -38.9956 8.36314 255 248 220
914 | # 55.6621 76.2423 32.9978 255 248 220
915 | # -34.4624 62.0483 70.444 255 248 220
916 | # -54.847 -74.0279 -38.8802 255 248 220
917 | # 88.6807 39.1352 24.58 255 248 220
918 | # -55.3216 -27.7957 78.5297 255 248 220
919 | # -54.3679 -68.0901 -49.07 255 248 220
920 | # -27.518 82.5541 49.2704 255 248 220
921 | # 7.92419 -94.4389 31.9138 255 248 220
922 | # 66.3553 49.694 55.9239 255 248 220
923 | # -56.7222 -27.4748 77.6385 255 248 220
924 | # -69.2369 14.7682 -70.6268 255 248 220
925 | # -63.6465 41.2225 65.1907 255 248 220
926 | # -58.3426 28.0473 -76.22 255 248 220
927 | # 10.0264 98.8646 11.1922 255 248 220
928 | # 12.4407 -66.9487 73.2332 255 248 220
929 | # 67.6465 -64.9188 34.7779 255 248 220
930 | # 69.1259 -13.2369 71.0379 255 248 220
931 | # -65.0568 5.9659 75.7102 255 248 220
932 | # -83.5862 -49.9045 22.8665 255 248 220
933 | # 50.3335 -31.7026 80.3834 255 248 220
934 | # 87.3484 -12.6688 -47.0081 255 248 220
935 | # 68.6318 64.1257 34.3159 255 248 220
936 | # 56.5951 -7.6986 82.0837 255 248 220
937 | # 79.3176 -1.13659 60.8886 255 248 220
938 | # 39.9982 21.8839 -89.0013 255 248 220
939 | # -34.8095 90.5269 -24.3555 255 248 220
940 | # -25.7861 -93.5469 24.1672 255 248 220
941 | # -25.527 -87.0834 -42.0101 255 248 220
942 | # -30.8749 -90.8682 28.1017 255 248 220
943 | # 30.4481 -46.3418 83.2187 255 248 220
944 | # -41.7189 -89.3712 16.5022 255 248 220
945 | # -50.0588 -84.4072 19.2234 255 248 220
946 | # -15.7733 57.7531 -80.0986 255 248 220
947 | # -52.2123 -61.1105 59.4927 255 248 220
948 | # 15.8834 94.1999 -29.5652 255 248 220
949 | # -48.7873 -66.5592 -56.4771 255 248 220
950 | # 72.7992 -52.4679 -44.1293 255 248 220
951 | # 52.0297 -57.5583 63.0869 255 248 220
952 | # 96.2834 -15.058 -22.4222 255 248 220
953 | # -68.4045 -10.9521 -72.1171 255 248 220
954 | # 0.371745 0 99.9993 255 248 220
955 | # 50.3365 -82.1063 26.9218 255 248 220
956 | # -65.0001 -33.9853 67.9705 255 248 220
957 | # 44.9907 4.63139 -89.1874 255 248 220
958 | # -0.572643 97.063 -24.051 255 248 220
959 | # 16.5214 -7.18986 98.3634 255 248 220
960 | # 59.3666 -73.9696 -31.6876 255 248 220
961 | # 52.8179 67.2228 -51.8784 255 248 220
962 | # 68.3315 62.6372 37.5153 255 248 220
963 | # -43.4123 -82.0263 -37.2432 255 248 220
964 | # 71.3026 -67.5333 18.8465 255 248 220
965 | # 57.1318 -73.8646 35.7767 255 248 220
966 | # 25.128 90.8474 33.3966 255 248 220
967 | # 86.9185 -13.724 -47.5061 255 248 220
968 | # -64.8265 -68.7345 32.7581 255 248 220
969 | # 36.8338 -88.9053 -27.1868 255 248 220
970 | # 33.8543 50.6989 79.2686 255 248 220
971 | # -89.3143 -44.3653 7.39421 255 248 220
972 | # 2.62581 96.7508 25.1471 255 248 220
973 | # 75.7428 -45.0081 -47.3002 255 248 220
974 | # -65.6567 12.443 -74.3933 255 248 220
975 | # 46.1124 -83.6259 29.6707 255 248 220
976 | # -29.1414 -69.3365 -65.9032 255 248 220
977 | # -52.881 -56.6013 -63.2447 255 248 220
978 | # 66.8412 15.4745 72.7516 255 248 220
979 | # 64.4409 -76.1672 6.77759 255 248 220
980 | # -61.4743 -66.3171 42.696 255 248 220
981 | # 51.7956 53.9344 -66.3951 255 248 220
982 | # 72.2388 -39.9377 56.4494 255 248 220
983 | # 29.2399 47.921 -82.7563 255 248 220
984 | # -42.7314 -40.1621 -81.0003 255 248 220
985 | # -63.5561 61.8654 -46.1877 255 248 220
986 | # 82.8401 -20.8029 -52.0072 255 248 220
987 | # -9.39615 -17.3087 98.0414 255 248 220
988 | # -76.6114 63.9745 -6.16051 255 248 220
989 | # -18.0331 -69.8206 -69.2812 255 248 220
990 | # -9.18577 67.1968 -73.4861 255 248 220
991 | # 12.894 -58.1752 -80.3081 255 248 220
992 | # -14.5999 -57.7243 -80.3414 255 248 220
993 | # 32.5208 -17.7908 92.8756 255 248 220
994 | # 64.3751 24.1988 72.5965 255 248 220
995 | # -99.9696 -2.45461 -0.223146 255 248 220
996 | # -58.7883 -76.2266 -27.0822 255 248 220
997 | # -59.4125 57.1512 56.603 255 248 220
998 | # -4.23317 78.1372 -62.2628 255 248 220
999 | # -12.7268 67.6228 72.5616 255 248 220
1000 | # -75.9393 -64.9516 -3.81026 255 248 220
1001 |
--------------------------------------------------------------------------------
/SampleResult/FullSphereResult.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xialinbo/DelaunayTriangulation/c66bac5294f74f505a4576304753a0c6d0eaf0e8/SampleResult/FullSphereResult.jpg
--------------------------------------------------------------------------------
/SampleResult/PartialSphereResult.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xialinbo/DelaunayTriangulation/c66bac5294f74f505a4576304753a0c6d0eaf0e8/SampleResult/PartialSphereResult.jpg
--------------------------------------------------------------------------------
/SampleResult/TriangleSearching.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xialinbo/DelaunayTriangulation/c66bac5294f74f505a4576304753a0c6d0eaf0e8/SampleResult/TriangleSearching.jpg
--------------------------------------------------------------------------------
/SampleResult/TriangleSearchingInLargeScale.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xialinbo/DelaunayTriangulation/c66bac5294f74f505a4576304753a0c6d0eaf0e8/SampleResult/TriangleSearchingInLargeScale.jpg
--------------------------------------------------------------------------------
/Source/DelaunayTriangulation.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include "../Header/Triangulation.h"
6 |
7 | using namespace std;
8 | using namespace dt;
9 |
10 | DelaunayTriangulation::DelaunayTriangulation()
11 | {
12 | for (int i = 0; i < INIT_VERTICES_COUNT; i++)
13 | {
14 | _AuxiliaryDots[i] = new Vector3D(
15 | (i % 2 == 0 ? 1 : -1) * (i / 2 == 0 ? VECTOR_LENGTH : 0),
16 | (i % 2 == 0 ? 1 : -1) * (i / 2 == 1 ? VECTOR_LENGTH : 0),
17 | (i % 2 == 0 ? 1 : -1) * (i / 2 == 2 ? VECTOR_LENGTH : 0),
18 | true, 0, 0, 0
19 | );
20 | }
21 |
22 | _ProjectedDots = new vector();
23 | _Mesh = new vector();
24 |
25 | for (int i = 0; i < sizeof(_Statistics) / sizeof(long); i++)
26 | {
27 | _Statistics[i] = 0;
28 | }
29 | }
30 |
31 | DelaunayTriangulation::~DelaunayTriangulation()
32 | {
33 | for (int i = 0; i < INIT_VERTICES_COUNT; i++)
34 | {
35 | delete _AuxiliaryDots[i];
36 | }
37 |
38 | vector::iterator itDots;
39 | for (itDots = _ProjectedDots->begin(); itDots != _ProjectedDots->end(); itDots++)
40 | {
41 | delete *itDots;
42 | }
43 |
44 | vector::iterator itMesh;
45 | for (itMesh = _Mesh->begin(); itMesh != _Mesh->end(); itMesh++)
46 | {
47 | delete *itMesh;
48 | }
49 |
50 | delete _ProjectedDots;
51 | delete _Mesh;
52 | }
53 |
54 | vector*> DelaunayTriangulation::GetTriangulationResult(vector &dots)
55 | {
56 | _Statistics[2] = clock();
57 |
58 | _ProjectedDots->reserve(dots.size());
59 |
60 | // N random dots can form 8+(N-6)*2 triangles based on the algorithm
61 | _Mesh->reserve(8 + (dots.size() - 6) * 2);
62 |
63 | // project dots to an unit shpere for triangulation
64 | vector::iterator itDots;
65 | for (itDots = dots.begin(); itDots != dots.end(); itDots++)
66 | {
67 | Vector3D* projectedDot = new Vector3D((*itDots), VECTOR_LENGTH);
68 | _ProjectedDots->push_back(projectedDot);
69 | }
70 |
71 | // prepare initial convex hull with 6 vertices and 8 triangle faces
72 | BuildInitialHull(_ProjectedDots);
73 |
74 | for (itDots = _ProjectedDots->begin(); itDots != _ProjectedDots->end(); itDots++)
75 | {
76 | Vector3D* dot = *itDots;
77 | if (!dot->IsVisited)
78 | {
79 | InsertDot(dot);
80 | }
81 | }
82 |
83 | // remove trianges connected with auxiliary dots
84 | RemoveExtraTriangles();
85 |
86 | // generate output
87 | vector*> mesh = vector*>();
88 | vector::iterator itMesh;
89 | for (itMesh = _Mesh->begin(); itMesh != _Mesh->end(); itMesh++)
90 | {
91 | Triangle* triangle = *itMesh;
92 | mesh.push_back(new tuple(
93 | triangle->Vertex[0]->Id,
94 | triangle->Vertex[1]->Id,
95 | triangle->Vertex[2]->Id
96 | ));
97 | }
98 |
99 | _Statistics[3] = clock();
100 |
101 | return mesh;
102 | }
103 |
104 | void DelaunayTriangulation::BuildInitialHull(vector* dots)
105 | {
106 | Vector3D* initialVertices[INIT_VERTICES_COUNT];
107 | Triangle* initialHullFaces[INIT_FACES_COUNT];
108 |
109 | for (int i = 0; i < INIT_VERTICES_COUNT; i++)
110 | {
111 | initialVertices[i] = _AuxiliaryDots[i];
112 | }
113 |
114 | // if close enough, use input dots to replace auxiliary dots so won't be removed in the end
115 | double minDistance[INIT_VERTICES_COUNT] = { 0, 0, 0, 0, 0, 0 };
116 | vector::iterator it;
117 | for (it = dots->begin(); it != dots->end(); it++)
118 | {
119 | double distance[INIT_VERTICES_COUNT];
120 | for (int i = 0; i < INIT_VERTICES_COUNT; i++)
121 | {
122 | distance[i] = GetDistance(_AuxiliaryDots[i], *it);
123 | if (minDistance[i] == 0 || distance[i] < minDistance[i])
124 | {
125 | minDistance[i] = distance[i];
126 | }
127 | }
128 |
129 | for (int i = 0; i < INIT_VERTICES_COUNT; i++)
130 | {
131 | if (minDistance[i] == distance[i] && IsMinimumValueInArray(distance, INIT_VERTICES_COUNT, i))
132 | {
133 | initialVertices[i] = *it;
134 | }
135 | }
136 | }
137 |
138 | int vertex0Index[] = { 0, 0, 0, 0, 1, 1, 1, 1 };
139 | int vertex1Index[] = { 4, 3, 5, 2, 2, 4, 3, 5 };
140 | int vertex2Index[] = { 2, 4, 3, 5, 4, 3, 5, 2 };
141 |
142 | for (int i = 0; i < INIT_FACES_COUNT; i++)
143 | {
144 | Vector3D* v0 = initialVertices[vertex0Index[i]];
145 | Vector3D* v1 = initialVertices[vertex1Index[i]];
146 | Vector3D* v2 = initialVertices[vertex2Index[i]];
147 |
148 | Triangle* triangle = new Triangle(v0, v1, v2);
149 | initialHullFaces[i] = triangle;
150 |
151 | _Mesh->push_back(triangle);
152 | }
153 |
154 | int neighbor0Index[] = { 1, 2, 3, 0, 7, 4, 5, 6 };
155 | int neighbor1Index[] = { 4, 5, 6, 7, 0, 1, 2, 3 };
156 | int neighbor2Index[] = { 3, 0, 1, 2, 5, 6, 7, 4 };
157 |
158 | for (int i = 0; i < INIT_FACES_COUNT; i++)
159 | {
160 | Triangle* n0 = initialHullFaces[neighbor0Index[i]];
161 | Triangle* n1 = initialHullFaces[neighbor1Index[i]];
162 | Triangle* n2 = initialHullFaces[neighbor2Index[i]];
163 | initialHullFaces[i]->AssignNeighbors(n0, n1, n2);
164 | }
165 |
166 | // dot already in the mesh, avoid being visited by InsertDot() again
167 | for (int i = 0; i < INIT_VERTICES_COUNT; i++)
168 | {
169 | initialVertices[i]->IsVisited = true;
170 | }
171 | }
172 |
173 | void DelaunayTriangulation::InsertDot(Vector3D* dot)
174 | {
175 | double det[] = { 0, 0, 0 };
176 |
177 | vector::iterator it;
178 | it = _Mesh->begin();
179 | Triangle* triangle = *it;
180 |
181 | while (it != _Mesh->end())
182 | {
183 | _Statistics[0]++;
184 |
185 | det[0] = GetDeterminant(triangle->Vertex[0], triangle->Vertex[1], dot);
186 | det[1] = GetDeterminant(triangle->Vertex[1], triangle->Vertex[2], dot);
187 | det[2] = GetDeterminant(triangle->Vertex[2], triangle->Vertex[0], dot);
188 |
189 | // if this dot projected into an existing triangle, split the existing triangle to 3 new ones
190 | if (det[0] >= 0 && det[1] >= 0 && det[2] >= 0)
191 | {
192 | if (!triangle->HasVertexCoincidentWith(dot))
193 | {
194 | SplitTriangle(triangle, dot);
195 | }
196 |
197 | return;
198 | }
199 |
200 | // on one side, search neighbors
201 | else if (det[1] >= 0 && det[2] >= 0)
202 | triangle = triangle->Neighbor[0];
203 | else if (det[0] >= 0 && det[2] >= 0)
204 | triangle = triangle->Neighbor[1];
205 | else if (det[0] >= 0 && det[1] >= 0)
206 | triangle = triangle->Neighbor[2];
207 |
208 | // cannot determine effectively
209 | else if (det[0] >= 0)
210 | triangle = triangle->Neighbor[1];
211 | else if (det[1] >= 0)
212 | triangle = triangle->Neighbor[2];
213 | else if (det[2] >= 0)
214 | triangle = triangle->Neighbor[0];
215 | else
216 | triangle = *it++;
217 | }
218 | }
219 |
220 | void DelaunayTriangulation::RemoveExtraTriangles()
221 | {
222 | vector::iterator it;
223 | for (it = _Mesh->begin(); it != _Mesh->end();)
224 | {
225 | Triangle* triangle = *it;
226 | bool isExtraTriangle = false;
227 | for (int i = 0; i < 3; i++)
228 | {
229 | if (triangle->Vertex[i]->IsAuxiliaryDot)
230 | {
231 | isExtraTriangle = true;
232 | break;
233 | }
234 | }
235 |
236 | if (isExtraTriangle)
237 | {
238 | delete *it;
239 | it = _Mesh->erase(it);
240 | }
241 | else
242 | {
243 | it++;
244 | }
245 | }
246 | }
247 |
248 | void DelaunayTriangulation::SplitTriangle(Triangle* triangle, Vector3D* dot)
249 | {
250 | Triangle* newTriangle1 = new Triangle(dot, triangle->Vertex[1], triangle->Vertex[2]);
251 | Triangle* newTriangle2 = new Triangle(dot, triangle->Vertex[2], triangle->Vertex[0]);
252 |
253 | triangle->Vertex[2] = triangle->Vertex[1];
254 | triangle->Vertex[1] = triangle->Vertex[0];
255 | triangle->Vertex[0] = dot;
256 |
257 | newTriangle1->AssignNeighbors(triangle, triangle->Neighbor[1], newTriangle2);
258 | newTriangle2->AssignNeighbors(newTriangle1, triangle->Neighbor[2], triangle);
259 | triangle->AssignNeighbors(newTriangle2, triangle->Neighbor[0], newTriangle1);
260 |
261 | FixNeighborhood(newTriangle1->Neighbor[1], triangle, newTriangle1);
262 | FixNeighborhood(newTriangle2->Neighbor[1], triangle, newTriangle2);
263 |
264 | _Mesh->push_back(newTriangle1);
265 | _Mesh->push_back(newTriangle2);
266 |
267 | // optimize triangles according to delaunay triangulation definition
268 | DoLocalOptimization(triangle, triangle->Neighbor[1]);
269 | DoLocalOptimization(newTriangle1, newTriangle1->Neighbor[1]);
270 | DoLocalOptimization(newTriangle2, newTriangle2->Neighbor[1]);
271 | }
272 |
273 | void DelaunayTriangulation::FixNeighborhood(Triangle* target, Triangle* oldNeighbor, Triangle* newNeighbor)
274 | {
275 | for (int i = 0; i < 3; i++)
276 | {
277 | if (target->Neighbor[i] == oldNeighbor)
278 | {
279 | target->Neighbor[i] = newNeighbor;
280 | break;
281 | }
282 | }
283 | }
284 |
285 | void DelaunayTriangulation::DoLocalOptimization(Triangle* t0, Triangle* t1)
286 | {
287 | _Statistics[1]++;
288 |
289 | for (int i = 0; i < 3; i++)
290 | {
291 | if (t1->Vertex[i] == t0->Vertex[0] ||
292 | t1->Vertex[i] == t0->Vertex[1] ||
293 | t1->Vertex[i] == t0->Vertex[2])
294 | {
295 | continue;
296 | }
297 |
298 | double matrix[] = {
299 | t1->Vertex[i]->X - t0->Vertex[0]->X,
300 | t1->Vertex[i]->Y - t0->Vertex[0]->Y,
301 | t1->Vertex[i]->Z - t0->Vertex[0]->Z,
302 |
303 | t1->Vertex[i]->X - t0->Vertex[1]->X,
304 | t1->Vertex[i]->Y - t0->Vertex[1]->Y,
305 | t1->Vertex[i]->Z - t0->Vertex[1]->Z,
306 |
307 | t1->Vertex[i]->X - t0->Vertex[2]->X,
308 | t1->Vertex[i]->Y - t0->Vertex[2]->Y,
309 | t1->Vertex[i]->Z - t0->Vertex[2]->Z
310 | };
311 |
312 | if (GetDeterminant(matrix) <= 0)
313 | {
314 | // terminate after optimized
315 | break;
316 | }
317 |
318 | if (TrySwapDiagonal(t0, t1))
319 | {
320 | return;
321 | }
322 | }
323 | }
324 |
325 | bool DelaunayTriangulation::TrySwapDiagonal(Triangle* t0, Triangle* t1)
326 | {
327 | for (int j = 0; j < 3; j++)
328 | {
329 | for (int k = 0; k < 3; k++)
330 | {
331 | if (t0->Vertex[j] != t1->Vertex[0] &&
332 | t0->Vertex[j] != t1->Vertex[1] &&
333 | t0->Vertex[j] != t1->Vertex[2] &&
334 | t1->Vertex[k] != t0->Vertex[0] &&
335 | t1->Vertex[k] != t0->Vertex[1] &&
336 | t1->Vertex[k] != t0->Vertex[2])
337 | {
338 | t0->Vertex[(j + 2) % 3] = t1->Vertex[k];
339 | t1->Vertex[(k + 2) % 3] = t0->Vertex[j];
340 |
341 | t0->Neighbor[(j + 1) % 3] = t1->Neighbor[(k + 2) % 3];
342 | t1->Neighbor[(k + 1) % 3] = t0->Neighbor[(j + 2) % 3];
343 | t0->Neighbor[(j + 2) % 3] = t1;
344 | t1->Neighbor[(k + 2) % 3] = t0;
345 |
346 | FixNeighborhood(t0->Neighbor[(j + 1) % 3], t1, t0);
347 | FixNeighborhood(t1->Neighbor[(k + 1) % 3], t0, t1);
348 |
349 | DoLocalOptimization(t0, t0->Neighbor[j]);
350 | DoLocalOptimization(t0, t0->Neighbor[(j + 1) % 3]);
351 | DoLocalOptimization(t1, t1->Neighbor[k]);
352 | DoLocalOptimization(t1, t1->Neighbor[(k + 1) % 3]);
353 |
354 | return true;
355 | }
356 | }
357 | }
358 |
359 | return false;
360 | }
361 |
362 | bool DelaunayTriangulation::IsMinimumValueInArray(double arr[], int length, int index)
363 | {
364 | for (int i = 0; i < length; i++)
365 | {
366 | if (arr[i] < arr[index])
367 | {
368 | return false;
369 | }
370 | }
371 |
372 | return true;
373 | }
374 |
375 | double DelaunayTriangulation::GetDistance(Vector3D* v0, Vector3D* v1)
376 | {
377 | return sqrt(pow((v0->X - v1->X), 2) +
378 | pow((v0->Y - v1->Y), 2) +
379 | pow((v0->Z - v1->Z), 2));
380 | }
381 |
382 | double DelaunayTriangulation::GetDeterminant(Vector3D* v0, Vector3D* v1, Vector3D* v2)
383 | {
384 | double matrix[] = {
385 | v0->X, v0->Y, v0->Z,
386 | v1->X, v1->Y, v1->Z,
387 | v2->X, v2->Y, v2->Z
388 | };
389 |
390 | return GetDeterminant(matrix);
391 | }
392 |
393 | double DelaunayTriangulation::GetDeterminant(double matrix[])
394 | {
395 | // inversed for left handed coordinate system
396 | double determinant = matrix[2] * matrix[4] * matrix[6]
397 | + matrix[0] * matrix[5] * matrix[7]
398 | + matrix[1] * matrix[3] * matrix[8]
399 | - matrix[0] * matrix[4] * matrix[8]
400 | - matrix[1] * matrix[5] * matrix[6]
401 | - matrix[2] * matrix[3] * matrix[7];
402 |
403 | // adjust result based on float number accuracy, otherwise causing deadloop
404 | return abs(determinant) <= DBL_EPSILON ? 0 : determinant;
405 | }
406 |
407 | string DelaunayTriangulation::GetStatistics()
408 | {
409 | // display thousands separator
410 | regex regex("\\d{1,3}(?=(\\d{3})+$)");
411 |
412 | return "\nTriangle count: "
413 | + regex_replace(to_string(_Mesh->size()), regex, "$&,")
414 | + "\nTriangle search operations: "
415 | + regex_replace(to_string(_Statistics[0]), regex, "$&,")
416 | + "\nLocal optimizations: "
417 | + regex_replace(to_string(_Statistics[1]), regex, "$&,")
418 | + "\nTriangulation cost: "
419 | + to_string(_Statistics[3] - _Statistics[2])
420 | + "ms\n";
421 | }
--------------------------------------------------------------------------------
/Source/DotCloudGenerator.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include "../Header/DotCloud.h"
6 |
7 | #define PI 3.14159265
8 | #define RADIUS 100
9 |
10 | using namespace std;
11 | using namespace dt;
12 |
13 | vector DotCloudGenerator::GetSphericalDots()
14 | {
15 | int dotCount;
16 | cout << "Dot Count: ";
17 | cin >> dotCount;
18 |
19 | ofstream file("Resource\\random_out.txt");
20 | vector dots = vector();
21 | dots.reserve(dotCount);
22 |
23 | srand((unsigned)time(NULL));
24 | for (int i = 0; i < dotCount; i++)
25 | {
26 | Vector3D* dot = GetRandomDotEvenlyDistributed();
27 | file << "# " << dot->X << " " << dot->Y << " " << dot->Z << " "
28 | << dot->R << " " << dot->G << " " << dot->B << " " << endl;
29 | dots.push_back(dot);
30 | }
31 |
32 | file.close();
33 |
34 | return dots;
35 | }
36 |
37 | Vector3D* DotCloudGenerator::GetRandomDot()
38 | {
39 | // use spherical coordinate
40 | double phi = (rand() % 360) * PI / 180;
41 | double theta = (rand() % 360) * PI / 180;
42 |
43 | double x = RADIUS * sin(theta) * cos(phi);
44 | double y = RADIUS * sin(theta) * sin(phi);
45 | double z = RADIUS * cos(theta);
46 |
47 | return new Vector3D(x, y, z);
48 | }
49 |
50 | Vector3D* DotCloudGenerator::GetRandomDotEvenlyDistributed()
51 | {
52 | // project random dot in cartesian coordinate to unit sphere
53 | double x = rand() % 2000 - 1000;
54 | double y = rand() % 2000 - 1000;
55 | double z = rand() % 2000 - 1000;
56 |
57 | double r = sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));
58 | x = RADIUS * x / r;
59 | y = RADIUS * y / r;
60 | z = RADIUS * z / r;
61 |
62 | return new Vector3D(x, y, z);
63 | }
--------------------------------------------------------------------------------
/Source/DotCloudReader.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include "../Header/DotCloud.h"
6 |
7 | using namespace std;
8 | using namespace dt;
9 |
10 | vector DotCloudReader::GetDotCloud()
11 | {
12 | vector dots = vector();
13 |
14 | string filename;
15 | cout << "Enter name of file in resource directory: ";
16 | cin >> filename;
17 | filename = "Resource\\" + filename;
18 | ifstream file(filename);
19 |
20 | double x = 0, y = 0, z = 0;
21 | int red = 0, green = 0, blue = 0;
22 | char hex;
23 |
24 | //each row start with a "#"
25 | while (file >> hex)
26 | {
27 | file >> x >> y >> z >> red >> green >> blue;
28 | Vector3D* dot = new Vector3D(x, y, z, (uint8_t)red, (uint8_t)green, (uint8_t)blue);
29 | dots.push_back(dot);
30 | }
31 |
32 | file.close();
33 |
34 | return dots;
35 | }
36 |
--------------------------------------------------------------------------------
/Source/Triangle.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include "../Header/DataStructure.h"
3 |
4 | using namespace std;
5 | using namespace dt;
6 |
7 | Triangle::Triangle(Vector3D* v0, Vector3D* v1, Vector3D* v2)
8 | {
9 | Id = GenerateRunningId();
10 | Vertex[0] = v0;
11 | Vertex[1] = v1;
12 | Vertex[2] = v2;
13 | }
14 |
15 | Triangle::~Triangle()
16 | {
17 | }
18 |
19 | int Triangle::GenerateRunningId()
20 | {
21 | static int id = 0;
22 | return id++;
23 | }
24 |
25 | bool Triangle::HasVertexCoincidentWith(Vector3D* dot)
26 | {
27 | return Vertex[0]->IsCoincidentWith(dot)
28 | || Vertex[1]->IsCoincidentWith(dot)
29 | || Vertex[2]->IsCoincidentWith(dot);
30 | }
31 |
32 | void Triangle::AssignNeighbors(Triangle* n0, Triangle* n1, Triangle* n2)
33 | {
34 | Neighbor[0] = n0;
35 | Neighbor[1] = n1;
36 | Neighbor[2] = n2;
37 | }
38 |
39 | string Triangle::ToString()
40 | {
41 | return "Triangle ID: " + to_string(Id) + ";\n"
42 | + "Vertex[0]: " + Vertex[0]->ToString()
43 | + "Vertex[1]: " + Vertex[1]->ToString()
44 | + "Vertex[2]: " + Vertex[2]->ToString()
45 | + "Neighbor[0] ID: " + to_string(Neighbor[0]->Id) + ", "
46 | + "Neighbor[1] ID: " + to_string(Neighbor[1]->Id) + ", "
47 | + "Neighbor[2] ID: " + to_string(Neighbor[2]->Id) + ";\n";
48 | }
--------------------------------------------------------------------------------
/Source/Vector3D.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include "../Header/DataStructure.h"
4 |
5 | using namespace std;
6 | using namespace dt;
7 |
8 | Vector3D::Vector3D(double x, double y, double z, uint8_t r, uint8_t g, uint8_t b)
9 | {
10 | Id = GenerateRunningId();
11 |
12 | X = x;
13 | Y = y;
14 | Z = z;
15 |
16 | R = r;
17 | G = g;
18 | B = b;
19 | }
20 |
21 | Vector3D::Vector3D(double x, double y, double z, bool isAuxiliaryDot, uint8_t r, uint8_t g, uint8_t b)
22 | {
23 | Id = GenerateRunningId();
24 |
25 | IsAuxiliaryDot = isAuxiliaryDot;
26 |
27 | X = x;
28 | Y = y;
29 | Z = z;
30 |
31 | R = r;
32 | G = g;
33 | B = b;
34 | }
35 |
36 | Vector3D::Vector3D(Vector3D* dot, double lengthAfterProjection)
37 | {
38 | Id = dot->Id;
39 | IsVisited = dot->IsVisited;
40 | IsAuxiliaryDot = dot->IsAuxiliaryDot;
41 |
42 | double length = sqrt(pow(dot->X, 2) + pow(dot->Y, 2) + pow(dot->Z, 2));
43 | double scaleFactor = lengthAfterProjection / length;
44 |
45 | X = scaleFactor * dot->X;
46 | Y = scaleFactor * dot->Y;
47 | Z = scaleFactor * dot->Z;
48 |
49 | R = dot->R;
50 | G = dot->G;
51 | B = dot->B;
52 | }
53 |
54 | Vector3D::~Vector3D()
55 | {
56 | }
57 |
58 | int Vector3D::GenerateRunningId()
59 | {
60 | static int id = 0;
61 | return id++;
62 | }
63 |
64 | bool Vector3D::IsCoincidentWith(Vector3D* dot)
65 | {
66 | return (X == dot->X && Y == dot->Y && Z == dot->Z);
67 | }
68 |
69 | string Vector3D::ToString()
70 | {
71 | return "Dot ID: " + to_string(Id) + "; "
72 | + to_string(X) + ", " + to_string(Y) + ", " + to_string(Z) + "; "
73 | + to_string(R) + ", " + to_string(G) + ", " + to_string(B) + "; "
74 | + "IsVisited: " + (IsVisited ? "true" : "false") + "; "
75 | + "IsAuxiliaryDot: " + (IsAuxiliaryDot ? "true" : "false") + ";\n";
76 | }
--------------------------------------------------------------------------------
/Source/Visualization.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include
11 | #include
12 | #include
13 | #include
14 | #include "../Header/Visualization.h"
15 |
16 | using namespace std;
17 | using namespace dt;
18 |
19 | Visualization::Visualization(bool isShowWireframe)
20 | {
21 | IsShowWireframe = isShowWireframe;
22 | }
23 |
24 | Visualization::~Visualization()
25 | {
26 | }
27 |
28 | void Visualization::ReconstructIn3D(vector &dots, vector*> &mesh)
29 | {
30 | vtkPoints* points = vtkPoints::New();
31 | vtkUnsignedCharArray* colors = vtkUnsignedCharArray::New();
32 | vtkCellArray* cells = vtkCellArray::New();
33 |
34 | colors->SetNumberOfComponents(3);
35 | colors->SetName("Colors");
36 |
37 | vector::iterator itDots;
38 | for (itDots = dots.begin(); itDots != dots.end(); itDots++)
39 | {
40 | Vector3D* dot = *itDots;
41 | points->InsertNextPoint(dot->X, dot->Y, dot->Z);
42 | colors->InsertNextTuple3(dot->R, dot->G, dot->B);
43 | }
44 |
45 | vtkTriangle* vtkTriangle;
46 | vector*>::iterator itMesh;
47 | for (itMesh = mesh.begin(); itMesh != mesh.end(); itMesh++)
48 | {
49 | vtkTriangle = vtkTriangle::New();
50 | vtkTriangle->GetPointIds()->SetId(0, get<0>(**itMesh));
51 | vtkTriangle->GetPointIds()->SetId(1, get<1>(**itMesh));
52 | vtkTriangle->GetPointIds()->SetId(2, get<2>(**itMesh));
53 |
54 | cells->InsertNextCell(vtkTriangle);
55 | }
56 |
57 | vtkRenderer* renderer = vtkRenderer::New();
58 | vtkRenderWindow* renderWindow = vtkRenderWindow::New();
59 | renderWindow->AddRenderer(renderer);
60 |
61 | vtkRenderWindowInteractor* renderWindowInteractor =
62 | vtkRenderWindowInteractor::New();
63 | renderWindowInteractor->SetRenderWindow(renderWindow);
64 |
65 | vtkInteractorStyleTrackballCamera* style =
66 | vtkInteractorStyleTrackballCamera::New();
67 | renderWindowInteractor->SetInteractorStyle(style);
68 |
69 | vtkPolyData* trianglePolyData = vtkPolyData::New();
70 |
71 | trianglePolyData->SetPoints(points);
72 | trianglePolyData->SetPolys(cells);
73 | trianglePolyData->GetPointData()->SetScalars(colors);
74 |
75 | vtkPolyDataMapper* mapper = vtkPolyDataMapper::New();
76 | mapper->SetInputData(trianglePolyData);
77 |
78 | vtkActor* actor = vtkActor::New();
79 | actor->SetMapper(mapper);
80 | if (IsShowWireframe)
81 | {
82 | actor->GetProperty()->SetRepresentationToWireframe();
83 | }
84 |
85 | renderer->AddActor(actor);
86 |
87 | renderer->SetBackground(0.1, 0.2, 0.4);
88 | renderWindow->SetSize(1280, 960);
89 |
90 | renderWindow->Render();
91 | renderWindowInteractor->Start();
92 |
93 | points->Delete();
94 | colors->Delete();
95 | cells->Delete();
96 | renderer->Delete();
97 | renderWindow->Delete();
98 | renderWindowInteractor->Delete();
99 | style->Delete();
100 | trianglePolyData->Delete();
101 | mapper->Delete();
102 | actor->Delete();
103 | }
--------------------------------------------------------------------------------
/license.mit:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 John Smith
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------