Ответ MariaGurkina (@MariaGurkina) очень сильно помог, я пишу этот ответ, что бы закрыть (предсказуемый) баг с отслеживанием клика, вытекающий из его ответа. Так как теперь нельзя следить за нажатием именно в правый верхний угол да и некоторые участки картинки не перетаскиваются, потому что для координат, картинка не повёрнута.
Мне нужно следить за нажатием на правый верхний угол (для вращения), так что я выбрал способ через поиск всех координат с условием поворота.
Формулу брал от
сюда
в vpoints последняя ячейка используется для записи минимального и максимального значения координат, что бы при нажатии на любое место картинки, срабатывала слежка за курсором
// 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
}
Извените, нужно будет убраться в коде, но для понимания сути подойдёт