1 | /* |
2 | * Copyright 2016-2018 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 baseCells.c |
17 | * @brief Base cell related lookup tables and access functions. |
18 | */ |
19 | |
20 | #include "baseCells.h" |
21 | #include "h3Index.h" |
22 | |
23 | /** @struct BaseCellOrient |
24 | * @brief base cell at a given ijk and required rotations into its system |
25 | */ |
26 | typedef struct { |
27 | int baseCell; ///< base cell number |
28 | int ccwRot60; ///< number of ccw 60 degree rotations relative to current |
29 | /// face |
30 | } BaseCellOrient; |
31 | |
32 | /** @brief Neighboring base cell ID in each IJK direction. |
33 | * |
34 | * For each base cell, for each direction, the neighboring base |
35 | * cell ID is given. 127 indicates there is no neighbor in that direction. |
36 | */ |
37 | const int baseCellNeighbors[NUM_BASE_CELLS][7] = { |
38 | {0, 1, 5, 2, 4, 3, 8}, // base cell 0 |
39 | {1, 7, 6, 9, 0, 3, 2}, // base cell 1 |
40 | {2, 6, 10, 11, 0, 1, 5}, // base cell 2 |
41 | {3, 13, 1, 7, 4, 12, 0}, // base cell 3 |
42 | {4, INVALID_BASE_CELL, 15, 8, 3, 0, 12}, // base cell 4 (pentagon) |
43 | {5, 2, 18, 10, 8, 0, 16}, // base cell 5 |
44 | {6, 14, 11, 17, 1, 9, 2}, // base cell 6 |
45 | {7, 21, 9, 19, 3, 13, 1}, // base cell 7 |
46 | {8, 5, 22, 16, 4, 0, 15}, // base cell 8 |
47 | {9, 19, 14, 20, 1, 7, 6}, // base cell 9 |
48 | {10, 11, 24, 23, 5, 2, 18}, // base cell 10 |
49 | {11, 17, 23, 25, 2, 6, 10}, // base cell 11 |
50 | {12, 28, 13, 26, 4, 15, 3}, // base cell 12 |
51 | {13, 26, 21, 29, 3, 12, 7}, // base cell 13 |
52 | {14, INVALID_BASE_CELL, 17, 27, 9, 20, 6}, // base cell 14 (pentagon) |
53 | {15, 22, 28, 31, 4, 8, 12}, // base cell 15 |
54 | {16, 18, 33, 30, 8, 5, 22}, // base cell 16 |
55 | {17, 11, 14, 6, 35, 25, 27}, // base cell 17 |
56 | {18, 24, 30, 32, 5, 10, 16}, // base cell 18 |
57 | {19, 34, 20, 36, 7, 21, 9}, // base cell 19 |
58 | {20, 14, 19, 9, 40, 27, 36}, // base cell 20 |
59 | {21, 38, 19, 34, 13, 29, 7}, // base cell 21 |
60 | {22, 16, 41, 33, 15, 8, 31}, // base cell 22 |
61 | {23, 24, 11, 10, 39, 37, 25}, // base cell 23 |
62 | {24, INVALID_BASE_CELL, 32, 37, 10, 23, 18}, // base cell 24 (pentagon) |
63 | {25, 23, 17, 11, 45, 39, 35}, // base cell 25 |
64 | {26, 42, 29, 43, 12, 28, 13}, // base cell 26 |
65 | {27, 40, 35, 46, 14, 20, 17}, // base cell 27 |
66 | {28, 31, 42, 44, 12, 15, 26}, // base cell 28 |
67 | {29, 43, 38, 47, 13, 26, 21}, // base cell 29 |
68 | {30, 32, 48, 50, 16, 18, 33}, // base cell 30 |
69 | {31, 41, 44, 53, 15, 22, 28}, // base cell 31 |
70 | {32, 30, 24, 18, 52, 50, 37}, // base cell 32 |
71 | {33, 30, 49, 48, 22, 16, 41}, // base cell 33 |
72 | {34, 19, 38, 21, 54, 36, 51}, // base cell 34 |
73 | {35, 46, 45, 56, 17, 27, 25}, // base cell 35 |
74 | {36, 20, 34, 19, 55, 40, 54}, // base cell 36 |
75 | {37, 39, 52, 57, 24, 23, 32}, // base cell 37 |
76 | {38, INVALID_BASE_CELL, 34, 51, 29, 47, 21}, // base cell 38 (pentagon) |
77 | {39, 37, 25, 23, 59, 57, 45}, // base cell 39 |
78 | {40, 27, 36, 20, 60, 46, 55}, // base cell 40 |
79 | {41, 49, 53, 61, 22, 33, 31}, // base cell 41 |
80 | {42, 58, 43, 62, 28, 44, 26}, // base cell 42 |
81 | {43, 62, 47, 64, 26, 42, 29}, // base cell 43 |
82 | {44, 53, 58, 65, 28, 31, 42}, // base cell 44 |
83 | {45, 39, 35, 25, 63, 59, 56}, // base cell 45 |
84 | {46, 60, 56, 68, 27, 40, 35}, // base cell 46 |
85 | {47, 38, 43, 29, 69, 51, 64}, // base cell 47 |
86 | {48, 49, 30, 33, 67, 66, 50}, // base cell 48 |
87 | {49, INVALID_BASE_CELL, 61, 66, 33, 48, 41}, // base cell 49 (pentagon) |
88 | {50, 48, 32, 30, 70, 67, 52}, // base cell 50 |
89 | {51, 69, 54, 71, 38, 47, 34}, // base cell 51 |
90 | {52, 57, 70, 74, 32, 37, 50}, // base cell 52 |
91 | {53, 61, 65, 75, 31, 41, 44}, // base cell 53 |
92 | {54, 71, 55, 73, 34, 51, 36}, // base cell 54 |
93 | {55, 40, 54, 36, 72, 60, 73}, // base cell 55 |
94 | {56, 68, 63, 77, 35, 46, 45}, // base cell 56 |
95 | {57, 59, 74, 78, 37, 39, 52}, // base cell 57 |
96 | {58, INVALID_BASE_CELL, 62, 76, 44, 65, 42}, // base cell 58 (pentagon) |
97 | {59, 63, 78, 79, 39, 45, 57}, // base cell 59 |
98 | {60, 72, 68, 80, 40, 55, 46}, // base cell 60 |
99 | {61, 53, 49, 41, 81, 75, 66}, // base cell 61 |
100 | {62, 43, 58, 42, 82, 64, 76}, // base cell 62 |
101 | {63, INVALID_BASE_CELL, 56, 45, 79, 59, 77}, // base cell 63 (pentagon) |
102 | {64, 47, 62, 43, 84, 69, 82}, // base cell 64 |
103 | {65, 58, 53, 44, 86, 76, 75}, // base cell 65 |
104 | {66, 67, 81, 85, 49, 48, 61}, // base cell 66 |
105 | {67, 66, 50, 48, 87, 85, 70}, // base cell 67 |
106 | {68, 56, 60, 46, 90, 77, 80}, // base cell 68 |
107 | {69, 51, 64, 47, 89, 71, 84}, // base cell 69 |
108 | {70, 67, 52, 50, 83, 87, 74}, // base cell 70 |
109 | {71, 89, 73, 91, 51, 69, 54}, // base cell 71 |
110 | {72, INVALID_BASE_CELL, 73, 55, 80, 60, 88}, // base cell 72 (pentagon) |
111 | {73, 91, 72, 88, 54, 71, 55}, // base cell 73 |
112 | {74, 78, 83, 92, 52, 57, 70}, // base cell 74 |
113 | {75, 65, 61, 53, 94, 86, 81}, // base cell 75 |
114 | {76, 86, 82, 96, 58, 65, 62}, // base cell 76 |
115 | {77, 63, 68, 56, 93, 79, 90}, // base cell 77 |
116 | {78, 74, 59, 57, 95, 92, 79}, // base cell 78 |
117 | {79, 78, 63, 59, 93, 95, 77}, // base cell 79 |
118 | {80, 68, 72, 60, 99, 90, 88}, // base cell 80 |
119 | {81, 85, 94, 101, 61, 66, 75}, // base cell 81 |
120 | {82, 96, 84, 98, 62, 76, 64}, // base cell 82 |
121 | {83, INVALID_BASE_CELL, 74, 70, 100, 87, 92}, // base cell 83 (pentagon) |
122 | {84, 69, 82, 64, 97, 89, 98}, // base cell 84 |
123 | {85, 87, 101, 102, 66, 67, 81}, // base cell 85 |
124 | {86, 76, 75, 65, 104, 96, 94}, // base cell 86 |
125 | {87, 83, 102, 100, 67, 70, 85}, // base cell 87 |
126 | {88, 72, 91, 73, 99, 80, 105}, // base cell 88 |
127 | {89, 97, 91, 103, 69, 84, 71}, // base cell 89 |
128 | {90, 77, 80, 68, 106, 93, 99}, // base cell 90 |
129 | {91, 73, 89, 71, 105, 88, 103}, // base cell 91 |
130 | {92, 83, 78, 74, 108, 100, 95}, // base cell 92 |
131 | {93, 79, 90, 77, 109, 95, 106}, // base cell 93 |
132 | {94, 86, 81, 75, 107, 104, 101}, // base cell 94 |
133 | {95, 92, 79, 78, 109, 108, 93}, // base cell 95 |
134 | {96, 104, 98, 110, 76, 86, 82}, // base cell 96 |
135 | {97, INVALID_BASE_CELL, 98, 84, 103, 89, 111}, // base cell 97 (pentagon) |
136 | {98, 110, 97, 111, 82, 96, 84}, // base cell 98 |
137 | {99, 80, 105, 88, 106, 90, 113}, // base cell 99 |
138 | {100, 102, 83, 87, 108, 114, 92}, // base cell 100 |
139 | {101, 102, 107, 112, 81, 85, 94}, // base cell 101 |
140 | {102, 101, 87, 85, 114, 112, 100}, // base cell 102 |
141 | {103, 91, 97, 89, 116, 105, 111}, // base cell 103 |
142 | {104, 107, 110, 115, 86, 94, 96}, // base cell 104 |
143 | {105, 88, 103, 91, 113, 99, 116}, // base cell 105 |
144 | {106, 93, 99, 90, 117, 109, 113}, // base cell 106 |
145 | {107, INVALID_BASE_CELL, 101, 94, 115, 104, |
146 | 112}, // base cell 107 (pentagon) |
147 | {108, 100, 95, 92, 118, 114, 109}, // base cell 108 |
148 | {109, 108, 93, 95, 117, 118, 106}, // base cell 109 |
149 | {110, 98, 104, 96, 119, 111, 115}, // base cell 110 |
150 | {111, 97, 110, 98, 116, 103, 119}, // base cell 111 |
151 | {112, 107, 102, 101, 120, 115, 114}, // base cell 112 |
152 | {113, 99, 116, 105, 117, 106, 121}, // base cell 113 |
153 | {114, 112, 100, 102, 118, 120, 108}, // base cell 114 |
154 | {115, 110, 107, 104, 120, 119, 112}, // base cell 115 |
155 | {116, 103, 119, 111, 113, 105, 121}, // base cell 116 |
156 | {117, INVALID_BASE_CELL, 109, 118, 113, 121, |
157 | 106}, // base cell 117 (pentagon) |
158 | {118, 120, 108, 114, 117, 121, 109}, // base cell 118 |
159 | {119, 111, 115, 110, 121, 116, 120}, // base cell 119 |
160 | {120, 115, 114, 112, 121, 119, 118}, // base cell 120 |
161 | {121, 116, 120, 119, 117, 113, 118}, // base cell 121 |
162 | }; |
163 | |
164 | /** @brief Neighboring base cell rotations in each IJK direction. |
165 | * |
166 | * For each base cell, for each direction, the number of 60 degree |
167 | * CCW rotations to the coordinate system of the neighbor is given. |
168 | * -1 indicates there is no neighbor in that direction. |
169 | */ |
170 | const int baseCellNeighbor60CCWRots[NUM_BASE_CELLS][7] = { |
171 | {0, 5, 0, 0, 1, 5, 1}, // base cell 0 |
172 | {0, 0, 1, 0, 1, 0, 1}, // base cell 1 |
173 | {0, 0, 0, 0, 0, 5, 0}, // base cell 2 |
174 | {0, 5, 0, 0, 2, 5, 1}, // base cell 3 |
175 | {0, -1, 1, 0, 3, 4, 2}, // base cell 4 (pentagon) |
176 | {0, 0, 1, 0, 1, 0, 1}, // base cell 5 |
177 | {0, 0, 0, 3, 5, 5, 0}, // base cell 6 |
178 | {0, 0, 0, 0, 0, 5, 0}, // base cell 7 |
179 | {0, 5, 0, 0, 0, 5, 1}, // base cell 8 |
180 | {0, 0, 1, 3, 0, 0, 1}, // base cell 9 |
181 | {0, 0, 1, 3, 0, 0, 1}, // base cell 10 |
182 | {0, 3, 3, 3, 0, 0, 0}, // base cell 11 |
183 | {0, 5, 0, 0, 3, 5, 1}, // base cell 12 |
184 | {0, 0, 1, 0, 1, 0, 1}, // base cell 13 |
185 | {0, -1, 3, 0, 5, 2, 0}, // base cell 14 (pentagon) |
186 | {0, 5, 0, 0, 4, 5, 1}, // base cell 15 |
187 | {0, 0, 0, 0, 0, 5, 0}, // base cell 16 |
188 | {0, 3, 3, 3, 3, 0, 3}, // base cell 17 |
189 | {0, 0, 0, 3, 5, 5, 0}, // base cell 18 |
190 | {0, 3, 3, 3, 0, 0, 0}, // base cell 19 |
191 | {0, 3, 3, 3, 0, 3, 0}, // base cell 20 |
192 | {0, 0, 0, 3, 5, 5, 0}, // base cell 21 |
193 | {0, 0, 1, 0, 1, 0, 1}, // base cell 22 |
194 | {0, 3, 3, 3, 0, 3, 0}, // base cell 23 |
195 | {0, -1, 3, 0, 5, 2, 0}, // base cell 24 (pentagon) |
196 | {0, 0, 0, 3, 0, 0, 3}, // base cell 25 |
197 | {0, 0, 0, 0, 0, 5, 0}, // base cell 26 |
198 | {0, 3, 0, 0, 0, 3, 3}, // base cell 27 |
199 | {0, 0, 1, 0, 1, 0, 1}, // base cell 28 |
200 | {0, 0, 1, 3, 0, 0, 1}, // base cell 29 |
201 | {0, 3, 3, 3, 0, 0, 0}, // base cell 30 |
202 | {0, 0, 0, 0, 0, 5, 0}, // base cell 31 |
203 | {0, 3, 3, 3, 3, 0, 3}, // base cell 32 |
204 | {0, 0, 1, 3, 0, 0, 1}, // base cell 33 |
205 | {0, 3, 3, 3, 3, 0, 3}, // base cell 34 |
206 | {0, 0, 3, 0, 3, 0, 3}, // base cell 35 |
207 | {0, 0, 0, 3, 0, 0, 3}, // base cell 36 |
208 | {0, 3, 0, 0, 0, 3, 3}, // base cell 37 |
209 | {0, -1, 3, 0, 5, 2, 0}, // base cell 38 (pentagon) |
210 | {0, 3, 0, 0, 3, 3, 0}, // base cell 39 |
211 | {0, 3, 0, 0, 3, 3, 0}, // base cell 40 |
212 | {0, 0, 0, 3, 5, 5, 0}, // base cell 41 |
213 | {0, 0, 0, 3, 5, 5, 0}, // base cell 42 |
214 | {0, 3, 3, 3, 0, 0, 0}, // base cell 43 |
215 | {0, 0, 1, 3, 0, 0, 1}, // base cell 44 |
216 | {0, 0, 3, 0, 0, 3, 3}, // base cell 45 |
217 | {0, 0, 0, 3, 0, 3, 0}, // base cell 46 |
218 | {0, 3, 3, 3, 0, 3, 0}, // base cell 47 |
219 | {0, 3, 3, 3, 0, 3, 0}, // base cell 48 |
220 | {0, -1, 3, 0, 5, 2, 0}, // base cell 49 (pentagon) |
221 | {0, 0, 0, 3, 0, 0, 3}, // base cell 50 |
222 | {0, 3, 0, 0, 0, 3, 3}, // base cell 51 |
223 | {0, 0, 3, 0, 3, 0, 3}, // base cell 52 |
224 | {0, 3, 3, 3, 0, 0, 0}, // base cell 53 |
225 | {0, 0, 3, 0, 3, 0, 3}, // base cell 54 |
226 | {0, 0, 3, 0, 0, 3, 3}, // base cell 55 |
227 | {0, 3, 3, 3, 0, 0, 3}, // base cell 56 |
228 | {0, 0, 0, 3, 0, 3, 0}, // base cell 57 |
229 | {0, -1, 3, 0, 5, 2, 0}, // base cell 58 (pentagon) |
230 | {0, 3, 3, 3, 3, 3, 0}, // base cell 59 |
231 | {0, 3, 3, 3, 3, 3, 0}, // base cell 60 |
232 | {0, 3, 3, 3, 3, 0, 3}, // base cell 61 |
233 | {0, 3, 3, 3, 3, 0, 3}, // base cell 62 |
234 | {0, -1, 3, 0, 5, 2, 0}, // base cell 63 (pentagon) |
235 | {0, 0, 0, 3, 0, 0, 3}, // base cell 64 |
236 | {0, 3, 3, 3, 0, 3, 0}, // base cell 65 |
237 | {0, 3, 0, 0, 0, 3, 3}, // base cell 66 |
238 | {0, 3, 0, 0, 3, 3, 0}, // base cell 67 |
239 | {0, 3, 3, 3, 0, 0, 0}, // base cell 68 |
240 | {0, 3, 0, 0, 3, 3, 0}, // base cell 69 |
241 | {0, 0, 3, 0, 0, 3, 3}, // base cell 70 |
242 | {0, 0, 0, 3, 0, 3, 0}, // base cell 71 |
243 | {0, -1, 3, 0, 5, 2, 0}, // base cell 72 (pentagon) |
244 | {0, 3, 3, 3, 0, 0, 3}, // base cell 73 |
245 | {0, 3, 3, 3, 0, 0, 3}, // base cell 74 |
246 | {0, 0, 0, 3, 0, 0, 3}, // base cell 75 |
247 | {0, 3, 0, 0, 0, 3, 3}, // base cell 76 |
248 | {0, 0, 0, 3, 0, 5, 0}, // base cell 77 |
249 | {0, 3, 3, 3, 0, 0, 0}, // base cell 78 |
250 | {0, 0, 1, 3, 1, 0, 1}, // base cell 79 |
251 | {0, 0, 1, 3, 1, 0, 1}, // base cell 80 |
252 | {0, 0, 3, 0, 3, 0, 3}, // base cell 81 |
253 | {0, 0, 3, 0, 3, 0, 3}, // base cell 82 |
254 | {0, -1, 3, 0, 5, 2, 0}, // base cell 83 (pentagon) |
255 | {0, 0, 3, 0, 0, 3, 3}, // base cell 84 |
256 | {0, 0, 0, 3, 0, 3, 0}, // base cell 85 |
257 | {0, 3, 0, 0, 3, 3, 0}, // base cell 86 |
258 | {0, 3, 3, 3, 3, 3, 0}, // base cell 87 |
259 | {0, 0, 0, 3, 0, 5, 0}, // base cell 88 |
260 | {0, 3, 3, 3, 3, 3, 0}, // base cell 89 |
261 | {0, 0, 0, 0, 0, 0, 1}, // base cell 90 |
262 | {0, 3, 3, 3, 0, 0, 0}, // base cell 91 |
263 | {0, 0, 0, 3, 0, 5, 0}, // base cell 92 |
264 | {0, 5, 0, 0, 5, 5, 0}, // base cell 93 |
265 | {0, 0, 3, 0, 0, 3, 3}, // base cell 94 |
266 | {0, 0, 0, 0, 0, 0, 1}, // base cell 95 |
267 | {0, 0, 0, 3, 0, 3, 0}, // base cell 96 |
268 | {0, -1, 3, 0, 5, 2, 0}, // base cell 97 (pentagon) |
269 | {0, 3, 3, 3, 0, 0, 3}, // base cell 98 |
270 | {0, 5, 0, 0, 5, 5, 0}, // base cell 99 |
271 | {0, 0, 1, 3, 1, 0, 1}, // base cell 100 |
272 | {0, 3, 3, 3, 0, 0, 3}, // base cell 101 |
273 | {0, 3, 3, 3, 0, 0, 0}, // base cell 102 |
274 | {0, 0, 1, 3, 1, 0, 1}, // base cell 103 |
275 | {0, 3, 3, 3, 3, 3, 0}, // base cell 104 |
276 | {0, 0, 0, 0, 0, 0, 1}, // base cell 105 |
277 | {0, 0, 1, 0, 3, 5, 1}, // base cell 106 |
278 | {0, -1, 3, 0, 5, 2, 0}, // base cell 107 (pentagon) |
279 | {0, 5, 0, 0, 5, 5, 0}, // base cell 108 |
280 | {0, 0, 1, 0, 4, 5, 1}, // base cell 109 |
281 | {0, 3, 3, 3, 0, 0, 0}, // base cell 110 |
282 | {0, 0, 0, 3, 0, 5, 0}, // base cell 111 |
283 | {0, 0, 0, 3, 0, 5, 0}, // base cell 112 |
284 | {0, 0, 1, 0, 2, 5, 1}, // base cell 113 |
285 | {0, 0, 0, 0, 0, 0, 1}, // base cell 114 |
286 | {0, 0, 1, 3, 1, 0, 1}, // base cell 115 |
287 | {0, 5, 0, 0, 5, 5, 0}, // base cell 116 |
288 | {0, -1, 1, 0, 3, 4, 2}, // base cell 117 (pentagon) |
289 | {0, 0, 1, 0, 0, 5, 1}, // base cell 118 |
290 | {0, 0, 0, 0, 0, 0, 1}, // base cell 119 |
291 | {0, 5, 0, 0, 5, 5, 0}, // base cell 120 |
292 | {0, 0, 1, 0, 1, 5, 1}, // base cell 121 |
293 | }; |
294 | |
295 | /** @brief Resolution 0 base cell lookup table for each face. |
296 | * |
297 | * Given the face number and a resolution 0 ijk+ coordinate in that face's |
298 | * face-centered ijk coordinate system, gives the base cell located at that |
299 | * coordinate and the number of 60 ccw rotations to rotate into that base |
300 | * cell's orientation. |
301 | * |
302 | * Valid lookup coordinates are from (0, 0, 0) to (2, 2, 2). |
303 | * |
304 | * This table can be accessed using the functions `_faceIjkToBaseCell` and |
305 | * `_faceIjkToBaseCellCCWrot60` |
306 | */ |
307 | static const BaseCellOrient faceIjkBaseCells[NUM_ICOSA_FACES][3][3][3] = { |
308 | {// face 0 |
309 | { |
310 | // i 0 |
311 | {{16, 0}, {18, 0}, {24, 0}}, // j 0 |
312 | {{33, 0}, {30, 0}, {32, 3}}, // j 1 |
313 | {{49, 1}, {48, 3}, {50, 3}} // j 2 |
314 | }, |
315 | { |
316 | // i 1 |
317 | {{8, 0}, {5, 5}, {10, 5}}, // j 0 |
318 | {{22, 0}, {16, 0}, {18, 0}}, // j 1 |
319 | {{41, 1}, {33, 0}, {30, 0}} // j 2 |
320 | }, |
321 | { |
322 | // i 2 |
323 | {{4, 0}, {0, 5}, {2, 5}}, // j 0 |
324 | {{15, 1}, {8, 0}, {5, 5}}, // j 1 |
325 | {{31, 1}, {22, 0}, {16, 0}} // j 2 |
326 | }}, |
327 | {// face 1 |
328 | { |
329 | // i 0 |
330 | {{2, 0}, {6, 0}, {14, 0}}, // j 0 |
331 | {{10, 0}, {11, 0}, {17, 3}}, // j 1 |
332 | {{24, 1}, {23, 3}, {25, 3}} // j 2 |
333 | }, |
334 | { |
335 | // i 1 |
336 | {{0, 0}, {1, 5}, {9, 5}}, // j 0 |
337 | {{5, 0}, {2, 0}, {6, 0}}, // j 1 |
338 | {{18, 1}, {10, 0}, {11, 0}} // j 2 |
339 | }, |
340 | { |
341 | // i 2 |
342 | {{4, 1}, {3, 5}, {7, 5}}, // j 0 |
343 | {{8, 1}, {0, 0}, {1, 5}}, // j 1 |
344 | {{16, 1}, {5, 0}, {2, 0}} // j 2 |
345 | }}, |
346 | {// face 2 |
347 | { |
348 | // i 0 |
349 | {{7, 0}, {21, 0}, {38, 0}}, // j 0 |
350 | {{9, 0}, {19, 0}, {34, 3}}, // j 1 |
351 | {{14, 1}, {20, 3}, {36, 3}} // j 2 |
352 | }, |
353 | { |
354 | // i 1 |
355 | {{3, 0}, {13, 5}, {29, 5}}, // j 0 |
356 | {{1, 0}, {7, 0}, {21, 0}}, // j 1 |
357 | {{6, 1}, {9, 0}, {19, 0}} // j 2 |
358 | }, |
359 | { |
360 | // i 2 |
361 | {{4, 2}, {12, 5}, {26, 5}}, // j 0 |
362 | {{0, 1}, {3, 0}, {13, 5}}, // j 1 |
363 | {{2, 1}, {1, 0}, {7, 0}} // j 2 |
364 | }}, |
365 | {// face 3 |
366 | { |
367 | // i 0 |
368 | {{26, 0}, {42, 0}, {58, 0}}, // j 0 |
369 | {{29, 0}, {43, 0}, {62, 3}}, // j 1 |
370 | {{38, 1}, {47, 3}, {64, 3}} // j 2 |
371 | }, |
372 | { |
373 | // i 1 |
374 | {{12, 0}, {28, 5}, {44, 5}}, // j 0 |
375 | {{13, 0}, {26, 0}, {42, 0}}, // j 1 |
376 | {{21, 1}, {29, 0}, {43, 0}} // j 2 |
377 | }, |
378 | { |
379 | // i 2 |
380 | {{4, 3}, {15, 5}, {31, 5}}, // j 0 |
381 | {{3, 1}, {12, 0}, {28, 5}}, // j 1 |
382 | {{7, 1}, {13, 0}, {26, 0}} // j 2 |
383 | }}, |
384 | {// face 4 |
385 | { |
386 | // i 0 |
387 | {{31, 0}, {41, 0}, {49, 0}}, // j 0 |
388 | {{44, 0}, {53, 0}, {61, 3}}, // j 1 |
389 | {{58, 1}, {65, 3}, {75, 3}} // j 2 |
390 | }, |
391 | { |
392 | // i 1 |
393 | {{15, 0}, {22, 5}, {33, 5}}, // j 0 |
394 | {{28, 0}, {31, 0}, {41, 0}}, // j 1 |
395 | {{42, 1}, {44, 0}, {53, 0}} // j 2 |
396 | }, |
397 | { |
398 | // i 2 |
399 | {{4, 4}, {8, 5}, {16, 5}}, // j 0 |
400 | {{12, 1}, {15, 0}, {22, 5}}, // j 1 |
401 | {{26, 1}, {28, 0}, {31, 0}} // j 2 |
402 | }}, |
403 | {// face 5 |
404 | { |
405 | // i 0 |
406 | {{50, 0}, {48, 0}, {49, 3}}, // j 0 |
407 | {{32, 0}, {30, 3}, {33, 3}}, // j 1 |
408 | {{24, 3}, {18, 3}, {16, 3}} // j 2 |
409 | }, |
410 | { |
411 | // i 1 |
412 | {{70, 0}, {67, 0}, {66, 3}}, // j 0 |
413 | {{52, 3}, {50, 0}, {48, 0}}, // j 1 |
414 | {{37, 3}, {32, 0}, {30, 3}} // j 2 |
415 | }, |
416 | { |
417 | // i 2 |
418 | {{83, 0}, {87, 3}, {85, 3}}, // j 0 |
419 | {{74, 3}, {70, 0}, {67, 0}}, // j 1 |
420 | {{57, 1}, {52, 3}, {50, 0}} // j 2 |
421 | }}, |
422 | {// face 6 |
423 | { |
424 | // i 0 |
425 | {{25, 0}, {23, 0}, {24, 3}}, // j 0 |
426 | {{17, 0}, {11, 3}, {10, 3}}, // j 1 |
427 | {{14, 3}, {6, 3}, {2, 3}} // j 2 |
428 | }, |
429 | { |
430 | // i 1 |
431 | {{45, 0}, {39, 0}, {37, 3}}, // j 0 |
432 | {{35, 3}, {25, 0}, {23, 0}}, // j 1 |
433 | {{27, 3}, {17, 0}, {11, 3}} // j 2 |
434 | }, |
435 | { |
436 | // i 2 |
437 | {{63, 0}, {59, 3}, {57, 3}}, // j 0 |
438 | {{56, 3}, {45, 0}, {39, 0}}, // j 1 |
439 | {{46, 3}, {35, 3}, {25, 0}} // j 2 |
440 | }}, |
441 | {// face 7 |
442 | { |
443 | // i 0 |
444 | {{36, 0}, {20, 0}, {14, 3}}, // j 0 |
445 | {{34, 0}, {19, 3}, {9, 3}}, // j 1 |
446 | {{38, 3}, {21, 3}, {7, 3}} // j 2 |
447 | }, |
448 | { |
449 | // i 1 |
450 | {{55, 0}, {40, 0}, {27, 3}}, // j 0 |
451 | {{54, 3}, {36, 0}, {20, 0}}, // j 1 |
452 | {{51, 3}, {34, 0}, {19, 3}} // j 2 |
453 | }, |
454 | { |
455 | // i 2 |
456 | {{72, 0}, {60, 3}, {46, 3}}, // j 0 |
457 | {{73, 3}, {55, 0}, {40, 0}}, // j 1 |
458 | {{71, 3}, {54, 3}, {36, 0}} // j 2 |
459 | }}, |
460 | {// face 8 |
461 | { |
462 | // i 0 |
463 | {{64, 0}, {47, 0}, {38, 3}}, // j 0 |
464 | {{62, 0}, {43, 3}, {29, 3}}, // j 1 |
465 | {{58, 3}, {42, 3}, {26, 3}} // j 2 |
466 | }, |
467 | { |
468 | // i 1 |
469 | {{84, 0}, {69, 0}, {51, 3}}, // j 0 |
470 | {{82, 3}, {64, 0}, {47, 0}}, // j 1 |
471 | {{76, 3}, {62, 0}, {43, 3}} // j 2 |
472 | }, |
473 | { |
474 | // i 2 |
475 | {{97, 0}, {89, 3}, {71, 3}}, // j 0 |
476 | {{98, 3}, {84, 0}, {69, 0}}, // j 1 |
477 | {{96, 3}, {82, 3}, {64, 0}} // j 2 |
478 | }}, |
479 | {// face 9 |
480 | { |
481 | // i 0 |
482 | {{75, 0}, {65, 0}, {58, 3}}, // j 0 |
483 | {{61, 0}, {53, 3}, {44, 3}}, // j 1 |
484 | {{49, 3}, {41, 3}, {31, 3}} // j 2 |
485 | }, |
486 | { |
487 | // i 1 |
488 | {{94, 0}, {86, 0}, {76, 3}}, // j 0 |
489 | {{81, 3}, {75, 0}, {65, 0}}, // j 1 |
490 | {{66, 3}, {61, 0}, {53, 3}} // j 2 |
491 | }, |
492 | { |
493 | // i 2 |
494 | {{107, 0}, {104, 3}, {96, 3}}, // j 0 |
495 | {{101, 3}, {94, 0}, {86, 0}}, // j 1 |
496 | {{85, 3}, {81, 3}, {75, 0}} // j 2 |
497 | }}, |
498 | {// face 10 |
499 | { |
500 | // i 0 |
501 | {{57, 0}, {59, 0}, {63, 3}}, // j 0 |
502 | {{74, 0}, {78, 3}, {79, 3}}, // j 1 |
503 | {{83, 3}, {92, 3}, {95, 3}} // j 2 |
504 | }, |
505 | { |
506 | // i 1 |
507 | {{37, 0}, {39, 3}, {45, 3}}, // j 0 |
508 | {{52, 0}, {57, 0}, {59, 0}}, // j 1 |
509 | {{70, 3}, {74, 0}, {78, 3}} // j 2 |
510 | }, |
511 | { |
512 | // i 2 |
513 | {{24, 0}, {23, 3}, {25, 3}}, // j 0 |
514 | {{32, 3}, {37, 0}, {39, 3}}, // j 1 |
515 | {{50, 3}, {52, 0}, {57, 0}} // j 2 |
516 | }}, |
517 | {// face 11 |
518 | { |
519 | // i 0 |
520 | {{46, 0}, {60, 0}, {72, 3}}, // j 0 |
521 | {{56, 0}, {68, 3}, {80, 3}}, // j 1 |
522 | {{63, 3}, {77, 3}, {90, 3}} // j 2 |
523 | }, |
524 | { |
525 | // i 1 |
526 | {{27, 0}, {40, 3}, {55, 3}}, // j 0 |
527 | {{35, 0}, {46, 0}, {60, 0}}, // j 1 |
528 | {{45, 3}, {56, 0}, {68, 3}} // j 2 |
529 | }, |
530 | { |
531 | // i 2 |
532 | {{14, 0}, {20, 3}, {36, 3}}, // j 0 |
533 | {{17, 3}, {27, 0}, {40, 3}}, // j 1 |
534 | {{25, 3}, {35, 0}, {46, 0}} // j 2 |
535 | }}, |
536 | {// face 12 |
537 | { |
538 | // i 0 |
539 | {{71, 0}, {89, 0}, {97, 3}}, // j 0 |
540 | {{73, 0}, {91, 3}, {103, 3}}, // j 1 |
541 | {{72, 3}, {88, 3}, {105, 3}} // j 2 |
542 | }, |
543 | { |
544 | // i 1 |
545 | {{51, 0}, {69, 3}, {84, 3}}, // j 0 |
546 | {{54, 0}, {71, 0}, {89, 0}}, // j 1 |
547 | {{55, 3}, {73, 0}, {91, 3}} // j 2 |
548 | }, |
549 | { |
550 | // i 2 |
551 | {{38, 0}, {47, 3}, {64, 3}}, // j 0 |
552 | {{34, 3}, {51, 0}, {69, 3}}, // j 1 |
553 | {{36, 3}, {54, 0}, {71, 0}} // j 2 |
554 | }}, |
555 | {// face 13 |
556 | { |
557 | // i 0 |
558 | {{96, 0}, {104, 0}, {107, 3}}, // j 0 |
559 | {{98, 0}, {110, 3}, {115, 3}}, // j 1 |
560 | {{97, 3}, {111, 3}, {119, 3}} // j 2 |
561 | }, |
562 | { |
563 | // i 1 |
564 | {{76, 0}, {86, 3}, {94, 3}}, // j 0 |
565 | {{82, 0}, {96, 0}, {104, 0}}, // j 1 |
566 | {{84, 3}, {98, 0}, {110, 3}} // j 2 |
567 | }, |
568 | { |
569 | // i 2 |
570 | {{58, 0}, {65, 3}, {75, 3}}, // j 0 |
571 | {{62, 3}, {76, 0}, {86, 3}}, // j 1 |
572 | {{64, 3}, {82, 0}, {96, 0}} // j 2 |
573 | }}, |
574 | {// face 14 |
575 | { |
576 | // i 0 |
577 | {{85, 0}, {87, 0}, {83, 3}}, // j 0 |
578 | {{101, 0}, {102, 3}, {100, 3}}, // j 1 |
579 | {{107, 3}, {112, 3}, {114, 3}} // j 2 |
580 | }, |
581 | { |
582 | // i 1 |
583 | {{66, 0}, {67, 3}, {70, 3}}, // j 0 |
584 | {{81, 0}, {85, 0}, {87, 0}}, // j 1 |
585 | {{94, 3}, {101, 0}, {102, 3}} // j 2 |
586 | }, |
587 | { |
588 | // i 2 |
589 | {{49, 0}, {48, 3}, {50, 3}}, // j 0 |
590 | {{61, 3}, {66, 0}, {67, 3}}, // j 1 |
591 | {{75, 3}, {81, 0}, {85, 0}} // j 2 |
592 | }}, |
593 | {// face 15 |
594 | { |
595 | // i 0 |
596 | {{95, 0}, {92, 0}, {83, 0}}, // j 0 |
597 | {{79, 0}, {78, 0}, {74, 3}}, // j 1 |
598 | {{63, 1}, {59, 3}, {57, 3}} // j 2 |
599 | }, |
600 | { |
601 | // i 1 |
602 | {{109, 0}, {108, 0}, {100, 5}}, // j 0 |
603 | {{93, 1}, {95, 0}, {92, 0}}, // j 1 |
604 | {{77, 1}, {79, 0}, {78, 0}} // j 2 |
605 | }, |
606 | { |
607 | // i 2 |
608 | {{117, 4}, {118, 5}, {114, 5}}, // j 0 |
609 | {{106, 1}, {109, 0}, {108, 0}}, // j 1 |
610 | {{90, 1}, {93, 1}, {95, 0}} // j 2 |
611 | }}, |
612 | {// face 16 |
613 | { |
614 | // i 0 |
615 | {{90, 0}, {77, 0}, {63, 0}}, // j 0 |
616 | {{80, 0}, {68, 0}, {56, 3}}, // j 1 |
617 | {{72, 1}, {60, 3}, {46, 3}} // j 2 |
618 | }, |
619 | { |
620 | // i 1 |
621 | {{106, 0}, {93, 0}, {79, 5}}, // j 0 |
622 | {{99, 1}, {90, 0}, {77, 0}}, // j 1 |
623 | {{88, 1}, {80, 0}, {68, 0}} // j 2 |
624 | }, |
625 | { |
626 | // i 2 |
627 | {{117, 3}, {109, 5}, {95, 5}}, // j 0 |
628 | {{113, 1}, {106, 0}, {93, 0}}, // j 1 |
629 | {{105, 1}, {99, 1}, {90, 0}} // j 2 |
630 | }}, |
631 | {// face 17 |
632 | { |
633 | // i 0 |
634 | {{105, 0}, {88, 0}, {72, 0}}, // j 0 |
635 | {{103, 0}, {91, 0}, {73, 3}}, // j 1 |
636 | {{97, 1}, {89, 3}, {71, 3}} // j 2 |
637 | }, |
638 | { |
639 | // i 1 |
640 | {{113, 0}, {99, 0}, {80, 5}}, // j 0 |
641 | {{116, 1}, {105, 0}, {88, 0}}, // j 1 |
642 | {{111, 1}, {103, 0}, {91, 0}} // j 2 |
643 | }, |
644 | { |
645 | // i 2 |
646 | {{117, 2}, {106, 5}, {90, 5}}, // j 0 |
647 | {{121, 1}, {113, 0}, {99, 0}}, // j 1 |
648 | {{119, 1}, {116, 1}, {105, 0}} // j 2 |
649 | }}, |
650 | {// face 18 |
651 | { |
652 | // i 0 |
653 | {{119, 0}, {111, 0}, {97, 0}}, // j 0 |
654 | {{115, 0}, {110, 0}, {98, 3}}, // j 1 |
655 | {{107, 1}, {104, 3}, {96, 3}} // j 2 |
656 | }, |
657 | { |
658 | // i 1 |
659 | {{121, 0}, {116, 0}, {103, 5}}, // j 0 |
660 | {{120, 1}, {119, 0}, {111, 0}}, // j 1 |
661 | {{112, 1}, {115, 0}, {110, 0}} // j 2 |
662 | }, |
663 | { |
664 | // i 2 |
665 | {{117, 1}, {113, 5}, {105, 5}}, // j 0 |
666 | {{118, 1}, {121, 0}, {116, 0}}, // j 1 |
667 | {{114, 1}, {120, 1}, {119, 0}} // j 2 |
668 | }}, |
669 | {// face 19 |
670 | { |
671 | // i 0 |
672 | {{114, 0}, {112, 0}, {107, 0}}, // j 0 |
673 | {{100, 0}, {102, 0}, {101, 3}}, // j 1 |
674 | {{83, 1}, {87, 3}, {85, 3}} // j 2 |
675 | }, |
676 | { |
677 | // i 1 |
678 | {{118, 0}, {120, 0}, {115, 5}}, // j 0 |
679 | {{108, 1}, {114, 0}, {112, 0}}, // j 1 |
680 | {{92, 1}, {100, 0}, {102, 0}} // j 2 |
681 | }, |
682 | { |
683 | // i 2 |
684 | {{117, 0}, {121, 5}, {119, 5}}, // j 0 |
685 | {{109, 1}, {118, 0}, {120, 0}}, // j 1 |
686 | {{95, 1}, {108, 1}, {114, 0}} // j 2 |
687 | }}}; |
688 | |
689 | /** @brief Resolution 0 base cell data table. |
690 | * |
691 | * For each base cell, gives the "home" face and ijk+ coordinates on that face, |
692 | * whether or not the base cell is a pentagon. Additionally, if the base cell |
693 | * is a pentagon, the two cw offset rotation adjacent faces are given (-1 |
694 | * indicates that no cw offset rotation faces exist for this base cell). |
695 | */ |
696 | const BaseCellData baseCellData[NUM_BASE_CELLS] = { |
697 | |
698 | {{1, {1, 0, 0}}, 0, {0, 0}}, // base cell 0 |
699 | {{2, {1, 1, 0}}, 0, {0, 0}}, // base cell 1 |
700 | {{1, {0, 0, 0}}, 0, {0, 0}}, // base cell 2 |
701 | {{2, {1, 0, 0}}, 0, {0, 0}}, // base cell 3 |
702 | {{0, {2, 0, 0}}, 1, {-1, -1}}, // base cell 4 |
703 | {{1, {1, 1, 0}}, 0, {0, 0}}, // base cell 5 |
704 | {{1, {0, 0, 1}}, 0, {0, 0}}, // base cell 6 |
705 | {{2, {0, 0, 0}}, 0, {0, 0}}, // base cell 7 |
706 | {{0, {1, 0, 0}}, 0, {0, 0}}, // base cell 8 |
707 | {{2, {0, 1, 0}}, 0, {0, 0}}, // base cell 9 |
708 | {{1, {0, 1, 0}}, 0, {0, 0}}, // base cell 10 |
709 | {{1, {0, 1, 1}}, 0, {0, 0}}, // base cell 11 |
710 | {{3, {1, 0, 0}}, 0, {0, 0}}, // base cell 12 |
711 | {{3, {1, 1, 0}}, 0, {0, 0}}, // base cell 13 |
712 | {{11, {2, 0, 0}}, 1, {2, 6}}, // base cell 14 |
713 | {{4, {1, 0, 0}}, 0, {0, 0}}, // base cell 15 |
714 | {{0, {0, 0, 0}}, 0, {0, 0}}, // base cell 16 |
715 | {{6, {0, 1, 0}}, 0, {0, 0}}, // base cell 17 |
716 | {{0, {0, 0, 1}}, 0, {0, 0}}, // base cell 18 |
717 | {{2, {0, 1, 1}}, 0, {0, 0}}, // base cell 19 |
718 | {{7, {0, 0, 1}}, 0, {0, 0}}, // base cell 20 |
719 | {{2, {0, 0, 1}}, 0, {0, 0}}, // base cell 21 |
720 | {{0, {1, 1, 0}}, 0, {0, 0}}, // base cell 22 |
721 | {{6, {0, 0, 1}}, 0, {0, 0}}, // base cell 23 |
722 | {{10, {2, 0, 0}}, 1, {1, 5}}, // base cell 24 |
723 | {{6, {0, 0, 0}}, 0, {0, 0}}, // base cell 25 |
724 | {{3, {0, 0, 0}}, 0, {0, 0}}, // base cell 26 |
725 | {{11, {1, 0, 0}}, 0, {0, 0}}, // base cell 27 |
726 | {{4, {1, 1, 0}}, 0, {0, 0}}, // base cell 28 |
727 | {{3, {0, 1, 0}}, 0, {0, 0}}, // base cell 29 |
728 | {{0, {0, 1, 1}}, 0, {0, 0}}, // base cell 30 |
729 | {{4, {0, 0, 0}}, 0, {0, 0}}, // base cell 31 |
730 | {{5, {0, 1, 0}}, 0, {0, 0}}, // base cell 32 |
731 | {{0, {0, 1, 0}}, 0, {0, 0}}, // base cell 33 |
732 | {{7, {0, 1, 0}}, 0, {0, 0}}, // base cell 34 |
733 | {{11, {1, 1, 0}}, 0, {0, 0}}, // base cell 35 |
734 | {{7, {0, 0, 0}}, 0, {0, 0}}, // base cell 36 |
735 | {{10, {1, 0, 0}}, 0, {0, 0}}, // base cell 37 |
736 | {{12, {2, 0, 0}}, 1, {3, 7}}, // base cell 38 |
737 | {{6, {1, 0, 1}}, 0, {0, 0}}, // base cell 39 |
738 | {{7, {1, 0, 1}}, 0, {0, 0}}, // base cell 40 |
739 | {{4, {0, 0, 1}}, 0, {0, 0}}, // base cell 41 |
740 | {{3, {0, 0, 1}}, 0, {0, 0}}, // base cell 42 |
741 | {{3, {0, 1, 1}}, 0, {0, 0}}, // base cell 43 |
742 | {{4, {0, 1, 0}}, 0, {0, 0}}, // base cell 44 |
743 | {{6, {1, 0, 0}}, 0, {0, 0}}, // base cell 45 |
744 | {{11, {0, 0, 0}}, 0, {0, 0}}, // base cell 46 |
745 | {{8, {0, 0, 1}}, 0, {0, 0}}, // base cell 47 |
746 | {{5, {0, 0, 1}}, 0, {0, 0}}, // base cell 48 |
747 | {{14, {2, 0, 0}}, 1, {0, 9}}, // base cell 49 |
748 | {{5, {0, 0, 0}}, 0, {0, 0}}, // base cell 50 |
749 | {{12, {1, 0, 0}}, 0, {0, 0}}, // base cell 51 |
750 | {{10, {1, 1, 0}}, 0, {0, 0}}, // base cell 52 |
751 | {{4, {0, 1, 1}}, 0, {0, 0}}, // base cell 53 |
752 | {{12, {1, 1, 0}}, 0, {0, 0}}, // base cell 54 |
753 | {{7, {1, 0, 0}}, 0, {0, 0}}, // base cell 55 |
754 | {{11, {0, 1, 0}}, 0, {0, 0}}, // base cell 56 |
755 | {{10, {0, 0, 0}}, 0, {0, 0}}, // base cell 57 |
756 | {{13, {2, 0, 0}}, 1, {4, 8}}, // base cell 58 |
757 | {{10, {0, 0, 1}}, 0, {0, 0}}, // base cell 59 |
758 | {{11, {0, 0, 1}}, 0, {0, 0}}, // base cell 60 |
759 | {{9, {0, 1, 0}}, 0, {0, 0}}, // base cell 61 |
760 | {{8, {0, 1, 0}}, 0, {0, 0}}, // base cell 62 |
761 | {{6, {2, 0, 0}}, 1, {11, 15}}, // base cell 63 |
762 | {{8, {0, 0, 0}}, 0, {0, 0}}, // base cell 64 |
763 | {{9, {0, 0, 1}}, 0, {0, 0}}, // base cell 65 |
764 | {{14, {1, 0, 0}}, 0, {0, 0}}, // base cell 66 |
765 | {{5, {1, 0, 1}}, 0, {0, 0}}, // base cell 67 |
766 | {{16, {0, 1, 1}}, 0, {0, 0}}, // base cell 68 |
767 | {{8, {1, 0, 1}}, 0, {0, 0}}, // base cell 69 |
768 | {{5, {1, 0, 0}}, 0, {0, 0}}, // base cell 70 |
769 | {{12, {0, 0, 0}}, 0, {0, 0}}, // base cell 71 |
770 | {{7, {2, 0, 0}}, 1, {12, 16}}, // base cell 72 |
771 | {{12, {0, 1, 0}}, 0, {0, 0}}, // base cell 73 |
772 | {{10, {0, 1, 0}}, 0, {0, 0}}, // base cell 74 |
773 | {{9, {0, 0, 0}}, 0, {0, 0}}, // base cell 75 |
774 | {{13, {1, 0, 0}}, 0, {0, 0}}, // base cell 76 |
775 | {{16, {0, 0, 1}}, 0, {0, 0}}, // base cell 77 |
776 | {{15, {0, 1, 1}}, 0, {0, 0}}, // base cell 78 |
777 | {{15, {0, 1, 0}}, 0, {0, 0}}, // base cell 79 |
778 | {{16, {0, 1, 0}}, 0, {0, 0}}, // base cell 80 |
779 | {{14, {1, 1, 0}}, 0, {0, 0}}, // base cell 81 |
780 | {{13, {1, 1, 0}}, 0, {0, 0}}, // base cell 82 |
781 | {{5, {2, 0, 0}}, 1, {10, 19}}, // base cell 83 |
782 | {{8, {1, 0, 0}}, 0, {0, 0}}, // base cell 84 |
783 | {{14, {0, 0, 0}}, 0, {0, 0}}, // base cell 85 |
784 | {{9, {1, 0, 1}}, 0, {0, 0}}, // base cell 86 |
785 | {{14, {0, 0, 1}}, 0, {0, 0}}, // base cell 87 |
786 | {{17, {0, 0, 1}}, 0, {0, 0}}, // base cell 88 |
787 | {{12, {0, 0, 1}}, 0, {0, 0}}, // base cell 89 |
788 | {{16, {0, 0, 0}}, 0, {0, 0}}, // base cell 90 |
789 | {{17, {0, 1, 1}}, 0, {0, 0}}, // base cell 91 |
790 | {{15, {0, 0, 1}}, 0, {0, 0}}, // base cell 92 |
791 | {{16, {1, 0, 1}}, 0, {0, 0}}, // base cell 93 |
792 | {{9, {1, 0, 0}}, 0, {0, 0}}, // base cell 94 |
793 | {{15, {0, 0, 0}}, 0, {0, 0}}, // base cell 95 |
794 | {{13, {0, 0, 0}}, 0, {0, 0}}, // base cell 96 |
795 | {{8, {2, 0, 0}}, 1, {13, 17}}, // base cell 97 |
796 | {{13, {0, 1, 0}}, 0, {0, 0}}, // base cell 98 |
797 | {{17, {1, 0, 1}}, 0, {0, 0}}, // base cell 99 |
798 | {{19, {0, 1, 0}}, 0, {0, 0}}, // base cell 100 |
799 | {{14, {0, 1, 0}}, 0, {0, 0}}, // base cell 101 |
800 | {{19, {0, 1, 1}}, 0, {0, 0}}, // base cell 102 |
801 | {{17, {0, 1, 0}}, 0, {0, 0}}, // base cell 103 |
802 | {{13, {0, 0, 1}}, 0, {0, 0}}, // base cell 104 |
803 | {{17, {0, 0, 0}}, 0, {0, 0}}, // base cell 105 |
804 | {{16, {1, 0, 0}}, 0, {0, 0}}, // base cell 106 |
805 | {{9, {2, 0, 0}}, 1, {14, 18}}, // base cell 107 |
806 | {{15, {1, 0, 1}}, 0, {0, 0}}, // base cell 108 |
807 | {{15, {1, 0, 0}}, 0, {0, 0}}, // base cell 109 |
808 | {{18, {0, 1, 1}}, 0, {0, 0}}, // base cell 110 |
809 | {{18, {0, 0, 1}}, 0, {0, 0}}, // base cell 111 |
810 | {{19, {0, 0, 1}}, 0, {0, 0}}, // base cell 112 |
811 | {{17, {1, 0, 0}}, 0, {0, 0}}, // base cell 113 |
812 | {{19, {0, 0, 0}}, 0, {0, 0}}, // base cell 114 |
813 | {{18, {0, 1, 0}}, 0, {0, 0}}, // base cell 115 |
814 | {{18, {1, 0, 1}}, 0, {0, 0}}, // base cell 116 |
815 | {{19, {2, 0, 0}}, 1, {-1, -1}}, // base cell 117 |
816 | {{19, {1, 0, 0}}, 0, {0, 0}}, // base cell 118 |
817 | {{18, {0, 0, 0}}, 0, {0, 0}}, // base cell 119 |
818 | {{19, {1, 0, 1}}, 0, {0, 0}}, // base cell 120 |
819 | {{18, {1, 0, 0}}, 0, {0, 0}} // base cell 121 |
820 | }; |
821 | |
822 | /** @brief Return whether or not the indicated base cell is a pentagon. */ |
823 | int _isBaseCellPentagon(int baseCell) { |
824 | return baseCellData[baseCell].isPentagon; |
825 | } |
826 | |
827 | /** @brief Return whether the indicated base cell is a pentagon where all |
828 | * neighbors are oriented towards it. */ |
829 | bool _isBaseCellPolarPentagon(int baseCell) { |
830 | return baseCell == 4 || baseCell == 117; |
831 | } |
832 | |
833 | /** @brief Find base cell given FaceIJK. |
834 | * |
835 | * Given the face number and a resolution 0 ijk+ coordinate in that face's |
836 | * face-centered ijk coordinate system, return the base cell located at that |
837 | * coordinate. |
838 | * |
839 | * Valid ijk+ lookup coordinates are from (0, 0, 0) to (2, 2, 2). |
840 | */ |
841 | int _faceIjkToBaseCell(const FaceIJK* h) { |
842 | return faceIjkBaseCells[h->face][h->coord.i][h->coord.j][h->coord.k] |
843 | .baseCell; |
844 | } |
845 | |
846 | /** @brief Find base cell given FaceIJK. |
847 | * |
848 | * Given the face number and a resolution 0 ijk+ coordinate in that face's |
849 | * face-centered ijk coordinate system, return the number of 60' ccw rotations |
850 | * to rotate into the coordinate system of the base cell at that coordinates. |
851 | * |
852 | * Valid ijk+ lookup coordinates are from (0, 0, 0) to (2, 2, 2). |
853 | */ |
854 | int _faceIjkToBaseCellCCWrot60(const FaceIJK* h) { |
855 | return faceIjkBaseCells[h->face][h->coord.i][h->coord.j][h->coord.k] |
856 | .ccwRot60; |
857 | } |
858 | |
859 | /** @brief Find the FaceIJK given a base cell. |
860 | */ |
861 | void _baseCellToFaceIjk(int baseCell, FaceIJK* h) { |
862 | *h = baseCellData[baseCell].homeFijk; |
863 | } |
864 | |
865 | /** @brief Return whether or not the tested face is a cw offset face. |
866 | */ |
867 | bool _baseCellIsCwOffset(int baseCell, int testFace) { |
868 | return baseCellData[baseCell].cwOffsetPent[0] == testFace || |
869 | baseCellData[baseCell].cwOffsetPent[1] == testFace; |
870 | } |
871 | |
872 | /** @brief Return the neighboring base cell in the given direction. |
873 | */ |
874 | int _getBaseCellNeighbor(int baseCell, Direction dir) { |
875 | return baseCellNeighbors[baseCell][dir]; |
876 | } |
877 | |
878 | /** @brief Return the direction from the origin base cell to the neighbor. |
879 | * Returns INVALID_DIGIT if the base cells are not neighbors. |
880 | */ |
881 | Direction _getBaseCellDirection(int originBaseCell, int neighboringBaseCell) { |
882 | for (Direction dir = CENTER_DIGIT; dir < NUM_DIGITS; dir++) { |
883 | int testBaseCell = _getBaseCellNeighbor(originBaseCell, dir); |
884 | if (testBaseCell == neighboringBaseCell) { |
885 | return dir; |
886 | } |
887 | } |
888 | return INVALID_DIGIT; |
889 | } |
890 | |
891 | /** |
892 | * res0IndexCount returns the number of resolution 0 indexes |
893 | * |
894 | * @return int count of resolution 0 indexes |
895 | */ |
896 | int H3_EXPORT(res0IndexCount)() { return NUM_BASE_CELLS; } |
897 | |
898 | /** |
899 | * getRes0Indexes generates all base cells storing them into the provided |
900 | * memory pointer. Buffer must be of size NUM_BASE_CELLS * sizeof(H3Index). |
901 | * |
902 | * @param out H3Index* the memory to store the resulting base cells in |
903 | */ |
904 | void H3_EXPORT(getRes0Indexes)(H3Index* out) { |
905 | for (int bc = 0; bc < NUM_BASE_CELLS; bc++) { |
906 | H3Index baseCell = H3_INIT; |
907 | H3_SET_MODE(baseCell, H3_HEXAGON_MODE); |
908 | H3_SET_BASE_CELL(baseCell, bc); |
909 | out[bc] = baseCell; |
910 | } |
911 | } |