Algorithm 有没有办法计算一组接触多边形之间的空白区域?

Algorithm 有没有办法计算一组接触多边形之间的空白区域?,algorithm,geometry,computational-geometry,Algorithm,Geometry,Computational Geometry,给定一组像屋架一样排列的凸多边形,有没有办法计算空面积,或者为多边形之间的每个“孔”获得一个多边形 我试着从任何给定的多边形开始,然后找到多边形的一些线之间的交点,不知怎的,我被困在如何正确选择用于交点的线上 然后,我尝试验证是否对该区域进行了顺时针检测,但我确定两条直线的CW/CCW的算法似乎不起作用,因为我认为,它的作用似乎是两条直线具有相同的原点,而不是彼此“按顺序”排列。根据评论,解决方案相当简单 1.准备数据 将网格表示为点表,并删除冗余点(点=x,y,z..+int cnt=0;

给定一组像屋架一样排列的凸多边形,有没有办法计算空面积,或者为多边形之间的每个“孔”获得一个多边形

我试着从任何给定的多边形开始,然后找到多边形的一些线之间的交点,不知怎的,我被困在如何正确选择用于交点的线上


然后,我尝试验证是否对该区域进行了顺时针检测,但我确定两条直线的CW/CCW的算法似乎不起作用,因为我认为,它的作用似乎是两条直线具有相同的原点,而不是彼此“按顺序”排列。

根据评论,解决方案相当简单

1.准备数据

  • 将网格表示为点表,并删除冗余点(点=x,y,z..+int cnt=0;)
  • 和线表(线=2*点表中点的索引+布尔删除=假)
  • 为每个使用的点创建线表时,增加其cnt计数器
2.删除冗余线(连接粗线之间的边界)

  • 找到所有重叠且位于同一直线上的直线
  • 它们有相同或相反的方向
  • 删除较短的表格,解剖较大的表格,并相应地更新所有表格(同时指向cnt!!!)
  • 在此之后,查找超过两次使用的点之间的所有线
  • 删除它们

3.查找所有闭合回路

  • 大概是这样的:

    1.创建多边形列表

    • 多边形是点索引的列表
    2.取任何未删除的行

    • 如果找到,请将新多边形添加到列表中并
    • 将其点复制到多边形
    • 将行标记为已删除
    • 如果没有找到,请停止
    3.查找点与最后一个多边形点匹配的直线

    • 将另一个点添加到多边形
    • 将行标记为已删除
    • 重复项目符号2,直到没有找到这样的线
    4.goto 1

4.现在找到边界框最大的多边形

  • 这个多边形是外周长
  • 所以删除它
  • 也可以使用不同的颜色绘制,以进行调试
5.现在把剩下的加起来

  • 所有剩余的多边形都是孔
  • 所以把它们三角化
  • 用基本数学公式求所有三角形面积的和
  • 也可以使用其他不同的颜色绘制它们,以进行调试

这不是一个简单的问题,因为需要使用一些交点和/或倒角/修剪规则以增量方式计算完整的几何体

我设想两种方法:

1) 为自己构建一个包含所需几何操作(使用解析几何)的工具箱,其中包括线段/线段交点,可能还有一些其他操作(将映射到桁架设计规则);使用此工具箱,根据图片“手动”构造所有所需的多边形顶点;最后,使用通用公式计算多边形孔的面积:

2) 使用一个现成的多边形操纵库,如Clipper(),它将允许您绘制日志,而不必太在意端点处的修剪(您将执行矩形的并集,得到一个带孔的多边形)

在我理解了你的问题后,第一种方法更好

更新:

如果您拥有的是一组对应于每个日志的多边形,则答案不同:

如果您只关心空隙的总面积,请计算外部轮廓的面积并推断每个圆木的面积


如果您需要单个孔的面积,则使用第二种方法:执行多边形的并集并查询孔。

您对如何处理该问题有什么想法吗?另外,您的输入是什么。你说“凸面多边形像房子的屋顶一样排列”。我发现这几乎不够精确,无法得出任何结论。有帮助吗?我假设你的线条有一定的厚度,在这种情况下,你需要把所有的线条内外分开。你可能已经在你的网格中有了它们,如果没有的话,你需要找到轮廓,然后多边形化所有的内线(找到所有闭合的不可分离的环),然后三角化,然后简单地求和所有三角形区域together@Spektre乘以什么谢谢你详细的回答。如果我理解正确,我需要考虑所有的多边形作为一个点列表,然后从那里开始?这会导致丢失每个多边形的内部位置吗?此外,在第2点中,您提到了粗线。我对此感到困惑。你什么意思?子弹2是最有问题的。。。正确地调试它。必须在所有解剖后进行管线移除!!!此外,如果您的“四边形”未对齐,则线可能仅部分重叠,因此您需要记住,在这种情况下,粗线是输入中的单个多边形(木条)整个bullet 2删除了图像上的所有连接线蓝色线在这里您可以找到闭环查找示例