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++

#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();
}