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.

170 lines
5.8 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include <vector>
#include <string>
#include <map>
#include <fstream>
#include <sstream>
#include <iostream>
#include <limits>
#include <cmath>
#include <algorithm>
#include <stdexcept>
#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<FaciesConfig> 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<class BBOX> 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<void(int completed, int total)> progressCallback = nullptr);
/// <summary>
/// IDW
/// </summary>
/// <param name="csvFile"></param>
/// <param name="kevFile"></param>
/// <param name="boundaryFile">边界文件</param>
/// <param name="grid_interval">网格间隔</param>
/// <param name="subblock_count">分块处理数量(默认 4</param>
/// <param name="idw_neighbors">IDW 邻居数</param>
/// <param name="idw_power">IDW 幂指数(控制距离衰减强度)</param>
/// <param name="use_shepard">是否使用 Shepard 改进型</param>
/// <param name="smooth_boundary">边界处理方式(简化并圆滑)</param>
/// <param name="progressCallback">进度回传</param>
/// <returns></returns>
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<void(int completed, int total)> progressCallback = nullptr);
/// <summary>
/// 离散点最近邻分类 + 高斯平滑 + 形态学处理
/// </summary>
/// <param name="csvFile"></param>
/// <param name="kevFile"></param>
/// <param name="boundaryFile">边界文件</param>
/// <param name="grid_interval">网格间隔</param>
/// <param name="sigma">高斯平滑半径</param>
/// <param name="open_iter">开运算迭代次数</param>
/// <param name="close_iter">闭运算迭代次数</param>
/// <param name="progressCallback">进度回传</param>
/// <returns></returns>
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<void(int completed, int total)> progressCallback = nullptr);
void StopTask();
std::unordered_map<std::string, int> 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<void(int completed, int total)> progressCallback = nullptr);
private:
// 新增:加载配置文件并初始化颜色表
std::vector<FaciesConfig> LoadFaciesSettings(const CString& settingsFile,
std::map<std::string, int>& labelMap);
std::vector<Sample> ReadSamplesCSV(const CString& csvFile,
std::map<std::string, int>& labelMap);
double KdeLogDensityBrute(const std::vector<FaciesConfig>& samples,
int label, double qx, double qy,
double bandwidth) const;
bool WriteDSAAFromGrid(const std::string& output_grd,
const std::vector<float>& grid_data,
int nx, int ny,
double minx, double maxx,
double miny, double maxy);
bool GrdToKEVFile(const CString &gridFile, const CString &outputFile, std::vector<CCurve*> pCurves, CColorBase &base);
//添加相界线
bool CreateFaciesLines(std::shared_ptr<CXy> pXy, std::vector<CCurve*> pCurves);
//添加相界线
void AddFaciesCurves(std::shared_ptr<CXy> pXy, std::vector<CCurve*> pCurves, CString layerName);
void PostProcessFaciesBoundaries(
std::vector<CCurve*>& pCurves,
double sigma_smooth,
int min_seg_cells,
double drop_closed_thresh,
double dx, double dy);
// 获取边界线/边框
std::vector<CCurveEx*> GetDFDBorder(const CString& path);
bool IsPointInPolygon(double qx, double qy, const std::vector<CCurveEx*>& polygons);
//带边界极值处理
bool WriteDSAAFromGridKeepZRange(
const std::string& output_grd,
const std::vector<float>& grid_data,
int nx, int ny,
double minx, double maxx,
double miny, double maxy,
float zmin, float zmax);
private:
std::unordered_map<std::string, int> m_DepositionalMap; //沉积相 对应z值关系
std::map<int, COLORREF> m_ColorList;
std::atomic<bool> m_cancelRequested{ false };
};