MouStudio分享 http://blog.sciencenet.cn/u/moustudio 一目半行,再目半行

博文

VC++调用TetGen对stl文件模型数据进行四面体剖分

已有 12108 次阅读 2015-10-12 10:33 |个人分类:算法研究|系统分类:科研笔记| TetGen, 四面体网格剖分, stl模型文件

Visual C++ 2012 MFC+TetGen 1.5

1前言

Tetgen 可以用来产生四面体网并且遵守格德洛内规则,四面体网格对有限元和有限体积法是非常有用的。这个算法在当前研究领域具有领先水平。

项目地址:http://www.wias-berlin.de/software/tetgen/

针对Tetgen的调用有两种方式:

(1)第一种是基于exe组件级别(Tetgen.exe)进行命令语句进行,如:Tetgen –pq test.stl,命令语句操作十分方便快捷。但是要将源码编译成exe有点难度;

(2)第二种是直接基于源码级的整合调用,这种方式相对来说要繁杂些,但同时也有可以更好控制程序细节,方便软件的发布等特点。并且Tetgen是纯C型的接口,移植性很好,调用起来不难。下面详细介绍第二种调用方式的过程。

2调用

   将下载的Tetgen 1.5的压缩包解压完成如下图所示,选中其中三个源文件添加进测试工程中。


3编译注意事项

   在使用VC++ 2012 MFC的过程中,编译过程中会出现几个问题:

1fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h

此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h"时,文件未预期结束。没有找到预编译指示信息的头文件"stdafx.h"

   (因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #include "stdafx.h" 预编译指示头,所以编译器在此cpp文件中一直到末尾都没有找到它)

解决方式:

1) 在解决方案资源管理器中,右击相应的.cpp文件,点击“属性”

2) 在左侧配置属性中,点开“C/C++”,单击“预编译头”

3) 更改右侧第一行的“创建/使用预编译头”,把选项从“使用预编译头(/Yu)”改成“不使用预编译头”

4) 注:每一个报错的.cpp都要如此更改

2This function or variable may be unsafe. Considerusing ***_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数

解决方式:

根据warning提示的地三句话:use _CRT_SECURE_NO_DEPRECATE

项目|属性|配置属性|C/C++|命令行|附加选项,加入【/D "_CRT_SECURE_NO_DEPRECATE" (注:加入中括号中完整的内容)

3其他错误

可能还会有些比较小的错误,如定义了指针变量没有赋值这种,直接给个NULL即可。

4调用函数

   调用四面体剖分就一个函数:

void tetrahedralize(char*switches, tetgenio *in, tetgenio *out,

tetgenio *addin = NULL, tetgenio *bgmin = NULL);

通常针对散点或者模型新生成四面体网格,使用的也就只有前面三个参数的调用形式:

void tetrahedralize(char*switches, tetgenio *in, tetgenio *out)

4.1命令开关参数设置

这里尤其要注意的命令开关参数char *switches,直接输入命令好像不行,我没整出来,根据编译提示,换成了以下形式:

voidtetrahedralize(tetgenbehavior*b,tetgenio*in,tetgenio*out)

因此,所有的命令都需要针对tetgenbehavior对象的属性进行设置,在此我们需要针对(*.stl)格式的模型网格文件数据进行调用,所以需要命令参数-p;而进一步针对网格优化的考虑,需要引入质量控制参数,则开关-q是需要的;如果需要控制有限单元大小,还可以引入-a参数,具体的可以参照tetgenbehavior.parse_commandline(intargc, char **argv)函数,将对应的开关命令和属性参数对应起来设置。

-q   Quality mesh generation. A minimumradius-edge ratio may be specified (default 2.0).

网格质量控制参数,主要设置最小半径边缘比(默认为2

-a   Applies a maximum tetrahedron volumeconstraint.

控制产生四面体的最大体积

4.2模型stl文件输入设置

   模型文件(*.stl)将通过tetgenio.load_stl(char* filename)函数直接进行载入即可。当然,遇到不需要进行stl文件的中间存储和传递,而是直接从建模程序中导入模型数据的情况,程序员也可以进入到该函数内部分析载入过程,针对其中的点、线、面等拓扑几何数据进行直接赋值。

4.3剖分结果你设置

   四面体的剖分结果,通过tetgenio.save_nodes (char* filename)tetgenio. save_elements (char* filename)tetgenio. save_faces (char* filename)三个方法进行文件保存输出。至于三个文件的格式,参考Tetgen的手册,有很详细的说明。同样,遇到不需要进行结果文件的中间存储和传递,也可以进入到该函数内部分析载入过程,直接得出其中的网格数据。

4.4测试程序源代码


5测试结果

   针对一个圆柱实体模型进行了四面体剖分结果如下:在只有-p的控制下,生成的四面体网格是直接根据模型的边界点进行的;而在加上-q控制以后,会在不满足网格质量的情况下自动的插入点加密,这样就使得网格变得更加密集。-q的控制参数值越小(大于1.0),生成的网格质量越好,但是也会变得更加密集,计算机耗费的时间和内存也更多。

下图为tetview-win.exe查看剖分结果:


博文Word版:VC++2012 MFC实现调用TetGen对stl模型数据进行四面体剖分.docx



https://blog.sciencenet.cn/blog-244606-927529.html

上一篇:选号小软件(MFC实现)
下一篇:测井测压数据回归分析小软件
收藏 IP: 219.133.73.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-19 21:22

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部