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.
Files changed (161) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +23 -0
  3. data/Gemfile.lock +6 -6
  4. data/README.md +1 -1
  5. data/ext/h3/src/.github/workflows/test-linux.yml +118 -0
  6. data/ext/h3/src/.github/workflows/test-macos.yml +42 -0
  7. data/ext/h3/src/.github/workflows/test-website.yml +32 -0
  8. data/ext/h3/src/.github/workflows/test-windows.yml +44 -0
  9. data/ext/h3/src/.gitignore +5 -0
  10. data/ext/h3/src/.travis.yml +16 -46
  11. data/ext/h3/src/CHANGELOG.md +43 -0
  12. data/ext/h3/src/CMakeLists.txt +133 -33
  13. data/ext/h3/src/CONTRIBUTING.md +1 -1
  14. data/ext/h3/src/README.md +60 -10
  15. data/ext/h3/src/RELEASE.md +3 -1
  16. data/ext/h3/src/VERSION +1 -1
  17. data/ext/h3/src/dev-docs/RFCs/rfc-template.md +21 -0
  18. data/ext/h3/src/dev-docs/RFCs/v4.0.0/error-handling-rfc.md +21 -0
  19. data/ext/h3/src/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md +276 -0
  20. data/ext/h3/src/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md +141 -0
  21. data/ext/h3/src/dev-docs/RFCs/v4.0.0/polyfill-modes-rfc.md +21 -0
  22. data/ext/h3/src/dev-docs/RFCs/v4.0.0/vertex-mode-rfc.md +50 -0
  23. data/ext/h3/src/dev-docs/build_windows.md +6 -1
  24. data/ext/h3/src/dev-docs/creating_bindings.md +3 -3
  25. data/ext/h3/src/dev-docs/custom_alloc.md +27 -0
  26. data/ext/h3/src/docs/{overview/mainpage.md → README.md} +2 -3
  27. data/ext/h3/src/docs/api/misc.md +76 -0
  28. data/ext/h3/src/docs/community/applications.md +1 -0
  29. data/ext/h3/src/docs/community/bindings.md +7 -1
  30. data/ext/h3/src/docs/community/tutorials.md +8 -3
  31. data/ext/h3/src/docs/core-library/coordsystems.md +5 -4
  32. data/ext/h3/src/docs/core-library/filters.md +8 -9
  33. data/ext/h3/src/docs/core-library/geoToH3desc.md +2 -3
  34. data/ext/h3/src/docs/core-library/h3ToGeoBoundaryDesc.md +4 -5
  35. data/ext/h3/src/docs/core-library/h3ToGeoDesc.md +3 -4
  36. data/ext/h3/src/docs/core-library/h3indexing.md +26 -17
  37. data/ext/h3/src/docs/core-library/overview.md +2 -3
  38. data/ext/h3/src/docs/core-library/restable.md +1 -2
  39. data/ext/h3/src/docs/core-library/usage.md +1 -2
  40. data/ext/h3/src/docs/table-of-contents.json +47 -0
  41. data/ext/h3/src/docs/{overview/usecases.md → usecases.md} +6 -11
  42. data/ext/h3/src/scripts/binding_functions.sh +1 -1
  43. data/ext/h3/src/scripts/coverage.sh.in +1 -1
  44. data/ext/h3/src/scripts/update_version.sh +2 -2
  45. data/ext/h3/src/src/apps/applib/include/args.h +1 -0
  46. data/ext/h3/src/src/apps/applib/include/test.h +1 -0
  47. data/ext/h3/src/src/apps/applib/include/utility.h +7 -1
  48. data/ext/h3/src/src/apps/applib/lib/args.c +2 -0
  49. data/ext/h3/src/src/apps/applib/lib/kml.c +2 -0
  50. data/ext/h3/src/src/apps/applib/lib/test.c +1 -0
  51. data/ext/h3/src/src/apps/applib/lib/utility.c +133 -2
  52. data/ext/h3/src/src/apps/benchmarks/benchmarkH3Api.c +1 -1
  53. data/ext/h3/src/{website/html.config.js → src/apps/benchmarks/benchmarkH3UniEdge.c} +15 -12
  54. data/ext/h3/src/src/apps/filters/h3ToComponents.c +1 -0
  55. data/ext/h3/src/src/apps/filters/h3ToGeo.c +1 -0
  56. data/ext/h3/src/src/apps/filters/h3ToGeoBoundary.c +1 -0
  57. data/ext/h3/src/src/apps/filters/h3ToLocalIj.c +1 -0
  58. data/ext/h3/src/src/apps/filters/hexRange.c +1 -0
  59. data/ext/h3/src/src/apps/filters/kRing.c +1 -0
  60. data/ext/h3/src/src/apps/filters/localIjToH3.c +1 -0
  61. data/ext/h3/src/src/apps/miscapps/generateFaceCenterPoint.c +1 -0
  62. data/ext/h3/src/src/apps/miscapps/generateNumHexagons.c +1 -0
  63. data/ext/h3/src/src/apps/miscapps/generatePentagonDirectionFaces.c +67 -0
  64. data/ext/h3/src/src/apps/miscapps/h3ToGeoBoundaryHier.c +1 -0
  65. data/ext/h3/src/src/apps/miscapps/h3ToGeoHier.c +1 -0
  66. data/ext/h3/src/src/apps/miscapps/h3ToHier.c +1 -0
  67. data/ext/h3/src/src/apps/testapps/mkRandGeo.c +1 -0
  68. data/ext/h3/src/src/apps/testapps/mkRandGeoBoundary.c +1 -0
  69. data/ext/h3/src/src/apps/testapps/testBBox.c +1 -0
  70. data/ext/h3/src/src/apps/testapps/testBaseCells.c +15 -1
  71. data/ext/h3/src/src/apps/testapps/testCompact.c +75 -0
  72. data/ext/h3/src/src/apps/testapps/testCoordIj.c +1 -0
  73. data/ext/h3/src/src/apps/testapps/testGeoCoord.c +40 -13
  74. data/ext/h3/src/src/apps/testapps/testGeoToH3.c +1 -0
  75. data/ext/h3/src/src/apps/testapps/testH3Api.c +1 -0
  76. data/ext/h3/src/src/apps/testapps/testH3CellArea.c +47 -0
  77. data/ext/h3/src/src/apps/testapps/testH3CellAreaExhaustive.c +180 -0
  78. data/ext/h3/src/src/apps/testapps/testH3Distance.c +1 -0
  79. data/ext/h3/src/src/apps/testapps/testH3DistanceExhaustive.c +1 -0
  80. data/ext/h3/src/src/apps/testapps/testH3GetFaces.c +1 -0
  81. data/ext/h3/src/src/apps/testapps/testH3Index.c +33 -3
  82. data/ext/h3/src/src/apps/testapps/testH3Line.c +1 -0
  83. data/ext/h3/src/src/apps/testapps/testH3LineExhaustive.c +1 -0
  84. data/ext/h3/src/src/apps/testapps/testH3Memory.c +175 -0
  85. data/ext/h3/src/src/apps/testapps/testH3NeighborRotations.c +1 -0
  86. data/ext/h3/src/src/apps/testapps/testH3SetToLinkedGeo.c +1 -0
  87. data/ext/h3/src/src/apps/testapps/testH3SetToVertexGraph.c +1 -0
  88. data/ext/h3/src/src/apps/testapps/testH3ToCenterChild.c +1 -0
  89. data/ext/h3/src/src/apps/testapps/testH3ToChildren.c +1 -0
  90. data/ext/h3/src/src/apps/testapps/testH3ToGeo.c +1 -0
  91. data/ext/h3/src/src/apps/testapps/testH3ToGeoBoundary.c +1 -0
  92. data/ext/h3/src/src/apps/testapps/testH3ToLocalIj.c +9 -5
  93. data/ext/h3/src/src/apps/testapps/testH3ToLocalIjExhaustive.c +1 -0
  94. data/ext/h3/src/src/apps/testapps/testH3ToParent.c +1 -0
  95. data/ext/h3/src/src/apps/testapps/testH3UniEdge.c +45 -16
  96. data/ext/h3/src/src/apps/testapps/testH3UniEdgeExhaustive.c +111 -0
  97. data/ext/h3/src/src/apps/testapps/testHexRanges.c +1 -0
  98. data/ext/h3/src/src/apps/testapps/testHexRing.c +1 -0
  99. data/ext/h3/src/src/apps/testapps/testKRing.c +1 -0
  100. data/ext/h3/src/src/apps/testapps/testLinkedGeo.c +1 -0
  101. data/ext/h3/src/src/apps/testapps/testMaxH3ToChildrenSize.c +1 -0
  102. data/ext/h3/src/src/apps/testapps/testPentagonIndexes.c +1 -0
  103. data/ext/h3/src/src/apps/testapps/testPolyfill.c +72 -9
  104. data/ext/h3/src/src/apps/testapps/testPolyfillReported.c +157 -0
  105. data/ext/h3/src/src/apps/testapps/testPolygon.c +1 -0
  106. data/ext/h3/src/src/apps/testapps/testVec2d.c +1 -0
  107. data/ext/h3/src/src/apps/testapps/testVec3d.c +1 -0
  108. data/ext/h3/src/src/apps/testapps/testVertex.c +66 -0
  109. data/ext/h3/src/src/apps/testapps/testVertexGraph.c +1 -0
  110. data/ext/h3/src/src/h3lib/include/algos.h +8 -0
  111. data/ext/h3/src/src/h3lib/include/alloc.h +40 -0
  112. data/ext/h3/src/src/h3lib/include/baseCells.h +4 -0
  113. data/ext/h3/src/src/h3lib/include/bbox.h +4 -1
  114. data/ext/h3/src/src/h3lib/include/faceijk.h +3 -2
  115. data/ext/h3/src/src/h3lib/include/geoCoord.h +2 -3
  116. data/ext/h3/src/src/h3lib/include/h3Index.h +37 -4
  117. data/ext/h3/src/src/h3lib/include/h3api.h.in +65 -17
  118. data/ext/h3/src/src/h3lib/include/linkedGeo.h +1 -0
  119. data/ext/h3/src/src/h3lib/include/polygon.h +1 -0
  120. data/ext/h3/src/src/h3lib/include/polygonAlgos.h +1 -0
  121. data/ext/h3/src/src/h3lib/include/vertex.h +44 -0
  122. data/ext/h3/src/src/h3lib/include/vertexGraph.h +1 -0
  123. data/ext/h3/src/src/h3lib/lib/algos.c +300 -75
  124. data/ext/h3/src/src/h3lib/lib/baseCells.c +26 -4
  125. data/ext/h3/src/src/h3lib/lib/bbox.c +56 -31
  126. data/ext/h3/src/src/h3lib/lib/coordijk.c +2 -0
  127. data/ext/h3/src/src/h3lib/lib/faceijk.c +32 -21
  128. data/ext/h3/src/src/h3lib/lib/geoCoord.c +162 -44
  129. data/ext/h3/src/src/h3lib/lib/h3Index.c +81 -43
  130. data/ext/h3/src/src/h3lib/lib/h3UniEdge.c +42 -57
  131. data/ext/h3/src/src/h3lib/lib/linkedGeo.c +20 -15
  132. data/ext/h3/src/src/h3lib/lib/localij.c +1 -1
  133. data/ext/h3/src/src/h3lib/lib/polygon.c +2 -0
  134. data/ext/h3/src/src/h3lib/lib/vec2d.c +1 -0
  135. data/ext/h3/src/src/h3lib/lib/vec3d.c +1 -0
  136. data/ext/h3/src/src/h3lib/lib/vertex.c +134 -0
  137. data/ext/h3/src/src/h3lib/lib/vertexGraph.c +8 -5
  138. data/ext/h3/src/website/.eslintignore +2 -0
  139. data/ext/h3/src/website/.gitignore +57 -0
  140. data/ext/h3/src/website/.nvmrc +1 -0
  141. data/ext/h3/src/website/README.md +8 -6
  142. data/ext/h3/src/website/gatsby-config.js +83 -0
  143. data/ext/h3/src/website/package.json +20 -12
  144. data/ext/h3/src/website/scripts/build-to-gh-pages.sh +7 -5
  145. data/ext/h3/src/website/src/.gitkeep +0 -0
  146. data/ext/h3/src/website/templates/documentation.jsx +129 -0
  147. data/ext/h3/src/website/yarn.lock +13723 -0
  148. data/lib/h3/bindings/private.rb +3 -0
  149. data/lib/h3/miscellaneous.rb +123 -0
  150. data/lib/h3/version.rb +1 -1
  151. data/spec/miscellaneous_spec.rb +117 -0
  152. data/spec/regions_spec.rb +1 -1
  153. metadata +35 -14
  154. data/ext/h3/src/.ycm_extra_conf.py +0 -92
  155. data/ext/h3/src/appveyor.yml +0 -50
  156. data/ext/h3/src/src/apps/testapps/testPolyfill_GH136.c +0 -58
  157. data/ext/h3/src/website/src/config.js +0 -46
  158. data/ext/h3/src/website/src/mdRoutes.js +0 -151
  159. data/ext/h3/src/website/src/styles/_variables.scss +0 -16
  160. data/ext/h3/src/website/src/styles/index.scss +0 -3
  161. data/ext/h3/src/website/static/index.html +0 -15
