如何计算SVG路径的面积c#

时间:2012-04-02 15:40:03

标签: c# svg

如果有人可以帮助计算SVG路径的区域,我将非常感激。

我有一个函数来获得真正有效的总长度。

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

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

将此转换为c#将是一条很好的路线,因为我有一个能够使多边形区域达到足够精度的函数。

此致

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

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

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功能的解决方案效果非常好。

2 个答案:

答案 0 :(得分:8)

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

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

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

这个想法是通过代数和计算绿色多边形的面积来计算由多边形边和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

前两个是正数,后三个是负数,你可以看到差异是绿色部分,即所需面积。我不是很擅长绘画,而是试图弄清楚由重叠的梯形产生的结果是以加法和减法的方式起作用。即使在图中我显示了凸多边形,算法也适用于凹多边形。 如果边缘不是段作为第一个解决方案,您需要做的是通过使用曲线上的参数方程将其转换为段列表并对其进行采样,您将获得一个像样的approxymation。 更好的解决方案是考虑非线性段的参数函数并将其与X轴(计算曲线和X轴之间的面积)进行积分并求和因为我总结线性段的面积。这涉及一些数学但你可以找到help you need here。您只需要使用正确的分段方程式。

答案 1 :(得分:0)

我自己无法计算数学,所以最后我使用IronPython从Inkscape执行一个python模块,它可以准确地测量任何类型的路径,以便我使用它。

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