4

我环顾四周,找到了一个如何获取折线并在其周围创建缓冲区的示例,因此我最终得到了一个多边形。

到目前为止,我发现我需要 Minkowskis Sums 才能这样做,但我无法理解原始算法并将其转换为代码。

我更喜欢 C# 中的示例或算法的演练。

4

3 回答 3

4

您可以使用Clipper库中的 OffsetPolygons() 函数,但首先您需要将折线转换为多边形。通过将折线的反向副本附加到折线来执行此操作。但由于不允许重复顶点,反向复制必须排除第一个和最后一个顶点:v1,v2,...,vn,v(n-1),...,v2。

在此处输入图像描述

于 2011-11-22T12:40:43.113 回答
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);
  }
}

在此处输入图像描述

于 2011-11-22T21:09:14.110 回答
1

您是否尝试过使用 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......))

然后你可以解析。

当您需要的一切都唾手可得时,无需重新发明轮子。

于 2011-11-22T12:01:08.977 回答