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

是否有一个.NET库或示例代码对优化直线上的点或抽取有用?,.net,algorithm,dictionary,line,.net,Algorithm,Dictionary,Line,我有一组大的数据点,全部是2D,表示一个形状的边,其中存在许多直线,一系列的点像素,我想通过删除组成直线的点来优化数据,相同的向量,只留下序列的最后两个端点来定义直线并忽略在抽取之间的所有点 严格在网格的X轴和Y轴上的线系列呈现出一种复杂程度。第二级是对角线,当应用于网格(即像素)时,可能需要通过内插图案来确定一些线。i、 e.1向上3向上、1向上4向上、1向上5向上等表示一条直线 我想利用任何现有的库或可能已经存在的示例代码片段,而不是完全从头开始重新发明轮子 如有任何提示、提示、代码建议、算

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

严格在网格的X轴和Y轴上的线系列呈现出一种复杂程度。第二级是对角线,当应用于网格(即像素)时,可能需要通过内插图案来确定一些线。i、 e.1向上3向上、1向上4向上、1向上5向上等表示一条直线

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

如有任何提示、提示、代码建议、算法、部分解决方案等,将不胜感激

这将是一个.NET项目,但我精通其他语言以及ruby、perl和python,因此如果类似语言中存在这样一个示例,它将对我很有用

谢谢

将链接添加到示例数据集: 添加 示例图像显示了 优化/抽取 更新:

我们能够将要优化的输入数据集更改为来自原始源的无单位网格/基于像素位置的数据集,而不是插值的基于单位的位置,以避免计算网格的差异 此处是未优化的输入数据集示例 到目前为止,我已经能够编写一个例程来删除重复项,并删除与上一个点具有相同x或相同y的任何点 需要找到一种方法来识别重复出现的模式,并消除除了开始和结束模式的端点以外的所有模式-直线抽取。 我仍然没有找到一个库、类或代码片段,其中有人已经这样做了,但在我看来,这不是一个新的挑战,肯定有人发明了这个轮子
有一个非常好的叫做GIS的库,它有很多几何类型的函数。这可能包括您正在寻找的功能。它是LGPL许可的。我用它做多边形相交非常成功。

有一个非常好的叫做GIS的库,它有很多几何类型的函数。这可能包括您正在寻找的功能。它是LGPL许可的。我用它做多边形相交,非常成功。

道格拉斯·佩克算法呢 NetTopologySuite实现了这一点 我用它来简化GPX轨迹

如果将数据转换为线字符串,则使用起来非常简单

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

道格拉斯·佩克算法呢 NetTopologySuite实现了这一点 我用它来简化GPX轨迹

如果将数据转换为线字符串,则使用起来非常简单

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

这些点有多准确?你有关于他们的额外信息吗,比如订单,例如,如果它们是用鼠标绘制的,您可以按绘制顺序列出它们?这是一个以制表符分隔的格式的示例数据集。数据表示从图像文件中像素化的形状的边缘。我清除了pastie中禁用的制表符分隔的数据,它现在是一个以空间分隔的数据集。请参见上文的pastie链接这些点准确吗?你有关于他们的额外信息吗,比如订单,例如,如果它们是用鼠标绘制的,您可以按绘制顺序列出它们?这是一个以制表符分隔的格式的示例数据集数据表示已从图像文件像素化的形状的边缘我清除了Paste中禁用的制表符分隔的数据,现在它是一个以空间分隔的数据集请参见上文的Paste链接有关网络拓扑套件的提示。我会调查它,看看它能做些什么。我下载了zip文件,但在网站上找不到任何文档。您熟悉这个库中的任何文档吗?如果您下载了源代码zip,那么其中就有示例代码。我查看了代码、示例和系统的结构,以获取所需的内容。代码组织得很好,只是没有明确的文档。有XML文档,但您必须使用Sandcastle从中生成一个.chm。感谢您提供有关网络拓扑套件的提示。我会调查它,看看它能做些什么。我下载了zip文件,但在网站上找不到任何文档。您熟悉这个库中的任何文档吗?如果您下载了源代码zip,那么其中就有示例代码。我查看了代码、示例和系统的结构,以获取所需的内容。代码组织得很好,只是没有明确的文档。有XML文档,
但是您必须使用Sandcastle从中生成一个.chm.fossdal,谢谢您的输入-这看起来很值得一试。但是,在快速回顾中,您在这里的输入:lineString.Coordinates是否假设坐标在同一时间都是一行的?如何创建线条字符串?在我的例子中,这是一个PointF[]点数组,我需要首先识别其中的线,然后优化出过度定义的内容。另外,如何将我当前的数据集PointF[]放入icoordination[]类?我假设坐标是一条直线的ale,它不必是一条直线。您还可以在DouglasPeuckerLineSimplifier.Simplifycoords.ToArray,Distance;要创建坐标,只需在点F上循环并创建一个坐标;我已经创建了一个小示例,您可以加载测试数据,您可以在下载它,您可以使用0.001到0.006之间的值进行尝试,谢谢您提供的示例包。是否有可能将其输出为VS2008解决方案?它似乎是2010年,我无法打开它。谢谢我可能也可以从头开始重建它。很抱歉,我没有vs2008。代码很简单。请看Form1.cs filefossdal,谢谢您的输入。这看起来很值得一试。但是,在快速回顾中,您在这里的输入:lineString.Coordinates是否假设坐标在同一时间都是一行的?如何创建线条字符串?在我的例子中,这是一个PointF[]点数组,我需要首先识别其中的线,然后优化出过度定义的内容。另外,如何将我当前的数据集PointF[]放入icoordination[]类?我假设坐标是一条直线的ale,它不必是一条直线。您还可以在DouglasPeuckerLineSimplifier.Simplifycoords.ToArray,Distance;要创建坐标,只需在点F上循环并创建一个坐标;我已经创建了一个小示例,您可以加载测试数据,您可以在下载它,您可以使用0.001到0.006之间的值进行尝试,谢谢您提供的示例包。是否有可能将其输出为VS2008解决方案?它似乎是2010年,我无法打开它。谢谢我可能也可以从头开始重建它抱歉我没有vs2008代码很简单看看Form1.cs文件