Есть ли библиотека .NET или пример кода, который полезен для оптимизации точек на линии или прореживания? - PullRequest
1 голос
/ 23 июня 2010

У меня есть большой набор точек данных (все 2D, которые представляют ребра фигуры), где существует множество, которые выстраиваются в линию по прямой линии, состоящей из множества точек (пикселей). Я хотел бы оптимизировать данные, удалив точки, которые образуют прямые линии (один и тот же вектор) и оставляют только две последние конечные точки ряда для определения линии и игнорируют все промежуточные точки (децимация).

Ряды линий, расположенные строго по осям X и Y сетки, представляют один уровень сложности. Второй уровень представляет собой диагональные линии, которые при применении к сетке (то есть в пикселях) могут нуждаться в определении некоторых линий посредством интерполяции шаблона. (то есть 1 на 3 больше, 1 на 4 больше, 1 на 5 и т. д. представляет собой прямую линию)

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

Будем благодарны за любые указатели, советы, предложения по коду, алгоритмы, частичные решения и т. Д.

Это будет проект .NET, но я хорошо разбираюсь и в других языках (ruby, perl, python), поэтому, если такой пример существует в похожих языках, он будет мне полезен.

Спасибо

  • Добавление ссылки на образец набора данных: http://pastie.org/1015421
  • Добавление Образец изображения, чтобы показать цель оптимизация / прореживание

альтернативный текст http://www.streamline -ss.com / tmp / point_optimization.png

Обновлен:

  • Нам удалось изменить входящий набор данных, чтобы он был оптимизирован таким образом, чтобы он представлял собой набор данных на основе сетки / пикселя без единиц измерения из исходного источника вместо интерполированных местоположений на основе единиц (во избежание отклонений рассчитанной сетки)
  • Пример этого набора входных данных (неоптимизированный) здесь http://pastie.org/1017486
  • До сих пор я был в состоянии написать подпрограмму, которая удалит дубликаты и удалит все точки, которые имеют такой же x или y, что и предыдущая точка
  • Необходимо найти способ определения повторяющихся шаблонов и исключить все, кроме конечных точек начального и конечного шаблонов - для прореживания прямой линии.
  • Я до сих пор не нашел библиотеки, класса или фрагмента кода, где кто-то уже сделал это, но мне кажется, что это не новая проблема, и кто-то наверняка изобрел это колесо

Ответы [ 2 ]

1 голос
/ 26 июня 2010

как насчет алгоритма Дугласа Пекера Википедия NetTopologySuite имеет реализацию этого я использовал его для упрощения треков GPX

если вы преобразуете свои данные в LineString, то использовать их будет просто

GisSharpBlog.NetTopologySuite.Simplify.DouglasPeuckerLineSimplifier simplifyer = new GisSharpBlog.NetTopologySuite.Simplify.DouglasPeuckerLineSimplifier(lineString.Coordinates);
simplifyer.DistanceTolerance = 5;//some number that makes sense;
GeoAPI.Geometries.ILinearString simplifyedLineString = new GisSharpBlog.NetTopologySuite.Geometries.LineString(simplifyer.Simplify());
1 голос
/ 24 июня 2010

Существует действительно хорошая ГИС-библиотека под названием Net Topology Suite , в которой много функций типа геометрии. Это может охватывать функции, которые вы ищете. Это лицензия LGPL. Я использовал его, чтобы сделать многоугольные пересечения с большим успехом.

...