[英]How would I implement the shoelace theorem to find the areas of multiple convex polygons created from intersecting lines?
[英]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 b
您将拥有属于组n
所有矩形,稍后将对其进行处理,令n = n + 1
并重新运行1(顺便说一下,该算法称为dfs)
现在,每个矩形都分配给了它自己的组,并在该组上运行凸包,输出将是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.