Javascript 在复杂多边形中查找距点的设定距离内的区域
给定一个简单(非相交)多边形,如楼层平面图(房间之间缺少门,因此给出一个简单的不间断边界)。如何找到从(x,y)点(多边形边界内或边界上)可到达的多边形内的所有区域?理想情况下,我希望从这里返回一个多边形,然后将其覆盖以显示所有可到达的区域 我考虑了一种*搜索类型的方法,在这种方法中,我将搜索最短路径,迭代位于多边形周长(作为目标)上的所有点,然后沿最短路径多段线以设定的距离限制绘制新点,以生成新的多边形外壳 我还考虑了波传播作为一种方法 我想知道我是否在库/方法方面遗漏了一些明显的东西,是否有人对我如何实现这一点有任何其他想法 给定这样一个多边形: 我正在创建一个显示内部空间(不包括内部门)的多边形,如下所示: 这就是我的问题所指的部分。我希望从多边形边界上的一个给定点(以红色显示为新多边形)找到多边形内的所有可到达点,距离该点的最大移动距离为设定的最大移动距离(以下用红色方框表示),如下所示:Javascript 在复杂多边形中查找距点的设定距离内的区域,javascript,algorithm,math,geometry,polygon,Javascript,Algorithm,Math,Geometry,Polygon,给定一个简单(非相交)多边形,如楼层平面图(房间之间缺少门,因此给出一个简单的不间断边界)。如何找到从(x,y)点(多边形边界内或边界上)可到达的多边形内的所有区域?理想情况下,我希望从这里返回一个多边形,然后将其覆盖以显示所有可到达的区域 我考虑了一种*搜索类型的方法,在这种方法中,我将搜索最短路径,迭代位于多边形周长(作为目标)上的所有点,然后沿最短路径多段线以设定的距离限制绘制新点,以生成新的多边形外壳 我还考虑了波传播作为一种方法 我想知道我是否在库/方法方面遗漏了一些明显的东西,是否有
- 如果您选择的原点顶点不是多边形顶点(即,它是多边形中的一个点),请将该点作为steiner点包含在三角剖分中
- 受约束边是不位于多边形外部的边
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;
}