1

関数グラファーを構築しようとしていますが、

ユーザーは、xmin、xmax、ymin、ymax、関数を入力します。すべてのポイントの x、y を取得しました。

ここで、この初期参照を 0,0 から 250,250 までの Canvas に変換したいと思います。

短い方法はありますか、それとも確認する必要がありますか

if x < 0 
new x = (x - xmin) * (250 / (xmax - xmin)) ?

など..

また、この基本的なアプローチはサンプリングを最適化しません。たとえば、関数 f(x) = 5 の場合、xrange を 500 ポイントでサンプリングする必要はありません。必要なのは 2 ポイントだけです。私はいくつかのヒューリスティックチェックを行うことができました。

しかし、sin(2/x) のような関数の場合、x (-1,1) の周りでより多くのサンプリングが必要です。

ありがとう

4

3 に答える 3

1

元の座標で x を反復処理する代わりに、キャンバスを反復処理してから元の座標に変換します。

for (int xcanvas = 0; xcanvas <= 250; i++) {
    double x = ((xmax - xmin) * xcanvas / 250.0) + xmin;
    double y = f(x);

    int ycanvas = 250 * (y - ymin) / (ymax - ymin) + .5;

    // Plot (xcanvas, ycanvas)
}

これにより、キャンバスの各列に対して正確に 1 つの関数評価が得られます。

于 2008-12-05T17:39:29.613 に答える
0
  1. 導関数を見積もることができます(ある場合)。
  2. 双方向(二分)アプローチを使用できます。差を推定し、必要に応じてセグメントを分割します。
于 2008-12-05T12:40:15.583 に答える
0

キャンバスから数学のコンテキストへの変換という観点から、これについて推論することから始めたいと思います。

(canvas_x, canvas_y) -> (maths_x, maths_y)
(maths_x, maths_y)   -> (canvas_x, canvas_y)

maths_x -> maths_y

表示可能なポイントを反復処理し、canvas_x をループします。

これは、いくつかの単純な関数に変換されます。

maths_x = maths_x_from_canvas_x(canvas_x, min_maths_x, max_maths_x)
maths_y = maths_y_from_maths_x(maths_x) # this is the function to be plotted.
canvas_y = canvas_y_from_maths_y(maths_y, min_maths_y, max_maths_y)

if (canvas_y not out of bounds) plot(canvas_x, canvas_y)

ここまで来ると、これらの単純な関数をコードに記述するのは比較的簡単です。

ここから最適化します。

このアプローチでは、表示に適したレートでサンプリングするため、サンプル周波数についてあまり知る必要はないと思います。それは最適ではありません-あなたの例y = 5は良い例ですが、表示できる以上にサンプリングしないことが保証されます.

于 2008-12-05T13:08:25.373 に答える