繁体   English   中英

从矩形生成凸多边形

[英]Generate convex polygons from rectangles

我目前正在为游戏开发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}}];

所以我的问题是如何从一大组矩形中生成一小部分凸多边形? 我绝不是专家编码人员,所以请在回答中包括详尽的解释,并请提供示例。 我花了几个多小时试图自己解决这个问题。

谢谢!

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

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

n为组数,最初n = 0

  1. 从您的集合中取出一个矩形a (如果它是某个组的成员,则跳到下一个矩形,如果没有更多没有该组的矩形,则处理该组矩形组,稍后再介绍)

  2. 标记a作为该组的一个成员n ,尽量相交a与每个其他未访问的矩形,当你发现用矩形的交点b然后递归地运行2 b

  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)
  })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM