【问题标题】:How to find regions inside a rectangle which is crossed by multiple lines?如何在多条线交叉的矩形内找到区域?
【发布时间】:2013-12-01 19:47:47
【问题描述】:

假设您有许多线(每条线由两个点表示)。此外,您有一个特定大小的矩形,并且您知道其左上角的坐标。现在您必须确定这些线中的哪一条与矩形相交,以及所有那些相交的线 - 找到由线在矩形内创建的区域并计算这些区域的面积。

【问题讨论】:

  • 您需要计算矩形和线条的交点。有了这些点,您应该能够计算出矩形的面积
  • 你的问题目前有点不清楚。您能否添加一个示例(带有解释的图像)以更好地解释您的意思? (这也有助于展示您是如何尝试自己解决这个问题的)

标签: java algorithm math geometry


【解决方案1】:

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

在矩形中使用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);  
    

【讨论】:

  • 虽然从您指出的信息中获得灵感非常有帮助,但我仍然没有解决问题。到目前为止,我已经完成了确定矩形内所有顶点的坐标。我正在用它们构建图表。走图的算法是什么,以便我得到上图所示的区域?
  • @Davidgale 你完成了floodfill 然后每次新调用floodfill 表示矩形中的一个区域。
  • @davidgale 或者您可以从中构造图形并使用 DFS 查找其中的所有循环以查找区域
  • 看来,为了使用洪水填充算法,我必须构造二维数组并在其中标记每条穿过其中的线的“像素”。这意味着我还必须研究各种线条绘制算法。我正在尝试寻找更多的分析方法。
  • @davidgale 如果您的坐标系是离散的,那么这就是要走的路,否则如果它是连续的,我担心您的问题比基于编程的问题更数学化。这是执行此操作的公式的链接mathopenref.com/coordpolygonarea.html
【解决方案2】:

给定一个函数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.

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多