我正在制作一个程序,您可以在其中单击地图以查看其周围区域的“特写视图”,例如Google Maps。
当用户单击地图时,它将获得其单击位置的X和Y坐标。
假设我有一个布尔数组,其中包含这些特写视图图片的位置:
public static boolean[][] view_set=new boolean[Map.width][Map.height];
//The array of where pictures are. The map has a width of 3313, and a height of 3329.
该程序在文件夹中进行搜索,在该文件夹中,图像被命名为在地图上拍摄位置的X和Y坐标。该文件夹包含以下图像(以及更多图像,但我仅列出五个):
2377,1881.jpg, 2384,1980.jpg, 2389,1923.jpg, 2425,1860.jpg, 2475,1900.jpg
这意味着:
view_set[2377][1881]=true;
view_set[2384][1980]=true;
view_set[2389][1923]=true;
view_set[2425][1860]=true;
view_set[2475][1900]=true;
如果用户单击例如2377,1882的X和Y,那么我需要该程序找出最接近的图像(在这种情况下,答案是2377,1881)。
任何帮助,将不胜感激,
谢谢。
最佳答案
给定用户单击的位置,您可以使用Dijkstra搜索来搜索最近的图像。
基本上,您开始在单击位置周围越来越大的矩形中搜索图像。当然,您只需要搜索这些矩形的边界,因为您已经搜索了主体。找到图像后,该算法应立即停止。
伪代码:
int size = 0
Point result = default
while(result == default)
result = searchRectangleBoundary(size++, pointClicked)
function Point searchRectangleBoundary(int size, Point centre)
{
point p = {centre.X - size, centre.Y - size}
for i in 0 to and including size
{
if(view_set[p.X + i][p.Y]) return { p.X + i, p.Y}
if(view_set[p.X][p.Y + i]) return { p.X, p.Y + i}
if(view_set[p.X + i][p.Y + size]) return { p.X + i, p.Y + size}
if(view_set[p.X + size][p.Y + i]) return { p.X + size, p.Y + i}
}
return default
}
请注意,为了简洁起见,我没有进行范围检查。
有一个小问题,但是根据应用程序的不同,可能不是问题。它不使用欧式距离,而是使用曼哈顿度量标准。因此,它不一定找到最接近的图像,而是最多找到2倍的平方根的图像。