问题的提出是由同事的一个提问引出的,同事问一个向量vector与一个平面plane的夹角怎样获得?
当时在arx的帮助文档中查看相关的API函数,发现angleOnPlane()函数很相似,但是从描述上又不是很正确,心想如果是描述一个适量与在平面投影的夹角用如此多的评议描述是不是太累赘了,因此就用程序来见证自己的思考,当程序运行结果出来,一步步明白了angleOnPlane()的真实含义
下面首先是objectarx中angleOnPlane()的定义及其描述
double angleOnPlane(
const AcGePlanarEnt& pln) const;
pln Input plane
Returns the angle between the orthogonal projection of this vector into the plane through the origin with the same normal as planar entity pln and the zeroth basis vector v0 of the planar entity pln provided by the function pln.getCoordSystem (p, v0, v1).
首先来阐述angleOnPlane()函数的含义:其描述的是适量vector投影到平面上后与平面的第一个矢量uAxis的夹角,而平面的第一个是通过getCoordSystem获取的,也就是不管以何种方式构造一个plane时,都形成了其特有的orgin, uAxis和VAxis,不太明白的可以参考AcGePlane构造函数。
一个向量vector与一个平面plane的夹角怎样获得?
首先根据适量vector与平面的法向量normal获取vector在平面的垂直投影向量,然后用angleTo()函数来获取相应的角度。
下面的代码就是用来测试这些函数的使用的
AcGeVector3d normal = AcGeVector3d::kYAxis;;
AcGePlane plane(AcGePoint3d::kOrigin, normal);//平面
AcGeVector3d vect = AcGeVector3d(3,1,1);//所给出的矢量
AcGeVector3d projVect = vect.orthoProject(normal); //垂直投影
double dAngle1 = vect.angleTo(projVect); //这就是所求的一个向量vector与一个平面plane的夹角AcGePoint3d ptOr;
AcGeVector3d vectU,vectV;
plane.getCoordSystem(ptOr, vectU, vectV);
double dAngle = vect.angleOnPlane(plane);
double dAngle2 = projVect.angleTo(vectU);
dAngle始终与dAngle2相等