|||
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的过程中,编译过程中会出现几个问题:
(1)fatal 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都要如此更改
(2)This 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
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-23 00:25
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社