mh-two-thousand-and-two
2024-03-25 b8c93990f3fa5e50a8aca16bdc9c2758168aa0fd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
import smoothBezier from './smoothBezier';
import { VectorArray } from '../../core/vector';
import PathProxy from '../../core/PathProxy';
 
export function buildPath(
    ctx: CanvasRenderingContext2D | PathProxy,
    shape: {
        points: VectorArray[],
        smooth?: number
        smoothConstraint?: VectorArray[]
    },
    closePath: boolean
) {
    const smooth = shape.smooth;
    let points = shape.points;
    if (points && points.length >= 2) {
        if (smooth) {
            const controlPoints = smoothBezier(
                points, smooth, closePath, shape.smoothConstraint
            );
 
            ctx.moveTo(points[0][0], points[0][1]);
            const len = points.length;
            for (let i = 0; i < (closePath ? len : len - 1); i++) {
                const cp1 = controlPoints[i * 2];
                const cp2 = controlPoints[i * 2 + 1];
                const p = points[(i + 1) % len];
                ctx.bezierCurveTo(
                    cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1]
                );
            }
        }
        else {
            ctx.moveTo(points[0][0], points[0][1]);
            for (let i = 1, l = points.length; i < l; i++) {
                ctx.lineTo(points[i][0], points[i][1]);
            }
        }
 
        closePath && ctx.closePath();
    }
}