在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将每次调用函数时都会更新的分数列表作为输入并绘制出来。然而,它似乎并不是这样工作的。有人能帮忙吗?如何在绘图中添加轴?
我尝试了很多开源替代方案,但实际上它们不是我所需要的,这就是我制作这个的原因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图表控制
要在每次设置变量的新值时进行更新,只需引发一个事件即可更新绘图。