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