Qt中的坐标映射
coordinate mapping in Qt
我一直在做一个物理模拟,我在坐标方面遇到了一些麻烦。
我没能找到场景是如何映射的,以及当我不使用mapToScene()时映射到什么对象;
我的代码如下:
Ball.cpp
Ball::Ball()
{
//random start angle
angle = (qrand() % 360);
setRotation(angle);
//set the speed
speed = 5;
//random start position
int StartX = 0;
int StartY = 0;
if((qrand() % 1))
{
StartX = (qrand() % 200);
StartY = (qrand() % 200);
}
else
{
StartX = (qrand() % 100);
StartY = (qrand() % 100);
}
setPos(mapToScene(StartX,StartY));
qDebug() << "xposition:" << pos().x();
qDebug() << "yposition:" << pos().y();
qDebug() << "xposition mapped:" << mapToScene(pos()).x();
qDebug() << "yposition mapped:" << mapToScene(pos()).y();
}
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
scene = new QGraphicsScene (this);
ui->graphicsView->setScene (scene);
ui->graphicsView->setRenderHint(QPainter::Antialiasing);
double sceneULx = -400;
double sceneULy = 200;
double scenewidth = 800;
double sceneheight = 400;
scene->setSceneRect(sceneULx, sceneULy,scenewidth,sceneheight);
QPen mypen = QPen(Qt::red);
QLineF TopLine(scene->sceneRect().topLeft(),scene->sceneRect().topRight());
QLineF LeftLine(scene->sceneRect().topLeft(),scene->sceneRect().bottomLeft());
QLineF RightLine(scene->sceneRect().bottomRight(),scene->sceneRect().topRight());
QLineF BottomLine(scene->sceneRect().bottomLeft(),scene->sceneRect().bottomRight());
scene->addLine(TopLine,mypen);
scene->addLine(LeftLine,mypen);
scene->addLine(RightLine,mypen);
scene->addLine(BottomLine,mypen);
int ItemCount = 5;
for(int i = 0; i <ItemCount; i++)
{
Ball *item = new Ball();
scene->addItem(item);
}
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()), scene,SLOT(advance()));
timer->start(10);
}
目前我生成的所有对象都不在场景的区域内,这对我来说没有任何意义,因为我认为场景的左上角是0/0,当你向下或向右移动时,它会变成正的。
qDebugs也会产生以下结果:
xposition: 25.6601
yposition: 22.306
xposition mapped: 30.392
yposition mapped: 55.9751
xposition: -56.6299
yposition: 79.0004
xposition mapped: -136.607
yposition mapped: 23.7579
xposition: 31.6448
yposition: 32.3822
xposition mapped: 76.5177
yposition mapped: 38.4172
xposition: 50.017
yposition: -97.4695
xposition mapped: -59.4804
yposition mapped: -93.9612
xposition: -44.0378
yposition: 9.25605
xposition mapped: -33.8154
yposition mapped: -34.5675
我真的找不到映射数和未映射数之间的关联,而且很奇怪的是,映射数有小数,尽管我用int定义了它们。
我希望有人能帮助我澄清我对这个程序的坐标系的困惑。
我认为你对坐标系的理解是正确的,但是代码中的一个疏忽把你自己弄糊涂了。
在构造函数中创建Ball项目时,它创建随机坐标,然后调用:
setPos(mapToScene(StartX,StartY));
正如mapToScene的文档所述:-
将点点映射到场景的坐标系,这个点在这个项目的坐标系中,并返回映射的坐标。
然而,代码是在Ball的构造函数中执行的,并且还没有被添加到场景中,所以它不能成功地映射坐标,因为它没有父项,也没有可以映射到的场景。
可以在构造函数中调用setPos,但不能调用mapToScene
setPos(StartX,StartY);
如果没有父元素,当项目被添加到场景中时,它将匹配它的场景坐标(item->pos() == item->scenePos())
或者,创建一个Ball项目,将其添加到场景中,然后设置其位置。
for(int i = 0; i <ItemCount; i++)
{
Ball *item = new Ball();
scene->addItem(item);
// note that mapToScene is irrelevant, since there is no parent item for the Ball.
item->setPos(x, y);
}
你可以做下面的实验:
//random start position
int StartX = 100;
int StartY = 100;
setPos(mapToScene(StartX,StartY));
qDebug() << "xposition:" << pos().x();
qDebug() << "yposition:" << pos().y();
qDebug() << "xposition mapped:" << mapToScene(pos()).x();
qDebug() << "yposition mapped:" << mapToScene(pos()).y();
你会看到坐标仍然是随机的。基本上,你将坐标随机化了3次,难怪没有相关性。
也试试这个:
double sceneULx = 0;
double sceneULy = 0;
double scenewidth = 800;
double sceneheight = 400;
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 如何使用 std::multimap 将整数键映射到两个用作多维数组坐标的整数值(对于井字)?
- 如何在三角形曲面细分评估着色器中插值 UV 映射坐标?
- 如何插值像素坐标而不是像素值?需要它来为相机生成校正重映射
- C++/SDL-矩形坐标映射
- 球面坐标映射创建双环状体
- C 椭圆坐标映射
- 我想使用C++映射,以存储一个矩形id的4个坐标,任何人都可以举一个例子吗
- 创建用于将结构坐标存储为键和线号作为值的映射
- Kinect v2 将颜色坐标映射到相机空间
- 仅对从扭曲图像获得的坐标应用重映射,而不对整个图像应用重映射
- 在C++中的OpenGL中将坐标从三维透视投影映射到二维正投影
- 制作一个以坐标为键的std::映射
- 查找/重新映射OpenGL ES坐标平面的边界
- 2d(3d)坐标的哈希映射(即双精度向量)
- 如何映射项目坐标
- Qt中的坐标映射
- 我是否正确地指定了立方体映射的坐标