找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 237|回复: 0

objectArx---AcGe几何类

[复制链接]

1

主题

0

回帖

35

积分

管理员

积分
35
发表于 2024-3-18 19:29:43 | 显示全部楼层 |阅读模式
  1. [code]目录
  2. 一、概述
  3. 二、点对象(AcGePoint2d )
  4. 2.1 声明及赋值
  5. 2.2 点对象方法
  6. 2.3 矩阵对象
  7. 2.3.1 概述
  8. 2.3.2 矩阵类方法
  9. 三、二维实体类(AcGeEntity2d)
  10. 3.1 AcGeEntity2d类方法
  11. 3.2 AcGeCurve2d类方法
  12. 3.2.1 常用方法
  13. 3.2.2 方法示例
  14. 3.2.3 效果
  15. 四、二维线实体类(AcGeLinearEnt2d)
  16. 4.1 常用方法
  17. 4.2 方法示例
  18. 一、概述
  19. 定义:AcGe类库是为AcDb类库提供的工具类库,如用于二维、三维运算的向量对象和矩阵对象,此外还有很多基本的几何对象,如点,曲线,面。
  20. 意义:acdb对象也有几何计算函数,但因为数据库实体类还附带其他数据,计算起来笨重且资源占用较多,而acge类仅单纯涉及几何计算,且算法经过优化,效率更高、资源占用更少
  21. 类继承关系:主要的基类分别是AcGeEntity2d和AcGeEntity3d。此外还有几个没有基类的类,包括AcGePoint2d,AcGeVector2d和AcGeMaterix2d
  22. 二、点对象(AcGePoint2d )
  23. 2.1 声明及赋值
  24. 点对象声明
  25. AcGePoint2d pt1(0, 0), pt2(100, 0), pt3, pt4;
  26. 1
  27. 点赋值
  28. pt3.set(50, 50);
  29. acutPrintf(采用T("\nset设置点坐标(%0.3f,%0.3f)"),pt3.x,pt3.y);
  30. 1
  31. 2
  32. 点比较
  33. // 重载==运算符:也可用2.2对象方法比较
  34. if(pt1 == pt2)
  35. {
  36.         ...
  37. }
  38. 2.2 点对象方法
  39. 两点距离
  40. double dist = pt1.distanceTo(pt2);
  41. acutPrintf(采用T("\n两点距离:%0.3f"), dist);
  42. 1
  43. 2
  44. 镜像点
  45. // 镜像需要一条几何实体类直线
  46. AcGeLine2d line(pt1, pt2);
  47. // 镜像点pt3(注意:覆盖原值)
  48. pt3.mirror(line);
  49. acutPrintf(采用T("\nmirror镜像设置点坐标(%0.3f,%0.3f)"), pt3.x, pt3.y);
  50. 旋转点
  51. // 旋转pt3双坐标值;默认基点为原点(仅一个参数)
  52. pt3.rotateBy(MathUtil::PI() / 2, pt1);
  53. acutPrintf(采用T("\n以pt1为基点旋转(%0.3f,%0.3f)"), pt3.x, pt3.y);
  54. 等比缩放点:点对象方法
  55. // 等比缩放pt3双坐标值;默认基点为原点(仅一个参数)
  56. pt3.scaleBy(2, pt1);
  57. acutPrintf(采用T("\n点对象方法式缩放(%0.3f,%0.3f)"), pt3.x, pt3.y);
  58. 等比缩放点:重载运算符法
  59. // 重载点运算符*、/、*=、/=
  60. pt3 *= 2;
  61. acutPrintf(采用T("\n重载运算符式缩放(%0.3f,%0.3f)"), pt3.x, pt3.y);
  62. 点平移
  63. // 重载点运算符+、-、+=、-=
  64. AcGeVector2d vec1(100,100);
  65. // 点平移:与平移向量加减
  66. pt4 = pt3 + vec1;
  67. acutPrintf(采用T("\n点平移(%0.3f,%0.3f)"), pt4.x, pt4.y);
  68. 点比较
  69. AcGePoint2d pt1(100, 0), pt2(100.1, 0);
  70. // 设置容差:两者值差小于0.1,判定为相等
  71. AcGeTol tol;
  72. tol.setEqualPoint(0.1);
  73. // 若为if (pt1.isEqualTo(pt2)),表示容差为1.0Xe-10
  74. if (pt1.isEqualTo(pt2, tol))
  75. {
  76.         AfxMessageBox(采用T("相等"));
  77. }
  78. 2.3 矩阵对象
  79. 2.3.1 概述
  80. 功能:可用封装一系列点变化操作,最后统一作用到待操作点上
  81. 与点对象方法区别:点对象只能单步操作,矩阵对象可多动作集成为一次操作
  82. 2.3.2 矩阵类方法
  83. 代码示例
  84. // 点、直线、向量沿用2.2节
  85. pt3.set(50, 50);
  86. AcGeMatrix2d mat2d;
  87. // 镜像:传入直线
  88. mat2d.setToMirroring(line);
  89. // 旋转:默认基点为原点
  90. mat2d.setToRotation(MathUtil::PI() / 2, pt1);
  91. // 等比缩放;默认基点为原点
  92. mat2d.setToScaling(2, pt1);
  93. // 平移:传入平移向量
  94. mat2d.setTranslation(vec1);
  95. // 将矩阵操作作用于pt4
  96. pt3.transformBy(mat2d);
  97. acutPrintf(采用T("\n矩阵操作后的点坐标(%0.3f,%0.3f)"), pt3.x, pt3.y);
  98. 三、二维实体类(AcGeEntity2d)
  99. 3.1 AcGeEntity2d类方法
  100. 常规函数(用法同2.2节)
  101. 镜像:mirror
  102. 旋转:rotateBy
  103. 等比缩放:scaleBy
  104. 矩阵操作:transformBy
  105. 平移:translateBy(const AcGeVector2d&)
  106. AcGeEntity2d类方法
  107. // 直线:传入两点(下节讲),第一个为原点
  108. AcGeLine2d Line(AcGePoint2d::kOrigin,AcGePoint2d(100,100));
  109. // 结构体AcGe:见结构体AcGe
  110. // 枚举EntityId:见结构体AcGe
  111. AcGe::EntityId eId = Line.type();
  112. // 打印出枚举值:18
  113. acutPrintf(采用T("\n%d"), eId);
  114. // 判断是否为枚举值:见结构体AcGe
  115. if (Line.isKindOf(AcGe::kLine2d))
  116.         acutPrintf(采用T("\n验证通过"));
  117. 结构体AcGe
  118. ......
  119. struct
  120. AcGe
  121. {
  122.    GE采用DLLDATAEXIMP static const AcGeLibVersion gLibVersion;
  123.    enum { eGood, eBad };
  124.    enum EntityId {
  125.        kEntity2d,                kEntity3d,                kPointEnt2d,                kPointEnt3d,
  126.        kPosition2d,                kPosition3d,        kPointOnCurve2d,        kPointOnCurve3d,
  127.        kPointOnSurface, kBoundedPlane,         kCircArc2d,                 kCircArc3d,
  128.        kConic2d,                kConic3d,                kCurve2d,                          kCurve3d,
  129.        kEllipArc2d,         kEllipArc3d,         kLine2d,                          kLine3d,
  130.        kLinearEnt2d,          kLinearEnt3d,          kLineSeg2d,                    kLineSeg3d,
  131.        kPlanarEnt,            kPlane,                    kRay2d,                            kRay3d,
  132.        kSurface,             kSphere,             kCylinder,              kTorus,
  133.        kCone,               kSplineEnt2d,   kPolyline2d,              kAugPolyline2d,
  134.        kNurbCurve2d,    kDSpline2d,     kCubicSplineCurve2d, kSplineEnt3d,
  135.        kPolyline3d,      kAugPolyline3d,      kNurbCurve3d,      kDSpline3d,
  136.        ......
  137.    };
  138. ......
  139. }
  140. 3.2 AcGeCurve2d类方法
  141. 继承关系:为二维实体类的派生类,见第一条类图
  142. 曲线基类:为线、圆、弧、多段线、偏移的基类
  143. 3.2.1 常用方法
  144. 列表
  145. 名称        释义
  146. isClockWise        判断弧线是否为顺时针方向
  147. startAng、endAng        圆弧的起、终弧度值,与X轴正方向夹角,与圆弧方向无关,值小的为起
  148. radius        圆弧半径
  149. paramOf、evalPoint        将点对象(AcGePoint2d )转换为参数化点(double)、逆向转换
  150. length        曲线上两点间弧长,与弧线方向相同,若超终点,长度包含延长线,注意传参两点顺序
  151. paramAtLength        曲线上 距 已知点 一定距离的 另一个 点的参数化值:正距离与弧线正方向同
  152. distanceTo        点到曲线最近距离
  153. closestPointTo        曲线上 离已知点 最近的点坐标
  154. isOn、isInside        判断点是否在弧线上、内: 传入的也可以是 参数化点
  155. getSamplePoints        均分圆弧,返回均分点(包括起、终点)
  156. tangent(pt, line)        过弧上点做切线:pt为切点AcGePoint2d、line为AcGeLine2d
  157. intersectWith(ent, n, pt4, pt5);        获取交点:没交点返回false,ent可以为AcGeLinearEnt2d或AcGeCircArc2d,n为交点个数,后两个为交点,只有n≥0,此两点才有意义
  158. 求两点中点:两点参数化值的平均值即为中点参数化值
  159. 调用:以上函数均为类对象调用,即类对象.函数名();
  160. 3.2.2 方法示例
  161. 以圆弧为例
  162. AcGePoint2d pt1(-100, 0), pt2(0, 100), pt3(100, 0), pt4, pt5;
  163. // 圆弧 构造函数 之一: 起点、中间点、终点,弧线有方向(此处为顺时针)
  164. AcGeCircArc2d cArc(pt1, pt2, pt3);
  165. acutPrintf(采用T("\n圆弧:圆心坐标(%0.3f, %0.3f),半径为%0.3f"), cArc.center().x,cArc.center().y,cArc.radius());
  166. // 起始弧度:与弧线方向无关,均与X轴正向夹角
  167. acutPrintf(采用T("\n起始弧度:%0.3f,终止弧度:%0.3f"), cArc.startAng(), cArc.endAng());
  168. // 将曲线上 参数化点
  169. double param1 = cArc.paramOf(pt1);
  170. double param2 = cArc.paramOf(pt2);
  171. double param3 = cArc.paramOf(pt3);
  172. acutPrintf(采用T("\n点pt2 的 参数化值:%0.3f"), param2);
  173. // 曲线上 两点间弧长:起始参数点、终止参数点,弧长与弧线方向相同(包括延长线)
  174. double length = cArc.length(param1, param2);
  175. acutPrintf(采用T("\n点pt1与pt2之间弧长:%0.3f"), length);
  176. // 曲线上 距 已知点 一定距离的 另一个 点的参数化值:正距离与弧线正方向同
  177. double param4 = cArc.paramAtLength(param2, 100);
  178. // 点参数化 转 点对象
  179. pt4 = cArc.evalPoint(param4);
  180. acutPrintf(采用T("\n圆弧上距离pt2点100的点坐标(%0.3f,%0.3f)"), pt4.x, pt4.y);
  181. // 点到曲线的 最近距离
  182. double dist = cArc.distanceTo(AcGePoint2d(0, 101));
  183. acutPrintf(采用T("\n(0, 101)点到曲线的距离:%0.3f"), dist);
  184. // 曲线上 离已知点 最近的点坐标
  185. pt5 = cArc.closestPointTo(AcGePoint2d(101, 0));
  186. acutPrintf(采用T("\n曲线上 离(0, 101)点 最近的点:(%0.3f, %0.3f)"), pt5.x, pt5.y);
  187. // 判断点是否在弧线上: 传入的也可以是 参数化点
  188. if (cArc.isOn(pt1))
  189. {
  190.         acutPrintf(采用T("\n点pt1在曲线上"));
  191. }
  192. // 沿着曲线方向等分曲线
  193. AcGePoint2dArray ptarr;
  194. // 等分曲线:点个数(包含起终点)、接收结果的点列表
  195. cArc.getSamplePoints(3, ptarr);
  196. for (int i = 0; i < ptarr.length(); i++)
  197. {
  198.         acutPrintf(采用T("\n等分坐标(%0.3f,%0.3f)"), ptarr.at(i).x, ptarr.at(i).y);
  199. }
  200. 3.2.3 效果
  201. 顺时针曲线AcGeCircArc2d cArc(pt1, pt2, pt3);
  202. 逆时针曲线AcGeCircArc2d cArc(pt3, pt2, pt1);
  203. 四、二维线实体类(AcGeLinearEnt2d)
  204. 继承关系:为二维曲线类(AcGeCurve2d)的派生类,见第一条类图
  205. 派生类
  206. 直线:AcGeLine2d,对应数据库类型AcDbXline
  207. 线段:AcGeLineSeg2d,对应数据库类型AcDbLine
  208. 射线:AcGeRay2d,对应数据库类型AcDbRay
  209. 4.1 常用方法
  210. 方法列表
  211. 名称        释义
  212. set        创建直线:传入两点
  213. getPerpLine        条件创建直线:过已知点,创建垂直于调用直线对象的直线
  214. sColinearTo        判断线重合
  215. sParallelTo        判断线平行
  216. sPerpendicularTo        判断线垂直
  217. ntersectWith        传入线对象,获取交点
  218. 线段、射线参考直线方法调用
  219. 4.2 方法示例
  220. 代码示例
  221. AcGePoint2d pt1(100, 0), pt2(0, 100), pt3(100, 100), pt4;
  222. AcGeLine2d xline(AcGePoint2d::kOrigin, pt1);
  223. AcGeLine2d yline(AcGePoint2d::kOrigin, pt2);
  224. // 条件创建直线:过已知点pt2,获得垂直于yline线的直线hline
  225. AcGeLine2d hline;
  226. yline.getPerpLine(pt2, hline);
  227. // set方法获得直线:传入两点
  228. AcGeLine2d linetemp;
  229. linetemp.set(pt1, pt2);
  230. // 获取直线的向量
  231. AcGeVector2d vec = linetemp.direction();
  232. acutPrintf(采用T("\n直线与X轴正向夹角(弧度):%0.3f"), vec.angle());
  233. // 以下函数:tol默认e-10,且均可省略
  234. AcGeTol tol;
  235. tol.setEqualPoint(0.1);
  236. if (hline.isColinearTo(hline, tol))
  237.         acutPrintf(采用T("\n两线重合"));
  238. if (xline.isParallelTo(hline,tol))
  239.         acutPrintf(采用T("\n两线平行"));
  240. if (xline.isPerpendicularTo(yline,tol))
  241.         acutPrintf(采用T("\n两线垂直"));       
  242. // xline获取与yline的交点pt4
  243. xline.intersectWith(yline, pt4);
  244. acutPrintf(采用T("\n交点坐标(%0.3f,%0.3f)"), pt4.x, pt4.y);
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-1 18:13 , Processed in 0.120476 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表