欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

WPF利用ScottPlot實現(xiàn)動態(tài)繪制圖像

 更新時間:2023年12月19日 09:00:51   作者:微小冷  
ScottPlot是基于.Net的一款開源免費的交互式可視化庫,支持Winform和WPF等UI框架,本文主要為大家詳細(xì)介紹了如何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)文章

最新評論