想象一下,你有很多行(每行代表两个点)。你也有一个特定尺寸的矩形,你知道它左上角的坐标。现在你必须确定这些线中的哪一条与矩形相交,对于所有那些线 - 找到由线条在矩形内创建的区域并计算这些区域的区域。
答案 0 :(得分:2)
这是一个简单的算法,可以通过更深入的思考来改进: -
在矩形中使用line clipping algorithm
。
使用Flood Fill
算法获取不同的区域&领域
为每个区域使用convex hull
来获取区域的顶点
修改: - 强>
如果需要避免floodfill
或协调系统不是离散的,请使用以下内容: -
通过线条查找内部或矩形上的所有交叉点。
从交叉点构造一个图形,使得如果它们都存在于矩形中的某个公共线上,则从每个交点到其他交点存在无向边。以及它们之间的距离作为边缘权重。仅在给定线上的最近对之间构造边。这可以通过对一条线上的所有交叉点进行排序,并在排序序列中的每个点之间添加边缘来完成。
使用以下内容获取所有多边形
Find_polygon(vertex u,int iter,vertex[] path) {
if(!visited[u]) {
visited[u] = true;
path[iter] = u;
if(iter==1) {
source = u;
for all edge(u,v)
Find_polygon(v,iter+1,path);
}
else {
for all edge(u,v) {
if(slope(u,v)!=slope(path[iter-1],u)) {
Find_polygon(v,iter+1,path);
}
}
}
}
else { //loop
index = findIndex(u,path); // can use array for O(1)
polygons.add(path[index to iteration])
}
}
polygons = [];
for all vertices v in graph :
Find_polygon(v);
答案 1 :(得分:0)
给定一个函数Intersect(Polygon, Line) -> List<Polygon>
,它将一个凸多边形与一条直线相交,并返回一个多边形列表(如果该行不与它相交,则仅包含原始多边形;如果该行除了它,则包含两个生成的多边形原始的)你可以做类似下面的事情来获得矩形内的所有结果多边形:
List<Polygon> Divide(Rectangle rect, List<Line> lines)
{
// initialize result list with given rectangle as polygon
List<Polygon> polys;
polys.add(Polygon(rect));
for (Line line: lines)
{
List<Polygon> polysNew;
for (Polygon poly: polys)
polysNew.addAll(Intersect(poly, line));
polys = polysNew;
}
return polysNew;
}
用于计算多边形的面积,请参见例如here