在c#中绘制二次方程曲线

Drawing the quadratic equation curve in c#

我是 c# System Draw 的新手,所以请帮助我编写代码。我正在尝试绘制二次方程曲线并使用 "for" 循环来为曲线点 10 个坐标。我已经多次测试过这段代码,但当我启动代码时什么也没有出现。此外,每当我 运行 代码时,我都会收到消息 ArgumentException 未处理,参数对代码“g.DrawCurve(aPen, Points);”无效突出显示。请帮助我解决我花了很多天试图解决的这个问题。

{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs e)
    {

        float a = 10, b = 30, c = 10;
        double x1, x2, delta, cx1, cx2, y1, y2;
        int icx1, iy1, icx2, iy2;
        delta = (b * b) - (4 * a * c);
        x1 = ((b * (-1)) + Math.Sqrt(delta)) / (2 * a);
        x2 = ((b * (-1)) - Math.Sqrt(delta)) / (2 * a);
        for (int i = (-10); i <= 10; i = i + 1)
        {
            cx1 = i * x1;
            cx2 = i * x2;
            y1 = (cx1 * cx1 * a) + (cx1 * b) + c;
            y2 = (cx2 * cx2 * a) + (cx2 * b) + c;
            icx1 = Convert.ToInt32(cx1);
            iy1 = Convert.ToInt32(y1);
            icx2 = Convert.ToInt32(cx2);
            iy2 = Convert.ToInt32(y2);


            Graphics g = e.Graphics;
            Pen aPen = new Pen(Color.Blue, 1);
            Point point1 = new Point(icx1, iy1);
            Point point2 = new Point(icx2, iy2);
            Point[] Points = { point1,point2 };
            g.DrawCurve(aPen, Points);
            aPen.Dispose();
            g.Dispose();


        }

不要处理 GraphicsPen 实例 - 你在循环的每一步都这样做。

相反,获取 Pen 的一个实例(请注意,您可以使用全局 Pens.Blue :)),不要处理它,或者 Graphics对象。

此外,开始时尝试使用 DrawLine 而不是 DrawCurve - 它不会为您提供很好的抗锯齿图形,但它更容易。只有在您了解如何正确使用它后,才从 DrawCurve 开始:) 其中一点是您不能仅通过两个点来绘制它,当然 - 您至少需要三个。

DrawCurve 通过所有指定点绘制一条样条曲线。所以实际上,您只能调用一次,使用您预先计算的二次方的所有点。这会给你一个很好的渲染曲线。但是,我不确定它是否真的是一个真正的二次曲线——我不确定 GDI+ 的样条曲线是二次曲线还是(更有可能)三次曲线。无论如何,它不适用于不同曲线的精确渲染。

关键问题是代码处理了 Graphics 对象。在第二次迭代中,图形对象已被释放,对 DrawCurve 的调用将失败。

并且如评论中所述,DrawCurve 方法需要数组中的 3 个点。请参阅 MSDN Page for DrawCurve

的备注

应尽可能减少对笔的所有其他 Dispose 调用,以防止重新创建如此多的笔。

关于图表:我不完全确定你在做什么,但如果你想画抛物线,你不应该解二次方程,而是把 x 值放在方程中。

伪代码:

for x = -10 to 10 step 3

    if SavePoint == null

        x1 = x
        y1 = a * x1 * x1 + b * x1 + c

        point1 = TransformToLocalCoordinates(x1, y1)

    Else

        point1 = SavePoint

    End if

    x2 = x + 1
    y2 = a * x2 * x2 + b * x2 + c

    point2 = TransformToLocalCoordinates(x2, y2)

    x3 = x + 2
    y3 = a * x3 * x3 + b * x3 + c

    point3 = TransformToLocalCoordinates(x3, y3)

    DrawCurve point1, point2, point3

    SavePoint = point3

next