in src/h3lib/lib/h3Index.c [788:829]
void _h3ToFaceIjk(H3Index h, FaceIJK* fijk) {
int baseCell = H3_GET_BASE_CELL(h);
// adjust for the pentagonal missing sequence; all of sub-sequence 5 needs
// to be adjusted (and some of sub-sequence 4 below)
if (_isBaseCellPentagon(baseCell) && _h3LeadingNonZeroDigit(h) == 5)
h = _h3Rotate60cw(h);
// start with the "home" face and ijk+ coordinates for the base cell of c
*fijk = baseCellData[baseCell].homeFijk;
if (!_h3ToFaceIjkWithInitializedFijk(h, fijk))
return; // no overage is possible; h lies on this face
// if we're here we have the potential for an "overage"; i.e., it is
// possible that c lies on an adjacent face
CoordIJK origIJK = fijk->coord;
// if we're in Class III, drop into the next finer Class II grid
int res = H3_GET_RESOLUTION(h);
if (isResClassIII(res)) {
// Class III
_downAp7r(&fijk->coord);
res++;
}
// adjust for overage if needed
// a pentagon base cell with a leading 4 digit requires special handling
int pentLeading4 =
(_isBaseCellPentagon(baseCell) && _h3LeadingNonZeroDigit(h) == 4);
if (_adjustOverageClassII(fijk, res, pentLeading4, 0) != NO_OVERAGE) {
// if the base cell is a pentagon we have the potential for secondary
// overages
if (_isBaseCellPentagon(baseCell)) {
while (_adjustOverageClassII(fijk, res, 0, 0) != NO_OVERAGE)
continue;
}
if (res != H3_GET_RESOLUTION(h)) _upAp7r(&fijk->coord);
} else if (res != H3_GET_RESOLUTION(h)) {
fijk->coord = origIJK;
}
}