triangle中用到的数据结构
三种:vertices,triangle和subsegments。一个vertex包含mesh中的点和它本身的属性。subsegments包含外边界边,孔(hole)的边界边以及内部边界边中分离两个triangle的部分。subsegments是用户自己定义的边界。一个triangle包含一个三个点的list,三个相邻三角形的list,三个相邻subsegments的list,任意数量用户自定义的浮点数特性,可选的区域限制(区域中每个三角形允许的面积上限,用于细化三角形)。
编译时出现的错误
Triangle是C语言编写的开源库,是非常好用的平面三角网格划分工具。
在C++工程中,如果出现:
1>Mesh3D.obj : error LNK2019: 无法解析的外部符号 "void __cdecl triangulate(char *,struct triangulateio *,struct triangulateio *,struct triangulateio *)" (?triangulate@@YAXPADPAUtriangulateio@@11@Z),该符号在函数 "public: void __thiscall Mesh3D::DoTriangle(void)" (?DoTriangle@Mesh3D@@QAEXXZ) 中被引用
1>D:\SHANGHAI-ITECH\homework\Sketching Interface\Win32\Debug\\Interfacefor3D.exe : fatal error LNK1120: 1 个无法解析的外部命令
需要注意在#include “triangle/triangle.h”处需要添加extern “C”。
triangle.h中的triangulate()是重载函数,由于C与C++编译器对重载函数的处理方式不同,导致连接器找不到正确的triangle函数,所以才会出现上文中的LNK1120:无法解析的外部命令错误。
#ifdef ANSI_DECLARATORS
void triangulate(char *, struct triangulateio *, struct triangulateio *,
struct triangulateio *);
void trifree(VOID *memptr);
#else /* not ANSI_DECLARATORS */
void triangulate();
void trifree();
#endif /* not ANSI_DECLARATORS */
在包含头文件前,加上extern “C”可以