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

标签 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)

顺便说一句,我正在使用 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/

相关文章:

iphone - 将 IBOutlet 连接到 UITextField 后出错

iphone - 如何使用三个按钮作为段控

cocoa - 检查音频文件替代聚光灯

objective-c - 在 cocoa 应用程序中决定命令行参数

php - 从 ids 数组生成唯一的固定整数 ids

swift - App Store 提交显示 Xcode 11 中的应用程序图标问题

iphone - 为什么我的 NSDictionary 键按字母顺序排序

objective-c - 我必须学习 Objective-C 才能进行专业的 Mac 开发吗?

ios - 将 var 转换为 float 以进行数学运算

php - 根据特定数据计算用户的相关性