координатное отображение в 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.

Я надеюсь, что кто-нибудь может помочь мне устранить мою путаницу с системой координат этой программы.

0

Решение

Я думаю, у вас есть правильное представление о системе координат, но вы спутали себя с недосмотром в коде.

Когда элемент 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);
}
0

Другие решения

Просто для эксперимента вы можете сделать следующий трюк:

//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;
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector