- 积分
- 40136
- 明经币
- 个
- 注册时间
- 2010-7-10
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
我在这里把核心代码贴出来
此算法采用了hash_map和DFS
 - //方法二:采用hash_map
- void QT::QuadTree::findConnected(const std::vector<AcDbObjectId>& objs, std::vector<std::vector<AcDbObjectId> > & out)
- {
- Acad::ErrorStatus es;
- AcDbExtents exts;
- std::vector<Point> points;
- if (objs.empty()) return;
- TimeCounter tt;
- for (int i = 0, k = 0; i < (int)objs.size(); ++i)
- {
- AcDbObjectId id = objs;
- AcDbObjectPointer<AcDbCurve> curve(id, AcDb::kForRead);
- es = curve.openStatus();
- if (es != Acad::eOk) continue;
- Point pt1, pt2;
- curve->getStartPoint(pt1);
- curve->getEndPoint(pt2);
- pt1.z = 0; //Z坐标归零
- pt2.z = 0; //Z坐标归零
- pt1.id = id;
- pt2.id = id;
- pt1.index = k++;
- pt2.index = k++;
- points.push_back(pt1);
- points.push_back(pt2);
- if (curve->isClosed() || pt1.distanceTo(pt2) < Point::pointTol)
- {
- points[k - 1].bClosed = true;
- points[k - 2].bClosed = true;
- }
- }
- tt.PrintTime(_T("收集"));
- std::vector<Point*> pp(points.size());
- for (size_t i =0; i<points.size();++i)
- {
- pp = & points;
- }
- for (size_t i =0; i<points.size();++i)
- {
- points.pNext = pp[i+1];
- points[i+1].pNext = pp;
- ++i;
- }
- //点按照先x后y从小到大排序,然后相同(相近)位置的分为一组
- std::sort(pp.begin(),pp.end(),Point_Comp());
- hash_map<int, std::vector<Point*> > hashPoints;
- std::set<int> allGroups;
- for (int i = 0, j = 0; i < (int)pp.size(); ++j)
- {
- Point* pt = pp;
- pt->iGroup = j;
- hashPoints[j].push_back(pt);
- allGroups.insert(j);
- i++;
- for(;i<pp.size();++i)
- {
- if (pp->distanceTo(*pp[i-1]) > 1e-1)
- {
- break;
- }
- pp->iGroup = j;
- hashPoints[j].push_back(pp);
- }
- }
- //DFS 算法得出相连的线段
- while (!allGroups.empty())
- {
- int i = *allGroups.begin();
- Point* pt = *(hashPoints.begin());
- std::vector<AcDbObjectId> Ids;
- findConnected(pt, hashPoints, Ids, allGroups);
- out.push_back(Ids);
- }
- tt.PrintTime(_T("连接"));
- }
- //方法二的子程序
- void QT::QuadTree::findConnected(Point* pt, hash_map<int, std::vector<Point*> > & hashPoints, std::vector<AcDbObjectId>& outIds, std::set<int> & allGroups)
- {
- if (pt->bVisited) return;
- std::vector<Point*>& ptSame = hashPoints[pt->iGroup];
- allGroups.erase(pt->iGroup);
- for (size_t i = 0; i < ptSame.size(); ++i)
- {
- ptSame->bVisited = true;
- if (!ptSame->pNext->bVisited)
- {
- outIds.push_back(ptSame->id);
- }
- }
- for (size_t i = 0; i < ptSame.size(); ++i)
- {
- if (!ptSame->pNext->bVisited)
- {
- findConnected(ptSame->pNext, hashPoints, outIds, allGroups);
- }
- }
- }
|
评分
-
查看全部评分
|