in src/canvastools/ts/CanvasTools/Region/Component/MidpointComponent.ts [103:154]
private updateMidpoints(bezierControls: CubicBezierIndex, regionLineSegments: ILineSegment[]) {
const toDelete: number[] = [];
const toAdd: number[] = [];
const toUpdate: number[] = [];
// first check each line segment
regionLineSegments.forEach((_line, idx) => {
// this line segment has no bezier control data and doesn't have a midpoint element
// need to add one
if (!bezierControls[idx] && !this.midpointElements[idx]) {
toAdd.push(idx);
// this line segment has no bezier control data and does have a midpoint element
// need to update it
} else if (!bezierControls[idx] && this.midpointElements[idx]) {
toUpdate.push(idx);
// this line segment does have bezier control data and does have a midpoint element
// need to remove it
} else if (bezierControls[idx] && this.midpointElements[idx]) {
toDelete.push(idx);
}
});
// next check existing midpoint elements to see if
// any are mapped to line segment that's been removed
Object.entries(this.midpointElements).forEach(([idx]) => {
if (!regionLineSegments[idx]) {
toDelete.push(Number(idx));
}
});
toDelete.forEach((idx) => {
this.midpointElements[idx].remove();
delete this.midpointElements[idx];
});
toAdd.forEach((idx) => {
if (this.midpointElements[idx]) {
this.midpointElements[idx].remove();
}
const midpoint = this.createMidpoint(
this.paper,
regionLineSegments[idx].pointsAlongLine.half.x,
regionLineSegments[idx].pointsAlongLine.half.y
);
this.midpointElements[idx] = midpoint;
this.midpointNode.add(midpoint);
this.subscribeMidpointToEvents(midpoint, idx);
});
toUpdate.forEach((idx) => {
const line = regionLineSegments[idx];
this.midpointElements[idx].attr({
cx: line.pointsAlongLine.half.x,
cy: line.pointsAlongLine.half.y,
});
});
}