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如果坐标系是离散的,那么这就是解决方法,否则如果坐标系是连续的,我担心你的问题比基于编程的问题更数学化。下面是一个链接,指向实现此功能的公式