You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
2.6 KiB
C++
154 lines
2.6 KiB
C++
#include "stdafx.h"
|
|
#include "pointsubset.h"
|
|
#include <fstream>
|
|
#include <string>
|
|
#include <sstream>
|
|
#include <list>
|
|
#include <algorithm>
|
|
#include <set>
|
|
#include "simplegrid.h"
|
|
|
|
using namespace std;
|
|
|
|
CPointSubset::CPointSubset(void)
|
|
:m_xmax(0.0)
|
|
, m_xmin(.0)
|
|
,m_ymin(.0)
|
|
,m_ymax(.0)
|
|
{
|
|
|
|
}
|
|
CPointSubset::~CPointSubset(void)
|
|
{
|
|
|
|
}
|
|
int CPointSubset::ReadPoints(CString strXyz)
|
|
{
|
|
m_points.clear();
|
|
|
|
ifstream ifs(strXyz, fstream::in);
|
|
if (!ifs)
|
|
return 0;
|
|
CString str;
|
|
|
|
string line;
|
|
stringstream sstr;
|
|
size_t idx = 0;
|
|
string name;
|
|
CPointXYZ xyz;
|
|
while (getline(ifs, line))
|
|
{
|
|
if (line.size() < 5)
|
|
continue;
|
|
|
|
idx = line.find("3dPoint");
|
|
if (idx != std::string::npos)
|
|
{
|
|
line = line.substr(idx + 7);
|
|
}
|
|
|
|
replace(line.begin(), line.end(), ',', ' ');
|
|
|
|
sstr.clear();
|
|
sstr.str(line);
|
|
sstr >> xyz.x0 >> xyz.y0 >> xyz.z0;
|
|
|
|
m_points.push_back(xyz);
|
|
|
|
|
|
}
|
|
|
|
GetExtremeValues();
|
|
|
|
return (int)m_points.size();
|
|
|
|
|
|
}
|
|
|
|
void CPointSubset::GetExtremeValues(void) //»ñȡɢµã¼«Öµ
|
|
{
|
|
if (m_points.size() < 1)
|
|
return;
|
|
m_xmin = m_xmax = m_points[0].x0;
|
|
m_ymin = m_ymax = m_points[0].y0;
|
|
for (auto& p : m_points)
|
|
{
|
|
m_xmin = min(m_xmin, p.x0);
|
|
m_xmax = max(m_xmax, p.x0);
|
|
m_ymin = min(m_ymin, p.y0);
|
|
m_ymax = max(m_ymax, p.y0);
|
|
}
|
|
}
|
|
|
|
int CPointSubset::ReadPoints(std::vector<CPointXYZ>& vecXyz)
|
|
{
|
|
m_points.assign(vecXyz.begin(), vecXyz.end());
|
|
|
|
GetExtremeValues();
|
|
|
|
return (int)m_points.size();
|
|
|
|
}
|
|
|
|
int CPointSubset::CreateSubsetWithMinDist(float fMinDist, std::vector<int>& idxReserved,
|
|
std::vector<int>* idxRemoved)
|
|
{
|
|
if(fMinDist <= 0.000001)
|
|
return 0;
|
|
|
|
int xnum = ceil((m_xmax - m_xmin) / fMinDist) + 1;
|
|
int ynum = ceil((m_ymax - m_ymin) / fMinDist) + 1;
|
|
CSimpleGrid grd;
|
|
grd.Create(m_xmin, m_ymin, fMinDist, fMinDist,xnum, ynum);
|
|
|
|
////begin test
|
|
//grd.WriteGridLines("d:/testgrd.dfd");
|
|
////end test
|
|
|
|
grd.ReadPoints(m_points);
|
|
|
|
grd.SimplifyNodePointsArray();
|
|
list<int> dstlst;
|
|
grd.GetAllNodePointIndexes(dstlst);
|
|
|
|
|
|
idxReserved.assign(dstlst.begin(), dstlst.end());
|
|
|
|
if (idxRemoved)
|
|
{
|
|
set<int> rsvset;
|
|
for (auto p : dstlst)
|
|
rsvset.insert(p);
|
|
idxRemoved->reserve(m_points.size() - rsvset.size());
|
|
for (int i = 0; i < m_points.size(); i++)
|
|
{
|
|
if (rsvset.count(i) < 1)
|
|
idxRemoved->push_back(i);
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
|
|
//ÓɵãÐòºÅд³öµã¼¯µ½Îļþ
|
|
int CPointSubset::WritePoints(CString fname, std::vector<int>& idxReserved)
|
|
{
|
|
FILE* fw = fopen(fname, "w");
|
|
if (nullptr == fw)
|
|
return 0;
|
|
for (auto idx : idxReserved)
|
|
fprintf(fw, "%.12g,%.12g,%g\n", m_points[idx].x0,
|
|
m_points[idx].y0, m_points[idx].z0);
|
|
|
|
|
|
fclose(fw);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (int)idxReserved.size();
|
|
} |