Files
coco df489d5640 a
2026-07-03 16:05:30 +08:00

302 lines
9.4 KiB
C++

// MediumStrongGradient.cpp: implementation of the CMediumStrongGradient class.
//
//////////////////////////////////////////////////////////////////////
#include "geomative.h"
#include "MediumStrongGradient.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern int g_iUILanguage;
CMediumStrongGradient::CMediumStrongGradient(int iAR): CMedium(iAR)
{
}
CMediumStrongGradient::~CMediumStrongGradient()
{
}
void CMediumStrongGradient::SetParamVal(const void* pVal)
{
m_bStrongGradient = *(BYTE*)pVal;
}
float CMediumStrongGradient::CalculateSptKVal(int iM, int iN)
{
float fK = (float)VAL_ZERO;
fK = (float)(2 * VAL_PI*(iN - iM));
return fK;
}
float CMediumStrongGradient::CalculateCESptKVal(float fA, float fB, float fX, float fY)
{
float fAM = fabs(fX - fA);
float fAN = fabs(fY - fA);
float fBM = fabs(fB - fX);
float fBN = fabs(fB - fY);
if (0 == fAM || 0 == fAN || 0 == fBM || 0 == fBN)
{
return 0;
// AfxMessageBox(_T("Calcualte K value error.value = "))
}
return fabs(2 * VAL_PI / (1.0 / fAM - 1.0 / fAN - 1.0 / fBM + 1.0 / fBN));
}
int CMediumStrongGradient::CalculateSptLevel(int iM, int iN)
{
return iN - iM;
}
bool CMediumStrongGradient::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 i =0,j = 0;
int a = 1;
int iIndex = 0;
int iMaxLevel = 0;
const int iMaxA = 3; //a取值1~3
const int iFixedNValue = (iEAmount-1)/8; //n固定10
//const int iMaxS = 4;//S的意思是AB最多移動四次
const int iMaxS = 4;//S的意思是AB每次移动四个电极
CString strLog;
//只考虑a=1的情况即MN=1 P1P2=1
//OutputDebugString(_T("打印新装置测点\n"));
CSptRecord* pSptRec = NULL;
//int iC1 = 3, iC2 = 6, iP1 = 1, iP2 = 2;
int iC1 = 1, iC2 = 4, iP1 = 2, iP2 = 3;
int iTempC1 = iC1;
//strLog.Format(_T("\n\n----------------------iFixedNValue取值%d\n"), iFixedNValue);
//OutputDebugString(strLog);
//正序遍历
for (a = 1; a <= iMaxA; a++)
{
iC1 = iTempC1;//a值修改,第二轮巡
strLog.Format(_T("A点取值%d,a=%d\n"), iC1,a);
OutputDebugString(strLog);
for (iC2 = iC1 + (iFixedNValue + 2)*a; iC2 <= iEAmount;) //B点轮循环
{
strLog.Format(_T("B点取值iC1=%d,iC2=%d %d+(%d+2)*%d=%d\n"), iC1, iC2, iC1, iFixedNValue, a, (iFixedNValue + 2)*a);
OutputDebugString(strLog);
for (iP1 = 1; iP1 <= iEAmount - a; iP1++)
{
if ((iP1 + a) == iC2 || (iP1 + a) == iC1 || iP1 == iC1 || iP1 == iC2)
{
continue;
}
//MN均小于A点
if (iP1+a < iC1)
{
for (iP1 = 1; iP1 + a < iC1; iP1++)
{
iP2 = iP1 + a;
strLog.Format(_T("MN均小于A点index=%d A=%d,B=%d,M=%d,N=%d\n"), ++iIndex, iC1, iC2, iP1, iP2);
OutputDebugString(strLog);
pSptRec = new CSptRecord();
pSptRec->m_iC1 = iC1;
pSptRec->m_iC2 = iC2;
pSptRec->m_iP1 = iP1;
pSptRec->m_iP2 = iP2;
pSptRec->m_iN = 1;
pSptRec->m_fK = CalculateCESptKVal(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_iLevel = 1;// CalculateSptLevel(pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_fSptXPos = GetUniSptXPos(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
if (iMaxLevel < pSptRec->m_iLevel)
{
iMaxLevel = pSptRec->m_iLevel;
}
pSptRec->m_bIsSel = TRUE;
pSptRec->m_iTsn = iIndex;
pSptRecArray->Add(pSptRec);
}
}
//MN大于A点,小于B点
if (iP1 > iC1 && iP1 + a < iC2)
{
for (iP1 = iC1 + 1; iP1 < iC2 - a; iP1++)
{
iP2 = iP1 + a;
strLog.Format(_T("MN在AB之间index=%d A=%d,B=%d,M=%d,N=%d\n"), ++iIndex, iC1, iC2, iP1, iP2);
OutputDebugString(strLog);
pSptRec = new CSptRecord();
pSptRec->m_iC1 = iC1;
pSptRec->m_iC2 = iC2;
pSptRec->m_iP1 = iP1;
pSptRec->m_iP2 = iP2;
pSptRec->m_iN = 1;
pSptRec->m_fK = CalculateCESptKVal(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_iLevel = 1;// CalculateSptLevel(pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_fSptXPos = GetUniSptXPos(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
if (iMaxLevel < pSptRec->m_iLevel)
{
iMaxLevel = pSptRec->m_iLevel;
}
pSptRec->m_bIsSel = TRUE;
pSptRec->m_iTsn = iIndex;
pSptRecArray->Add(pSptRec);
}
}
//MN大于B点
if (iP1 > iC2)
{
for (iP1 = iC2 + 1; iP1 + a <= iEAmount; iP1++)
{
iP2 = iP1 + a;
strLog.Format(_T("MN大于B点index=%d A=%d,B=%d,M=%d,N=%d\n"), ++iIndex, iC1, iC2, iP1, iP2);
OutputDebugString(strLog);
pSptRec = new CSptRecord();
pSptRec->m_iC1 = iC1;
pSptRec->m_iC2 = iC2;
pSptRec->m_iP1 = iP1;
pSptRec->m_iP2 = iP2;
pSptRec->m_iN = 1;
pSptRec->m_fK = CalculateCESptKVal(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_iLevel = 1;// CalculateSptLevel(pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_fSptXPos = GetUniSptXPos(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
if (iMaxLevel < pSptRec->m_iLevel)
{
iMaxLevel = pSptRec->m_iLevel;
}
pSptRec->m_bIsSel = TRUE;
pSptRec->m_iTsn = iIndex;
pSptRecArray->Add(pSptRec);
}
}
}
//iC1 = iC1+iMaxS;//每次平移4个电极
iC1 = iC2;
iC2 = iC1 + (iFixedNValue + 2)*a;
}
}
//反序遍历
if (m_bStrongGradient != 0)
{
int iTempC2 = iC2 = iEAmount;
for (a = 1; a <= iMaxA; a++)
{
iC2 = iTempC2;//a值修改,第二轮巡
//strLog.Format(_T("A点取值%d,a=%d\n"), iC2, a);
//OutputDebugString(strLog);
for (iC1 = iC2 - (iFixedNValue + 2)*a; iC1 >= 1;)
{
//iTempSCount++;
//strLog.Format(_T("B点取值iC1=%d,iC2=%d %d+(%d+2)*%d=%d\n"), iC1, iC2, iC1, iFixedNValue, a, (iFixedNValue + 2)*a);
//OutputDebugString(strLog);
for (iP1 = iEAmount - a; iP1 >= 1; iP1--)
{
if ((iP1 - a) == iC2 || (iP1 - a) == iC1 || iP1 == iC1 || iP1 == iC2)
{
continue;
}
//MN均小于A点
if (iP1 + a < iC1)
{
for (iP1 = iC1 - 1 - a; iP1 >= 1; iP1--)
{
iP2 = iP1 + a;
strLog.Format(_T("MN均小于A点index=%d A=%d,B=%d,M=%d,N=%d\n"), ++iIndex, iC1, iC2, iP1, iP2);
OutputDebugString(strLog);
pSptRec = new CSptRecord();
pSptRec->m_iC1 = iC1;
pSptRec->m_iC2 = iC2;
pSptRec->m_iP1 = iP1;
pSptRec->m_iP2 = iP2;
pSptRec->m_iN = 1;
pSptRec->m_fK = CalculateCESptKVal(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_iLevel = 1;// CalculateSptLevel(pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_fSptXPos = GetUniSptXPos(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
if (iMaxLevel < pSptRec->m_iLevel)
{
iMaxLevel = pSptRec->m_iLevel;
}
pSptRec->m_bIsSel = TRUE;
pSptRec->m_iTsn = iIndex;
pSptRecArray->Add(pSptRec);
}
}
//MN大于A点,小于B点
if (iP1 > iC1 && iP1 + a < iC2)
{
for (iP1 = iC2 - a - 1; iP1 > iC1; iP1--)
{
iP2 = iP1 + a;
strLog.Format(_T("MN在AB之间index=%d A=%d,B=%d,M=%d,N=%d\n"), ++iIndex, iC1, iC2, iP1, iP2);
OutputDebugString(strLog);
pSptRec = new CSptRecord();
pSptRec->m_iC1 = iC1;
pSptRec->m_iC2 = iC2;
pSptRec->m_iP1 = iP1;
pSptRec->m_iP2 = iP2;
pSptRec->m_iN = 1;
pSptRec->m_fK = CalculateCESptKVal(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_iLevel = 1;// CalculateSptLevel(pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_fSptXPos = GetUniSptXPos(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
if (iMaxLevel < pSptRec->m_iLevel)
{
iMaxLevel = pSptRec->m_iLevel;
}
pSptRec->m_bIsSel = TRUE;
pSptRec->m_iTsn = iIndex;
pSptRecArray->Add(pSptRec);
}
}
//MN大于B点
if (iP1 > iC2)
{
for (iP1 = iEAmount - a; iP1 > iC2; iP1--)
{
iP2 = iP1 + a;
strLog.Format(_T("MN大于B点index=%d A=%d,B=%d,M=%d,N=%d\n"), ++iIndex, iC1, iC2, iP1, iP2);
OutputDebugString(strLog);
pSptRec = new CSptRecord();
pSptRec->m_iC1 = iC1;
pSptRec->m_iC2 = iC2;
pSptRec->m_iP1 = iP1;
pSptRec->m_iP2 = iP2;
pSptRec->m_iN = 1;
pSptRec->m_fK = CalculateCESptKVal(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_iLevel = 1;// CalculateSptLevel(pSptRec->m_iP1, pSptRec->m_iP2);
pSptRec->m_fSptXPos = GetUniSptXPos(pSptRec->m_iC1, pSptRec->m_iC2, pSptRec->m_iP1, pSptRec->m_iP2);
if (iMaxLevel < pSptRec->m_iLevel)
{
iMaxLevel = pSptRec->m_iLevel;
}
pSptRec->m_bIsSel = TRUE;
pSptRec->m_iTsn = iIndex;
pSptRecArray->Add(pSptRec);
}
}
}
//iC1 = iC1+iMaxS;//每次平移4个电极
iC2 = iC1;
iC1 = iC2 - (iFixedNValue + 2)*a;
}
}
}
*pMaxLevel = iMaxLevel;
*pPtAmount = pSptRecArray->GetSize();
}