乐筑天下

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

有人用CGAL吗?

[复制链接]

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-8-24 00:01:02 | 显示全部楼层 |阅读模式
CGAL@www.cgal.org
安装/编译有点痛苦,但它有一些非常酷的东西。
我尝试了许多三角形算法之一,以下是仅计算三角形的结果
3.21761秒-213,093点
162.707秒-3,265,110点
计算三角形和绘制3d面
4.342942秒-213,093点
254.525742秒-3,265,110点
  1.   static void ArxPointCloud_tpc(void)
  2.   {
  3.     CalDelaunay dt;
  4.     ads_name name = {0L,0L};
  5.     ads_point point = {0.0,0.0,0.0};
  6.     if(acedEntSel(_T("Select Point Cloud"),name,point) != RTNORM)
  7.       return;
  8.     LARGE_INTEGER freq,start,end;   
  9.     QueryPerformanceFrequency(&freq);
  10.     QueryPerformanceCounter(&start);
  11.     // My Point cloud object
  12.     AcDbObjectPointer pCloud( (AcDbObjectId)(AcDbStub*)name[0],AcDb::kForRead);
  13.     if(pCloud.openStatus() != Acad::eOk)
  14.       return;
  15.     // inserting does the Delaunay!?!
  16.     const AcGePoint3dArray &points = pCloud->PointArray();
  17.     for (long i = 0; i workingDatabase();
  18.     AcDbBlockTableRecordPointer pBlockTableRecord(pDB->currentSpaceId(),AcDb::kForWrite);
  19.     if(pBlockTableRecord.openStatus() != Acad::eOk)
  20.       return;
  21.     AcGePoint3d A,B,C;
  22.     for (CalDelaunay::Finite_faces_iterator it = dt.finite_faces_begin();
  23.                                              it!=dt.finite_faces_end();++it)
  24.     {
  25.       const CalPoint& pt0 =  (*it).vertex(0)->point();
  26.       const CalPoint& pt1 =  (*it).vertex(1)->point();
  27.       const CalPoint& pt2 =  (*it).vertex(2)->point();
  28.       AcDbFace *pFace = new AcDbFace();
  29.       if(pFace)
  30.       {
  31.         A.x = pt0.x(); A.y = pt0.y(); A.z = pt0.z();
  32.         B.x = pt1.x(); B.y = pt1.y(); B.z = pt1.z();
  33.         C.x = pt2.x(); C.y = pt2.y(); C.z = pt2.z();
  34.         pFace->setVertexAt(0, A);
  35.         pFace->setVertexAt(1, B);
  36.         pFace->setVertexAt(2, C);
  37.         pFace->setVertexAt(3, A);
  38.         if(pBlockTableRecord->appendAcDbEntity(pFace) != Acad::eOk)
  39.           delete pFace;
  40.         else
  41.           pFace->close();
  42.       }
  43.     }
  44.     QueryPerformanceCounter(&end);
  45.     acutPrintf(_T("\n%g seconds - %ld points"),
  46.       (double)(end.QuadPart-start.QuadPart)/freq.QuadPart,points.length() );
  47.   }

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-8-24 01:16:06 | 显示全部楼层
太棒了!
很长一段时间以来,我一直想知道使用CGAL。
关于Delaunay,我也为autocad 2004-2006做了一个例程。
这是我的作品。
键入“DDD”,选择点云,然后您可以获得德劳尼三角形。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-8-24 01:56:59 | 显示全部楼层
似乎我做错了什么,这个代码是更快的
计算只有
0.306322秒 - 213,093点
4.976534秒 - 3,265,110点
计算和绘制
1.433781秒 - 213093点
97.373313秒 - 3265110点
  1. static void ArxPointCloud_tpc(void)
  2.   {
  3.     CalDelaunay dt;
  4.     ads_name name = {0L,0L};
  5.     ads_point point = {0.0,0.0,0.0};
  6.     if(acedEntSel(_T("Select Point Cloud"),name,point) != RTNORM)
  7.       return;
  8.     LARGE_INTEGER freq,start,end;   
  9.     QueryPerformanceFrequency(&freq);
  10.     QueryPerformanceCounter(&start);
  11.     // My Point cloud object
  12.     AcDbObjectPointer pCloud( (AcDbObjectId)(AcDbStub*)name[0],AcDb::kForRead);
  13.     if(pCloud.openStatus() != Acad::eOk)
  14.       return;
  15.    
  16.     const AcGePoint3dArray &points = pCloud->PointArray();
  17.     std::vector calPoints;
  18.     calPoints.reserve(points.length());
  19.     for (long i = 0; i workingDatabase();
  20.     if(!pDB) return;
  21.     AcDbBlockTableRecordPointer pBlockTableRecord(pDB->currentSpaceId(),AcDb::kForWrite);
  22.     if(pBlockTableRecord.openStatus() != Acad::eOk)
  23.       return;
  24.     AcGePoint3d A,B,C;
  25.     for (CalDelaunay::Finite_faces_iterator it = dt.finite_faces_begin();
  26.                                              it!=dt.finite_faces_end();++it)
  27.     {
  28.       const CalPoint& pt0 =  (*it).vertex(0)->point();
  29.       const CalPoint& pt1 =  (*it).vertex(1)->point();
  30.       const CalPoint& pt2 =  (*it).vertex(2)->point();
  31.       AcDbFace *pFace = new AcDbFace();
  32.       if(pFace)
  33.       {
  34.         A.x = pt0.x(); A.y = pt0.y(); A.z = pt0.z();
  35.         B.x = pt1.x(); B.y = pt1.y(); B.z = pt1.z();
  36.         C.x = pt2.x(); C.y = pt2.y(); C.z = pt2.z();
  37.         pFace->setVertexAt(0, A);
  38.         pFace->setVertexAt(1, B);
  39.         pFace->setVertexAt(2, C);
  40.         pFace->setVertexAt(3, A);
  41.         if(pBlockTableRecord->appendAcDbEntity(pFace) != Acad::eOk)
  42.           delete pFace;
  43.         else
  44.           pFace->close();
  45.       }
  46.     }
  47.     QueryPerformanceCounter(&end);
  48.     acutPrintf(_T("\n%g seconds - %ld points"),
  49.       (double)(end.QuadPart-start.QuadPart)/freq.QuadPart,points.length() );
  50.   }

回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-8-24 01:58:01 | 显示全部楼层

伙计,你的烟抽得真快!
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-8-24 02:04:01 | 显示全部楼层
这是你的时间高飞鸟...干得好
收集积分的时间是:0.227737秒。
有212996点。
Delaunay的时间是:0.357808秒。
绘制Delaunay的时间是:1.934219秒
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-8-24 02:42:17 | 显示全部楼层
总有一天我会试试的<这将节省很多时间<嗨,丹尼尔,你能介绍一下如何使用它吗?非常感谢你。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2010-8-24 06:00:15 | 显示全部楼层
只需安装boost(确保包含线程库),这是一个非常酷的东西。
下载cgal和cmake的最新版本(为您创建VS解决方案)。我花了几个小时的时间让cmake构建解决方案,但这更像是在x64位机器上找到我的编译器的问题...
我在“展示我的资料”区域发布了我的解决方案
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-2-5 19:42 , Processed in 0.212771 second(s), 66 queries .

© 2020-2025 乐筑天下

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