点击查看详细介绍

UF_MODL_create_reparam_sheet() 函数的参数解释说明、函数详细用法,以及实例代码演示

misnn 9年前 675 0

购买与咨询 NX 二次开发视频教程,请联系微信号:13890821008  QQ号:85585969  


函数结构:
UF_MODL_create_reparam_sheet
(
int proj_type,
int drv_type,
int check_overlap,
int num_primary,
tag_t * prim_cvs,
int num_cross,
tag_t * cros_cvs,
double * proj_vec,
int num_fs,
tag_t * faces,
double tols [ 5 ],
tag_t * new_face,
int * tol_achieved
)

函数说明:
创建一个单一的,双三次,B面,片体近似于四边现有的几种面孔区域。司机曲线或B-表面必须位于目标面的边界内。基本上,在“驱动器”表面点沿某个给定的预测载体或沿着驱动表面法线矢量到“目标”面对(那些被近似)。这些预测的点,然后用于构造近似片体。你能想到的预测从原来的每一个点发射射线的过程击中目标的面孔。近似??片体的精度取决于供给公差。参见公差部分获取更多信息。投影类型,矢量和大小限制(TOL [4])如果proj_type被设置为使用驱动器表面正常的话,你不需要提供的任何数据的投影向量(如果它被忽略做)。否则,投影矢量必须被指定。当使用表面法线的预测,你可能会提供一个宽容值(TOL [4])。此值有助于算法确定哪个点上近似??面临着使用,如果脸部周围弯曲和发出的射线发现两个交点。零值将导致系统默认为10倍的内部距离公差。如果你的驱动程序是远离目标(10倍以上的容差),那么你应该调整投影大小限制。驱动器类型在内部,驾驶员总是b曲面。然而,对于方便起见,我们允许你选择曲线的网格,而不是表面。我们只是从这个网状曲线建立b曲面内部。因此,当您使用曲线司机,他们必须满足所有需要建立一个曲线网格的自由形式的条件。最后一个驱动程序类型选项,自行改装,提供了一个快捷方式近似??单未修剪b曲面。如果你是,你可以这样做给予高度的表面,并且希望以较低的近似它度面(重新参数化功能总是输出双三次面,即,在U方向和V方向程度3的表面)。重叠检查如果此选项设置为“是”,则系统会检查并试图处理重叠的面孔。该系统尝试相互交叉线与附近所有的面孔,找到“至上”投影点。这可以是一个时间详尽过程。如果重叠选项设置为“无”的算法假定每个发出的光线只能打一个目标的脸,所以它停止并尽快找到命中进行到下一射线。这是更短的时间详尽如果目标面实际上并不重叠,或者如果他们在一起已经接近在他们重叠的区域。曲线如果你指明了主要和交叉曲线只需要驱动程序类型是曲线。小学和交叉曲线必须在数至少有两个并且小于50的曲线的数目和曲线如果指定比其他曲线驱动程序类型的变量被忽略。该曲线将要用于构建一个曲线目游离形式。因此,每个主曲线必须彼此相交的交叉曲线的一次且仅一次。如果你怀疑你的曲线都不合适,你可能要之前自己创建曲线目自由形式体使用重新参数化功能。如果你指定的脸或自行改装的驱动程序类型,比指定适当的脸部标记。显然,使用现有的驱动器的表面是要比在使用同一组的驱动曲线的更方便一遍又一遍。所以,如果你反复使用的功能在一个循环中,它可能是值得构建b曲面片体作为驱动器使用。公差这允许您指定要使用的公差逼近过程。该算法实际上是具有非常开始时简单近似表面(这是不太可能内公差),然后逐渐使它更加复杂,直到它能够复制原始形状为指定的公差范围内。运用更严格的公差产生更复杂的结果,而这消耗存储空间和减慢所有后续操作。因此,您使用的公差不应该比他们需要任何更紧。我们预计算法与左右距离的公差可以使用.039至0.195英寸(1到5毫米),2至20的角公差度。如果你在很波浪状的表面采用严密的角度公差,算法生成的补丁数量巨大。如果同时设置角公差为90度,在甚至不检查则角偏差,这大大加快了处理。为了实现合理的性能,算法不严谨检查近似面和原稿之间的偏差。实际上,我们只是检查点的小阵列上的每个补丁逼近的脸。经验表明,这是一个合理的办法估计实际的错误在实际情况下,虽然人们可以当然构建病理例子,这种方 *** 失败。严格的公差可在边缘处被指定,以确保更好地与相邻的面对齐。在室内宽松的公差可被指定为允许创建一个更简单的脸。目标面孔面可以在一个单一的机构或多个机构。只有脸部标记可被使用。如果指定了自改装此参数被忽略选项??驱动程序类型。产量该函数返回创建的片体和标志的标签说明表面能够满足宽容的地方。公差标志有,如果没有创建一个身体没有任何意义。创建面对的是一个双立方体B面采用双结,这意味着它是C1连续见词汇换句话说,脸是光滑的,它不具有任何尖锐的脊或尖。所得到的物体是不相关联的输入数据。在片体可能不会逼近过程中,如果达到宽容,过程中,贴片之一被发现是在宽度或长度小比内侧距离公差。这通常表明扰动或在输入面中的一个的区域的其他异常。你不妨来分析偏差,有效性产生的脸上,形状。该算法并没有真正做任何尝试保留该输入的“性格”的面孔,它只是试图保持公差范围内。小的特点,有时会平滑路程,多余的皱纹可以引入,特别是在具有严格的曲率的区域。提示和技巧该算法假定您的输入面是相当干净。它是设计为处理某些类型的异常,如小的间隙(最多1mm左右)重叠,提供了重叠面是大致相同的高度,非常薄的面(高达0.1毫米宽),并重复面对。在所有的数字是按照此提示和技巧节中,我们展示驱动表面和靶的侧视图面。司机面目标面孔上面总是显示。然而,近似处理有处理输入数据的困难,其中有多余的面是在从所需面不同的高度。重叠的面是,但没有得到适当修剪回(例如,当剔骨)不同高度的面孔陡峭的山脊,那里的面孔并不顺利加入backdrafts和削弱几乎垂直的墙壁。对于简单的造型,搭配宽松的公差,蛮力的方式,只用四个驱动曲线,可能工作好。但服用一些保健在构建驱动曲线通常是值得额外的努力。如果你的目标表面包括特征线长一样的山脊或在一个方向上的曲率半径小山谷,你应该尝试构建运行大致平行于这些驱动曲线。这使得它更容易为算法使用合理少数补丁来实现宽容。这可能是多建几个近似的面孔是一个好主意,然后缝在一起,而不是试图接近一个单面的整个区域。这往往会产生更少的数据和更小的车型。这其中的一个原因是对于B-表面自然贴片结构。在单个表面上的“接缝”贴片之间必须始终运行一路在表面,从一个边缘到相对的边缘。这意味着,任何被引入到表面中一个区域的复杂性在整个表面传播。如果单独近似不同的地区,你们可以一起缝制逼近面对成片体。

