#include "stdafx.h" #include "FaultAmplitudeCreator.h" #include "../BaseLib/GDfdMap.h" #include "../BaseLib/GSurface.h" #include "../BaseLib/PublicFunctions.h" #include #include #include #include #include using namespace std; FAmplitudeInfo::FAmplitudeInfo() :fltName("") , surveyName("") , x0(0) , y0(0) ,xMid(0) ,yMid(0) , amplitude(0) , angle(0) , horizontal_dist(0.0) { } FAmplitudeInfo::~FAmplitudeInfo() { } CFaultAmplitudeCreator::CFaultAmplitudeCreator() :m_dfdMap(nullptr) , m_dfg(nullptr) , m_strOutDfd(_T("")) , m_strOutCsv(_T("")) , m_strFltLayer(_T("")) , m_strSurveyLayer(_T("")) , m_strFltNameFile(_T("")) , m_strFltNames(_T("")) , m_iCalcMethod(0) , m_pillarStep(10.0) // , m_thresholdValue(0) // , m_clrLow(RGB(0, 0, 255)) //小 , m_clrHigh(RGB(255, 0, 0)) //大 , m_PillarWidth(5) //柱 , m_PillarHeightRatio(1.0) , m_TextHeight(10) //文字高度 ,m_bLocalFltDirect(false) , m_bWithIncline(false) , m_inclineScale(10) , m_clrIncline(RGB(255, 0, 0)) { m_strLayerPillarHigh = "断距柱子\\高值"; m_strLayerPillarLow = "断距柱子\\低值"; m_strLayerPillarText = "断距柱子\\文字"; m_strLayerPillarIncline = "断裂倾角\\柱子"; m_strLayerTextIncline = "断裂倾角\\文字"; m_surveyAngle = PI; } CFaultAmplitudeCreator::~CFaultAmplitudeCreator() { Clear(); } void CFaultAmplitudeCreator::Clear(void) { if (m_dfdMap) delete m_dfdMap; if (m_dfg) delete m_dfg; m_dfdMap = nullptr; m_dfg = nullptr; m_strOutDfd = (_T("")); m_strOutCsv = (_T("")); m_strFltLayer = (_T("")); m_strSurveyLayer = (_T("")); m_strFltNameFile = (_T("")); m_tarFltNames.clear(); m_candidateFlts.clear(); m_ampResults.clear(); ErasePillarPgns(); m_strFltNames = (_T("")); } bool CFaultAmplitudeCreator::ReadDfdMap(const char* strFile) //读取dfd图件 { if (m_dfdMap) delete m_dfdMap; m_strInputDfd = strFile; m_dfdMap = new GDfdMap(); if (!m_dfdMap->ReadFile(strFile)) { delete m_dfdMap; m_dfdMap = nullptr; return false; } return true; } bool CFaultAmplitudeCreator::ReadDfg(const char* strDfg) //读取背景曲面 { if (m_dfg) delete m_dfg; m_strInputDfg = strDfg; m_dfg = new GSurface(); if (!m_dfg->ReadDfg(strDfg)) { delete m_dfg; m_dfg = nullptr; return false; } //begin test m_dfg; //end test return true; } bool CFaultAmplitudeCreator::CreateDfg(int numx, int numy, double x0, double y0, double dx, double dy, double* values) { if (m_dfg) delete m_dfg; m_dfg = new GSurface(); if (!m_dfg->Create(numx, numy, x0, y0, dx, dy, values)) { delete m_dfg; m_dfg = nullptr; return false; } return true; } void CFaultAmplitudeCreator::SetZRange(double zmin, double zmax) { if (m_dfg) { m_dfg->SetZRange(zmin, zmax); } } GDfdMap* CFaultAmplitudeCreator::GetDfd(void) { return m_dfdMap; } GSurface* CFaultAmplitudeCreator::GetDfg(void) { return m_dfg; } ////begin test //FILE* gfw = 0; ////end test void CFaultAmplitudeCreator::CalcAmplitudeWithSurvey(void) { m_ampResults.clear(); GetCandidateSurveys(); GPline* pFlt = 0; GPline* pSvy = 0; GRect8 rtFlt, rtSvy; FAmplitudeInfo fminfo; ////begin test //gfw = fopen("f:/testsegs.dfd", "w"); ////end test for (int j = 0; j < m_candidateFlts.size(); j++) { pFlt = m_candidateFlts[j]; rtFlt = m_fltRects[j]; for (int i = 0; i < m_candidateSurveys.size(); i++) { pSvy = m_candidateSurveys[i]; rtSvy = m_surveyRects[i]; //快速排斥 if (!rtFlt.IsIntersected(rtSvy)) continue; if (GetFltAmplitudeInfo(pFlt, pSvy, fminfo)) { m_ampResults.push_back(fminfo); } } } ////begin test //fclose(gfw); ////end test } double CFaultAmplitudeCreator::GetAmplitude(const GPoint3D& pt, const GPoint3D& ptStart, const GPoint3D& ptEnd) { if (nullptr == m_dfg) return 0.0; double dV = m_dfg->Z(pt.x0, pt.y0); if (!m_dfg->IsInRange(dV)) { return 0.0; } vector ptsClockwize, ptsCounterclockwize; double v1 = 0.0, v2 = 0.0; size_t nCount = m_dfg->Value(pt.x0, pt.y0, ptStart.x0, ptStart.y0, ptEnd.x0, ptEnd.y0, true, ptsClockwize); size_t nCountCounter = m_dfg->Value(pt.x0, pt.y0, ptStart.x0, ptStart.y0, ptEnd.x0, ptEnd.y0, false, ptsCounterclockwize); if (nCount == 0 || nCountCounter == 0) { return 0.0; } for (int i = 0; i < nCount; i++) { v1 += ptsClockwize.at(i).z0 / nCount; } for (int i = 0; i < nCountCounter; i++) { v2 += ptsCounterclockwize.at(i).z0 / nCountCounter; } if (m_dfg->IsInRange(v1) && m_dfg->IsInRange(v2)) return fabs(v2 - v1); return 0.0; } double CFaultAmplitudeCreator::GetAmplitude(const GPoint3D& pt1, const GPoint3D& pt2, GPline* pFlt)// pt1 pt2为断点 pFlt为断层 { if (nullptr == m_dfg) return -1E100; double v1 = 0.0, v2 = 0.0; if (nullptr != pFlt && pFlt->IsClosed(1e-4)) { v1 = m_dfg->Value(pt1.x0, pt1.y0, pFlt); v2 = m_dfg->Value(pt2.x0, pt2.y0, pFlt); } else { v1 = m_dfg->Z(pt1.x0, pt1.y0); v2 = m_dfg->Z(pt2.x0, pt2.y0); } if (m_dfg->IsInRange(v1) && m_dfg->IsInRange(v2)) return fabs(v2 - v1); return -1E100; } //获取垂直断距,pt1为断层上测量点,angle为角度,写入fmInfo bool CFaultAmplitudeCreator::Get2rdPoint(GPline* pFlt, GPoint3D& ptScr, double angle, GPoint3D& dstPt) { double cosa = cos(angle); double sina = sin(angle); GPline* pl = CreateLine(ptScr.x0, ptScr.y0, sina, cosa, pFlt->GetLength()); if (nullptr == pl) return false; list cxpts; list cxpIndexs; dstPt = ptScr; int flag = pFlt->GetCrossPoints(*pl, cxpts, cxpIndexs); delete pl; if (flag < 1) return false; list::iterator iter = cxpts.begin(); double dist = 1e301; double minDist = dist; for (; iter != cxpts.end(); iter++ ) { dist = ptScr.Distance2D(*iter); if (fabs(dist) < 1e-6) continue; if (dist < minDist) { minDist = dist; dstPt = *iter; } } return true; } bool CFaultAmplitudeCreator::GetFltAmplitudeInfo(GPline* pFlt, GPline* pSvy, FAmplitudeInfo& fmInfo) { ////begin test //TRACE("angle = %.4g %.4g\n", pFlt->GetAverageDirection() / PI * 180, // pSvy->GetAverageDirection() / PI * 180); //double svyangle = pSvy->GetAverageDirection(); ////end test list cxpts; list cxpIndexs; GPoint3D pt1; GPoint3D pt2(0, 0, 0); cxpts.clear(); if (pFlt->GetCrossPoints(*pSvy, cxpts, cxpIndexs) < 1) return false; std::list::iterator ele; int i = 0; for (ele = cxpts.begin(); ele != cxpts.end(); ++ele) {// list不可以用<,vector可以用!=和< GPoint3D ptTmp = *ele; if (i == 0) { pt1 = ptTmp; i++; continue; } if (abs( ptTmp.x0 - pt1.x0 )<1E-5 && abs(ptTmp.y0 - pt1.y0)<1E-5) { continue; } pt2 = ptTmp; break; } // 单线断层 if (pt2.x0 == 0 && pt2.y0 == 0) { pt2.x0 = pt1.x0; pt2.y0 = pt1.y0; //return false; } if (fabs(pt1.x0 - pt2.x0) < 1e-4 &&fabs(pt1.y0 - pt2.y0) < 1e-4) { int nIndex = cxpIndexs.front(); GPoint3D gpSeg0 = pFlt->GetPoint(nIndex); GPoint3D gpSeg1 = pFlt->GetPoint(nIndex + 1); fmInfo.amplitude = GetAmplitude(pt1, gpSeg0, gpSeg1); } else { fmInfo.amplitude = GetAmplitude(pt1, pt2, pFlt); } if (fmInfo.amplitude <0 || fmInfo.amplitude > 1E4) { return false; } //pt1 = cxpts.front(); //pt2 = cxpts.back(); fmInfo.x0 = pt1.x0; fmInfo.y0 = pt1.y0; fmInfo.x1 = pt2.x0; fmInfo.y1 = pt2.y0; fmInfo.horizontal_dist = pt1.Distance2D(pt2); fmInfo.fltName = pFlt->GetName(); if(nullptr != pSvy) fmInfo.surveyName = pSvy->GetName(); ////测线方式 if (1 == m_iCalcMethod && fabs(m_surveyAngle - PI) < 1e-4) //横向 { fmInfo.angle = m_surveyAngle; if (fabs(m_surveyAngle - PI) < 1e-4) { fmInfo.angle = PI; if (pt1.x0 > pt2.x0) { fmInfo.x0 = pt2.x0; fmInfo.y0 = pt2.y0; fmInfo.x1 = pt1.x0; fmInfo.y1 = pt1.y0; } } else if (fabs(m_surveyAngle - PI / 2.0) < 1e-4) { fmInfo.angle = PI / 2.0; if (pt1.y0 < pt2.y0) { fmInfo.x0 = pt2.x0; fmInfo.y0 = pt2.y0; fmInfo.x1 = pt1.x0; fmInfo.y1 = pt1.y0; } } else { double angle = atan2(pt1.y0 - pt2.y0, pt1.x0 - pt2.x0); if(angle < 1e-4) { fmInfo.x0 = pt2.x0; fmInfo.y0 = pt2.y0; fmInfo.x1 = pt1.x0; fmInfo.y1 = pt1.y0; } } } else { // 单线断层 if (fabs(pt1.x0 - pt2.x0) < 1e-4 &&fabs(pt1.y0 - pt2.y0) < 1e-4) { int nIndex = cxpIndexs.front(); GPoint3D gpSeg0 = pFlt->GetPoint(nIndex); GPoint3D gpSeg1 = pFlt->GetPoint(nIndex +1); double angle = CPublicFunctions::GetAngle180(gpSeg0.x0, gpSeg0.y0, gpSeg1.x0, gpSeg1.y0); //atan2(gpSeg0.x0 - gpSeg1.x0, gpSeg0.y0 - gpSeg1.y0); if (angle >= 0) fmInfo.angle = angle; else { fmInfo.angle = angle + PI; } } else if (fabs(pt1.x0 - pt2.x0) < 1e-4) //垂向 { fmInfo.y0 = max(pt1.y0, pt2.y0); fmInfo.angle = PI / 2; fmInfo.y1 = min(pt1.y0, pt2.y0); } else if (fabs(pt1.y0 - pt2.y0) < 1e-4) { fmInfo.x0 = min(pt1.x0, pt2.x0); fmInfo.angle = PI; fmInfo.x1 = max(pt1.x0, pt2.x0); } else { double angle = atan2(pt1.y0 - pt2.y0, pt1.x0 - pt2.x0); if (angle > 0) fmInfo.angle = angle; else { fmInfo.x0 = pt2.x0; fmInfo.y0 = pt2.y0; fmInfo.angle = angle + PI; fmInfo.x1 = pt1.x0; fmInfo.y1 = pt1.y0; } } } if (0 == m_iCalcMethod && m_bLocalFltDirect) { double oldangle = fmInfo.angle; double f = 0; int istart = pFlt->GetLocation(fmInfo.x0, fmInfo.y0, f); if (istart > -1) { GPline local_flt; local_flt.AddPoint(pFlt->GetPoint(istart)); local_flt.AddPoint(pFlt->GetPoint(istart + 1)); double direct = local_flt.GetAverageDirection(); double ds = 0; //测线角度 GRect8 rtflt = local_flt.GetRect(); rtflt.left -= 1e-6; rtflt.right += 1e-6; rtflt.bottom -= 1e-6; rtflt.top += 1e-6; double cs = 2 * (rtflt.Width() + rtflt.Height()); cs *= 2; if (direct < PI / 2.0) ds = direct + PI / 2.0; else ds = direct - PI / 2.0; if (fabs(oldangle - ds) > PI / 2.0) ds += PI; fmInfo.angle = ds; pt1.x0 = fmInfo.x0; pt1.y0 = fmInfo.y0; Get2rdPoint(pFlt, pt1, fmInfo.angle, pt2); fmInfo.horizontal_dist = pt1.Distance2D(pt2); } } ////begin test //fprintf(gfw, "Pline.%s\n", pSvy->GetName().c_str()); //fprintf(gfw, "%.4f,%.4f\n", pt1.x0, pt1.y0); //fprintf(gfw, "%.4f,%.4f\n", pt2.x0, pt2.y0); //fprintf(gfw, "\n"); // //end test //if (fabs(pt1.x0 - pt2.x0) < 1e-4 &&fabs(pt1.y0 - pt2.y0) < 1e-4) //{ // int nIndex = cxpIndexs.front(); // GPoint3D gpSeg0 = pFlt->GetPoint(nIndex); // GPoint3D gpSeg1 = pFlt->GetPoint(nIndex + 1); // fmInfo.amplitude = GetAmplitude(pt1, gpSeg0, gpSeg1); //} //else { // fmInfo.amplitude = GetAmplitude(pt1, pt2, pFlt); //} fmInfo.xMid = (fmInfo.x0 + fmInfo.x1)*0.5; fmInfo.yMid = (fmInfo.y0 + fmInfo.y1)*0.5; return true; } void CFaultAmplitudeCreator::ReadFltNames(void) { m_tarFltNames.clear(); if (m_strFltNames.GetLength() > 0) { stringstream ss; ss << m_strFltNames; string strLine, strName; while (ss >> strLine) { stringstream ssLine; ssLine << strLine; while (getline(ssLine, strName, ',')) { if (strName.size() > 0) { m_tarFltNames.insert(strName); } } ssLine.str(""); } ss.str(""); return; } ifstream ifs(m_strFltNameFile.GetBuffer()); if (!ifs) return; string line; while (getline(ifs, line)) { CPublicFunctions::Trim(line); if (line.size() < 1) continue; m_tarFltNames.insert(line); } ifs.close(); } void CFaultAmplitudeCreator::SetOutPaths(CString strOutDfd, CString strOutCsv) { m_strOutDfd = strOutDfd; m_strOutCsv = strOutCsv; } void CFaultAmplitudeCreator::InsertLayer(const string& strLayer) { if (m_dfdMap == nullptr) { m_dfdMap = new GDfdMap(); } m_dfdMap->InsertLayer(strLayer); } void CFaultAmplitudeCreator::InsertElement(GBaseObj* pobj, const string& strLayer, COLORREF color) { if (m_dfdMap == nullptr) { m_dfdMap = new GDfdMap(); } m_dfdMap->InsertObj(pobj, strLayer, color); } bool CFaultAmplitudeCreator::Execute() { GetCandidateFlts(); switch (m_iCalcMethod) { case 0: CalcAmplitudeWithStep(); break; case 1: CalcAmplitudeWithSurvey(); break; default: return false; } CreatePillarPolygons(); WriteDfd(); WriteCsv(); return true; } ////x0,y0为中心点,斜率k 生成一条线,长度为len //GPline* CreateLine(double x0, double y0, double sina, double cosa, double len) //{ // double x1 = x0, y1 = y0, x2 = x0, y2 = y0; // if (fabs(sina - 1.0) < 1e-6) // { // y1 = y0 + len; // y2 = y0 - len; // } // else // { // x1 = x0 - len*cosa; // y1 = y0 - len*sina; // x2 = x0 + len*cosa; // y2 = y0 + len*sina; // } // // // GPline* pln = new GPline(); // pln->AddPoint(GPoint3D(x1, y1, 0)); // pln->AddPoint(GPoint3D(x2, y2, 0)); // return pln; // //} // // ////生成一组测线 xs ,ys起点, xe ye 终点 角度lndirect, len为线1/2长度 //int CreateLines(vector& dstLines, double xs, double ys, double xe, double ye, // double dx, double dy, double lndirect, double len) //{ // double x = xs; // double y = ys; // // double tts = sqrt(dx*dx + dy*dy); // int N = len / tts; // int i = -1; // // double sina = sin(lndirect); // double cosa = cos(lndirect); // GPline* pln = nullptr; // while (i < N) // { // i++; // // if (x > xe && (ye > ys && y > ys) ) // break; // if (x > xe && ye < ys && y < ye) // break; // // //生成新线 // pln = CreateLine(x, y, sina, cosa, len); // dstLines.push_back(pln); // // x += dx; // y += dy; // // } // // return dstLines.size(); // // //} //由步长计算断距 void CFaultAmplitudeCreator::CalcAmplitudeWithStep(GPline* flt, std::vector* dstFAInfo) { if (0 == flt || flt->GetCount() < 3) return; vector tmpSvys; //临时测线,方向与flt方向垂直 double direct = flt->GetAverageDirection(); ////begin test //TRACE("\n%s agl = %.2g\n", flt->GetName().c_str(), direct / PI * 180.0); ////end test double ds = 0; //测线角度 GRect8 rtflt = flt->GetRect(); rtflt.left -= 1e-6; rtflt.right += 1e-6; rtflt.bottom -= 1e-6; rtflt.top += 1e-6; double cs = 2 * (rtflt.Width() + rtflt.Height()); cs *= 2; if (direct < PI / 2.0) ds = direct + PI / 2.0; else ds = direct - PI / 2.0; double x0 = rtflt.left; double y0 = rtflt.top; //测线起点坐标 double xe = rtflt.right; double ye = rtflt.bottom; if (ds > PI / 2.0) { y0 = rtflt.bottom; ye = rtflt.top; } double sina = sin(direct); double cosa = cos(direct); double dx = m_pillarStep*cosa; double dy = m_pillarStep*sina; vector plvec; CreateLines(plvec, x0, y0, xe, ye, dx, dy, ds, cs); std::vector< FAmplitudeInfo> infos; for (int i = 0; i < plvec.size(); i++) { GPline* pSvy = plvec[i]; FAmplitudeInfo fminfo; if (GetFltAmplitudeInfo(flt, pSvy, fminfo)) { infos.push_back(fminfo); } } double dTotal = 0; for (auto it = infos.begin(); it != infos.end(); ++it) { dTotal += it->amplitude; } dTotal *= 0.8; // 筛选符合条件的元素 auto& target = (dstFAInfo) ? *dstFAInfo : m_ampResults; for (const auto& info : infos) { if (info.amplitude < dTotal) { // 明确条件:保留振幅 < 总和80%的元素 target.push_back(info); } else if ((info.amplitude > dTotal) && (infos.size() == 1)) { target.push_back(info); } } ////begin test //FILE* fw = fopen("f:/testsegs.dfd", "w"); //for (int i = 0; i < plvec.size(); i++) // plvec[i]->Write(fw); //fclose(fw); ////end test for (int i = 0; i < plvec.size(); i++) delete plvec[i]; } //由步长计算断距 void CFaultAmplitudeCreator::CalcAmplitudeWithStep(void) { m_ampResults.clear(); GPline* pFlt = 0; GPline* pSvy = 0; GRect8 rtFlt, rtSvy; FAmplitudeInfo fminfo; ////begin test //gfw = fopen("f:/testsegs.dfd", "w"); ////end test for (int j = 0; j < m_candidateFlts.size(); j++) { pFlt = m_candidateFlts[j]; CalcAmplitudeWithStep(pFlt); //rtFlt = m_fltRects[j]; //for (int i = 0; i < m_candidateSurveys.size(); i++) //{ // pSvy = m_candidateSurveys[i]; // rtSvy = m_surveyRects[i]; // //快速排斥 // if (!rtFlt.IsIntersected(rtSvy)) // continue; // if (GetFltAmplitudeInfo(pFlt, pSvy, fminfo)) // { // m_ampResults.push_back(fminfo); // } //} } } void CFaultAmplitudeCreator::WriteLayers(FILE* fw) { fprintf(fw, "Class Layer\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M 断距柱子\n"); fprintf(fw, "Layer ViewAndEdit\n"); fprintf(fw, "Layer M %s\n", m_strLayerPillarHigh); fprintf(fw, "Layer ViewAndEdit\n"); fprintf(fw, "Layer M %s\n", m_strLayerPillarLow); fprintf(fw, "Layer ViewAndEdit\n"); fprintf(fw, "Layer M %s\n", m_strLayerPillarText); fprintf(fw, "Layer ViewAndEdit\n"); fprintf(fw, "\n"); // fprintf(fw, "Layer M 0\n"); fprintf(fw, "Layer M 断距柱子\n"); fprintf(fw, "HowToViewCurve\n"); fprintf(fw, "Property 0 %ld 65568 0 0 20000.000000 30000.000000 10\n", m_clrHigh); fprintf(fw, "Solid\n"); fprintf(fw, "CenterName 0.0000 %lf 0.0000 0.0000 0 0 0 Times_New_Roman\n", m_TextHeight); fprintf(fw, "NoDraw\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M %s\n", m_strLayerPillarHigh.GetBuffer()); fprintf(fw, "Layer HowToViewCurve\n"); fprintf(fw, "HowToViewCurve\n"); fprintf(fw, "Property 0 %ld 65568 0 0 20000.000000 30000.000000 10\n", m_clrLow); fprintf(fw, "Solid\n"); fprintf(fw, "CenterName 0.0000 %lf 0.0000 0.0000 0 0 0 Times_New_Roman\n", m_TextHeight); fprintf(fw, "NoDraw\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M %s\n", m_strLayerPillarLow.GetBuffer()); fprintf(fw, "Layer HowToViewCurve\n"); fprintf(fw, "HowToViewPoint\n"); fprintf(fw, "Font 0 20 0 400 0 0 0 1 0 16 0 0 Times New Roman\n"); double width = m_TextHeight* 0.4; fprintf(fw, "Text %.4f %.4f 0.0000 %.4f %.4f 76\n", m_TextHeight, m_TextHeight*0.4, -width*0.4, -m_TextHeight); fprintf(fw, "Color 0 16777215\n"); //黑色文字 fprintf(fw, "Mark 0.0000 0.0000 0.0000\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M %s\n", m_strLayerPillarText.GetBuffer()); fprintf(fw, "Layer HowToViewPoint\n"); fprintf(fw, "HowToViewCurve\n"); fprintf(fw, "Property 0 %ld 65568 0 0 20000.000000 30000.000000 10\n", m_clrIncline); fprintf(fw, "Solid\n"); fprintf(fw, "CenterName 0.0000 %lf 0.0000 0.0000 0 0 0 Times_New_Roman\n", m_TextHeight); fprintf(fw, "NoDraw\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M %s\n", m_strLayerPillarIncline.GetBuffer()); fprintf(fw, "Layer HowToViewCurve\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 %.4f %.4f 76\n", m_TextHeight, m_TextHeight*0.4, -width * 0.4, -m_TextHeight); fprintf(fw, "Color 0 16777215\n"); //黑色文字 fprintf(fw, "Mark 0.0000 0.0000 0.0000\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M %s\n", m_strLayerTextIncline.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_strLayerPillarHigh); fprintf(fw, "Layer M %s\n", m_strLayerPillarLow); fprintf(fw, "Layer M %s\n", m_strLayerPillarText); //fprintf(fw,"State 10\n"); //曲线修饰 //点修饰 double height = m_TextHeight; double width = 4 * height / 10.0; fprintf(fw, "HowToViewPoint\n"); fprintf(fw, "Font 0 -20 0 400 0 0 0 0 3 2 1 2 Times New Roman\n"); fprintf(fw, "Text %.4f %.4f 0.0000 %.4f %.4f 76\n", height, width, -width*0.4, -height); fprintf(fw, "Color 0 16777215\n"); fprintf(fw, "Mark 0.0000 0.0000 0.0000\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M %s\n", m_strLayerPillarText); fprintf(fw, "Layer HowToViewPoint\n"); fprintf(fw, "HowToViewCurve\n"); fprintf(fw, "Property 0 %ld 65568 0 0 20000.000000 30000.000000 10\n", m_barColor); fprintf(fw, "Solid\n"); fprintf(fw, "NoDraw\n"); fprintf(fw, "\n"); fprintf(fw, "Layer M %s\n", m_strLayerBars); fprintf(fw, "Layer HowToViewCurve\n"); fprintf(fw, "HowToViewCurve\n"); fprintf(fw, "\n\n"); fprintf(fw, "HowToViewPoint\n"); fprintf(fw, "\n"); fprintf(fw, "State 10\n"); */ } void CFaultAmplitudeCreator::WritePillars(FILE* fw) { for (int i = 0; i < m_pillarPolygons.size(); i++) { if (m_ampResults[i].amplitude > m_thresholdValue) fprintf(fw, "Layer M %s\n", m_strLayerPillarHigh.GetBuffer()); else fprintf(fw, "Layer M %s\n", m_strLayerPillarLow.GetBuffer()); m_pillarPolygons[i]->Write(fw); } if (m_bWithIncline) { for (int i = 0; i < m_pillarPolygonsInc.size(); i++) { fprintf(fw, "Layer M %s\n", m_strLayerPillarIncline.GetBuffer()); m_pillarPolygonsInc[i]->Write(fw); } } } void CFaultAmplitudeCreator::WriteTextPoints(FILE* fw) { double angle = 0; GPoint3D pt; for (int i = 0; i < m_pillarPolygons.size(); i++) { fprintf(fw, "Layer M %s\n", m_strLayerPillarText.GetBuffer()); angle = m_ampResults[i].angle; angle -= PI / 2.0; angle = angle / PI * 180; pt = m_pillarTexts[m_pillarPolygons[i] ]; fprintf(fw, "3dPoint %.12g,%.12g,0 %.4g %s\n", pt.x0,pt.y0,angle, pt.GetName().c_str() ); } if (m_bWithIncline) { for (int i = 0; i < m_pillarPolygonsInc.size(); i++) { fprintf(fw, "Layer M %s\n", m_strLayerTextIncline.GetBuffer()); angle = m_ampResults[i].angle; angle -= PI / 2.0; angle = angle / PI * 180 - 180; if (angle > 0) { angle -= 360; } pt = m_pillarTextsInc[m_pillarPolygonsInc[i]]; fprintf(fw, "3dPoint %.12g,%.12g,0 %.4g %s\n", pt.x0, pt.y0, angle, pt.GetName().c_str()); } } } //写出dfd bool CFaultAmplitudeCreator::WriteDfd(void) { ::CopyFile(m_strInputDfd, m_strOutDfd, FALSE); FILE* fw = fopen(m_strOutDfd, "a+"); if (0 == fw) return false; WriteLayers(fw); WritePillars(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 CFaultAmplitudeCreator::WriteCsv(void) { //输出断层名称、X、Y、断距、计算垂直断距的测线号 std::ofstream file(m_strOutCsv.GetString()); if (file.is_open()) { file << u8"断层名称,X,Y,垂直断距,测线\n"; for (int i = 0; i < m_ampResults.size(); i++) { char buf[512]; sprintf_s(buf, sizeof(buf), "%s,%.4lf,%.4lf,%.4f,%s\n", m_ampResults[i].fltName.c_str(), m_ampResults[i].xMid, m_ampResults[i].yMid, m_ampResults[i].amplitude, m_ampResults[i].surveyName.c_str() ); file << buf; } file.close(); return true; } return false; } void CFaultAmplitudeCreator::GetCandidateFlts(void) { ReadFltNames(); m_candidateFlts.clear(); m_fltRects.clear(); if (nullptr == m_dfdMap) return; list objlst; m_dfdMap->GetElements(objlst, m_strFltLayer.GetBuffer()); list::iterator iter = objlst.begin(); GPline* pc = nullptr; for (; iter != objlst.end(); iter++) { if (eLine != (*iter)->GetType()) continue; pc = (GPline*)(*iter); if (m_tarFltNames.size() > 0 && m_tarFltNames.count(pc->GetName()) < 1) continue; m_candidateFlts.push_back(pc); m_fltRects.push_back(pc->GetRect()); } } double CFaultAmplitudeCreator::GetSurveyAngle(GPline* psvy) { if (psvy->GetCount() < 2) return PI; int N = psvy->GetCount(); N--; double agl = atan2(psvy->Y(N) - psvy->Y(0), psvy->X(N) - psvy->X(0)); if (agl < 0.001) agl += PI; return agl; } void CFaultAmplitudeCreator::GetCandidateSurveys(void) { m_candidateSurveys.clear(); m_surveyRects.clear(); if (nullptr == m_dfdMap) return; list objlst; m_dfdMap->GetElements(objlst, m_strSurveyLayer.GetBuffer() ); list::iterator iter = objlst.begin(); GPline* pc = nullptr; int N = 0; double totalAgl = 0.0; for (; iter != objlst.end(); iter++) { if (eLine != (*iter)->GetType()) continue; pc = (GPline*)(*iter); m_candidateSurveys.push_back(pc); m_surveyRects.push_back(pc->GetRect()); totalAgl += GetSurveyAngle(pc); N++; } m_surveyAngle = totalAgl / double(N); } //CFaultAmplitudeCreator::FAmplitudeInfo::FAmplitudeInfo(void) // :fltName("") // , surveyName("") // ,x0(0) // ,y0(0) // ,amplitude(0) // ,angle(0) // ,horizontal_dist(0.0) //{ //} void CFaultAmplitudeCreator::ErasePillarPgns() { for (int i = 0; i < m_pillarPolygons.size(); i++) delete m_pillarPolygons[i]; m_pillarPolygons.clear(); m_pillarTexts.clear(); for (int i = 0; i < m_pillarPolygonsInc.size(); i++) delete m_pillarPolygonsInc[i]; m_pillarPolygonsInc.clear(); m_pillarTextsInc.clear(); } //生成柱子多边形 int CFaultAmplitudeCreator::CreatePillarPolygons(void) { ErasePillarPgns(); m_pillarPolygons.reserve(m_ampResults.size()); if (m_bWithIncline) { m_pillarPolygonsInc.reserve(m_ampResults.size()); } for (int i = 0; i < m_ampResults.size(); i++) { GPline* pl = new GPline(); GPline* plInc = new GPline(); CreatePillarPolygon(m_ampResults[i], pl, plInc); if (pl->GetCount() == 0) { continue; } m_pillarPolygons.push_back(pl); if (m_bWithIncline) { m_pillarPolygonsInc.push_back(plInc); } } return m_pillarPolygons.size(); } //由FAmplitudeInfo生成柱子多边形 void CFaultAmplitudeCreator::CreatePillarPolygon(FAmplitudeInfo& fi, GPline* pline, GPline* plineInc) { if (fi.amplitude > 1E20) { return; } double dX0 = fi.xMid; double dY0 = fi.yMid; GRect8 rt(dX0, dX0 + fi.amplitude*m_PillarHeightRatio, dY0 - m_PillarWidth / 2.0, dY0 + m_PillarWidth / 2.0); GPline* pl = pline; static char cname[20]; sprintf(cname, "%.1f", fi.amplitude); pl->SetName(cname); pl->FromRect(rt); ////begin test //FILE* fw = fopen("f:/testout.dfd", "w"); //pl->Write(fw); ////end test double wd = m_TextHeight*0.4; GPoint3D pttext(rt.right+ 1.4*m_TextHeight, (rt.bottom + rt.top) / 2.0 + 5*wd, 0); pttext.SetName(cname); pl->Rotate(dX0, dY0, fi.angle); pttext.Rotate(dX0, dY0, fi.angle); m_pillarTexts[pl] = pttext; //GRect8 rtIncline(fi.x1 - fi.amplitude*m_PillarHeightRatio, fi.x1, fi.y1 - m_PillarWidth / 2.0, // fi.y1 + m_PillarWidth / 2.0); if (m_bWithIncline) { double dIncline = atan(fi.amplitude / fi.horizontal_dist) * 180 / PI; GRect8 rtIncline(fi.x1 - dIncline* m_inclineScale, fi.x1, fi.y1 - m_PillarWidth / 2.0, fi.y1 + m_PillarWidth / 2.0); GPline* plIncline = plineInc; static char cnameIncline[20]; sprintf(cnameIncline, "%.1f", dIncline); plIncline->SetName(cnameIncline); plIncline->FromRect(rtIncline); plIncline->Rotate(fi.x1, fi.y1, fi.angle); double dPtIncX = rtIncline.right + 1.3*m_TextHeight; double dPtIncY = (rtIncline.bottom + rtIncline.top) / 2.0;// -2 * wd; GPoint3D ptIncline(rtIncline.left - 0.2*m_TextHeight, dPtIncY, 0); ptIncline.SetName(cnameIncline); ptIncline.Rotate(fi.x1, fi.y1, fi.angle); m_pillarTextsInc[plIncline] = ptIncline; } ////begin test //pl->Write(fw); //fclose(fw); ////end test //return pl; }