#include "stdafx.h" #include "pointsubset.h" #include #include #include #include #include #include #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& vecXyz) { m_points.assign(vecXyz.begin(), vecXyz.end()); GetExtremeValues(); return (int)m_points.size(); } int CPointSubset::CreateSubsetWithMinDist(float fMinDist, std::vector& idxReserved, std::vector* 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 dstlst; grd.GetAllNodePointIndexes(dstlst); idxReserved.assign(dstlst.begin(), dstlst.end()); if (idxRemoved) { set 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& 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(); }