admin 发表于 2024-3-18 19:29:43

objectArx---AcGe几何类

目录
一、概述
二、点对象(AcGePoint2d )
2.1 声明及赋值
2.2 点对象方法
2.3 矩阵对象
2.3.1 概述
2.3.2 矩阵类方法
三、二维实体类(AcGeEntity2d)
3.1 AcGeEntity2d类方法
3.2 AcGeCurve2d类方法
3.2.1 常用方法
3.2.2 方法示例
3.2.3 效果
四、二维线实体类(AcGeLinearEnt2d)
4.1 常用方法
4.2 方法示例
一、概述
定义:AcGe类库是为AcDb类库提供的工具类库,如用于二维、三维运算的向量对象和矩阵对象,此外还有很多基本的几何对象,如点,曲线,面。
意义:acdb对象也有几何计算函数,但因为数据库实体类还附带其他数据,计算起来笨重且资源占用较多,而acge类仅单纯涉及几何计算,且算法经过优化,效率更高、资源占用更少
类继承关系:主要的基类分别是AcGeEntity2d和AcGeEntity3d。此外还有几个没有基类的类,包括AcGePoint2d,AcGeVector2d和AcGeMaterix2d

二、点对象(AcGePoint2d )
2.1 声明及赋值
点对象声明
AcGePoint2d pt1(0, 0), pt2(100, 0), pt3, pt4;
1
点赋值
pt3.set(50, 50);
acutPrintf(采用T("\nset设置点坐标(%0.3f,%0.3f)"),pt3.x,pt3.y);
1
2
点比较
// 重载==运算符:也可用2.2对象方法比较
if(pt1 == pt2)
{
        ...
}

2.2 点对象方法
两点距离
double dist = pt1.distanceTo(pt2);
acutPrintf(采用T("\n两点距离:%0.3f"), dist);
1
2
镜像点
// 镜像需要一条几何实体类直线
AcGeLine2d line(pt1, pt2);
// 镜像点pt3(注意:覆盖原值)
pt3.mirror(line);
acutPrintf(采用T("\nmirror镜像设置点坐标(%0.3f,%0.3f)"), pt3.x, pt3.y);

旋转点
// 旋转pt3双坐标值;默认基点为原点(仅一个参数)
pt3.rotateBy(MathUtil::PI() / 2, pt1);
acutPrintf(采用T("\n以pt1为基点旋转(%0.3f,%0.3f)"), pt3.x, pt3.y);

等比缩放点:点对象方法
// 等比缩放pt3双坐标值;默认基点为原点(仅一个参数)
pt3.scaleBy(2, pt1);
acutPrintf(采用T("\n点对象方法式缩放(%0.3f,%0.3f)"), pt3.x, pt3.y);

等比缩放点:重载运算符法
// 重载点运算符*、/、*=、/=
pt3 *= 2;
acutPrintf(采用T("\n重载运算符式缩放(%0.3f,%0.3f)"), pt3.x, pt3.y);

点平移
// 重载点运算符+、-、+=、-=
AcGeVector2d vec1(100,100);
// 点平移:与平移向量加减
pt4 = pt3 + vec1;
acutPrintf(采用T("\n点平移(%0.3f,%0.3f)"), pt4.x, pt4.y);

点比较
AcGePoint2d pt1(100, 0), pt2(100.1, 0);
// 设置容差:两者值差小于0.1,判定为相等
AcGeTol tol;
tol.setEqualPoint(0.1);
// 若为if (pt1.isEqualTo(pt2)),表示容差为1.0Xe-10
if (pt1.isEqualTo(pt2, tol))
{
        AfxMessageBox(采用T("相等"));
}

2.3 矩阵对象
2.3.1 概述
功能:可用封装一系列点变化操作,最后统一作用到待操作点上
与点对象方法区别:点对象只能单步操作,矩阵对象可多动作集成为一次操作
2.3.2 矩阵类方法
代码示例
// 点、直线、向量沿用2.2节
pt3.set(50, 50);

AcGeMatrix2d mat2d;
// 镜像:传入直线
mat2d.setToMirroring(line);
// 旋转:默认基点为原点
mat2d.setToRotation(MathUtil::PI() / 2, pt1);
// 等比缩放;默认基点为原点
mat2d.setToScaling(2, pt1);
// 平移:传入平移向量
mat2d.setTranslation(vec1);

