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

Algorithm 带孔闭合曲线面积的计算算法,algorithm,graphics,geometry,curve,Algorithm,Graphics,Geometry,Curve,我们的应用程序允许用户跟踪由直线和圆弧组成的闭合曲线。这些闭合曲线内可以有孔,这些孔也由直线和圆弧组成。大概是这样的: 圆弧段和直线段的数量、位置、方向、直径和扫掠/角度是可变的 如何计算闭合曲线内的面积(不包括孔的面积)?我知道如何用一系列线段来近似圆弧。但是有没有更好、更精确的算法呢?你有一个复杂的形状,你无法给出它的面积。你需要做的是把它分解成你能给出面积的形状。我建议使用矩形、三角形和一条边被圆弧代替的三角形。从顶部垂直操作,每次碰到顶点或坡度在正负之间变化的圆弧点时定义一条水平线。计

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

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


如何计算闭合曲线内的面积(不包括孔的面积)?我知道如何用一系列线段来近似圆弧。但是有没有更好、更精确的算法呢?

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

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

看起来您可以找到多边形、圆、椭圆和圆弧的面积。用多边形近似圆弧。除了弧架是直的。如果您在GDI+中使用图形路径,一个选项是从图形路径获取多边形点。否则,请查找曲线的多边形近似。 可能使用GraphicsPath.PathPoints

看起来您可以找到多边形、圆、椭圆和圆弧的面积。用多边形近似圆弧。除了弧架是直的。如果您在GDI+中使用图形路径,一个选项是从图形路径获取多边形点。否则,请查找曲线的多边形近似。 可能使用GraphicsPath.PathPoints

我认为您有几种选择:

  • 整合每个线段(直线垂直线段除外),以找到每个线段下方的区域。积分应该很容易,因为只有直线和圆弧。这种方法可能过于复杂甚至不可能的原因是积分给出了圆弧向x轴挤压的面积。但是,最终形状不是每个圆弧的所有垂直拉伸的并集。它可能更像是最外层圆弧的凸包减去内部圆弧的凸包(这会在您的形状中形成孔)
  • 您可以更改数据模型。将它们视为扇区和矩形,而不是圆弧和直线。找到每个物体的面积是很容易的-然后硬的部分考虑重叠,以获得总面积
  • 由于您的应用程序已经知道如何绘制最终图形,知道哪些部分是实心的,哪些部分是洞,因此可以使用这些来实现某种像素计数/整体填充算法来计算面积

  • 我认为你有几个选择:

  • 整合每个线段(直线垂直线段除外),以找到每个线段下方的区域。积分应该很容易,因为只有直线和圆弧。这种方法可能过于复杂甚至不可能的原因是积分给出了圆弧向x轴挤压的面积。但是,最终形状不是每个圆弧的所有垂直拉伸的并集。它可能更像是最外层圆弧的凸包减去内部圆弧的凸包(这会在您的形状中形成孔)
  • 您可以更改数据模型。将它们视为扇区和矩形,而不是圆弧和直线。找到每个物体的面积是很容易的-然后硬的部分考虑重叠,以获得总面积
  • 由于您的应用程序已经知道如何绘制最终图形,知道哪些部分是实心的,哪些部分是洞,因此可以使用这些来实现某种像素计数/整体填充算法来计算面积
  • 一般的方法很简单:区域的面积计算为外部轮廓的面积减去孔的面积。这解决了“洞”问题,所以我们可以忘记洞

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

  • 普通多边形将给出任何普通多边形的面积。但是,由于我们处理的是“广义多边形”,由于弧边的原因,该公式不能立即适用

    然而,鞋带配方背后的基本理念也可以适应这种情况

    鞋带公式基本上计算三角形
    OAB
    的有符号面积之和,该三角形由所讨论多边形的点
    O(0,0)
    和点
    a
    B
    构成。在这种情况下,区域的符号表示当
    OAB
    为逆时针三角形时,区域应为正,否则为负。有关如何计算多边形面积的图示,请参见

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

  • 这基本上就是你需要做的。整个问题归结为一组基本问题:上述“g”的符号面积的计算