在c中创建一个数学图

本文关键字:一个 创建 | 更新日期: 2023-09-27 18:22:10

我有一个c#xaml项目,我想创建一个实时描绘函数和输出变量的图。我想绘制每次变量的新值,并在xaml中的图表中演示它。我该怎么做?我使用的是.NET 4.5。我试着按照下面的答案去做。我创建了以下代码:

 private void AddChart(List<float> scores)
    {
        // Draw sine chart:
        polyline = new Polyline { Stroke = Brushes.Black };
        for (int i = 0; i < scores.Count; i++)
        {
            var y = scores[i];
            polyline.Points.Add(CorrespondingPoint(new Point(i, y)));
        }
        canvas.Children.Add(polyline);
    }
    private Point CorrespondingPoint(Point pt)
    {
        var result = new Point
        {
            X = (pt.X - xmin) * canvas.Width / (xmax - xmin),
            Y = canvas.Height - (pt.Y - ymin) * canvas.Height
                / (ymax - ymin)
        };
        return result;
    }

AddChart将每次调用函数时都会更新的分数列表作为输入并绘制出来。然而,它似乎并不是这样工作的。有人能帮忙吗?如何在绘图中添加轴?

在c中创建一个数学图

我尝试了很多开源替代方案,但实际上它们不是我所需要的,这就是我制作这个的原因https://github.com/beto-rodriguez/Live-Charts当您克隆repo时,它有一个很好的文档和示例。

XAML

<charts:LineChart Height="300" x:Name="LineChart" 
          Background="#FBFBFB" BorderBrush="LightGray" BorderThickness="1"
          Zooming="True"></charts:LineChart>

C#

        LineChart.Series = new ObservableCollection<Serie>
        {
            new LineSerie
            {
                PrimaryValues = new ObservableCollection<double>
                {
                    -10, 5, 9, 28, -3, 2, 0, 5, 10, 1, 7, 2
                }
            }
        };

或者,如果您希望拥有更多的控制权,可以考虑借助Canvas进行缩放:

<Window x:Class="MathPlot.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:MathPlot"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Canvas x:Name="canvas" HorizontalAlignment="Left" Height="240" Margin="21,37,0,0" VerticalAlignment="Top" Width="463"/>
    <Button x:Name="Draw_Sin" Content="Draw Sin" HorizontalAlignment="Left" Margin="21,292,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="-0.498,-0.932" Click="Draw_Sin_Click"/>
</Grid>

和C#代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void Draw_Sin_Click(object sender, RoutedEventArgs e)
    {
        AddChart();
    }

    private double xmin = 0;
    private double xmax = 6.5;
    private double ymin = -1.1;
    private double ymax = 1.1;
    private Polyline polyline;

    private void AddChart()
    {
        // Draw sine chart:
        polyline = new Polyline {Stroke = Brushes.Black};
        for (int i = 0; i < 70; i++)
        {
            var x = i / 5.0;
            var y = Math.Sin(x);
            polyline.Points.Add(CorrespondingPoint(new Point(x, y)));
        }
        canvas.Children.Add(polyline);
        // Draw cosine chart:
        polyline = new Polyline
        {
            Stroke = Brushes.Black,
            StrokeDashArray = new DoubleCollection(new double[] {4, 3})
        };
        for (int i = 0; i < 70; i++)
        {
            var x = i / 5.0;
            var y = Math.Cos(x);
            polyline.Points.Add(CorrespondingPoint(new Point(x, y)));
        }
        canvas.Children.Add(polyline);
    }
    private Point CorrespondingPoint(Point pt)
    {
        var result = new Point
        {
            X = (pt.X - xmin)*canvas.Width/(xmax - xmin),
            Y = canvas.Height - (pt.Y - ymin)*canvas.Height
                /(ymax - ymin)
        };
        return result;
    }
}

这个库对您来说可能很有趣:http://www.codeproject.com/Articles/32836/A-simple-C-library-for-graph-plotting

这里的这个问题可能也很有帮助:WPF图表控制

要在每次设置变量的新值时进行更新,只需引发一个事件即可更新绘图。

相关文章: