Класс QMatrix
Класс QMatrix определяет 2D преобразования системы координат. Подробнее...
| Заголовок: | #include <QMatrix> |
| qmake: | QT += gui |
Этот класс устарел. Он предоставляется для совместимости со старым кодом. Мы настоятельно рекомендуем не использовать его в новом коде.
Открытые функции
| QMatrix() | |
| QMatrix(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy) | |
| QMatrix(const QMatrix &matrix) | |
| qreal | m11() const |
| qreal | m12() const |
| qreal | m21() const |
| qreal | m22() const |
| qreal | определитель() const |
| qreal | dx() const |
| qreal | dy() const |
| QMatrix | обращённая(bool *invertible = Q_NULLPTR) const |
| bool | являетсяЕдиничной() const |
| bool | обратима() const |
| void | отобразить(qreal x, qreal y, qreal *tx, qreal *ty) const |
| void | отобразить(int x, int y, int *tx, int *ty) const |
| QPoint | отобразить(const QPoint &point) const |
| QPointF | отобразить(const QPointF &point) const |
| QLine | отобразить(const QLine &line) const |
| QLineF | отобразить(const QLineF &line) const |
| QPolygonF | отобразить(const QPolygonF &polygon) const |
| QPolygon | отобразить(const QPolygon &polygon) const |
| QRegion | отобразить(const QRegion ®ion) const |
| QPainterPath | отобразить(const QPainterPath &path) const |
| QRectF | отобразитьПрямоугольник(const QRectF &rectangle) const |
| QRect | отобразитьПрямоугольник(const QRect &rectangle) const |
| QPolygon | преобразоватьВПолигон(const QRect &rectangle) const |
| void | сбросить() |
| QMatrix & | повернуть(qreal degrees) |
| QMatrix & | масштабировать(qreal sx, qreal sy) |
| void | установитьМатрицу(qreal m11, qreal m12, qreal m21, qreal m22, qreal dx, qreal dy) |
| QMatrix & | сместить(qreal sh, qreal sv) |
| QMatrix & | переместить(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=(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) путём выполнения той же операции над инвертированной матрицей.
Различные элементы матрицы могут быть установлены при создании матрицы или с помощью функции 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(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
Если были заданы поворот или сдвиг, эта функция возвращает охватывающий прямоугольник. Чтобы получить точную область, в которую отображается заданный прямоугольник rectangle, используйте функцию mapToPolygon().
См. также mapToPolygon() и Основные операции с матрицами.
QRect QMatrix::mapRect(const QRect &rectangle) const
Это перегруженный метод.
Создаёт и возвращает объект QRect, являющийся копией заданного прямоугольника rectangle, преобразованного в систему координат, определённую этой матрицей. Обратите внимание, что преобразованные координаты округляются до ближайшего целого числа.
QPolygon QMatrix::mapToPolygon(const QRect &rectangle) const
Создаёт и возвращает представление заданного прямоугольника rectangle в виде 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=(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/archives/qt-5.6/qmatrix.html