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

1 month ago
#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; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string code; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
COLORREF fillColor; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ
COLORREF borderColor; // <20>߽<EFBFBD><DFBD><EFBFBD>ɫ
double x; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double y; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int value; // <20><>ֵ
};
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<45><44><EFBFBD>ɳ<EFBFBD><C9B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD>)
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"><3E>߽<EFBFBD><DFBD>ļ<EFBFBD></param>
/// <param name="grid_interval"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="subblock_count"><3E>ֿ鴦<D6BF><E9B4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC> 4<><34></param>
/// <param name="idw_neighbors">IDW <20>ھ<EFBFBD><DABE><EFBFBD></param>
/// <param name="idw_power">IDW <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƾ<EFBFBD><C6BE><EFBFBD>˥<EFBFBD><CBA5>ǿ<EFBFBD>ȣ<EFBFBD></param>
/// <param name="use_shepard"><3E>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9> Shepard <20>Ľ<EFBFBD><C4BD><EFBFBD></param>
/// <param name="smooth_boundary"><3E>߽紦<DFBD><E7B4A6><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>򻯲<EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD></param>
/// <param name="progressCallback"><3E><><EFBFBD>Ȼش<C8BB></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>
/// <20><>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD> + <20><>˹ƽ<CBB9><C6BD> + <20><>̬ѧ<CCAC><D1A7><EFBFBD><EFBFBD>
/// </summary>
/// <param name="csvFile"></param>
/// <param name="kevFile"></param>
/// <param name="boundaryFile"><3E>߽<EFBFBD><DFBD>ļ<EFBFBD></param>
/// <param name="grid_interval"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="sigma"><3E><>˹ƽ<CBB9><C6BD><EFBFBD>뾶</param>
/// <param name="open_iter"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="close_iter"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="progressCallback"><3E><><EFBFBD>Ȼش<C8BB></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(); }
//<2F><>grd<72>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool ProcessExistingGrd(
const CString& grdFile, // <20>Ѵ<EFBFBD><D1B4>ڵ<EFBFBD> GRD <20>ļ<EFBFBD>
const CString& kevFile, // <20><><EFBFBD><EFBFBD> KEV <20>ļ<EFBFBD>
CColorBase base,
bool isFaciesBorder,
std::function<void(int completed, int total)> progressCallback = nullptr);
private:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB>
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);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool CreateFaciesLines(std::shared_ptr<CXy> pXy, std::vector<CCurve*> pCurves);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
// <20><>ȡ<EFBFBD>߽<EFBFBD><DFBD><EFBFBD>/<2F>߿<EFBFBD>
std::vector<CCurveEx*> GetDFDBorder(const CString& path);
bool IsPointInPolygon(double qx, double qy, const std::vector<CCurveEx*>& polygons);
//<2F><><EFBFBD>߽缫ֵ<E7BCAB><D6B5><EFBFBD><EFBFBD>
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; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ӧzֵ<7A><D6B5>ϵ
std::map<int, COLORREF> m_ColorList;
std::atomic<bool> m_cancelRequested{ false };
};