Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在复杂多边形中查找距点的设定距离内的区域_Javascript_Algorithm_Math_Geometry_Polygon - Fatal编程技术网

Javascript 在复杂多边形中查找距点的设定距离内的区域

Javascript 在复杂多边形中查找距点的设定距离内的区域,javascript,algorithm,math,geometry,polygon,Javascript,Algorithm,Math,Geometry,Polygon,给定一个简单(非相交)多边形,如楼层平面图(房间之间缺少门,因此给出一个简单的不间断边界)。如何找到从(x,y)点(多边形边界内或边界上)可到达的多边形内的所有区域?理想情况下,我希望从这里返回一个多边形,然后将其覆盖以显示所有可到达的区域 我考虑了一种*搜索类型的方法,在这种方法中,我将搜索最短路径,迭代位于多边形周长(作为目标)上的所有点,然后沿最短路径多段线以设定的距离限制绘制新点,以生成新的多边形外壳 我还考虑了波传播作为一种方法 我想知道我是否在库/方法方面遗漏了一些明显的东西,是否有

给定一个简单(非相交)多边形,如楼层平面图(房间之间缺少门,因此给出一个简单的不间断边界)。如何找到从(x,y)点(多边形边界内或边界上)可到达的多边形内的所有区域?理想情况下,我希望从这里返回一个多边形,然后将其覆盖以显示所有可到达的区域

我考虑了一种*搜索类型的方法,在这种方法中,我将搜索最短路径,迭代位于多边形周长(作为目标)上的所有点,然后沿最短路径多段线以设定的距离限制绘制新点,以生成新的多边形外壳

我还考虑了波传播作为一种方法

我想知道我是否在库/方法方面遗漏了一些明显的东西,是否有人对我如何实现这一点有任何其他想法

给定这样一个多边形:

我正在创建一个显示内部空间(不包括内部门)的多边形,如下所示:

这就是我的问题所指的部分。我希望从多边形边界上的一个给定点(以红色显示为新多边形)找到多边形内的所有可到达点,距离该点的最大移动距离为设定的最大移动距离(以下用红色方框表示),如下所示:

  • 对多边形进行三角剖分。
    • 如果您选择的原点顶点不是多边形顶点(即,它是多边形中的一个点),请将该点作为steiner点包含在三角剖分中
  • 从三角剖分的顶点和受约束的边(图边权重为三角剖分边长度)构建无向加权图。
    • 受约束边是不位于多边形外部的边
  • 计算从原点顶点到图中所有其他顶点的最短路径(使用Dijkstra或Bellman-Ford算法)。从原点到顶点的路径距离是该顶点的Z值
  • 使用与之前计算的Z值相同的顶点更新/创建另一个三角剖分网格
  • 通过在三角形内/三角形之间插值(基于每个三角形顶点的Z值插值),计算每个像素的距离值。这是很容易做到的使用。坐标的插值输出提供从原点位置到该坐标的距离
  • 对于下面的插图,我使用了TinFour Java库中的。通过对三角剖分进行操作,它简化了插值步骤——我只需在每个像素坐标处调用插值器,并最终使用原始多边形屏蔽输出(因为它有效地计算多边形的凸包)

    说明性代码 graph和Dijkstra实现使用JGraphT库

    IncrementalTin tin=新的IncrementalTin();
    tin.add(多边形顶点列表);//插入时进行三角剖分
    Graph Graph=新的DefaultUndirectedWeightedGraph(iqadedge.class);
    锡边().forEach(e->{
    如果(e.isConstrainedRegionInterior()| | e.isConstrainedRegionBorder()){
    addVertex(e.getA());
    graph.addVertex(e.getB());
    图.addEdge(e.getA(),e.getB(),e);
    setedgewight(e.getA(),e.getB(),e.getLength());
    }
    });
    DijkstraShortestPath ShortestPath=新的DijkstraShortestPath(图形);
    Vertex originVertex=tin.getNavigator().getNearestVertex(originX,originY);
    var path=shortestpath.getpath(originVertex);
    IncrementalTin distanceMesh=新的IncrementalTin();
    对于(顶点v:graph.vertexSet()){
    var d=路径。getWeight(v);
    distanceMesh.add(新顶点(v.x,v.y,d));//将带有Z的顶点添加到新三角网
    }
    IInterpolatorOverTin插值器=新的自然八向插值器(距离网格);
    对于(int x=0;x
    更新:距离边界顶点 如果只需要距离边界线,可以放弃步骤5。相反,根据所需的距离计算每个三角形的距离(如果适用)。如果等值线与三角形相交(如下图所示),它将与三角形的两条边相交-在每对相交点之间为每个此类三角形绘制一条线段,即可获得距离边界

    为三角剖分中每个受约束的三角形的每条边调用方法(如下所示)。如果距离等值线与三角形相交,将得到该三角形的两个交点;否则就没有了

    /**
     * Compute isoline vertex (if applicable) for a triangle side given by two vertices
     */
    Vertex isoVertex(Vertex a, Vertex b, double d) {
        Vertex min, max;
    
        if (a.getZ() > b.getZ()) {
            max = a;
            min = b;
        } else {
            max = b;
            min = a;
        }
    
        if (d > min.getZ() && d < max.getZ()) {
            double diff = max.getZ() - min.getZ();
            double numerator = d - min.getZ();
    
            double fract = numerator / diff;
            double xDiff = max.getX() - min.getX();
            double yDiff = max.getY() - min.getY();
            
            return new Vertex(min.getX() + fract * xDiff, min.getY() + fract * yDiff);
        }
        return null;
    }
    
    /**
    *计算由两个顶点给定的三角形边的等值线顶点(如果适用)
    */
    顶点等顶点(顶点a、顶点b、双d){
    顶点最小值,最大值;
    如果(a.getZ()>b.getZ()){
    max=a;
    min=b;
    }否则{
    max=b;
    min=a;
    }
    如果(d>min.getZ()&&d

    我听不懂你的第一句话。你能举个例子说明一下我们这里的情况吗。例如一个示例平面图/多边形和一个示例结果。请查看更新的问题以获得更高的清晰度@ThomasSry,无法为您提供解决方案,只能提供方向。看看游戏中用于路径查找的导航网格。基本上是相邻凸包的图。还要看一看:这里有一些关于点对点最短路径的注释:。我会寻找一个实现漏斗算法的库,因为它不是很简单
    /**
     * Compute isoline vertex (if applicable) for a triangle side given by two vertices
     */
    Vertex isoVertex(Vertex a, Vertex b, double d) {
        Vertex min, max;
    
        if (a.getZ() > b.getZ()) {
            max = a;
            min = b;
        } else {
            max = b;
            min = a;
        }
    
        if (d > min.getZ() && d < max.getZ()) {
            double diff = max.getZ() - min.getZ();
            double numerator = d - min.getZ();
    
            double fract = numerator / diff;
            double xDiff = max.getX() - min.getX();
            double yDiff = max.getY() - min.getY();
            
            return new Vertex(min.getX() + fract * xDiff, min.getY() + fract * yDiff);
        }
        return null;
    }