2012-07-16 99 views
7

考虑到4点是是创建QTransform给出4点定义转换单位正方形

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

结果我怎么能找到QTransform transform? (甚至更好:也给定任意源矩形)

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

Illustration of the problem

这是示出了GIMP,其中一个可以通过围绕4个角的层的移动变换层的问题的屏幕截图。这导致了透视转换。我想在Qt应用程序中完全一样。我知道QTransform不仅限于仿射变换,还可以处理透视变换。

+0

注:我公司目前正在努力解决这个问题。我从p1开始(这是映射的左上角的点(0,0)):因此,我只使用一个转换矩阵。通过使用缩放和剪切矩阵可以达到p2和p3。但我有深远P4的问题:我不明白的透视变换背后的数学,因此不知道在第三列的矩阵表项的数量如何影响转型。 – leemes 2012-07-16 21:48:53

回答

2

你应该能够QTransform.squareToQuad做到这一点。只要通过你想要转换的QPolygonF即可。

我有时会遇到一些问题,让SquareToQuad做我想做的事情,而不得不使用QTransform.quadToQuad来代替我自己的起始四元组,但是您可能会有更多的运气。

+0

再一次,非常感谢。该死的,我所有数学的全部工作都是没有用的...... :) – leemes 2012-07-25 17:55:17

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()); 

直到现在,反式描述了一个平行四边形转变。在这个paralellogram中,我发现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; 

xy很难解释。仅给出其中的一个(另一组到1),这限定了仅p4相对缩放。但是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; 

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

所以,我还是寻找一些直接式矩阵值m11m12 ... m33,给出的点的坐标p1.x()p1.y() ... p4.x()p4.y()

+0

你不应该可以使用QTransform.squareToQuad? – dmd 2012-07-25 15:32:47

+0

Aaaaah,非常感谢你@dmd,这正是我一直在寻找的,当然。我没有足够的RTFM,或者更好的说,这个函数的名字完全不是我期望的功能,而这正是我想要的! – leemes 2012-07-25 16:02:14

+0

@dmd,如果你把它写成答案,我会接受它。 – leemes 2012-07-25 16:02:30

相关问题