67 lines
1.4 KiB
C++
67 lines
1.4 KiB
C++
#include "SG_baseDataType.h"
|
|
#include "SG_baseAlgo_Export.h"
|
|
#include <vector>
|
|
#include <corecrt_math_defines.h>
|
|
#include <cmath>
|
|
|
|
void _seedClustering(
|
|
std::vector< SVzNL3DPosition>& a_cluster,
|
|
std::vector< SVzNL3DPosition>& pts,
|
|
double clusterDist)
|
|
{
|
|
int i = 0;
|
|
while (1)
|
|
{
|
|
if (i >= a_cluster.size())
|
|
break;
|
|
|
|
SVzNL3DPosition a_seed = a_cluster[i];
|
|
for (int i = 0, i_max = (int)pts.size(); i < i_max; i++)
|
|
{
|
|
if (pts[i].nPointIdx < 0)
|
|
continue;
|
|
double dist = sqrt(pow(a_seed.pt3D.x - pts[i].pt3D.x, 2) + pow(a_seed.pt3D.y - pts[i].pt3D.y, 2));
|
|
if (dist < clusterDist)
|
|
{
|
|
a_cluster.push_back(pts[i]);
|
|
pts[i].nPointIdx = -1;
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void sg_pointClustering(
|
|
std::vector< SVzNL3DPosition>& pts,
|
|
double clusterDist,
|
|
std::vector<std::vector< SVzNL3DPosition>>& objClusters //result
|
|
)
|
|
{
|
|
int ptSize = (int)pts.size();
|
|
if (ptSize == 0)
|
|
return;
|
|
while(pts.size() > 0)
|
|
{
|
|
SVzNL3DPosition a_pt = pts[0];
|
|
|
|
//新建一个cluster
|
|
std::vector< SVzNL3DPosition> a_cluster;
|
|
a_cluster.push_back(a_pt);
|
|
pts[0].nPointIdx = -1; //防止重复被计算
|
|
_seedClustering(
|
|
a_cluster,
|
|
pts,
|
|
clusterDist);
|
|
objClusters.push_back(a_cluster); //保存一个聚类
|
|
//将pts中处理过的点去除
|
|
int m_max = (int)pts.size();
|
|
for (int m = m_max - 1; m >= 0; m--) //从后往前,这样删除不会影响循环
|
|
{
|
|
if(pts[m].nPointIdx < 0)
|
|
pts.erase(pts.begin() + m);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
; |