Создайте путь один раз
Вы используете объект Path2D, который можно использовать повторно.
Если вы создаете треугольник, уже центрированный в его начале (или любом другом пути по этому вопросу), его тривиально повернуть.
Повторное использование объекта пути также выполняется намного быстрее, если вам нужно много визуализировать.
Функция для создания пути из набора точек. Он автоматически центрирует путь к своему собственному источнику (определяется по среднему значению его точек)
const point = (x, y) => ({x, y});
function createPath(...points) {
var cx = 0; cy = 0;
for (const p of points) {
cx += p.x;
cy += p.y;
}
cx /= points.length;
cy /= points.length;
const path = new Path2d;
for (const p of points) { path.lineTo(p.x - cx, p.y - cy); }
path.closePath();
return path;
}
Чтобы создать треугольник
const triangle = createPath(point(0,-25), point(-50,-75), point(-100,-25));
Затем вы можете сделать так, чтобы он вращался вокруг своего собственного источникаwith
function drawPath(path, x, y, angle) {
ctx.setTransform(1, 0, 0, 1, x, y);
ctx.rotate(angle);
ctx.stroke(path);
}
Пример
Показывает, как создавать различные фигуры с центром на их средствах. Каждая фигура - это путь, созданный один раз, а затем отображаемый по мере необходимости.
const point = (x, y) => ({x, y});
const triangle = createPath(point(0,-25), point(-50,-75), point(-100,-25));
const rectangle = createPath(point(0,-25), point(-50,-25), point(-50,-125), point(0,-125));
const thing = createPath(point(0,-12), point(-25,-12), point(-25,-62), point(0,-62), point(22,-35));
function drawPath(path, x, y, angle) {
ctx.setTransform(1, 0, 0, 1, x, y);
ctx.rotate(angle);
ctx.stroke(path);
}
function renderLoop(time) {
ctx.clearRect(0, 0, can.width, can.height);
drawPath(triangle, 75, 74, time / 1000 * Math.PI); //360 every 2 second
drawPath(rectangle, 125, 125, time / 2000 * Math.PI); //360 every 4 second
drawPath(thing, 125, 100, time / 3000 * Math.PI);
ctx.setTransform(1, 0, 0, 1, 0, 0);
requestAnimationFrame(renderLoop);
}
requestAnimationFrame(renderLoop);
const can = Object.assign(document.createElement("canvas"), {width: 200, height: 200});
document.body.appendChild(can);
const ctx = can.getContext("2d");
function createPath(...points) {
var cx = 0; cy = 0;
for (const p of points) {
cx += p.x;
cy += p.y;
}
cx /= points.length;
cy /= points.length;
const path = new Path2D;
for (const p of points) {
path.lineTo(p.x - cx , p.y - cy);
}
path.closePath();
return path;
}