a
This commit is contained in:
@@ -0,0 +1,301 @@
|
||||
// MediumZC.cpp: implementation of the CMediumZC class.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "geomative.h"
|
||||
#include "MediumZC.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#undef THIS_FILE
|
||||
static char THIS_FILE[]=__FILE__;
|
||||
#define new DEBUG_NEW
|
||||
#endif
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
CMediumZC::CMediumZC(int iAR)
|
||||
{
|
||||
m_iAR = iAR;
|
||||
m_fEOffsetR = 0.5;
|
||||
m_fLOffsetR = 0.5;
|
||||
m_fIntervalCof = 6;
|
||||
}
|
||||
|
||||
CMediumZC::~CMediumZC()
|
||||
{
|
||||
|
||||
}
|
||||
bool CMediumZC::GenerateSptRecElecVal(int iEAmount, //电极总数---in
|
||||
int* pMaxLevel, //最大层---out
|
||||
int* pPtAmount, //测点总数---out
|
||||
CPtrArray* pSptRecArray //脚本记录集---out
|
||||
) //函数功能:生成脚本电极记录集合
|
||||
{
|
||||
// int iEqualValMove = (int)VAL_ZERO;
|
||||
int iMaxSpace = (int)VAL_ZERO;
|
||||
// int iSpace = (int)VAL_ZERO; //电极间的距离
|
||||
int iTsn = (int)VAL_ZERO;
|
||||
|
||||
int iAVal = (int)VAL_ZERO;
|
||||
int iBVal = (int)VAL_ZERO;
|
||||
int iMVal = (int)VAL_ZERO;
|
||||
int iNVal = (int)VAL_ZERO;
|
||||
|
||||
int iMAVal = (int)VAL_ZERO;
|
||||
int iMMVal = (int)VAL_ZERO;
|
||||
int iMNVal = (int)VAL_ZERO;
|
||||
int iMBVal = (int)VAL_ZERO;
|
||||
|
||||
int iDisTance = 0;
|
||||
int iStep = 0;
|
||||
// int iMMove = (int)VAL_ZERO;
|
||||
// int iAMove = (int)VAL_ZERO;
|
||||
|
||||
int iTotalMove = (int)VAL_ZERO;
|
||||
|
||||
int iMaxLevel = (int)VAL_ZERO;
|
||||
|
||||
CSptRecord* pSptRecord = NULL;
|
||||
CString str = _T("");
|
||||
|
||||
iMaxSpace = iEAmount - 3; //BM之间的最大电极间距,(例如第一个电极和最后一个电极相聚N - 1米,第二个电极 和 倒数第二个电极相聚 N - 1 - 1 - 1米)
|
||||
|
||||
iTotalMove = iEAmount - 4; //AB总共需要移动的次数
|
||||
//在这里之前都是按照ABMN来计算的
|
||||
for (iMBVal = 2; iMBVal <= 2+iTotalMove; iMBVal++)
|
||||
{
|
||||
iMAVal = iMBVal - 1; //A始终在B前面一个位置
|
||||
iMBVal = iMBVal;
|
||||
iMMVal = iMBVal + 1;
|
||||
iMNVal = iMMVal + 1;
|
||||
|
||||
iAVal = iMAVal;
|
||||
iBVal = iMBVal;
|
||||
iMVal = iMMVal;
|
||||
iNVal = iMNVal;
|
||||
|
||||
pSptRecord = NULL;
|
||||
pSptRecord = new CSptRecord;
|
||||
if (NULL != pSptRecord)
|
||||
{
|
||||
pSptRecord->m_iC1 = iBVal;
|
||||
pSptRecord->m_iP2 = iNVal;
|
||||
pSptRecord->m_iC2 = iAVal;
|
||||
pSptRecord->m_iP1 = iMVal;
|
||||
pSptRecord->m_iTsn = ++iTsn;
|
||||
pSptRecord->m_fK = CalculateSptKVal(iAVal,iBVal,iMVal,iNVal);
|
||||
pSptRecord->m_iLevel = CalculateSptLevel(iMBVal, iMMVal);
|
||||
|
||||
pSptRecord->m_iPtNum = iBVal;
|
||||
|
||||
pSptRecord->m_colorREF = RGB(0, 255, 0);
|
||||
pSptRecord->m_bIsSel = TRUE;
|
||||
|
||||
pSptRecord->m_iN = (int)VAL_ONE;
|
||||
|
||||
CalculateSptPtLoc(2, pSptRecord);
|
||||
pSptRecArray->Add(pSptRecord);
|
||||
|
||||
if (pSptRecord->m_iLevel > iMaxLevel)
|
||||
{
|
||||
iMaxLevel = pSptRecord->m_iLevel;
|
||||
}
|
||||
}
|
||||
|
||||
iMMVal += 1;
|
||||
for (iMMVal; iMMVal < iEAmount; iMMVal++)
|
||||
{
|
||||
iMMVal = iMMVal;
|
||||
iMNVal = iMMVal + 1;//其他测点位置没有改变
|
||||
|
||||
iAVal = iMAVal;
|
||||
iBVal = iMBVal;
|
||||
iMVal = iMMVal;
|
||||
iNVal = iMNVal;
|
||||
float fInterval = (1.0*(iMVal - iBVal))/(iNVal - iMVal);
|
||||
if (fInterval > m_fIntervalCof)//BM间距大于6倍AB时,AB之间的距离要增加
|
||||
{
|
||||
// iDisTance = (iMVal - iBVal)/(iNVal - iMVal);
|
||||
|
||||
iStep = fInterval / m_fIntervalCof;
|
||||
|
||||
if (fmod(fInterval,m_fIntervalCof) < 0.00001)
|
||||
{
|
||||
iStep -= 1;
|
||||
}
|
||||
|
||||
iBVal = iBVal + iStep;
|
||||
iMVal = iMVal + iStep;
|
||||
iNVal = iNVal + (iStep*2);//因为M向后移动了N个单位,导致N要向后移动2倍的N才能将与M的间距扩大为N
|
||||
|
||||
if (iNVal > iEAmount)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*暂时屏蔽,改用新算法
|
||||
if (iMVal - iBVal > m_iIntervalCof)//BM间距大于6倍AB时,AB之间的距离要增加
|
||||
{
|
||||
iDisTance = (iMVal - iBVal)/(iNVal - iMVal);
|
||||
|
||||
iStep = iDisTance / m_iIntervalCof;
|
||||
|
||||
if (iDisTance % m_iIntervalCof == 0)
|
||||
{
|
||||
iStep -= 1;
|
||||
}
|
||||
|
||||
iBVal = iBVal + iStep;
|
||||
iMVal = iMVal + iStep;
|
||||
iNVal = iNVal + (iStep*2);//因为M向后移动了N个单位,导致N要向后移动2倍的N才能将与M的间距扩大为N
|
||||
|
||||
if (iNVal > iEAmount)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
pSptRecord = NULL;
|
||||
pSptRecord = new CSptRecord;
|
||||
|
||||
if (NULL != pSptRecord)
|
||||
{
|
||||
pSptRecord->m_iC1 = iBVal;
|
||||
pSptRecord->m_iP2 = iNVal;
|
||||
pSptRecord->m_iC2 = iAVal;
|
||||
pSptRecord->m_iP1 = iMVal;
|
||||
pSptRecord->m_iTsn = ++iTsn;
|
||||
pSptRecord->m_fK = CalculateSptKVal(iAVal,iBVal,iMVal, iNVal);
|
||||
pSptRecord->m_iLevel = CalculateSptLevel(iMBVal, iMMVal);
|
||||
pSptRecord->m_iPtNum = iBVal;
|
||||
pSptRecord->m_colorREF = RGB(0, 255, 0);
|
||||
pSptRecord->m_bIsSel = TRUE;
|
||||
|
||||
pSptRecord->m_iN = (int)VAL_ONE;
|
||||
|
||||
CalculateSptPtLoc(2, pSptRecord);
|
||||
pSptRecArray->Add(pSptRecord);
|
||||
|
||||
if (pSptRecord->m_iLevel > iMaxLevel)
|
||||
{
|
||||
iMaxLevel = pSptRecord->m_iLevel;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*pMaxLevel = iMaxLevel;
|
||||
|
||||
*pPtAmount = pSptRecArray->GetSize();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CMediumZC::CalculateSptPtLoc(int iMul, //倍数---in
|
||||
CSptRecord* pSptRecord //脚本记录指针---out
|
||||
) //函数功能:计算脚本测点位置
|
||||
{
|
||||
int iOffsetL = (int)VAL_ZERO;
|
||||
int iOffsetR = (int)VAL_ZERO;
|
||||
|
||||
int iLevel = pSptRecord->m_iLevel;
|
||||
int iPtNum = pSptRecord->m_iPtNum;
|
||||
|
||||
iOffsetL = (6+2)*iMul+50+4*iMul*(iLevel-3)+(iMul-2);
|
||||
iOffsetR = iOffsetL+6*iMul;
|
||||
|
||||
pSptRecord->m_recPtArea.left = iOffsetL+(6+2)*iMul*(iPtNum-1);
|
||||
pSptRecord->m_recPtArea.top = 50+(6+2)*iMul*(iLevel-1);
|
||||
pSptRecord->m_recPtArea.right = iOffsetR+(6+2)*iMul*(iPtNum-1);
|
||||
pSptRecord->m_recPtArea.bottom = (50+6*iMul)+(6+2)*iMul*(iLevel-1);
|
||||
|
||||
pSptRecord->m_fPtCenterX = (float)(iOffsetL+(6+2)*iMul*(iPtNum-1) + ((iOffsetR+(6+2)*iMul*(iPtNum-1)) - (iOffsetL+(6+2)*iMul*(iPtNum-1))) / 2);
|
||||
pSptRecord->m_fPtCenterY = (float)(50+(6+2)*iMul*(iLevel-1) + (((50+6*iMul)+(6+2)*iMul*(iLevel-1)) - (50+(6+2)*iMul*(iLevel-1))) / 2);
|
||||
pSptRecord->m_fPtRadius = (float)(abs((int)(pSptRecord->m_fPtCenterX) - pSptRecord->m_recPtArea.left));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int CMediumZC::GenSptRecLevel(int iA, int iB, int iM, int iN)
|
||||
{
|
||||
return iM-iA;
|
||||
}
|
||||
|
||||
int CMediumZC::GenSptRecPosInLevel(int iA, int iB, int iM, int iN)
|
||||
{
|
||||
return (int)iA;
|
||||
}
|
||||
|
||||
int CMediumZC::GetMaxLevelByEAmount(int iEAmount)
|
||||
{
|
||||
int iLayer = 0;
|
||||
int iNPos = 0;
|
||||
int iTmp = 0;
|
||||
//在这里iTmp指的是BA的距离,而BA = MN
|
||||
//每一层的第一个点都是从1开始
|
||||
while(TRUE)
|
||||
{
|
||||
iLayer++;
|
||||
iTmp = 1 + (iLayer-1)/6;
|
||||
iNPos = 1 + iTmp + iLayer + iTmp;
|
||||
if (iNPos > iEAmount)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return iLayer -1;
|
||||
}
|
||||
|
||||
float CMediumZC::CalculateDepth(float fA, float fFactor)
|
||||
{
|
||||
// return (float)(fabs(fA)*fFactor);
|
||||
return (float)((fabs(fA)/0.5)*fFactor);
|
||||
}
|
||||
|
||||
float CMediumZC::CalculateCESptKVal(float fA, float fB, float fX, float fY)
|
||||
{
|
||||
float fK = (float)VAL_ZERO;
|
||||
fK = (float)(VAL_PI * fB * ((fB * fB) * (fA * fA) - 1));
|
||||
|
||||
return fK;
|
||||
}
|
||||
|
||||
// float CMediumZC::CalculateSptKVal(int iM, int iN)
|
||||
// {
|
||||
// //iN:传进来M的位置
|
||||
// //IM:传进来B的位置
|
||||
//
|
||||
// float fK = (float)VAL_ZERO;
|
||||
// int n = iN - iM ;
|
||||
// fK = (float)( VAL_PI * n * (n+1) * (n + 2) * 1 );
|
||||
//
|
||||
// return fK;
|
||||
//}
|
||||
|
||||
float CMediumZC::CalculateSptKVal(int iA, int iB, int iM, int iN)
|
||||
{
|
||||
|
||||
float fK = 0;
|
||||
int a = iB - iA;
|
||||
int na = iM - iB;
|
||||
float n = na*1.0 / a;
|
||||
fK = (float)( VAL_PI * n * (n+1) * (n + 2) * a );
|
||||
|
||||
return fK;
|
||||
|
||||
}
|
||||
|
||||
int CMediumZC::CalculateSptLevel(int iM, int iN)
|
||||
{
|
||||
return iN - iM;
|
||||
}
|
||||
|
||||
void CMediumZC::ReSortPoint(CPtrArray *f_ptr)
|
||||
{
|
||||
return;
|
||||
}
|
||||
Reference in New Issue
Block a user