h3 3.6.2 → 3.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +23 -0
- data/Gemfile.lock +6 -6
- data/README.md +1 -1
- data/ext/h3/src/.github/workflows/test-linux.yml +118 -0
- data/ext/h3/src/.github/workflows/test-macos.yml +42 -0
- data/ext/h3/src/.github/workflows/test-website.yml +32 -0
- data/ext/h3/src/.github/workflows/test-windows.yml +44 -0
- data/ext/h3/src/.gitignore +5 -0
- data/ext/h3/src/.travis.yml +16 -46
- data/ext/h3/src/CHANGELOG.md +43 -0
- data/ext/h3/src/CMakeLists.txt +133 -33
- data/ext/h3/src/CONTRIBUTING.md +1 -1
- data/ext/h3/src/README.md +60 -10
- data/ext/h3/src/RELEASE.md +3 -1
- data/ext/h3/src/VERSION +1 -1
- data/ext/h3/src/dev-docs/RFCs/rfc-template.md +21 -0
- data/ext/h3/src/dev-docs/RFCs/v4.0.0/error-handling-rfc.md +21 -0
- data/ext/h3/src/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md +276 -0
- data/ext/h3/src/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md +141 -0
- data/ext/h3/src/dev-docs/RFCs/v4.0.0/polyfill-modes-rfc.md +21 -0
- data/ext/h3/src/dev-docs/RFCs/v4.0.0/vertex-mode-rfc.md +50 -0
- data/ext/h3/src/dev-docs/build_windows.md +6 -1
- data/ext/h3/src/dev-docs/creating_bindings.md +3 -3
- data/ext/h3/src/dev-docs/custom_alloc.md +27 -0
- data/ext/h3/src/docs/{overview/mainpage.md → README.md} +2 -3
- data/ext/h3/src/docs/api/misc.md +76 -0
- data/ext/h3/src/docs/community/applications.md +1 -0
- data/ext/h3/src/docs/community/bindings.md +7 -1
- data/ext/h3/src/docs/community/tutorials.md +8 -3
- data/ext/h3/src/docs/core-library/coordsystems.md +5 -4
- data/ext/h3/src/docs/core-library/filters.md +8 -9
- data/ext/h3/src/docs/core-library/geoToH3desc.md +2 -3
- data/ext/h3/src/docs/core-library/h3ToGeoBoundaryDesc.md +4 -5
- data/ext/h3/src/docs/core-library/h3ToGeoDesc.md +3 -4
- data/ext/h3/src/docs/core-library/h3indexing.md +26 -17
- data/ext/h3/src/docs/core-library/overview.md +2 -3
- data/ext/h3/src/docs/core-library/restable.md +1 -2
- data/ext/h3/src/docs/core-library/usage.md +1 -2
- data/ext/h3/src/docs/table-of-contents.json +47 -0
- data/ext/h3/src/docs/{overview/usecases.md → usecases.md} +6 -11
- data/ext/h3/src/scripts/binding_functions.sh +1 -1
- data/ext/h3/src/scripts/coverage.sh.in +1 -1
- data/ext/h3/src/scripts/update_version.sh +2 -2
- data/ext/h3/src/src/apps/applib/include/args.h +1 -0
- data/ext/h3/src/src/apps/applib/include/test.h +1 -0
- data/ext/h3/src/src/apps/applib/include/utility.h +7 -1
- data/ext/h3/src/src/apps/applib/lib/args.c +2 -0
- data/ext/h3/src/src/apps/applib/lib/kml.c +2 -0
- data/ext/h3/src/src/apps/applib/lib/test.c +1 -0
- data/ext/h3/src/src/apps/applib/lib/utility.c +133 -2
- data/ext/h3/src/src/apps/benchmarks/benchmarkH3Api.c +1 -1
- data/ext/h3/src/{website/html.config.js → src/apps/benchmarks/benchmarkH3UniEdge.c} +15 -12
- data/ext/h3/src/src/apps/filters/h3ToComponents.c +1 -0
- data/ext/h3/src/src/apps/filters/h3ToGeo.c +1 -0
- data/ext/h3/src/src/apps/filters/h3ToGeoBoundary.c +1 -0
- data/ext/h3/src/src/apps/filters/h3ToLocalIj.c +1 -0
- data/ext/h3/src/src/apps/filters/hexRange.c +1 -0
- data/ext/h3/src/src/apps/filters/kRing.c +1 -0
- data/ext/h3/src/src/apps/filters/localIjToH3.c +1 -0
- data/ext/h3/src/src/apps/miscapps/generateFaceCenterPoint.c +1 -0
- data/ext/h3/src/src/apps/miscapps/generateNumHexagons.c +1 -0
- data/ext/h3/src/src/apps/miscapps/generatePentagonDirectionFaces.c +67 -0
- data/ext/h3/src/src/apps/miscapps/h3ToGeoBoundaryHier.c +1 -0
- data/ext/h3/src/src/apps/miscapps/h3ToGeoHier.c +1 -0
- data/ext/h3/src/src/apps/miscapps/h3ToHier.c +1 -0
- data/ext/h3/src/src/apps/testapps/mkRandGeo.c +1 -0
- data/ext/h3/src/src/apps/testapps/mkRandGeoBoundary.c +1 -0
- data/ext/h3/src/src/apps/testapps/testBBox.c +1 -0
- data/ext/h3/src/src/apps/testapps/testBaseCells.c +15 -1
- data/ext/h3/src/src/apps/testapps/testCompact.c +75 -0
- data/ext/h3/src/src/apps/testapps/testCoordIj.c +1 -0
- data/ext/h3/src/src/apps/testapps/testGeoCoord.c +40 -13
- data/ext/h3/src/src/apps/testapps/testGeoToH3.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3Api.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3CellArea.c +47 -0
- data/ext/h3/src/src/apps/testapps/testH3CellAreaExhaustive.c +180 -0
- data/ext/h3/src/src/apps/testapps/testH3Distance.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3DistanceExhaustive.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3GetFaces.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3Index.c +33 -3
- data/ext/h3/src/src/apps/testapps/testH3Line.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3LineExhaustive.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3Memory.c +175 -0
- data/ext/h3/src/src/apps/testapps/testH3NeighborRotations.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3SetToLinkedGeo.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3SetToVertexGraph.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3ToCenterChild.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3ToChildren.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3ToGeo.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3ToGeoBoundary.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3ToLocalIj.c +9 -5
- data/ext/h3/src/src/apps/testapps/testH3ToLocalIjExhaustive.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3ToParent.c +1 -0
- data/ext/h3/src/src/apps/testapps/testH3UniEdge.c +45 -16
- data/ext/h3/src/src/apps/testapps/testH3UniEdgeExhaustive.c +111 -0
- data/ext/h3/src/src/apps/testapps/testHexRanges.c +1 -0
- data/ext/h3/src/src/apps/testapps/testHexRing.c +1 -0
- data/ext/h3/src/src/apps/testapps/testKRing.c +1 -0
- data/ext/h3/src/src/apps/testapps/testLinkedGeo.c +1 -0
- data/ext/h3/src/src/apps/testapps/testMaxH3ToChildrenSize.c +1 -0
- data/ext/h3/src/src/apps/testapps/testPentagonIndexes.c +1 -0
- data/ext/h3/src/src/apps/testapps/testPolyfill.c +72 -9
- data/ext/h3/src/src/apps/testapps/testPolyfillReported.c +157 -0
- data/ext/h3/src/src/apps/testapps/testPolygon.c +1 -0
- data/ext/h3/src/src/apps/testapps/testVec2d.c +1 -0
- data/ext/h3/src/src/apps/testapps/testVec3d.c +1 -0
- data/ext/h3/src/src/apps/testapps/testVertex.c +66 -0
- data/ext/h3/src/src/apps/testapps/testVertexGraph.c +1 -0
- data/ext/h3/src/src/h3lib/include/algos.h +8 -0
- data/ext/h3/src/src/h3lib/include/alloc.h +40 -0
- data/ext/h3/src/src/h3lib/include/baseCells.h +4 -0
- data/ext/h3/src/src/h3lib/include/bbox.h +4 -1
- data/ext/h3/src/src/h3lib/include/faceijk.h +3 -2
- data/ext/h3/src/src/h3lib/include/geoCoord.h +2 -3
- data/ext/h3/src/src/h3lib/include/h3Index.h +37 -4
- data/ext/h3/src/src/h3lib/include/h3api.h.in +65 -17
- data/ext/h3/src/src/h3lib/include/linkedGeo.h +1 -0
- data/ext/h3/src/src/h3lib/include/polygon.h +1 -0
- data/ext/h3/src/src/h3lib/include/polygonAlgos.h +1 -0
- data/ext/h3/src/src/h3lib/include/vertex.h +44 -0
- data/ext/h3/src/src/h3lib/include/vertexGraph.h +1 -0
- data/ext/h3/src/src/h3lib/lib/algos.c +300 -75
- data/ext/h3/src/src/h3lib/lib/baseCells.c +26 -4
- data/ext/h3/src/src/h3lib/lib/bbox.c +56 -31
- data/ext/h3/src/src/h3lib/lib/coordijk.c +2 -0
- data/ext/h3/src/src/h3lib/lib/faceijk.c +32 -21
- data/ext/h3/src/src/h3lib/lib/geoCoord.c +162 -44
- data/ext/h3/src/src/h3lib/lib/h3Index.c +81 -43
- data/ext/h3/src/src/h3lib/lib/h3UniEdge.c +42 -57
- data/ext/h3/src/src/h3lib/lib/linkedGeo.c +20 -15
- data/ext/h3/src/src/h3lib/lib/localij.c +1 -1
- data/ext/h3/src/src/h3lib/lib/polygon.c +2 -0
- data/ext/h3/src/src/h3lib/lib/vec2d.c +1 -0
- data/ext/h3/src/src/h3lib/lib/vec3d.c +1 -0
- data/ext/h3/src/src/h3lib/lib/vertex.c +134 -0
- data/ext/h3/src/src/h3lib/lib/vertexGraph.c +8 -5
- data/ext/h3/src/website/.eslintignore +2 -0
- data/ext/h3/src/website/.gitignore +57 -0
- data/ext/h3/src/website/.nvmrc +1 -0
- data/ext/h3/src/website/README.md +8 -6
- data/ext/h3/src/website/gatsby-config.js +83 -0
- data/ext/h3/src/website/package.json +20 -12
- data/ext/h3/src/website/scripts/build-to-gh-pages.sh +7 -5
- data/ext/h3/src/website/src/.gitkeep +0 -0
- data/ext/h3/src/website/templates/documentation.jsx +129 -0
- data/ext/h3/src/website/yarn.lock +13723 -0
- data/lib/h3/bindings/private.rb +3 -0
- data/lib/h3/miscellaneous.rb +123 -0
- data/lib/h3/version.rb +1 -1
- data/spec/miscellaneous_spec.rb +117 -0
- data/spec/regions_spec.rb +1 -1
- metadata +35 -14
- data/ext/h3/src/.ycm_extra_conf.py +0 -92
- data/ext/h3/src/appveyor.yml +0 -50
- data/ext/h3/src/src/apps/testapps/testPolyfill_GH136.c +0 -58
- data/ext/h3/src/website/src/config.js +0 -46
- data/ext/h3/src/website/src/mdRoutes.js +0 -151
- data/ext/h3/src/website/src/styles/_variables.scss +0 -16
- data/ext/h3/src/website/src/styles/index.scss +0 -3
- data/ext/h3/src/website/static/index.html +0 -15
|
@@ -18,8 +18,11 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
#include "linkedGeo.h"
|
|
21
|
+
|
|
21
22
|
#include <assert.h>
|
|
22
23
|
#include <stdlib.h>
|
|
24
|
+
|
|
25
|
+
#include "alloc.h"
|
|
23
26
|
#include "geoCoord.h"
|
|
24
27
|
#include "h3api.h"
|
|
25
28
|
|
|
@@ -30,7 +33,7 @@
|
|
|
30
33
|
*/
|
|
31
34
|
LinkedGeoPolygon* addNewLinkedPolygon(LinkedGeoPolygon* polygon) {
|
|
32
35
|
assert(polygon->next == NULL);
|
|
33
|
-
LinkedGeoPolygon* next = calloc(1, sizeof(*next));
|
|
36
|
+
LinkedGeoPolygon* next = H3_MEMORY(calloc)(1, sizeof(*next));
|
|
34
37
|
assert(next != NULL);
|
|
35
38
|
polygon->next = next;
|
|
36
39
|
return next;
|
|
@@ -42,7 +45,7 @@ LinkedGeoPolygon* addNewLinkedPolygon(LinkedGeoPolygon* polygon) {
|
|
|
42
45
|
* @return Pointer to loop
|
|
43
46
|
*/
|
|
44
47
|
LinkedGeoLoop* addNewLinkedLoop(LinkedGeoPolygon* polygon) {
|
|
45
|
-
LinkedGeoLoop* loop = calloc(1, sizeof(*loop));
|
|
48
|
+
LinkedGeoLoop* loop = H3_MEMORY(calloc)(1, sizeof(*loop));
|
|
46
49
|
assert(loop != NULL);
|
|
47
50
|
return addLinkedLoop(polygon, loop);
|
|
48
51
|
}
|
|
@@ -71,7 +74,7 @@ LinkedGeoLoop* addLinkedLoop(LinkedGeoPolygon* polygon, LinkedGeoLoop* loop) {
|
|
|
71
74
|
* @return Pointer to the coordinate
|
|
72
75
|
*/
|
|
73
76
|
LinkedGeoCoord* addLinkedCoord(LinkedGeoLoop* loop, const GeoCoord* vertex) {
|
|
74
|
-
LinkedGeoCoord* coord = malloc(sizeof(*coord));
|
|
77
|
+
LinkedGeoCoord* coord = H3_MEMORY(malloc)(sizeof(*coord));
|
|
75
78
|
assert(coord != NULL);
|
|
76
79
|
*coord = (LinkedGeoCoord){.vertex = *vertex, .next = NULL};
|
|
77
80
|
LinkedGeoCoord* last = loop->last;
|
|
@@ -95,7 +98,7 @@ void destroyLinkedGeoLoop(LinkedGeoLoop* loop) {
|
|
|
95
98
|
for (LinkedGeoCoord* currentCoord = loop->first; currentCoord != NULL;
|
|
96
99
|
currentCoord = nextCoord) {
|
|
97
100
|
nextCoord = currentCoord->next;
|
|
98
|
-
free(currentCoord);
|
|
101
|
+
H3_MEMORY(free)(currentCoord);
|
|
99
102
|
}
|
|
100
103
|
}
|
|
101
104
|
|
|
@@ -115,14 +118,14 @@ void H3_EXPORT(destroyLinkedPolygon)(LinkedGeoPolygon* polygon) {
|
|
|
115
118
|
currentLoop != NULL; currentLoop = nextLoop) {
|
|
116
119
|
destroyLinkedGeoLoop(currentLoop);
|
|
117
120
|
nextLoop = currentLoop->next;
|
|
118
|
-
free(currentLoop);
|
|
121
|
+
H3_MEMORY(free)(currentLoop);
|
|
119
122
|
}
|
|
120
123
|
nextPolygon = currentPolygon->next;
|
|
121
124
|
if (skip) {
|
|
122
125
|
// do not free the input polygon
|
|
123
126
|
skip = false;
|
|
124
127
|
} else {
|
|
125
|
-
free(currentPolygon);
|
|
128
|
+
H3_MEMORY(free)(currentPolygon);
|
|
126
129
|
}
|
|
127
130
|
}
|
|
128
131
|
}
|
|
@@ -242,9 +245,10 @@ static const LinkedGeoPolygon* findPolygonForHole(
|
|
|
242
245
|
}
|
|
243
246
|
// Initialize arrays for candidate loops and their bounding boxes
|
|
244
247
|
const LinkedGeoPolygon** candidates =
|
|
245
|
-
malloc(polygonCount * sizeof(LinkedGeoPolygon*));
|
|
248
|
+
H3_MEMORY(malloc)(polygonCount * sizeof(LinkedGeoPolygon*));
|
|
246
249
|
assert(candidates != NULL);
|
|
247
|
-
const BBox** candidateBBoxes =
|
|
250
|
+
const BBox** candidateBBoxes =
|
|
251
|
+
H3_MEMORY(malloc)(polygonCount * sizeof(BBox*));
|
|
248
252
|
assert(candidateBBoxes != NULL);
|
|
249
253
|
|
|
250
254
|
// Find all polygons that contain the loop
|
|
@@ -267,8 +271,8 @@ static const LinkedGeoPolygon* findPolygonForHole(
|
|
|
267
271
|
findDeepestContainer(candidates, candidateBBoxes, candidateCount);
|
|
268
272
|
|
|
269
273
|
// Free allocated memory
|
|
270
|
-
free(candidates);
|
|
271
|
-
free(candidateBBoxes);
|
|
274
|
+
H3_MEMORY(free)(candidates);
|
|
275
|
+
H3_MEMORY(free)(candidateBBoxes);
|
|
272
276
|
|
|
273
277
|
return parent;
|
|
274
278
|
}
|
|
@@ -308,11 +312,12 @@ int normalizeMultiPolygon(LinkedGeoPolygon* root) {
|
|
|
308
312
|
// Create an array to hold all of the inner loops. Note that
|
|
309
313
|
// this array will never be full, as there will always be fewer
|
|
310
314
|
// inner loops than outer loops.
|
|
311
|
-
LinkedGeoLoop** innerLoops =
|
|
315
|
+
LinkedGeoLoop** innerLoops =
|
|
316
|
+
H3_MEMORY(malloc)(loopCount * sizeof(LinkedGeoLoop*));
|
|
312
317
|
assert(innerLoops != NULL);
|
|
313
318
|
|
|
314
319
|
// Create an array to hold the bounding boxes for the outer loops
|
|
315
|
-
BBox* bboxes = malloc(loopCount * sizeof(BBox));
|
|
320
|
+
BBox* bboxes = H3_MEMORY(malloc)(loopCount * sizeof(BBox));
|
|
316
321
|
assert(bboxes != NULL);
|
|
317
322
|
|
|
318
323
|
// Get the first loop and unlink it from root
|
|
@@ -349,14 +354,14 @@ int normalizeMultiPolygon(LinkedGeoPolygon* root) {
|
|
|
349
354
|
// been unlinked from the root and the caller will no longer have
|
|
350
355
|
// a way to destroy it with destroyLinkedPolygon.
|
|
351
356
|
destroyLinkedGeoLoop(innerLoops[i]);
|
|
352
|
-
free(innerLoops[i]);
|
|
357
|
+
H3_MEMORY(free)(innerLoops[i]);
|
|
353
358
|
resultCode = NORMALIZATION_ERR_UNASSIGNED_HOLES;
|
|
354
359
|
}
|
|
355
360
|
}
|
|
356
361
|
|
|
357
362
|
// Free allocated memory
|
|
358
|
-
free(innerLoops);
|
|
359
|
-
free(bboxes);
|
|
363
|
+
H3_MEMORY(free)(innerLoops);
|
|
364
|
+
H3_MEMORY(free)(bboxes);
|
|
360
365
|
|
|
361
366
|
return resultCode;
|
|
362
367
|
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2020 Uber Technologies, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/** @file vertex.h
|
|
17
|
+
* @brief Functions for working with cell vertexes.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
#include "vertex.h"
|
|
21
|
+
|
|
22
|
+
#include "baseCells.h"
|
|
23
|
+
#include "faceijk.h"
|
|
24
|
+
#include "geoCoord.h"
|
|
25
|
+
#include "h3Index.h"
|
|
26
|
+
|
|
27
|
+
#define DIRECTION_INDEX_OFFSET 2
|
|
28
|
+
|
|
29
|
+
/** @brief Table of direction-to-face mapping for each pentagon
|
|
30
|
+
*
|
|
31
|
+
* Note that faces are in directional order, starting at J_AXES_DIGIT.
|
|
32
|
+
* This table is generated by the generatePentagonDirectionFaces script.
|
|
33
|
+
*/
|
|
34
|
+
static const PentagonDirectionFaces pentagonDirectionFaces[NUM_PENTAGONS] = {
|
|
35
|
+
{4, {4, 0, 2, 1, 3}}, {14, {6, 11, 2, 7, 1}},
|
|
36
|
+
{24, {5, 10, 1, 6, 0}}, {38, {7, 12, 3, 8, 2}},
|
|
37
|
+
{49, {9, 14, 0, 5, 4}}, {58, {8, 13, 4, 9, 3}},
|
|
38
|
+
{63, {11, 6, 15, 10, 16}}, {72, {12, 7, 16, 11, 17}},
|
|
39
|
+
{83, {10, 5, 19, 14, 15}}, {97, {13, 8, 17, 12, 18}},
|
|
40
|
+
{107, {14, 9, 18, 13, 19}}, {117, {15, 19, 17, 18, 16}},
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get the number of CCW rotations of the cell's vertex numbers
|
|
45
|
+
* compared to the directional layout of its neighbors.
|
|
46
|
+
* @return Number of CCW rotations for the cell
|
|
47
|
+
*/
|
|
48
|
+
int vertexRotations(H3Index cell) {
|
|
49
|
+
// Get the face and other info for the origin
|
|
50
|
+
FaceIJK fijk;
|
|
51
|
+
_h3ToFaceIjk(cell, &fijk);
|
|
52
|
+
int baseCell = H3_EXPORT(h3GetBaseCell)(cell);
|
|
53
|
+
int cellLeadingDigit = _h3LeadingNonZeroDigit(cell);
|
|
54
|
+
|
|
55
|
+
// get the base cell face
|
|
56
|
+
FaceIJK baseFijk;
|
|
57
|
+
_baseCellToFaceIjk(baseCell, &baseFijk);
|
|
58
|
+
|
|
59
|
+
int ccwRot60 = _baseCellToCCWrot60(baseCell, fijk.face);
|
|
60
|
+
|
|
61
|
+
if (_isBaseCellPentagon(baseCell)) {
|
|
62
|
+
// Find the appropriate direction-to-face mapping
|
|
63
|
+
PentagonDirectionFaces dirFaces;
|
|
64
|
+
for (int p = 0; p < NUM_PENTAGONS; p++) {
|
|
65
|
+
if (pentagonDirectionFaces[p].baseCell == baseCell) {
|
|
66
|
+
dirFaces = pentagonDirectionFaces[p];
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// additional CCW rotation for polar neighbors or IK neighbors
|
|
72
|
+
if (fijk.face != baseFijk.face &&
|
|
73
|
+
(_isBaseCellPolarPentagon(baseCell) ||
|
|
74
|
+
fijk.face ==
|
|
75
|
+
dirFaces.faces[IK_AXES_DIGIT - DIRECTION_INDEX_OFFSET])) {
|
|
76
|
+
ccwRot60 = (ccwRot60 + 1) % 6;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Check whether the cell crosses a deleted pentagon subsequence
|
|
80
|
+
if (cellLeadingDigit == JK_AXES_DIGIT &&
|
|
81
|
+
fijk.face ==
|
|
82
|
+
dirFaces.faces[IK_AXES_DIGIT - DIRECTION_INDEX_OFFSET]) {
|
|
83
|
+
// Crosses from JK to IK: Rotate CW
|
|
84
|
+
ccwRot60 = (ccwRot60 + 5) % 6;
|
|
85
|
+
} else if (cellLeadingDigit == IK_AXES_DIGIT &&
|
|
86
|
+
fijk.face ==
|
|
87
|
+
dirFaces.faces[JK_AXES_DIGIT - DIRECTION_INDEX_OFFSET]) {
|
|
88
|
+
// Crosses from IK to JK: Rotate CCW
|
|
89
|
+
ccwRot60 = (ccwRot60 + 1) % 6;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return ccwRot60;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** @brief Hexagon direction to vertex number relationships (same face).
|
|
96
|
+
* Note that we don't use direction 0 (center).
|
|
97
|
+
*/
|
|
98
|
+
static const int directionToVertexNumHex[NUM_DIGITS] = {
|
|
99
|
+
INVALID_DIGIT, 3, 1, 2, 5, 4, 0};
|
|
100
|
+
|
|
101
|
+
/** @brief Pentagon direction to vertex number relationships (same face).
|
|
102
|
+
* Note that we don't use directions 0 (center) or 1 (deleted K axis).
|
|
103
|
+
*/
|
|
104
|
+
static const int directionToVertexNumPent[NUM_DIGITS] = {
|
|
105
|
+
INVALID_DIGIT, INVALID_DIGIT, 1, 2, 4, 3, 0};
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Get the first vertex number for a given direction. The neighbor in this
|
|
109
|
+
* direction is located between this vertex number and the next number in
|
|
110
|
+
* sequence.
|
|
111
|
+
* @returns The number for the first topological vertex, or INVALID_VERTEX_NUM
|
|
112
|
+
* if the direction is not valid for this cell
|
|
113
|
+
*/
|
|
114
|
+
int vertexNumForDirection(const H3Index origin, const Direction direction) {
|
|
115
|
+
int isPentagon = H3_EXPORT(h3IsPentagon)(origin);
|
|
116
|
+
// Check for invalid directions
|
|
117
|
+
if (direction == CENTER_DIGIT || direction >= INVALID_DIGIT ||
|
|
118
|
+
(isPentagon && direction == K_AXES_DIGIT))
|
|
119
|
+
return INVALID_VERTEX_NUM;
|
|
120
|
+
|
|
121
|
+
// Determine the vertex rotations for this cell
|
|
122
|
+
int rotations = vertexRotations(origin);
|
|
123
|
+
|
|
124
|
+
// Find the appropriate vertex, rotating CCW if necessary
|
|
125
|
+
if (isPentagon) {
|
|
126
|
+
return (directionToVertexNumPent[direction] + NUM_PENT_VERTS -
|
|
127
|
+
rotations) %
|
|
128
|
+
NUM_PENT_VERTS;
|
|
129
|
+
} else {
|
|
130
|
+
return (directionToVertexNumHex[direction] + NUM_HEX_VERTS -
|
|
131
|
+
rotations) %
|
|
132
|
+
NUM_HEX_VERTS;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -18,11 +18,14 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
#include "vertexGraph.h"
|
|
21
|
+
|
|
21
22
|
#include <assert.h>
|
|
22
23
|
#include <math.h>
|
|
23
24
|
#include <stdint.h>
|
|
24
25
|
#include <stdio.h>
|
|
25
26
|
#include <stdlib.h>
|
|
27
|
+
|
|
28
|
+
#include "alloc.h"
|
|
26
29
|
#include "geoCoord.h"
|
|
27
30
|
|
|
28
31
|
/**
|
|
@@ -33,7 +36,7 @@
|
|
|
33
36
|
*/
|
|
34
37
|
void initVertexGraph(VertexGraph* graph, int numBuckets, int res) {
|
|
35
38
|
if (numBuckets > 0) {
|
|
36
|
-
graph->buckets = calloc(numBuckets, sizeof(VertexNode*));
|
|
39
|
+
graph->buckets = H3_MEMORY(calloc)(numBuckets, sizeof(VertexNode*));
|
|
37
40
|
assert(graph->buckets != NULL);
|
|
38
41
|
} else {
|
|
39
42
|
graph->buckets = NULL;
|
|
@@ -53,7 +56,7 @@ void destroyVertexGraph(VertexGraph* graph) {
|
|
|
53
56
|
while ((node = firstVertexNode(graph)) != NULL) {
|
|
54
57
|
removeVertexNode(graph, node);
|
|
55
58
|
}
|
|
56
|
-
free(graph->buckets);
|
|
59
|
+
H3_MEMORY(free)(graph->buckets);
|
|
57
60
|
}
|
|
58
61
|
|
|
59
62
|
/**
|
|
@@ -91,7 +94,7 @@ void _initVertexNode(VertexNode* node, const GeoCoord* fromVtx,
|
|
|
91
94
|
VertexNode* addVertexNode(VertexGraph* graph, const GeoCoord* fromVtx,
|
|
92
95
|
const GeoCoord* toVtx) {
|
|
93
96
|
// Make the new node
|
|
94
|
-
VertexNode* node = malloc(sizeof(VertexNode));
|
|
97
|
+
VertexNode* node = H3_MEMORY(malloc)(sizeof(VertexNode));
|
|
95
98
|
assert(node != NULL);
|
|
96
99
|
_initVertexNode(node, fromVtx, toVtx);
|
|
97
100
|
// Determine location
|
|
@@ -108,7 +111,7 @@ VertexNode* addVertexNode(VertexGraph* graph, const GeoCoord* fromVtx,
|
|
|
108
111
|
if (geoAlmostEqual(¤tNode->from, fromVtx) &&
|
|
109
112
|
geoAlmostEqual(¤tNode->to, toVtx)) {
|
|
110
113
|
// already exists, bail
|
|
111
|
-
free(node);
|
|
114
|
+
H3_MEMORY(free)(node);
|
|
112
115
|
return currentNode;
|
|
113
116
|
}
|
|
114
117
|
if (currentNode->next != NULL) {
|
|
@@ -150,7 +153,7 @@ int removeVertexNode(VertexGraph* graph, VertexNode* node) {
|
|
|
150
153
|
}
|
|
151
154
|
}
|
|
152
155
|
if (found) {
|
|
153
|
-
free(node);
|
|
156
|
+
H3_MEMORY(free)(node);
|
|
154
157
|
graph->size--;
|
|
155
158
|
return 0;
|
|
156
159
|
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
### Node ###
|
|
2
|
+
# Logs
|
|
3
|
+
logs
|
|
4
|
+
*.log
|
|
5
|
+
npm-debug.log*
|
|
6
|
+
|
|
7
|
+
# Runtime data
|
|
8
|
+
pids
|
|
9
|
+
*.pid
|
|
10
|
+
*.seed
|
|
11
|
+
*.pid.lock
|
|
12
|
+
|
|
13
|
+
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
14
|
+
lib-cov
|
|
15
|
+
|
|
16
|
+
# Coverage directory used by tools like istanbul
|
|
17
|
+
coverage
|
|
18
|
+
|
|
19
|
+
# nyc test coverage
|
|
20
|
+
.nyc_output
|
|
21
|
+
|
|
22
|
+
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
|
23
|
+
.grunt
|
|
24
|
+
|
|
25
|
+
# node-waf configuration
|
|
26
|
+
.lock-wscript
|
|
27
|
+
|
|
28
|
+
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
|
29
|
+
build/Release
|
|
30
|
+
|
|
31
|
+
# Dependency directories
|
|
32
|
+
node_modules
|
|
33
|
+
jspm_packages
|
|
34
|
+
|
|
35
|
+
# Optional npm cache directory
|
|
36
|
+
.npm
|
|
37
|
+
|
|
38
|
+
# Optional eslint cache
|
|
39
|
+
.eslintcache
|
|
40
|
+
|
|
41
|
+
# Optional REPL history
|
|
42
|
+
.node_repl_history
|
|
43
|
+
|
|
44
|
+
# Output of 'npm pack'
|
|
45
|
+
*.tgz
|
|
46
|
+
|
|
47
|
+
# Yarn Integrity file
|
|
48
|
+
.yarn-integrity
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# Gatsby context
|
|
52
|
+
.gatsby-context.js
|
|
53
|
+
|
|
54
|
+
# Bundle stats
|
|
55
|
+
bundle-stats.json
|
|
56
|
+
|
|
57
|
+
package-lock.json
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
v10.17.0
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
# H3 Documentation Website
|
|
2
2
|
|
|
3
|
-
This is the source for the [H3 documentation website](https://
|
|
3
|
+
This is the source for the [H3 documentation website](https://h3geo.org/).
|
|
4
4
|
|
|
5
5
|
The source of the pages in the documentation is in the [docs](../docs) directory.
|
|
6
6
|
|
|
7
7
|
## Building Locally
|
|
8
8
|
|
|
9
|
-
Building the documentation requires Node.js. To build and view the H3 documentation,
|
|
9
|
+
Building the documentation requires Node.js. To build and view the H3 documentation,
|
|
10
10
|
run the following from `./website`:
|
|
11
11
|
|
|
12
12
|
```
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
npm start
|
|
13
|
+
yarn
|
|
14
|
+
yarn run build
|
|
16
15
|
```
|
|
17
16
|
|
|
17
|
+
You will then be able to open `public/index.html` in your browser. Note that images
|
|
18
|
+
will not render because they expect a `/h3/` path prefix.
|
|
19
|
+
|
|
18
20
|
## Updating the H3 Website
|
|
19
21
|
|
|
20
22
|
Make sure your `gh-pages` branch has its remote set to the upstream repo, then
|
|
21
23
|
|
|
22
24
|
```
|
|
23
25
|
make publish-website
|
|
24
|
-
```
|
|
26
|
+
```
|