2010-09-05 89 views
5

我目前正在尝试渲染一个Mandelbrot集,并且我很快意识到不必为每个渲染重新计算最大迭代次数是有用的......另一方面,它是大量数据不要跟丢。在我看来(基于我对RDMS有限的经验),关系数据库可能不是我们要走的路,因为我不希望数据集变大时性能受到影响。它几乎看起来像一个哈希表的完美情况,但我从来没有使用过,似乎无法解决如何使用或管理现有的Web服务器语言之一(Python/PHP /无论)。什么可能是在数据库中存储Mandelbrot值的最佳方法?

是一个小更明确:要存储的重要的价值观是:

  • 原实了一些关于复平面部分一些
  • 原来的虚部在复飞机上
  • 最大迭代次数
  • 的数量10次​​完成迭代Ñ最大迭代之前被击中,或直到点跑出到无穷
  • 在复平面上一个数的最终实部Ñ迭代
  • 最终虚部在复平面上一个号码后ň迭代

在任何给定的时间,考虑到原来的实部的,原始虚部最大迭代次数,我希望能够得到最终实部和虚部的结果集。

那么你怎么看?哈希表是要走的路吗?对于简单的数据结构,问题是否过于复杂?

任何帮助都将不胜感激。提前致谢!

编辑

我对这个问题一点在julienaubert的各种要求阐述。

我的目标是允许用户放大Mandelbrot集,而不会延迟计算(即使它是通过预定义的缩放)。我也希望能够在浏览器中做到这一点,该浏览器不断要求服务器提供新的数据阵列,以便在复杂的平面上显示新的x和y坐标以及高度和宽度。但是,由于计算像素颜色值可以更快地完成(给定max_iter,real_final和imag_final),并且由于允许用户调整颜色设置会很好,所以我只会发送浏览器在我的文章中枚举的变量并让用户的浏览器计算颜色。

看看这个:

http://jsfiddle.net/xfF3f/

如果你看一看的drawMandelbrot()函数,你可以看到点环路存储在一个名为数据集变量的重要价值。然后在drawMandelbrotFromData()函数中使用该变量,在该函数中执行计算每个像素颜色所需的剩余计算。

如果您单击“cleardabrot”,它将用白色矩形替换画布。如果你点击“refilldabrot”,它会再次运行drawMandelbrotFromData()函数......这样做是为了向你展示如果它不需要执行痛苦的迭代计算,它能够实际渲染集合的速度有多快。

因此,这里的最终目标是能够将这些值计算为任意精度,因此用户可以放大到该集合的任何级别,让服务器计算出是否有这些确切点的任何数据(或者,最好是指向NEAR那些确切的点......尽管我不确定如何在没有执行某种类型的范围查询的情况下完成这项工作),然后逐个像素地吐出信息。例如...

  • 用户正在使用300x300的画布。
  • 他放大到左上角为x = .000001y = .0000231的点。
  • 他所选择的宽度和高度在该帧是w = .00045h = .00045

他将发送这些数字关闭到服务器并接收,又与300名* 300的索引的阵列(一个表示的每个点),每个都包含必要的信息以确定画布上每个像素的颜色。我的问题在于...存储预先计算的Mandelbrot数据的最佳方法是什么,以便用户可以输入任意的x,y,w和h值并快速地将复数平面上的点的值拉回范围。

回答

2

在任何给定的时间,考虑到原 实部,原来的虚 组成部分,也是 迭代的最大数量,我希望能够得到 与最终的实际结果集和 虚部。

从你的问题中不清楚你为什么需要这个?为什么你需要在同一点重新计算?

如果您正在尝试使用不同的max_iterations设置,您可以将以每像素级别采集的actual_iterations保存在二进制文件,文本文件或图像中,或者您可以方便地加载/存储的任何内容,例如。一个关系数据库。

如果您正在进行实时渲染,并且您正在使用一些需要重新计算递推方程的处理(在相同的原始点并且具有相同的最大迭代次数),那么我会想象您可以通过有一张查询表。

显然,您的查找表必须比计算速度快。您需要一个查找表,以下操作总计少于再次执行计算。

  • 指数计算(考虑origo_real,origo_imag,max_iter)
  • 加载缓存的计算(final_real,final_imag,actual_iter)
  • 一个初始店

取决于你将如何重新计算/重新访问,您可以将问题划分为这样一种方式,即该索引很可能位于查找表中,并且查找表足够小以存储在L1或L2中缓存。

这些是一些想法..但你应该澄清你真正的问题是什么。

如果你只需要很多这样的数据进行进一步的分析和实时的没有要求,那么好...澄清你真正的问题是什么:)

答案更新

它看起来类似于使用地图服务(放大/缩小,移动),也就是说,您本质上是为给定区域提供图像并进行缩放。

但是在这种情况下,由于可能会查询任何缩放级别,因此无论您为一个用户缓存什么,都可能不会被重新用于下一个用户。我不确定为什么这样做是合理的,而不是写一个客户端软件,用户可以在其中实时缩放(已完成)。

无论如何。如果你的主要问题是带宽,但你有足够的计算能力,那么你可以将计算出的补丁图像存储在一个高度压缩的文件中,质量稍差并缓存这些图像。然后,您可能需要将这些补丁拼接在一起以提供用户想要的确切区域。诀窍是查询给定缩放和面积的最小补丁集。

我担心大多数查询会要求不存在的补丁(因为任何缩放级别都是可能的)。也许关于如何的一些信息谷歌地图/ GIS系统的工作可以给你一些想法。如果你的主要问题是CPU,那么也许你可以做不同的处理,让用户在Applet中做计算(并且可能返回结果)

如果你正在学习如何通过客户端缓存/计算服务器,你可能想要考虑一个不同的挑战,因为这个可以通过任何体面的计算机在客户端解决。

+0

感谢您的回答,julienaubert!我已经添加了一大块新的信息,希望能让你更好地理解我想要达到的目标。我会继续写作,直到我的话跑到无穷(可以这么说),如果它可以帮助你! – treeface 2010-09-05 21:03:56

+0

@ julienaubert再次感谢julienaubert。我想你对这个最初计划的不切实际性是正确的。我想我真正打算做的是让用户通过预渲染缩放运行,只是为了让人们了解canvas元素在渲染方面可以做些什么。我可能还会通过持久的Web套接字连接来实现最高传输速率。我已经给你这个答案的要点,但如果你有更多的想法,我很乐意听到他们。再次感谢! – treeface 2010-09-07 17:30:13

+0

为什么你不让他们画在画布上,并合作:) – user348466 2010-09-07 18:57:37

相关问题