两个三角形或一组半平面的交集面积或凸点集的面积

2024-03-25

我需要计算 2D 平面中两个三角形之间重叠区域的面积。奇怪的是我已经写了code http://github.com/victorliu/Templated-Numerics/blob/master/AnalyticGeometry/TIntersection2.hpp为了三角圆问题 https://stackoverflow.com/questions/540014/compute-the-area-of-intersection-between-a-circle-and-a-triangle,并且效果非常好且稳健,但我在三角三角问题上遇到了麻烦。

我已经首先检查一个是否完全包含另一个,或者另一个是否包含第一个,以及获取所有边缘交叉点。这些交点(最多 6 个,如大卫之星)与另一个三角形中包含的三角形顶点相结合,就是交集区域的顶点。这些点必须形成凸多边形。

我寻求的解决方案是回答以下任一问题:

  1. 给定一组已知点all位于点集的凸包上,计算凸包的面积。请注意,它们的顺序是随机的。
  2. 给定一组半平面,确定相交面积。这相当于将两个三角形描述为三个半平面的交集,并将解计算为该描述的直接交集。

对于问题 1,我考虑过简单地将所有可能三角形的所有面积相加,然后除以计数的重数,但这似乎很愚蠢,而且我不确定它是否正确。我觉得有某种扫线算法可以解决这个问题。然而,该解决方案还必须在数值上相对稳健。

我根本不知道如何解决问题 2,但一般性的答案会非常有用,并且提供代码会让我很开心。这将允许直接计算凸多边形的交叉面积,而不必对它们执行三角形分解。

Edit: 我知道本文 http://www.iro.umontreal.ca/~plante/compGeom/index.html它描述了查找两个凸多边形的相交多边形的一般情况。它似乎只涉及三角形,而且,我实际上并不需要生成的多边形本身。所以也许这个问题只是在此时出于懒惰而提出的。


问题1:为什么点的顺序是随机的?如果是,则必须对它们进行排序,以便用直线连接连续的点产生凸多边形。如何对它们进行排序——例如,通过运行凸包算法(尽管可能还有更简单的方法)。订购后,按照描述计算面积here http://www.mathwords.com/a/area_convex_polygon.htm.

--

问题2更简单。半平面由具有隐式方程的单线定义a*x+b*y+c=0;所有点 (x, y)a*x+b*y+c <= 0(注意不等式)位于半平面“后面”。现在,您至少需要三个平面,以便它们的负半空间的交集是封闭的(这是必要的,但不是充分条件)。如果交点是闭合的,它将是凸多边形。

我建议您维护一个顶点链接列表。该算法用三行初始化。计算直线相交的三个点(一般情况);这些是您所在区域(三角形)的起始顶点。您还必须检查每个顶点是否位于由穿过其他两个顶点的线定义的半平面“后面”;这保证了交叉点实际上是一个封闭区域。

这三个顶点还定义了三角形的三条边。当与新的半平面相交时,只需检查定义半平面的线与当前区域的每条边之间的交点即可;一般来说,您会得到两个交点,但您必须注意直线穿过区域顶点的退化情况。 (您也可能会得到一个空集!)

新的相交顶点定义一条线,将当前区域分为两个区域。再次,使用新半平面的方向来决定将两个新区域中的哪一个分配给新的“当前区域”,以及丢弃哪一个。

列表中定义当前区域边缘的点将被正确排序,因此您可以应用上面链接中的公式来计算其面积。

如果这个描述不详细/无法理解,我能给你的下一个最好的建议是你投资一本关于计算几何和线性代数的书。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个三角形或一组半平面的交集面积或凸点集的面积 的相关文章

  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 两组数的最小公等和及组合

    我目前正在用 C 创建一个程序 该程序将查找两组数字的尽可能低的相等总和 您可以在其中根据需要多次重复这些数字 比如我有这两套 10 13 18 and 12 16 22 我能得到的最低金额是28 10 18 and 12 16 另一个例子
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 关于在字典中查找所有有效单词的算法问题

    给定一个字典 只是一个字符串列表 您收到来自外部来源的未知数量的信件 给定字母串 您将如何列出您可以通过这些字母的任意组合组成的所有有效单词 来自字典 因此 如果您收到 applead 你应该找到apple bad pad lead等 我知
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 包围一组点的多边形

    我有一组 S 点 2D 由 x 和 y 定义 我想找到 P 包围该组所有点的最小 含义 具有最少数量的点 多边形 P 是S 有没有已知的算法来计算这个 我在这个领域缺乏文化令人惊讶 感谢您的帮助 对于这个问题有很多算法 它被称为 最小边界框
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • 有没有办法在 JTS 中将自相交多边形转换为多重多边形?

    取无效多边形POLYGON 0 100 100 100 0 0 100 0 0 100 一个带有未声明交点的煮蛋定时器形状 许多说明说 JTS 可以使用以下命令创建此版本的有效版本 buffer method Geometry input
  • GCC的sqrt()编译后如何工作?使用哪种root方法?牛顿-拉夫森?

    只是对标准感到好奇sqrt 来自 GCC 上的 math h 我自己编码的sqrt 使用牛顿拉夫森来做到这一点 是的 我知道 fsqrt 但CPU是如何做到这一点的呢 我无法调试硬件 现代 CPU 中的典型 div sqrt 硬件使用 2
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • 子序列和

    给定一个整数数组 例如 1 2 3 1 查找是否存在总和为0并返回它 例如 1 2 3 or 2 3 1 检查每个子序列是O n 2 这效率太低了 有改进的想法吗 创建一个新数组 其中每个元素等于前一个元素加上该元素的总和 Input 1
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • Florian 的 Grisu2 算法如何工作?

    我遇到了一个关于将 double 转换为 ascii 的问题 经过搜索 我得到了 Florian 的论文 使用整数快速准确地打印浮点数 http www cs tufts edu nr cs257 archive florian loits
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • 二维滑动窗口最小值/最大值

    假设我们得到一个大小为 NxN 的像素整数矩阵和一个整数 k 窗口大小 我们需要使用滑动窗口找到矩阵中的所有局部最大值 或最小值 这意味着 如果某个像素与其周围窗口中的所有像素相比具有最小 最大 值 则应将其标记为最小 最大 有一种著名的滑

随机推荐