作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想对 LineSeries
执行一个简单的仿射变换
不幸的是我不能简单地这样做:
foreach (var point in myLineSeries.Points)
{
point.X = point.X * Math.Cos(angle_rad) + point.Y ...
point.Y = ...
}
...因为 DataPoint
的属性 X
和 Y
没有公共(public) set
访问器
有没有一种方法可以在 LineSeries
上执行此类操作(简单的旋转/平移),而不必先调用 Clear
然后再调用 Add
新转换的DataPoints
(这对我来说不是很优雅)
最佳答案
与其直接在您的 LineSeries
中操作点,不如使用 MVVM:在您的View Model 中进行计算,然后将结果绑定(bind)到您的View.
View 模型:
public class MyViewModel
{
public ObservableCollection<DataPoint> Data1 { get; set; }
public ObservableCollection<DataPoint> Data2 { get; set; }
public MyViewModel()
{
Data1 = new ObservableCollection<DataPoint>();
Data2 = new ObservableCollection<DataPoint>();
double pi = Math.PI;
double a = pi / 4; // rotation angle
double fw = 5; // wave frequency
double fs = 100 * fw; // sampling rate
double te = 1; // end time
int size = (int)(fs * te);
// do your calculations
var x1 = Enumerable.Range(0, size).Select(p => p / fs).ToArray();
var y1 = x1.Select(p => Math.Sin(2*pi*fw*p)).ToArray();
//populate your Model (original data)
for (int i = 0; i < y1.Length; i++)
Data1.Add(new DataPoint(x1[i], y1[i]));
// transform original data
var x2 = Data1.Select(p => p.X * Math.Cos(a) - p.Y * Math.Sin(a)).ToArray();
var y2 = Data1.Select(p => p.X * Math.Sin(a) + p.Y * Math.Cos(a)).ToArray();
// populate your Model (transformed data)
for (int i = 0; i < y2.Length; i++)
Data2.Add(new DataPoint(x2[i], y2[i]));
}
}
XAML:
<Window x:Class="WpfApp93.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:oxy="http://oxyplot.org/wpf"
xmlns:local="clr-namespace:WpfApp93"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="350">
<Window.DataContext>
<local:MyViewModel/>
</Window.DataContext>
<Grid>
<oxy:Plot>
<oxy:LineSeries ItemsSource="{Binding Data1}"
DataFieldX="X"
DataFieldY="Y"/>
<oxy:LineSeries ItemsSource="{Binding Data2}"
DataFieldX="X"
DataFieldY="Y"/>
</oxy:Plot>
</Grid>
</Window>
关于c# - Oxyplot 中的仿射变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47869164/
我是一名优秀的程序员,十分优秀!