You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个XY绘图中合并两个信号?(基于WPF代码实现)

将两个WPF XY信号合并到同一个绘图的解决方案

要把两个信号放到同一个XY绘图里,咱们需要做几个关键修改——统一绘图容器、合并坐标范围,还要给两个信号设置区分样式,具体步骤如下:

1. 简化XAML布局,只保留一个Canvas

原来你用了两个Grid和两个Canvas分开绘制信号,现在只需要一个Canvas即可,删掉多余的容器:

<Grid Grid.Row="0" Grid.Column="0"> 
 <Canvas x:Name="gCanvasPlot" Width="500" Height="150" ... /> 
</Grid>

2. 计算全局坐标范围(核心!)

原来每个信号都用自己的X/Y极值转换坐标,直接画在一起会导致坐标系不统一,两个信号可能错位或显示不全。所以咱们要先合并两个信号的参数,算出整个绘图的全局极值:

// 提取两个信号的原始范围参数
var params0 = glistdParams0;
var params1 = glistdParams1;

double xMin0 = params0[1], xMax0 = params0[2];
double yMin0 = params0[3], yMax0 = params0[4];

double xMin1 = params1[1], xMax1 = params1[2];
double yMin1 = params1[3], yMax1 = params1[4];

// 计算全局范围:取两个信号里最小的X、最大的X,最小的Y、最大的Y
double globalXmin = Math.Min(xMin0, xMin1);
double globalXmax = Math.Max(xMax0, xMax1);
double globalYmin = Math.Min(yMin0, yMin1);
double globalYmax = Math.Max(yMax0, yMax1);

3. 调整Plot方法适配全局范围

原来的Plot方法依赖每个信号自己的参数,咱们可以修改它直接接收全局范围参数,这样更灵活:

private void Plot(Canvas canvas, Polyline poXY, double dXmin, double dXmax, double dYmin, double dYmax, List<Point> listPoints) { 
 double dPlotWidth = dXmax - dXmin; 
 double dPlotHeight = dYmax - dYmin; 
 
 // 清空Polyline原有点,避免重复绘制
 poXY.Points.Clear();
 
 foreach (var originalPoint in listPoints) { 
     var pointResult = new Point { 
         X = (originalPoint.X - dXmin) * canvas.Width / dPlotWidth, 
         Y = canvas.Height - (originalPoint.Y - dYmin) * canvas.Height / dPlotHeight 
     }; 
     poXY.Points.Add(pointResult); 
 } 
 
 // 确保Polyline只被添加一次
 if (!canvas.Children.Contains(poXY))
 {
     canvas.Children.Add(poXY);
 }
}

4. 设置信号样式并调用绘图

给两个Polyline设置不同的颜色/粗细,这样能直观区分两个信号,然后用同一个Canvas和全局范围绘制:

// 给第一个信号设置蓝色粗线
gpoXY0.Stroke = Brushes.Blue;
gpoXY0.StrokeThickness = 2;

// 给第二个信号设置红色粗线
gpoXY1.Stroke = Brushes.Red;
gpoXY1.StrokeThickness = 2;

// 调用Plot方法,传入同一个Canvas和全局范围
Plot(gCanvasPlot, gpoXY0, globalXmin, globalXmax, globalYmin, globalYmax, glistPoints0); 
Plot(gCanvasPlot, gpoXY1, globalXmin, globalXmax, globalYmin, globalYmax, glistPoints1); 

额外说明

如果你的两个信号本来就有完全相同的X/Y范围,可以跳过全局范围计算的步骤,直接用其中一个信号的参数即可,但保留全局范围逻辑能让代码更通用,适配不同范围的信号。

内容的提问来源于stack exchange,提问作者ttom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:12:47