在我的 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%的区域。
如果有人以正确的方式介绍我会很好,我应该如何寻找围绕原始曲线的漂亮包络线?
更新 因为我太菜鸟了,直到现在我还找不到一种方法来实现这个问题的答案,所以请悬赏一下,看看是否有人可以向我展示至少一种解决这个问题的编码方法。
最佳答案
您可以尝试找出每对点之间的梯度,并计算通过中点的正交线上任一侧的两个点。
然后您将定义另外两条线作为一组点,您可以使用它们来绘制包络线。
关于c# - 围绕曲线绘制包络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10896414/