【问题标题】:Algorithm to Calculate the Area of a Closed Curve with Holes计算带孔闭合曲线面积的算法
【发布时间】:2013-12-21 09:23:13
【问题描述】:

我们的应用程序允许用户追踪由直线和圆弧组成的闭合曲线。这些闭合曲线内部可以有孔,这些孔也由直线和圆弧组成。像这样的:

弧段和直线段的数量、位置、方向、直径和扫描/角度是可变的。

如何计算闭合曲线内不包括孔面积的面积?我知道如何通过用一系列线段来逼近弧线来做到这一点。但是有没有更好、更准确的算法来做到这一点?

【问题讨论】:

  • 大概你有你需要的一切to calculate it exactly,除非这些形状是徒手画的?在任何情况下,仅绘制和计算像素可能比使用线段近似更准确。
  • 我注意到有人投票关闭。先关闭这个:stackoverflow.com/questions/451426/…
  • @RogerRowland,这可能行得通,但如果顶点落在弧内怎么办?
  • 不确定你的意思,你的意思是弧线被另一个形状打断了?也许您可以发布最坏情况的图像,以便我们查看。但除非您需要非常高的精度,否则绘制、填充和计数像素将是最通用的(假设曲线始终是闭合的)。
  • 圆弧的直径是否相同?圆弧总是半个圆吗?

标签: algorithm graphics geometry curve


【解决方案1】:
  1. 一般方法很简单:您所在区域的面积等于外部轮廓的面积减去孔的面积。这解决了“漏洞”问题,因此我们可以忘记漏洞。

    现在的问题是计算“广义多边形”的面积:一个伪多边形,其边要么是直线段,要么是圆弧。

  2. 普通的Shoelace formula 会给你任何普通多边形的面积。但是由于我们正在处理“广义多边形”,因此由于弧边,该公式不能立即适用。

    但是,鞋带公式背后的基本思想也可以适应这种情况。

    鞋带公式基本上计算三角形OAB 的符号面积之和,这些三角形由点O(0,0) 和点AB 构成,每条边B 有问题的多边形。在这种情况下,区域的有符号意味着当OAB是一个逆时针三角形时该区域为正,否则为负。请参阅here 了解它如何用于多边形面积计算。

    为了使这个公式适应您的情况,您必须找到一种方法来计算“广义三角形”的符号面积:伪三角形OAB 其中OAOB 是直线段,而AB 可以是圆弧。这是一个非常简单的问题,完全可以解决。

这基本上就是您需要做的所有事情。整个问题归结为一组基本问题:计算上述“广义三角形”的符号面积。

【讨论】:

    【解决方案2】:

    你有一个复杂的形状,你无法给出它的面积。你需要做的是把它分解成你可以给出面积的形状。我会建议矩形、三角形和一个边被圆弧代替的三角形。从顶部垂直工作,每次碰到顶点或斜率在正负之间变化的弧点时定义一条水平线。计算您在连续水平线之间生成的所有形状的面积。

    【讨论】:

      【解决方案3】:

      我认为你有几个选择:

      1. 整合每个线段(直线垂直线段除外)以找到每个线段下方的区域。积分应该很容易,因为你只有直线和圆弧。这种方法可能太棘手甚至不可能的原因是积分为您提供了弧向 x 轴的挤压面积。但是,您的最终形状并不是每个弧的所有垂直挤压的联合。它可能更像是最外圆弧的凸包减去内部圆弧的凸包(在您的形状中形成孔)。
      2. 您可以更改数据模型。而不是弧线和直线,将它们视为扇形和矩形。找到每个对象的面积很容易 - 困难的部分是考虑重叠来获得总面积。
      3. 由于您的应用已经知道如何绘制最终图形并知道哪些部分是实心的以及哪些是孔,因此可以使用它来实现某种像素计数/填充算法来计算面积。

      【讨论】:

        【解决方案4】:

        看起来你必须找到多边形、圆、椭圆和弧的面积。带多边形的近似弧。除了弧休息是直截了当的。如果您在 GDI+ 中使用图形路径,一种选择是采用多边形点形成图形路径。否则寻找曲线的多边形近似。 http://keisan.casio.com/ 可能使用 GraphicsPath.PathPoints http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.graphicspath.pathpoints(v=vs.110).aspx

        【讨论】:

          猜你喜欢
          • 2011-06-24
          • 2021-04-18
          • 1970-01-01
          • 2019-02-07
          • 2021-10-24
          • 2017-10-12
          相关资源
          最近更新 更多