计算带孔闭曲线面积的算法

时间:2013-12-21 09:23:14

标签: algorithm graphics geometry curve

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

enter image description here

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

如何计算闭合曲线内的区域,不包括孔的面积?我知道如何通过用一系列线段近似弧来完成这项工作。但有没有更好,更准确的算法呢?

4 个答案:

答案 0 :(得分:4)

  1. 一般方法很简单:您所在地区的面积计算为外部轮廓的面积减去孔的面积。这会解决“漏洞”问题,因此我们可以忘记漏洞。

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

  2. 普通的Shoelace formula会为您提供任何普通多边形的区域。但由于我们正在处理“广义多边形”,因为弧边缘,公式不能立即应用。

    然而,Shoelace公式背后的基本思想也可以适应这种情况。

    Shoelace公式基本上计算三角形OAB的有符号区域的总和,这些三角形O(0,0)由点A和点BAB构成。有问题的多边形。在这种情况下,区域的签名意味着当OAB是逆时针三角形时该区域应为正,否则为负。有关多边形区域计算的工作原理的说明,请参见here

    为了使这个公式适应您的情况,您必须找到一种方法来计算“广义三角形”的有符号区域:伪三角形OAB,其中OA和{{1}是直段,而OB可以是弧。这是一个非常简单的问题,可以完全解决。

  3. 这基本上就是你需要做的。整个问题被简化为一系列基本问题:计算上述“广义三角形”的符号区域。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我认为你有几种选择:

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