private updateMidpoints()

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,
            });
        });
    }