使用CAPL语言写的一个二维查表实现函数,按需取用。
/*@!Encoding:936*/
includes
{
}
variables
{
struct _myTable
{
long _tableIndexXCount,_tableIndexYCount;
//x轴座标点
double _tableIndexX[30];//最大支持30个点
//y轴座标点
double _tableIndexY[30];//最大支持30个点
//查表值
double _tableValue[30][30];
int _subTableIndex[2];
double _subTableIndexValue[2],_subTableValue[2];
};
//初始化表格在这里进行
struct _myTable tblTest = {
3,4,//x轴长度,y轴长度,长度不能超过30
{0,2,4},//x轴值表
{0,2,4,8},//y轴值表
{
{0,1,2},//第一行值
{0,2,4},//第二行值
{0,4,8},//第三行值
{0,8,16}//第……行值,注意最后一行大括号后面没有逗号
}
};
double xValue,yValue;//查表的X位置和Y位置
}
on start
{
//调用查表值如下
write("value from table is: %f", getFromTable(tblTest,xValue,yValue));
}
double getFromTable (long ElementCounts,double IndexValue,double TableIndexArray[],double TableValueArray[])
{
//本函数可以完成一个一维查表的操作
int rowPointCount,i;
double WorkPoint;
double tempFun;
rowPointCount=ElementCounts;
WorkPoint=IndexValue;
//查找工作点区间
if (WorkPoint<=TableIndexArray[0])//工作点在下界下方
{
return TableValueArray[0];
}
if (WorkPoint>=TableIndexArray[rowPointCount-1])//工作点在上界上方
{
return TableValueArray[rowPointCount-1];
}
for (i=0;i<rowPointCount-1;++i)//检测是否落在index后的一个区域内
{
if (WorkPoint==TableIndexArray[i])//如果工作点在区间分界点上
{
return TableValueArray[i];
}
if (WorkPoint>TableIndexArray[i])//如果工作点大于区域下界
{
if (WorkPoint<TableIndexArray[i+1])//并且工作点小于区域上界
{
tempFun=TableValueArray[i]+(TableValueArray[i+1]-TableValueArray[i])*(WorkPoint-TableIndexArray[i])/(TableIndexArray[i+1]-TableIndexArray[i]);
return tempFun;
}
}
}
}
int getInterPX(long tableIndexXCount,double tableIndex[],double &xPoint, int _subTableIndex[],double _subTableIndexValue[])
{
/*
如果查表未出现程序性错误,则返回0,否则返回-1
*/
int i;
int flg;//如果成功界定xPoint位于某一区间,则该flg为0,否则为-1
if(tableIndexXCount < 2)//如果数组数量小于2,查找无效
return -1;
if(xPoint <= tableIndex[0])
{
xPoint = tableIndex[0];
_subTableIndex[0] = 0;_subTableIndexValue[0] = tableIndex[0];
_subTableIndex[1] = 1;_subTableIndexValue[1] = tableIndex[1];
return 0;
}
if(xPoint >= tableIndex[tableIndexXCount - 1])
{
xPoint = tableIndex[tableIndexXCount - 1];
_subTableIndex[0] = tableIndexXCount - 2;_subTableIndexValue[0] = tableIndex[tableIndexXCount - 2];
_subTableIndex[1] = tableIndexXCount - 1;_subTableIndexValue[1] = tableIndex[tableIndexXCount - 1];
return 0;
}
flg = -1;
for(i = 0;i<tableIndexXCount - 1;i++)
{
if(xPoint >= tableIndex[i])//如果xPoint不小于本区间下界
if(xPoint < tableIndex[i+1])//并且xPoint小于本区间上界
{
//则认为xPoint落在本区间内
_subTableIndex[0] = i;_subTableIndexValue[0] = tableIndex[i];
_subTableIndex[1] = i+1;_subTableIndexValue[1] = tableIndex[i+1];
flg = 0; break;
}
}
if(flg == -1)
{
xPoint = tableIndex[0];
_subTableIndex[0] = 0;_subTableIndexValue[0] = tableIndex[0];
_subTableIndex[1] = 1;_subTableIndexValue[1] = tableIndex[1];
}
return 0;
}
double getFromTable(struct _myTable tbl,double xValue,double yValue)
{
if(-1 == getInterPX(tbl._tableIndexYCount,tbl._tableIndexY,yValue,tbl._subTableIndex,tbl._subTableIndexValue))
{
return 0;
}
tbl._subTableValue[0] = GetFromTable(tbl._tableIndexXCount,xValue,tbl._tableIndexX,tbl._tableValue[tbl._subTableIndex[0]]);
tbl._subTableValue[1] = GetFromTable(tbl._tableIndexXCount,xValue,tbl._tableIndexX,tbl._tableValue[tbl._subTableIndex[1]]);
return GetFromTable(2,yValue,tbl._subTableIndexValue,tbl._subTableValue);
}