有人用CGAL吗?
CGAL@www.cgal.org安装/编译有点痛苦,但它有一些非常酷的东西。
我尝试了许多三角形算法之一,以下是仅计算三角形的结果
3.21761秒-213,093点
162.707秒-3,265,110点
计算三角形和绘制3d面
4.342942秒-213,093点
254.525742秒-3,265,110点
static void ArxPointCloud_tpc(void)
{
CalDelaunay dt;
ads_name name = {0L,0L};
ads_point point = {0.0,0.0,0.0};
if(acedEntSel(_T("Select Point Cloud"),name,point) != RTNORM)
return;
LARGE_INTEGER freq,start,end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);
// My Point cloud object
AcDbObjectPointer pCloud( (AcDbObjectId)(AcDbStub*)name,AcDb::kForRead);
if(pCloud.openStatus() != Acad::eOk)
return;
// inserting does the Delaunay!?!
const AcGePoint3dArray &points = pCloud->PointArray();
for (long i = 0; i workingDatabase();
AcDbBlockTableRecordPointer pBlockTableRecord(pDB->currentSpaceId(),AcDb::kForWrite);
if(pBlockTableRecord.openStatus() != Acad::eOk)
return;
AcGePoint3d A,B,C;
for (CalDelaunay::Finite_faces_iterator it = dt.finite_faces_begin();
it!=dt.finite_faces_end();++it)
{
const CalPoint& pt0 =(*it).vertex(0)->point();
const CalPoint& pt1 =(*it).vertex(1)->point();
const CalPoint& pt2 =(*it).vertex(2)->point();
AcDbFace *pFace = new AcDbFace();
if(pFace)
{
A.x = pt0.x(); A.y = pt0.y(); A.z = pt0.z();
B.x = pt1.x(); B.y = pt1.y(); B.z = pt1.z();
C.x = pt2.x(); C.y = pt2.y(); C.z = pt2.z();
pFace->setVertexAt(0, A);
pFace->setVertexAt(1, B);
pFace->setVertexAt(2, C);
pFace->setVertexAt(3, A);
if(pBlockTableRecord->appendAcDbEntity(pFace) != Acad::eOk)
delete pFace;
else
pFace->close();
}
}
QueryPerformanceCounter(&end);
acutPrintf(_T("\n%g seconds - %ld points"),
(double)(end.QuadPart-start.QuadPart)/freq.QuadPart,points.length() );
}
**** Hidden Message ***** 太棒了!
很长一段时间以来,我一直想知道使用CGAL。
关于Delaunay,我也为autocad 2004-2006做了一个例程。
这是我的作品。
键入“DDD”,选择点云,然后您可以获得德劳尼三角形。
似乎我做错了什么,这个代码是更快的
计算只有
0.306322秒 - 213,093点
4.976534秒 - 3,265,110点
计算和绘制
1.433781秒 - 213093点
97.373313秒 - 3265110点
static void ArxPointCloud_tpc(void)
{
CalDelaunay dt;
ads_name name = {0L,0L};
ads_point point = {0.0,0.0,0.0};
if(acedEntSel(_T("Select Point Cloud"),name,point) != RTNORM)
return;
LARGE_INTEGER freq,start,end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);
// My Point cloud object
AcDbObjectPointer pCloud( (AcDbObjectId)(AcDbStub*)name,AcDb::kForRead);
if(pCloud.openStatus() != Acad::eOk)
return;
const AcGePoint3dArray &points = pCloud->PointArray();
std::vector calPoints;
calPoints.reserve(points.length());
for (long i = 0; i workingDatabase();
if(!pDB) return;
AcDbBlockTableRecordPointer pBlockTableRecord(pDB->currentSpaceId(),AcDb::kForWrite);
if(pBlockTableRecord.openStatus() != Acad::eOk)
return;
AcGePoint3d A,B,C;
for (CalDelaunay::Finite_faces_iterator it = dt.finite_faces_begin();
it!=dt.finite_faces_end();++it)
{
const CalPoint& pt0 =(*it).vertex(0)->point();
const CalPoint& pt1 =(*it).vertex(1)->point();
const CalPoint& pt2 =(*it).vertex(2)->point();
AcDbFace *pFace = new AcDbFace();
if(pFace)
{
A.x = pt0.x(); A.y = pt0.y(); A.z = pt0.z();
B.x = pt1.x(); B.y = pt1.y(); B.z = pt1.z();
C.x = pt2.x(); C.y = pt2.y(); C.z = pt2.z();
pFace->setVertexAt(0, A);
pFace->setVertexAt(1, B);
pFace->setVertexAt(2, C);
pFace->setVertexAt(3, A);
if(pBlockTableRecord->appendAcDbEntity(pFace) != Acad::eOk)
delete pFace;
else
pFace->close();
}
}
QueryPerformanceCounter(&end);
acutPrintf(_T("\n%g seconds - %ld points"),
(double)(end.QuadPart-start.QuadPart)/freq.QuadPart,points.length() );
}
伙计,你的烟抽得真快! 这是你的时间高飞鸟...干得好
收集积分的时间是:0.227737秒。
有212996点。
Delaunay的时间是:0.357808秒。
绘制Delaunay的时间是:1.934219秒 总有一天我会试试的<这将节省很多时间<嗨,丹尼尔,你能介绍一下如何使用它吗?非常感谢你。 只需安装boost(确保包含线程库),这是一个非常酷的东西。
下载cgal和cmake的最新版本(为您创建VS解决方案)。我花了几个小时的时间让cmake构建解决方案,但这更像是在x64位机器上找到我的编译器的问题...
我在“展示我的资料”区域发布了我的解决方案
页:
[1]