createCoordinatesConverter = function(viewportBox, originalBox) {
const transform = getTransform();
return {
toViewport(point) {
return transform.apply(point)
},
toOriginal(point) {
return transform.invert(point)
}
}
function getTransform() {
const scaleTransform = getScaleTransform();
return getTranslatedTransform(scaleTransform)
}
function getScaleTransform() {
const wK = viewportBox.width / originalBox.width;
const hK = viewportBox.height / originalBox.height;
const k = Math.min(wK, hK);
return d3.zoomIdentity.scale(k);
}
function getTranslatedTransform(scaleTransform) {
const originalCenter = originalBox.center;
const viewportCenter = viewportBox.center;
const transformedCenter = scaleTransform.invert(viewportCenter);
const tx = transformedCenter[0] - originalCenter[0];
const ty = transformedCenter[1] - originalCenter[1];
return scaleTransform.translate(tx, ty);
}
}