在我的C# WinForms应用程序中,我有一个图片框,用于显示2个曲线(来自电压/电流测量)。X轴是电压,Y轴是电流。电压轴范围为-5到5,但电流轴的比例要小得多,范围为-10微安至10微安。任务是查看第二条曲线是否在第一条曲线的10%以内。
为了进行视觉检查,我尝试在第一条曲线(蓝色)周围绘制一个包络线。该曲线只是一个
为了进行视觉检查,我尝试在第一条曲线(蓝色)周围绘制一个包络线。该曲线只是一个
PointF
数组。目前,由于我不知道如何正确地绘制蓝色曲线周围的正确包络线,所以我只绘制了另外两条曲线,这些曲线是通过将原始曲线的X点添加和减去10%而得出的。当然,这是一个糟糕的方法,但至少对于明显垂直的曲线部分,它起作用。但是,一旦曲线处于非垂直部分,这个技巧就不再起作用了,正如下图所示:
这是我用来绘制信封的代码:
public Bitmap DrawEnvelope(double[,] pinData, float vLimit, float iLimit)
{
g = Graphics.FromImage(box);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
PointF[] u = new PointF[pinData.GetLength(0)]; //Up line
PointF[] d = new PointF[pinData.GetLength(0)]; //Down Line
List<PointF> joinedCurves = new List<PointF>();
float posX = xMaxValue * (vLimit / 100);
float minX = posX * -1;
for (int i = 0; i < pinData.GetLength(0); i++)
{
u[i] = new PointF(400 * (1 + (((float)pinData[i, 0]) + minX) / (xMaxValue + vExpand)), 400 * (1 - ((float)pinData[i, 1] * GetInvers((yMaxValue + iExpand)))));
}
for (int i = 0; i < pinData.GetLength(0); i++)
{
d[i] = new PointF(400 * (1 + (((float)pinData[i, 0]) + posX) / (xMaxValue + vExpand)), 400 * (1 - ((float)pinData[i, 1] * GetInvers((yMaxValue + iExpand)))));
}
Pen pengraph = new Pen(Color.FromArgb(50, 0 ,0 ,200), 1F);
pengraph.Alignment = PenAlignment.Center;
joinedCurves.AddRange(u);
joinedCurves.AddRange(d.Reverse());
PointF[] fillPoints = joinedCurves.ToArray();
SolidBrush fillBrush = new SolidBrush(Color.FromArgb(40, 0, 0, 250));
FillMode newFillMode = FillMode.Alternate;
g.FillClosedCurve(fillBrush, fillPoints, newFillMode, 0);
g.Dispose();
return box;
}
我添加了绿色圆圈,它们表示第二条曲线(红色)可能与原始曲线有超过10%的差异的区域。
如果有人能指导我,让我知道如何在原始曲线周围获得一个漂亮的包络线,那就太好了。
更新 因为我太菜了,无法实现到目前为止给出的答案,所以我放了一个赏金,看看是否有人可以友善地向我展示解决此问题的编程方法。