从矩形

时间:2016-04-23 03:13:20

标签: javascript geometry polygon convex

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

n为群组数量,最初为n = 0

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

  2. a标记为群组n的成员,当您找到与矩形{{1}的交叉点时,尝试将a与其他所有未访问的矩形相交然后用b

  3. 递归运行2
  4. 您将拥有属于b组的所有矩形,稍后将对其进行处理,让n重新运行1(顺便说一下,此算法称为dfs)< / p>

  5. 既然每个矩形都分配给它自己的组运行凸包在组上,输出将是n = n + 1凸多边形

  6. 它的实现看起来像这样

    n