グラフィック電卓を作成したいのですが、グラフビットにこだわっています。sin(x) cos(x) tan(x) のグラフをプロットする方法を知りたいです。私はすでにグリッドを作っています。コア プロット フレームワークを使用したくありません。
どんな助けでも大歓迎です。ありがとう。
グラフィック電卓を作成したいのですが、グラフビットにこだわっています。sin(x) cos(x) tan(x) のグラフをプロットする方法を知りたいです。私はすでにグリッドを作っています。コア プロット フレームワークを使用したくありません。
どんな助けでも大歓迎です。ありがとう。
関数を実際にプロットするには、紙と鉛筆で行うのと同じように行います。多くの入力に対して関数を評価します。次に、結果の点を結ぶ線を引きます。
これがあなたの質問に答えることができるいくつかの擬似コードです:
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
すると簡単になります。
私が実際にこれを行うわけではありませんが (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;
}