陣列中有幾百萬個點, 連成曲線繪圖,要放大、縮放,如何能提高繪圖速度?????,對于常規解析度下的曲線顯示,當點數遠遠超過解析度像素時,有很多曲線點是完全無法表達出來的。如果全都繪制出來會很慢,能不能取大量資料點中的特征點繪制,原則是盡量不影響曲線的大致形狀。怎么實作啊?前提是還不能影響我的放大、縮小曲線功能!!!!!!!!!!!!!!!最好有具體的代碼謝謝了
uj5u.com熱心網友回復:
只有在記憶體中操作是最快的,至于幾百萬個點,我沒有敢想會是個什么情況,不過可以給你個記憶體中繪圖再顯式大圖片上的例子,興許對你有幫助:http://download.csdn.net/detail/veron_04/2368159
uj5u.com熱心網友回復:
vb繪幾百萬個點也最多也就十幾秒鐘,不過這幾百萬個點繪成的曲線擠在一屏還有什么特征可言,都成面了。每一次繪圖應該只繪視窗能顯示的點數,也即不超過視窗的ScaleWidth,至于放大縮小,只需改變ScaleWidth的值即可,用不著你處理.
uj5u.com熱心網友回復:
1.大量增加CPU和GPU的核數;2.大量增加記憶體和顯存的G數.
uj5u.com熱心網友回復:
另外,想在放大和縮小時不影響影像質量,得用矢量圖形.uj5u.com熱心網友回復:
分級顯示,縮小時細節不顯示,放大顯示區域細節uj5u.com熱心網友回復:
哪位高手能說的具體點么?最好有代碼,謝謝了.資料如
時間(小時) 溫度
0.00027778 16.381
0.00055556 17.488
0.00083333 19.560
0.00111111 25.624
0.00138889 36.682
0.00166667 23.740
0.00194444 16.797
......
在文本里有百萬行,怎么才能提高速度啊,繪制使螢屏解析度有限,肯定有很多重復的點,如何才能只畫不重復的點,這樣就可以不改變圖形的形態,但怎么實作才能速度快請高手指點
uj5u.com熱心網友回復:
這么大的資料量,取特征資料是關鍵,而不是全畫.按照LS給的資料,我考慮應該這樣做.
大約1秒1個資料,那么首先考慮橫坐標的劃分,橫坐標以1分鐘計.10個小格就是每6個資料的均值畫點.
畫滿大約是1000個小格就是100分鐘的資料圖,基本可以連貫起來,而且資料真實.
如果怕資料失真,可以加入放大縮小功能.總之,畫前要先自動計算螢屏需要重繪的點數,然后再求值畫點,比一股腦全畫上去速度高,可看性強。
另外ls說到文本中的資料,處理起來就有些麻煩了,不如資料庫方便。
uj5u.com熱心網友回復:
我是個初學者,希望大家指教,取特征資料最好最快的演算法是什么,謝謝了?給我寫的更詳細點吧uj5u.com熱心網友回復:
可把資料按時間等分為若干段(段數肯定要小于能顯示的點數),每一段取其平均值(或中位數)作為該段的代表(特征,不用極值,因為一段內會有很多極值),繪出曲線即可,這樣可基本保留圖形的特征,你大可不必糾結于圖形的某些時段會出現高峰或低谷,想想誰能從幾百萬個點中找到高峰或低谷?即使想看更多細節也可通過放大圖形得到。圖形的放大與縮小:由上面的繪制方法,只需改變段的長度(如一天改為一小時,一秒改為十分鐘)即可實作圖形的放大與縮小。
uj5u.com熱心網友回復:
我想按溫度資料的大小來找特征點,這怎么實作啊?有什么好的演算法?謝謝大家指教uj5u.com熱心網友回復:
我覺得樓主作為一個初學者就不要一下子塞太多東西.還是先回頭去實作那個最初的目標吧:
假設你的Picture控制元件寬度是1000個像素, 要如何最有效率地將百萬個資料描上去?
其實你也看出來了, 這么密集的資料, 點和點之間連不連線已經是無關緊要的事了.
而且你肯定也發現了, 要把所有資料都畫上去是沒有意義的.
所以剩下的就是如何挑選資料的事了.
這個和VB也好C也好, 其實關系都不大, 純粹是數學或思路方面的事情了.
所以樓主可以自己解決吧.
uj5u.com熱心網友回復:
至于"特征點", 你把任何一個股票一年的變化曲線壓到一屏顯示, 還能從上面辨別出每一天的"特征"么? 更何況你的資料壓縮比遠大于這個.
別人的思路不見得適合你的問題, 還是小馬過河吧.
uj5u.com熱心網友回復:
我想用位圖法實作重復資料不顯示,怎么實作啊,請高手指點uj5u.com熱心網友回復:
你想得也太多了點,不就是一條曲線,搞得這么復雜。
1、寫記憶體DC位圖只是在機器性能的確不能滿足的情況下才會考慮,重要的是演算法,否則就是直接寫屏也不會快。
2、關于特征,特征只是一個相對概念,拿你的溫度采集資料來說,若一分鐘采集一次,則這個資料就只是這一分鐘的特征,若一天一次,則這個資料就是一天的特征,溫度與時間本身是一個連續函式,你采集到的資料盡管間隔很小,但并不能代表就是溫度變化的曲線,只能是一種近似,所以你的資料已經是溫度曲線的“特征”了,你還要怎樣的特征?同樣的,你把現有資料任意等距拿出一部份,或者一段時間內的多個資料的平均值、中位數等,都可以作為“特征”。(注:初中數學統計:平均值、中位數、眾數可以作為資料的代表
)3、重復資料不顯示,資料里有“重復資料”本身就是資料的一個特征,你不畫,不就丟了這個特征?應該說,若一段時間內的重復資料比較多,那你就取這段時間的眾數作為這段時間的“特征”就是了。
最后,人眼能看到最多不會超過螢屏的寬度,最多也就一兩千個點,用效率最慢的PSet來畫都已經足夠了,你要做的,就是每次畫圖時選出這些點。
uj5u.com熱心網友回復:
最簡單的辦法:
定義一個值A,這個值代表物理界面上最多能顯示的溫度點的數量,比如1000,超過此值的話顯示的相鄰點已經在物理上是同一像素點了,再顯示就是無意義,白費CPU與記憶體等硬體資源.
然后繪圖時,肯定會有一個顯示范圍,是所有資料都顯示呢,還是只顯示某些天之內的資料.
顯示范圍確定后,就能得到這個范圍內的原始資料數量,這里假設你要顯示所有資料,就是從0到1000000.
那么,由于物理界面上最多只能顯示A個溫度點,因此只需要每隔1000000/(1000000-A)取一個溫度點顯示出來就行了.
這樣,無論何時只有A個溫度點在顯示,速度無論如何也不會慢啦.
uj5u.com熱心網友回復:
如果我的溫度資料瞬時變化比較大從15一下變到120,又從120變到30,這樣如何每隔多少點取就能把這種特征點漏掉,在曲線上就看不到這幾個點的波動,還是要找到曲線特征點才行啊,謝謝了大家了,哪位高手再給指點一下,有更好的演算法嗎,我的繪圖范圍是所有資料都顯示.請高手指點uj5u.com熱心網友回復:
你可以做一些試驗,先不要考慮效率問題1,全畫出來
2,每隔一個點畫一個
3,每隔5個點畫一個
4,每隔10個點畫一個
先看看這些有什么區別,自己有個清晰直觀的認識
然后你可以對于這些資料作一些區間分析,如果你畫圖的單位是twip那么差不多15個twip=1個像素,你可以看看如果前后兩個點相差不足5的話就去掉?
uj5u.com熱心網友回復:
如果我的溫度資料瞬時變化比較大從15一下變到120,又從120變到30,這樣如果每隔幾點取一點就會把這種特征點漏掉,在曲線上就看不到這幾個點的波動,還是要找到曲線特征點才行啊,謝謝了大家了,哪位高手再給指點一下,有更好的演算法嗎,我的繪圖范圍是所有資料都顯示.請高手指點uj5u.com熱心網友回復:
資料可以處理后在繪制,比如連續10個資料求個平均值,作為一個有效資料。實際上很多資料處理都是如此的。uj5u.com熱心網友回復:
高手們能說的更詳細一點么?我是個初學者,不好意思了。最好有詳細的演算法和代碼uj5u.com熱心網友回復:
更好的演算法可求函式的導數(差商)、二階導數(二階差商),就怕CPU傷不起
uj5u.com熱心網友回復:
假定要顯示資料1百萬,用于顯示的區域寬度為 1000,則每列像素要表示 1000000 / 1000 = 1000 個點。
即 1 個 X 有 1000 個 Y,這樣的繪圖只能用統計的方式:
對這 1000 個資料分別求最大值、最小值、平均值;共 1000 組資料。
最后的繪圖就是最大值、最小值、平均值 3 條曲線,每條 1000 個折點。
uj5u.com熱心網友回復:
如果不要求一次全部顯示出來,就不要全部畫。還有,你的這些點差距都很小,你可以選擇每隔3個點甚至更多地取一個繪圖點,這樣100萬個資料只有33萬個繪圖點,這樣就快了。每兩個繪圖點之間用Line方法畫線,就是用折線圖代替很精確的曲線圖,因為兩個點之間間距小,看不出來的,既然看不出來,你畫那么多也沒意義。只有在放大的時候,你算好放大多少倍的時候,兩個繪圖點之間的差距足夠遠,必須要把中間省略的點繪上,你再畫中間省略的點。
uj5u.com熱心網友回復:
樓主,問題最后解決了么,采取什么樣的辦法,分享分享!uj5u.com熱心網友回復:
只繪制看得見和看得清的像素點。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/121732.html
標籤:VB基礎類
上一篇:socket 異步通訊問題
