c# - 围绕曲线绘制包络

标签 c# winforms math

在我的 C# WinForms 应用程序中,我有一个包含 2 条曲线的图片框(来自电压/电流测量结果)。 X 轴是电压,Y 轴是电流。电压轴的范围从 -5 到 5,但电流轴的范围小得多,范围从 -10 uA 到 10 uA。任务是查看第二条曲线是否在第一条曲线的 10% 以内。

为了目视检查,我试图在第一条曲线(蓝色曲线)周围绘制一个包络线。曲线只是一个 PointF 数组。目前,由于我不知道如何围绕蓝色曲线绘制正确的包络线,我只绘制了另外两条曲线,它们是实际曲线的 X 点加上和减去原始曲线的 10% 的结果。当然这是一个糟糕的方法,但至少对于明显垂直的曲线部分,它是有效的。但是一旦曲线处于非垂直部分,这个技巧就不再有效,如下图所示:

enter image description here

这是我用来绘制信封的代码:

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/

相关文章:

c# - 如何从另一个表单更改标签的文本?

c# - 匹配优于 C# 应用程序中的舍入

java - 蛮力基础256乘法

c# - 如何使事件处理程序中的发件人成为我的自定义控件而不是其中的标签

c# - 控制根据鼠标指针所在的位置显示文本

python - 如何在 python 2.7 中使用 "e"(欧拉数)和电源操作

c# - 更新时保留 Entity Framework 中的导航属性而不进行跟踪

c# - 存储过程删除查询不起作用。但是当它自己在编辑器中运行而不调用它时它可以正常工作

c# - 使用naudio录制特定的应用程序音频

c# - Visual Studio 中设置缩进样式的位置?