Files
envi-code/SourceCode/Code2026/tg_shs/shs_kernal/T3DimArray.h
T
2026-09-28 15:28:50 +08:00

1212 lines
23 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//------------------------------------------------------------------------+
// Copyright (C), 1998-2011, Beijing Tangent Software Co. Ltd.
// = FileName : T3DimArray类
// = Version : ver1.0
// = Author : xlc,cet
// = CreateDate : 2011-06-23
// = Description: 分区大小模板类声明和实现
// = Maintainers:
//
//------------------------------------------------------------------------+
#ifndef _T3DIMARRAY_H_
#define _T3DIMARRAY_H_
#ifndef __QUADRANTINFO_H__
#include "QuadrantInfo.h"
#endif
template<class T>
class T3DimArray
{
public:
T3DimArray();
~T3DimArray();
T3DimArray<T>& operator= (const T3DimArray &arr);
public:
// 将三维分成8个区域
enum QUADRANT
{
kNONE = -1, // 无法确定
kXYZ = 0, // X,Y,Z轴同为正向的区域
k_XYZ = 1, // X轴负向,Y,Z轴同为正向的区域
k_X_YZ = 2, // Z轴正向,X,Y轴同为负向的区域
kX_YZ = 3, // Y轴负向,X,Z轴同为正向的区域
kXY_Z = 4, // Z轴负向,X,Y轴同为正向的区域
k_XY_Z = 5, // Y轴正向,X,Z轴同为负向的区域
k_X_Y_Z = 6, // X,Y,Z轴同为负向的区域
kX_Y_Z = 7, // X轴正向,Y,Z轴同为负向的区域
};
//初始化内存单元
inline void InitArray(int nX = 0, int nY = 0, int nZ = 0, int nXSize = 0,int nYSize = 0,int nZSize = 0);
//设置分区表最小点(分区表原点)
inline void SetOri(int nX, int nY, int nZ);
//添加分区
void AddArray(int nX, int nY, int nZ, int nXSize,int nYSize,int nZSize);
//设置(nX,nY,nZ)单元内容
void SetValue(int nX,int nY,int nZ,const T& val);
//获取(nX,nY,nZ)单元内容
T* GetValue(int nX,int nY,int nZ) const;
//释放
void Release();
//创建
void Create();
//是否创建标记
bool IsCreated()const;
//分区表X方向长度
inline int GetXSize() const;
//分区表Y方向长度
inline int GetYSize() const;
//分区表Z方向长度
inline int GetZSize() const;
//获取原点
inline void GetOrigin(int &nX, int &nY, int &nZ) const;
//获取某一区域索引最小值和最大值(内部索引)
void GetXYZ(int &nMinX, int &nMinY, int &nMinZ, int &nMaxX, int &nMaxY, int &nMaxZ, int nQuadrant) const;
//获取某一区域xyz索引的值(内部索引)
T* GetValue(int nX, int nY, int nZ, int nQuadrant) const;
private:
//释放某一区域的数组资源
void Release(T ***m_pArray, int nQuadrant);
// 根据xyz值创建数组
void CreateArray(T*** &pArr, int nMinX, int nMinY, int nMinZ, int nMaxX, int nMaxY, int nMaxZ);
// 处理根据基点索引和size确定索引值
int GetIndex(int nBaseIndex, int nSize) const;
// 根据xyz值确定区域(不包括在xyz轴上的点)
int GetQuadrant(int nX, int nY, int nZ) const;
// 判断点是否在区域内
bool IsInQuadrant(int nX, int nY, int nZ, int nQuadrant) const;
// 根据xyz获取区域指针
T*** GetQuadrantPtr(int nX, int nY, int nZ) const;
// 获取当前对象的数据
void GetCurData(std::map<int,QuadrantInfo<T> > &data);
// 复制
void Copy(const T3DimArray &arr, int nQuadrant);
private:
int m_nXSize; //分区表X方向长度
int m_nYSize; //分区表Y方向长度
int m_nZSize; //分区表Z方向长度
int m_nXOri; //分区表最小点X坐标
int m_nYOri; //分区表最小点Y坐标
int m_nZOri; //分区表最小点Z坐标
T ***m_pArrayXYZ; //X,Y,Z轴同为正向的区域
T ***m_pArray_XYZ; //X轴负向,Y,Z轴同为正向的区域
T ***m_pArray_X_YZ; //Z轴正向,X,Y轴同为负向的区域
T ***m_pArrayX_YZ; //Y轴负向,X,Z轴同为正向的区域
T ***m_pArrayXY_Z; //Z轴负向,X,Y轴同为正向的区域
T ***m_pArray_XY_Z; //Y轴正向,X,Z轴同为负向的区域
T ***m_pArray_X_Y_Z; //X,Y,Z轴同为负向的区域
T ***m_pArrayX_Y_Z; //X轴正向,Y,Z轴同为负向的区域
bool m_bCreated; //表是否以创建
};
template<class T>
T3DimArray<T>::T3DimArray()
{
m_pArrayXYZ = NULL;
m_pArray_XYZ = NULL;
m_pArray_X_YZ = NULL;
m_pArrayX_YZ = NULL;
m_pArrayXY_Z = NULL;
m_pArray_XY_Z = NULL;
m_pArray_X_Y_Z = NULL;
m_pArrayX_Y_Z = NULL;
m_bCreated = false;
InitArray();
}
template<class T>
T3DimArray<T>::~T3DimArray()
{
if (m_bCreated)
{
Release();
}
}
template<class T>
T3DimArray<T>& T3DimArray<T>::operator=( const T3DimArray &arr )
{
if (!arr.m_bCreated)
{
return *this;
}
if (this == &arr)
{
return *this;
}
// 删除原有资源
if(m_bCreated)
{
Release();
}
// 重建表
m_nXSize = arr.m_nXSize;
m_nYSize = arr.m_nYSize;
m_nZSize = arr.m_nZSize;
m_nXOri = arr.m_nXOri;
m_nYOri = arr.m_nYOri;
m_nZOri = arr.m_nZOri;
Create();
// 复制
Copy(arr, kXYZ);
Copy(arr, k_XYZ);
Copy(arr, k_X_YZ);
Copy(arr, kX_YZ);
Copy(arr, kXY_Z);
Copy(arr, k_XY_Z);
Copy(arr, k_X_Y_Z);
Copy(arr, kX_Y_Z);
return *this;
}
template<class T>
void T3DimArray<T>::InitArray( int nX /*= 0*/, int nY /*= 0*/, int nZ /*= 0*/, int nXSize /*= 0*/,int nYSize /*= 0*/,int nZSize /*= 0*/ )
{
m_nXOri = nX;
m_nYOri = nY;
m_nZOri = nZ;
m_nXSize = nXSize;
m_nYSize = nYSize;
m_nZSize = nZSize;
}
template<class T>
void T3DimArray<T>::SetOri( int nX, int nY, int nZ )
{
m_nXOri = nX;
m_nYOri = nY;
m_nZOri = nZ;
}
template<class T>
void T3DimArray<T>::AddArray( int nX, int nY, int nZ, int nXSize,int nYSize,int nZSize )
{
// 检查区域是否未变化
if (nX == m_nXOri && nY == m_nYOri && nZ == m_nZOri
&& nXSize == m_nXSize && nYSize == m_nYSize && nZSize == m_nZSize)
{
return;
}
// 获得原来的数据
std::map<int,QuadrantInfo<T> > mapOrgin;
GetCurData(mapOrgin);
// 设置新数据
m_nXOri = nX;
m_nYOri = nY;
m_nZOri = nZ;
m_nXSize = nXSize;
m_nYSize = nYSize;
m_nZSize = nZSize;
// 重建表
m_pArrayXYZ = NULL;
m_pArray_XYZ = NULL;
m_pArray_X_YZ = NULL;
m_pArrayX_YZ = NULL;
m_pArrayXY_Z = NULL;
m_pArray_XY_Z = NULL;
m_pArray_X_Y_Z = NULL;
m_pArrayX_Y_Z = NULL;
Create();
// 获得新数据
std::map<int,QuadrantInfo<T> > mapNew;
GetCurData(mapNew);
// 将原有数据存入改变后的容器呢
int nQuadrant = -1;
T*** pOrigin = NULL;
T*** pNew = NULL;
std::map<int,QuadrantInfo<T> >::iterator it1, it2;
for (it1 = mapOrgin.begin(); it1 != mapOrgin.end(); it1++)
{
it2 = mapNew.find(it1->first);
if (it2 != mapNew.end())
{
it2->second.CopyData(it1->second);
}
}
// 删除原有资源
for (it1 = mapOrgin.begin(); it1 != mapOrgin.end(); it1++)
{
it1->second.Delete();
}
}
template<class T>
void T3DimArray<T>::SetValue( int nX,int nY,int nZ,const T& val )
{
T*** pRes = GetQuadrantPtr(nX, nY, nZ);
if (pRes != NULL)
{
pRes[abs(nX) - 1][abs(nY) - 1][abs(nZ) - 1] = val;
}
}
template<class T>
T* T3DimArray<T>::GetValue( int nX,int nY,int nZ ) const
{
T* pRet = NULL;
T*** pRes = GetQuadrantPtr(nX, nY, nZ);
if (pRes != NULL)
{
pRet = &pRes[abs(nX) - 1][abs(nY) - 1][abs(nZ) - 1];
}
return pRet;
}
template<class T>
void T3DimArray<T>::Release()
{
m_bCreated = false;
Release(m_pArrayXYZ, kXYZ);
Release(m_pArray_XYZ, k_XYZ);
Release(m_pArray_X_YZ, k_X_YZ);
Release(m_pArrayX_YZ, kX_YZ);
Release(m_pArrayXY_Z, kXY_Z);
Release(m_pArray_XY_Z, k_XY_Z);
Release(m_pArray_X_Y_Z, k_X_Y_Z);
Release(m_pArrayX_Y_Z, kX_Y_Z);
m_pArrayXYZ = NULL;
m_pArray_XYZ = NULL;
m_pArray_X_YZ = NULL;
m_pArrayX_YZ = NULL;
m_pArrayXY_Z = NULL;
m_pArray_XY_Z = NULL;
m_pArray_X_Y_Z = NULL;
m_pArrayX_Y_Z = NULL;
}
template<class T>
void T3DimArray<T>::Create()
{
m_bCreated = true;
// 按各分区创建数组
int nMinX = 0, nMinY = 0, nMinZ = 0; // 某区域索引最小值
int nMaxX = 0, nMaxY = 0, nMaxZ = 0; // 某区域索引最大值
// X,Y,Z轴同为正向的区域
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, kXYZ);
CreateArray(m_pArrayXYZ, nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ);
// X轴负向,Y,Z轴同为正向的区域
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, k_XYZ);
CreateArray(m_pArray_XYZ, nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ);
// Z轴正向,X,Y轴同为负向的区域
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, k_X_YZ);
CreateArray(m_pArray_X_YZ, nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ);
// Y轴负向,X,Z轴同为正向的区域
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, kX_YZ);
CreateArray(m_pArrayX_YZ, nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ);
// Z轴负向,X,Y轴同为正向的区域
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, kXY_Z);
CreateArray(m_pArrayXY_Z, nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ);
// Y轴正向,X,Z轴同为负向的区域
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, k_XY_Z);
CreateArray(m_pArray_XY_Z, nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ);
// X,Y,Z轴同为负向的区域
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, k_X_Y_Z);
CreateArray(m_pArray_X_Y_Z, nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ);
// X轴正向,Y,Z轴同为负向的区域
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, kX_Y_Z);
CreateArray(m_pArrayX_Y_Z, nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ);
}
template<class T>
int T3DimArray<T>::GetXSize() const
{
return m_nXSize;
}
template<class T>
int T3DimArray<T>::GetYSize() const
{
return m_nYSize;
}
template<class T>
int T3DimArray<T>::GetZSize() const
{
return m_nZSize;
}
template<class T>
void T3DimArray<T>::GetOrigin( int &nX, int &nY, int &nZ ) const
{
nX = m_nXOri;
nY = m_nYOri;
nZ = m_nZOri;
}
template<class T>
void T3DimArray<T>::Release(T ***m_pArray, int nQuadrant)
{
if (m_pArray != NULL)
{
int nMinX = 0, nMinY = 0, nMinZ = 0; // 某区域索引最小值
int nMaxX = 0, nMaxY = 0, nMaxZ = 0; // 某区域索引最大值
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, nQuadrant);
// 删除z
for (int x = nMinX; x < nMaxX + 1; x++)
{
for (int y = nMinY; y < nMaxY + 1; y++)
{
delete[] m_pArray[x][y];
}
}
// 删除y
for (x = nMinX; x < nMaxX + 1; x++)
{
delete[] m_pArray[x];
}
// 删除x
delete[] m_pArray;
}
}
template<class T>
void T3DimArray<T>::GetXYZ(int &nMinX, int &nMinY, int &nMinZ, int &nMaxX, int &nMaxY, int &nMaxZ, int nQuadrant) const
{
// 其中最大值XYZ表示某区域索引最大值,最小值xyz表示在某区域的索引的最小值
nMinX = 0;
nMinY = 0;
nMinZ = 0;
nMaxX = 0;
nMaxY = 0;
nMaxZ = 0;
switch(nQuadrant)
{
case kXYZ: // X,Y,Z轴同为正向的区域
{
int nX = GetIndex(m_nXOri, m_nXSize), nY = GetIndex(m_nYOri, m_nYSize), nZ = GetIndex(m_nZOri, m_nZSize); // 长方体顶面右上点
if (m_nXOri >= 0 && m_nYOri >= 0 && m_nZOri >= 0) // 长方体底面左下点在该区域内
{
nMinX = m_nXOri;
nMinY = m_nYOri;
nMinZ = m_nZOri;
nMaxX = nX;
nMaxY = nY;
nMaxZ = nZ;
}
else if (nX >= 0 && nY >= 0 && nZ >= 0) // 长方体顶面右上点在该区域
{
nMaxX = nX;
nMaxY = nY;
nMaxZ = nZ;
if (m_nXOri < 0)
{
nMinX = 0;
}
else
{
nMinX = m_nXOri;
}
if (m_nYOri < 0)
{
nMinY = 0;
}
else
{
nMinY = m_nYOri;
}
if (m_nZOri < 0)
{
nMinZ = 0;
}
else
{
nMinZ = m_nZOri;
}
}
break;
}
case k_XYZ: // X轴负向,Y,Z轴同为正向的区域
{
int nX1 = m_nXOri, nY1 = GetIndex(m_nYOri, m_nYSize), nZ1 = GetIndex(m_nZOri, m_nZSize); // 长方体顶面左上点
int nX2 = GetIndex(m_nXOri, m_nXSize), nY2 = m_nYOri, nZ2 = m_nZOri; // 长方体底面右下点
if (nX2 <= 0 && nY2 >= 0 && nZ2 >= 0)
{
nMinX = abs(nX2);
nMinY = abs(nY2);
nMinZ = abs(nZ2);
nMaxX = abs(nX1);
nMaxY = abs(nY1);
nMaxZ = abs(nZ1);
}
else if (nX1 <= 0 && nY1 >= 0 && nZ1 >= 0)
{
nMaxX = abs(nX1);
nMaxY = abs(nY1);
nMaxZ = abs(nZ1);
if (nX2 > 0)
{
nMinX = 0;
}
else
{
nMinX = abs(nX2);
}
if (nY2 < 0)
{
nMinY = 0;
}
else
{
nMinY = nY2;
}
if (nZ2 < 0)
{
nMinZ = 0;
}
else
{
nMinZ = nZ2;
}
}
break;
}
case k_X_YZ: // Z轴正向,X,Y轴同为负向的区域
{
int nX1 = GetIndex(m_nXOri, m_nXSize), nY1 = GetIndex(m_nYOri, m_nYSize), nZ1 = m_nZOri; // 长方体底面右上点
int nX2 = m_nXOri, nY2 = m_nYOri, nZ2 = GetIndex(m_nZOri, m_nZSize); // 长方体顶面左下点
if (nX1 <= 0 && nY1 <= 0 && nZ1 >= 0)
{
nMinX = abs(nX1);
nMinY = abs(nY1);
nMinZ = abs(nZ1);
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
}
else if (nX2 <= 0 && nY2 <= 0 && nZ2 >= 0)
{
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
if (nX1 > 0)
{
nMinX = 0;
}
else
{
nMinX = abs(nX1);
}
if (nY1 > 0)
{
nMinY = 0;
}
else
{
nMinY = abs(nY1);
}
if (nZ1 < 0)
{
nMinZ = 0;
}
else
{
nMinZ = nZ1;
}
}
break;
}
case kX_YZ: // Y轴负向,X,Z轴同为正向的区域
{
int nX1 = m_nXOri, nY1 = GetIndex(m_nYOri, m_nYSize), nZ1 = m_nZOri; // 长方体底面左上点
int nX2 = GetIndex(m_nXOri, m_nXSize), nY2= m_nYOri, nZ2 = GetIndex(m_nZOri, m_nZSize); // 长方体顶面右下点
if (nX1 >= 0 && nY1 <= 0 && nZ1 >= 0)
{
nMinX = nX1;
nMinY = nY1;
nMinZ = nZ1;
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
}
else if (nX2 >= 0 && nY2 <= 0 && nZ2 >= 0)
{
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
if (nX1 < 0)
{
nMinX = 0;
}
else
{
nMinX = nX1;
}
if (nY1 > 0)
{
nMinY = 0;
}
else
{
nMinY = abs(nY1);
}
if (nZ1 < 0)
{
nMinZ = 0;
}
else
{
nMinZ = nZ1;
}
}
break;
}
case kXY_Z: // Z轴负向,X,Y轴同为正向的区域
{
int nX1 = m_nXOri, nY1 = m_nYOri, nZ1 = GetIndex(m_nZOri, m_nZSize); // 长方体顶面左下点
int nX2 = GetIndex(m_nXOri, m_nXSize), nY2 = GetIndex(m_nYOri, m_nYSize), nZ2 = m_nZOri; // 长方体底面右下点
if (nX1 >= 0 && nY1 >= 0 && nZ1 <= 0)
{
nMinX = abs(nX1);
nMinY = abs(nY1);
nMinZ = abs(nZ1);
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
}
else if (nX2 >= 0 && nY2 >= 0 && nZ2 <= 0)
{
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
if (nX1 < 0)
{
nMinX = 0;
}
else
{
nMinX = nX1;
}
if (nY1 < 0)
{
nMinY = 0;
}
else
{
nMinY = nY1;
}
if (nZ1 > 0)
{
nMinZ = 0;
}
else
{
nMinZ = abs(nZ1);
}
}
break;
}
case k_XY_Z: // Y轴正向,X,Z轴同为负向的区域
{
int nX1 = m_nXOri, nY1 = GetIndex(m_nYOri, m_nYSize), nZ1 = GetIndex(m_nZOri, m_nZSize); // 长方体顶面左上点
int nX2 = GetIndex(m_nXOri, m_nXSize), nY2 = m_nYOri, nZ2 = m_nZOri; // 长方体底面右下点
if (nX1 >= 0 && nY1 <= 0 && nZ1 <= 0)
{
nMinX = abs(nX1);
nMinY = abs(nY1);
nMinZ = abs(nZ1);
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
}
else if (nX2 >= 0 && nY2 <= 0 && nZ2 <= 0)
{
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
if (nX1 < 0)
{
nMinX = 0;
}
else
{
nMinX = abs(nX1);
}
if (nY1 > 0)
{
nMinY = 0;
}
else
{
nMinY = abs(nY1);
}
if (nZ1 > 0)
{
nMinZ = 0;
}
else
{
nMinZ = abs(nZ1);
}
}
break;
}
case k_X_Y_Z: // X,Y,Z轴同为负向的区域
{
int nX1 = GetIndex(m_nXOri, m_nXSize), nY1 = GetIndex(m_nYOri, m_nYSize), nZ1 = GetIndex(m_nZOri, m_nZSize); // 长方体顶面右上点
int nX2 = m_nXOri, nY2 = m_nYOri, nZ2 = m_nZOri; // 长方体底面左下点
if (nX1 <= 0 && nY1 <= 0 && nZ1 <= 0)
{
nMinX = abs(nX1);
nMinY = abs(nY1);
nMinZ = abs(nZ1);
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
}
else if (nX2 <= 0 && nY2 <= 0 && nZ2 <= 0)
{
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
if (nX1 > 0)
{
nMinX = 0;
}
else
{
nMinX = abs(nX1);
}
if (nY1 > 0)
{
nMinY = 0;
}
else
{
nMinY = abs(nY1);
}
if (nZ1 > 0)
{
nMinZ = 0;
}
else
{
nMinZ = abs(nZ1);
}
}
break;
}
case kX_Y_Z: // X轴正向,Y,Z轴同为负向的区域
{
int nX1 = m_nXOri, nY1 = GetIndex(m_nYOri, m_nYSize), nZ1 = GetIndex(m_nZOri, m_nZSize); // 长方体顶面左上点
int nX2 = GetIndex(m_nXOri, m_nXSize), nY2 = m_nYOri, nZ2 = m_nZOri; // 长方体底面右下点
if (nX1 >= 0 && nY1 <= 0 && nZ1 <= 0)
{
nMinX = abs(nX1);
nMinY = abs(nY1);
nMinZ = abs(nZ1);
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
}
else if (nX2 >= 0 && nY2 <= 0 && nZ2 <= 0)
{
nMaxX = abs(nX2);
nMaxY = abs(nY2);
nMaxZ = abs(nZ2);
if (nX1 < 0)
{
nMinX = 0;
}
else
{
nMinX = abs(nX1);
}
if (nY1 > 0)
{
nMinY = 0;
}
else
{
nMinY = abs(nY1);
}
if (nZ1 > 0)
{
nMinZ = 0;
}
else
{
nMinZ = abs(nZ1);
}
}
break;
}
default:
{
break;
}
}
}
template<class T>
void T3DimArray<T>::CreateArray(T*** &pArr, int nMinX, int nMinY, int nMinZ, int nMaxX, int nMaxY, int nMaxZ)
{
pArr = NULL;
if (nMaxZ - nMinZ < 0 || nMaxY - nMinY < 0 || nMaxX - nMinX < 0)
{
return;
}
pArr = new T**[nMaxX + 1];
for (int i = 0; i < nMaxX + 1; i++) // 初始化指针
{
pArr[i] = NULL;
}
for (int x = nMinX; x < nMaxX + 1; x++)
{
pArr[x] = new T*[nMaxY + 1];
for(i = 0; i < nMaxY + 1; i++) // 初始化指针
{
pArr[x][i] = NULL;
}
}
for (x = nMinX; x < nMaxX + 1; x++)
{
for (int y = nMinY; y < nMaxY + 1; y++)
{
pArr[x][y] = new T[nMaxZ + 1];
}
}
}
template<class T>
int T3DimArray<T>::GetIndex(int nBaseIndex, int nSize) const
{
int nIndex = 0;
if (nBaseIndex < 0 && abs(nBaseIndex) + 1 < nSize)
{
nIndex = nBaseIndex + nSize - 1; // 减2因有两个为0的索引(分别在两个区域内) 考虑到扩充时原表的索引需完全在新表中的误差 还是减1
}
else if (nBaseIndex < 0 && abs(nBaseIndex) >= nSize)
{
nIndex = nBaseIndex + nSize + 1;
}
else
{
nIndex = nBaseIndex + nSize - 1;
}
return nIndex;
}
template<class T>
int T3DimArray<T>::GetQuadrant(int nX, int nY, int nZ) const
{
if (nX > 0 && nY > 0 && nZ > 0)
{
return kXYZ;
}
if (nX < 0 && nY > 0 && nZ > 0)
{
return k_XYZ;
}
if (nX < 0 && nY < 0 && nZ > 0)
{
return k_X_YZ;
}
if (nX > 0 && nY < 0 && nZ > 0)
{
return kX_YZ;
}
if (nX > 0 && nY > 0 && nZ < 0)
{
return kXY_Z;
}
if (nX < 0 && nY > 0 && nZ < 0)
{
return k_XY_Z;
}
if (nX < 0 && nY < 0 && nZ < 0)
{
return k_X_Y_Z;
}
if (nX > 0 && nY < 0 && nZ < 0)
{
return kX_Y_Z;
}
return kNONE;
}
template<class T>
bool T3DimArray<T>::IsInQuadrant(int nX, int nY, int nZ, int nQuadrant) const
{
nX = abs(nX) - 1;
nY = abs(nY) - 1;
nZ = abs(nZ) - 1;
int nMinX = 0, nMinY = 0, nMinZ = 0;
int nMaxX = 0, nMaxY = 0, nMaxZ = 0;
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, nQuadrant);
if (nMinX <= nX && nMaxX >= nX
&& nMinY <= nY && nMaxY >= nY
&& nMinZ <= nZ && nMaxZ >= nZ)
{
return true;
}
return false;
}
template<class T>
T*** T3DimArray<T>::GetQuadrantPtr(int nX, int nY, int nZ) const
{
T*** pRet = NULL;
int nQuarant = GetQuadrant(nX, nY, nZ);
switch(nQuarant)
{
case kXYZ:
{
if (IsInQuadrant(nX, nY, nZ , kXYZ))
{
pRet = m_pArrayXYZ;
}
break;
}
case k_XYZ:
{
if (IsInQuadrant(nX, nY, nZ , k_XYZ))
{
pRet = m_pArray_XYZ;
}
break;
}
case k_X_YZ:
{
if (IsInQuadrant(nX, nY, nZ , k_X_YZ))
{
pRet = m_pArray_X_YZ;
}
break;
}
case kX_YZ:
{
if (IsInQuadrant(nX, nY, nZ , kX_YZ))
{
pRet = m_pArrayX_YZ;
}
break;
}
case kXY_Z:
{
if (IsInQuadrant(nX, nY, nZ , kXY_Z))
{
pRet = m_pArrayXY_Z;
}
break;
}
case k_XY_Z:
{
if (IsInQuadrant(nX, nY, nZ , k_XY_Z))
{
pRet = m_pArray_XY_Z;
}
break;
}
case k_X_Y_Z:
{
if (IsInQuadrant(nX, nY, nZ , k_X_Y_Z))
{
pRet = m_pArray_X_Y_Z;
}
break;
}
case kX_Y_Z:
{
if (IsInQuadrant(nX, nY, nZ , kX_Y_Z))
{
pRet = m_pArrayX_Y_Z;
}
break;
}
default:
{
break;
}
}
return pRet;
}
template<class T>
void T3DimArray<T>::GetCurData(std::map<int,QuadrantInfo<T> > &data)
{
data.clear();
int nMinX = 0, nMinY = 0, nMinZ = 0; // 某区域索引最小值
int nMaxX = 0, nMaxY = 0, nMaxZ = 0; // 某区域索引最大值
QuadrantInfo<T> info;
if (m_pArrayXYZ != NULL)
{
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, kXYZ);
info.SetMinXYZ(nMinX, nMinY, nMinZ);
info.SetMaxXYZ(nMaxX, nMaxY, nMaxZ);
info.SetPtr(m_pArrayXYZ);
data.insert(std::make_pair(kXYZ, info));
}
if (m_pArray_XYZ != NULL)
{
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, k_XYZ);
info.SetMinXYZ(nMinX, nMinY, nMinZ);
info.SetMaxXYZ(nMaxX, nMaxY, nMaxZ);
info.SetPtr(m_pArray_XYZ);
data.insert(std::make_pair(k_XYZ, info));
}
if (m_pArray_X_YZ != NULL)
{
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, k_X_YZ);
info.SetMinXYZ(nMinX, nMinY, nMinZ);
info.SetMaxXYZ(nMaxX, nMaxY, nMaxZ);
info.SetPtr(m_pArray_X_YZ);
data.insert(std::make_pair(k_X_YZ, info));
}
if (m_pArrayX_YZ != NULL)
{
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, kX_YZ);
info.SetMinXYZ(nMinX, nMinY, nMinZ);
info.SetMaxXYZ(nMaxX, nMaxY, nMaxZ);
info.SetPtr(m_pArrayX_YZ);
data.insert(std::make_pair(kX_YZ, info));
}
if (m_pArrayXY_Z != NULL)
{
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, kXY_Z);
info.SetMinXYZ(nMinX, nMinY, nMinZ);
info.SetMaxXYZ(nMaxX, nMaxY, nMaxZ);
info.SetPtr(m_pArrayXY_Z);
data.insert(std::make_pair(kXY_Z, info));
}
if (m_pArray_XY_Z != NULL)
{
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, k_XY_Z);
info.SetMinXYZ(nMinX, nMinY, nMinZ);
info.SetMaxXYZ(nMaxX, nMaxY, nMaxZ);
info.SetPtr(m_pArray_XY_Z);
data.insert(std::make_pair(k_XY_Z, info));
}
if (m_pArray_X_Y_Z != NULL)
{
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, k_X_Y_Z);
info.SetMinXYZ(nMinX, nMinY, nMinZ);
info.SetMaxXYZ(nMaxX, nMaxY, nMaxZ);
info.SetPtr(m_pArray_X_Y_Z);
data.insert(std::make_pair(k_X_Y_Z, info));
}
if (m_pArrayX_Y_Z != NULL)
{
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, kX_Y_Z);
info.SetMinXYZ(nMinX, nMinY, nMinZ);
info.SetMaxXYZ(nMaxX, nMaxY, nMaxZ);
info.SetPtr(m_pArrayX_Y_Z);
data.insert(std::make_pair(kX_Y_Z, info));
}
}
template<class T>
void T3DimArray<T>::Copy( const T3DimArray &arr, int nQuadrant )
{
T*** pRes = NULL;
switch(nQuadrant)
{
case kXYZ:
{
pRes = m_pArrayXYZ;
break;
}
case k_XYZ:
{
pRes = m_pArray_XYZ;
break;
}
case kX_YZ:
{
pRes = m_pArrayX_YZ;
break;
}
case k_X_YZ:
{
pRes = m_pArray_X_YZ;
break;
}
case kXY_Z:
{
pRes = m_pArrayXY_Z;
break;
}
case k_XY_Z:
{
pRes = m_pArray_XY_Z;
break;
}
case kX_Y_Z:
{
pRes = m_pArrayX_Y_Z;
break;
}
case k_X_Y_Z:
{
pRes = m_pArray_X_Y_Z;
break;
}
default:
{
return;
}
}
int nMinX = 0, nMinY = 0, nMinZ = 0; // 某区域索引最小值
int nMaxX = 0, nMaxY = 0, nMaxZ = 0; // 某区域索引最大值
GetXYZ(nMinX, nMinY, nMinZ, nMaxX, nMaxY, nMaxZ, nQuadrant);
for (int x = nMinX; x <= nMaxX; x++)
{
for(int y = nMinY; y <= nMaxY; y++)
{
for (int z = nMinZ; z <= nMaxZ; z++)
{
T* pT = arr.GetValue(x, y, z, nQuadrant);
if (pT != NULL)
{
pRes[x][y][z] = *pT;
}
}
}
}
}
template<class T>
T* T3DimArray<T>::GetValue( int nX, int nY, int nZ, int nQuadrant ) const
{
T*** pRes = NULL;
switch(nQuadrant)
{
case kXYZ:
{
pRes = m_pArrayXYZ;
break;
}
case k_XYZ:
{
pRes = m_pArray_XYZ;
break;
}
case kX_YZ:
{
pRes = m_pArrayX_YZ;
break;
}
case k_X_YZ:
{
pRes = m_pArray_X_YZ;
break;
}
case kXY_Z:
{
pRes = m_pArrayXY_Z;
break;
}
case k_XY_Z:
{
pRes = m_pArray_XY_Z;
break;
}
case kX_Y_Z:
{
pRes = m_pArrayX_Y_Z;
break;
}
case k_X_Y_Z:
{
pRes = m_pArray_X_Y_Z;
break;
}
default:
{
return NULL;
}
}
T* pRet = NULL;
if (pRes != NULL)
{
pRet = &pRes[nX][nY][nZ];
}
return pRet;
}
//是否创建标记
template<class T>
bool T3DimArray<T>::IsCreated()const
{
return m_bCreated;
}
#endif