7

鉴于 4 分是结果

QPolygon poly = transform.mapToPolygon(QRectF(0, 0, 1, 1));

我怎样才能找到QTransform transform?(更好的是:也给定一个任意源矩形)

动机:给定要在透视扭曲坐标系中绘制的图像的四个角点,我如何使用 QPainter 绘制图像?

问题说明

这是说明 GIMP 中问题的屏幕截图,其中可以通过围绕图层的 4 个角移动来变换图层。这导致透视变换。我想在 Qt 应用程序中做同样的事情。我知道 QTransform 不仅限于仿射变换,还可以处理透视变换。

4

2 回答 2

3

您应该可以使用QTransform.squareToQuad. 只需将它传递给QPolygonF您要转换的对象即可。

有时我在让 squareToQuad 做我想做的事情时遇到一些问题,而不得不使用它QTransform.quadToQuad来定义我自己的起始四边形,但你可能会有更多的运气。

于 2012-07-25T17:22:22.550 回答
1

我想我找到了一个解决方案,它逐步计算转换矩阵。

// some example points:
QPointF p1(1.0, 2.0);
QPointF p2(2.0, 2.5);
QPointF p3(1.5, 4.0);
QPointF p4(3.0, 5.0);

// define the affine transformation which will position p1, p2, p3 correctly:
QTransform trans;
trans.translate(p1.x(), p1.y());
trans.scale(p2.x() - p1.x(), p3.y() - p1.y());
trans.shear((p3.x() - p1.x()) / trans.m11(), (p2.y() - p1.y()) / trans.m22());

到目前为止,trans 描述了一个平行四边形变换。在这个平行四边形中,我在下一步中找到了 p4(相对)。我认为这可以使用不涉及反式反转的直接公式来完成。

// relative position of the 4th point in the transformed coordinate system:
qreal px = trans.inverted().map(p4).x();
qreal py = trans.inverted().map(p4).y();

// this defines the perspective distortion:
qreal y = 1 + (py - 1) / px;
qreal x = 1 + (px - 1) / py;

这些值x很难y解释。仅给定其中一个(另一个设置为1),这定义了p4only 的相对缩放。但是结合x和y的透视变换,x和y的含义都很难;我通过反复试验找到了公式。

// and thus the perspective matrix:
QTransform persp(1/y, 0, 1/y-1,
                 0, 1/x, 1/x-1,
                 0, 0, 1);

// premultiply the perspective matrix to the affine transformation:
trans = persp * trans;

一些测试表明,这会导致正确的结果。但是,我没有测试两个点相等或其中一个点在另外两个点之间的线段上的特殊情况;我认为这种解决方案可能会在这种情况下中断。

因此,我仍然在给定点坐标, ... ,的情况下寻找矩阵值m11, m12...的一些直接公式。m33p1.x()p1.y()p4.x()p4.y()

于 2012-07-16T22:53:02.890 回答