1

私はグラフ電卓アプリケーションに取り組んでいます。もちろん、アプリケーションの主な機能はグラフを表示することです。

現在、これがグラフをプロットする私のアルゴリズムの仕組みです: 描画キャンバスをN間隔で分割します (Nはアプリケーションの設定で定義されています。デフォルト値は約 700 です)。間隔ごとに、2 つの端点の関数を評価し、2 つの点の間に線分を描画します。

この方法に私が見つけた欠点は次のとおりです。

  • グラフの精度が良くない (たとえば、関数sin(tan(x)))
  • レンダリングは、間隔の数が多いほど遅くなります (たとえば、N が 1000 を超える)。また、ズームとナビゲーションのコントロールにも問題があります。

では、グラフを描画するためのより良いアプローチはありますか?

私は C# (WPF) でプログラミングしていますが、アルゴリズムを探しているので、これは関係ないと思います。

4

4 に答える 4

1

任意の関数をプロットする場合、独自のアルゴリズムを作成する必要はありません。関連するライブラリのグラフ コントロールを使用します。ここを参照し、必要なデータ (x、y 座標) を提供します。

于 2012-04-10T15:16:30.487 に答える
1

mingw コンパイラー用に移植されたプリミティブ graphics.h を使用して数年前に作成した C++ プログラムのこのスニペットについて、お役に立てれば幸いです。変数名はかなり明確です。

void func_gen(char expr[100],float precision,int color)
{
     float x=-(xres/2)/(float)zoom_factor;
     float max_range=-x;
     while(x<=max_range)
     {
        float y;
        y = evalu(expr,x);          //user defined function which i used to evaluate ann expression
        float xcord=xby2+zoom_factor*x+xshift;
        float ycord=yby2-zoom_factor*y+yshift;
        if(xcord<=xres && xcord>=0 && ycord>=0 && ycord<=yres)
            putpixel(xcord,ycord,color);
            x=x+precision;
     }
}

精度の値を下げると、このメソッドはかなり遅くなります(実際にはプロットの精度が上がります:p、初心者でごめんなさい)

于 2012-04-10T15:22:02.853 に答える
1

より良いアプローチは、適応間隔サイズを使用することです。つまり、比較的粗い間隔 (20 など) から開始します。各間隔について、間隔の終了点と中間点の関数を計算します。中間点が 2 つの端点を結ぶ線に近い場合は、線を引き、その間隔で完了です。そうでない場合は、間隔を 2 つに分割し、2 つの小さい間隔で繰り返します。

間隔が小さすぎて線に収束しない場合は、不連続性が見つかった可能性があり、間隔のエンドポイントを接続しないでください。

于 2012-04-10T17:45:39.027 に答える
0

DrawPathを使用する必要があると思います。そのメソッドは、コーディング中のタスクの種類だけに最適化された補助構造 ( GraphicsPath ) を使用します。編集小さな最適化は、セグメントのちょうど左のポイントで関数を評価し、最後のセグメントのすぐ近くのポイントで評価することです。

于 2012-04-10T15:39:42.223 に答える