使用qt c ++

时间:2016-01-03 19:47:08

标签: c++ qt gps

我正在尝试将第一个代码段转换为:

Calculate distance between 2 GPS coordinates

//      var R = 6371; // km
//      var dLat = (lat2-lat1).toRad();
//      var dLon = (lon2-lon1).toRad();
//      var lat1 = lat1.toRad();
//      var lat2 = lat2.toRad();

//      var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
//              Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
//      var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
//      var d = R * c;

(也在下面显示)用于qt c ++。它用于模拟无线电控制模拟器内的gps飞行的程序。 GpsCalcLoop每秒一次抓取gps纬度和经度(十进制格式)。这些被输入到我的转换代码中,希望在一秒钟内获得一段距离。然后计算速度。

我使用了此页面上的信息:

http://doc.qt.io/qt-4.8/qtcore-qmath-h.html

转换数学函数。然而,输出并不是我的预期。无论输入到lat2,lat1,lon2和lon1是什么,结果总是相同的,'16777200.00'。

我希望更熟悉qt c ++的人能够告诉我转换错误的地方。或者指向我可以找到正在运行的qt c ++代码。

我将补充说我尝试使用“#include”<“QGeoPositionInfo”>“但在运行程序时遇到”没有这样的文件或目录“错误。

void TelemetrySimulator::onGpsCalcLoop()
 {

 if(rungps)
    {
    ui -> valuetest1 -> setValue(flat);
    ui -> valuetest2 -> setValue(flat2);
    ui -> valuetest3 -> setValue(flon);
    ui -> valuetest4 -> setValue(flon2);

    ui -> valuetest5 -> setValue(flat-flat2);
    ui -> valuetest6 -> setValue(flon-flon2);

    flat2 = flat;
    flon2 = flon;
    //--https://stackoverflow.com/questions/365826   //calculate-distance-between-2-gps-coordinates--
    //      var R = 6371; // km
    //      var dLat = (lat2-lat1).toRad();
    //      var dLon = (lon2-lon1).toRad();
    //      var lat1 = lat1.toRad();
    //      var lat2 = lat2.toRad();

    //      var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    //              Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
    //      var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    //      var d = R * c;
    //--------------my conversio  to qt  c++---------
    //---converted to qt using this web page -> http://doc.qt.io/qt-4.8/qtcore-qmath-h.html----
    double R, dLat, dLon, lat1, lat2, lon2, lon1, a, c, d;

    lat2 = flat2;
    lat1 = flat;
    lon2 = flon2;
    lon1 = flon;

     R = 6371; // km
     dLat = qAcos(lat2-lat1); //dLat = (lat2-lat1).toRad(); instead of qAcos could be qAsin, qAtan, qCos, qSin,
                                                       // qTan. All refer to Radials.
     dLon = qAcos(lon2-lon1); //dLon = (lon2-lon1).toRad();
     lat1 = qAcos(lat1);  //lat1 = lat1.toRad();
     lat2 = qAcos(lat2);  //lat2 = lat2.toRad();

     a = qSin(dLat/2) * qSin(dLat/2) +  //Math.sin(dLat/2) * Math.sin(dLat/2) +
       qSin(dLon/2) * qSin(dLon/2) * qCos(lat1) * qCos(lat2);//Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) *  Math.cos(lat2);
     c = 2 * qAtan2(qSqrt(a), qSqrt(1-a)); //Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
     d = R * c;
     ui -> valuetest7 -> setValue(d);
     }

 }

感谢大家的大力帮助!这是最终的代码:

void MainWindow::onGpsCalcLoop()
{
    //Get initial values from gps run loop-------
     double lat2 = flat2;
     double lat1 = flat;
     double lon2 = flon2;
     double lon1 = flon;
     //GPS distance and speed calculation -------
     double dLat = .01745329 * (lat2 - lat1);
     double dLon = .01745329 * (lon2 - lon1);
     lat1 = .01745329 * lat1;
     lat2 = .01745329 * lat2;
     double a = qSin(dLat/2) * qSin(dLat/2) +
         qSin(dLon/2) * qSin(dLon/2) * qCos(lat1) * qCos(lat2);
     double c = 2 * qAtan2(qSqrt(a), qSqrt(1-a));
     double d = 3975 * c;
     //Distance calculation done. Next is total distance and speed------
     td = td + d;
     if (d > .1)
     {
         d = 0;
         td = 0;
     }
     if (ui -> metric -> isChecked())
     {
         ui -> valuetest1 -> setValue(td * 1.6);
         ui -> valuetest2 -> setValue((d * 3600) * 1.6);
     }
     else
     {
     ui -> valuetest1 -> setValue(td);
     ui -> valuetest2 -> setValue(d * 3600);
     }
     flat2 = flat;
     flon2 = flon;
}

我使用.01745329 *(无论如何)代替qDegreesToRadians(无论如何)只是为了让事情尽可能简单。

再次感谢大家的帮助!

0 个答案:

没有答案