我正在使用C++和QT编写一个应用程序,其中有n个点,需要计算这些点的凸包。然而,一旦计算完成,我不知道如何绘制这些点并绘制凸包的边界。创建菜单按钮之类的操作很简单,但我不确定如何完成这个任务。
请问如何实现这个功能?
我正在使用C++和QT编写一个应用程序,其中有n个点,需要计算这些点的凸包。然而,一旦计算完成,我不知道如何绘制这些点并绘制凸包的边界。创建菜单按钮之类的操作很简单,但我不确定如何完成这个任务。
请问如何实现这个功能?
addEllipse
QGraphicsView
非常擅长 2D 绘图,并为您提供许多选项以显示它。 虽然它不像 qwt
一样专门用于绘制科学数据,但仅用于显示一堆点、几何或动画等其他事物时,它非常有效。请参阅Qt的图形视图框架文档和示例。
以下是在 QGraphicsScene
中绘制一堆点并在 QGraphicsView
中显示的方法:
#include <QtGui/QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QPointF>
#include <QVector>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QVector <QPointF> points;
// Fill in points with n number of points
for(int i = 0; i< 100; i++)
points.append(QPointF(i*5, i*5));
// Create a view, put a scene in it and add tiny circles
// in the scene
QGraphicsView * view = new QGraphicsView();
QGraphicsScene * scene = new QGraphicsScene();
view->setScene(scene);
for(int i = 0; i< points.size(); i++)
scene->addEllipse(points[i].x(), points[i].y(), 1, 1);
// Show the view
view->show();
// or add the view to the layout inside another widget
return a.exec();
}
注意:您可能希望在视图上调用setSceneRect
,否则场景将仅自动居中。请阅读Qt文档中 QGraphicsScene
和 QGraphicsView
的描述。您可以缩放视图以显示更多或更少的场景,并且可以添加滚动条。我回答了一个相关的问题,其中展示了您可以使用QGraphicsView
做的更多内容,您可能也想看一下。
您可以创建一个自定义类,继承自QWidget
,并重写void paintEvent(QPaintEvent* event)
方法。在该方法中,将点放入某种点列表中,可以是std::vector<QPoint>
或QList<QPoint>
,然后使用Polyline方法进行绘制。例如:
void Foo::paintEvent(QPaintEvent* event)
{
QPainter painter(this);
std::vector<QPoint> points;
// Fill points with the points
painter.drawPolyLine(points.data(), static_cast<int>(points.size()));
}
#include <QPainter>
)。另外,似乎有一个头文件提供了所有Qt类的前向声明(即class QPainter;
之类),使编译器认识到存在这样的类,但不知道更多信息,从而导致出现陌生的错误消息。 - dmckee --- ex-moderator kitten有一个图表库qwt,它提供了用于绘制图表的Qt小部件。
本来这篇文章是要更新我的QGraphics View示例,但是它变得有点长了,而且这真的是一个完全不同的方法来回答这个问题。
Qt Charts(自2016年起LGPL可用)是一种很好的方法,可以在不需要第三方库的情况下完成此操作。
https://doc.qt.io/qt-5/qlineseries.html#QLineSeries
QLineSeries* series = new QLineSeries();
series->append(0, 6);
series->append(2, 4);
...
chart->addSeries(series);
QAreaSeries
图表。
https://doc.qt.io/qt-5/qtcharts-areachart-example.html
https://doc.qt.io/qt-5/qareaseries.html
QLineSeries *series0 = new QLineSeries();
QLineSeries *series1 = new QLineSeries();
*series0 << QPointF(1, 5) << QPointF(3, 7) << QPointF(7, 6) << QPointF(9, 7) << QPointF(12, 6)
<< QPointF(16, 7) << QPointF(18, 5);
*series1 << QPointF(1, 3) << QPointF(3, 4) << QPointF(7, 3) << QPointF(8, 2) << QPointF(12, 3)
<< QPointF(16, 4) << QPointF(18, 3);
QAreaSeries *series = new QAreaSeries(series0, series1);