@@ -0,0 +1,157 @@
1
+ /*
2
+ * Copyright 2017-2019 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
+
17
+ #include <stdlib.h>
18
+
19
+ #include "algos.h"
20
+ #include "constants.h"
21
+ #include "geoCoord.h"
22
+ #include "h3Index.h"
23
+ #include "test.h"
24
+ #include "utility.h"
25
+
26
+ // Tests for specific polyfill examples
27
+
28
+ SUITE(polyfill_reported) {
29
+ // https://github.com/uber/h3-js/issues/76#issuecomment-561204505
30
+ TEST(entireWorld) {
31
+ // TODO: Fails for a single worldwide polygon
32
+ GeoCoord worldVerts[] = {
33
+ {-M_PI_2, -M_PI}, {M_PI_2, -M_PI}, {M_PI_2, 0}, {-M_PI_2, 0}};
34
+ Geofence worldGeofence = {.numVerts = 4, .verts = worldVerts};
35
+ GeoPolygon worldGeoPolygon = {.geofence = worldGeofence, .numHoles = 0};
36
+ GeoCoord worldVerts2[] = {
37
+ {-M_PI_2, 0}, {M_PI_2, 0}, {M_PI_2, M_PI}, {-M_PI_2, M_PI}};
38
+ Geofence worldGeofence2 = {.numVerts = 4, .verts = worldVerts2};
39
+ GeoPolygon worldGeoPolygon2 = {.geofence = worldGeofence2,
40
+ .numHoles = 0};
41
+
42
+ for (int res = 0; res < 3; res++) {
43
+ int polyfillSize =
44
+ H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon, res);
45
+ H3Index* polyfillOut = calloc(polyfillSize, sizeof(H3Index));
46
+
47
+ H3_EXPORT(polyfill)(&worldGeoPolygon, res, polyfillOut);
48
+ int actualNumHexagons =
49
+ countActualHexagons(polyfillOut, polyfillSize);
50
+
51
+ int polyfillSize2 =
52
+ H3_EXPORT(maxPolyfillSize)(&worldGeoPolygon2, res);
53
+ H3Index* polyfillOut2 = calloc(polyfillSize2, sizeof(H3Index));
54
+
55
+ H3_EXPORT(polyfill)(&worldGeoPolygon2, res, polyfillOut2);
56
+ int actualNumHexagons2 =
57
+ countActualHexagons(polyfillOut2, polyfillSize2);
58
+
59
+ t_assert(actualNumHexagons + actualNumHexagons2 ==
60
+ H3_EXPORT(numHexagons)(res),
61
+ "got expected polyfill size (entire world)");
62
+
63
+ // Sets should be disjoint
64
+ for (int i = 0; i < polyfillSize; i++) {
65
+ if (polyfillOut[i] == 0) continue;
66
+
67
+ bool found = false;
68
+ for (int j = 0; j < polyfillSize2; j++) {
69
+ if (polyfillOut[i] == polyfillOut2[j]) {
70
+ found = true;
71
+ break;
72
+ }
73
+ }
74
+ t_assert(!found,
75
+ "Index found more than once when polyfilling the "
76
+ "entire world");
77
+ }
78
+
79
+ free(polyfillOut);
80
+ free(polyfillOut2);
81
+ }
82
+ }
83
+
84
+ // https://github.com/uber/h3-js/issues/67
85
+ TEST(h3js_67) {
86
+ double east = H3_EXPORT(degsToRads)(-56.25);
87
+ double north = H3_EXPORT(degsToRads)(-33.13755119234615);
88
+ double south = H3_EXPORT(degsToRads)(-34.30714385628804);
89
+ double west = H3_EXPORT(degsToRads)(-57.65625);
90
+
91
+ GeoCoord testVerts[] = {
92
+ {north, east}, {south, east}, {south, west}, {north, west}};
93
+ Geofence testGeofence = {.numVerts = 4, .verts = testVerts};
94
+ GeoPolygon testPolygon;
95
+ testPolygon.geofence = testGeofence;
96
+ testPolygon.numHoles = 0;
97
+
98
+ int res = 7;
99
+ int numHexagons = H3_EXPORT(maxPolyfillSize)(&testPolygon, res);
100
+ H3Index* hexagons = calloc(numHexagons, sizeof(H3Index));
101
+
102
+ H3_EXPORT(polyfill)(&testPolygon, res, hexagons);
103
+ int actualNumHexagons = countActualHexagons(hexagons, numHexagons);
104
+
105
+ t_assert(actualNumHexagons == 4499,
106
+ "got expected polyfill size (h3-js#67)");
107
+ free(hexagons);
108
+ }
109
+
110
+ // 2nd test case from h3-js#67
111
+ TEST(h3js_67_2nd) {
112
+ double east = H3_EXPORT(degsToRads)(-57.65625);
113
+ double north = H3_EXPORT(degsToRads)(-34.30714385628804);
114
+ double south = H3_EXPORT(degsToRads)(-35.4606699514953);
115
+ double west = H3_EXPORT(degsToRads)(-59.0625);
116
+
117
+ GeoCoord testVerts[] = {
118
+ {north, east}, {south, east}, {south, west}, {north, west}};
119
+ Geofence testGeofence = {.numVerts = 4, .verts = testVerts};
120
+ GeoPolygon testPolygon;
121
+ testPolygon.geofence = testGeofence;
122
+ testPolygon.numHoles = 0;
123
+
124
+ int res = 7;
125
+ int numHexagons = H3_EXPORT(maxPolyfillSize)(&testPolygon, res);
126
+ H3Index* hexagons = calloc(numHexagons, sizeof(H3Index));
127
+
128
+ H3_EXPORT(polyfill)(&testPolygon, res, hexagons);
129
+ int actualNumHexagons = countActualHexagons(hexagons, numHexagons);
130
+
131
+ t_assert(actualNumHexagons == 4609,
132
+ "got expected polyfill size (h3-js#67, 2nd case)");
133
+ free(hexagons);
134
+ }
135
+
136
+ // https://github.com/uber/h3/issues/136
137
+ TEST(h3_136) {
138
+ GeoCoord testVerts[] = {{0.10068990369902957, 0.8920772174196191},
139
+ {0.10032914690616246, 0.8915914753447348},
140
+ {0.10033349237998787, 0.8915860128746426},
141
+ {0.10069496685903621, 0.8920742194546231}};
142
+ Geofence testGeofence = {.numVerts = 4, .verts = testVerts};
143
+ GeoPolygon testPolygon;
144
+ testPolygon.geofence = testGeofence;
145
+ testPolygon.numHoles = 0;
146
+
147
+ int res = 13;
148
+ int numHexagons = H3_EXPORT(maxPolyfillSize)(&testPolygon, res);
149
+ H3Index* hexagons = calloc(numHexagons, sizeof(H3Index));
150
+
151
+ H3_EXPORT(polyfill)(&testPolygon, res, hexagons);
152
+ int actualNumHexagons = countActualHexagons(hexagons, numHexagons);
153
+
154
+ t_assert(actualNumHexagons == 4353, "got expected polyfill size");
155
+ free(hexagons);
156
+ }
157
+ }
@@ -16,6 +16,7 @@
16
16
 
17
17
  #include <assert.h>
18
18
  #include <stdlib.h>
19
+
19
20
  #include "bbox.h"
20
21
  #include "constants.h"
21
22
  #include "geoCoord.h"
@@ -17,6 +17,7 @@
17
17
  #include <float.h>
18
18
  #include <math.h>
19
19
  #include <stdlib.h>
20
+
20
21
  #include "test.h"
21
22
  #include "vec2d.h"
22
23
 
@@ -17,6 +17,7 @@
17
17
  #include <float.h>
18
18
  #include <math.h>
19
19
  #include <stdlib.h>
20
+
20
21
  #include "test.h"
21
22
  #include "vec3d.h"
22
23
 
@@ -0,0 +1,66 @@
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
17
+ * @brief tests H3 vertex functions.
18
+ *
19
+ * usage: `testVertex`
20
+ */
21
+
22
+ #include "test.h"
23
+ #include "utility.h"
24
+ #include "vertex.h"
25
+
26
+ SUITE(Vertex) {
27
+ TEST(vertexNumForDirection_hex) {
28
+ H3Index origin = 0x823d6ffffffffff;
29
+ int vertexNums[NUM_HEX_VERTS] = {0};
30
+ for (Direction dir = K_AXES_DIGIT; dir < NUM_DIGITS; dir++) {
31
+ int vertexNum = vertexNumForDirection(origin, dir);
32
+ t_assert(vertexNum >= 0 && vertexNum < NUM_HEX_VERTS,
33
+ "vertex number appears valid");
34
+ t_assert(!vertexNums[vertexNum], "vertex number appears only once");
35
+ vertexNums[vertexNum] = 1;
36
+ }
37
+ }
38
+
39
+ TEST(vertexNumForDirection_pent) {
40
+ H3Index pentagon = 0x823007fffffffff;
41
+ int vertexNums[NUM_PENT_VERTS] = {0};
42
+ for (Direction dir = J_AXES_DIGIT; dir < NUM_DIGITS; dir++) {
43
+ int vertexNum = vertexNumForDirection(pentagon, dir);
44
+ t_assert(vertexNum >= 0 && vertexNum < NUM_PENT_VERTS,
45
+ "vertex number appears valid");
46
+ t_assert(!vertexNums[vertexNum], "vertex number appears only once");
47
+ vertexNums[vertexNum] = 1;
48
+ }
49
+ }
50
+
51
+ TEST(vertexNumForDirection_badDirections) {
52
+ H3Index origin = 0x823007fffffffff;
53
+
54
+ t_assert(
55
+ vertexNumForDirection(origin, CENTER_DIGIT) == INVALID_VERTEX_NUM,
56
+ "center digit should return invalid vertex");
57
+ t_assert(
58
+ vertexNumForDirection(origin, INVALID_DIGIT) == INVALID_VERTEX_NUM,
59
+ "invalid digit should return invalid vertex");
60
+
61
+ H3Index pentagon = 0x823007fffffffff;
62
+ t_assert(
63
+ vertexNumForDirection(pentagon, K_AXES_DIGIT) == INVALID_VERTEX_NUM,
64
+ "K direction on pentagon should return invalid vertex");
65
+ }
66
+ }
@@ -16,6 +16,7 @@
16
16
 
17
17
  #include <assert.h>
18
18
  #include <stdio.h>
19
+
19
20
  #include "geoCoord.h"
20
21
  #include "h3api.h"
21
22
  #include "test.h"
@@ -40,4 +40,12 @@ void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes,
40
40
  // Create a LinkedGeoPolygon from a vertex graph
41
41
  void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out);
42
42
 
43
+ // Internal function for polyfill that traces a geofence with hexagons of a
44
+ // specific size
45
+ int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res,
46
+ int* numSearchHexes, H3Index* search, H3Index* found);
47
+
48
+ // The polyfill algorithm. Separated out because it can theoretically fail
49
+ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out);
50
+
43
51
  #endif
@@ -0,0 +1,40 @@
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 alloc.h
17
+ * @brief Memory management functions
18
+ *
19
+ * This file contains macros and the necessary declarations to be able
20
+ * to point H3 at different memory management functions than the standard
21
+ * malloc/free/etc functions.
22
+ */
23
+
24
+ #ifndef ALLOC_H
25
+ #define ALLOC_H
26
+
27
+ #include "h3api.h" // for TJOIN
28
+
29
+ #ifdef H3_ALLOC_PREFIX
30
+ #define H3_MEMORY(name) TJOIN(H3_ALLOC_PREFIX, name)
31
+
32
+ void* H3_MEMORY(malloc)(size_t size);
33
+ void* H3_MEMORY(calloc)(size_t num, size_t size);
34
+ void* H3_MEMORY(realloc)(void* ptr, size_t size);
35
+ void H3_MEMORY(free)(void* ptr);
36
+ #else
37
+ #define H3_MEMORY(name) name
38
+ #endif
39
+
40
+ #endif
@@ -45,11 +45,15 @@ extern const BaseCellData baseCellData[NUM_BASE_CELLS];
45
45
  /** Maximum input for any component to face-to-base-cell lookup functions */
46
46
  #define MAX_FACE_COORD 2
47
47
 
48
+ /** Invalid number of rotations */
49
+ #define INVALID_ROTATIONS -1
50
+
48
51
  // Internal functions
49
52
  int _isBaseCellPentagon(int baseCell);
50
53
  bool _isBaseCellPolarPentagon(int baseCell);
51
54
  int _faceIjkToBaseCell(const FaceIJK* h);
52
55
  int _faceIjkToBaseCellCCWrot60(const FaceIJK* h);
56
+ int _baseCellToCCWrot60(int baseCell, int face);
53
57
  void _baseCellToFaceIjk(int baseCell, FaceIJK* h);
54
58
  bool _baseCellIsCwOffset(int baseCell, int testFace);
55
59
  int _getBaseCellNeighbor(int baseCell, Direction dir);
@@ -21,6 +21,7 @@
21
21
  #define BBOX_H
22
22
 
23
23
  #include <stdbool.h>
24
+
24
25
  #include "geoCoord.h"
25
26
 
26
27
  /** @struct BBox
@@ -37,6 +38,8 @@ bool bboxIsTransmeridian(const BBox* bbox);
37
38
  void bboxCenter(const BBox* bbox, GeoCoord* center);
38
39
  bool bboxContains(const BBox* bbox, const GeoCoord* point);
39
40
  bool bboxEquals(const BBox* b1, const BBox* b2);
40
- int bboxHexRadius(const BBox* bbox, int res);
41
+ int bboxHexEstimate(const BBox* bbox, int res);
42
+ int lineHexEstimate(const GeoCoord* origin, const GeoCoord* destination,
43
+ int res);
41
44
 
42
45
  #endif
@@ -75,9 +75,10 @@ typedef enum {
75
75
  void _geoToFaceIjk(const GeoCoord* g, int res, FaceIJK* h);
76
76
  void _geoToHex2d(const GeoCoord* g, int res, int* face, Vec2d* v);
77
77
  void _faceIjkToGeo(const FaceIJK* h, int res, GeoCoord* g);
78
- void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon,
78
+ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int start, int length,
79
79
  GeoBoundary* g);
80
- void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g);
80
+ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, int start, int length,
81
+ GeoBoundary* g);
81
82
  void _faceIjkToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts);
82
83
  void _faceIjkPentToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts);
83
84
  void _hex2dToGeo(const Vec2d* v, int face, int res, int substrate, GeoCoord* g);
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2016-2017 Uber Technologies, Inc.
2
+ * Copyright 2016-2020 Uber Technologies, Inc.
3
3
  *
4
4
  * Licensed under the Apache License, Version 2.0 (the "License");
5
5
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
23
23
  #include <stdbool.h>
24
24
  #include <stdint.h>
25
25
  #include <stdio.h>
26
+
26
27
  #include "constants.h"
27
28
  #include "h3api.h"
28
29
 
@@ -43,8 +44,6 @@ bool geoAlmostEqualThreshold(const GeoCoord* p1, const GeoCoord* p2,
43
44
 
44
45
  double _posAngleRads(double rads);
45
46
  void _setGeoRads(GeoCoord* p, double latRads, double lonRads);
46
- double _geoDistRads(const GeoCoord* p1, const GeoCoord* p2);
47
- double _geoDistKm(const GeoCoord* p1, const GeoCoord* p2);
48
47
  double _geoAzimuthRads(const GeoCoord* p1, const GeoCoord* p2);
49
48
  void _geoAzDistanceRads(const GeoCoord* p1, double az, double distance,
50
49
  GeoCoord* p2);
@@ -46,6 +46,12 @@
46
46
  /** The number of bits in a single H3 resolution digit. */
