if (
item.x <= e.offsetX & item.x+item.width >= e.offsetX &
item.y <= e.offsetY & item.y+item.height >= e.offsetY
){
if (!this.canvas.offsetX) this.canvas.offsetX = e.offsetX - item.x
if (!this.canvas.offsetY) this.canvas.offsetY = e.offsetY - item.y
item.x = e.offsetX - this.canvas.offsetX
item.y = e.offsetY - this.canvas.offsetY
this.updateImageCanvas()
}
updateImageCanvas() {
this.canvas.ctx.clearRect(0, 0, this.canvas.item.width, this.canvas.item.height);
let setting = this.catalogItems[this.activeCatalogItem].setting
this.canvas.ctx.translate(setting.product.width/2, -setting.product.height/2); // вот тут сложности, не понимаю логику как сделать её по центру
this.canvas.ctx.rotate((90 * Math.PI) / 180) // поворачиваю на 90 градусов
this.canvas.ctx.drawImage(
setting.product.canvasImage,
setting.product.x,
setting.product.y,
setting.product.width,
setting.product.height
)
this.canvas.ctx.rotate((0 * Math.PI) / 180) // возвращаю в норму градусы
this.canvas.ctx.setTransform(1, 0, 0, 1, 0, 0); // это сбрасывает матрицу, не совсем понимаю зачем, но без этого нет стабильности
this.printImageSetting() // добавляет рамку управления вокруг изображения (тянуть, поворачивать, перетаскивать)
},
updateImageCanvas() {
this.canvas.ctx.clearRect(0, 0, this.canvas.item.width, this.canvas.item.height);
let setting = this.catalogItems[this.activeCatalogItem].setting;
// Сохраняем текущее состояние контекста
this.canvas.ctx.save();
// Рассчитываем новые координаты для центрированного поворота
let centerX = setting.product.x + setting.product.width / 2;
let centerY = setting.product.y + setting.product.height / 2;
// Применяем трансформации
this.canvas.ctx.translate(centerX, centerY);
this.canvas.ctx.rotate((90 * Math.PI) / 180);
// Отрисовываем изображение
this.canvas.ctx.drawImage(
setting.product.canvasImage,
-setting.product.width / 2,
-setting.product.height / 2,
setting.product.width,
setting.product.height
);
// Восстанавливаем состояние контекста
this.canvas.ctx.restore();
this.printImageSetting();
}
// angle - угол в радианах
let angle = item.rotate * (Math.PI/180)
// center - точка, вокруг которой происходит вращение
let center = {
x: item.x + item.width/2,
y: item.y + item.height/2,
}
// points - массив с координатами вершин прямоугольника
let points = [
{
x: item.x,
y: item.y
},
{
x: item.x + item.width,
y: item.y
},
{
x: item.x + item.width,
y: item.y + item.height
},
{
x: item.x,
y: item.y + item.height
},
]
// vpoints - массив с повернутыми координатами вершин
let vpoints = [{}, {}, {}, {}, {
max: {
x:0,
y:0
},
min: {
x: item.x,
y: item.y
}
}]
let ssin = Math.sin(angle);
let scos = Math.cos(angle);
for (let i = 0; i < points.length; i++) {
vpoints[i].x = center.x + (points[i].x - center.x) * scos - (points[i].y - center.y) * ssin;
if(vpoints[i].x > vpoints[vpoints.length-1].max.x) vpoints[vpoints.length-1].max.x = vpoints[i].x
if(vpoints[i].x < vpoints[vpoints.length-1].min.x) vpoints[vpoints.length-1].min.x = vpoints[i].x
vpoints[i].y = center.y + (points[i].x - center.x) * ssin + (points[i].y - center.y) * scos;
if(vpoints[i].y > vpoints[vpoints.length-1].max.y) vpoints[vpoints.length-1].max.y = vpoints[i].y
if(vpoints[i].y < vpoints[vpoints.length-1].min.y) vpoints[vpoints.length-1].min.y = vpoints[i].y
}
// rotate (упрощённая)
if (
this.canvas.rotate ||
vpoints[1].x-6 <= e.offsetX && vpoints[1].x+6 >= e.offsetX &&
vpoints[1].y-6 <= e.offsetY && vpoints[1].y+6 >= e.offsetY
){
console.log('rotate');
this.canvas.rotate = true
item.rotate = e.offsetY
this.updateImageCanvas()
return
}
// move
if (
vpoints[vpoints.length-1].min.x <= e.offsetX && vpoints[vpoints.length-1].max.x >= e.offsetX &&
vpoints[vpoints.length-1].min.y <= e.offsetY && vpoints[vpoints.length-1].max.y >= e.offsetY
){
if (!this.canvas.offsetX) this.canvas.offsetX = e.offsetX - item.x
if (!this.canvas.offsetY) this.canvas.offsetY = e.offsetY - item.y
item.x = e.offsetX - this.canvas.offsetX
item.y = e.offsetY - this.canvas.offsetY
this.updateImageCanvas()
return
}