qhull 求取二维数据包络 代码 C
时间: 2024-02-28 11:53:01 浏览: 99
下面是使用qhull库求取二维数据包络的C代码示例:
```c
#include <stdio.h>
#include "qhull/qhull.h"
#define DIM 2 // 二维数据
#define MAX_POINTS 1000 // 最大点数
int main() {
int i, j, numpoints;
coordT points[MAX_POINTS][DIM];
facetT *facet;
vertexT *vertex, **vertexp;
setT *vertices;
boolT ismalloc = False;
char flags[250];
// 读取点数据
scanf("%d", &numpoints);
for (i = 0; i < numpoints; i++) {
for (j = 0; j < DIM; j++) {
scanf("%lf", &points[i][j]);
}
}
// 设置qhull选项
sprintf(flags, "qhull d Qt");
// 调用qhull库求取凸包
qh_init_A(stdin, stdout, stderr, 0, NULL);
qh_initflags(flags);
qh_init_B(points[0], numpoints, DIM, ismalloc);
qh_qhull();
qh_check_output();
// 输出凸包顶点
vertices = qh_vertexintersect_new(NULL, qh_facet_list, False);
FORALLvertices {
printf("%lf %lf\n", vertex->point[0], vertex->point[1]);
}
qh_freeqhull(!qh_ALL);
qh_memfreeshort(&ismalloc);
return 0;
}
```
其中,需要注意的是:
- 二维数据点的坐标存储在`points`数组中;
- 设置qhull选项时,`d`表示求凸包,`Qt`表示输出凸包顶点;
- 调用qh_qhull函数求取凸包;
- 通过`qh_vertexintersect_new`和`FORALLvertices`宏可以遍历凸包的所有顶点。
阅读全文