void Clustering3D::clusterStartRecursive(SortingType sortingType) { mClustersCenter.clear(); mClustersTexCenter.clear(); mClustersFlow.clear(); mClusterSize.clear(); mCluster6DSize.clear(); mHeadSize.clear(); PreciseTimer stat = PreciseTimer::currentTime(); switch (sortingType) { case SORT_X: std::sort((*mCloud).begin(), (*mCloud).end(), SortSwarmPointX()); break; case SORT_Y: std::sort((*mCloud).begin(), (*mCloud).end(), SortSwarmPointY()); break; case SORT_Z: std::sort((*mCloud).begin(), (*mCloud).end(), SortSwarmPointZ()); break; case NONE: break; } mSortingTime = stat.usecsTo(PreciseTimer::currentTime()); for (unsigned i = 0; i < mCloud->size(); i++) { if ((*mCloud)[i].cluster != 0) { continue; } mIndexes.clear(); mIndexes.push_back((int)i); clusteringRecursive(mDepth, 0, sortingType); if (mClusters.back().size() > mSize ) { bool isGood = true; int sz = (int)mClustersCenter.size(); mClusters.back().getStat(); for (int i = 0; i < sz; i++) { // check if new cluster not down from previous if (fabs(mClusters.back().mClusterInfo.point.z() - mClustersCenter[i].z()) < mHeadArea && fabs(mClusters.back().mClusterInfo.point.x() - mClustersCenter[i].x()) < mHeadArea ) isGood = false; } if (isGood) { mClustersTexCenter.push_back(mClusters.back().mClusterInfo.texCoor); mClustersCenter.push_back(mClusters.back().mClusterInfo.point); mClustersFlow.push_back(mClusters.back().mClusterInfo.speed); mClusterSize.push_back((int)mClusters.back().size()); mCluster6DSize.push_back(mClusters.back().m6Dpoints); vector<double> tmpVect = mClusters.back().mEllipse.mValues; double forMax = 0; for (unsigned i = 0; i < tmpVect.size(); i++) { forMax = forMax < tmpVect[i] ? tmpVect[i] : forMax; } mHeadSize.push_back(forMax); } if (mClustersCenter.size() == mHeadNumber) break; } } mClusteringTime = stat.usecsTo(PreciseTimer::currentTime()); }