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 处绘制的,并且点是连接的。看图片:

在此处输入图像描述

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

小费或任何类型的帮助将不胜感激。您还可以免费包含一些神奇的代码;)谢谢!

 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 值,那么您还必须处理剪裁线段,并避免在检测不连续性方面出现误报。


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


另请参见计算机算术渐近线不连续性中的除零。

于 2013-01-02T23:45:09.783 回答