2

我对 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();


        }
4

2 回答 2

4

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

正如评论中提到的,DrawCurve 方法需要数组中有 3 个点。请参阅关于 DrawCurve 的 MSDN 页面上的备注下

应尽可能减少对 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
于 2015-02-09T08:06:09.040 回答
1

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

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

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

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

于 2015-02-09T07:59:57.097 回答