#include "stdafx.h" #include "FaultStatisticsCreator.h" #include const double PI = 3.1415926535897932384626433832795028841971; CFaultStatisticsCreator::CFaultStatisticsCreator() { this->m_pillarStep = 20;//原来时100 有些无法计算断距 this->m_iCalcMethod = 0; this->m_bLocalFltDirect = true; m_clrMark = RGB(255, 255, 255); m_iMarkType = 0; m_strLayerMark = "文字"; } CFaultStatisticsCreator::~CFaultStatisticsCreator() { } bool CFaultStatisticsCreator::CalcFltInfo(GPline* pFlt, FltInfo& finfo) { return true; } bool CFaultStatisticsCreator::Execute() { GetCandidateFlts(); m_lstFltInfo.clear(); m_ampResults.clear(); GPline* pFlt = 0; GPline* pSvy = 0; GRect8 rtFlt, rtSvy; FAmplitudeInfo fminfo; ////begin test //gfw = fopen("f:/testsegs.dfd", "w"); ////end test #pragma omp parallel for private(finfo, pFlt) for (int j = 0; j < m_candidateFlts.size(); j++) { pFlt = m_candidateFlts[j]; FltInfo finfo; finfo.m_pFlt = pFlt; finfo.SetPosition(pFlt->GetPosition().c_str()); CalcAmplitudeWithStep(pFlt,&finfo.m_ampResults); if (finfo.GetParameters()) { #pragma omp critical { m_lstFltInfo.push_back(std::move(finfo)); } } } if (!WriteResult()) return false; return true; } bool CFaultStatisticsCreator::FltInfo::GetParameters(void) { if (m_ampResults.empty() || nullptr == m_pFlt ) return false; fltName = m_pFlt->GetName().c_str(); layerName.Format("Layer:\\%s",m_pFlt->GetLayer().c_str()); fltMode = "正断层"; fltLength = m_pFlt->GetLength(); if (m_pFlt->IsClosed(1e-6)) fltLength /= 2.0; double direct = m_pFlt->GetAverageDirection(); //-pi/2 -- pi/2 fltStrike = fabs(direct - PI/2); //断层走向 fltStrike = fltStrike*180.0 / PI; fltTendency = fltStrike + 90; //断层倾向 if (fltTendency > 180) fltTendency -= 180.0; list hdists; list vdists; for (int i = 0; i < m_ampResults.size(); i++) { hdists.push_back(m_ampResults[i].horizontal_dist); vdists.push_back(m_ampResults[i].amplitude); } hdists.sort(); vdists.sort(); MaxHDist = hdists.back(); //最大水平断距 AveHDist = std::accumulate(hdists.begin(),hdists.end(),0.0 )/hdists.size(); //平均水平断距 MaxVDist = vdists.back(); //最大垂直断距 AveVDist = std::accumulate(vdists.begin(), vdists.end(), 0.0)/vdists.size(); //平均垂直断距 dipAngle = atan2(AveVDist, AveHDist); dipAngle = fabs(dipAngle * 180 / PI ) ; return true; } void CFaultStatisticsCreator::FltInfo::WriteInfo(FILE * fw) { fprintf(fw, "%s,%s,%s,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f,%s\n", fltName, layerName, fltMode, fltLength, fltStrike, fltTendency, dipAngle, MaxHDist, AveHDist, MaxVDist, AveVDist , position); } void CFaultStatisticsCreator::FltInfo::SetPosition(const char * pos) { position.Format("%s", pos); } void CFaultStatisticsCreator::WriteLayers(FILE* fw) { switch (m_iMarkType) { case 0: m_strLayerMark = "文字\\垂直断距"; break; case 1: m_strLayerMark = "文字\\水平断距"; break; case 2: m_strLayerMark = "文字\\倾角"; break; default: break; } fprintf(fw, "Class Layer\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M %s\n", m_strLayerMark.GetBuffer() ); fprintf(fw, "Layer ViewAndEdit\n"); fprintf(fw, "\n"); fprintf(fw, "HowToViewPoint\n"); fprintf(fw, "Font 0 20 0 400 0 0 0 1 0 16 0 0 Times New Roman\n"); fprintf(fw, "Text %.4f %.4f 0.0000 0.0000 0.0000 2188\n", this->m_TextHeight, this->m_TextHeight * 0.4); fprintf(fw, "Color 0 %ld\n", this->m_clrMark); fprintf(fw, "Mark 0.0000 0.0000 0.0000\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M %s\n", m_strLayerMark.GetBuffer()); fprintf(fw, "Layer HowToViewPoint\n"); fprintf(fw, "HowToViewCurve\n"); fprintf(fw, "\n"); fprintf(fw, "HowToViewPoint\n"); fprintf(fw, "\n"); fprintf(fw, "State 10\n"); fprintf(fw, "Color 0\n"); //fprintf(fw, "Layer M %s\n", m_strLayerMark.GetBuffer()); // fprintf(fw, "3dPoint 21635025.888541, 5092018.981332, 0 45 P23 - 50 - 1 // fprintf(fw, "3dPoint 21634910.101707, 5091891.00641, 0 0 P23 - 50 - 2 // fprintf(fw, " // fprintf(fw, "Layer M 断层编号 } void CFaultStatisticsCreator::WriteTextPoints(FILE* fw) { double angle = 0; GPoint3D pt; float v = 0.0; m_lstFltInfo; list::iterator iter = m_lstFltInfo.begin(); for (; iter != m_lstFltInfo.end(); iter++) { vector* pAmpRst = &iter->m_ampResults; for (int i = 0; i < pAmpRst->size(); i++) { fprintf(fw, "Layer M %s\n", this->m_strLayerMark.GetBuffer()); //angle = m_ampResults[i].angle; //angle -= PI / 2.0; //angle = angle / PI * 180; //pt = m_pillarTexts[m_pillarPolygons[i]]; switch (m_iMarkType) { case 0: v = (*pAmpRst)[i].amplitude; break; case 1: v = (*pAmpRst)[i].horizontal_dist; break; case 2: if ((*pAmpRst)[i].horizontal_dist > 1e-6) { v = atan2((*pAmpRst)[i].amplitude, (*pAmpRst)[i].horizontal_dist); v = fabs(v * 180 / PI); } break; default: v = 0; break; } angle = 0; pt.x0 = (*pAmpRst)[i].x0; pt.y0 = (*pAmpRst)[i].y0; fprintf(fw, "3dPoint %.12g,%.12g,0 %.4g %.4g\n", pt.x0, pt.y0, angle, v); } } } //写出dfd bool CFaultStatisticsCreator::WriteDfd(void) { if (m_strOutDfd.GetLength() <= 0) { return true; } ::CopyFile(m_strInputDfd, m_strOutDfd, FALSE); FILE* fw = fopen(m_strOutDfd, "a+"); if (0 == fw) return false; WriteLayers(fw); WriteTextPoints(fw); ////begin test //for (int i = 0; i < m_pillarPolygons.size(); i++) // m_pillarPolygons[i]->Write(fw); ////end test fclose(fw); return true; } //写出csv bool CFaultStatisticsCreator::WriteCsv(void) { if (m_strOutCsv.IsEmpty()) { return true; } FILE* fw = fopen(m_strOutCsv.GetBuffer(), "w"); if (nullptr == fw) return false; fprintf(fw, "断层名称,断开层位,断层性质,延伸长度,断层走向(°),倾向(°),倾角(°),最大水平断距,平均水平断距,最大垂直断距,平均垂直断距,position\n"); list::iterator iter = m_lstFltInfo.begin(); for (; iter != m_lstFltInfo.end(); iter++) { iter->WriteInfo(fw); } fclose(fw); return true; } bool CFaultStatisticsCreator::WriteResult(void) { if (!WriteCsv()) return false; WriteDfd(); return true; } CFaultStatisticsCreator::FltInfo::FltInfo(void) { m_pFlt = nullptr; fltName = ""; layerName = ""; fltMode = ""; fltLength = 0.0; fltStrike= 0.0; //断层走向 fltTendency= 0.0; //断层倾向 dipAngle = 0.0; //倾角 MaxHDist= 0.0; //最大水平断距 AveHDist= 0.0; //平均水平断距 MaxVDist= 0.0; //最大垂直断距 AveVDist= 0.0; //平均垂直断距 position = ""; } CFaultStatisticsCreator::FltInfo::~FltInfo(void) { }