函数参数:
第1个参数为输入:
输入int 整数型的参数,参数的变量格式为proj_type,投影0 =使用输入向量1 =使用驱动器表面正常的类型

第2个参数为输入:
输入int 整数型的参数,参数的变量格式为drv_type,驱动器0=曲线类型1=平面(B面型)2=自改装(B面型)

第3个参数为输入:
输入int 整数型的参数,参数的变量格式为check_overlap,标志用于控制重叠检查0 =否1 =是

第4个参数为输入:
输入int 整数型的参数,参数的变量格式为num_primary,初级曲线数量

第5个参数为输入:
prim_cvs代表参数变量,tag_t * 为输入参数类型,主曲线的对象标识符(脸的对象标识符,如果drv_typ!= 0)

第6个参数为输入:
输入int 整数型的参数,参数的变量格式为num_cross,交叉曲线数量

第7个参数为输入:
cros_cvs代表参数变量,tag_t * 为输入参数类型,交叉曲线的对象标识符

第8个参数为输入:
输入double * 双精度类型的参数,参数的变量格式为proj_vec,投影矢量

第9个参数为输入:
输入int 整数型的参数,参数的变量格式为num_fs,目标面数

第10个参数为输入:
faces代表参数变量,tag_t * 为输入参数类型,目标面孔的对象标识符

第11个参数为输入:
输入double 双精度类型的参数,参数的变量格式为tols [ 5 ],公差:[0]=在表面的内部距离公差[1] =角在表面的内部容差(度)[2] =外边缘距离公差[3] =外边缘角容差(度)[4] =投影尺寸限制(0 - 如果没有限制)

