Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Создайте многоугольник вокруг полилинии, как буфер

Автор вопроса: eNepperОтветов: 3

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

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

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

  • вам нужен выпуклый многоугольник или просто многоугольник? Saeed Amiri 22.11.2011
  • Мне не нужен выпуклый многоугольник. eNepper 22.11.2011
  • Можно ли использовать GDI+? Если да, то GraphicPath.Widen+(OutLine) + GetPathData MBo 22.11.2011
  • Также могут работать классы 2D-геометрии, например получение PathGeometry с помощью GetWidenedPathGeometry msdn.microsoft .com/en-us/library/ms615692.aspx PeskyGnat 22.11.2011

geometrypolygonpolyline

Ответы

Ответ 1 · рейтинг 4 · Angus Johnson

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

Ответ 2 · рейтинг 3 · PeskyGnat

Вот пример того, как сделать что-то подобное с 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);
  }
}

Ответ 3 · рейтинг 1 · shawty

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

http://dotspatial.codeplex.com/

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

В противном случае вы можете использовать SQlite:

http://sqlite.phxsoftware.com/

и Spatialite:

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

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

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

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

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

Это вы можете просто разобрать.

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы