我正在制作一个程序,您可以在其中单击地图以查看其周围区域的“特写视图”,例如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倍的平方根的图像。

07-27 18:02