in modules/aggregation-layers/src/contour-layer/marching-squares.js [35:108]
export function getCode(opts) {
// Assumptions
// Origin is on bottom-left , and X increase to right, Y to top
// When processing one cell, we process 4 cells, by extending row to top and on column to right
// to create a 2X2 cell grid
const {cellWeights, x, y, width, height} = opts;
let threshold = opts.threshold;
if (opts.thresholdValue) {
log.deprecated('thresholdValue', 'threshold')();
threshold = opts.thresholdValue;
}
const isLeftBoundary = x < 0;
const isRightBoundary = x >= width - 1;
const isBottomBoundary = y < 0;
const isTopBoundary = y >= height - 1;
const isBoundary = isLeftBoundary || isRightBoundary || isBottomBoundary || isTopBoundary;
const weights = {};
const codes = {};
// TOP
if (isLeftBoundary || isTopBoundary) {
codes.top = 0;
} else {
weights.top = cellWeights[(y + 1) * width + x];
codes.top = getVertexCode(weights.top, threshold);
}
// TOP-RIGHT
if (isRightBoundary || isTopBoundary) {
codes.topRight = 0;
} else {
weights.topRight = cellWeights[(y + 1) * width + x + 1];
codes.topRight = getVertexCode(weights.topRight, threshold);
}
// RIGHT
if (isRightBoundary || isBottomBoundary) {
codes.right = 0;
} else {
weights.right = cellWeights[y * width + x + 1];
codes.right = getVertexCode(weights.right, threshold);
}
// CURRENT
if (isLeftBoundary || isBottomBoundary) {
codes.current = 0;
} else {
weights.current = cellWeights[y * width + x];
codes.current = getVertexCode(weights.current, threshold);
}
const {top, topRight, right, current} = codes;
let code = -1;
if (Number.isFinite(threshold)) {
code = (top << 3) | (topRight << 2) | (right << 1) | current;
}
if (Array.isArray(threshold)) {
code = (top << 6) | (topRight << 4) | (right << 2) | current;
}
let meanCode = 0;
// meanCode is only needed for saddle cases, and they should
// only occur when we are not processing a cell on boundary
// because when on a boundary either, bottom-row, top-row, left-column or right-column will have both 0 codes
if (!isBoundary) {
meanCode = getVertexCode(
(weights.top + weights.topRight + weights.right + weights.current) / 4,
threshold
);
}
return {code, meanCode};
}