// MediumMidGardientScan.cpp: implementation of the CMediumMidGardientScan class. // ////////////////////////////////////////////////////////////////////// #include "geomative.h" #include "MediumMidGardientScan.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// extern int g_iUILanguage; CMediumMidGardientScan::CMediumMidGardientScan(int iAR) { m_scr = NULL; m_fXPoleSpace = 0; m_fYPoleSpace = 0; m_iAR = iAR; m_iStartPole = 1; m_iEndPole = 1; m_iXGridSzie = 0; m_iYGridSize = 0; } CMediumMidGardientScan::~CMediumMidGardientScan() { } bool CMediumMidGardientScan::GenerateSptRecElecVal(int iEAmount, int* pMaxLevel, int* pPtAmount, CPtrArray* pSptRecArray) { if (NULL == pSptRecArray) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("pSptRecArray不能为空!")); else MessageBoxEx(NULL, _T("pSptRecArray can't be NULL!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } pSptRecArray->RemoveAll(); int iStartIndex = 0; int iChangeParam = 0; int iTsn = 0; CSptRecord *pSptRec = NULL; m_iXGridSzie = m_rect.x1 - m_rect.x0 + 1; m_iYGridSize = m_rect.y1 - m_rect.y0 + 1; //按照Y轴进行X轴的跑极 for (int i = 0; i < m_iYGridSize; i++) { iStartIndex = i * m_iXGridSzie; //奇数列和偶数列的电极编号是反序的 if (0 == i%2) iChangeParam = 0; else iChangeParam = 1; int iM = 0,iN = 0; int iAdd = 0; //按照从左到右将那些跑极,MN之间的距离最小从1开始 while(1) { iAdd++; iM = iStartIndex + iAdd + iChangeParam*(m_iXGridSzie-2*iAdd+1); if (0 == iChangeParam) { if (iM + 1 > iStartIndex + m_iXGridSzie) break; } else { if (iM -1 <= iStartIndex) break; } int iTmp = 0; while(1) { iTmp++; iN = iM + iTmp - 2 * iTmp * iChangeParam; if (0 == iChangeParam) { if (iN > iStartIndex + m_iXGridSzie) break; } else { if (iN <= iStartIndex) break; } pSptRec = new CSptRecord(); pSptRec->m_iC1 = -1; pSptRec->m_iC2 = -1; pSptRec->m_iP1 = iM; pSptRec->m_iP2 = iN; pSptRec->m_fK = CalculateCESptKVal(i+1, i+1, iM, iN); //由于不需要画剖面图,所以这里暂时对m_iPtNum赋值为0 pSptRec->m_iPtNum = 0; // pSptRec->m_iPtNum = iC1Pos; pSptRec->m_iLevel = GenSptRecLevel(-1, -1, iM, iN); pSptRec->m_colorREF = RGB(0, 255, 0); pSptRec->m_iN = 1; pSptRec->m_bIsSel = TRUE; pSptRec->m_iTsn = ++iTsn; pSptRecArray->Add(pSptRec); } } } *pPtAmount = pSptRecArray->GetSize(); *pMaxLevel = 0; return true; } float CMediumMidGardientScan::CalculateCESptKVal(float fA, float fB, float fX, float fY) { //在这里还是以AB的中点作为中心点来构建坐标系 float fXAxisOffset = m_stMidGardientScan.fABSpace/2; //先获取逻辑AB所在的侧线 int iYAxisOffset = (int)(m_stMidGardientScan.fAPosY/m_fYPoleSpace); // float fTestLineXAxisOffset = (m_iXGridSzie-1)/2; int iYGridIndex = (int)fA - 1; float fYPosOffset = fabs(float(iYGridIndex - iYAxisOffset))*m_fYPoleSpace; float fAPosX = -1 * fXAxisOffset; float fBPosX = fXAxisOffset; float fMPosX = 0, fNPosX = 0; if (0 == iYGridIndex%2) { fMPosX = fAPosX + m_stMidGardientScan.fMinAMSpace + m_fXPoleSpace*(fX - iYGridIndex*m_iXGridSzie - 1); fNPosX = fAPosX + m_stMidGardientScan.fMinAMSpace + m_fXPoleSpace*(fY - iYGridIndex*m_iXGridSzie - 1); } else { fMPosX = fAPosX + m_stMidGardientScan.fMinAMSpace + fabs(m_fXPoleSpace*(fX - (iYGridIndex+1)*m_iXGridSzie)); fNPosX = fAPosX + m_stMidGardientScan.fMinAMSpace + fabs(m_fXPoleSpace*(fY - (iYGridIndex+1)*m_iXGridSzie)); } float fAM = sqrt(pow(fMPosX - fAPosX, 2) + pow(fYPosOffset,2)); float fAN = sqrt(pow(fNPosX - fAPosX, 2) + pow(fYPosOffset,2)); float fBM = sqrt(pow(fBPosX - fMPosX, 2) + pow(fYPosOffset,2)); float fBN = sqrt(pow(fBPosX - fNPosX, 2) + pow(fYPosOffset,2)); if (0 == fAM || 0 ==fAN) { return 0; // AfxMessageBox(_T("Calcualte K value error.value = ")) } return fabs(2*VAL_PI/(1.0/fAM - 1.0/fAN - 1.0/fBM + 1/fBN)); } bool CMediumMidGardientScan::GenerateSptRecElecVal3D(int nSplittedNum, CScript3D *pScript, int* pPtAmount, CPtrArray* pSptRecArray) { if (NULL == pSptRecArray) { if (LANG_ZHCN == g_iUILanguage) AfxMessageBox(_T("pSptRecArray不能为空!")); else MessageBoxEx(NULL, _T("pSptRecArray can't be NULL!"), STRING_MESSAGEBOXEX_TITLE, MB_OK, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); return false; } int Id = 0; //m_PointNum的大小是128,可查看其定义 memset(pScript->m_PointNum, 0, sizeof(pScript->m_PointNum)); pSptRecArray->RemoveAll(); m_iXGridSzie = m_rect.x1 - m_rect.x0 + 1; m_iYGridSize = m_rect.y1 - m_rect.y0 + 1; int iStartIndex = 0; int iChangeParam = 0; int iTsn = 0; CSptRecord *pSptRec = NULL; //按照Y轴进行X轴的跑极 for (int i = 0; i < m_iYGridSize; i++) { iStartIndex = i * m_iXGridSzie; //奇数列和偶数列的电极编号是反序的 if (0 == i%2) iChangeParam = 0; else iChangeParam = 1; int iM = 0,iN = 0; int iAdd = 0; //按照从左到右将那些跑极,MN之间的距离最小从1开始 while(1) { iAdd++; iM = iStartIndex + iAdd + iChangeParam*(m_iXGridSzie-2*iAdd+1); if (0 == iChangeParam) { if (iM + 1 > iStartIndex + m_iXGridSzie) break; } else { if (iM -1 <= iStartIndex) break; } int iTmp = 0; while(1) { iTmp++; iN = iM + iTmp - 2 * iTmp * iChangeParam; if (0 == iChangeParam) { if (iN > iStartIndex + m_iXGridSzie) break; } else { if (iN <= iStartIndex) break; } pSptRec = new CSptRecord(); pSptRec->m_iC1 = -1; pSptRec->m_iC2 = -1; pSptRec->m_iP1 = iM; pSptRec->m_iP2 = iN; pSptRec->m_fK = CalculateCESptKVal(i+1, i+1, iM, iN); pSptRec->m_SubScriptIndex = Id;//记录这个测点属于哪个子脚本 pSptRec->m_iN = m_uiStackNumber; pSptRec->m_iTsn = ++iTsn; pSptRecArray->Add(pSptRec); (pScript->m_PointNum[Id])++; } } } *pPtAmount = pSptRecArray->GetSize(); return true; } void CMediumMidGardientScan::SetParamVal(const void* pVal) { STMidGarScanParam* pParam = (STMidGarScanParam*)pVal; m_stMidGardientScan.fABSpace = pParam->fABSpace; m_stMidGardientScan.fAPosY = pParam->fAPosY; m_stMidGardientScan.fMinAMSpace = pParam->fMinAMSpace; }