"视线"对于多边形上的顶点到所有其他多边形顶点

时间:2016-02-01 01:36:12

标签: java javafx geometry

我无法在多边形上找到从多边形上的给定顶点可见的多边形上的所有顶点。到目前为止,我所写的成功有限。

我可以将光线生成到可见顶点,但只有当我的原点不在顶点上时才使用以下内容:

private ArrayList<Polyline> getGloballyVisible(Point2D origin, ArrayList<Polygon> polys) {
    ArrayList<Polyline> visible = new ArrayList<>();

    for (Polygon target : polys) {
        ArrayList<Polyline> targetVisibleLines = getVisiblePointsOnPolygon(origin, target);
        ArrayList<Polygon> subTargetPolygons = new ArrayList<>(polys);
        subTargetPolygons.remove(target);
        ArrayList<Polyline> subTargetEdges = getEdges(subTargetPolygons);

        lineCheck: for (Polyline line : targetVisibleLines) {
            for (Polyline enemyLine : subTargetEdges) {
                ArrayList<Point2D> linePoints = toPoints(line.getPoints());
                ArrayList<Point2D> enemyLinePoints = toPoints(enemyLine.getPoints());
                if (linesIntersect(linePoints.get(0), linePoints.get(1), enemyLinePoints.get(0), enemyLinePoints.get(1))) {
                    continue lineCheck;
                }
            }
            visible.add(line);
        }
    }
    return visible;
}

Full code here, please don't laugh.

Sample Result

这是我尝试过的最后一种方法。我确定这种方式很可怕,如果有人能指出我正确的方向,那么可以让它不那么可怕我会感激它。

2 个答案:

答案 0 :(得分:4)

你在那里分析了相当多的代码,特别是没有评论。然而,这个问题让我对这个主题感到好奇,所以我读了一下这个问题,然后使用扫描线和对场景中所有线段的强力检查来玩弄它。令人信服的是,它表现得非常好。也许它可以帮助你看到我是如何做到的:

  • 创建由开始和结束向量组成的行(墙)(任何角度的任何行都可以)
  • 在视点周围创建扫描线
  • 针对场景中的所有线点击测试扫描线
  • 为每个交叉点找到最接近视点的那个
  • 连接所有交叉点

这很容易做,特别是当你使用矢量计算时。

看起来like this on youtube

截图:

enter image description here

扫描线(蓝色)可见:

enter image description here

但请记住,这只是针对所有线段的暴力测试。当然还有像e这样的优化空间。 G。计算所有段与视点的距离,剪切段等。看看@kubuzetto的答案。

如果这是您正在寻找的内容,您可以在this gist找到来源。与您相关的逻辑是Algorithm.java。

其他信息,因为您的代码包含单词&#34; enemyLine&#34;这让我觉得你需要它来玩游戏:当你简单地总结所有的交叉点并将它们除以扫描线的数量并移动到目标时,你会自动获得this之类的移动。 / p>

答案 1 :(得分:2)

这个互动教程可能会有所帮助:

http://www.redblobgames.com/articles/visibility/