从最低点距离的区域最低点、距离、区域

2023-09-11 05:04:12 作者:你叼个瘠薄 °

我想找到一个点(P2)中具有最小距离为一个点(P1)禁区。的区域是建立均匀的像素,它是不完全成形,它不一定是凸的。这基本上达到从最短路径的区域的问题。

I am trying to find a point (P2) in a closed area that has the minimum distance to a point (P1). The area is built of homogenous pixels, it is not shaped perfectly and it is not necessarily convex. This is basically a problem of reaching an area from the shortest path.

整个空间被存储在存储器位图的形式。什么是找到P2最好的方法是什么?我应该去与随机搜索(优化)的方法呢?优化方法不能给出确切的最低,但它们比暴力破解的区域的每个像素更快。我需要在几秒钟内完成上千这些决定。

The whole space is a stored in the form of a bitmap in the memory. What is the best method to find P2? Should I go with random search (optimization) methods? Optimization methods do not give the exact minimum but they are faster than brute forcing every pixel of the area. I need to perform thousands of these decisions in a few seconds.

的疯丫头,MINY,MAXX,该地区的MAXY是可用的。

The MinX,MinY,MaxX,MaxY of the area is available.

感谢。

推荐答案

下面是我的code,它使用离散坐标是一个独立的版本:

Here is my code, it's a discrete version using discrete coordinates:

提示:我用来寻找区域的周长的方法很简单,这就像你怎么知道从土地海滩?答:海滩是从一个侧面覆盖海,所以在我的矩阵图,空引用海,点是土地

Hint: the method I used to find the circumference of the Area is simple, it's like how do you know the beach from the land ? answer: the beach is covered by Sea from one side, so in my graph matrix, NULL reference is Sea, Points are Land!

类点:

class Point
{
    public int x;
    public int y;

    public Point (int X, int Y)
    {
        this.x = X;
        this.y = Y;
    }
}

等级地区:

class Area
{
    public ArrayList<Point> points;

    public Area ()
    {
        p = new ArrayList<Point>();
    }
}

离散距离工具类:

Discrete Distance Utility Class:

class DiscreteDistance
{

    public static int distance (Point a, Point b)
    {
        return Math.sqrt(Math.pow(b.x - a.x,2), Math.pow(b.y - a.y,2))
    }

    public static int distance (Point a, Area area)
    {
        ArrayList<Point> cir = circumference(area);
        int d = null;

        for (Point b : cir)
        {
            if (d == null || distance(a,b) < d)
            {
                d = distance(a,b);
            }
        }

        return d;
    }

    ArrayList<Point> circumference (Area area)
    {
        int minX = 0;
        int minY = 0;
        int maxX = 0;
        int maxY = 0;

        for (Point p : area.points)
        {
            if (p.x < minX) minX = p.x;
            if (p.x > maxX) maxX = p.x;
            if (p.y < minY) minY = p.y;
            if (p.y > maxY) maxY = p.y;
        }

        int w = maxX - minX +1;
        int h = maxY - minY +1;

        Point[][] graph = new Point[w][h];

        for (Point p : area.points)
        {
            graph[p.x - minX][p.y - minY] = p;
        }

        ArrayList<Point> cir = new ArrayList<Point>();

        for (int i=0; i<w; i++)
        {
            for (int j=0; j<h; j++)
            {
                if ((i > 0 && graph[i-1][j] == null)
                  || (i < (w-1) && graph[i+1][j] == null)
                  || (j > 0 && graph[i][j-1] == null)
                  || (i < (h-1) && graph[i][j+1] == null))
                {
                    cir.add(graph[i][j]);
                }
            }
        }

        return cir;
    }    
}