在我的 C# WinForms 应用程序中,我有一个包含 2 条曲线的图片框(由电压/电流测量结果)。X轴是电压,Y轴是电流。电压轴的范围是 -5 到 5,但电流轴的范围要小得多,范围是 -10 uA 到 10 uA。任务是查看第二条曲线是否在第一条曲线的 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% 的差异的区域。
如果有人把我放在正确的方式会很好,我应该怎么看才能在原始曲线周围获得一个漂亮的包络?
更新 因为我太菜鸟了,直到现在我都找不到一种方法来实现对这个问题的答案,所以请赏金看看是否有人可以向我展示至少一种解决这个问题的编码方法。