getScales = function(g, settings) {
settings = settings || {};
settings.canvasOversampling = settings.canvasOversampling || 2;
settings.canvasWidth = settings.canvasWidth || 500;
settings.canvasHeight = settings.canvasHeight || 500;
settings.canvasMargin = (settings.canvasMargin!==undefined) ? settings.canvasMargin : 24 * settings.canvasOversampling;
settings.nodeSize = settings.nodeSize || 0.5 * settings.canvasOversampling;
var xDomain = d3.extent(
g.nodes().map(nid => g.getNodeAttribute(nid, "x"))
);
var xRange = [0 + settings.nodeSize + settings.canvasMargin, settings.canvasWidth * settings.canvasOversampling - settings.nodeSize - settings.canvasMargin];
var yDomain = d3.extent(
g.nodes().map(nid => g.getNodeAttribute(nid, "y"))
);
var yRange = [0 + settings.nodeSize + settings.canvasMargin, settings.canvasHeight * settings.canvasOversampling - settings.nodeSize - settings.canvasMargin];
if ((xRange[1]-xRange[0])/(xDomain[1]-xDomain[0])>(yRange[1]-yRange[0])/(yDomain[1]-yDomain[0])) {
const xMiddle = (xRange[0]+xRange[1]) / 2;
const newRange = yRange[1] - yRange[0];
xRange = [xMiddle - newRange/2, xMiddle + newRange/2];
} else {
const yMiddle = (yRange[0]+yRange[1]) / 2;
const newRange = xRange[1] - xRange[0];
yRange = [yMiddle - newRange/2, yMiddle + newRange/2];
}
yRange.reverse();
var x = d3.scaleLinear()
.domain(xDomain)
.range(xRange);
var y = d3.scaleLinear()
.domain(yDomain)
.range(yRange);
return {x, y}
}