qt中qhull 二维数据求取包络例子
时间: 2024-05-16 20:14:15 浏览: 93
qthread示例
以下是一个使用 Qhull 库在 Qt 中求解二维数据包络的示例:
```c++
#include <QtDebug>
#include <QtCore/QVector>
#include <QtCore/QPointF>
#include <qhull/qhull.h>
void qhullTest()
{
const int N = 20;
QVector<QPointF> points(N);
// 构造二维数据点
for (int i = 0; i < N; ++i) {
qreal x = qrand() % 100 - 50;
qreal y = qrand() % 100 - 50;
points[i] = QPointF(x, y);
}
// 构造 Qhull 库的输入数据
const int dim = 2;
const int numpoints = N;
coordT *pointsArray = new coordT[numpoints * dim];
for (int i = 0; i < numpoints; i++) {
pointsArray[i * dim] = points[i].x();
pointsArray[i * dim + 1] = points[i].y();
}
// 调用 Qhull 库求解包络
char *options = (char *)"Qt";
facetT *facet;
vertexT *vertex, **vertexp;
int curlong, totlong;
qh_new_qhull(dim, numpoints, pointsArray, false, options, NULL, stderr);
FORALLfacets {
qDebug() << "Facet:";
FORALLvertices(facet->vertices) {
vertex = *vertexp;
qDebug() << vertex->point[0] << vertex->point[1];
}
}
qh_freeqhull(!qh_ALL);
qh_memfreeshort(&curlong, &totlong);
delete[] pointsArray;
}
```
这个示例程序首先构造了 20 个随机的二维数据点,然后将其转换为 Qhull 库的输入格式。接着,通过调用 `qh_new_qhull` 函数,使用 Qhull 库求解包络,并输出包络的顶点坐标。最后,使用 `qh_freeqhull` 和 `qh_memfreeshort` 函数释放内存。
需要注意的是,Qhull 库的输入数据格式是一个一维数组,其中每个数据点的坐标依次存储在数组中。在本例中,二维数据点 `(x, y)` 的坐标存储在数组中的位置为 `i * dim` 和 `i * dim + 1`。
另外,在调用 `qh_new_qhull` 函数时,传入的 `options` 参数指定了 Qhull 库的选项。在本例中,我们设置选项为 `"Qt"`,表示使用 Qt 的输出格式。如果不指定选项,则使用默认的选项。
需要注意的是,Qhull 库的输出格式是一个面向行的文本格式,需要使用 QTextStream 或其他文本处理方式进行解析。在本例中,我们直接使用 qDebug 输出了顶点坐标。
阅读全文