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

Java 如何在多条直线相交的矩形内找到区域?,java,algorithm,math,geometry,Java,Algorithm,Math,Geometry,假设您有许多线(每一条线由两点表示)。还有一个特定大小的矩形,你知道它左上角的坐标。现在,您必须确定这些线中哪些与矩形相交,对于所有相交的线,找到由这些线在矩形内创建的区域,并计算这些区域的面积 给定一个函数Intersect(Polygon,Line)->List,该函数将凸多边形与直线相交,并返回多边形列表(如果直线不相交,则仅包含原始多边形;如果直线分割原始多边形,则仅包含两个结果多边形)您可以执行以下操作以获得矩形内的所有结果多边形: List<Polygon> Divide

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


给定一个函数
Intersect(Polygon,Line)->List
,该函数将凸多边形与直线相交,并返回多边形列表(如果直线不相交,则仅包含原始多边形;如果直线分割原始多边形,则仅包含两个结果多边形)您可以执行以下操作以获得矩形内的所有结果多边形:

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;
}
列表分割(矩形矩形,列表行)
{
//将给定矩形作为多边形初始化结果列表
列表多边形;
添加(多边形(矩形));
用于(行:行)
{
列出新项目;
用于(多边形:多边形)
addAll(相交(多边形,直线));
polys=polysNew;
}
返回新的;
}

要计算多边形的面积,请参见,例如:

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

在矩形中使用
线裁剪算法

使用
洪水填充
算法获取不同的区域和区域

对每个区域使用
凸包
,以获取区域的顶点

编辑:-

如果需要避免注水,或者坐标系不是离散的,则使用以下方法:-

  • 按直线查找矩形内或矩形上的所有交点

  • 从交叉点构造一个图,这样,如果两个交叉点都位于矩形中的某条公共线上,则从每个交叉点到另一个交叉点都存在一条无向边。以及它们之间的距离作为边权重。仅在给定直线上最近的对之间构造边。这可以通过对直线上的所有交点进行排序,并在排序序列中的每个点之间添加边来实现

  • 使用以下命令获取所有多边形

    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查找其中的所有循环以查找区域似乎为了使用floodfill算法我必须构造2d数组,并在数组中标记每一条相交线的“像素”。这意味着我还必须研究各种各样的线条绘制算法。“我试图找到更多的分析方法。@davidgale如果坐标系是离散的,那么这就是解决方法,否则如果坐标系是连续的,我担心你的问题比基于编程的问题更数学化。下面是一个链接,指向实现此功能的公式