qhull 官方示例 用法
时间: 2023-12-16 08:02:48 浏览: 333
qhull 是一个用于计算凸包和 Voronoi 图的软件包,它提供了一个命令行工具和一个 C 函数库。以下是 qhull 的官方示例用法。
## 命令行工具
### 计算点集的凸包
```
$ qhull s
```
其中 `s` 是一个包含点坐标的文件名,每行一个点,每个点的坐标用空格隔开。输出将是凸包的顶点坐标。
### 计算点集的 Voronoi 图
```
$ qhull v
```
其中 `v` 是一个包含点坐标的文件名,每行一个点,每个点的坐标用空格隔开。输出将是 Voronoi 图的所有面和它们的顶点。
### 计算点集的 Delaunay 三角剖分
```
$ qhull d
```
其中 `d` 是一个包含点坐标的文件名,每行一个点,每个点的坐标用空格隔开。输出将是 Delaunay 三角剖分的所有面和它们的顶点。
### 计算点集的既有凸包又有 Voronoi 图的信息
```
$ qhull Fv
```
其中 `Fv` 是一个包含点坐标的文件名,每行一个点,每个点的坐标用空格隔开。输出将是凸包的顶点坐标和 Voronoi 图的所有面和它们的顶点。
## C 函数库
以下是 qhull C 函数库的示例用法,假设已经安装了 qhull 的头文件和库文件。
### 计算点集的凸包
```c
#include <qhull/qhull_a.h>
int main() {
coordT points[] = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0};
int numpoints = 3;
char flags[] = "qhull s";
FILE* outfile = stdout;
FILE* errfile = stderr;
facetT* facet;
vertexT* vertex, **vertexp;
int curlong, totlong;
qh_init_A(outfile, errfile, stderr, 0, NULL);
qh_initflags(flags);
qh_init_B(points, numpoints, 3, false);
qh_qhull();
FORALLfacets {
FORALLvertices(facet->vertices) {
vertex = *vertexp;
printf("%f %f %f\n", vertex->point[0], vertex->point[1], vertex->point[2]);
}
}
qh_freeqhull(!qh_ALL);
qh_memfreeshort(&curlong, &totlong);
return 0;
}
```
其中 `points` 是一个包含点坐标的数组,每个点用一个三元组表示。`numpoints` 是点的数量。`flags` 是 qhull 命令行选项,`"qhull s"` 表示计算凸包。`outfile` 和 `errfile` 是输出文件和错误文件,这里都是标准输出。`facet` 和 `vertex` 是 qhull 内部的数据结构,分别表示凸包的面和顶点。`FORALLfacets` 和 `FORALLvertices` 是 qhull 提供的宏,用于遍历所有面和顶点。
### 计算点集的 Voronoi 图
```c
#include <qhull/qhull_a.h>
int main() {
coordT points[] = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0};
int numpoints = 3;
char flags[] = "qhull v";
FILE* outfile = stdout;
FILE* errfile = stderr;
facetT* facet;
vertexT* vertex, **vertexp;
int curlong, totlong;
qh_init_A(outfile, errfile, stderr, 0, NULL);
qh_initflags(flags);
qh_init_B(points, numpoints, 3, false);
qh_qhull();
FORALLfacets {
printf("%d\n", qh_setsize(facet->vertices));
FORALLvertices(facet->vertices) {
vertex = *vertexp;
printf("%f %f %f\n", vertex->point[0], vertex->point[1], vertex->point[2]);
}
}
qh_freeqhull(!qh_ALL);
qh_memfreeshort(&curlong, &totlong);
return 0;
}
```
其中 `flags` 改为 `"qhull v"` 表示计算 Voronoi 图。输出将是每个 Voronoi 面的顶点数量和顶点坐标。
### 计算点集的 Delaunay 三角剖分
```c
#include <qhull/qhull_a.h>
int main() {
coordT points[] = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0};
int numpoints = 3;
char flags[] = "qhull d";
FILE* outfile = stdout;
FILE* errfile = stderr;
facetT* facet;
vertexT* vertex, **vertexp;
int curlong, totlong;
qh_init_A(outfile, errfile, stderr, 0, NULL);
qh_initflags(flags);
qh_init_B(points, numpoints, 3, false);
qh_qhull();
FORALLfacets {
printf("%d\n", qh_setsize(facet->vertices));
FORALLvertices(facet->vertices) {
vertex = *vertexp;
printf("%f %f %f\n", vertex->point[0], vertex->point[1], vertex->point[2]);
}
}
qh_freeqhull(!qh_ALL);
qh_memfreeshort(&curlong, &totlong);
return 0;
}
```
其中 `flags` 改为 `"qhull d"` 表示计算 Delaunay 三角剖分。输出将是每个三角形的顶点数量和顶点坐标。
### 计算点集的既有凸包又有 Voronoi 图的信息
```c
#include <qhull/qhull_a.h>
int main() {
coordT points[] = {0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0};
int numpoints = 3;
char flags[] = "qhull Fv";
FILE* outfile = stdout;
FILE* errfile = stderr;
facetT* facet;
vertexT* vertex, **vertexp;
int curlong, totlong;
qh_init_A(outfile, errfile, stderr, 0, NULL);
qh_initflags(flags);
qh_init_B(points, numpoints, 3, false);
qh_qhull();
FORALLfacets {
if (facet->upperdelaunay) {
printf("%d\n", qh_setsize(facet->vertices));
FORALLvertices(facet->vertices) {
vertex = *vertexp;
printf("%f %f %f\n", vertex->point[0], vertex->point[1], vertex->point[2]);
}
}
}
qh_freeqhull(!qh_ALL);
qh_memfreeshort(&curlong, &totlong);
return 0;
}
```
其中 `flags` 改为 `"qhull Fv"` 表示计算凸包和 Voronoi 图的信息。`facet->upperdelaunay` 是一个标志,用于判断一个面是否是凸包的面。输出将是凸包的顶点坐标和 Voronoi 图的每个面的顶点数量和顶点坐标。
阅读全文