qt中qhull 二维数据求取包络例子
时间: 2024-06-09 12:06:02 浏览: 79
以下是一个简单的 Qt 示例,展示如何使用 Qhull 库来求取二维数据的包络:
```cpp
#include <QtWidgets>
#include <libqhullcpp/Qhull.h>
#include <libqhullcpp/QhullFacetList.h>
#include <libqhullcpp/QhullVertexSet.h>
class QhullExampleWidget : public QWidget
{
public:
QhullExampleWidget(QWidget *parent = nullptr)
: QWidget(parent)
{
// 生成一些随机数据
const int pointCount = 100;
QVector<QPointF> points;
qsrand(QDateTime::currentMSecsSinceEpoch());
for (int i = 0; i < pointCount; ++i) {
points.append(QPointF(qrand() % 200 - 100, qrand() % 200 - 100));
}
// 使用 Qhull 库求取凸包
Qhull qhull("i", 2, points.size(), points.data());
QhullFacetList facets = qhull.facetList();
QhullVertexSet vertices = qhull.vertexSet();
// 构造凸包的多边形
QPolygonF polygon;
foreach (const QhullVertex &vertex, vertices) {
if (vertex.point().at(1) >= 0) {
polygon.append(vertex.point());
}
}
// 在窗口中绘制多边形和数据点
setFixedSize(400, 400);
m_pixmap = QPixmap(size());
m_pixmap.fill(Qt::white);
QPainter painter(&m_pixmap);
painter.translate(width() / 2, height() / 2);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(QPen(Qt::red, 3));
painter.drawPoints(points);
painter.setPen(QPen(Qt::blue, 2));
painter.drawPolyline(polygon);
}
protected:
void paintEvent(QPaintEvent *event) override
{
QPainter painter(this);
painter.drawPixmap(0, 0, m_pixmap);
}
private:
QPixmap m_pixmap;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QhullExampleWidget widget;
widget.show();
return app.exec();
}
```
该示例中,我们首先生成了一些随机二维数据。然后使用 Qhull 库求取这些数据的凸包。在这里,我们只保留了凸包中 y 坐标大于等于 0 的点,以形成一个半平面。最后,我们在窗口中绘制了数据点和凸包多边形。运行示例,可以看到绘制出的凸包:
![image](https://user-images.githubusercontent.com/5803001/134165924-8c5c27d0-01e9-4c4f-9b1a-f8a706e2c9bd.png)
阅读全文