in h3_vertex.c [53:107]
static H3Error vertexRotations(H3Index cell, int *out) {
// Get the face and other info for the origin
FaceIJK fijk;
H3Error err = _h3ToFaceIjk(cell, &fijk);
if (err) {
return err;
}
int baseCell = H3_EXPORT(getBaseCellNumber)(cell);
int cellLeadingDigit = _h3LeadingNonZeroDigit(cell);
// get the base cell face
FaceIJK baseFijk;
_baseCellToFaceIjk(baseCell, &baseFijk);
int ccwRot60 = _baseCellToCCWrot60(baseCell, fijk.face);
if (_isBaseCellPentagon(baseCell)) {
// Find the appropriate direction-to-face mapping
PentagonDirectionFaces dirFaces;
// We never hit the end condition
int p = 0;
for (; p < NUM_PENTAGONS; p++) {
if (pentagonDirectionFaces[p].baseCell == baseCell) {
dirFaces = pentagonDirectionFaces[p];
break;
}
}
if (p == NUM_PENTAGONS) {
return E_FAILED;
}
// additional CCW rotation for polar neighbors or IK neighbors
if (fijk.face != baseFijk.face &&
(_isBaseCellPolarPentagon(baseCell) ||
fijk.face ==
dirFaces.faces[IK_AXES_DIGIT - DIRECTION_INDEX_OFFSET])) {
ccwRot60 = (ccwRot60 + 1) % 6;
}
// Check whether the cell crosses a deleted pentagon subsequence
if (cellLeadingDigit == JK_AXES_DIGIT &&
fijk.face ==
dirFaces.faces[IK_AXES_DIGIT - DIRECTION_INDEX_OFFSET]) {
// Crosses from JK to IK: Rotate CW
ccwRot60 = (ccwRot60 + 5) % 6;
} else if (cellLeadingDigit == IK_AXES_DIGIT &&
fijk.face ==
dirFaces.faces[JK_AXES_DIGIT - DIRECTION_INDEX_OFFSET]) {
// Crosses from IK to JK: Rotate CCW
ccwRot60 = (ccwRot60 + 1) % 6;
}
}
*out = ccwRot60;
return E_SUCCESS;
}