Создайте многоугольник вокруг полилинии как буфер - PullRequest
4 голосов
/ 22 ноября 2011

Я посмотрел вокруг, чтобы найти пример того, как взять ломаную линию и создать вокруг нее буфер, чтобы я получил многоугольник.

До сих пор я узнал, что мне для этого нужны суммы Минковскиса, но я не могу разобраться с необработанным алгоритмом и перевести его в код.

Я бы предпочел пример на C # или пошаговое описание алгоритма.

Ответы [ 3 ]

4 голосов
/ 22 ноября 2011

Вы можете использовать функцию OffsetPolygons () в библиотеке Clipper , но сначала вам нужно преобразовать полилинию в многоугольник.Сделайте это, добавив к полилинии обратную копию полилинии.Но поскольку дублирующие вершины не допускаются, обратная копия должна исключать первую и последнюю вершины: v1, v2, ..., vn, v (n-1), ..., v2.

enter image description here

3 голосов
/ 23 ноября 2011

Вот пример того, как сделать что-то подобное с 2D-объектами, уже доступными в .NET Framework, на основе этой ссылки

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);
  }
}

enter image description here

1 голос
/ 22 ноября 2011

Вы пытались использовать библиотеку 'Dot Spatial' из Codeplex?

http://dotspatial.codeplex.com/

, которая использует Geos & Proj4 для внутреннего использования, которая уже содержит все необходимые вам функции (большинство изГИС-серверы и продукты миров построены на этих двух базах кода!)

Если это не удастся, вы можете использовать SQlite:

http://sqlite.phxsoftware.com/

и Spatialite:

http://www.gaia -gis.it /atialite /

Затем, используя код ADO.NET в C #, вы можете использовать простые запросы GIS SQL для выполнения обработки EG:

SELECT AsText(ST_Buffer(polyline,0.25),4326)

Что вернет строку, например:

MULTIPOLYGON((x y, x y, x y, x y......))

То, что вы можете просто разобрать.

Не нужно заново изобретать колесо, когда все, что вам нужно, легкоимеется.

...