我正在尝试绘制数学函数并使用 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 处绘制的,并且点是相连的。 看图:
如何评估未定义的点,以便能够正确绘制图形?我知道有一个解决方案,因为有许多绘图网站可以正确绘制图形。
小费或任何类型的帮助将不胜感激。您还可以随意添加一些神奇的代码;)谢谢!
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)
最佳答案
我假设您正在以固定增量提高您的 x
值,这可能取决于分辨率和缩放级别。
如果您足够幸运,实际上除以零,您将生成 +Inf
或 -Inf
并且可以检查这一点,并在构建您的时跳过该值曲线(将曲线分成多个部分),这可以解决您在这种情况下的问题。
更一般且更常见的是,您实际上不会除以零,而是除以一个非常小的数字,产生一个非常大的数字的结果。您应该能够将该值与视口(viewport)的边界进行比较。如果该值超出视口(viewport)范围,您可以决定结束该曲线,一旦出现新值(对于新的 x 值),该值再次位于视口(viewport)内,您可以开始一条新曲线,从而解决您的问题在这种情况下也会出现问题。
如果您要提高每个像素的 x 值,那么上述应该是一个解决方案。
如果您比每个像素更粗略地提高 x 值,那么您还必须处理剪切线段的问题,并避免在检测不连续性方面出现误报。
还要检查您的特定库是否可以为您生成分析确定的不连续性列表。提前有了这样的列表,您可以将曲线分成由这些不连续点分隔的部分。
另请参阅Division by Zero in Computer Arithmetic , Asymptotes ,和Discontinuity .
关于iphone - 绘制不连续的数学表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14130743/