将WPF PathGeometry拆分为“tiles”

时间:2010-08-24 15:32:20

标签: wpf split tiling pathgeometry

我有一个相当大的PathGeometry(超过100,000个点并且描边但没有填充)为用户显示,但在任何时候只有一小部分路径可见。为了澄清,路径本身不是预先确定的,而是根据数据创建的。

问题:我想提供非常平滑的平移,以便用户可以探索更大路径的区域。

我有一个可能的解决方案,但我不知道如何解决它。我想使用平铺技术 - 将几何体分割成瓷砖,只加载可见的瓷砖。

那么,如何将仅笔划路径几何体拆分为切片。更具体地说,如何确定给定矩形区块中存在的路径部分?

我知道我可以使用CombinedGeometry来确定路径几何和矩形之间的相交,但是这将包括矩形的“墙”(将被描边)。是否有更好的方法来平铺仅限笔划的PathGeometry?

谢谢!

3 个答案:

答案 0 :(得分:2)

也许不是平铺只是使用一个pathgeometry并使用数据绑定或任何代表您放大的路径段以编程方式更改pathdata。有点像DeepZoom但有路径。这意味着您不必混淆合并路径。

我正在做类似于你的事情,但我使用的数字在我的路径中略少,所以我没有考虑使用任何虚拟化方法。但是,我没有注意到大量的性能问题。我在一个滚动查看器中有一个路径,代表大约1000 - 10000点,当我只有在点相距很远时放大时才会出现滞后现象。如果路径中的点相对靠近它们的邻居(例如,一个很好的扫描正弦波),那么WPF会对它们进行某种优化以防止任何难以理解的滞后。

例如:这条路......

multiple sines

...绘制时间比此路径要长:

simple sine

即使它们包含描述它的相同数量的点。虽然实际上在您发现性能有任何差异之前,路径需要开始看起来像下面的图像。

the troublemaker

因为路径代表的是音频波,所以我打算通过执行某种检查来查看这些点是否正在创建一个巨大的深蓝色块并用更少耗电的东西替换它来摆脱任何未来的问题。可能不适合你。

(对不起图像中的大小差异,计算正弦波的位此刻没有动作,所以我不得不使用旧的jpeg)

答案 1 :(得分:1)

我最近在考虑这个问题,所以也许我的经历可能对你有帮助。首先,如果您能够使用StreamGeometry而不是PathGeometry,则可以获得更好的性能。我建议创建一个StreamGeometry作为Path的Data属性,将其放在画布上,然后应用Scale和Translate变换来导航形状。我得到了5或6个SeriesGeometries,每个都有1000分(显然比你提到的数字少得多),但我相信只要你没有屏幕上的所有点,WPF图形引擎就可以很好地扩展同时。如果您需要支持“完全缩小”,即所有点都可见,那么我建议创建几何的低分辨率版本(即更简单的点集或位图)并交换高低-res版本在缩放达到某个级别时。

这有意义吗?

祝你好运!

答案 2 :(得分:0)

一种方法是,在画布中加载整个几何体。然后将缩放应用于画布。您可以使用第二方控件,如ab2d。

我已经在photoshop中创建了一个类似画布的画布,其中有许多图画(由用户创建),其中几何形状位于那里。我已经使用ab2d来放大它的menucontrol,它工作正常。您还可以将预定义缩放设置为其中的一部分。

谢谢/ subho100