几何辅助类主要是用来帮助表示几何对象,主要分为以下几种类型:
变化矩阵(
GeTransform
):变化矩阵是一种仿射变换,主要对几何对象进行旋转,平移,镜像,缩放的操作,可以改变几何对象的形态和位置;位置信息(
BPPlacement
):位置信息是一种刚体变换,主要是平移变换和欧拉角旋转变换,描述几何对象所在的局部坐标系;旋转矩阵(
GeRotMatrix
):旋转矩阵提供一种仿射变换,主要对几何对象进行旋转操作;包围盒(
GeRange3d/GeRange2d
):几何对象的范围;角度(
GeAngle
):弧度;三维平面(
GePlane3d
):可以通过原点和向量设置一个三维平面对象。
4.3.1 位置变换矩阵(GeTransform)
位置变换矩阵主要是由两个部分组成,分别是三维矩阵,和三维点的平移变化。
前三列构成的3X3矩阵是旋转矩阵,第四列构成的3X1矩阵是平移矩阵。BIMBase提供了丰富的变换矩阵的构造方式。
变换矩阵是表达线性变换的矩阵,任意线性变换都可以用矩阵表示为易于计算的一致形式,并且多个变换也可以很容易地通过矩阵的相乘连接在一起。线性变换不是唯一可以用矩阵表示的变换。
变换矩阵通过类GeTransform
进行表达,可通过给定分量值;给定旋转变换和平移变换;给定旋转轴和旋转角度等进行创建。主要功能包括变换矩阵与变换矩阵的基础运算,变换矩阵相关属性计算,变化矩阵对点、线、面的变换等。
表4-9 变换矩阵常用构造方式
方法 | 描述 |
---|---|
createIdentityMatrix() | 创建一个旋转矩阵为单位矩阵的变化矩阵 |
create(GeRotMatrixCR) | 创建一个没有平移部分的变化矩阵 |
setByRange(GePoint3dCR, GePoint3dCR) | 设置该变化矩阵为两个三维点定义的变化矩阵 |
create(GePoint3dCR) | 创建一个平移部分为参数设置的变化矩阵 |
setByOriginAndVectors(GePoint3dCR,GeVec3dCR, GeVec3dCR, GeVec3dCR) | 设置变化矩阵的平移部分为三维点,旋转矩阵部分为3个向量组成的矩阵 |
setByOriginAndPoints(GePoint3dCR, GePoint3dCR, GePoint3dCR, GePoint3dCR) | 设置变化矩阵的平移部分为参数1对应的三维点,旋转矩阵部分为后3个三维点组成的矩阵 |
setByInverse(GeTransformCR) | 将该变化矩阵设置为参数矩阵的逆矩阵 |
createByLineAndRotationAngle(GePoint3dCR, GePoint3dCR, double) | 通过一条线和一个旋转角度来构造一个变化矩阵 |
createByAxisAndRotationAngle(GeRay3dCR, double) | 通过一个旋转轴和一个旋转角度来构造一个变化矩阵 |
createByProduct(GeTransformCR, GeTransformCR) | 通过两个矩阵相乘来得到一个新的变换矩阵 |
getVauleByRowAndColumnOfMatrix(int,int) | 获取该变化矩阵中,行为参数1,列为参数2的值 |
getMatrix(GeRotMatrixR) | 获取该变化矩阵的旋转矩阵部分 |
getTranslation(GePoint3dR) | 获取该变化矩阵的平移变化部分 |
getMatrixColumn(GeVec3dR, int) | 获取该变化矩阵中int值对应列的三维向量 |
isEqual(GeTransformCR) | 判断两个变化矩阵是否相等 |
isIdentityTransform() | 判断该变化矩阵是不是单位矩阵 |
示例代码4-1是通过GeTransform
类对文字对象进行旋转平移操作。
BPModelP pModel = BPViewManager::getInstance().getActivedViewport()->getTargetModel();
GePoint2dCR pt2d = GePoint2d::create(1000, 3000);
BPFontP pFoubig = NULL;
BPTextPropertiesPtr ptrTextProp = BPTextProperties::Create(BPFontUtil::getDefaultTrueTypeFont(), BPFont::BPFont(), pt2d, *pModel);
if (ptrTextProp != nullptr)
{
ptrTextProp->SetJustification(P3DTextEntityJustification::enLeftTop);
}
GeTransform trans = GeTransform::createByOriginAndVectors(GePoint3d::create(0, 0, 0), GeVec3d::create(1, 0, 0), GeVec3d::create(0, 1, 0), GeVec3d::create(0, 0, 1));
GeRotMatrix rotmat = GeRotMatrix::createByVectorAndRotationAngle(GeVec3d::create(0, 0, 1), 1);
trans.getMatrix(rotmat);
BPTextPtr ptrText = BPText::create(L"测试文字", NULL, &rotmat, *ptrTextProp);
if (ptrText != nullptr)
{
BPGraphicsPtr ptrGgrapic = pModel->createPhysicalGraphics();
if (ptrGgrapic.isNull())
return;
ptrGgrapic->addText(*ptrText);
ptrGgrapic->save();
}
代码4-1:文字旋转平移操作
4.3.2 位置信息(BPPlacement)
位置信息对象(BPPlacement
)是描述几何对象空间位置信息的,包含局部坐标基点信息以及局部坐标轴与世界坐标轴的角度关系,包括偏航角(Yaw)、俯仰角(pitch)、翻滚角(roll)。
位置信息对象(BPPlacement
)主要有以下几种构造方式:
表4-10 位置对象的构造方式
方法 | 描述 |
---|---|
setOrigin(GePoint3dCR) | 设置刚体变换中的位移量 |
getOrigin() | 获取刚体变换中的位移量 |
setAngles(GeYPRAnglesCR) | 设置刚体变换中的旋转变换部分 |
getAngles() | 获取刚体变换中的旋转变换部分 |
getAngleAroundLocalZ() | 获取绕z轴的旋转角度 |
setPlacement(pvector |
通过四个点来设置该位置对象 |
setPlacement(GePoint3d pos1, GePoint3d pos2, double dRotate) | 通过两点位置pos1和pos2形成轴向,dRotate为绕该轴旋转一定角度,计算位置信息 |
setPlacement(GePoint3d pos1, GePoint3d pos2, int nAxis, double dRotate) | 点pos1和pos2定义局部坐标轴,该坐标轴由nAxis参数指定具体的坐标轴(0-X轴,1-Y轴,2-Z轴),dRotate为绕该轴的旋转角度 |
setPlacement(GePoint3d origin, GeVec3d normalVec, GeVec3d axisYVec) | origin为对应的局部坐标的基点,normalVec为局部坐标的Z轴,axisYVec为局部坐标的Y轴 |
位置信息(BPPlacement
)与位置变换矩阵(GeTransform
)可以通过以下接口相互转换。
表4-11 位置信息和位置变换矩阵互相转换方式
方法 | 描述 |
---|---|
toTransform () | BPPlacement转成GeTransform,得到刚体变换对应的变换矩阵 |
fromTransform(GeTransform) | 将GeTransform转成BPPlacement,从变换矩阵转换得到对应的BPPlacement对象 |
4.3.3 旋转矩阵(GeRotMatrix)
旋转矩阵是在乘以一个向量的时候改变向量的方向但不改变大小的效果的矩阵。是一个3X3的矩阵,是位置变换矩阵(GeTransform
)的前三列,可以通过createByTransform
接口从位置变换矩阵提取出来。
旋转矩阵通过类GeRotMatrix
进行表达,可通过给定分量值;给定旋转轴和旋转角度;给定起始向量和终止向量等进行创建。主要功能包括旋转矩阵与旋转矩阵的基础运算,旋转矩阵相关属性计算等。
表4-12 旋转矩阵常用接口
方法 | 描述 |
---|---|
createIdentityMatrix() | 创建单位旋转矩阵 |
createByTransform(GeTransform) | 创建与GeTransform的matrix部分相同的旋转矩阵 |
createByVectorAndRotationAngle(GeVec3dCR, double) | 创建一个绕轴axis旋转radian角度的旋转矩阵(左手系) |
createByAxisAndRotationAngle(int axis,double) | 创建一个绕轴axis的坐标轴沿逆时针旋转一定角度的旋转矩阵 |
createByRotate90(GeVec3dCR) | 创建一个绕该向量旋转90度对应的旋转矩阵 |
createByTransform(GeTransformCR) | 创建一个与参数变换矩阵的matrix部分相同的旋转矩阵 |
transpose() | 将该旋转矩阵转置 |
inverse() | 将该旋转矩阵求逆 |
getColumn(GeVec3dR,int) | 获取旋转矩阵指定列的向量 |
getRow (GeVec3dR,int) | 获取旋转矩阵指定行的向量 |
isIdentityMatrix() | 判定该矩阵是否是一个单位矩阵 |
isEqual(GeRotMatrixCR,double) | 判断两个旋转矩阵在一定误差范围内是否相等 |
getRotationAngleAndVector(GeVec3dR) | 获得与该旋转矩阵对应的旋转轴和旋转角度 |
4.3.4 包围盒(GeRange3d/GeRange2d)
图素对象的空间范围分称之为包围盒,包含三维包围盒(GeRange3d
)和二维包围盒(GeRange2d
)。三维包围盒是一个各边平行于坐标轴的六面体,用六面体对角线上的两个三维点来表示;二维包围盒是各边都平行于坐标轴的长方形,用长方形对角线上的两个二维点来定义。包围盒可应用于图形空间碰撞检查、图形搜索过滤等。
表4-13 包围盒常用接口
方法 | 描述 |
---|---|
createByNull() | 创建一个范围为Null的包围盒对象 |
create(pvector |
创建能够容纳数组中所有点的最小范围对应的包围盒 |
extendRange(pvector |
拓展该包围盒对象为能够容纳数组中所有点 |
create(pvector |
创建该包围盒对象使其能容纳数组中所有齐次点的最小范围 |
isEmpty() | 判断该包围盒是否为空 |
isLowEqualHigh() | 返回该包围盒上下界是否相等 |
getBoxVolume() | 返回以该包围盒上下界为对角线顶点的立方体体积 |
getXLength() | 返回该包围盒在x方向的长度 |
getYLength() | 返回该包围盒在y方向的长度 |
getZLength() | 返回该包围盒在z方向的长度 |
isAlmostEqualOnX() | 返回该包围盒的上下界在x轴方向上是否相等 |
isAlmostEqualOnY() | 返回该包围盒的上下界在y轴方向上是否相等 |
isAlmostEqualOnZ() | 返回该包围盒的上下界在z轴方向上是否相等 |
getCorners(GePoint3dP) | 返回以该包围盒上下界为对角线顶点的立方体的顶点坐标 |
isInRange(GePoint3dCR) | 判定参数点是否在该包围盒的范围内 |
isIntersectWithOtherRange(GeRange3dCR) | 判定该包围盒与参数包围盒是否有交集 |
isEqual(GeRange3dCR,double) | 比较两个包围盒在一定范围内是否相等 |
4.3.5 角度(GeAngle)
角度为两条相交直线中的任何一条与另一条相叠合时必须转动的量,转动在这两条直线的所在平面上并绕交点进行,通常用度或弧度来表示。
BIMBase中的角度表达包括弧度制角度类GeAngle
、角度制角度类GeAngleDegrees
、欧拉角度类GeYPRAngles
,GeAngle
和GeAngleDegrees
可通过角度值进行创建,GeYPRAngles
可通过偏航角,、俯仰角、翻滚角进行创建。主要功能包括角度与角度的基础运算,角度正弦、余弦、正切、余切值等计算。
角度对象支持以弧度值、角度值、正切值等方式进行实例化,同时也支持常见的加减乘除等运算符。GeAngle
对象中封装常见的角度计算方法,比如正弦值、余弦值等。
表4-14 角度常用接口
方法 | 描述 |
---|---|
createByDegrees(double) | 由角度值创建一个 GeAngle 对象 |
createByRadians(double) | 由弧度值创建一个角度对象 |
getRadians() | 获取该角度的弧度值 |
getDegrees() | 获取该角度的角度值 |
isGreaterCircleAngle(double) | 返回参数值是否大于2pi |
nearlyEqual(double, double) | 返回两个弧度值是否几乎相等 |
getAngleTolerance() | 返回角度的容许误差 |
getPi() | 返回pi |
getTwoPi() | 返回2pi |
getPiDivide2() | 返回pi/2 |
degreesToRadians(double) | 将角度转换为弧度 |
radiansToDegrees(double) | 将弧度转换为角度 |
reverseComplement(double) | 返回参数值所在位置补角的相反数 |
forwardComplement(double) | 返回参数值所在位置的补角 |
arcTan2(double y, double x) | 返回 y/x 的反正切 |
arcCos(double) | 返回参数值的反余弦 |
arcSin(double) | 返回参数值的反正弦 |
4.3.6 三维平面(GePlane3d)
BIMBase中三维平面(GePlane3d)是通过平面上的一个点及平面的法向量来定义,平面通过类GePlane3d进行表达,平面可通过平面原点和法向量,或者平面上的三点进行创建,主要功能包括平面相关属性计算、投影计算、距离计算、平面与平面相交计算等。
表4-15 三维平面常用接口
方法 | 描述 |
---|---|
createByOriginAndNormal(GePoint3dCR, GeVec3dCR) | 通过原点和法向量来创建三维平面 |
createByThreePoints(GePoint3dCR origin, GePoint3dCR xPoint, GePoint3dCR yPoint) | 创建一个平面的起点为origin,法向量为(xPoint-origin)^(yPoint-origin) |
normalize() | 对平面的法向量做归一化 |
getPoint4d(GePoint4dR) | 得到该平面对应的四维点 |
isZero() | 判断该平面的参数是否为0 |
projectPointToPlane(GePoint3dR, GePoint3dCR) | 得到参数2的点在平面上的投影点 |
approximatePlaneByPoints(pvector |
通过一些点集来近似一个平面 |
approximatePlaneByPoints(GePoint3dCP, int) | 通过一些点集来近似一个平面 |
getIntersectPointByThreePlanes(GeVec3dCR,double, GeVec3dCR,double, GeVec3dCR, double) | 通过三个平面来得到一个交点 |
getIntersectPointByThreePlanes(GePlane3dCR,GePlane3dCR,GePlane3dCR) | 通过三个平面来得到一个交点 |