Класс QMatrix
Класс QMatrix задаёт 2D-преобразования системы координат. Подробнее...
| Заголовок: | #include <QMatrix> |
| qmake: | QT += gui |
Этот класс устарел. Он предоставлен для обеспечения работы старого исходного кода. Настоятельно не рекомендуется использовать его в новом коде.
Открытые функции
| QMatrix() | |
| QMatrix(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy) | |
| QMatrix(QMatrix &&other) | |
| QMatrix(const QMatrix &matrix) | |
| qreal | m11() const |
| qreal | m12() const |
| qreal | m21() const |
| qreal | m22() const |
| qreal | determinant() const |
| qreal | dx() const |
| qreal | dy() const |
| QMatrix | inverted(bool *invertible = Q_NULLPTR) const |
| bool | isIdentity() const |
| bool | isInvertible() const |
| void | map(qreal x, qreal y, qreal *tx, qreal *ty) const |
| void | map(int x, int y, int *tx, int *ty) const |
| QPoint | map(const QPoint &point) const |
| QPointF | map(const QPointF &point) const |
| QLine | map(const QLine &line) const |
| QLineF | map(const QLineF &line) const |
| QPolygonF | map(const QPolygonF &polygon) const |
| QPolygon | map(const QPolygon &polygon) const |
| QRegion | map(const QRegion ®ion) const |
| QPainterPath | map(const QPainterPath &path) const |
| QRectF | mapRect(const QRectF &rectangle) const |
| QRect | mapRect(const QRect &rectangle) const |
| QPolygon | mapToPolygon(const QRect &rectangle) const |
| void | reset() |
| QMatrix & | rotate(qreal degrees) |
| QMatrix & | scale(qreal sx, qreal sy) |
| void | setMatrix(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy) |
| QMatrix & | shear(qreal sh, qreal sv) |
| QMatrix & | translate(qreal dx, qreal dy) |
| operator QVariant() const | |
| bool | operator!=(const QMatrix &matrix) const |
| QMatrix | operator*(const QMatrix &matrix) const |
| QMatrix & | operator*=(const QMatrix &matrix) |
| QMatrix & | operator=(QMatrix &&other) |
| QMatrix & | operator=(const QMatrix &matrix) |
| bool | operator==(const QMatrix &matrix) const |
Связанные внешние функции
| bool | qFuzzyCompare(const QMatrix &m1, const QMatrix &m2) |
| uint | qHash(const QMatrix &key, uint seed = 0) |
| QPoint | operator*(const QPoint &point, const QMatrix &matrix) |
| QPointF | operator*(const QPointF &point, const QMatrix &matrix) |
| QLineF | operator*(const QLineF &line, const QMatrix &matrix) |
| QLine | operator*(const QLine &line, const QMatrix &matrix) |
| QPolygonF | operator*(const QPolygonF &polygon, const QMatrix &matrix) |
| QPolygon | operator*(const QPolygon &polygon, const QMatrix &matrix) |
| QRegion | operator*(const QRegion ®ion, const QMatrix &matrix) |
| QPainterPath | operator*(const QPainterPath &path, const QMatrix &matrix) |
| QDataStream & | operator<<(QDataStream &stream, const QMatrix &matrix) |
| QDataStream & | operator>>(QDataStream &stream, QMatrix &matrix) |
Подробное описание
Класс QMatrix задаёт 2D-преобразования системы координат.
Матрица задаёт способ перемещения, масштабирования, сдвига или поворота системы координат и обычно используется при рендеринге графики. QMatrix, в отличие от QTransform, не допускает перспективных преобразований. QTransform является рекомендуемым классом преобразований в Qt.
Объект QMatrix можно создать, используя функции setMatrix(), scale(), rotate(), translate() и shear(). В качестве альтернативы, его можно создать, применяя основные операции с матрицами. Матрицу также можно определить при создании объекта, и её можно сбросить до единичной матрицы (по умолчанию) с помощью функции reset().
Класс QMatrix поддерживает отображение графических примитивов: заданную точку, линию, многоугольник, область или путь рисования можно отобразить в системе координат, определённой этой матрицей, используя функцию map(). В случае прямоугольника его координаты можно преобразовать, используя функцию mapRect(). Прямоугольник также можно преобразовать в многоугольник (отобразить в системе координат, определённой этой матрицей) с помощью функции mapToPolygon().
QMatrix предоставляет функцию isIdentity(), которая возвращает true если матрица является единичной, и функцию isInvertible(), которая возвращает true если матрица невырожденная (т. е. AB = BA = I). Функция inverted() возвращает инвертированную копию этой матрицы, если она обратимая (в противном случае возвращает единичную матрицу). Кроме того, QMatrix предоставляет функцию determinant(), возвращающую определитель матрицы.
Наконец, класс QMatrix поддерживает умножение матриц, а объекты класса также можно передавать через потоки и сравнивать.
Отображение графики
При отрисовке графики матрица определяет преобразования, но фактическое преобразование выполняется процедурами рисования в QPainter.
По умолчанию QPainter работает в собственной системе координат ассоциированного устройства. Стандартная система координат QPaintDevice имеет начало в верхнем левом углу. Значения x увеличиваются вправо; значения y увеличиваются вниз. Подробное описание см. в документации по системе координат.
QPainter имеет функции для перемещения, масштабирования, наклона и поворота системы координат без использования QMatrix. Например:
void SimpleTransformation::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));
painter.drawRect(0, 0, 100, 100);
painter.rotate(45);
painter.setFont(QFont("Helvetica", 24));
painter.setPen(QPen(Qt::black, 1));
painter.drawText(20, 10, "QMatrix");
} |
Хотя эти функции очень удобны, может быть эффективнее создать QMatrix и вызвать QPainter::setMatrix(), если необходимо выполнить более одной операции преобразования. Например:
void CombinedTransformation::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));
painter.drawRect(0, 0, 100, 100);
QMatrix matrix;
matrix.translate(50, 50);
matrix.rotate(45);
matrix.scale(0.5, 1.0);
painter.setMatrix(matrix);
painter.setFont(QFont("Helvetica", 24));
painter.setPen(QPen(Qt::black, 1));
painter.drawText(20, 10, "QMatrix");
} |
Основные операции с матрицами
Объект QMatrix содержит 3x3 матрицу. Элементы dx и dy определяют горизонтальное и вертикальное смещение. Элементы m11 и m22 определяют горизонтальное и вертикальное масштабирование. Наконец, элементы m21 и m12 определяют горизонтальное и вертикальное наклонение.
QMatrix преобразует точку в плоскости в другую точку, используя следующие формулы:
x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy
Точка (x, y) — это исходная точка, а (x', y') — преобразованная точка. (x', y') можно преобразовать обратно в (x, y), выполнив ту же операцию с инвертированной (inverted()) матрицей.
Различные элементы матрицы можно установить при создании матрицы или используя функцию setMatrix() позже. Их также можно изменять, используя удобные функции translate(), rotate(), scale() и shear(). Текущие значения можно получить, используя функции m11(), m12(), m21(), m22(), dx() и dy().
Смещение — это самое простое преобразование. Установка dx и dy сместит систему координат на dx единиц по оси X и на dy единиц по оси Y. Масштабирование можно выполнить, установив m11 и m22. Например, установка m11 в 2 и m22 в 1,5 удвоит высоту и увеличит ширину на 50%. Единичная матрица имеет m11 и m22, установленные в 1 (все остальные установлены в 0), отображая точку на себя. Наклон контролируется m12 и m21. Установка этих элементов в значения, отличные от нуля, повернёт систему координат. Поворот достигается аккуратной настройкой обоих факторов наклона и факторов масштабирования.
Вот пример комбинированных преобразований с использованием основных операций с матрицами:
void BasicOperations::paintEvent(QPaintEvent *)
{
double pi = 3.14;
double a = pi/180 * 45.0;
double sina = sin(a);
double cosa = cos(a);
QMatrix translationMatrix(1, 0, 0, 1, 50.0, 50.0);
QMatrix rotationMatrix(cosa, sina, -sina, cosa, 0, 0);
QMatrix scalingMatrix(0.5, 0, 0, 1.0, 0, 0);
QMatrix matrix;
matrix = scalingMatrix * rotationMatrix * translationMatrix;
QPainter painter(this);
painter.setPen(QPen(Qt::blue, 1, Qt::DashLine));
painter.drawRect(0, 0, 100, 100);
painter.setMatrix(matrix);
painter.setFont(QFont("Helvetica", 24));
painter.setPen(QPen(Qt::black, 1));
painter.drawText(20, 10, "QMatrix");
} |
См. также QPainter, QTransform, Система координат, Пример аффинных преобразований и Пример преобразований.
Документация по функциям-членам
QMatrix::QMatrix()
Создаёт единичную матрицу.
Все элементы установлены в ноль, за исключением m11 и m22 (определяющих масштаб), которые установлены в 1.
См. также reset().
QMatrix::QMatrix(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy)
Создаёт матрицу с элементами m11, m12, m21, m22, dx и dy.
См. также setMatrix().
QMatrix::QMatrix(QMatrix &&other)
Конструктор перемещения-копирования.
QMatrix::QMatrix(const QMatrix &matrix)
Создаёт матрицу, являющуюся копией заданной matrix.
qreal QMatrix::m11() const
Возвращает коэффициент горизонтального масштабирования.
См. также scale() и Основные операции с матрицами.
qreal QMatrix::m12() const
Возвращает коэффициент вертикального наклона.
См. также shear() и Основные операции с матрицами.
qreal QMatrix::m21() const
Возвращает коэффициент горизонтального наклона.
См. также shear() и Основные операции с матрицами.
qreal QMatrix::m22() const
Возвращает коэффициент вертикального масштабирования.
См. также scale() и Основные операции с матрицами.
qreal QMatrix::determinant() const
Возвращает определитель матрицы.
Эта функция была добавлена в Qt 4.6.
qreal QMatrix::dx() const
Возвращает коэффициент горизонтального смещения.
См. также translate() и Основные операции с матрицами.
qreal QMatrix::dy() const
Возвращает коэффициент вертикального смещения.
См. также translate() и Основные операции с матрицами.
QMatrix QMatrix::inverted(bool *invertible = Q_NULLPTR) const
Возвращает инвертированную копию этой матрицы.
Если матрица является вырожденной (не обратимой), возвращается единичная матрица. Если invertible корректен (т. е. не равен 0), его значение устанавливается в true, если матрица обратима, в противном случае в false.
См. также isInvertible().
bool QMatrix::isIdentity() const
Возвращает true если матрица является единичной, в противном случае возвращает false.
См. также reset().
bool QMatrix::isInvertible() const
Возвращает true если матрица обратима, в противном случае возвращает false.
См. также inverted().
void QMatrix::map(qreal x, qreal y, qreal *tx, qreal *ty) const
Отображает заданные координаты x и y в системе координат, определённой этой матрицей. Результирующие значения помещаются в *tx и *ty соответственно.
Координаты преобразуются по следующим формулам:
x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy
Точка (x, y) — это исходная точка, а (x', y') — преобразованная точка.
См. также Основные операции с матрицами.
void QMatrix::map(int x, int y, int *tx, int *ty) const
Это перегруженная функция.
Преобразует заданные координаты x и y в систему координат, определённую данной матрицей. Результирующие значения помещаются в *tx и *ty соответственно. Обратите внимание, что преобразованные координаты округляются до ближайшего целого числа.
QPoint QMatrix::map(const QPoint &point) const
Это перегруженная функция.
Создаёт и возвращает объект QPoint, являющийся копией заданной точки point, преобразованной в систему координат, определённую этой матрицей. Обратите внимание, что преобразованные координаты округляются до ближайшего целого числа.
QPointF QMatrix::map(const QPointF &point) const
Это перегруженная функция.
Создаёт и возвращает объект QPointF, являющийся копией заданной точки point, преобразованной в систему координат, определённую данной матрицей.
QLine QMatrix::map(const QLine &line) const
Это перегруженная функция.
Создаёт и возвращает объект QLine, являющийся копией заданной линии line, преобразованной в систему координат, определённую этой матрицей. Обратите внимание, что преобразованные координаты округляются до ближайшего целого числа.
QLineF QMatrix::map(const QLineF &line) const
Это перегруженная функция.
Создаёт и возвращает объект QLineF, являющийся копией заданной линии line, преобразованной в систему координат, определённую данной матрицей.
QPolygonF QMatrix::map(const QPolygonF &polygon) const
Это перегруженная функция.
Создаёт и возвращает объект QPolygonF, являющийся копией заданного многоугольника polygon, преобразованного в систему координат, определённую данной матрицей.
QPolygon QMatrix::map(const QPolygon &polygon) const
Это перегруженная функция.
Создаёт и возвращает объект QPolygon, являющийся копией заданного многоугольника polygon, преобразованного в систему координат, определённую этой матрицей. Обратите внимание, что преобразованные координаты округляются до ближайшего целого числа.
QRegion QMatrix::map(const QRegion ®ion) const
Это перегруженная функция.
Создаёт и возвращает объект QRegion, являющийся копией заданной области region, преобразованной в систему координат, определённую этой матрицей.
Вызов данного метода может быть достаточно ресурсоёмким, если используются повороты или сдвиги.
QPainterPath QMatrix::map(const QPainterPath &path) const
Это перегруженная функция.
Создаёт и возвращает объект QPainterPath, являющийся копией заданного пути path, преобразованного в систему координат, определённую этой матрицей.
QRectF QMatrix::mapRect(const QRectF &rectangle) const
Создаёт и возвращает объект QRectF, являющийся копией заданного прямоугольника rectangle, преобразованного в систему координат, определённую этой матрицей.
Координаты прямоугольника преобразуются с использованием следующих формул:
x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy
Если заданы повороты или сдвиги, эта функция возвращает охватывающий прямоугольник. Для получения точной области, в которую отображается данный прямоугольник, используйте функцию mapToPolygon().
См. также mapToPolygon() и Основные операции с матрицами.
QRect QMatrix::mapRect(const QRect &rectangle) const
Это перегруженная функция.
Создаёт и возвращает объект QRect, являющийся копией заданного прямоугольника rectangle, преобразованного в систему координат, определённую этой матрицей. Обратите внимание, что преобразованные координаты округляются до ближайшего целого числа.
QPolygon QMatrix::mapToPolygon(const QRect &rectangle) const
Создаёт и возвращает QPolygon, представляющий данный прямоугольник, преобразованный в систему координат, определённую этой матрицей.
Координаты прямоугольника преобразуются с использованием следующих формул:
x' = m11*x + m21*y + dx y' = m22*y + m12*x + dy
Многоугольники и прямоугольники ведут себя немного по-разному при преобразовании (из-за округления целых чисел), поэтому matrix.map(QPolygon(rectangle)) не всегда совпадает с matrix.mapToPolygon(rectangle).
См. также mapRect() и Основные операции с матрицами.
void QMatrix::reset()
Сбрасывает матрицу до единичной матрицы, т.е. все элементы устанавливаются в ноль, за исключением m11 и m22 (определяющие масштаб), которые устанавливаются в 1.
См. также QMatrix(), isIdentity(), и Основные операции с матрицами.
QMatrix &QMatrix::rotate(qreal degrees)
Поворачивает систему координат на заданные degrees градусов против часовой стрелки.
Обратите внимание, что если вы применяете QMatrix к точке, определённой в координатах виджета, направление поворота будет по часовой стрелке, поскольку ось y направлена вниз.
Возвращает ссылку на матрицу.
См. также setMatrix().
QMatrix &QMatrix::scale(qreal sx, qreal sy)
Масштабирует систему координат на sx по горизонтали и sy по вертикали, и возвращает ссылку на матрицу.
См. также setMatrix().
void QMatrix::setMatrix(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy)
Устанавливает элементы матрицы на указанные значения m11, m12, m21, m22, dx и dy.
Обратите внимание, что эта функция заменяет предыдущие значения. QMatrix предоставляет удобные функции translate(), rotate(), scale() и shear() для управления различными элементами матрицы на основе текущей системы координат.
См. также QMatrix().
QMatrix &QMatrix::shear(qreal sh, qreal sv)
Деформирует систему координат по горизонтали на sh и по вертикали на sv, и возвращает ссылку на матрицу.
См. также setMatrix().
QMatrix &QMatrix::translate(qreal dx, qreal dy)
Перемещает систему координат на dx по оси x и dy по оси y, и возвращает ссылку на матрицу.
См. также setMatrix().
QMatrix::operator QVariant() const
Возвращает матрицу в виде QVariant.
Эта функция была добавлена в Qt 4.2.
bool QMatrix::operator!=(const QMatrix &matrix) const
Возвращает true если эта матрица не равна заданной matrix, в противном случае возвращает false.
QMatrix QMatrix::operator*(const QMatrix &matrix) const
Возвращает результат умножения этой матрицы на заданную matrix.
Обратите внимание, что умножение матриц не коммутативно, т.е. a*b != b*a.
QMatrix &QMatrix::operator*=(const QMatrix &matrix)
Это перегруженная функция.
Возвращает результат умножения этой матрицы на заданную matrix.
QMatrix &QMatrix::operator=(QMatrix &&other)
Оператор перемещения присваивания.
QMatrix &QMatrix::operator=(const QMatrix &matrix)
Присваивает значения из заданной matrix этой матрице.
bool QMatrix::operator==(const QMatrix &matrix) const
Возвращает true, если эта матрица равна заданной matrix, в противном случае возвращает false.
Связанные нечленные функции
bool qFuzzyCompare(const QMatrix &m1, const QMatrix &m2)
Функция qFuzzyCompare предназначена для сравнения двух матриц с учётом погрешности.
Возвращает true, если m1 и m2 равны, допускается небольшая погрешность при сравнении чисел с плавающей точкой; в противном случае возвращает false.
Эта функция была введена в Qt 4.6.
uint qHash(const QMatrix &key, uint seed = 0)
Возвращает хэш-значение для key, используя seed в качестве начального значения.
Эта функция была введена в Qt 5.6.
QPoint operator*(const QPoint &point, const QMatrix &matrix)
Это то же самое, что и matrix.map(point).
См. также QMatrix::map().
QPointF operator*(const QPointF &point, const QMatrix &matrix)
То же самое, что и matrix.map(point).
См. также QMatrix::map().
QLineF operator*(const QLineF &line, const QMatrix &matrix)
Это то же самое, что и matrix.map(line).
См. также QMatrix::map().
QLine operator*(const QLine &line, const QMatrix &matrix)
Это то же самое, что и matrix.map(line).
См. также QMatrix::map().
QPolygonF operator*(const QPolygonF &polygon, const QMatrix &matrix)
Это то же самое, что и matrix.map(polygon).
См. также QMatrix::map().
QPolygon operator*(const QPolygon &polygon, const QMatrix &matrix)
Это то же самое, что и matrix.map(polygon).
См. также QMatrix::map().
QRegion operator*(const QRegion ®ion, const QMatrix &matrix)
Это то же самое, что и matrix.map(region).
См. также QMatrix::map().
QPainterPath operator*(const QPainterPath &path, const QMatrix &matrix)
Это то же самое, что и matrix.map(path).
См. также QMatrix::map().
QDataStream &operator<<(QDataStream &stream, const QMatrix &matrix)
Записывает заданную matrix в заданный stream и возвращает ссылку на поток.
См. также Сериализация типов данных Qt.
QDataStream &operator>>(QDataStream &stream, QMatrix &matrix)
Считывает заданную matrix из заданного stream и возвращает ссылку на поток.
См. также Сериализация типов данных Qt.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qmatrix.html