├── .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 | ![Full Sphere](https://github.com/xialinbo/DelaunayTriangulation/blob/master/SampleResult/FullSphereResult.jpg "Full Sphere") 13 | ![Partial Sphere](https://github.com/xialinbo/DelaunayTriangulation/blob/master/SampleResult/PartialSphereResult.jpg "Partial Sphere") 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 | --------------------------------------------------------------------------------