找回密码
 立即注册

QQ登录

只需一步,快速开始

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

几何类(中心点,偏移,删除重复点等)

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-3-6 11:45:00 | 显示全部楼层 |阅读模式
  1. AcGePoint2d FymGeometry::GetMiddlePt(const AcGePoint2d& startPt, const AcGePoint2d& endPt)
  2. {
  3.         double x = (startPt.x + endPt.x) * 0.5;
  4.         double y = (startPt.y + endPt.y) * 0.5;
  5.         return AcGePoint2d(x, y);
  6. }
  7. AcGePoint3d FymGeometry::GetMiddlePt(const AcGePoint3d& startPt, const AcGePoint3d& endPt)
  8. {
  9.         double x = (startPt.x + endPt.x) * 0.5;
  10.         double y = (startPt.y + endPt.y) * 0.5;
  11.         double z = (startPt.z + endPt.z) * 0.5;
  12.         return AcGePoint3d(x, y, z);
  13. }
  14. AcGePoint3d FymGeometry::Polar(const AcGePoint3d& basePoint, double angle, double length)
  15. {
  16.         double x = basePoint.x + length * cos(angle);
  17.         double y = basePoint.y + length * sin(angle);
  18.         return AcGePoint3d(x,y,basePoint.z);
  19. }
  20. AcGePoint3d FymGeometry::RelativePoint(const AcGePoint3d& Pt, double x, double y)
  21. {
  22.         AcGePoint3d ptReturn(Pt.x + x, Pt.y + y, Pt.z);
  23.         return ptReturn;
  24. }
  25. //比较两个AcGePoint2d类型的点(即二维坐标点)是否相等,tol为公差
  26. bool CGePointUtil::IsEqual(const AcGePoint2d & firstPoint, const AcGePoint2d & secondPoint, double tol)
  27. {
  28.         return (fabs(firstPoint.x - secondPoint.x) < tol&&
  29.                 fabs(firstPoint.y - secondPoint.y) < tol);
  30. }
  31. //比较两个AcGePoint3d类型的点(即三维坐标点)是否相等。
  32. bool CGePointUtil::IsEqual(const AcGePoint3d & firstPoint, const AcGePoint3d & secondPoint, double tol)
  33. {
  34.         return (fabs(firstPoint.x - secondPoint.x) < tol&&
  35.                 fabs(firstPoint.y - secondPoint.y) < tol&&
  36.                 fabs(firstPoint.z - firstPoint.z) < tol);
  37. }
  38. //在给定的三维点数组points中查找一个特定的三维点point。如果找到了这个点,函数会返回这个点的索引值;如果没有找到,函数会返回-1。
  39. int CGePointUtil::FindPoint(const AcGePoint3dArray & points, const AcGePoint3d & point, double tol)
  40. {
  41.         for (int i = 0; i < points.length(); i++)
  42.         {
  43.                 if (IsEqual(points[i], point, tol)) {
  44.                         return i;
  45.                 }
  46.         }
  47.         return -1;
  48. }
  49. //在给定的二维点数组points中查找一个特定的二维点point。如果找到了这个点,函数会返回这个点的索引值;如果没有找到,函数会返回-1。
  50. int CGePointUtil::FindPoint(const AcGePoint2dArray & points, const AcGePoint2d & point, double tol)
  51. {
  52.         for (int i = 0; i < points.length(); i++)
  53.         {
  54.                 if (IsEqual(points[i], point, tol)) {
  55.                         return i;
  56.                 }
  57.         }
  58.         return -1;
  59. }
  60. //  过滤掉那些在给定的公差范围内的重复点。
  61. void CGePointUtil::FilterEqualPoints(AcGePoint3dArray & points, double tol)
  62. {
  63.         for (int i = points.length() - 1; i > 0; i--) {
  64. //  遍历数组中的每个点,从最后一个开始
  65.                 for (int j = 0; j < i; j++) {
  66.                         if (MathUtil::IsEqual(points[i].x, points[j].x, tol) &&
  67.                                 MathUtil::IsEqual(points[i].y, points[j].y, tol)) {
  68.                                 //检查当前点(i)和另一个点(j)的x和y坐标是否在给定的公差范围内是否相等。
  69.                                 points.removeAt(i); //移除当前点(i),删除重复的点
  70.                                 break;
  71.                         }
  72.                 }
  73.         }
  74. }
  75. //遍历一个包含三维点的数组,并删除所有与给定的二维点距离在给定的公差范围内的三维点
  76. void CGePointUtil::FilterEqualPoints(AcGePoint3dArray & points, const AcGePoint2d & pt, double tol)
  77. {
  78.         AcGePoint3dArray tempPoints; //存储过滤后的非重复三维点
  79.         for (int i = 0; i < points.length(); i++)
  80.         {
  81.                 //距离大于给定的公差tol,那么它将这个三维点添加到临时数组tempPoints中
  82.                 if (CConvertUtil::ToPoint2d(points[i]).distanceTo(pt)>tol) {
  83.                         tempPoints.append(points[i]);
  84.                 }
  85.         }
  86.         points = tempPoints;
  87.         //这样输入数组points现在就只包含那些距离给定的二维点pt大于给定公差的非重复三维点
  88. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 14:19 , Processed in 0.154715 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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