47
47
  #define H3_PER_DIGIT_OFFSET 3
48
48
 
49
+ /** 1 in the highest bit, 0's everywhere else. */
50
+ #define H3_HIGH_BIT_MASK ((uint64_t)(1) << H3_MAX_OFFSET)
51
+
52
+ /** 0 in the highest bit, 1's everywhere else. */
53
+ #define H3_HIGH_BIT_MASK_NEGATIVE (~H3_HIGH_BIT_MASK)
54
+
49
55
  /** 1's in the 4 mode bits, 0's everywhere else. */
50
56
  #define H3_MODE_MASK ((uint64_t)(15) << H3_MODE_OFFSET)
51
57
 
@@ -74,11 +80,27 @@
74
80
  #define H3_DIGIT_MASK ((uint64_t)(7))
75
81
 
76
82
  /** 0's in the 7 base cell bits, 1's everywhere else. */
77
- #define H3_DIGIT_MASK_NEGATIVE (~H3_DIGIT_MASK_NEGATIVE)
83
+ #define H3_DIGIT_MASK_NEGATIVE (~H3_DIGIT_MASK)
78
84
 
79
- /** H3 index with mode 0, res 0, base cell 0, and 7 for all index digits. */
85
+ /**
86
+ * H3 index with mode 0, res 0, base cell 0, and 7 for all index digits.
87
+ * Typically used to initialize the creation of an H3 cell index, which
88
+ * expects all direction digits to be 7 beyond the cell's resolution.
89
+ */
80
90
  #define H3_INIT (UINT64_C(35184372088831))
