我已经四处寻找一个如何获取折线并在其周围创建缓冲区的示例,因此我最终得到了一个多边形。
到目前为止,我发现我需要Minkowskis Sums这样做,但我无法理解原始算法并将其转换为代码。
我更喜欢C#中的一个例子或算法的演练。
答案 0 :(得分:4)
您可以在Clipper库中使用OffsetPolygons()函数,但首先需要将折线转换为多边形。通过在折线附加折线的反向副本来完成此操作。但由于不允许重复顶点,反向拷贝必须排除第一个和最后一个顶点:v1,v2,...,vn,v(n-1),...,v2。
答案 1 :(得分:3)
以下是基于此链接使用.NET Framework已经提供的2D对象执行此类操作的示例方法
http://www.charlespetzold.com/blog/2008/04/Rounded-Graphics-in-WPF.html
// ...
StreamGeometry geom = new StreamGeometry();
DrawLines(geom);
Pen p = new Pen(Brushes.Black, 10);
p.LineJoin = PenLineJoin.Round;
p.EndLineCap = PenLineCap.Round;
p.StartLineCap = PenLineCap.Round;
PathGeometry pathGeomWide = geom.GetWidenedPathGeometry(p);
PathGeometry pathGeom = pathGeomWide.GetOutlinedPathGeometry();
Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.Data = pathGeom;
myCanvas.Children.Add(myPath);
// ...
private static void DrawLines(StreamGeometry geom)
{
using (var context = geom.Open())
{
context.BeginFigure(new Point(20, 20), false, true);
context.LineTo(new Point(100, 20), true, true);
context.LineTo(new Point(100, 100), true, true);
context.LineTo(new Point(200, 100), true, true);
}
}
答案 2 :(得分:1)
您是否尝试过使用Codeplex的'Dot Spatial'库?
http://dotspatial.codeplex.com/
使用Geos&内部的Proj4,已经包含了您需要的所有功能(世界上大多数GIS服务器和产品都是基于这两个代码库构建的!)
如果失败,你可以使用SQlite:
http://sqlite.phxsoftware.com/
和Spatialite:
http://www.gaia-gis.it/spatialite/
然后在C#中使用ADO.NET代码,您可以使用简单的GIS SQL查询来执行您的处理EG:
SELECT AsText(ST_Buffer(polyline,0.25),4326)
将返回一个字符串,如:
MULTIPOLYGON((x y, x y, x y, x y......))
然后你可以解析。
当您需要的一切都随时可用时,无需重新发明轮子。