RsVmbMapBuildLayerVolumeMesh_RR
RsVmbMapBuildLayerVolumeMesh_RR
给定两个网格(均为四边形三角形混合网格),设其中一个网格为源网格,另一个为目标网格,两个网格的顶点数目不同,单元数目也不同,拓扑结构也不同。此函数以源网格为参考模板,在源网格和目标网格之间生成体网格。
接口定义
extern "C" __declspec(dllimport) bool RsVmbMapBuildLayerVolumeMesh_RR(
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,
double* sweepx, double* sweepy, double* sweepz, int bdy_num,
double*& volx, double*& voly, double*& volz, int tlayer_num,
char*& error_report, int* err_size,
double*& layer_bdyx, double*& layer_bdyy, double*& layer_bdyz, int* layer_bdyn)
接口参数
输入数据:
源网格数据:
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----- 目标网格中单元的数目
边界顶点扫掠数据:
double * sweepx -------- 每层上扫掠线的点,长度为bady_num*tlayer_num
double * sweepy -------- 每层上扫掠线的点,长度为bady_num*tlayer_num
double * sweepz -------- 每层上扫掠线的点,长度为bady_num*tlayer_num
int bdy_num -------- 扫掠线的数目
int tlayer_num -------- 体网格的层数
输出数据
double*& volx-----
double*& voly-----
double*& volz-----
char*& error_report------
int* err_size -----
double*& layer_bdyx-----
double*& layer_bdyy-----
double*& layer_bdyz-----
int* layer_bdyn----
返回值
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);}