RsMapmesh2NewMeshQF
RsMapmesh2NewMeshQF
给定两个网格(均为四边形三角形混合网格),设其中一个网格为源网格,另一个为目标网格,两个网格的顶点数目不同,单元数目也不同,拓扑结构也不同。此函数以源网格为参考模板,在目标网格上重新划分出新的网格。也可以在源网格和目标网格之间的任意位置上按照给定的比例 (比例取0到1之间的任意值)生成一个新的网格。
接口定义
extern "C" __declspec(dllimport) bool RsMapmesh2NewMeshQF(double* orig_x, double* orig_y, double* orig_z, int orig_nodeNum,
int* orig_tri1, int* orig_tri2, int* orig_tri3, int* orig_tri4, int orig_elemsize,
double* target_x, double* target_y, double* target_z, int target_nodeNum,
int* target_tri1, int* target_tri2, int* target_tri3, int* target_tri4, int target_elemsize,
int* orig_map_bnode, int* target_map_bnode, int map_num, double feed,
char*& error_report, int* err_size)
接口参数
输入数据:
源网格数据:
double *orig_x-----源网格中第i个顶点的x坐标值
double *orig_y-----源网格中第i个顶点的y坐标值
double *orig_z----- 源网格中第i个顶点的z坐标值
int orig_nodeNum----- 源网格中顶点的数目
int* orig_tri1----- 源网格中第i个单元的第一个顶点索引号,比如,该值为1,顶点坐标就是(orig_x[1], orig_y[1], orig_z[1])
int* orig_tri2----- 源网格中第i个单元的第二个顶点索引号
int* orig_tri3----- 源网格中第i个单元的第三个顶点索引号
int* orig_tri4----- 源网格中第i个单元的第四个顶点索引号,如果单元是三角片,该值为-1
int orig_elemsize----- 源网格中单元的数目
目标网格数据:
double *target_x-----目标网格中第i个顶点的x坐标值
double *target_y-----目标网格中第i个顶点的y坐标值
double *target_z----- 目标网格中第i个顶点的z坐标值
int target_nodeNum----- 目标网格中顶点的数目
int* target_tri1----- 目标网格中第i个单元的第一个顶点索引号,比如,该值为1,顶点坐标就是(orig_x[1], orig_y[1], orig_z[1])
int* target_tri2----- 目标网格中第i个单元的第二个顶点索引号
int* target_tri3----- 目标网格中第i个单元的第三个顶点索引号
int* target_tri4----- 目标网格中第i个单元的第四个顶点索引号,如果单元是三角片,该值为-1
int target_elemsize----- 目标网格中单元的数目
边界顶点配对数据:
int * orig_map_bnode -------- 源网格上的边界顶点 id
int *target_map_bnode -------- 目标网格上的边界顶点 id,该点与源网格上的边界顶点预先设定了对应关系
int map_num -------- 点对的数目 (orig_map_bnode[i], target_map_bnode[i])为对应的一个点对(pair)
double feed ------ 源网格到目标之间的比例数,新网格按照该比例对应的位置生成。取值范围[0,1],取值为1,新网格落在目标网格上
输出数据
double *orig_x-----新网格中第i个顶点的x坐标值
double *orig_y-----新网格中第i个顶点的y坐标值
double *orig_z----- 新网格中第i个顶点的z坐标值
char*& error_report, int* err_size
char*& error_report ------- 错误报告
int* err_size ------- 错误报告的字符长度
返回值
true -------- 成功
false ------- 失败
函数调用示范c++代码
void surfaceFromMeshTest(){double xScat[4], yScat[4], zScat[4];int nodesize;int (*elems)[4];int elemsize;int nu, nv; // 曲面控制顶点的数目. nu 是曲面在U方向的控制顶点数目; nv是曲面在V方向的控制顶点数目int udegree, vdegree; //曲面的次数. udegree 是曲面在U方向的次数; vdegree是曲面在V方向的次数double *xp, *yp, *zp;// 曲面控制顶点的坐标值.总共个数有nu*nv个控制顶点,存储方向按照v方向排列double *uknot; // 曲面在U方向的节点向量. 长度 = (nu+udegree+1)double *vknot; // 曲面在V方向的节点向量. 长度 = (nv+vdegree+1);char *errorlog;int ret, i, iterate;double gmaxerr, gmeanerr;double maxtol_threshold, smoothness_factor;nodesize = 4;//构造一个简单网格xScat[0] = 0.0; yScat[0] = 0.0; zScat[0] = 0.0;xScat[1] = 1.0; yScat[1] = 1.0; zScat[1] = 1.0;xScat[2] = 1.0; yScat[2] = 0.0; zScat[2] = 0.0;xScat[3] = 0.0; yScat[3] = 1.0; zScat[3] = 0.0;elemsize = 2;elems = (int (*)[4])malloc(sizeof(int)*elemsize*4);elems[0][0] = 0; elems[0][1] = 1; elems[0][2] = 2; elems[0][3] = -1;elems[1][0] = 0; elems[1][1] = 1; elems[1][2] = 3; elems[1][3] = -1;xp = NULL; yp = NULL; zp= NULL; errorlog = NULL; uknot = NULL; vknot = NULL;nu = 0; nv = 0; udegree = 0; vdegree = 0;gmaxerr = 999.9; gmeanerr=999.9;maxtol_threshold = 0.5;smoothness_factor = 0.001;iterate = 10;// 1. 设置曲面拟合参数并拟合一张初始曲面if(rsSurfaceFromMeshModelFirstFit(xScat, yScat, zScat, nodesize, elems, elemsize, 0, 0, 0, 0,0, 17, 17, 3, 3, 1, maxtol_threshold, smoothness_factor, &gmaxerr, &gmeanerr,&errorlog)==0){gmaxerr = rsSurfaceFromMeshModelGetMaxDeviation();gmeanerr = rsSurfaceFromMeshModelGetMeanDeviation();// 2. 如果最大距离偏差超过了给定的阈值maxtol_threshold,继续迭代逼近曲面.for(i=0; i<iterate; i++){if(gmaxerr>maxtol_threshold){rsSurfaceFromMeshModelApply();gmaxerr = rsSurfaceFromMeshModelGetMaxDeviation();gmeanerr = rsSurfaceFromMeshModelGetMeanDeviation();}}rsLibFreeMemory((void *)errorlog); errorlog = NULL;// 输出曲面数据ret = rsSurfaceFromMeshModelGetFace(&xp, &yp, &zp, &nu, &nv, &udegree, &vdegree, &uknot, &vknot, &errorlog);if(ret==0){// 在这里把曲面加入你的系统中的曲面数据库printf("return status log: %s\n", errorlog);printf(" control points: U = %d V = %d\n", nu, nv );printf(" degree: U = %d V = %d\n", udegree, vdegree);printf(" knot Vector U :\n");for(i = 0; i < (nu + udegree + 1); i++){printf(" %f\n", uknot[i]);}printf(" knot Vector V :\n");for(i = 0; i < (nv + vdegree + 1); i++){printf(" %f\n", vknot[i]);}printf("Control points coordinate value: \n");for(i = 0; i < nu; i++)for(j = 0; j < nv; j++){k = i*nv + j;printf("%d %d , x = %f y = %f z = %f\n", i, j, xp[k], yp[k], zp[k]);}}}}else{printf("return status log: %s\n", errorlog);}// 最后,释放所有内存。这一步非常重要,不能省略.rsSurfaceFromMeshModelRemove();rsLibFreeMemory((void *)errorlog);rsLibFreeMemory((void *)xp);rsLibFreeMemory((void *)yp);rsLibFreeMemory((void *)zp);rsLibFreeMemory((void *)uknot);rsLibFreeMemory((void *)vknot);free(elems);}