【问题标题】:How to calculate the area of an SVG path c# [closed]如何计算SVG路径c#的面积[关闭]
【发布时间】:2012-04-02 15:40:02
【问题描述】:

如果有人可以帮助计算 SVG 路径的面积,我将不胜感激。

我有一个功能可以得到非常好的总长度。

我见过一种将路径转换为多边形的 javascript 方法:

http://phrogz.net/SVG/convert_path_to_polygon.xhtml

将其转换为 c# 将是一个很好的途径,因为我有一个函数可以将多边形的面积获得足够的精度。

问候

如果对这里的问题有任何疑问......

如果您对 SVG 文件格式有所了解,您就会知道 SVG 路径的形状是由一组坐标定义的,如下所示:

d="M195.303,64.357 c6.57-6.684,11.9-15.514,10.057-25.154 c-3.689-19.298-27.854-13.204-27.309-0.549 c-0.545-12.655-23.619-18.749-27.309,0.549                c-1.844,9.651,3.502,18.401,10.082,25.087 c1.697-4.813,5.713-8.03,11.482-9.451 c-2.797,1.531-3.809,4.396-3.809,7.812 c0,4.983,4.58,8.4,9.553,8.4s9.553-3.417,9.553-8.4c0-3.416-1.012-6.28-3.807-7.812C189.584,56.263,193.613,59.52,195.303,64.357 z"

c 和 C 定义贝塞尔曲线

(会张贴图片)

我要问的是如何使用坐标/曲线点计算这种形状的面积。

使用 IronPython 和 Inkscape 函数的解决方案效果非常好。

【问题讨论】:

  • 如果您已经有一个多边形例程,那么您可能只需要一个 XML 阅读器来获取点数据,然后将这些点输入到您的函数中。你有没有开始这样的例行公事?
  • 我可以毫无问题地读取所有点,路径的点并不能真正直接转换为与多边形相同的格式,路径可以有各种类型的曲线等。
  • 啊,请原谅 - 我刚刚看到“多边形”并错过了“路径”位!对,就像你一样:)
  • SVG 路径形状区域有什么不真实的地方?
  • 这是一个 100% 真实的问题,并且 100% 可以回答。永远不应该被关闭。我自己无法回答,但有一个免费的 Adob​​e Illustrator 插件可以计算路径区域 (telegraphics.com.au/sw/product/patharea

标签: c# svg


【解决方案1】:

让我们考虑调用闭合 poligon 的点 (x0,y0)...(xn,yn),您可以使用该公式通过简单循环点来计算面积

area += yi+y(i+1) * (x(i+1)-xi)/2 

只是为了澄清 x(i+1) 和 y(i+1) 我的意思是序列中的 下一个 点。循环应该从 0 开始并在 n-1 顶点处停止(因此下一个点始终有效),当到达最后一个点时考虑ptn-pt0 该区域应该被视为绝对值,否则您可以使用符号检查多边形是顺时针还是逆时针。 我只是添加了一张图来解释它是如何工作的,以便您可以扩展以处理不同类型的曲线。让我们考虑这张图:

这个想法是通过代数和计算绿色多边形的面积,将多边形边缘和x轴分割的每个梯形的面积,在这种情况下梯形有:

x0,y0 x1,y1 x1,0 x0,0 
x1,y1 x2,y2 x2,0 x1,0
(-)x2,y2 x3,y3 x3,0 x2,0
(-)x3,y3 x4,y4 x4,0 x3,0 
(-)x4,y4 x0,y0 x0,0 x4,0

前两个是正数,后三个是负数,正如您所见,不同之处在于绿色部分,即所需区域。我的绘图不太好,但试着找出重叠梯形的结果,它以加法和减法的方式工作。即使在图中我显示了一个凸多边形,该算法也适用于凹多边形。 在边缘不是段作为第一个解决方案的情况下,您需要做的是通过使用曲线上的参数方程将其转换为段列表并对其进行采样,您将获得一个不错的近似。 更好的解决方案是考虑非线性段的参数函数,并相对于X轴积分(计算曲线与X轴之间的面积)并求和当我对线性段的面积求和时。这涉及一些数学,但您可以找到help you need here。您只需要使用正确的分段方程即可。

【讨论】:

  • 嗨 Felice,我有一个与多边形区域非常相似的方法(我认为是从这个站点获得的..),这是我真正关心的路径。如果我可以将路径转换为多边形,我希望我可以使用相同的方法。
  • @user1296173 路径只是点的集合,就像一个多边形。在函数中使用这些点有什么问题?
  • @user1296173 你可以使用Slugart所说的点集合。如果路径的某些部分是弧线......你可以用多段来近似它们,但我必须记住一个更好的方法:)
  • 嗨,Slugart,它不完全像一个多边形,它可以指定曲线和弧线——我已经尝试过将路径点传递给多边形区域方法,但结果是出路,通常是负值
  • 嗨 Felice,我不知道如何将曲线控制点转换为线段,我也不知道参数方程,不幸的是我没有进一步计算路径面积.
【解决方案2】:

我自己无法计算出数学,所以最后我使用 IronPython 执行来自 Inkscape 的 python 模块,该模块可以准确地测量任何类型的路径,足以满足我的用途。

如果有人在寻找相同的内容,我会发布详细信息,但它实际上非常简单,不需要对 Python 文件进行太多编辑。 您确实需要使用 .net framework v4.0。

【讨论】:

  • 我很想看看这是如何完成的。
  • 等我有时间再补充。
  • 仍在等待细节,使用与您相同的方法会很棒:)
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多