【问题标题】:Best way to draw gps point with qt [closed]用qt绘制gps点的最佳方法[关闭]
【发布时间】:2021-02-01 04:00:01
【问题描述】:

我真的不知道如何问这个问题,但我会尽力解释。我有一个带有gps的arduino项目,我通过我的电脑上的serialdata传输地理点。我可以毫无问题地阅读它,但我需要帮助的地方是如何绘制该点的路径。目前我使用这个:

    void MainWindow::paintEvent(QPaintEvent* p)
    {
        QPainter painter(this); //class must be implemented from QWidget
        painter.setPen(pen);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setRenderHint(QPainter::HighQualityAntialiasing);
        painter.translate(width() / 2-466133, height() / 2+727150);
        painter.scale(10000.0,10000.0);

        painter.drawPolyline(polyPoints);
    }

    void MainWindow::readData(QStringList data)
    {
        ui->textEdit->setText(data.join(","));
        polyPoints  << QPointF(data[0].toDouble(),data[1].toDouble());
        QWidget::update();
    }

我的观点是这样的:

46.612823, -72.702957
46.612876, -72.702873
46.612937, -72.702789

就像你看到的 2 点之间的差异非常非常小,所以我需要以这种方式向上缩放,并且需要使用可笑的数字来翻译我的起源。目前翻译是固定的,但在未来它将是动态的。

最后有一张图片可以显示我需要的更多内容

【问题讨论】:

    标签: c++ qt arduino gps qpainter


    【解决方案1】:

    您可以使用QTransform 来缩放和移动多边形。 QPainter缩放会增加画线的宽度。

    使用QPolygonF::boundingRect() 从那里获取原始点的大小和比例。

    #include "mainwindow.h"
    
    #include <QPainter>
    #include <QPolygonF>
    #include <QDebug>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        this->resize(250, 250);
    }
    
    MainWindow::~MainWindow()
    {
    }
    
    void MainWindow::paintEvent(QPaintEvent *)
    {
        QPolygonF polygon_;
        polygon_ << QPointF{46.61, -72.7};
        polygon_ << QPointF{46.62, -73};
        polygon_ << QPointF{46.63, -72.78};
    
        QPainter painter(this);
        QPen pen;
        pen.setWidthF(1);
        pen.setColor(QColor(Qt::red));
        painter.setPen(pen);
        painter.setRenderHint(QPainter::Antialiasing);
    
        QRectF rect = polygon_.boundingRect();
    
        qreal scale_x = this->width() / rect.width();
        // Qt's y axis is positive downward
        qreal scale_y = - this->height() / rect.height();
    
        // Use rect's after-scaling properties to calculate
        qreal left_border = (this->width() - rect.width() * scale_x) / 2;
        qreal top_border = (this->height() - rect.height() * scale_y) / 2;
    
        // Use rect's after-scaling properties to calculate
        QTransform transform;
        transform.translate(-rect.x() * scale_x + left_border,
                            -rect.y() * scale_y + top_border);
        transform.scale(scale_x, scale_y);
        painter.drawPolyline(transform.map(polygon_));
    }
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 2010-11-01
      • 1970-01-01
      相关资源
      最近更新 更多