【问题标题】:Drawing the quadratic equation curve in c#在c#中绘制二次方程曲线
【发布时间】:2015-02-09 07:54:31
【问题描述】:

我对 c# System Draw 很陌生,所以请帮我编写代码。我正在尝试绘制二次方程曲线并使用“for”循环来为曲线点 10 个坐标。我已经多次测试了这段代码,当我启动代码时什么都没有出现。此外,每当我运行代码时,我都会收到消息 ArgumentException was Unhandled, Parameter is not valid with the code "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();


        }

【问题讨论】:

  • 从用固定/恒定/未计算坐标的两个点绘制一条线开始。

标签: c# quadratic-curve


【解决方案1】:

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

如 cmets 中所述,DrawCurve 方法需要数组中的 3 个点。见MSDN Page for DrawCurve上的备注

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

至于图表:我不完全确定您要做什么,但是如果您要绘制抛物线,则不应求解二次方程,而应将 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

【讨论】:

  • DrawCurve 也需要至少三个点,所以它甚至在第一个 Dispose 之前就失败了。
【解决方案2】:

不要丢弃 GraphicsPen 实例 - 您在周期的每一步都这样做。

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

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

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

【讨论】:

  • 你知道这是 OP 问题的答案吗?
  • @Enigmativity 嗯,不是完整的答案,当然 - 但修正方程并不是 SO 的真正工作,是吗? :D
  • 不知道这一点我感到很愚蠢,非常感谢您的帮助。虽然现在我的曲线看起来就像一堆直线在我的屏幕边缘相互重叠。你对此也有什么想法吗?
  • 这不是答案。这是一个很长的评论。 Erno 找到了真正的问题。
  • @MichaelEk 我不太确定您的代码应该如何工作,它看起来确实不必要地复杂。你可能想从不同形式的二次方程开始:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2017-04-03
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多