第12个参数为输出:
new_face代表参数变量,tag_t * 为输出参数类型,得到的脸对象标识符

第13个参数为输出:
输出int * 整数型的参数,参数的变量格式为tol_achieved,标志,指示将所得面取得的公差要求。0 =否1 =是

UF_MODL_create_reparam_sheet函数实例代码演示:
下面的示例代码创建两个重新参数Bsurfaces。两个表面中的较小使用Bsurface作为驱动器。该两个表面的较大的使用四个线(矩形)作为驱动曲线。本实施例的结果示于图。
[quote]
#include <stdio.h>
#include<math.h>
#include <uf_modl.h>
#include <uf.h>
#include <uf_curve.h>
#define UF_CALL(X) (report( __FILE__, __LINE__, #X, (X)))
static int report( char *file, int line, char *call, int irc)
{
if (irc)
{
char messg[133];
printf("%s, line %d: %s\n", file, line, call);
(UF_get_fail_message(irc, messg)) ?
printf(" returned a %d\n", irc) :
printf(" returned error %d: %s\n", irc, messg);
}
return(irc);
}
static void do_ugopen_api(void)
{
double pole1[64];
double pole2[64];
double pole3[64];
double pole4[64];
double pole5[64];
double pt1[3] = {0.1,-2.9,1.5};
double pt2[3] = {0.1,2.9,1.5};
double pt3[3] = {6.0,2.9,1.5};
double pt4[3] = {6.0,-2.9,1.5};
double u_knot[9] = {0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0};
double v_knot[9] = {0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0};
double weight = 1.0;
double proj_vec[3] = {0.0,0.0,-1.0};
double tols1[5] = {0.01,90.0,0.001,90.0,0.0};
double tols2[5] = {0.01,90.0,0.001,90.0,0.0};
int num_pole_u = 4;
int num_pole_v = 4;
int u_ord = 4;
int v_ord = 4;
int knot1_fix;
int pole1_fix;
int i,j,k = 0,l = 0,m = 0,n = 0,p = 0;
int proj_type1 = 1;
int proj_type2 = 0;
int drv_type1 = 1;
int drv_type2 = 0;
int check_overlap = 0;
int num_primary = 2;
int num_cross = 2;
int num_fs = 4;
int tol_achieved;
int count[5];
tag_t bsurf[4];
tag_t driv_surf;
tag_t faces[4];
tag_t driver_face;
tag_t prim_cvs[2];
tag_t cros_cvs[2];
tag_t new_face;
uf_list_p_t face_list1;
uf_list_p_t face_list2;
uf_list_p_t face_list3;
uf_list_p_t face_list4;
uf_list_p_t face_list5;
/* Create and load the homogeneous arrays. */

for(i = 0; i < 4; i++){
for(j = 0; j < 4; j++){
pole1[k++] = i;
pole1[k++] = j;
pole1[k++] = sin(i/(i+.9));
pole1[k++] = weight;
}
}
for(i= 0; i < 4; i++){
for(j = 0; j < 4; j++){
pole2[l++] = i+3.1;
pole2[l++] = j;
pole2[l++] = -cos(i/(i+.9)) + 1.695;
pole2[l++] = weight;
}
}

for(i= 0; i < 4; i++){
for(j = 0; j < 4; j++){
pole3[m++] = i;
pole3[m++] = j+(-3.1);
pole3[m++] = sin(i/(i+.9));
pole3[m++] = weight;
}
}
for(i= 0; i < 4; i++){
for(j = 0; j < 4; j++){
pole4[n++] = i+3.1;
pole4[n++] = j+(-3.1);
pole4[n++] = -cos(i/(i+.9)) + 1.695;
pole4[n++] = weight;
}
}
for(i= 0; i < 4; i++){
for(j = 0; j < 4; j++){
pole5[p++] = i*1.4+0.9;
pole5[p++] = j*(-1.6)+2.4;
pole5[p++] = sin((i*i)/(i+.9)) + 3.0;
pole5[p++] = weight;
}
}

/* Create linked lists for UF_MODL_ask_body_faces. */
UF_CALL(UF_MODL_create_list(&face_list1));
UF_CALL(UF_MODL_create_list(&face_list2));
UF_CALL(UF_MODL_create_list(&face_list3));
UF_CALL(UF_MODL_create_list(&face_list4));
UF_CALL(UF_MODL_create_list(&face_list5));
/* Create driver Curves. */
FTN(uf5050)(pt1,pt2,&prim_cvs[0]);
FTN(uf5050)(pt2,pt3,&cros_cvs[0]);
FTN(uf5050)(pt3,pt4,&prim_cvs[1]);
FTN(uf5050)(pt4,pt1,&cros_cvs[1]);
/* Create target B-surfaces. */
UF_CALL(UF_MODL_create_bsurf(num_pole_u,num_pole_v,
u_ord,v_ord,u_knot,v_knot,pole1,
&bsurf[0],&knot1_fix,&pole1_fix));
UF_CALL(UF_MODL_create_bsurf(num_pole_u,num_pole_v,
u_ord,v_ord,u_knot,v_knot,pole2,
&bsurf[1],&knot1_fix,&pole1_fix));


UF_CALL(UF_MODL_create_bsurf(num_pole_u,num_pole_v,
u_ord,v_ord,u_knot,v_knot,pole3,
&bsurf[2],&knot1_fix,&pole1_fix));
UF_CALL(UF_MODL_create_bsurf(num_pole_u,num_pole_v,
u_ord,v_ord,u_knot,v_knot,pole4,
&bsurf[3],&knot1_fix,&pole1_fix));
/* Create driver B-surface */
UF_CALL(UF_MODL_create_bsurf(num_pole_u,num_pole_v,
u_ord,v_ord,u_knot,v_knot,pole5,&driv_surf,
&knot1_fix,&pole1_fix));
/* Load the linked lists with face tags */
UF_CALL(UF_MODL_ask_body_faces(bsurf[0],&face_list1));
UF_CALL(UF_MODL_ask_body_faces(bsurf[1],&face_list2));
UF_CALL(UF_MODL_ask_body_faces(bsurf[2],&face_list3));
UF_CALL(UF_MODL_ask_body_faces(bsurf[3],&face_list4));
UF_CALL(UF_MODL_ask_body_faces(driv_surf,&face_list5));
/* Error check the lists. */
UF_CALL(UF_MODL_ask_list_count(face_list1,&count[0]));
UF_CALL(UF_MODL_ask_list_count(face_list2,&count[1]));
UF_CALL(UF_MODL_ask_list_count(face_list3,&count[2]));
UF_CALL(UF_MODL_ask_list_count(face_list4,&count[3]));
UF_CALL(UF_MODL_ask_list_count(face_list5,&count[4]));
/* Get the face tags */
UF_CALL(UF_MODL_ask_list_item(face_list1,0,&faces[0]));
UF_CALL(UF_MODL_ask_list_item(face_list2,0,&faces[1]));
UF_CALL(UF_MODL_ask_list_item(face_list3,0,&faces[2]));
UF_CALL(UF_MODL_ask_list_item(face_list4,0,&faces[3]));
UF_CALL(UF_MODL_ask_list_item(face_list5,0,&driver_face));
/* Deallocate memory used by lists. */
UF_MODL_delete_list(&face_list1);
UF_MODL_delete_list(&face_list2);
UF_MODL_delete_list(&face_list3);
UF_MODL_delete_list(&face_list4);
UF_MODL_delete_list(&face_list5);
/* Reparameterize using B-surface as a driver. */
UF_CALL(UF_MODL_create_reparam_sheet(proj_type1,drv_type1,
check_overlap,num_primary,&driver_face,
num_cross,cros_cvs,proj_vec,num_fs,
faces,tols1,&new_face,&tol_achieved));
/* Reparameterize using curves as a driver. */
UF_CALL(UF_MODL_create_reparam_sheet(proj_type2,drv_type2,
check_overlap,num_primary,prim_cvs,
num_cross,cros_cvs,proj_vec,num_fs,
faces,tols2,&new_face,&tol_achieved));
}
void ufusr(char *param, int *retcode, int param_len)
{
if (!UF_CALL(UF_initialize()))
{
do_ugopen_api();
UF_CALL(UF_terminate());
}
}
int ufusr_ask_unload(void)
{
return (UF_UNLOAD_IMMEDIATELY);
}




[/quote]

0

最新回复 (0)
请登录后发表新帖