我环顾四周,找到了一个如何获取折线并在其周围创建缓冲区的示例,因此我最终得到了一个多边形。
到目前为止,我发现我需要 Minkowskis Sums 才能这样做,但我无法理解原始算法并将其转换为代码。
我更喜欢 C# 中的示例或算法的演练。
您可以使用Clipper库中的 OffsetPolygons() 函数,但首先您需要将折线转换为多边形。通过将折线的反向副本附加到折线来执行此操作。但由于不允许重复顶点,反向复制必须排除第一个和最后一个顶点:v1,v2,...,vn,v(n-1),...,v2。
以下是使用 .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);
}
}
您是否尝试过使用 Codeplex 的“Dot Spatial”库?
http://dotspatial.codeplex.com/
它在内部使用 Geos 和 Proj4,它已经包含您需要的所有功能(世界上大多数 GIS 服务器和产品都建立在这两个代码库之上!)
如果做不到这一点,你可以使用 SQlite:
http://sqlite.phxsoftware.com/
和空间:
http://www.gaia-gis.it/spatialite/
然后在 C# 中使用 ADO.NET 代码,您可以使用简单的 GIS SQL 查询来执行处理 EG:
SELECT AsText(ST_Buffer(polyline,0.25),4326)
WHich 将返回一个类似的字符串:
MULTIPOLYGON((x y, x y, x y, x y......))
然后你可以解析。
当您需要的一切都唾手可得时,无需重新发明轮子。