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);
}
原创 教程顶起!!
页:
[1]