Преобразования в элементе Canvas в QML

Добавлено 22 апреля 2022 в 02:30

Элемент Canvas позволяет преобразовывать систему координат несколькими способами. Это очень похоже на преобразование, предлагаемое элементами QML. У вас есть возможность масштабировать (scale), вращать (rotate), переносить систему координат (translate). Независимо от QML, начало координат преобразования всегда является началом координат холста. Например, чтобы масштабировать путь вокруг его центра, вам нужно будет перевести начало координат холста в центр этого пути. Также можно применить более сложное преобразование с помощью метода transform.

import QtQuick

Canvas {
    id: root
    width: 240; height: 120
    onPaint: {
        var ctx = getContext("2d")
            var ctx = getContext("2d");
            ctx.lineWidth = 4;
            ctx.strokeStyle = "blue";

            // переносим систему координат x/y
            ctx.translate(root.width/2, root.height/2);

            // рисуем путь
            ctx.beginPath();
            ctx.rect(-20, -20, 40, 40);
            ctx.stroke();

            // вращаем систему координат
            ctx.rotate(Math.PI/4);
            ctx.strokeStyle = "green";

            // рисуем путь
            ctx.beginPath();
            ctx.rect(-20, -20, 40, 40);
            ctx.stroke();
    }
}
пример

Помимо переноса, Canvas также позволяет масштабировать с помощью scale(x, y) вокруг осей x и y, поворачивать с помощью rotate(угол), где угол задается в радианах (360 градусов = 2 * Math.PI) и использовать матричное преобразование с использованием setTransform(m11, m12, m21, m22, dx, dy).

Подсказка

Для сброса любого преобразования вы можете вызвать функцию resetTransform(), чтобы установить матрицу преобразования обратно в исходное состояние:

ctx.resetTransform()

Теги

CanvasGUI / Графический интерфейс пользователяQMLQtQtQuickПрограммирование

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.