in src/h3lib/lib/faceijk.c [851:910]
Overage _adjustOverageClassII(FaceIJK* fijk, int res, int pentLeading4,
int substrate) {
Overage overage = NO_OVERAGE;
CoordIJK* ijk = &fijk->coord;
// get the maximum dimension value; scale if a substrate grid
int maxDim = maxDimByCIIres[res];
if (substrate) maxDim *= 3;
// check for overage
if (substrate && ijk->i + ijk->j + ijk->k == maxDim) // on edge
overage = FACE_EDGE;
else if (ijk->i + ijk->j + ijk->k > maxDim) // overage
{
overage = NEW_FACE;
const FaceOrientIJK* fijkOrient;
if (ijk->k > 0) {
if (ijk->j > 0) // jk "quadrant"
fijkOrient = &faceNeighbors[fijk->face][JK];
else // ik "quadrant"
{
fijkOrient = &faceNeighbors[fijk->face][KI];
// adjust for the pentagonal missing sequence
if (pentLeading4) {
// translate origin to center of pentagon
CoordIJK origin;
_setIJK(&origin, maxDim, 0, 0);
CoordIJK tmp;
_ijkSub(ijk, &origin, &tmp);
// rotate to adjust for the missing sequence
_ijkRotate60cw(&tmp);
// translate the origin back to the center of the triangle
_ijkAdd(&tmp, &origin, ijk);
}
}
} else // ij "quadrant"
fijkOrient = &faceNeighbors[fijk->face][IJ];
fijk->face = fijkOrient->face;
// rotate and translate for adjacent face
for (int i = 0; i < fijkOrient->ccwRot60; i++) _ijkRotate60ccw(ijk);
CoordIJK transVec = fijkOrient->translate;
int unitScale = unitScaleByCIIres[res];
if (substrate) unitScale *= 3;
_ijkScale(&transVec, unitScale);
_ijkAdd(ijk, &transVec, ijk);
_ijkNormalize(ijk);
// overage points on pentagon boundaries can end up on edges
if (substrate && ijk->i + ijk->j + ijk->k == maxDim) // on edge
overage = FACE_EDGE;
}
return overage;
}