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.
314 lines
6.5 KiB
C++
314 lines
6.5 KiB
C++
#include "stdafx.h"
|
|
#include "FaultStatisticsCreator.h"
|
|
#include <numeric>
|
|
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<double> hdists;
|
|
list<double> 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<FltInfo>::iterator iter = m_lstFltInfo.begin();
|
|
for (; iter != m_lstFltInfo.end(); iter++)
|
|
{
|
|
vector<FAmplitudeInfo>* 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<FltInfo>::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)
|
|
{
|
|
}
|