admin 发表于 2014-7-29 12:01:13

UG NX 二次开发中关于 ufun向量的使用教程合集

在UG的二次开发中,通常需要使用向量来进行判断,此处给出常用的向量使用教程。以二维向量为例,三维以此类推。
源代码如下!





char msg;
const double vec1={0.2,3.4};
const double vec2={1.5,4.5};
double scale = 1.5;
double scale1 = 1.3;
double scale2 = -1.1;
double sumVec,vec_comb,vec_perp;
double oscale1,oscale2;
double tol = 0.0254;
const double vec_src={1,2};
double vec_dst,cross_product,distance,magnitude,mid_pnt;
double unit_vec,scale_vec,sub_vec,neg_vec;
int isEqual,isParallel,isPerpen,isZero;
       
double parameter = 0.5 ;
double pnt1 = {0,0};
double pnt2 = {2,5};
double pnt_on_seg;


//------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------


void ufvecTest::do_it()
{

        // TODO: add your code here
       
       
        /*
        ======================
        1 UF_VEC2_add : 两个向量相加
        vec1 + vec2 = sumVec
        ======================
        */
        lw->Open();
        UF_VEC2_add(vec1,vec2,sumVec);
        sprintf_s(msg,sizeof(msg),"vec1{%f,%f}+vec2{%f,%f}={%f,%f}",vec1,vec1,vec2,vec2,sumVec,sumVec);
        lw->WriteLine(msg);

        /*
        ======================
        2 UF_VEC2_affine_comb : 仿射变换
        vec_comb = vec1 + scale * vec2;
        ======================
        */

        UF_VEC2_affine_comb(vec1,scale,vec2,vec_comb);
        sprintf_s(msg,sizeof(msg),"vec1{%f,%f}+%f * vec2{%f,%f}={%f,%f}",vec1,vec1,scale,vec2,vec2,vec_comb,vec_comb);
        lw->WriteLine(msg);

        /*
        ======================
        3 UF_VEC2_ask_perpendicular : 求出垂直的向量
        vec1.vec_perp = 0
        ======================
        */

        UF_VEC2_ask_perpendicular(vec1,vec_perp);
        sprintf_s(msg,sizeof(msg),"vec1{%f,%f} . vec_perp{%f,%f}= 0",vec1,vec1,vec_perp,vec_perp);
        lw->WriteLine(msg);

        /*
        ======================
        4 UF_VEC2_components : 求出垂直的向量
        vec_comb = scale1 vec1 + scale2vec2
        返回: 0 可计算 1 平行
        ======================
        */

        int result= UF_VEC2_components(vec1,vec2,vec_comb,tol,&oscale1,&oscale2);
        sprintf_s(msg,sizeof(msg),"oscale1 = %f,oscale2 = %f, result = %d ",oscale1,oscale2,result);
        lw->WriteLine(msg);

        /*
        ======================
        5 UF_VEC2_convex_comb : 计算点在直线上的位置
        pnt_on_seg = (parameter pnt1) + ((1.0 - parameter) pnt2).
        ======================
        */


        UF_VEC2_convex_comb(parameter,pnt1,pnt2,&pnt_on_seg);
        sprintf_s(msg,sizeof(msg),"pnt_on_seg = %f",pnt_on_seg);
        lw->WriteLine(msg);

                /*
        ======================
        6 UF_VEC2_copy : 向量拷贝
        vector (vec_dst = vec_src).
        ======================
        */


        UF_VEC2_copy(vec_src,vec_dst);
        sprintf_s(msg,sizeof(msg),"vec_src = {%f,%f}\tvec_dst = {%f,%f}",vec_src,vec_src,vec_dst,vec_dst);
        lw->WriteLine(msg);

       
                /*
        ======================
        7 UF_VEC2_cross : 向量向量积
        cross_product = vec1 x vec2
        ======================
        */


        UF_VEC2_cross(vec1,vec2,&cross_product);
        sprintf_s(msg,sizeof(msg),"vec1{%f,%f} X vec2{%f,%f}= %f",vec1,vec1,vec2,vec2,cross_product);
        lw->WriteLine(msg);


                /*
        ======================
        8 UF_VEC2_dot : 向量数量积
        cross_product = vec1 . vec2
        ======================
        */


        UF_VEC2_dot(vec1,vec2,&cross_product);
        sprintf_s(msg,sizeof(msg),"vec1{%f,%f} . vec2{%f,%f}= %f",vec1,vec1,vec2,vec2,cross_product);
        lw->WriteLine(msg);


       
                /*
        ======================
        9 UF_VEC2_distance : 两点距离
        (distance = ||pnt1 - pnt2||)
        ======================
        */


        UF_VEC2_distance(vec1,vec2,&distance);
        sprintf_s(msg,sizeof(msg),"||vec1{%f,%f} - vec2{%f,%f}||= %f",vec1,vec1,vec2,vec2,distance);
        lw->WriteLine(msg);

        /*
        ======================
        10 UF_VEC2_is_XX : 判断矢量关系
                0 = false
          1 = true
        ======================
        */


        UF_VEC2_is_equal(vec1,vec2,tol,&isEqual); //相等
        UF_VEC2_is_parallel(vec1,vec2,tol,&isParallel); //平行
        UF_VEC2_is_perpendicular(vec1,vec2,tol,&isPerpen);//垂直
        UF_VEC2_is_zero(vec1,tol,&isZero);//为0

        sprintf_s(msg,sizeof(msg),"vec1{%f,%f},ve2{%f,%f} is %d equal,%d parallel,%d perpendicular,%d zero",vec1,vec1,vec2,vec2,isEqual,isParallel,isPerpen,isZero);
        lw->WriteLine(msg);

        /*
        ======================
        11 UF_VEC2_linear_comb : 线形组合
                vec_comb = (scale vec1) + (scale2 vec2)
        ======================
        */

        UF_VEC2_linear_comb(scale1,vec1,scale2,vec2,vec_comb);

        sprintf_s(msg,sizeof(msg),"vec_comb = (%f {%f,%f}) + (%f {%f,%f}) = {%f,%f}",scale1,vec1,vec1,scale2,vec2,vec2,vec_comb,vec_comb);
        lw->WriteLine(msg);

                /*
        ======================
        12 UF_VEC2_mag : 向量模
                magnitude = ||vec||
        ======================
        */

        UF_VEC2_mag(vec1,&magnitude);

        sprintf_s(msg,sizeof(msg),"UF_VEC2_mag = ||{%f,%f}|| = %f",vec1,vec1,magnitude);
        lw->WriteLine(msg);

                        /*
        ======================
        13 UF_VEC2_midpt : 求中点
                mid_pnt = (0.5 pnt1) + (0.5 pnt2)
        ======================
        */

        UF_VEC2_midpt(vec1,vec2,mid_pnt);

        sprintf_s(msg,sizeof(msg),"UF_VEC2_midpt = point1 {%f,%f},point2 {%f,%f} = (%f,%f)",vec1,vec1,vec2,vec2,mid_pnt,mid_pnt);
        lw->WriteLine(msg);

        /*
        ======================
        14 UF_VEC2_XXX : 向量的其他操作,反向,求差,单位划
       
        ======================
        */

        UF_VEC2_negate(vec1,neg_vec);
        UF_VEC2_rotate(vec1,2,vec_comb);
        UF_VEC2_scale(scale,vec1,scale_vec);
        UF_VEC2_sub(vec1,vec2,sub_vec);
        UF_VEC2_unitize(vec1,tol,&magnitude,unit_vec);

        sprintf_s(msg,sizeof(msg),"vec1{%f,%f},vec2{%f,%f}:negative(%f,%f),rotate(%f,%f),scale(%f,%f),sub(%f,%f),unitize(%f,{%f,%f})",vec1,vec1,vec2,vec2,neg_vec,neg_vec,
                vec_comb,vec_comb,scale_vec,scale_vec,sub_vec,sub_vec,magnitude,unit_vec,unit_vec);
        lw->WriteLine(msg);

       
}


admin 发表于 2014-7-29 12:03:47

原创 教程顶起!!
页: [1]
查看完整版本: UG NX 二次开发中关于 ufun向量的使用教程合集