WPF利用ScottPlot實現(xiàn)動態(tài)繪制圖像
單擊移動
在了解ScottPlot的繪圖邏輯之后,在WPF中生成動態(tài)圖像簡直輕而易舉,只需不斷地刪除舊圖而繪制新圖即可。
新建一個按鈕,綁定下面的函數(shù)
ScatterPlot dynSinPlot; int dynClick = 0; private void btnDynSin_Click(object sender, RoutedEventArgs e) { var xs = Enumerable.Range(0, 100).Select(x => x / 10.0).ToArray(); double shift = dynClick / 10.0; var ys = xs.Select(x => Math.Sin(x+shift)).ToArray(); dynClick += 1; plt.Plot.Remove(dynSinPlot); dynSinPlot = plt.Plot.AddScatter(xs, ys, label: "sin"); plt.Plot.Legend(); plt.Refresh(); }
其中,dynClick用于計數(shù),以調(diào)整正弦函數(shù)的相位,這個函數(shù)的功能為,每點擊一次按鈕,正弦圖像便相左移動0.1 0.10.1弧度。效果如下
多線程
這種需要通過單擊才能更改圖像的方案,顯然不是我們所希望的,但自動的動態(tài)繪圖函數(shù),其實并不屬于scottPlot的功能,而需要使用C#的多線程。
首先,新建一個動態(tài)余弦繪制函數(shù),其相位取決于當(dāng)前的時間戳??紤]到我們將在新的線程中調(diào)用這個函數(shù),所以函數(shù)中在使用WPF對象時,需要在Dispatchar.Invoke中以委托的形式進(jìn)行。
ScatterPlot dynCosPlot; private void dynCos() { double t = DateTime.Now.Ticks/1000000.0; Console.WriteLine(t); var xs = Enumerable.Range(0, 100).Select(x => x / 10.0).ToArray(); var ys = xs.Select(x => Math.Cos(x + t)).ToArray(); Dispatcher.Invoke(() => { plt.Plot.Remove(dynCosPlot); dynCosPlot = plt.Plot.AddScatter(xs, ys, label: "cos"); plt.Plot.Legend(); plt.Refresh(); }); }
然后把這個函數(shù)放在一個循環(huán)中,為了能夠自由控制動態(tài)繪圖,這個函數(shù)需要傳入一個tocken,并寫在循環(huán)的判斷條件中。
private void TaskDynCosLoop(CancellationToken token) { while (!token.IsCancellationRequested) { dynCos(); Task.Delay(10); } }
最后添加一個按鈕,綁定下列動態(tài)繪圖函數(shù),每次點擊,都翻轉(zhuǎn)一次布爾型的drawDynCos,若翻轉(zhuǎn)后drawDynCos為True,則開啟動態(tài)繪圖,通過工廠方法開啟一個新的線程;若反轉(zhuǎn)后為False,則取消Tocken,從而中止繪圖。
bool drawDynCos = false; CancellationTokenSource dynCts; private void btnDynCos_Click(object sender, RoutedEventArgs e) { drawDynCos = ! drawDynCos; if (drawDynCos) { dynCts = new CancellationTokenSource(); Task.Factory.StartNew( ()=> TaskDynCosLoop(dynCts.Token)); } else { dynCts.Cancel(); } }
效果如下
到此這篇關(guān)于WPF利用ScottPlot實現(xiàn)動態(tài)繪制圖像的文章就介紹到這了,更多相關(guān)WPF ScottPlot繪制圖像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# 編碼好習(xí)慣,獻(xiàn)給所有熱愛c#的同志
c#編寫者,需要培養(yǎng)的一些好習(xí)慣2009-02-02C#中正則表達(dá)式(Regex)過濾內(nèi)容的基本使用方法
在 Regex 類中提供了很多方法來操作正則表達(dá)式,這篇文章主要給大家介紹了關(guān)于C#中正則表達(dá)式(Regex)過濾內(nèi)容的基本使用方法,需要的朋友可以參考下2022-08-08C#如何給新建的winform程序添加資源文件夾Resources
這篇文章主要介紹了C#如何給新建的winform程序添加資源文件夾Resources,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09Winform項目中使用FastReport.Net報表控件
這篇文章介紹了Winform項目中使用FastReport.Net報表控件的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06