如何在多条线交叉的矩形内找到区域?

时间:2013-12-01 19:47:47

标签: java algorithm math geometry

想象一下,你有很多行(每行代表两个点)。你也有一个特定尺寸的矩形,你知道它左上角的坐标。现在你必须确定这些线中的哪一条与矩形相交,对于所有那些线 - 找到由线条在矩形内创建的区域并计算这些区域的区域。

enter image description here

2 个答案:

答案 0 :(得分:2)

这是一个简单的算法,可以通过更深入的思考来改进: -

在矩形中使用line clipping algorithm

Line clipping

使用Flood Fill算法获取不同的区域&领域

Flood Fill

为每个区域使用convex hull来获取区域的顶点

Graham Scan for convex hull

修改: -

如果需要避免floodfill或协调系统不是离散的,请使用以下内容: -

  1. 通过线条查找内部或矩形上的所有交叉点。

  2. 从交叉点构造一个图形,使得如果它们都存在于矩形中的某个公共线上,则从每个交点到其他交点存在无向边。以及它们之间的距离作为边缘权重。仅在给定线上的最近对之间构造边。这可以通过对一条线上的所有交叉点进行排序,并在排序序列中的每个点之间添加边缘来完成。

  3. 使用以下内容获取所有多边形

    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