2

我知道可以在 Qt 中使用仿射变换。但是是否也可以设置一个完整的自定义全局变换方法呢?

用例:在地理坐标中(在 QGraphicsScene/View 的上下文中)绘制投影地理点(纬度、经度)或检索鼠标事件等。

目前我这样使用它(一点点伪代码):

MyPoint pt = myProjection(geographicPoint);
QPoint(pt.x, pt.y);

// or, to make it shorter, but essentially it's the same
QPoint p  = myProjection(geoPoint);

geoPoint = myBackProjection(mouseEvent.getPoint());

而且我想在某处“注册”我的转换方法,以便 QGraphicsView(或负责人)在在屏幕上绘制某些内容之前在内部使用这些方法。

或者这既没有意义(因为它会在我不期望的地方引入问题,例如在计算距离时)也不可能?

4

2 回答 2

0

QGraphicsView 使用一个 QTransform 矩阵,它是一个 3x3 矩阵。因此,您只能进行线性变换。在 Qt5/QtQuick 或QtQuick3d 中,您可以使用 QML ShaderProgram 来实现这一点。

在“纯”Qt4 中,您必须从 QGraphicsView、QAbstractScrollArea 或 QGraphicsScene 派生您自己的自定义类并覆盖绘制方法。

于 2012-01-11T09:30:45.193 回答
0

一个好的方法是将此转换封装在您的 QGraphicsItem shape() 方法中。假设您有一个点定义为一对纬度和经度,它将存储成对的纬度,但它的 shape 方法将返回投影值(通常以像素等值表示)。

如果您愿意,您甚至可以将 QPoint 子类化以使其具有地理感知能力,从而使用 latlon 创建它,但在其 x、y 属性中公开投影值。

于 2016-03-24T00:08:53.870 回答