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++代码

  1. void surfaceFromMeshTest()
  2. {
  3. double xScat[4], yScat[4], zScat[4];
  4. int nodesize;
  5. int (*elems)[4];
  6. int elemsize;
  7. int nu, nv; // 曲面控制顶点的数目. nu 是曲面在U方向的控制顶点数目; nv是曲面在V方向的控制顶点数目
  8. int udegree, vdegree; //曲面的次数. udegree 是曲面在U方向的次数; vdegree是曲面在V方向的次数
  9. double *xp, *yp, *zp;// 曲面控制顶点的坐标值.总共个数有nu*nv个控制顶点,存储方向按照v方向排列
  10. double *uknot; // 曲面在U方向的节点向量. 长度 = (nu+udegree+1)
  11. double *vknot; // 曲面在V方向的节点向量. 长度 = (nv+vdegree+1);
  12. char *errorlog;
  13. int ret, i, iterate;
  14. double gmaxerr, gmeanerr;
  15. double maxtol_threshold, smoothness_factor;
  16. nodesize = 4;//构造一个简单网格
  17. xScat[0] = 0.0; yScat[0] = 0.0; zScat[0] = 0.0;
  18. xScat[1] = 1.0; yScat[1] = 1.0; zScat[1] = 1.0;
  19. xScat[2] = 1.0; yScat[2] = 0.0; zScat[2] = 0.0;
  20. xScat[3] = 0.0; yScat[3] = 1.0; zScat[3] = 0.0;
  21. elemsize = 2;
  22. elems = (int (*)[4])malloc(sizeof(int)*elemsize*4);
  23. elems[0][0] = 0; elems[0][1] = 1; elems[0][2] = 2; elems[0][3] = -1;
  24. elems[1][0] = 0; elems[1][1] = 1; elems[1][2] = 3; elems[1][3] = -1;
  25. xp = NULL; yp = NULL; zp= NULL; errorlog = NULL; uknot = NULL; vknot = NULL;
  26. nu = 0; nv = 0; udegree = 0; vdegree = 0;
  27. gmaxerr = 999.9; gmeanerr=999.9;
  28. maxtol_threshold = 0.5;
  29. smoothness_factor = 0.001;
  30. iterate = 10;
  31. // 1. 设置曲面拟合参数并拟合一张初始曲面
  32. if(rsSurfaceFromMeshModelFirstFit(xScat, yScat, zScat, nodesize, elems, elemsize, 0, 0, 0, 0,
  33. 0, 17, 17, 3, 3, 1, maxtol_threshold, smoothness_factor, &gmaxerr, &gmeanerr,&errorlog)==0)
  34. {
  35. gmaxerr = rsSurfaceFromMeshModelGetMaxDeviation();
  36. gmeanerr = rsSurfaceFromMeshModelGetMeanDeviation();
  37. // 2. 如果最大距离偏差超过了给定的阈值maxtol_threshold,继续迭代逼近曲面.
  38. for(i=0; i<iterate; i++)
  39. {
  40. if(gmaxerr>maxtol_threshold)
  41. {
  42. rsSurfaceFromMeshModelApply();
  43. gmaxerr = rsSurfaceFromMeshModelGetMaxDeviation();
  44. gmeanerr = rsSurfaceFromMeshModelGetMeanDeviation();
  45. }
  46. }
  47. rsLibFreeMemory((void *)errorlog); errorlog = NULL;
  48. // 输出曲面数据
  49. ret = rsSurfaceFromMeshModelGetFace(&xp, &yp, &zp, &nu, &nv, &udegree, &vdegree, &uknot, &vknot, &errorlog);
  50. if(ret==0)
  51. {
  52. // 在这里把曲面加入你的系统中的曲面数据库
  53. printf("return status log: %s\n", errorlog);
  54. printf(" control points: U = %d V = %d\n", nu, nv );
  55. printf(" degree: U = %d V = %d\n", udegree, vdegree);
  56. printf(" knot Vector U :\n");
  57. for(i = 0; i < (nu + udegree + 1); i++)
  58. {
  59. printf(" %f\n", uknot[i]);
  60. }
  61. printf(" knot Vector V :\n");
  62. for(i = 0; i < (nv + vdegree + 1); i++)
  63. {
  64. printf(" %f\n", vknot[i]);
  65. }
  66. printf("Control points coordinate value: \n");
  67. for(i = 0; i < nu; i++)
  68. for(j = 0; j < nv; j++)
  69. {
  70. k = i*nv + j;
  71. printf("%d %d , x = %f y = %f z = %f\n", i, j, xp[k], yp[k], zp[k]);
  72. }
  73. }
  74. }
  75. }
  76. else
  77. {
  78. printf("return status log: %s\n", errorlog);
  79. }
  80. // 最后,释放所有内存。这一步非常重要,不能省略.
  81. rsSurfaceFromMeshModelRemove();
  82. rsLibFreeMemory((void *)errorlog);
  83. rsLibFreeMemory((void *)xp);
  84. rsLibFreeMemory((void *)yp);
  85. rsLibFreeMemory((void *)zp);
  86. rsLibFreeMemory((void *)uknot);
  87. rsLibFreeMemory((void *)vknot);
  88. free(elems);
  89. }

返回顶部