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

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

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

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


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


Ответы (3)


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

введите здесь описание изображения

person Angus Johnson    schedule 22.11.2011
comment
Похоже, что Clipper принимает только значения int в качестве координат, но мои координаты имеют двойные значения, например. (56.30174). Или я что-то упускаю? - person eNepper; 22.11.2011
comment
Что касается значений int, см. FAQ в документации здесь: angusj. com/delphi/clipper/documentation/Docs/Overview/FAQ.htm - person Angus Johnson; 22.11.2011
comment
Знаете ли вы, делится ли дельта на 2 или? потому что мой полигон такой же ширины, как моя дельта, а не вдвое больше ширины. - person eNepper; 24.11.2011
comment
Если полилиния преобразуется в многоугольник, как было предложено выше, то дельта будет представлять собой величину расширения многоугольника с обеих сторон исходной ломаной. Следовательно, «ширина» вашей вновь преобразованной и расширенной полилинии будет в два раза больше дельты. - person Angus Johnson; 26.11.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);
  }
}

введите здесь описание изображения

person PeskyGnat    schedule 22.11.2011

Вы пробовали использовать библиотеку 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......))

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

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

person shawty    schedule 22.11.2011
comment
Единственная проблема: лицензия с открытым исходным кодом, под которой распространяется «Dot Spatial», несовместима с программным обеспечением, над которым я работаю. - person eNepper; 22.11.2011
comment
Какая лицензия вам нужна? - person shawty; 22.11.2011