/**
* 功能: 根据一维数组的索引,获取N维数组的坐标。
* @param nIndex
* @return
* @return int[]
* @since 创建日期:2022年9月17日,最后一次修改日期:2022年9月17日
* @author 李锋
*/
public int[] getCoordinateFromIndex(int nIndex) {
int[] iResultArray = new int[m_DimensionMax.length];
int tmp = nIndex;
for(int i = 0; i< m_DimensionMax.length; ++i) {
int sum = 1;
for(int j = i+1; j < m_DimensionMax.length; ++j) {
sum *= m_DimensionMax[j];
}
iResultArray[i] = tmp / sum;
tmp = tmp - sum * iResultArray[i];
}
return iResultArray;
}
/**
* 功能: 获取用一维数组表示的任意N维数组的定位
* @param dimensionValueArgi
* @return void
* @since 创建日期:2022年9月14日,最后一次修改日期:2022年9月15日
* @author 李锋
*/
public int getIndexFromCoordinate(int... dimensionValueArgs)
{
/*
三维数组 a[3][2][5] => 用一维数字 m_DataArray[3*2*5] 表示。
假设三维数组 a[3][2][5] 3行2列5面数组 用 a[x_max][y_max][z_max] 代替,
那么 x_max = 3, y_max = 2, z_max = 5,那么
数组 m_DimensionMax = {x_max,y_max,z_max}
即:
dimensionValueArgi[0] = x_max = 3
dimensionValueArgi[1] = y_max = 2
dimensionValueArgi[1] = z_max = 5
所有元素可以看作 三个数列相加,数列名为 a[0],a[1],a[2]
a[0] 总数 10个
a[1] 总数 10个
a[2] 总数 10个
例子:getFixedPsition(0,1,2) x,y,z
第一列第一个无素是: a[0][0][0] => (y+1) * (z+1) => m_DataArray[ (x * y_max * z_max) + y+1) * (z+1) - 1] => m_DataArray[0]
第二列第一个元素是: a[1][0][0] => m_DataArray[ (x * y_max * z_max) + (y+1) * (z+1) - 1]
=> a[ ( 1 * 2 * 5) + (0+1) * (0+1) ] => m_DataArray[10];
错:
第二列第二个元素是: a[1][1][0] => m_DataArray[ ( x * y_max * z_max) + (y+1) * (z+1) - 1]
=> a[ ( 1 * 2 * 5) + (1+1) * (0+1) - 1] => m_DataArray[11];
错误: 计算结果是:m_DataArray[11],正确是 m_DataArray[16] = 11 + 5
最后:
a[x][y][z] => m_DataArray[ (x * y_max * z_max) + (y+1) * (z+1) - 1]
=> m_DataArray[ (dimensionValueArgi[0] * y_max * z_max) + ( dimensionValueArgi[1] + 1) * (dimensionValueArgi[2] + 1) - 1]
*/
/*
//时间问题,太晚了,这一版本暂时不进行异常处理
int i数列总数 = 1;
for(int i = 1; i < m_DimensionMax.length; ++i) {
i数列总数 *= m_DimensionMax[i];
}
int sum1 = dimensionValueArgi[0] * i数列总数;
int sum2 = 1;
for(int i = 1; i < dimensionValueArgi.length; ++i) {
sum2 *= (1 + dimensionValueArgi[i]);
}
return sum1 + sum2 - 1;
*/
int sum = 0;
for(int i = dimensionValueArgs.length - 1; i >= 0; --i) {
int n = 1;
for(int j = i + 1; j < m_DimensionMax.length; j++)
{
n *= m_DimensionMax[j];
}
sum += n * dimensionValueArgs[i];
}
return sum;
}
/**
* 功能: 根据一维数组的索引,获取N维数组的坐标。
* @param nIndex
* @return
* @return int[]
* @since 创建日期:2022年9月17日,最后一次修改日期:2022年9月17日
* @author 李锋
*/
public int[] getCoordinateFromIndex(int nIndex) {
int[] iResultArray = new int[m_DimensionMax.length];
int tmp = nIndex;
for(int i = 0; i< m_DimensionMax.length; ++i) {
int sum = 1;
for(int j = i+1; j < m_DimensionMax.length; ++j) {
sum *= m_DimensionMax[j];
}
iResultArray[i] = tmp / sum;
tmp = tmp - sum * iResultArray[i];
}
return iResultArray;
}