是否有一个.NET库或示例代码可用于优化线上的点或抽取?

时间:2010-06-23 03:00:29

标签: .net algorithm dictionary line

我有一大组数据点(所有2D代表一个形状的边缘),其中存在许多直线排列的一系列多个点(像素)我想通过删除来优化数据构成直线(相同向量)的点,只留下系列的最后两个端点来定义直线并忽略其间的所有点(抽取)。

严格在网格的X轴和Y轴上的线系列呈现出一个复杂程度。第二级是对角线,当应用于网格(即像素)时,可能需要通过内插图案来确定一些线。 (即1 up 3 over,1 up 4 over,1 up 5依此类推直线)

我想利用可能已存在的任何现有库或示例代码片段,而不是从头开始重新发明轮子。

任何指针,提示,代码建议,算法,部分解决方案等都将受到赞赏。

这将是一个.NET项目,但我也精通其他语言(ruby,perl,python),所以如果这样的例子存在于类似语言中,那对我来说会很有用。

由于

alt text http://www.streamline-ss.com/tmp/point_optimization.png

更新

  • 我们能够将要优化的输入数据集更改为基于原始源的基于单位的网格/像素位置数据集,而不是基于插值单元的位置(以避免计算网格的差异)
  • 此输入数据集(未优化)的示例位于http://pastie.org/1017486
  • 到目前为止,我已经能够编写一个例程来删除重复项,并删除与前一点具有相同x或相同y的任何点
  • 需要找到一种方法来识别重复出现的模式并消除除开始和结束模式的所有端点之外的所有模式 - 用于直线抽取。
  • 我还没有找到有人已经做过这个的图书馆,课程或代码片段,但在我看来,这不是一个新挑战,而且肯定有人发明了这个轮子

2 个答案:

答案 0 :(得分:1)

有一个非常好的名为Net Topology Suite的GIS库,它有很多几何类型的功能。这可能涵盖您正在寻找的功能。它是LGPL许可的。我用它来做多边形交叉并取得了很大的成功。

答案 1 :(得分:1)

Douglas Peucker算法怎么样wikipedia 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());