【问题标题】:UI Virtualization using Polylines使用折线的 UI 虚拟化
【发布时间】:2011-03-30 14:27:10
【问题描述】:


我想虚拟化折线。在我的应用程序中,最多显示了 7 条折线,每条折线拥有多达 900 万个点(当然,只有一小部分是可见的)。每条折线都绑定到 PointCollection。所有多段线都在 ScrollViewer 控件内,滚动会影响每一条。
现在,我想知道折线的虚拟化是如何实现的。我在 Microsoft 的 Chris Lovett 上找到了一篇关于 Virtual Canvas 的文章,但我不确定它是否能解决我的问题。有没有人经历过类似的事情?
提前致谢。

【问题讨论】:

    标签: c# wpf virtualization


    【解决方案1】:

    我遇到了类似的情况,决定实现虚拟化如下: 我正在处理的数据(折线的点)位于真实世界的坐标中,并且比显示器上显示的要详细得多。用户还应该能够放大并查看更多细节。

    1. 在世界坐标中确定显示器上两个(或三个)像素之间的距离。这让我可以决定是否可以删除折线的一个点,因为它最终会在与相邻点相同的像素位置。
    2. 循环遍历点:

      一个。如果当前点与前一个点在显示屏上的位置相同:跳过它。

      b.如果当前点和前两个点位于一条直线上,则不需要前一个点:删除前一个点,添加当前(并添加下一个点(D)以防止将缓慢弯曲的曲线四舍五入一条直线)。

    3. 使用收集的点绘制折线

    根据数据,这帮助我将原始设置减少到大约 30%,但这完全取决于数据。那里没有保证;)

    当用户放大时,我只是从第 1 步开始重新计算。

    我在算法中添加了很多参数,因此我可以对其进行调整和调整,以找到性能和图像质量之间的最佳平衡点。例如,我添加了一个 epsilon,它允许我指定通过 A 和 C 的线之间的距离,并且允许 B 点仍然认为 B 点在线。

    如果这有帮助,请告诉我。

    【讨论】:

    • 我明白你的意思,但恐怕它不适用于我的情况,因为折线不应该可视化对象/图像。它正在可视化 ECG 等医疗数据。所以假设有来自 24 小时心电图测量的数据,并且我已经减少了数据集。你看我不需要在水平/时间方向上简单地在垂直方向滚动。我认为最好的方法是将整个数据集的一个子集加载到 PointCollection 并按需加载更多数据。然而,问题是模拟数据将完全存在,可能会出现scolling......
    • 啊,是的,你是对的,我的解决方案对你没有帮助。在您的情况下,我可能会创建一组固定的点并在滚动时对其进行操作。这样,您只会更改坐标,而不会添加到集合中或从集合中删除,这样可以节省大量时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    相关资源
    最近更新 更多