2

私はc# System Drawを初めて使用するので、私のコードを手伝ってください。私は二次方程式曲線をプロットしようとしており、曲線の 10 の座標をドットにするために「for」ループを使用しています。このコードを何度もテストしましたが、コードを開始しても何も表示されません。また、コードを実行するたびに、ArgumentException was Unhandled, Parameter is not valid with 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 オブジェクトを破棄することです。2 回目の反復で Graphics オブジェクトが破棄され、DrawCurve の呼び出しは失敗します。

コメントで述べたように、DrawCurve メソッドは配列内に 3 つのポイントを想定しています。DrawCurve の MSDN ページの備考を参照してください。

ペンの他のすべての 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
于 2015-02-09T08:06:09.040 に答える
1

GraphicsandPenインスタンスを破棄しないでください。サイクルのすべてのステップでそれを行っています。

代わりに、の 1 つのインスタンスを取得しPen(グローバル :) を使用できることに注意してください)、それまたはオブジェクトPens.Blueを破棄しないでください。Graphics

また、最初DrawLineは代わりにDrawCurveを使用してみてください - うまくアンチエイリアスされたグラフは得られませんが、はるかに簡単です。正しく使用する方法を理解してから始めてDrawCurveください:)ポイントの1つは、もちろん、2つのポイントだけで描くことはできないということです-少なくとも3つ必要です.

DrawCurve指定されたすべての点を通るスプラインを描画します。したがって、実際には、事前に計算した二次方程式のすべての点を使用して、一度しか呼び出すことができません。これにより、きれいにレンダリングされた曲線が得られます。ただし、実際に 2 次になるかどうかはわかりません。GDI+ のスプラインが 2 次か (可能性が高い) 3 次かどうかはわかりません。いずれにせよ、異なる曲線の正確なレンダリングでは機能しません。

于 2015-02-09T07:59:57.097 に答える