2011-01-15 12 views
5

グラフ作成の電卓を作成しています。これまでのところ、私は半機能的なグラファーを持っていましたが、正確なグラフと滑らかな見た目のカーブをうまくバランスさせるのは苦労しています。C#でグラファーを実装する方法

現在の実装(半擬似コード)は次のようになります

for (float i = GraphXMin; i <= GraphXMax; i++) 
{ 
    PointF P = new PointF(i, EvaluateFunction(Function, i) 
    ListOfPoints.Add(P) 
} 
Graphics.DrawCurve(ListOfPoints) 

これに伴う問題は、それが唯一のすべての整数値にポイントを加算するため、グラフは歪ん終わるとき、そのターニングポイント整数にならないでください(例:sin(x)^ 2)。

alt text

は私が働く小さな何か(のような0.1)、iによって をインクリメントしようとしたが、グラフが非常に粗い見えます。

alt text

私はC#とGDI +を使用しています。 SmoothingMethodがAntiAliasに設定​​されているので、最初のグラフからわかるように、問題はありません。多くの点を描く曲線に問題がありますか?ポイントはピクセル上に正確に配置する必要がありますか?

私はあなたの前で何か非常によく似た何かに取り組んできたと思いますので、どんな提案ですか?あなたがそれをしている間、漸近線を使って関数をグラフ化するための提案はありますか?例えば1/x^2

P.S.私はこれをすべて行うライブラリを探していません - 私はそれを自分で書きたいと思います。

+0

「グラフは非常に荒く見えますか?ポイントの数を増やすことは、より滑らかに見えるように行く方法です。そして、Xステップを小さくする(1→0.1)*を増やします。 – user492238

+0

また、「漸近線で関数をグラフ化するための提案」とはどういう意味ですか?何を期待していますか?彼らはどのように他のグラフと異なった扱いをしていますか?ではない。 – user492238

+0

私はそれをもっと明確にするために編集しました。 – ian93

答えて

1

問題を修正しました。描画プロセスのどこかで、私はfloatではなくintを使用していました。

2

グラフをレンダリングするとき、ビットマップは離散的でグラフはないため、常に丸め誤差が発生します。対処の

あり、いくつかの方法:

  1. 利用アンチエイリアシング。グラフをよりスムーズに見せるだけです。
  2. は、非線形補間を使用します。線の補間を使用して点aからbまで描画すると、角度が生じます。各点のグラフの傾きを計算し、補間法(双三次またはベジエ曲線)にスロープを送ります。

WPFやSilverlightなどのベクターAPIを使用すると、実装する。

漸近線の世話をするのはかなり難しいです。最初にそれらを見つけて、その値をスキップして、グラフに「穴」を作ることができます。

関連する問題