绘制不连续的数学表达式?

时间:2013-01-02 23:14:15

标签: iphone cocoa math plot mathematical-expressions

我正在尝试绘制数学函数并使用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处绘制的并且点是连接的。 见图:

enter image description here

如何评估未定义的点以便我能够正确绘制图形?我知道有一个解决方案,因为有许多绘图网站正确绘制图形。

小费或任何类型的帮助将不胜感激。你也可以自由地包含一些神奇的代码;)谢谢!

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

BTW我正在使用ANExpressionParser类来解析用户输入。 (http://mac.softpedia.com/progDownload/ANExpressionParser-Download-86833.html

1 个答案:

答案 0 :(得分:2)

我假设您以固定增量推进x值,可能取决于分辨率和缩放级别。

如果你足够幸运地实际除以零,你将产生+Inf-Inf并且可以检查它,并在构建曲线时跳过该值(将曲线分成多个部分) ),这解决了你的问题。

更普遍且更经常地,您实际上不会除以零,而是将除以非常小的数字,从而产生非常大的数字。您应该能够将该值与视口的边界进行比较。如果此值超出视口范围,则可以决定结束该曲线,并且一旦出现新值(对于x的新值)再次出现在视口中,您就可以开始一条新曲线,从而解决在这种情况下也存在问题。

如果你推进每像素的x值,那么上面应该是一个解决方案。

如果你比每像素更粗略地推进你的x值,那么你还必须处理剪切线段,并避免关于检测不连续性的误报。


还要检查您的特定图书馆是否可以为您生成分析确定的不连续性列表。提前使用这样的列表,您可以将曲线分成由不连续点分隔的部分。


另请参阅Division by Zero in Computer ArithmeticAsymptotesDiscontinuity