// 将矩阵操作作用于pt4
pt3.transformBy(mat2d);
acutPrintf(采用T("\n矩阵操作后的点坐标(%0.3f,%0.3f)"), pt3.x, pt3.y);


三、二维实体类(AcGeEntity2d)
3.1 AcGeEntity2d类方法
常规函数(用法同2.2节)
镜像:mirror
旋转:rotateBy
等比缩放:scaleBy
矩阵操作:transformBy
平移:translateBy(const AcGeVector2d&)
AcGeEntity2d类方法
// 直线:传入两点(下节讲),第一个为原点
AcGeLine2d Line(AcGePoint2d::kOrigin,AcGePoint2d(100,100));
// 结构体AcGe:见结构体AcGe
// 枚举EntityId:见结构体AcGe
AcGe::EntityId eId = Line.type();
// 打印出枚举值:18
acutPrintf(采用T("\n%d"), eId);
// 判断是否为枚举值:见结构体AcGe
if (Line.isKindOf(AcGe::kLine2d))
        acutPrintf(采用T("\n验证通过"));

结构体AcGe
......
struct
AcGe
{
   GE采用DLLDATAEXIMP static const AcGeLibVersion gLibVersion;
   enum { eGood, eBad };

   enum EntityId {
       kEntity2d,                kEntity3d,                kPointEnt2d,                kPointEnt3d,
       kPosition2d,                kPosition3d,        kPointOnCurve2d,        kPointOnCurve3d,
       kPointOnSurface, kBoundedPlane,         kCircArc2d,                 kCircArc3d,
       kConic2d,                kConic3d,                kCurve2d,                        kCurve3d,
       kEllipArc2d,         kEllipArc3d,         kLine2d,                        kLine3d,
       kLinearEnt2d,        kLinearEnt3d,        kLineSeg2d,                    kLineSeg3d,
       kPlanarEnt,            kPlane,                    kRay2d,                            kRay3d,
       kSurface,           kSphere,           kCylinder,              kTorus,
       kCone,               kSplineEnt2d,   kPolyline2d,              kAugPolyline2d,
       kNurbCurve2d,    kDSpline2d,   kCubicSplineCurve2d, kSplineEnt3d,
       kPolyline3d,      kAugPolyline3d,      kNurbCurve3d,      kDSpline3d,
       ......
   };
......
}



3.2 AcGeCurve2d类方法
继承关系:为二维实体类的派生类,见第一条类图
曲线基类:为线、圆、弧、多段线、偏移的基类
3.2.1 常用方法
列表
名称        释义
isClockWise        判断弧线是否为顺时针方向
startAng、endAng        圆弧的起、终弧度值,与X轴正方向夹角,与圆弧方向无关,值小的为起
radius        圆弧半径
paramOf、evalPoint        将点对象(AcGePoint2d )转换为参数化点(double)、逆向转换
length        曲线上两点间弧长,与弧线方向相同,若超终点,长度包含延长线,注意传参两点顺序
paramAtLength        曲线上 距 已知点 一定距离的 另一个 点的参数化值:正距离与弧线正方向同
distanceTo        点到曲线最近距离
closestPointTo        曲线上 离已知点 最近的点坐标
isOn、isInside        判断点是否在弧线上、内: 传入的也可以是 参数化点
getSamplePoints        均分圆弧,返回均分点(包括起、终点)
tangent(pt, line)        过弧上点做切线:pt为切点AcGePoint2d、line为AcGeLine2d
intersectWith(ent, n, pt4, pt5);        获取交点:没交点返回false,ent可以为AcGeLinearEnt2d或AcGeCircArc2d,n为交点个数,后两个为交点,只有n≥0,此两点才有意义
求两点中点:两点参数化值的平均值即为中点参数化值
调用:以上函数均为类对象调用,即类对象.函数名();

3.2.2 方法示例
以圆弧为例
AcGePoint2d pt1(-100, 0), pt2(0, 100), pt3(100, 0), pt4, pt5;

// 圆弧 构造函数 之一: 起点、中间点、终点,弧线有方向(此处为顺时针)
AcGeCircArc2d cArc(pt1, pt2, pt3);
acutPrintf(采用T("\n圆弧:圆心坐标(%0.3f, %0.3f),半径为%0.3f"), cArc.center().x,cArc.center().y,cArc.radius());
// 起始弧度:与弧线方向无关,均与X轴正向夹角
acutPrintf(采用T("\n起始弧度:%0.3f,终止弧度:%0.3f"), cArc.startAng(), cArc.endAng());

