• Не могу понять логику центрированного поворота в canvas.js, кто то может объяснить?

    DonTraffic
    @DonTraffic Автор вопроса
    Frontend-developer
    Ответ 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
            }


    Извените, нужно будет убраться в коде, но для понимания сути подойдёт
    Ответ написан
    Комментировать
  • Как имитировать nuxt-link через функцию?

    DonTraffic
    @DonTraffic Автор вопроса
    Frontend-developer
    router.push()
    источник: https://router.vuejs.org/guide/essentials/navigati...
    Комментарий пользователя "Дмитрий Кузнецов Дмитрий Кузнецов "
    Ответ написан
    Комментировать
  • Можно ли задать масив внутри многомерного массива?

    DonTraffic
    @DonTraffic Автор вопроса
    Frontend-developer
    комментарий @RAX7
    array[1][0][1]
    Ответ написан
    Комментировать
  • Как с помощью JS взять значение стиля order?

    DonTraffic
    @DonTraffic Автор вопроса
    Frontend-developer
    var text = document.getElementById("text");
    console.log(getComputedStyle(text).order);
    Ответ написан
    Комментировать
  • Как сделать эффект параллакса в отдельном блоке?

    DonTraffic
    @DonTraffic Автор вопроса
    Frontend-developer
    Использовать библиотеку parallax.js
    Ответ написан
    Комментировать