Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 相交矩形的总面积_Algorithm - Fatal编程技术网

Algorithm 相交矩形的总面积

Algorithm 相交矩形的总面积,algorithm,Algorithm,确定两个相交且可能偏离坐标轴旋转的矩形的总面积的算法是什么?以下是您需要做的大致操作,尽可能笼统地表达,但涵盖了所有可能性: 计算出交叉口的类别。即交叉区域有多少条边?它可以是0到8之间的任何值 查找交点的所有顶点。这将是矩形边缘之间的所有交点,以及矩形本身的相关角点。解决这一点是最复杂/乏味的 计算出交叉点的面积,必要时将其分成三角形 以下是矩形相交的所有方式: 更新 我有过一些想法,对相交点进行分类的最佳方法是沿着每个矩形的周长进行追踪,并计算每条边与另一条边相交的次数。你会得到一个向

确定两个相交且可能偏离坐标轴旋转的矩形的总面积的算法是什么?

以下是您需要做的大致操作,尽可能笼统地表达,但涵盖了所有可能性:

  • 计算出交叉口的类别。即交叉区域有多少条边?它可以是0到8之间的任何值
  • 查找交点的所有顶点。这将是矩形边缘之间的所有交点,以及矩形本身的相关角点。解决这一点是最复杂/乏味的
  • 计算出交叉点的面积,必要时将其分成三角形
以下是矩形相交的所有方式:

更新


我有过一些想法,对相交点进行分类的最佳方法是沿着每个矩形的周长进行追踪,并计算每条边与另一条边相交的次数。你会得到一个向量,例如六边相交区域:{1,1,1},{0,1,1,1},对于8:{2,2,2,2},{2,2,2}。需要检查的两种特殊情况是,一个矩形完全包围另一个矩形,以及边对齐。您需要仔细检查,但这将是对交叉点进行分类的函数的起点。

好的,您有3种可能: 1.矩形不相交 2.一个矩形完全包含在另一个矩形中(或它们重合) 3.相交的结果是一些凸多边形。通过将多边形拆分为三角形来计算多边形的面积(通过从第一个顶点到另一个顶点(相邻顶点除外)绘制线段)。您可以总结这些领域。你可以使用Herodot定理来计算三角形的面积,这就是Midle学派几何的用武之地。

面积(R1并集R2)=面积(R1)+面积(R2)-面积(R1交集R2),因此你可以计算交集的面积,得到并集的面积

两个矩形(或两个凸多边形)的交点很简单:

  • 它们是凸多边形
  • 它们的点的特征如下:任何一对边的交点,以及一个矩形在另一个矩形内的点
所以它是这样的:

  • L最初是一个空的链表
  • R1具有边e1、e2、e3、e4,R2具有边f1、f2、f3、f4。计算所有i的ei和fj的交点,j=1,2,3,4。将它们添加到列表L中
  • 对于R1的每个顶点v,如果v在R2内,则将其添加到L
  • 对于R2的每个顶点w,如果w在R1内,则将其添加到L
L中点的凸包是你的交点。因为L中的每个点都在交点的边界上,所以可以对其进行三角测量并计算其面积。简单:

  • L=[x0,x1,…]
  • 根据(xi-x0)相对于穿过x0的水平线的角度对L中的点进行排序
  • 第一个三角形是x0,x1,x2
  • 第二个三角形是x0,x2,x3
  • 第n个三角形是x0,x(n+1),x(n+2)
三角形的面积由Heron公式给出:

  • a、 b,c是边缘长度
  • s=0.5*(a+b+c)
  • 面积=平方米(s*(s-a)*(s-b)*(s-c))


但是要注意独立计算s-a、s-b和s-c,因为可能会遇到舍入错误(如果c~a和b相关,但没有旋转可能性要求,该怎么办:我想指出,Tom Medley目前评分最高的答案虽然很有趣,但不是最简单的方法。简单的解决方案是使用(如Sutherland Hodgman)的算法之一)要找到两个矩形之间的交点,请计算,然后将并集的面积计算为面积(rect1)+面积(rect2)-面积(交点)这也在Alexandre C的回答中进行了概述。由于矩形可能是倾斜的,交叉点也可能是三角形。交叉点也可能是5、6、7或8边的图形。我已经修改了我的答案,是否遗漏了任何情况?很好的图表。仅此一点就值得+1。另一种情况:两个相同s的矩形精确重叠(重叠区域是任一矩形的总面积)Herodot定理?你是说Heron公式吗?@belisarius-事实上我认为它不可能是凹的。当然这个答案没有意义,我投了反对票,但我不明白交叉点怎么可能是凹的…@Nickolodeon-你不能只求面积的和,因为那样你会求交叉点的面积的和两次。所以你需要细分t交叉点的面积。你建议我们怎么做?好的,继续挥手。我们中的任何人怎么能与一个连拼写都不会的人相匹配,并且使用像Herodot定理这样的高级东西来计算三角形面积?IVlad,你没有抓住要点。如果你对正确的拼写更感兴趣,那么你应该y关注人道主义论坛。计算第一个矩形中每条边与第二个矩形中每条边的交点真的是最好的解决方案吗?@jball:对于矩形,它提供了16个这样的测试。对于相交更复杂的凸多边形,您可能希望使用四叉树或类似的方法来避免大多数测试。但是请注意在改变变量使R1沿坐标轴移动之后,这些测试非常简单。仔细想想,找到交点只会产生不必要的计算。更好的方法是找到整个并集的顶点,然后计算其面积。这样可以将面积计算从3(2)减少到3(2)降到1。还有比三角剖分更好的算法来计算多边形的面积。处理凸多边形和凹多边形的示例:@jball:找到并集的顶点似乎很困难,而且不像我写的那样自然,我花了5分钟才弄清楚。是的,有