用来生成数据查找表,比如 要快速找到点p(x,y)的周围n个点,我们需要计算出这些点的下标,但其实这些可以预先计算好,通过查表来完成的。
好吧,其实是某代码里有这个,但是查找表文件不见了,于是自己做了一个生成工具,也不复杂
代码如下:
#include <iostream>
#include <fstream>
using namespace std;
// 获取距目标点distance远的一圈点的边长
inline int GetSideLen(int distance)
{
return distance * 2 + 1;
}
// 获取矩形一圈的长度
int GetRectLen(int sideLen)
{
return sideLen * 4 - 4;
}
struct Point{
char x;
char y;
};
int main() {
cout << "此工具用以生成二维数组的查找表,只支持最大长度到960"<< endl;
cout << "请输入长度:";
int len = 960;
cin >> len;
len = len <= 0 ? 960 : len;
len = len > 960 ? 960 : len;
Point* table = new Point[len];
int tableIdx = 0;
while (true)
{
for (int i = 0; i < len; i++)
{
int l = GetSideLen(i);
int p = GetRectLen(l);
int half_l = l / 2;
int l2 = l - 1;
for (int idx = 0; idx < p; idx++)
{
if (tableIdx >= len)
{
goto END;
}
int sideIdx = idx / l2;
int mod = idx % l2;
Point point;
switch (sideIdx)
{
case 0:
point.x = mod - half_l;
point.y = -half_l;
break;
case 1:
point.x = half_l;
point.y = mod - half_l;
break;
case 2:
point.x = -(mod - half_l);
point.y = half_l;
break;
case 3:
point.x = -half_l;
point.y = -(mod - half_l);
break;
}
table[tableIdx] = point;
cout << "距离:" << i << ", 内部序号:" << idx << ", x:" << (int)point.x << ", y:" << (int)point.y << endl;
++tableIdx;
}
cout << endl;
}
}
END:
ofstream of("searchTable.tbl");
of.write((const char*)table, len*2);
of.flush();
of.close();
ofstream of2("searchTable.txt");
for (int i = 0; i < len; i++)
{
of2 <<"point:" << (int)table[i].x <<","<< (int)table[i].y << endl;
}
of2.flush();
of2.close();
system("pause");
return 0;
}
测试可用:
那怎么用呢:
比如要找p点周围100个点:
for(int i=0;i<100;i++)
{
int x = p.x + table[i].x;
int y = p.y + table[i].y;
Point temp = Map[x,y];
}
这样就找到了对应的点temp了
事实上,查找表的顺序是从中心一圈一圈的绕出去的,记录每个点相对中心的位置。