2

数学関数をプロットし、CoreGraphics フレームワークを使用しようとしています。ユーザー定義の数学関数の y 座標を手動で計算してパスを計算しています。

関数を描画するために、コードの簡略版を含めました。

CGContextBeginPath(context);
CGContextMoveToPoint(context, coordinateSystemOriginX, coordinateSystemOriginY);

//Add all points
CGContextAddLineToPoint(context, newPoint.x,newPoint.y);

CGContextSetLineWidth(context, 2);
CGContextSetStrokeColorWithColor(context, [[UIColor redColor] CGColor]);
CGContextStrokePath(context); //Connect them

これは正常に機能していますが、残念ながら、ユーザーは次のような不連続関数を入力する可能性があります

 y = 10/x //undefined value for x=0

ただし、グラフは x=0 で描画され、点が接続されています。画像を参照してください。

ここに画像の説明を入力

グラフを正しく描画できるように、未定義の点を評価するにはどうすればよいですか? グラフを正しく描画する多くのプロット Web サイトがあるため、解決策があることはわかっています。

ヒントやあらゆる種類のヘルプをいただければ幸いです。また、魔法のようなコードを自由に含めることができます ;) ありがとうございます!

 NSArray*undefinedPoints = [self someMagicFunction:(id)mathematicalExpression];
 //returns 0 for mathematicalExpression = 10/x and 1 for 10/(x-1)

ところで、ANExpressionParser クラスを使用してユーザー入力を解析しています。( http://mac.softpedia.com/progDownload/ANExpressionParser-Download-86833.html )

4

1 に答える 1

2

xおそらく解像度とズームレベルに応じて、固定デルタで値を進めていると思います。

幸運にも実際にゼロで除算できる場合は、それを生成する+Inf-Inf、それを確認して、曲線を作成するときにその値をスキップし (曲線を複数の部分に分割します)、その場合の問題を解決します。

より一般的かつ頻繁に、実際にはゼロで除算するのではなく、非常に小さな数で除算し、非常に大きな数の結果を生成します。その値をビューポートの境界と比較できるはずです。この値がビューポートの境界外にある場合は、その曲線を終了することを決定できます。ビューポート内に再びある新しい値 (x の新しい値) が表示されたら、新しい曲線を開始して、問題を解決できます。その場合も問題。

ピクセルごとの x 値を進めている場合は、上記が解決策になるはずです。

x 値をピクセル単位よりも粗く進めている場合は、線分のクリッピングと、不連続性の検出に関する誤検出の回避にも対処する必要があります。


また、特定のライブラリが分析的に決定された不連続性のリストを作成できるかどうかも確認してください。事前にそのようなリストを使用すると、曲線をこれらの不連続で区切られたセクションに分割できます。


Computer ArithmeticAsymptotes、およびDiscontinuityのゼロ除算も参照してください。

于 2013-01-02T23:45:09.783 に答える