redrawPlot = (psi) => {
const data = reuleaux.map((d) => Object.assign({}, d));
data.map((d) => Object.assign(d, rotate(d, psi, 0, 0)));
const extentX = d3.extent(data, (d) => d.x),
extentY = d3.extent(data, (d) => d.y),
center = {
x: -extentX[0],
y: -extentY[0]
},
pnts = data.slice(pntIdx, pntIdx + 1);
data.map((d) => {
d.x -= extentX[0];
d.y -= extentY[0];
});
{
const limit = 1000;
trace.centerTrace.push(Object.assign({}, center));
trace.pntTrace.push(Object.assign({}, pnts[0]));
trace.centerTrace[trace.centerTrace.length - 1].distance =
trace.centerTrace.length < 2
? undefined
: distance(
trace.centerTrace[trace.centerTrace.length - 1],
trace.centerTrace[trace.centerTrace.length - 2]
);
trace.pntTrace[trace.pntTrace.length - 1].distance =
trace.pntTrace.length < 2
? undefined
: distance(
trace.pntTrace[trace.pntTrace.length - 1],
trace.pntTrace[trace.pntTrace.length - 2]
);
if (trace.centerTrace.length > limit) trace.centerTrace.shift();
if (trace.pntTrace.length > limit) trace.pntTrace.shift();
}
const scale1 = d3
.scaleLinear()
.domain(d3.extent(trace.pntTrace, (d) => d.distance))
.range([0.1, 1]),
scale2 = d3
.scaleLinear()
.domain(d3.extent(trace.centerTrace, (d) => d.distance))
.range([0.1, 1]);
return Plot.plot({
width: 500,
x: { nice: true, grid: true },
y: {
nice: true,
grid: true,
reverse: true
},
color: { legend: true, scheme: "Tableau10" },
aspectRatio: 1.0,
marks: [
Plot.dot(data, { x: "x", y: "y", fill: "circleIdx", opacity: 0.5, r: 4 }),
Plot.dot(pnts, {
x: "x",
y: "y",
stroke: "circleIdx",
r: 5
}),
Plot.dot(trace.pntTrace, {
x: "x",
y: "y",
fill: "circleIdx",
r: "distance",
opacity: (d) => scale1(d.distance)
}),
Plot.dot(trace.centerTrace, {
x: "x",
y: "y",
fill: "gray",
r: "distance",
opacity: (d) => scale2(d.distance)
}),
Plot.dot([center], { x: "x", y: "y", fill: "red", r: 5 }),
Plot.line([center, pnts[0]], {
x: "x",
y: "y",
stroke: pnts[0].circleIdx
})
]
});
}