#pragma once #include #include #include #include #include #include #include #include #include #include #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" #include "../DrawOperator/nanoflann.hpp" struct Sample { double x, y; int label; }; struct FaciesConfig { std::string name; // 相名称 std::string code; // 相代码 COLORREF fillColor; // 填充颜色 COLORREF borderColor; // 边界颜色 double x; // 横坐标 double y; // 纵坐标 int value; // 相值 }; using namespace nanoflann; struct PointCloud { std::vector pts; inline size_t kdtree_get_point_count() const { return pts.size(); } inline double kdtree_distance(const double* p, const size_t idx, size_t) const { double dx = p[0] - pts[idx].x; double dy = p[1] - pts[idx].y; return dx * dx + dy * dy; } inline double kdtree_get_pt(const size_t idx, int dim) const { return dim == 0 ? pts[idx].x : pts[idx].y; } template bool kdtree_get_bbox(BBOX&) const { return false; } }; class KEDAlgorithm { public: KEDAlgorithm(); ~KEDAlgorithm(); //KED生成沉积相网格(初版) bool KEDMeshAlgorithm(const CString& csvFile, const CString& kevFile, double grid_interval = 20, double bandwidth = 600, double beta = 0.18, int anchor_radius = 3, std::function progressCallback = nullptr); /// /// IDW /// /// /// /// 边界文件 /// 网格间隔 /// 分块处理数量(默认 4) /// IDW 邻居数 /// IDW 幂指数(控制距离衰减强度) /// 是否使用 Shepard 改进型 /// 边界处理方式(简化并圆滑) /// 进度回传 /// bool IDWMeshAlgorithm(const CString& csvFile, const CString& kevFile, const CString& boundaryFile = _T(""), double grid_interval = 10, int subblock_count = 4, int idw_neighbors = 15, double idw_power = 3, bool use_shepard = true, bool smooth_boundary = true, bool isFaciesBorder = false, std::function progressCallback = nullptr); /// /// 离散点最近邻分类 + 高斯平滑 + 形态学处理 /// /// /// /// 边界文件 /// 网格间隔 /// 高斯平滑半径 /// 开运算迭代次数 /// 闭运算迭代次数 /// 进度回传 /// bool NNMeshAlgorithm(const CString& csvFile, const CString& kevFile, const CString& boundaryFile = _T(""), double grid_interval = 20.0, double sigma = 5.0, int open_iter = 1, int close_iter = 1, bool isFaciesBorder = false, std::function progressCallback = nullptr); void StopTask(); std::unordered_map GetDepositionalMap(); bool isCancelRequested() const { return m_cancelRequested.load(); } //由grd文件生成相界 bool ProcessExistingGrd( const CString& grdFile, // 已存在的 GRD 文件 const CString& kevFile, // 输出 KEV 文件 CColorBase base, bool isFaciesBorder, std::function progressCallback = nullptr); private: // 新增:加载配置文件并初始化颜色表 std::vector LoadFaciesSettings(const CString& settingsFile, std::map& labelMap); std::vector ReadSamplesCSV(const CString& csvFile, std::map& labelMap); double KdeLogDensityBrute(const std::vector& samples, int label, double qx, double qy, double bandwidth) const; bool WriteDSAAFromGrid(const std::string& output_grd, const std::vector& grid_data, int nx, int ny, double minx, double maxx, double miny, double maxy); bool GrdToKEVFile(const CString &gridFile, const CString &outputFile, std::vector pCurves, CColorBase &base); //添加相界线 bool CreateFaciesLines(std::shared_ptr pXy, std::vector pCurves); //添加相界线 void AddFaciesCurves(std::shared_ptr pXy, std::vector pCurves, CString layerName); void PostProcessFaciesBoundaries( std::vector& pCurves, double sigma_smooth, int min_seg_cells, double drop_closed_thresh, double dx, double dy); // 获取边界线/边框 std::vector GetDFDBorder(const CString& path); bool IsPointInPolygon(double qx, double qy, const std::vector& polygons); //带边界极值处理 bool WriteDSAAFromGridKeepZRange( const std::string& output_grd, const std::vector& grid_data, int nx, int ny, double minx, double maxx, double miny, double maxy, float zmin, float zmax); private: std::unordered_map m_DepositionalMap; //沉积相 对应z值关系 std::map m_ColorList; std::atomic m_cancelRequested{ false }; };