Files
geomative/GeomativeStudio/cpp/ProblemZone/MediumMidGardientScan.cpp
T
coco df489d5640 a
2026-07-03 16:05:30 +08:00

252 lines
6.5 KiB
C++

// 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;
}