objectarx中angeOnPlane()函数的真实含义

 

问题的提出是由同事的一个提问引出的,同事问一个向量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相等

ObjectARX 是 AutoCAD 的编程接口,可以使用 C++ 编程语言来扩展 AutoCAD 的功能。要实现对称函数,可以使用 ObjectARX 提供的实体对象类 AcDbEntity 和 AcDbMirrorEntityPE 类。 首先,创建一个派生自 AcDbEntity 的实体类,例如 MyEntity。然后在 MyEntity 类重载 AcDbEntity 类的 mirror() 函数,实现对称的操作。mirror() 函数的定义如下: ``` virtual Acad::ErrorStatus mirror(const AcGePlane& plane, AcDbObject*& pMirrorObj) override; ``` 在 mirror() 函数,可以使用 AcDbMirrorEntityPE 类的成员函数 mirror() 来实现对称操作。mirror() 函数的定义如下: ``` virtual Acad::ErrorStatus mirror(AcDbEntity* pEnt, const AcGePlane& plane) override; ``` 其,pEnt 是需要对称的实体对象指针,plane 是对称的平面。mirror() 函数将对称后的实体对象保存在 pMirrorObj ,并返回 Acad::eOk 表示操作成功。 下面是一个简单的示例代码: ``` class MyEntity : public AcDbEntity { public: ACDB_DECLARE_MEMBERS(MyEntity); virtual Acad::ErrorStatus mirror(const AcGePlane& plane, AcDbObject*& pMirrorObj) override { AcDbMirrorEntityPE* pMirrorPE = AcDbMirrorEntityPE::cast(this); if (pMirrorPE == nullptr) return Acad::eNotImplementedYet; AcDbEntity* pMirrorEnt = nullptr; Acad::ErrorStatus es = pMirrorPE->mirror(this, plane, pMirrorEnt); if (es != Acad::eOk) return es; pMirrorObj = pMirrorEnt; return Acad::eOk; } }; ACDB_REGISTER_OBJECT_ENTRY_AUTO(MyEntity) ``` 在上面的示例,MyEntity 类派生自 AcDbEntity,重载了 mirror() 函数。在 mirror() 函数,首先使用 AcDbMirrorEntityPE::cast() 函数获取 AcDbMirrorEntityPE 类的指针。如果获取失败,说明当前实体对象不支持对称操作,返回 Acad::eNotImplementedYet。否则,调用 pMirrorPE->mirror() 函数实现对称操作,将对称后的实体对象保存在 pMirrorEnt ,并将 pMirrorEnt 的指针保存在 pMirrorObj ,最后返回 Acad::eOk 表示操作成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值