stl文件c语言,科学网—VC++调用TetGen对stl文件模型数据进行四面体剖分 - 杨清的博文...

本文详细介绍了如何在VisualC++2012MFC环境下,结合TetGen库进行四面体网格剖分。首先,文章提到了两种调用TetGen的方式,一种是通过命令行,另一种是源码级集成。然后,重点讲述了源码级集成的步骤,包括解决预编译头文件问题、消除安全警告以及处理其他编译错误。接着,文章讨论了如何设置命令开关参数、加载模型文件和保存剖分结果。最后,展示了不同参数设置下的四面体网格剖分效果,并提供了测试程序源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Visual C++ 2012 MFC+TetGen 1.5

1前言

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

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

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

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

2调用

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

102222153byf1631z47814.jpg

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测试程序源代码

102959tkj0bbhtbi4eih7b.jpg

5测试结果

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

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

103158vyfizzmofzff88py.jpg

转载本文请联系原作者获取授权,同时请注明本文来自杨清科学网博客。

链接地址:http://blog.sciencenet.cn/blog-244606-927529.html

上一篇:选号小软件(MFC实现)

下一篇:测井测压数据回归分析小软件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值