呈现高度细粒度和“缩小”的数据。

8
互联网上有一个gif,某人使用某种CAD绘制了多个矢量图片。在第一帧中,他们放大到一个小点上,揭示了一个完全不同的矢量图片,只是在不同的比例上,然后他们进一步放大到另一个小点上,揭示出另一个详细的图片,多次重复。这是GIF的链接
或者另一个类似的例子:想象一下,你有一个时间序列,每个样本的粒度为一毫秒,当你缩小以揭示数年的数据时。

我的问题是:当大量数据被混合成单个像素时,这样的细节数据最终如何呈现出来?
您是否必须浏览整个数据集来渲染该像素(例如,在时间序列的情况下:仅遍历百万记录将其平均为1行,或在CAD的情况下渲染整个矢量图并将其模糊为小点),或者可以应用某些详细级别优化,使您不必这样做?
如果是这样,请问它们是如何工作的,以及可以在哪里学习相关知识?

Plotly可以创建可缩放的散点图。由于它是一个开源项目,所有必要的代码都可以进行审查。 - Paul
2个回答

3

这是游戏开发中非常常见的问题。在下面,我假设您正在使用场景图,即基于节点的对象树。

典型的解决方案涉及以下技术的混合使用:

  • 细节级别(LOD):同一模型的多个分辨率,仅显示或隐藏一个,以便任何时候只有一个“可见”。通常通过相机和对象之间的距离确定何时隐藏和显示,但您还可以将对象的比例包括在内。现代3D / CAD软件有时会提供自动“简化”模型,可用作低分辨率LOD模型。

在最低级别上,甚至可以只使用对象的边界框。检查边界框是否可见只需约1-7点检查,具体取决于您如何检查。您可以利用对象的父子关系进行传递性边界框。

  • 裁剪:如果一个多边形在视口中根本不渲染,则无需渲染它。在您发布的GIF中,当相机放大到新场景时,大模型留下的是后景中的单个多边形。

  • 重新缩放世界坐标:随着缩放的增加,顶点的坐标变为小于零的浮点数。考虑到您希望所有坐标尽可能精确,而现代CPU只能处理64位精度的浮点数(并且通常仅使用32位以获得更好的性能),重置可见对象的缩放是个好主意。我的意思是,当相机缩放到前一视图的1/1000时,您可以将较大的对象增加1000倍,并同时调整相机位置和焦距。任何新附加的小模型都将使用其原始比例,从而保留其精度。这种过渡对观众来说是不可见的,但允许您在无限缩放的同时保持明确定义的3D坐标。

    在更高级别上:当您缩进某些东西并且相机靠近对象时,它似乎相对于视图增长了。通常情况下,相机空间正在移动,而世界被相机的矩阵乘以。通过改变世界坐标而不是相机,可以实现相同的效果。


0

首先,您可以使用缓存。像地图制图一样使用瓦片。您仍然需要遍历所有点,但之后您将能够快速缩放。

但是,如果您没有额外的缓存内存(实际上不需要太多,比数据本身少得多),或者没有时间遍历所有点,则可以使用概率方法。

这可以简单地是每隔一个点进行窥视(或每10个点或适合您的任何其他数量)。对于某些数据,它产生了不错的结果。同样在地图制图中,它对海岸线非常有效,但对于具有许多直线的房屋或行政边界等则效果不佳。

或者,您可以采取更为激进的概率方法:随机窥视一些点,例如,如果有100个数据点击中像素一,而只有50个点击中像素二,那么您可以比较安全地假设如果您继续窥视点,像素一被击中的可能性将是像素二的两倍。因此,您可以放弃并以两倍的浓度颜色绘制像素一

还要考虑您可以和想要放入像素中的数据量。如果您将像素绘制为黑白,则只有256种颜色变体。您不需要更精确。或者,如果您要以全彩绘制像素,则仍然需要问自己:是否有人会注意到类似于rgb(123,12,54)rgb(123,11,54)之间的区别?


不是关于像素的颜色,而是它的位置。如果我跳过了100个数据点中的一个,而其中一个包含了巨大的尖峰,那该怎么办?因此,我会画一条平滑的线,而不是高度不规则的1像素宽的尖峰,这将表明某些异常情况。如何处理这个问题? - artemonster
颜色只是我所谈论的维度之一。简而言之:瓷砖和预处理,否则无法确定地处理数据异常。 - x00
即使没有图表和其他的东西,假设您有一个包含一百万个整数的数组。那么你如何知道其中是否有42以及有多少个呢?只能通过遍历整个数组(或者更加夸张地说 - 仔细阅读)才能得知。唯一可以做的另一件事情就是从数组中随机窥视,如果例如周围只有10000左右的数字,则可以猜测该数组中没有42。 - x00
别忘了 3 Sigma。 - x00

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