开门见山,直接上代码
旋转
QPainterPath GetRotatePath(const QPainterPath& path, qreal angle, const QPointF& center)
{
qreal rad = qDegreesToRadians(angle);
QTransform transform;
transform.translate(center.x(), center.y());
transform.rotateRadians(rad);
transform.translate(-center.x(), -center.y());
return transform.map(path);
}
QPainterPath GetRotatePath(const QPainterPath& path, qreal angle)
{
const QPointF center = path.boundingRect().center();
qreal rad = qDegreesToRadians(angle);
QTransform transform;
transform.translate(center.x(), center.y());
transform.rotateRadians(rad);
transform.translate(-center.x(), -center.y());
return transform.map(path);
}
镜像
QPainterPath GetMirroredPath(const QPainterPath& path, Qt::Orientation orientation)
{
QTransform transform;
if (orientation == Qt::Horizontal) {
transform = QTransform(-1, 0, 0, 1, path.boundingRect().width(), 0);
} else if (orientation == Qt::Vertical) {
transform = QTransform(1, 0, 0, -1, 0, path.boundingRect().height());
}
return transform.map(path);
}
QPainterPath GetCenterMirrorPath(const QPainterPath& path, Qt::Orientation orientation)
{
QRectF boundingRect = path.boundingRect();
QPointF center = boundingRect.center();
QTransform transform;
if (orientation == Qt::Horizontal) {
transform = QTransform(-1, 0, 0, 1, 2 * center.x(), 0);
} else if (orientation == Qt::Vertical) {
transform = QTransform(1, 0, 0, -1, 0, 2 * center.y());
}
return transform.map(path);
}
缩放
QPainterPath GetScalePath(const QPainterPath& path, double sx, double sy)
{
QPointF center = path.boundingRect().center();
QTransform transform;
transform.translate(center.x(), center.y());
transform.scale(sx, sy);
transform.translate(-center.x(), -center.y());
return transform.map(path);
}
平移
QPainterPath GetTranslatePath(const QPainterPath& path, const QPointF& offset)
{
QTransform transform;
transform.translate(offset.x(), offset.y());
return transform.map(path);
}
缩放并平移到目标区域
QPainterPath GetScaleAndTranslatePath(const QPainterPath& path, const QRectF& targetRect)
{
QRectF rect = path.boundingRect();
QRectF tarRect = targetRect;
qreal scaleX = tarRect.width() / rect.width();
qreal scaleY = tarRect.height() / rect.height();
qreal scale = qMin(scaleX, scaleY);
QTransform trans;
trans.scale(scale, scale);
QPainterPath tmp_path = trans.map(path);
QPointF delta = tarRect.center() - tmp_path.boundingRect().center();
tmp_path.translate(delta.x(), delta.y());
return tmp_path;
}
QPainterPath GetScaleAndTranslatePath(const QPainterPath& path, const QRectF& targetRect, qreal padding)
{
QRectF rect = path.boundingRect();
QRectF tarRect = targetRect.marginsRemoved(QMarginsF(padding, padding, padding, padding));
qreal scaleX = tarRect.width() / rect.width();
qreal scaleY = tarRect.height() / rect.height();
qreal scale = qMin(scaleX, scaleY);
QTransform trans;
trans.scale(scale, scale);
QPainterPath tmp_path = trans.map(path);
QPointF delta = tarRect.center() - tmp_path.boundingRect().center();
tmp_path.translate(delta.x(), delta.y());
return tmp_path;
}