|
|
#include "pch.h"
|
|
|
#include "IDWCreator.h"
|
|
|
#include <array>
|
|
|
#include "IDWCalculation.h"
|
|
|
#include <ppl.h>
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
|
|
|
|
int StepProgress::stepCount = 0;
|
|
|
int StepProgress::progress = 0;
|
|
|
int StepProgress::lastProgress = 0;
|
|
|
CPPCallback StepProgress::DoProgress = nullptr;
|
|
|
|
|
|
using namespace concurrency;
|
|
|
|
|
|
//int StepProgress::stepCount = 0;
|
|
|
//int StepProgress::progress = 0;
|
|
|
CIDWCreator::CIDWCreator()
|
|
|
{
|
|
|
//DoProgress = nullptr;
|
|
|
}
|
|
|
|
|
|
CIDWCreator::~CIDWCreator()
|
|
|
{
|
|
|
|
|
|
}
|
|
|
// 坐标转换
|
|
|
//inline double ConvertX2D(int64_t source, DPoint3& ptOrigin) {
|
|
|
// return source / 100.0 + ptOrigin.x;
|
|
|
//}
|
|
|
//inline double ConvertY2D(int64_t source, DPoint3& ptOrigin) {
|
|
|
// return source / 100.0 + ptOrigin.y;
|
|
|
//}
|
|
|
inline int64_t ConvertX2Int(double source, DPoint3& ptOrigin) {
|
|
|
return (source - ptOrigin.x) * 100;
|
|
|
}
|
|
|
inline int64_t ConvertY2Int(double source, DPoint3& ptOrigin) {
|
|
|
return (source - ptOrigin.y) * 100;
|
|
|
}
|
|
|
//void CALLBACK EXPORT TimerProc(
|
|
|
// HWND hWnd, // handle of CWnd that called SetTimer
|
|
|
// UINT nMsg, // WM_TIMER
|
|
|
// UINT_PTR nIDEvent, // timer identification
|
|
|
// DWORD dwTime // system time
|
|
|
//)
|
|
|
//{
|
|
|
// if (StepProgress::DoProgress != nullptr) {
|
|
|
// StepProgress::DoProgress(_T("网格化"), (int)(((double)StepProgress::progress / StepProgress::stepCount)*100.0));
|
|
|
// }
|
|
|
//}
|
|
|
//************************************
|
|
|
// Method: Create
|
|
|
// FullName: CIDWCreator::Create
|
|
|
// Access: public
|
|
|
// Returns: void
|
|
|
// Qualifier:
|
|
|
// Parameter: CString xyzFile
|
|
|
// Parameter: CString borderFile
|
|
|
// Parameter: int XCount
|
|
|
// Parameter: int insertTimes
|
|
|
//************************************
|
|
|
void CIDWCreator::Create(CString xyzFile, CString borderFile, CString faultFile, CString resultFile,
|
|
|
int XCount, double smoothFactor, int smoothTimes, CPPCallback callBack,
|
|
|
int insertTimes, double contourStep, int contourMarkStep
|
|
|
, double xMin/* = -1*/, double yMin/* = -1*/, double xMax, double yMax) // double dSearchDistance,
|
|
|
{
|
|
|
StepProgress::DoProgress = callBack;
|
|
|
// 读取散点
|
|
|
vector<array<double, 3>> dataXyz;
|
|
|
std::string strXyzFile = string(xyzFile);
|
|
|
ReadInToMatrix(strXyzFile, dataXyz);
|
|
|
size_t len = dataXyz.size();
|
|
|
if (len < 5) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
ptO.x = dataXyz[0][0];
|
|
|
ptO.y = dataXyz[0][1];
|
|
|
double dZMin = 1E100;
|
|
|
double dZMax = -1E100;
|
|
|
vector<DPoint3>* pPts = new vector<DPoint3>();
|
|
|
|
|
|
for (int i = 0; i < len; i++)
|
|
|
{
|
|
|
DPoint3 pt;
|
|
|
//pt.x = ConvertX2Int(dataXyz[i][0], ptO);
|
|
|
//pt.y = ConvertY2Int(dataXyz[i][1], ptO);
|
|
|
pt.x = dataXyz[i][0];
|
|
|
pt.y = dataXyz[i][1];
|
|
|
pt.z = dataXyz[i][2];
|
|
|
pPts->push_back(pt);
|
|
|
|
|
|
if (pt.z > dZMax) {
|
|
|
dZMax = pt.z;
|
|
|
}
|
|
|
if (pt.z < dZMin) {
|
|
|
dZMin = pt.z;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
parallel_sort(pPts->begin(), pPts->end(), IDWCalculation::PointSort);
|
|
|
|
|
|
// 读取边界文件
|
|
|
CCurveEx* pCurveBorder = nullptr;
|
|
|
CPositionList list;
|
|
|
CXy* pXyBorder = new CXy;
|
|
|
if (!borderFile.IsEmpty() && borderFile != "NULL")
|
|
|
{
|
|
|
OpenFile(borderFile, pXyBorder);
|
|
|
}
|
|
|
|
|
|
POSITION posBorder = NULL;
|
|
|
if (pXyBorder->GetElement(DOUBLEFOX_CURVE, list) > 0)
|
|
|
{
|
|
|
posBorder = list.GetHead();
|
|
|
pCurveBorder = (CCurveEx*)(pXyBorder->GetAtValue(posBorder));
|
|
|
//for (int i = 0; i < pCurveBorder->num; i++) {
|
|
|
// pCurveBorder->x[i] = ConvertX2Int(pCurveBorder->x[i], ptO);
|
|
|
// pCurveBorder->y[i] = ConvertY2Int(pCurveBorder->y[i], ptO);
|
|
|
//}
|
|
|
}
|
|
|
|
|
|
// 断层读取
|
|
|
CXy* pXyFaults = new CXy;
|
|
|
if (!faultFile.IsEmpty() && faultFile != "NULL") {
|
|
|
OpenFile(faultFile, pXyFaults);
|
|
|
}
|
|
|
|
|
|
//PathD lineClip;
|
|
|
//lineClip.push_back(PointD(5461.995, 7790.803));
|
|
|
//lineClip.push_back(PointD(5572.185351, 7918.825292));
|
|
|
//PathsD clip, solutionClosed, solutionOpen;
|
|
|
//clip.push_back(lineClip);
|
|
|
//ClipperD clipperD;
|
|
|
//clipperD.AddOpenSubject(clip);
|
|
|
//clipperD.AddClip(faultages);
|
|
|
//clipperD.Execute(ClipType::Intersection, FillRule::NonZero, solutionClosed, solutionOpen);
|
|
|
//if (solutionOpen.size() > 0) {
|
|
|
// for (int i = 0; i < solutionOpen.size(); i++) {
|
|
|
// TRACE("Pline\r\n");
|
|
|
// for (int j = 0; j < solutionOpen[i].size(); j++) {
|
|
|
// TRACE("%lf,%lf\r\n", solutionOpen[i][j].x, solutionOpen[i][j].y);
|
|
|
// }
|
|
|
// TRACE("\r\n");
|
|
|
// }
|
|
|
//}
|
|
|
//if (solutionClosed.size() > 0) {
|
|
|
// for (int i = 0; i < solutionClosed.size(); i++) {
|
|
|
// TRACE("Pline\r\n");
|
|
|
// for (int j = 0; j < solutionClosed[i].size(); j++) {
|
|
|
// TRACE("%lf,%lf\r\n", solutionClosed[i][j].x, solutionClosed[i][j].y);
|
|
|
// }
|
|
|
// TRACE("\r\n");
|
|
|
// }
|
|
|
//}
|
|
|
//return;
|
|
|
m_XMin = 1E100;
|
|
|
m_YMin = 1E100;
|
|
|
m_XMax = -1E100;
|
|
|
m_YMax = -1E100;
|
|
|
if (pCurveBorder != nullptr&&pCurveBorder->num >= 3)
|
|
|
{
|
|
|
CRect8 range;
|
|
|
range.SetRect(1e100, -1e100, -1e100, 1e100);
|
|
|
pCurveBorder->GetRange(range);
|
|
|
|
|
|
m_XMin = range.left;
|
|
|
m_XMax = range.right;
|
|
|
m_YMin = range.bottom;
|
|
|
m_YMax = range.top;
|
|
|
|
|
|
//m_XMin = ConvertX2Int(m_XMin, ptO);
|
|
|
//m_XMax = ConvertX2Int(m_XMax, ptO);
|
|
|
//m_YMin = ConvertY2Int(m_YMin, ptO);
|
|
|
//m_YMax = ConvertY2Int(m_YMax, ptO);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (xMin > 0 && yMin > 0)
|
|
|
{ // 指定坐标范围
|
|
|
m_XMin = xMin;
|
|
|
m_YMin = yMin;
|
|
|
m_XMax = xMax;
|
|
|
m_YMax = yMax;
|
|
|
}
|
|
|
else {
|
|
|
for (auto& v : dataXyz) {
|
|
|
if (v[0] < m_XMin)
|
|
|
{
|
|
|
m_XMin = v[0];
|
|
|
}
|
|
|
if (v[0] > m_XMax)
|
|
|
{
|
|
|
m_XMax = v[0];
|
|
|
}
|
|
|
if (v[1] < m_YMin)
|
|
|
{
|
|
|
m_YMin = v[1];
|
|
|
}
|
|
|
if (v[1] > m_YMax)
|
|
|
{
|
|
|
m_YMax = v[1];
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
//m_XMin = ConvertX2Int(m_XMin, ptO);
|
|
|
//m_XMax = ConvertX2Int(m_XMax, ptO);
|
|
|
//m_YMin = ConvertY2Int(m_YMin, ptO);
|
|
|
//m_YMax = ConvertY2Int(m_YMax, ptO);
|
|
|
|
|
|
pCurveBorder = new CCurveEx;
|
|
|
CPointList bp;
|
|
|
dfPoint point;
|
|
|
point.x0 = m_XMin;
|
|
|
point.y0 = m_YMin;
|
|
|
bp.AddTail(point);
|
|
|
|
|
|
point.x0 = m_XMin;
|
|
|
point.y0 = m_YMax;
|
|
|
bp.AddTail(point);
|
|
|
|
|
|
point.x0 = m_XMax;
|
|
|
point.y0 = m_YMax;
|
|
|
bp.AddTail(point);
|
|
|
|
|
|
point.x0 = m_XMax;
|
|
|
point.y0 = m_YMin;
|
|
|
bp.AddTail(point);
|
|
|
|
|
|
point.x0 = m_XMin;
|
|
|
point.y0 = m_YMin;
|
|
|
bp.AddTail(point);
|
|
|
|
|
|
pCurveBorder->SetPoints(bp, 2);
|
|
|
pXyBorder->AddElement(pCurveBorder, DOUBLEFOX_CURVE);
|
|
|
}
|
|
|
ptO.x = m_XMin;
|
|
|
ptO.y = m_YMin;
|
|
|
// 散点归整
|
|
|
for (int i = 0; i < len; i++)
|
|
|
{
|
|
|
pPts->at(i).x = ConvertX2Int(pPts->at(i).x, ptO);
|
|
|
pPts->at(i).y = ConvertY2Int(pPts->at(i).y, ptO);
|
|
|
}
|
|
|
// 归整断层
|
|
|
Paths64 faultages;
|
|
|
if (pXyFaults != nullptr) {
|
|
|
COne* pOne;
|
|
|
CPtrList* pl = pXyFaults->GetValueList();
|
|
|
POSITION pos = pl->GetHeadPosition();
|
|
|
while (pos)
|
|
|
{
|
|
|
pOne = pXyFaults->GetAt(pos);
|
|
|
if (pOne->GetType() == DOUBLEFOX_CURVE) {
|
|
|
CCurveEx* pCurve = (CCurveEx*)(pOne->GetValue());
|
|
|
Path64 path;
|
|
|
for (int i = 0; i < pCurve->num; i++) {
|
|
|
int64_t x = ConvertX2Int(pCurve->x[i], ptO);
|
|
|
int64_t y = ConvertY2Int(pCurve->y[i], ptO);
|
|
|
path.push_back(Point64(x, y));
|
|
|
}
|
|
|
faultages.push_back(path);
|
|
|
}
|
|
|
pl->GetNext(pos);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 计算步长、网格数
|
|
|
//int nInsertCount = pow(2, insertTimes); // 插入网格个数
|
|
|
this->m_XCount = XCount;
|
|
|
this->m_dX = (m_XMax - m_XMin) / (this->m_XCount);
|
|
|
//double dDxInsert = this->m_dX / nInsertCount;
|
|
|
//int nXCountInsert = (m_XMax - m_XMin) / dDxInsert;
|
|
|
|
|
|
this->m_dY = this->m_dX;
|
|
|
//double dDyInsert = dDxInsert;
|
|
|
|
|
|
this->m_YCount = (m_YMax - m_YMin) / this->m_dY;
|
|
|
if (this->m_YCount*this->m_dY < m_YMax - m_YMin)
|
|
|
{
|
|
|
//this->m_YCount++;
|
|
|
}
|
|
|
this->m_XCount = (this->m_XCount + 1);
|
|
|
this->m_YCount = (this->m_YCount + 1);
|
|
|
|
|
|
// 构造网格
|
|
|
CXy* pXy = new CXy;
|
|
|
CMesh* pMeshNew = new CMesh();
|
|
|
CLayer* pLayer = pXy->FindAddLayer("背景");
|
|
|
|
|
|
POSITION posNew = pXy->AddElement(pMeshNew, DOUBLEFOX_MESH);
|
|
|
pXy->SetElementLayer(posNew, pLayer);
|
|
|
|
|
|
CDimension2D* pDfg = new CDimension2D;
|
|
|
pDfg->Create(this->m_XCount, this->m_YCount, m_XMin, m_YMin, this->m_dX, this->m_dY);
|
|
|
|
|
|
//double valueNull = -1E301;
|
|
|
double dStepHalf = this->m_dX*0.5;
|
|
|
|
|
|
double dArea = 1;
|
|
|
if (pCurveBorder != nullptr&&pCurveBorder->num >= 3)
|
|
|
{
|
|
|
dArea = pCurveBorder->Area();
|
|
|
}
|
|
|
else {
|
|
|
dArea = abs((m_XMax - m_XMin)*(m_YMax - m_YMin));
|
|
|
}
|
|
|
|
|
|
IDWCalculation idw;
|
|
|
idw.SetArea(dArea);
|
|
|
idw.SetSortedData(pPts);
|
|
|
//idw.SetFaultages(&faultages); // 设置断层
|
|
|
double dSearchR = idw.TestR(ConvertX2Int((m_XMax + m_XMin) / 2.0, ptO), ConvertY2Int((m_YMax + m_YMin) / 2, ptO));
|
|
|
|
|
|
//DWORD start_time = GetTickCount64();
|
|
|
|
|
|
int nYCount = this->m_YCount;
|
|
|
StepProgress::stepCount = this->m_XCount;
|
|
|
StepProgress::progress = 0;
|
|
|
SetTimer(NULL, 0, 50, (TIMERPROC)CIDWCreator::TimerProc);
|
|
|
double valueNull = -1E301;
|
|
|
Path64 pathBorder;
|
|
|
int nCount = pCurveBorder->num;
|
|
|
for (int i = 0; i < nCount; i++)
|
|
|
{
|
|
|
pathBorder.push_back(Point64(
|
|
|
ConvertX2Int(pCurveBorder->x[i], ptO)
|
|
|
, ConvertY2Int(pCurveBorder->y[i], ptO)));
|
|
|
}
|
|
|
DPoint3 ptOO = ptO;
|
|
|
CIntersectionUtil m_IntersectHelp;
|
|
|
if (faultages.size() > 0)
|
|
|
{
|
|
|
m_IntersectHelp.SetSourceLines(&faultages);
|
|
|
}
|
|
|
parallel_for(0, this->m_XCount, [&pDfg, pathBorder, faultages,
|
|
|
&m_IntersectHelp, dStepHalf, &ptOO, dArea, pPts, dSearchR, nYCount, valueNull](int i)
|
|
|
//for (int i = 0; i < this->m_XCount; i++)
|
|
|
{
|
|
|
// 反距离加权算法
|
|
|
IDWCalculation idw;
|
|
|
idw.SetArea(dArea);
|
|
|
idw.SetSortedData(pPts);
|
|
|
idw.SetSearchR(dSearchR);
|
|
|
if (faultages.size() > 0)
|
|
|
{
|
|
|
idw.SetFaultageHelp(&m_IntersectHelp); // 设置断层
|
|
|
}
|
|
|
|
|
|
double x = ConvertX2Int(pDfg->x(i), ptOO);// +dStepHalf;
|
|
|
for (int j = 0; j < nYCount; j++)
|
|
|
{
|
|
|
double z;
|
|
|
double y = ConvertY2Int(pDfg->y(j), ptOO);// +dStepHalf;
|
|
|
Point64 pt(x, y);
|
|
|
|
|
|
//if (!IsPointInPolygon(x, y, pCurveBorder))
|
|
|
if (Clipper2Lib::PointInPolygon(pt, pathBorder) == PointInPolygonResult::IsOutside)
|
|
|
{
|
|
|
pDfg->SetValue(i, j, valueNull);
|
|
|
continue;
|
|
|
}
|
|
|
z = idw.GetValue(x, y);
|
|
|
pDfg->SetValue(i, j, z);
|
|
|
//TRACE("i:%d, j:%d, %lf\r\n", i, j, z);
|
|
|
}
|
|
|
|
|
|
StepProgress::progress++;
|
|
|
//if (StepProgress::DoProgress != nullptr) {
|
|
|
// int nProg = (int)(((double)StepProgress::progress / StepProgress::stepCount)*100.0);
|
|
|
// if (nProg != StepProgress::lastProgress)
|
|
|
// {
|
|
|
// StepProgress::lastProgress = nProg;
|
|
|
// StepProgress::DoProgress(_T("网格化"), nProg);
|
|
|
// }
|
|
|
//}
|
|
|
MSG msg;
|
|
|
if (PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_REMOVE))
|
|
|
// if (GetMessage(&msg, NULL, 0, 0))
|
|
|
{
|
|
|
TranslateMessage(&msg);
|
|
|
DispatchMessage(&msg);
|
|
|
}
|
|
|
}
|
|
|
);//
|
|
|
pDfg->range[0] = dZMin;
|
|
|
pDfg->range[1] = dZMax;
|
|
|
StepProgress::progress = StepProgress::stepCount;
|
|
|
|
|
|
// 进行光滑
|
|
|
int nSmoothTimes = 1; // 光滑次数,最小是3
|
|
|
if (smoothTimes > nSmoothTimes) {
|
|
|
nSmoothTimes = smoothTimes;
|
|
|
}
|
|
|
double nSmoothCoe = smoothFactor; // 光滑系数
|
|
|
for (int i = 0; i < nSmoothTimes; i++)
|
|
|
{
|
|
|
SmoothMesh(pDfg, &m_IntersectHelp, nSmoothCoe);
|
|
|
//pDfg->Smooth(nSmoothCoe);
|
|
|
}
|
|
|
|
|
|
//DWORD end_time = GetTickCount64();
|
|
|
//CString strMsg;
|
|
|
//strMsg.Format("Time:%ld\t\n", end_time - start_time);
|
|
|
//TRACE(strMsg);
|
|
|
//::AfxMessageBox(strMsg);
|
|
|
|
|
|
//pDfg->range[0] = dZMin;
|
|
|
//pDfg->range[1] = dZMax;
|
|
|
|
|
|
//pDfg->GetRange();
|
|
|
|
|
|
pMeshNew->SetMesh(pDfg, MESH_DFG, FALSE);
|
|
|
pMeshNew->m_nTimes = insertTimes;// pow(2, insertTimes);
|
|
|
|
|
|
// 生成等值线
|
|
|
if (abs(contourStep) > 1E-5) {
|
|
|
CString strLayerMark = _T("Layer:\\等值线\\标注");
|
|
|
CString strLayerOther = _T("Layer:\\等值线\\无标注");
|
|
|
|
|
|
CString curLayerName = pXy->GetCurrentLayer()->GetPathName();
|
|
|
CLayer* pMarkLayer = pXy->FindLayer(strLayerMark);
|
|
|
CLayer* pOtherLayer = pXy->FindLayer(strLayerOther);
|
|
|
|
|
|
if (pMarkLayer == NULL)
|
|
|
{
|
|
|
pMarkLayer = pXy->FindAddLayer(strLayerMark);
|
|
|
|
|
|
pMarkLayer->HowToViewCurve = new CHowToViewCurve();
|
|
|
pMarkLayer->HowToViewCurve->EnableDrawSourceCurve(FALSE);
|
|
|
CCurveInName* pInName = new CCurveInName();
|
|
|
CRect8 rect = pMeshNew->GetRect();
|
|
|
pInName->text_h = rect.Width() / 300;
|
|
|
pInName->m_size.cx = pInName->text_h*0.06;
|
|
|
pInName->color = RGB(0, 0, 0);
|
|
|
pMarkLayer->HowToViewCurve->Add(pInName);
|
|
|
}
|
|
|
if (pOtherLayer == NULL)
|
|
|
{
|
|
|
pOtherLayer = pXy->FindAddLayer(strLayerOther);
|
|
|
|
|
|
pOtherLayer->HowToViewCurve = new CHowToViewCurve();
|
|
|
pOtherLayer->HowToViewCurve->EnableDrawSourceCurve(FALSE);
|
|
|
CCurveProperties* pview = new CCurveProperties();
|
|
|
pview->color = RGB(0, 0, 0);
|
|
|
pOtherLayer->HowToViewCurve->Add(pview);
|
|
|
}
|
|
|
|
|
|
// 设置断层
|
|
|
pDfg->CDimensionBase::EmptyLink();//清空已有的断层信息
|
|
|
// 等值线生成设置断层
|
|
|
COne* pOne;
|
|
|
CPtrList* pl = pXyFaults->GetValueList();
|
|
|
POSITION pos = pl->GetHeadPosition();
|
|
|
CLayer* pLayerFault = pXy->FindAddLayer("断层");
|
|
|
while (pos)
|
|
|
{
|
|
|
pOne = pXyFaults->GetAt(pos);
|
|
|
if (pOne->GetType() == DOUBLEFOX_CURVE) {
|
|
|
CCurveEx* pCurveFault = (CCurveEx*)(pOne->GetValue());
|
|
|
CCurveEx* pCurveNew = new CCurveEx;
|
|
|
(*pCurveNew) = (*pCurveFault);
|
|
|
POSITION posNew = pXy->AddElement(pCurveNew, DOUBLEFOX_CURVE);
|
|
|
pXy->SetElementLayer(posNew, pLayerFault);
|
|
|
pDfg->Faultage(*(CCurve*)pCurveNew);
|
|
|
}
|
|
|
pl->GetNext(pos);
|
|
|
}
|
|
|
|
|
|
//CCurveEx* pCurve;
|
|
|
//COne* pOne;
|
|
|
//CPositionList select;
|
|
|
//if (pXy->GetElement("断层", select, FALSE) > 0)
|
|
|
//{
|
|
|
// POSITION pt;
|
|
|
// POSITION pos = select.GetHeadPosition();
|
|
|
// while (pos)
|
|
|
// {
|
|
|
// pt = select.GetNext(pos);
|
|
|
// pOne = pXy->GetAt(pt);
|
|
|
// if (pOne->GetType() != DOUBLEFOX_CURVE) continue;
|
|
|
// pCurve = (CCurveEx*)pOne->GetValue();
|
|
|
// pDfg->Faultage(*(CCurve*)pCurve);
|
|
|
// }
|
|
|
//}
|
|
|
|
|
|
|
|
|
// 恢复网格坐标
|
|
|
//pDfg->P0[0] = ConvertX2D(pDfg->P0[0], ptO);
|
|
|
//pDfg->P0[1] = ConvertY2D(pDfg->P0[1], ptO);
|
|
|
|
|
|
//m_XMin = ConvertX2D(m_XMin, ptO);
|
|
|
//m_YMin = ConvertY2D(m_YMin, ptO);
|
|
|
//m_XMax = ConvertX2D(m_XMax, ptO);
|
|
|
//m_YMax = ConvertY2D(m_YMax, ptO);
|
|
|
|
|
|
//this->m_dX = (m_XMax - m_XMin) / (this->m_XCount);
|
|
|
//this->m_dY = this->m_dX;
|
|
|
|
|
|
//pDfg->delt[0]= pDfg->delt[0]/100.0;
|
|
|
//pDfg->delt[1] = pDfg->delt[1]/100.0;
|
|
|
|
|
|
// 生成新等值线
|
|
|
vector<CCurve*>* pCurves = new std::vector<CCurve *>();
|
|
|
vector<CString*>* pLayers = new std::vector<CString *>();
|
|
|
|
|
|
pMeshNew->ContourCreate(pCurves, pLayers, contourStep, contourMarkStep,
|
|
|
strLayerMark, strLayerOther, dZMin, dZMax);
|
|
|
//// 恢复等值线坐标
|
|
|
//for (size_t i = 0; i < pCurves->size(); i++)
|
|
|
//{
|
|
|
// CCurve* pCurve = pCurves->at(i);
|
|
|
// if (pCurve == NULL) continue;
|
|
|
// for (int j = 0; j < pCurve->num; j++) {
|
|
|
// pCurve->x[j] = ConvertX2D(pCurve->x[j], ptO);
|
|
|
// pCurve->y[j] = ConvertY2D(pCurve->y[j], ptO);
|
|
|
// }
|
|
|
//}
|
|
|
|
|
|
AddContourCurve(pXy, pCurves, pLayers);
|
|
|
vector<CCurve *>::iterator it = pCurves->begin();
|
|
|
while (it != pCurves->end())
|
|
|
{
|
|
|
delete *it;
|
|
|
it = pCurves->erase(it);
|
|
|
}
|
|
|
vector<CString *>::iterator itL = pLayers->begin();
|
|
|
while (itL != pLayers->end())
|
|
|
{
|
|
|
delete *itL;
|
|
|
itL = pLayers->erase(itL);
|
|
|
}
|
|
|
delete pCurves;
|
|
|
delete pLayers;
|
|
|
}
|
|
|
// 等值线生成结束
|
|
|
pMeshNew->EnableUpdateRuler(TRUE);
|
|
|
pMeshNew->UpdateColorRuler();
|
|
|
pXy->SaveAsWithExtension(resultFile);
|
|
|
|
|
|
//MSG msg;
|
|
|
//BOOL bRet;
|
|
|
//clock_t start = clock();
|
|
|
//while(TRUE)
|
|
|
//{
|
|
|
// if (PeekMessage(&msg, NULL, WM_TIMER, WM_TIMER, PM_REMOVE) == TRUE)
|
|
|
// {
|
|
|
// TranslateMessage(&msg);
|
|
|
// DispatchMessage(&msg);
|
|
|
// break;
|
|
|
// }
|
|
|
// clock_t finish = clock();
|
|
|
// if ((double)(finish - start) / CLK_TCK> 0.1)
|
|
|
// {
|
|
|
// break;
|
|
|
// }
|
|
|
//}
|
|
|
|
|
|
delete pPts;
|
|
|
pXyFaults->Clear();
|
|
|
delete pXyFaults;
|
|
|
delete pXyBorder;
|
|
|
delete pXy;
|
|
|
}
|
|
|
inline bool isPointFaultage(double ptX, double ptY, double otherX, double otherY, Paths64* faultages) {
|
|
|
Path64 lineSub;
|
|
|
lineSub.push_back(Point64(ptX, ptY));
|
|
|
lineSub.push_back(Point64(otherX, otherY));
|
|
|
|
|
|
Paths64 clip, solutionClosed, solutionOpen;
|
|
|
clip.push_back(lineSub);
|
|
|
|
|
|
Clipper64 clipperD;
|
|
|
clipperD.AddOpenSubject(clip);
|
|
|
clipperD.AddClip(*faultages);
|
|
|
clipperD.Execute(ClipType::Intersection, FillRule::NonZero, solutionClosed, solutionOpen);
|
|
|
if (solutionOpen.size() > 0) {
|
|
|
clipperD.Clear();
|
|
|
return true;
|
|
|
}
|
|
|
clipperD.Clear();
|
|
|
return false;
|
|
|
}
|
|
|
void CIDWCreator::SmoothMesh(CGrid* pGrid, CIntersectionUtil* intersectHelp, double smoothFactor /*= 1*/) {
|
|
|
if (smoothFactor < 1e-10) {
|
|
|
return;
|
|
|
}
|
|
|
int numx = pGrid->xnum();
|
|
|
int numy = pGrid->ynum();
|
|
|
double dZMin = pGrid->range[0] - 0.001;
|
|
|
double dZMax = pGrid->range[1] + 0.001;
|
|
|
|
|
|
DPoint3 ptOO = ptO;
|
|
|
|
|
|
//double dValueCur = 0, dValueTmp = 0;
|
|
|
|
|
|
//parallel_for(1, numx - 1, [&pGrid, intersectHelp, smoothFactor, &ptOO, dZMin, dZMax, numy](int i)
|
|
|
for (int i = 1; i < numx - 1; i++)
|
|
|
{
|
|
|
double dSigma = 0;
|
|
|
double dPtX = 0, dPtY = 0, dOtherX = 0, dOtherY = 0;
|
|
|
for (int j = 1; j < numy - 1; j++) {
|
|
|
double dValueCur = pGrid->Value(i, j);
|
|
|
if (dValueCur< dZMin || dValueCur>dZMax) {
|
|
|
continue;
|
|
|
}
|
|
|
dPtX = ConvertX2Int(pGrid->x(i), ptOO);
|
|
|
dPtY = ConvertY2Int(pGrid->y(j), ptOO);
|
|
|
dSigma = 0;
|
|
|
int nCount = 0;
|
|
|
double dValueTmp = pGrid->Value(i - 1, j - 1);
|
|
|
if (dValueTmp >= dZMin && dValueTmp <= dZMax) {
|
|
|
if (!intersectHelp->Intersects(LineSegment(Point64(dPtX, dPtY)
|
|
|
, Point64(ConvertX2Int(pGrid->x(i - 1), ptOO), ConvertY2Int(pGrid->y(j - 1), ptOO)))))
|
|
|
{
|
|
|
dSigma += dValueTmp;
|
|
|
nCount++;
|
|
|
}
|
|
|
}
|
|
|
dValueTmp = pGrid->Value(i, j - 1);
|
|
|
if (dValueTmp >= dZMin && dValueTmp <= dZMax) {
|
|
|
//if (!isPointFaultage(dPtX, dPtY, pGrid->x(i), pGrid->y(j - 1), &faultages))
|
|
|
if (!intersectHelp->Intersects(LineSegment(Point64(dPtX, dPtY)
|
|
|
, Point64(ConvertX2Int(pGrid->x(i), ptOO), ConvertY2Int(pGrid->y(j - 1), ptOO)))))
|
|
|
{
|
|
|
dSigma += dValueTmp;
|
|
|
nCount++;
|
|
|
}
|
|
|
}
|
|
|
dValueTmp = pGrid->Value(i + 1, j - 1);
|
|
|
if (dValueTmp >= dZMin && dValueTmp <= dZMax) {
|
|
|
//if (!isPointFaultage(dPtX, dPtY, pGrid->x(i + 1), pGrid->y(j - 1), &faultages))
|
|
|
if (!intersectHelp->Intersects(LineSegment(Point64(dPtX, dPtY)
|
|
|
, Point64(ConvertX2Int(pGrid->x(i + 1), ptOO), ConvertY2Int(pGrid->y(j - 1), ptOO)))))
|
|
|
{
|
|
|
dSigma += dValueTmp;
|
|
|
nCount++;
|
|
|
}
|
|
|
}
|
|
|
dValueTmp = pGrid->Value(i - 1, j);
|
|
|
if (dValueTmp >= dZMin && dValueTmp <= dZMax) {
|
|
|
//if (!isPointFaultage(dPtX, dPtY, pGrid->x(i - 1), pGrid->y(j), &faultages))
|
|
|
if (!intersectHelp->Intersects(LineSegment(Point64(dPtX, dPtY)
|
|
|
, Point64(ConvertX2Int(pGrid->x(i - 1), ptOO), ConvertY2Int(pGrid->y(j), ptOO)))))
|
|
|
{
|
|
|
dSigma += dValueTmp;
|
|
|
nCount++;
|
|
|
}
|
|
|
}
|
|
|
dValueTmp = pGrid->Value(i + 1, j);
|
|
|
if (dValueTmp >= dZMin && dValueTmp <= dZMax) {
|
|
|
//if (!isPointFaultage(dPtX, dPtY, pGrid->x(i + 1), pGrid->y(j), &faultages))
|
|
|
if (!intersectHelp->Intersects(LineSegment(Point64(dPtX, dPtY)
|
|
|
, Point64(ConvertX2Int(pGrid->x(i + 1), ptOO), ConvertY2Int(pGrid->y(j), ptOO)))))
|
|
|
{
|
|
|
dSigma += dValueTmp;
|
|
|
nCount++;
|
|
|
}
|
|
|
}
|
|
|
dValueTmp = pGrid->Value(i - 1, j + 1);
|
|
|
if (dValueTmp >= dZMin && dValueTmp <= dZMax) {
|
|
|
// if (!isPointFaultage(dPtX, dPtY, pGrid->x(i - 1), pGrid->y(j + 1), &faultages))
|
|
|
if (!intersectHelp->Intersects(LineSegment(Point64(dPtX, dPtY)
|
|
|
, Point64(ConvertX2Int(pGrid->x(i - 1), ptOO), ConvertY2Int(pGrid->y(j + 1), ptOO)))))
|
|
|
{
|
|
|
dSigma += dValueTmp;
|
|
|
nCount++;
|
|
|
}
|
|
|
}
|
|
|
dValueTmp = pGrid->Value(i, j + 1);
|
|
|
if (dValueTmp >= dZMin && dValueTmp <= dZMax) {
|
|
|
// if (!isPointFaultage(dPtX, dPtY, pGrid->x(i), pGrid->y(j + 1), &faultages))
|
|
|
if (!intersectHelp->Intersects(LineSegment(Point64(dPtX, dPtY)
|
|
|
, Point64(ConvertX2Int(pGrid->x(i), ptOO), ConvertY2Int(pGrid->y(j + 1), ptOO)))))
|
|
|
{
|
|
|
dSigma += dValueTmp;
|
|
|
nCount++;
|
|
|
}
|
|
|
}
|
|
|
dValueTmp = pGrid->Value(i + 1, j + 1);
|
|
|
if (dValueTmp >= dZMin && dValueTmp <= dZMax) {
|
|
|
//if (!isPointFaultage(dPtX, dPtY, pGrid->x(i + 1), pGrid->y(j + 1), &faultages))
|
|
|
if (!intersectHelp->Intersects(LineSegment(Point64(dPtX, dPtY)
|
|
|
, Point64(ConvertX2Int(pGrid->x(i + 1), ptOO), ConvertY2Int(pGrid->y(j + 1), ptOO)))))
|
|
|
{
|
|
|
dSigma += dValueTmp;
|
|
|
nCount++;
|
|
|
}
|
|
|
}
|
|
|
if (nCount == 0) {
|
|
|
return;
|
|
|
}
|
|
|
double dAverage = dSigma / nCount;
|
|
|
double dValueNew = (dValueCur + dAverage * smoothFactor) / (1.0 + smoothFactor);
|
|
|
pGrid->SetValue(i, j, dValueNew);
|
|
|
//TRACE("i:%d, j:%d, %lf\r\n", i, j, dValueNew);
|
|
|
}
|
|
|
}
|
|
|
//);
|
|
|
}
|
|
|
double precision = 1e-10;
|
|
|
bool CIDWCreator::IsPointInPolygon(double ptX, double ptY, CCurve* pCurve)
|
|
|
{
|
|
|
bool isIn = false;
|
|
|
int nCount = pCurve->num;
|
|
|
double dX1 = 0, dX2 = 0, dY1 = 0, dY2 = 0;
|
|
|
for (int i = 0; i < nCount - 1; i++)
|
|
|
{
|
|
|
dX1 = pCurve->x[i];
|
|
|
dY1 = pCurve->y[i];
|
|
|
dX2 = pCurve->x[i + 1];
|
|
|
dY2 = pCurve->y[i + 1];
|
|
|
// 判断点是否与多边形顶点重合
|
|
|
if ((abs(dX1 - ptX) < precision && abs(dY1 - ptY) < precision)
|
|
|
|| (abs(dX2 - ptX) < precision && abs(dY2 - ptY) < precision))
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
// 判断点是否在水平直线上
|
|
|
if (abs(dY1 - dY2) < precision)
|
|
|
{
|
|
|
if (ptX >= min(dX1, dX2) - precision && ptX <= max(dX1, dX2) + precision)
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
// 判断线段两端点是否在射线两侧
|
|
|
if ((ptY >= dY1 - precision && ptY < dY2 + precision)
|
|
|
|| (ptY < dY1 + precision && ptY >= dY2 - precision))
|
|
|
{
|
|
|
// 斜率
|
|
|
double dK = (dX2 - dX1) / (dY2 - dY1);
|
|
|
// 相交点的x坐标
|
|
|
double dX = dX1 + dK * (ptY - dY1);
|
|
|
|
|
|
// 浮点类型计算容差
|
|
|
if (abs(dX - ptX) < 1e-10) {
|
|
|
return true;
|
|
|
}
|
|
|
// 射线平行于x轴,穿过多边形的边
|
|
|
if (dX > ptX) {
|
|
|
isIn = !isIn;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return isIn;
|
|
|
}
|
|
|
void CALLBACK CIDWCreator::TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
|
|
|
{
|
|
|
int nProg = (int)(((double)StepProgress::progress / StepProgress::stepCount)*100.0);
|
|
|
|
|
|
if (StepProgress::DoProgress != nullptr) {
|
|
|
if (nProg != StepProgress::lastProgress)
|
|
|
{
|
|
|
StepProgress::lastProgress = nProg;
|
|
|
StepProgress::DoProgress(_T("网格化"), nProg);
|
|
|
}
|
|
|
}
|
|
|
StepProgress::lastProgress = nProg;
|
|
|
if (nProg == 100) {
|
|
|
KillTimer(nullptr, idEvent);
|
|
|
//::AfxMessageBox("Killed");
|
|
|
StepProgress::lastProgress = 0;
|
|
|
}
|
|
|
}
|
|
|
// 加密
|
|
|
//{
|
|
|
//CDimension2D* pDfgInsert = new CDimension2D;
|
|
|
//pDfgInsert->Create(nXCountInsert, nYCountInsert, m_XMin, m_YMin, dDxInsert, dDyInsert);
|
|
|
//for (int i = 0; i < nXCountInsert; i++)
|
|
|
//{
|
|
|
// for (int j = 0; j < nYCountInsert; j++) {
|
|
|
// pDfgInsert->SetValue(i, j, valueNull);
|
|
|
// }
|
|
|
//}
|
|
|
//int nL, nR, nB, nT;
|
|
|
//double dF11, dF21, dF12, dF22;
|
|
|
//BOOL bz1, bz2, bz3, bz4;
|
|
|
//double zmin, zmax;
|
|
|
//for (long j = 0; j < m_YCount - 1; ++j)
|
|
|
//{
|
|
|
// for (long i = 0; i < m_XCount - 1; ++i)
|
|
|
// {
|
|
|
// dF11 = pDfg->Value(i, j);
|
|
|
// dF12 = pDfg->Value(i, j + 1);
|
|
|
// dF22 = pDfg->Value(i + 1, j + 1);
|
|
|
// dF21 = pDfg->Value(i + 1, j);
|
|
|
//
|
|
|
// for (int m = 0; m < nInsertCount; ++m)
|
|
|
// for (int n = 0; n < nInsertCount; ++n)
|
|
|
// {
|
|
|
// double dF = (dF11*(nInsertCount - m)*n +
|
|
|
// dF12 * (nInsertCount - m)*(nInsertCount - n) +
|
|
|
// dF22 * m*(nInsertCount - n) +
|
|
|
// dF21 * m*n) / nInsertCount / nInsertCount;
|
|
|
// pDfgInsert->SetValue(i*nInsertCount + m, j*nInsertCount + n, dF);
|
|
|
// }
|
|
|
// }
|
|
|
//}
|
|
|
//for (int i = 0; i < this->m_XCount; i++)
|
|
|
//{
|
|
|
// for (int j = 0; j < m_YCount; j++)
|
|
|
// {
|
|
|
// double dZCenter = pDfg->Value(i*nInsertCount, j*nInsertCount);
|
|
|
// //TRACE("dZCenter: %ld,%ld,%lf\r\n", i*nInsertCount, j*nInsertCount, z);
|
|
|
// if (i == 0) {
|
|
|
// nL = i;
|
|
|
// }
|
|
|
// else {
|
|
|
// nL = i - 1;
|
|
|
// }
|
|
|
// if (i == m_XCount - 1) {
|
|
|
// nR = m_XCount - 1;
|
|
|
// }
|
|
|
// else {
|
|
|
// nR = i + 1;
|
|
|
// }
|
|
|
// if (j == 0) {
|
|
|
// nB = j;
|
|
|
// }
|
|
|
// else {
|
|
|
// nB = j - 1;
|
|
|
// }
|
|
|
// if (j == m_YCount - 1) {
|
|
|
// nT = m_YCount - 1;
|
|
|
// }
|
|
|
// else {
|
|
|
// nT = j + 1;
|
|
|
// }
|
|
|
// double dF11 = pDfg->Value(nL, nB); // 左下
|
|
|
// double dF21 = pDfg->Value(nR, nB); // 右下
|
|
|
// double dF12 = pDfg->Value(nL, nT); // 左上
|
|
|
// double dF22 = pDfg->Value(nR, nT); // 右上
|
|
|
// //TRACE("%ld,%ld,%ld,%ld %lf,%lf,%lf,%lf\r\n", nL, nB, nR, nT, dF11, dF21, dF12, dF22);
|
|
|
// for (int m = 0; m < nInsertCount; m++)
|
|
|
// {
|
|
|
// for (int n = 0; n < nInsertCount; n++)
|
|
|
// {
|
|
|
// double dX = m + 0.5;
|
|
|
// double dY = n + 0.5;
|
|
|
// double dF = (dF11 * (nInsertCount - dX)*(nInsertCount - dY)
|
|
|
// + dF21 * (dX)*(nInsertCount - dY)
|
|
|
// + dF12 * (nInsertCount - dX)*(dY)
|
|
|
// +dF22 * dX*dY) / (nInsertCount * nInsertCount);
|
|
|
|
|
|
// pDfgInsert->SetValue(i*nInsertCount + m, j*nInsertCount + n, dF);
|
|
|
|
|
|
// //TRACE("%ld,%ld,%lf\r\n", i*nInsertCount + m, j*nInsertCount + n, dF);
|
|
|
// }
|
|
|
// }
|
|
|
// }
|
|
|
//}
|
|
|
//}
|
|
|
void CIDWCreator::AddContourCurve(CXy* pXy, vector<CCurve*>* curves, vector<CString*>* layer)
|
|
|
{
|
|
|
for (size_t i = 0; i < curves->size(); i++)
|
|
|
{
|
|
|
CCurve* pCurve = curves->at(i);
|
|
|
if (pCurve == NULL) continue;
|
|
|
|
|
|
CString* pName = layer->at(i);
|
|
|
|
|
|
CCurveEx *ce = new CCurveEx(pCurve->num);
|
|
|
for (int i = 0; i < ce->num; i++)
|
|
|
{
|
|
|
ce->x[i] = pCurve->x[i];
|
|
|
ce->y[i] = pCurve->y[i];
|
|
|
ce->z[i] = pCurve->z[i];
|
|
|
}
|
|
|
ce->nPoint = pCurve->nPoint;
|
|
|
ce->GetLocation();
|
|
|
POSITION pos = NULL;
|
|
|
if (pCurve->name)
|
|
|
ce->SetName(pCurve->name);
|
|
|
|
|
|
pos = pXy->AddElement(ce, DOUBLEFOX_CURVE);
|
|
|
pXy->SetElementLayer(pos, *pName);
|
|
|
}
|
|
|
}
|
|
|
bool CIDWCreator::Calculate()
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
void CIDWCreator::ReadInToMatrix(string FilePath, vector<array<double, 3>>& data)
|
|
|
{
|
|
|
ifstream in;
|
|
|
in.open(FilePath, ios::in);//打开一个file
|
|
|
if (!in.is_open()) {
|
|
|
//cout << "Can not find " << FilePath << endl;
|
|
|
system("pause");
|
|
|
}
|
|
|
int nDim = 3;
|
|
|
// 以‘,’为分隔符拆分字符串
|
|
|
char seps[] = " ,\t\n";
|
|
|
string buff;
|
|
|
while (getline(in, buff)) {
|
|
|
array<double, 3> nums = { 0 };
|
|
|
// string->char *
|
|
|
char *s_input = (char *)buff.c_str();
|
|
|
char *token = strtok(s_input, seps);
|
|
|
double a;
|
|
|
int i = 0;//行数i
|
|
|
while (token != NULL) {
|
|
|
a = atof(token);
|
|
|
nums[i] = a;
|
|
|
i++;
|
|
|
if (i > 2) break;
|
|
|
token = strtok(NULL, seps);
|
|
|
} // end while
|
|
|
// 数据行不符合要求
|
|
|
if (i < 3) continue;
|
|
|
data.push_back(nums);
|
|
|
}//end while
|
|
|
in.close();
|
|
|
//cout << "get data" << endl;
|
|
|
}
|
|
|
bool CIDWCreator::OpenFile(LPCTSTR lpszFileName, CXy* pXy)
|
|
|
{
|
|
|
if (pXy->ReadOtherWithExtension(lpszFileName))
|
|
|
{
|
|
|
return true;
|
|
|
}
|
|
|
CFile file;
|
|
|
if (file.Open(lpszFileName, CFile::modeRead))
|
|
|
{
|
|
|
// m_FileName = lpszFileName;
|
|
|
CArchive ar(&file, CArchive::load);
|
|
|
Serialize(ar, pXy);
|
|
|
ar.Close();
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
|
file.Close();
|
|
|
return true;
|
|
|
}
|
|
|
void CIDWCreator::Serialize(CArchive& ar, CXy* pXy)
|
|
|
{
|
|
|
if (ar.IsStoring()) {}
|
|
|
else
|
|
|
{
|
|
|
if (pXy == nullptr) pXy = new CXy;
|
|
|
pXy->m_bRealTimeDraw = false;
|
|
|
CString name = ar.GetFile()->GetFileName();
|
|
|
name.MakeLower();
|
|
|
CSplitPath sp(name);
|
|
|
|
|
|
CString ext = sp.GetExtension();
|
|
|
//ar.m_pDocument = this; // set back-pointer in archive
|
|
|
if (ext == _T(".dfb") ||
|
|
|
ext == _T(".dft"))
|
|
|
{
|
|
|
pXy->m_version = pXy->DFB_ReadVersion(ar);
|
|
|
pXy->DFB_ReadEncrypt(ar, pXy->m_version);
|
|
|
if (pXy->IsEncrypted()) {
|
|
|
}
|
|
|
pXy->DFB_Serialize(ar, pXy->m_version);
|
|
|
}
|
|
|
else if (ext == ".dml" || ext == ".xml")
|
|
|
pXy->DML_Read2(*(ar.GetFile()));
|
|
|
else if (ext == ".pcg")
|
|
|
pXy->PCG_Read2(*(ar.GetFile()));
|
|
|
else
|
|
|
pXy->DFD_Read2(*(ar.GetFile()));
|
|
|
}
|
|
|
}
|