【问题标题】:Generate convex polygons from rectangles从矩形生成凸多边形
【发布时间】:2016-04-23 03:13:19
【问题描述】:

我目前正在为游戏开发 2D 照明系统。地图由可以具有某些标签和特征的图块组成。在这种情况下,我将一些图块设置为“不透明”,并编写了一个函数来为每个不透明图块生成一堆矩形。我想通过将大组矩形合并成凸多边形来优化这个几何形状。

我的矩形被定义为数组中线段的集合。

矩形多边形示例:

var polygon = [
{a:{x:0,y:0}, b:{x:640,y:0}},
{a:{x:640,y:0}, b:{x:640,y:360}},
{a:{x:640,y:360}, b:{x:0,y:360}},
{a:{x:0,y:360}, b:{x:0,y:0}}];

所以我的问题是如何从一大组矩形中生成一组较小的凸多边形?我绝不是专业的编码人员,因此请在您的答案中包含详尽的解释,并在可能的情况下提供示例。我花了几个多小时试图自己解决这个问题。

谢谢!

【问题讨论】:

    标签: javascript geometry polygon convex


    【解决方案1】:

    这是针对您的问题的O(n^2) 算法,您需要的所有介绍性信息都在此topcoder article,我敢肯定,如果您使用线扫描算法来查找相交的矩形集,那么解决方案的时间复杂度将是O(n log n)

    主要思想:创建一组矩形,然后为集合中的每个元素计算一个凸包

    n 为组数,初始为n = 0

    1. 从你的集合中取一个矩形a(如果它是某个组的成员跳到下一个,如果没有更多的矩形没有一个组,那么处理一组矩形组,稍后会详细介绍)

      ​​>
    2. a 标记为n 组的成员,尝试与其他所有未访问的矩形相交a,当您找到与矩形b 的交点时,然后递归运行2 与@987654331 @

    3. 您将拥有属于n 组的所有矩形,这些矩形将在稍后处理,让n = n + 1 并重新运行1(这个算法顺便称为dfs)

    4. 现在每个矩形都被分配给它自己的组,在组上运行凸包,输出将是n凸多边形

    实现看起来像这样

    // input
    var rectangles = [ ... ];
    
    function dfs(a, group, n) {
      assignRectangleToGroup(a, n)
      group.push(a)
      rectangles.forEach(function (b) {
        if ( rectangleDoesntHaveGroup(b) &&
            rectangleIntersects(a, b)) {
          dfs(b, group, n)
        }
      })
    }
    
    function generateConvexPolygons() {
      var n = 0;
      var set = []
      rectangles.forEach(function (a) {
        if (rectangleDoesntHaveGroup(a)) {
          var group = []
          dfs(a, group, n)
          set.push(group)
          n += 1
        }
      })
    
      return set.map(function (group) {
        return convexHull(group)
      })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 2011-05-09
      • 2012-04-30
      • 2020-11-02
      • 2012-08-04
      相关资源
      最近更新 更多