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.
kev/Drawer/GVision/FaultStatisticsLib/FaultStatisticsCreator.cpp

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)
{
}