a
This commit is contained in:
@@ -0,0 +1,252 @@
|
||||
// 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;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user