in src/h3lib/include/polygonAlgos.h [137:182]
void GENERIC_LOOP_ALGO(bboxFrom)(const TYPE* loop, BBox* bbox) {
// Early exit if there are no vertices
if (IS_EMPTY(loop)) {
*bbox = (BBox){0};
return;
}
bbox->south = DBL_MAX;
bbox->west = DBL_MAX;
bbox->north = -DBL_MAX;
bbox->east = -DBL_MAX;
double minPosLon = DBL_MAX;
double maxNegLon = -DBL_MAX;
bool isTransmeridian = false;
double lat;
double lon;
GeoCoord coord;
GeoCoord next;
INIT_ITERATION;
while (true) {
ITERATE(loop, coord, next);
lat = coord.lat;
lon = coord.lon;
if (lat < bbox->south) bbox->south = lat;
if (lon < bbox->west) bbox->west = lon;
if (lat > bbox->north) bbox->north = lat;
if (lon > bbox->east) bbox->east = lon;
// Save the min positive and max negative longitude for
// use in the transmeridian case
if (lon > 0 && lon < minPosLon) minPosLon = lon;
if (lon < 0 && lon > maxNegLon) maxNegLon = lon;
// check for arcs > 180 degrees longitude, flagging as transmeridian
if (fabs(lon - next.lon) > M_PI) {
isTransmeridian = true;
}
}
// Swap east and west if transmeridian
if (isTransmeridian) {
bbox->east = maxNegLon;
bbox->west = minPosLon;
}
}