从规则间隔的数据生成轮廓线

时间:2009-03-12 20:45:30

标签: c++ algorithm grid contour

我目前正致力于数据可视化项目。我的目标是从网格化数据中生成等高线,换句话说是等值线。数据可以是温度,天气数据或任何其他环境参数,但只有条件是它必须有规律的间隔。 我在互联网上搜索,但是我找不到用于从网格生成轮廓线的好算法,伪代码或源代码。 有人知道从网格数据生成轮廓线的库,源代码或算法吗? 如果您的建议具有良好的运行时性能,那么将会很好,我不想等待我的用户:)

编辑:感谢您的回复,但是isolines有一些约束,就像它们不应该相交 所以只生成贝塞尔曲线并不能实现我的目标。

4 个答案:

答案 0 :(得分:4)

请参阅此问题:How to approximate a vector contour from an elevation raster?

它几乎是重复的,但使用了完全不同的术语。您会发现制图和计算机图形解决了许多相同的问题,但对它们使用不同的术语。

答案 1 :(得分:1)

在GNUplot中有一些相当不错的轮廓 - 如果你能够使用可能有帮助的GPL代码。

答案 2 :(得分:0)

正如Paul Tomblin建议的那样,Bezier曲线(它是B样条的一个子集)是解决问题的成熟解决方案。如果运行时性能是一个问题,Bezier曲线具有通过非常快的de Casteljau算法构造的额外好处,而不是根据参数方程绘制它们。如果您正在使用DirectX,它有一个用于de Casteljau的库函数,但使用描述它的1001网页自己酿造它应该没有挑战性。

答案 3 :(得分:0)

如果您的数据定期放置,这可以相当容易地完成(假设我正确理解您的问题)。首先,您需要确定您想要轮廓的间隔。接下来创建您将用于存储轮廓信息的网格(我假设这个轮廓级数据类型只是一个简单的开/关或高程),它应该比源数据小一个间隔。

现在这里的技巧是将2个网格偏移1/2个间隔(实际上不会出现在这样的代码中,但它是我在这里处理的概念)并比较当前周围的4个坐标指向您正在计算的轮廓数据网格。如果4个点中的任何一个处于不同的间隔范围内,则轮廓网格中的“像素”应设置为true(或者交叉轮廓范围的值)。

使用这种方法,当间隔过细会导致多个轮廓相互重叠时会出现问题。