乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 121|回复: 7

排除重复点

[复制链接]

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2011-6-1 19:10:00 | 显示全部楼层 |阅读模式
如何显现从AcGePoint3dArray ptArr中排除重复点...请会的指导一下...
回复

使用道具 举报

0

主题

64

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
64
发表于 2011-6-1 19:56:00 | 显示全部楼层
AcGePoint3d::isEqualTo 这个可以指定一个Tol,容许误差范围,希望可以帮到你
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2011-6-2 00:23:00 | 显示全部楼层

谢谢,我查看帮助具体用法先试试...
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2011-6-18 09:23:00 | 显示全部楼层
试了多次,但是没有成功,请高手们在百忙之中抽出一点时间,帮写出排查重复点的局部示范代码
回复

使用道具 举报

56

主题

346

帖子

68

银币

中流砥柱

Rank: 25

铜币
512
发表于 2011-6-18 14:54:00 | 显示全部楼层
回复
先创建一个类,譬如CPoint3d
  1. #pragma once
  2. #include "c:\objectarx 2012\inc\gepnt3d.h"    //--->根据你的目录来定
  3. class CPoint3d : public AcGePoint3d
  4. {
  5. private:
  6. double fuzz;
  7. public:
  8. CPoint3d(void):fuzz(0.0){}
  9. ~CPoint3d(void){}
  10. void SetFuzz(double tol)
  11. {
  12.   fuzz = tol;
  13. }
  14. void copy(c**t AcGePoint3d & pt)
  15. {
  16.   this->x=pt.x;
  17.   this->y=pt.y;
  18.   this->z=pt.z;
  19. }
  20. bool isEqualTo(double x1,double x2) c**t
  21. {
  22.         double delta = x1 - x2;
  23.   return (delta = (-fuzz));
  24. }
  25. bool operator x,pt.x))
  26.    if (isEqualTo(this->y,pt.y))
  27.     return (this->z y x
  28. #include
  29. using namespace std;
  30. 以下为测试:
  31. 在你的函数中这样添加:[code]
  32.   //过滤选择CAD的点(PointArray)对象
  33.   resbuf filter;
  34.   filter.restype=0;
  35.   filter.resval.rstring=_T("POINT");
  36.   filter.rbnext = NULL;
  37.   ads_name sel;
  38.   int ret=acedSSGet(NULL,NULL,NULL,&filter,sel);
  39.   if( ret!=RTNORM)
  40.   {
  41.    acedSSFree(sel);
  42.    return;
  43.   }
  44.   long len;
  45.   ads_name ent;
  46.   AcDbObjectId ObjId;
  47.   AcDbPoint *pEnt;
  48.   acedSSLength(sel,&len);
  49.   AcGePoint3dArray ptset;
  50.   for (long i = 0;iposition());
  51.    pEnt->close();
  52.   }
  53.   acedSSFree(sel);
  54.   len = ptset.length();
  55.   //这样得到了AcGePoint3dArray,然后运用set,排除重复点:
  56.   set pts;
  57.   CPoint3d tempPt;
  58.   tempPt.SetFuzz(1e-4);
  59.   for (int i = 0; i ::iterator pItr;
  60.   int i = 0;
  61.   for (pItr = pts.begin();pItr!=pts.end();pItr++)
  62.   {
  63.    acutPrintf(_T("\nPoint [%d] is : %f,%f,%f"),i,(*pItr).x,(*pItr).y,(*pItr).z);
  64.    Pt3d.x=(*pItr).x;
  65.    Pt3d.y=(*pItr).y;
  66.    Pt3d.z=(*pItr).z;
  67.    ptset[ i ] = Pt3d;
  68.    i++;
  69.   }

回复

使用道具 举报

56

主题

346

帖子

68

银币

中流砥柱

Rank: 25

铜币
512
发表于 2011-6-18 15:03:00 | 显示全部楼层

谢你的热心帮助,目前还没有看懂,先下来慢慢消化...能否不用定义一个类啊
回复

使用道具 举报

84

主题

543

帖子

12

银币

中流砥柱

Rank: 25

铜币
886
发表于 2011-6-18 16:16:00 | 显示全部楼层

回复
不学走,先要跑,是行不通的方法。
C++,类要必须掌握。
我只能说,如果这个题目不用类的方法,代码更多,更 复杂,局限性更大。
简单几句定义了类后,核心代码只有几句:
//这样得到了AcGePoint3dArray,然后运用set,排除重复点:
  set pts;
  CPoint3d tempPt;
  tempPt.SetFuzz(1e-4);
  for (int i = 0; i ptset原来 AcGePoint3dArray,  NewPtSet,就是以后要删除重复点的点集
  long newLen = NewPtSet.length();
  for (int i = 0;i < newLen;i++)
  {
   for (int j = i+1;j < newLen;j++)
   {
    if (NewPtSet[ j ].isEqualTo(NewPtSet[ i ],tol))
    {
     NewPtSet.removeAt(j);
     j--;
     newLen--;
    }
   }
  }[/code]
回复

使用道具 举报

117

主题

608

帖子

19

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1625
发表于 2011-6-18 19:08:00 | 显示全部楼层

谢谢指正,后续慢慢纠正...
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 16:51 , Processed in 0.200733 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表