2010-09-05 93 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

相關問題