用qt绘制gps点的最佳方法
Best way to draw gps point with qt
我真的不知道怎么问这个问题,但我会尽力解释。我在带有 gps 的 arduino 上有一个项目,我通过我的电脑上的串行数据传输地理点。我可以毫无问题地阅读它,但是我需要帮助的地方是如何绘制该点的路径。目前我使用这个:
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 点之间的差异非常非常小,所以我需要按这种方式放大,并且需要使用可笑的数字来翻译我的来源。目前翻译是固定的,但将来会是动态的。
最后有一张图片可以显示更多我需要的东西
您可以使用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_));
}
输出:
我真的不知道怎么问这个问题,但我会尽力解释。我在带有 gps 的 arduino 上有一个项目,我通过我的电脑上的串行数据传输地理点。我可以毫无问题地阅读它,但是我需要帮助的地方是如何绘制该点的路径。目前我使用这个:
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 点之间的差异非常非常小,所以我需要按这种方式放大,并且需要使用可笑的数字来翻译我的来源。目前翻译是固定的,但将来会是动态的。
最后有一张图片可以显示更多我需要的东西
您可以使用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_));
}
输出: