RsTriQuadMeshWithCurvesUnfolderQF
RsTriQuadMeshWithCurvesUnfolderQF
此函数将一个四边形和三角形混合的三维网格展开成二维平面网格,如果三维网格上有曲线,该曲线也被展开到二维平面。
接口定义
extern "C" __declspec(dllimport) int RsTriQuadMeshWithCurvesUnfolderQF(
double* xScat, double* yScat, double* zScat, int nodesize,
int* elems1, int* elems2,int* elems3, int* elems4, int elemsize,
double* pxs, double* pys, double* pzs, int point_num,
double tnormalu[3], double tnormalv[3], double tnormalw[3],
double area_peri[4])
接口参数
输入数据:
源网格数据:
double *xScat-----源网格中第i个顶点的x坐标值,既是输入也是输出,输出的坐标是二维平面网格的x坐标值,二维平面网格嵌入在三维空间任意位置上
double *yScat-----源网格中第i个顶点的y坐标值,既是输入也是输出,输出的坐标是二维平面网格的y坐标值,二维平面网格嵌入在三维空间任意位置上
double *zScat----- 源网格中第i个顶点的z坐标值,既是输入也是输出,输出的坐标是二维平面网格的z坐标值,二维平面网格嵌入在三维空间任意位置上
int nodesize ----- 源网格中顶点的数目
int* elems1----- 源网格中第i个单元的第一个顶点索引号,比如,该值为1,顶点坐标就是(orig_x[1], orig_y[1], orig_z[1])
int* elems2----- 源网格中第i个单元的第二个顶点索引号
int* elems3----- 源网格中第i个单元的第三个顶点索引号
int* elems4----- 源网格中第i个单元的第四个顶点索引号,如果单元是三角片,该值为-1
int elemsize----- 源网格中单元的数目
double* px-----三维网格上曲线点的x坐标,既是输入也是输出
double* py----- 三维网格上曲线点的y坐标,既是输入也是输出
double* pz----- 三维网格上曲线点的z坐标,既是输入也是输出
int point_num-----三维网格上曲线点的数目
输出数据
double tnormalu[3]-----U方向向量
double tnormalv[3]-----V方向向量
double tnormalw[3]----- W方向向量
double area_peri[4]----- 三维网格的面积和周长以及二维网格的面积和周长
返回值
0 -------- 成功
-1 ------- 失败
函数调用示范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);}