81
91
 
92
+ /**
93
+ * Gets the highest bit of the H3 index.
94
+ */
95
+ #define H3_GET_HIGH_BIT(h3) ((int)((((h3)&H3_HIGH_BIT_MASK) >> H3_MAX_OFFSET)))
96
+
97
+ /**
98
+ * Sets the highest bit of the h3 to v.
99
+ */
100
+ #define H3_SET_HIGH_BIT(h3, v) \
101
+ (h3) = (((h3)&H3_HIGH_BIT_MASK_NEGATIVE) | \
102
+ (((uint64_t)(v)) << H3_MAX_OFFSET))
103
+
82
104
  /**
83
105
  * Gets the integer mode of h3.
84
106
  */
@@ -143,9 +165,19 @@
143
165
  << ((MAX_H3_RES - (res)) * H3_PER_DIGIT_OFFSET)))
144
166
 
145
167
  /**
146
- * Invalid index used to indicate an error from geoToH3 and related functions.
168
+ * Invalid index used to indicate an error from geoToH3 and related functions
169
+ * or missing data in arrays of h3 indices. Analogous to NaN in floating point.
147
170
  */
148
- #define H3_INVALID_INDEX 0
171
+ #define H3_NULL 0
172
+
173
+ /*
174
+ * Return codes for compact
175
+ */
176
+
177
+ #define COMPACT_SUCCESS 0
178
+ #define COMPACT_LOOP_EXCEEDED -1
179
+ #define COMPACT_DUPLICATE -2
180
+ #define COMPACT_ALLOC_FAILED -3
149
181
 
150
182
  void setH3Index(H3Index* h, int res, int baseCell, Direction initDigit);
151
183
  int isResClassIII(int res);
@@ -153,6 +185,7 @@ int isResClassIII(int res);
153
185
  // Internal functions
154
186
 
155
187
  int _h3ToFaceIjkWithInitializedFijk(H3Index h, FaceIJK* fijk);
188
+ void _h3ToFaceIjk(H3Index h, FaceIJK* fijk);
156
189
  H3Index _faceIjkToH3(const FaceIJK* fijk, int res);
157
190
  Direction _h3LeadingNonZeroDigit(H3Index h);
158
191
  H3Index _h3RotatePent60ccw(H3Index h);