Если вам нужно повторить одну кривую, то самое простое - определить ее только один раз, а вместо того, чтобы рассчитывать все новые точки, просто заставить свой холст двигаться.
Думайте о своем холсте как о подвижный лист бумаги. Вы можете использовать ctx.setTransform
, ctx.rotate
, ctx.translate
et c. «переместить» этот холст, держа ручку в том же положении.
Таким образом, вы можете один раз определить свой путь и нарисовать его несколько раз в разных позициях:
var canvas = document.getElementById('mycanvas');
var ctx = canvas.getContext('2d');
const angle = 0.1; // by which amount we rotate at each iteration
function draw() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
const cx = window.innerWidth/2;
const cy = window.innerHeight/2;
const rad = Math.max(cx, cy) * 2;
// controls the position of all the control points,
// you might want to set each manually instead
const binding = rad/Math.PI;
let theta = 0;
// we move our canvas so its center is now coordinates 0,0
ctx.setTransform(1, 0, 0, 1, cx, cy);
// a single path declaration
ctx.beginPath();
for( theta; theta < Math.PI*4; theta += angle ) {
ctx.rotate(angle); // apply the rotation
ctx.moveTo(0, 0); // current center
// always the same parameters for the bezier curve
ctx.bezierCurveTo(0, -binding, rad, -binding, rad, 0);
}
// even these can be part of the same single path
for ( i=rad/8; i < rad; i += rad/8 ) {
ctx.moveTo(i, 0); // to avoid the segment from center
ctx.arc(0, 0, i, 0, 2 * Math.PI, false);
}
// a single stroke of the whole path
ctx.stroke();
// to reset the coordinate 0,0 at top left corner
ctx.setTransform(1,0,0,1,0,0);
}
draw();
onresize = draw;
root,body { background: white; margin: 0 }
canvas { display: block; }
<canvas id="mycanvas"></canvas>