// 将曲线上 参数化点
double param1 = cArc.paramOf(pt1);
double param2 = cArc.paramOf(pt2);
double param3 = cArc.paramOf(pt3);
acutPrintf(采用T("\n点pt2 的 参数化值:%0.3f"), param2);

// 曲线上 两点间弧长:起始参数点、终止参数点,弧长与弧线方向相同(包括延长线)
double length = cArc.length(param1, param2);
acutPrintf(采用T("\n点pt1与pt2之间弧长:%0.3f"), length);

// 曲线上 距 已知点 一定距离的 另一个 点的参数化值:正距离与弧线正方向同
double param4 = cArc.paramAtLength(param2, 100);
// 点参数化 转 点对象
pt4 = cArc.evalPoint(param4);
acutPrintf(采用T("\n圆弧上距离pt2点100的点坐标(%0.3f,%0.3f)"), pt4.x, pt4.y);

// 点到曲线的 最近距离
double dist = cArc.distanceTo(AcGePoint2d(0, 101));
acutPrintf(采用T("\n(0, 101)点到曲线的距离:%0.3f"), dist);

// 曲线上 离已知点 最近的点坐标
pt5 = cArc.closestPointTo(AcGePoint2d(101, 0));
acutPrintf(采用T("\n曲线上 离(0, 101)点 最近的点:(%0.3f, %0.3f)"), pt5.x, pt5.y);

// 判断点是否在弧线上: 传入的也可以是 参数化点
if (cArc.isOn(pt1))
{
        acutPrintf(采用T("\n点pt1在曲线上"));
}
// 沿着曲线方向等分曲线
AcGePoint2dArray ptarr;
// 等分曲线:点个数(包含起终点)、接收结果的点列表
cArc.getSamplePoints(3, ptarr);
for (int i = 0; i < ptarr.length(); i++)
{
        acutPrintf(采用T("\n等分坐标(%0.3f,%0.3f)"), ptarr.at(i).x, ptarr.at(i).y);
}




3.2.3 效果
顺时针曲线AcGeCircArc2d cArc(pt1, pt2, pt3);


逆时针曲线AcGeCircArc2d cArc(pt3, pt2, pt1);


四、二维线实体类(AcGeLinearEnt2d)
继承关系:为二维曲线类(AcGeCurve2d)的派生类,见第一条类图
派生类
直线:AcGeLine2d,对应数据库类型AcDbXline
线段:AcGeLineSeg2d,对应数据库类型AcDbLine
射线:AcGeRay2d,对应数据库类型AcDbRay
4.1 常用方法
方法列表
名称        释义
set        创建直线:传入两点
getPerpLine        条件创建直线:过已知点,创建垂直于调用直线对象的直线
sColinearTo        判断线重合
sParallelTo        判断线平行
sPerpendicularTo        判断线垂直
ntersectWith        传入线对象,获取交点
线段、射线参考直线方法调用

4.2 方法示例
代码示例
AcGePoint2d pt1(100, 0), pt2(0, 100), pt3(100, 100), pt4;
AcGeLine2d xline(AcGePoint2d::kOrigin, pt1);
AcGeLine2d yline(AcGePoint2d::kOrigin, pt2);

// 条件创建直线:过已知点pt2,获得垂直于yline线的直线hline
AcGeLine2d hline;
yline.getPerpLine(pt2, hline);

// set方法获得直线:传入两点
AcGeLine2d linetemp;
linetemp.set(pt1, pt2);
// 获取直线的向量
AcGeVector2d vec = linetemp.direction();
acutPrintf(采用T("\n直线与X轴正向夹角(弧度):%0.3f"), vec.angle());

// 以下函数:tol默认e-10,且均可省略
AcGeTol tol;
tol.setEqualPoint(0.1);

if (hline.isColinearTo(hline, tol))
        acutPrintf(采用T("\n两线重合"));
if (xline.isParallelTo(hline,tol))
        acutPrintf(采用T("\n两线平行"));
if (xline.isPerpendicularTo(yline,tol))
        acutPrintf(采用T("\n两线垂直"));       

// xline获取与yline的交点pt4
xline.intersectWith(yline, pt4);
acutPrintf(采用T("\n交点坐标(%0.3f,%0.3f)"), pt4.x, pt4.y);


页: [1]
查看完整版本: objectArx---AcGe几何类