将WPF PathGeometry分割成“瓷砖”

6
我有一个相当大的PathGeometry(超过100,000个点,描边但未填充),需要向用户显示,但任何时候只有一小部分路径可见。为了澄清,路径本身不是预先确定的,而是将从数据创建。
问题在于:我想提供非常平滑的平移效果,以便用户可以探索更大路径的区域。
我有一个可能的解决方案,但我不确定如何实现。我想使用平铺技术--将几何图形拆分成瓦片,并仅加载可见的瓦片。
那么,如何将仅描边的路径几何图形拆分成瓦片?更具体地说,如何确定存在于给定矩形瓦片中的路径部分?
我知道可以使用CombinedGeometry来确定路径几何图形和矩形之间的交集,但这将包括矩形的“墙壁”(将被描边)。是否有更好的方法来平铺仅描边的PathGeometry?
谢谢!
3个回答

3
也许你可以使用一个路径几何图形而不是平铺,通过数据绑定或其他方式以表示你所放大的路径段来动态更改路径数据。有点像DeepZoom,但是针对路径。这意味着你不必费力合并路径。
我正在做类似于你的事情,但我在我的路径中使用的数字略小,因此我没有考虑使用任何虚拟化方法。然而,我没有注意到严重的性能问题。我有一个包含大约1000-10000个点的滚动查看器中的路径,只有当我放大时才会出现卡顿,前提是点之间的距离非常远。如果路径中的点与其相邻点相对接近(例如漂亮的正弦波),则WPF会对它们进行某种优化,以防止任何明显的卡顿。
例如:这条路径...
...将需要比这条路径长时间绘制:
即使它们包含相同数量描述的点。尽管实际上,路径需要开始看起来像下面的图片,才能注意到性能上的差异。
由于路径代表音频波形,我打算通过执行某种检查来消除任何未来的问题,以查看这些点是否正在创建巨大的深蓝色块,并用一些不那么耗电的东西替换它,但这可能不是你的充分解决方案。
(对于图像大小的差异感到抱歉,计算正弦波的部分目前无法使用,因此我不得不使用旧的JPEG)

谢谢回复。听起来是一种好的技术,当您可以轻松确定用户被平移到哪个区域时应该显示路径的哪个子部分(例如,知道x_i和x_f,您可以确定要绘制哪些y值)。如果使用二维非参数化路径数据,这将更加困难(如何“快速”找出当前可见子路径的外观)。瓷砖背后的想法是预先确定每个瓷砖中将显示的路径子集(最好使用WPF的几何特性)并在需要时“快速”显示/隐藏瓷砖。 - FTLPhysicsGuy

2
我最近也在考虑这个问题,也许我的经验可以帮到你。首先,如果能使用StreamGeometry而不是PathGeometry,则可以获得更好的性能。我建议创建一个单独的StreamGeometry作为路径的数据属性,将其放置在画布上,然后应用比例和平移变换来导航形状。我使用了5或6个SeriesGeometries,每个都有1000个点(显然比你提到的数量少得多),但我相信只要不把所有点都显示在屏幕上,WPF图形引擎就会很好地缩放。如果需要支持“完全缩放”,即所有点都可见,则建议创建几何图形的低分辨率版本(即更简单的点集或位图),并在缩放达到某个级别时切换高低分辨率版本。
这样说清楚了吗?
祝你好运!

谢谢你提供关于StreamGeometry的信息 - 我会研究一下。我已经考虑过在完全缩小时使用“低分辨率”版本。然而,当你放大太多时,比例和平移选项会出现问题。请参见我在高缩放级别下转换画布的另一个问题(https://dev59.com/SE_Ta4cB1Zd3GeqPEuW8)。 - FTLPhysicsGuy

1
一种方法是将整个几何图形加载到画布中,然后对画布应用缩放。您可以使用第三方控件,如ab2d。
我已经创建了一个类似于Photoshop中的画布,其中有很多由用户创建的几何图形。我使用了ab2d来进行缩放,并且它运行良好。您还可以将预定义的缩放设置为其部分。
谢谢/subho100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接