2015-08-13 4 views
0

Я работал над физическим моделированием, и у меня были проблемы с координатами.координатное сопоставление в 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 

Я не могу найти корреляцию между сопоставляются и несопоставленные номера, и это тоже очень странно, что преобразованные числа имеют десятичные Altough Я определяю их int.

Я надеюсь, что кто-то может помочь мне очистить мое замешательство с системой координат этой программы.

+0

Я предлагаю вам построить очень простую сцену с удобными метриками, экспериментировать с ним, пока вы не поймете, как координировать картографические работы, а затем попытаться использовать его. Qt довольно нелогично. – dtech

+0

, но как возможно, что mapToScene (pos(). X()) возвращает что-то иное, чем scenePos(). X() они должны быть одинаковыми или ошибочны в моем основном понимании этого? – Tomathor

ответ

0

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

Когда создается элемент Ball, в конструкторе, он создает случайные координаты, а затем называет это:

setPos(mapToScene(StartX,StartY)); 

В документации для mapToScene состояний: -

Карты точку точки, который находится в системе координат этого элемента, в систему координат сцены и возвращает отображаемую координату.

Однако код выполнен в конструкторе шара и еще не добавлен в сцену, поэтому он не может успешно сопоставить координаты, поскольку у него нет родительского элемента, и нет сцены, с которой нужно сопоставить.

Вы можете вызвать setPos в конструкторе, но без mapToScene

setPos(StartX,StartY); 

При отсутствии родителей, когда элемент добавляется на сцену, он будет соответствовать его координаты сцены (item-> поз() == item-> scenePos())

В качестве альтернативы создайте пункт «Шар», добавьте его в сцену и затем установите его положение.

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; 
Смежные вопросы