Use Geometric.js to scale a polygon.
xxxxxxxxxx
<html>
<head>
<style>
body {
margin: 0;
font-family: "Helvetica Neue", sans-serif;
}
.input-wrapper {
padding: 10px;
position: absolute;
}
polygon {
fill: steelblue;
}
</style>
</head>
<body>
<div class="input-wrapper">
<div>
Size: <span class="scale-factor">100%</span>
</div>
<input type="range" min="10" max="200" value="100" />
</div>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script src="https://unpkg.com/geometric@1.0.10/build/geometric.min.js"></script>
<script>
var width = window.innerWidth,
height = window.innerHeight,
center = [width / 2, height / 2],
vertices = [
[center[0] - 100, center[1] - 100],
[center[0], center[1] - 130],
[center[0] + 100, center[1] - 100],
[center[0] + 150, center[1]],
[center[0] + 100, center[1] + 100],
[center[0], center[1] + 130],
[center[0] - 100, center[1] + 100],
[center[0] - 150, center[1]]
];
var input = d3.select("input");
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
var polygon = svg.append("polygon")
.attr("points", vertices.join(" "));
input.on("input", _ => {
var scaleFactor = +input.property("value") / 100;
var newVertices = geometric.polygonScale(vertices, scaleFactor);
polygon.attr("points", newVertices.join(" "));
d3.select(".scale-factor").text(Math.round(scaleFactor * 100) + "%");
});
</script>
</body>
</html>
https://d3js.org/d3.v5.min.js
https://unpkg.com/geometric@1.0.10/build/geometric.min.js