2

グラフィック電卓を作成したいのですが、グラフビットにこだわっています。sin(x) cos(x) tan(x) のグラフをプロットする方法を知りたいです。私はすでにグリッドを作っています。コア プロット フレームワークを使用したくありません。

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

1

関数を実際にプロットするには、紙と鉛筆で行うのと同じように行います。多くの入力に対して関数を評価します。次に、結果の点を結ぶ線を引きます。

于 2013-03-24T01:37:02.530 に答える
0

これがあなたの質問に答えることができるいくつかの擬似コードです:

for i = xmin to xmax do
{
   draw XY point at X=(i*x_scale_factor+x_offset) and Y=(sin(i)*y_scale_factor+Y_offset);
}

そして注意してください:forループでfloatを使用しないでください

コメントに応じて編集

続行する最も簡単な方法であるIMHOは、ビューの境界を取得し、X軸とY軸の両方でデータの最小値と最大値を取得することです。

次に、NSAffineTransformインスタンスを使用して、図面の座標を変換できます。したがって、すべてをグラフィック座標で実行できます。これは簡単です。必要に応じて、座標(4.6、3.2 * 10-7)でラベルを書くことができます。これは、始めるための重要なポイントです。道は長いです。しかし、使用NSAffineTransformすると簡単になります。

于 2013-03-24T01:48:10.047 に答える
0

私が実際にこれを行うわけではありませんが (Core Plot を見ます)、次のように Core Image ジェネレーター フィルターを使用してそのようなグラフをプロットできます。

//wavelength and magnitude are distances in destination pixels. Think of them as the width and height of each wave.
kernel vec4 sineWave(float wavelength, float magnitude, __color color)
{
    vec2 coord = destCoord();
    coord.y -= magnitude;
    coord /= vec2(wavelength, magnitude / 2.0);
    float pi = radians(180.0);

    float value = sin(coord.x * pi);

    //Smaller threshold = finer wave line. For a gradient, replace the comparison with 1.0 - abs(…).
    float threshold = 0.1;
    float alpha = abs(coord.y - value) <= threshold;
    return color * alpha;
}

このカーネルからの Quartz Composer レンダリング出力のスクリーンショット

于 2013-03-24T09:26:54.480 に答える