从矩形生成凸面
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
-
从你的集合中获取一个矩形
a
(如果它是某个组的成员,请跳到下一个组,如果没有更多的矩形没有组,则处理一组矩形,稍后会详细介绍) -
将
a
标记为组n
的成员,当您找到与矩形的交集时,尝试将a
与所有其他未访问的矩形相交,b
然后递归运行 2
并带有 您将拥有属于组的所有矩形
n
稍后将对其进行处理,让n = n + 1
并重新运行 1(顺便说一下,此算法称为 dfs)现在,每个矩形都分配给该组上自己的组运行凸包,输出将是
n
凸多边形
b
实现它看起来像这样
// 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)
})
}
相关文章:
- 没有找到相关文章