似乎我做错了什么,这个代码是更快的
计算只有
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[0],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() );
- }
|