- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的 iOS 应用程序中,我有一个使用 CGPoints 构建的形状类。我使用 encodeCGPoint:forKey 将它保存到一个文件中。我读回去了。一切正常。
但是,我读入的CGPoint值与我保存的值并不完全相等。 CGFloat 值的低位不稳定。所以 CGPointEqualToPoint 返回 NO,这意味着我的 isEqual 方法返回 NO。这给我带来了麻烦和痛苦。
显然,精确地序列化 float 从一开始就是一件麻烦事。但在这种情况下,最好的方法是什么?我能想到几个:
EDIT-ADD:因此,为了简单起见,我忽略了问题的后半部分,即我必须为这些形状对象实现散列方法。
散列 float 也是一个可怕的痛苦(参见“Good way to hash a float vector?”),事实证明它或多或少使我的问题无效。该工具包的 encodeCGPoint 方法以一种恼人的方式对其浮点值进行舍入——它实际上是将它们打印成具有 %g 格式的字符串——所以我无法使用它并仍然使散列可靠。
因此,我不得不编写自己的 encodePoint 函数。只要我这样做,我还不如编写一个对值进行精确编码的代码。 (将两个 32 位 float 复制到一个 64 位整数字段中,不,它不可移植,但这仅适用于 iOS,我正在做出权衡。)
有了 CGPoints 的可靠精确存储,我可以返回到精确比较和我想要的任何旧哈希函数。公差范围对我没有任何作用,所以我只是没有将它们用于此应用程序。
如果我想要散列和公差比较,我会比较 N 有效数字公差内的值,而不是固定距离 epsilon。 (也就是说,我希望 0.123456 比较接近 0.123457,但我也希望 1234.56 比较接近 1234.57。)对于大值和小值,这对于 float 学错误都是稳定的。我没有相关的示例代码,但从 frexpf() 函数开始,应该不会太难。
最佳答案
直接比较 float 通常不是正确的游戏计划。试试 many other options 之一.您问题的最佳解决方案可能是您最后的建议;不过,我不知道为什么会有“叹息”。 double float 具有大约 16 位十进制数字的精度 - 很有可能您的程序实际上不需要那么多的精度。
关于ios - 使用 NSCoder 对 CGPoint 进行全精度编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6699260/
在我的应用程序中,我有两个按钮和一个每秒触发一个操作的计时器。每秒,它生成四个随机数。这些数字用作按钮的 X 和 Y 值,并且按钮移动到新的点。然而,有时新点很接近,因此按钮会重叠。我如何检查以确保不
我计算两个 CGPoint 之间的角度: //calculate radian and degree CGPoint diff = ccpSub(center, locatio
我想在两点之间的弧线上显示图像。我有一个起始 CGPoint 和一个结束 CGPoint。我已经使用 SceneKit 和其他生成整个拱门和图表的答案看到了类似这样的答案。我只是在常规 View 中工
好的,我想将 CGPoint(A) 围绕 CGPoint(B) 旋转 50 度,有什么好的方法吗? CGPoint(A) = CGPoint(x: 50, y: 100) CGPoint(B) = C
我正在生成一些位置随机的圆圈。我要防止的是圆圈相互重叠。所以我想将新生成的 CGPoint 值与数组中的值进行比较,如果该值位于其中一个 CGPoint 的半径区域中,则让它生成一个新值。 除了重叠的
我有一个使用函数 addCurveToPoint 由 CGPoint 数组组成的 UIBezierPath,这里是一些代码: UIBezierPath *path = [[UIBezierPath a
我正在尝试使用两个 UIButton。一个距离它们所在的 UIView 边缘 8 点,第二个距离第一个开始 4 点。我现在正在做这个 let buttonFrames: CGSize = CG
我有一个使用 Core Graphics 的绘图应用程序。一切正常。我会画画。我添加了一个“撤消”按钮来撤消该行。它有效,但是...... 问题:每次按下“撤消”按钮时,它都会逐行删除。我正在尝试将
我找到了将 X、Y 转换为半径和角度的方程式: x = r*Cos(Q) y = r*Sin(Q) r= sqrt(x*x + y*y) Q = tan^-1(y/x) 我的问题是我不记得 Objec
我正在尝试编写一个 if 语句,表示如果 block1 的位置超过某个点,则这种情况会发生在 block3 上。但是,当我尝试使用 >= 进行比较时,出现错误:“无法使用列表类型的参数调用 >= (@
我有一个带有 CGPoint 的 NSMutableArray。当我尝试将对象添加到我的 CGPoint 变量时,我看到了这个错误: Assigning to 'CGPoint' (aka 'stru
我遇到了快速构建错误。 func pathRefFromText() -> CGPathRef { let attributed : NSAttributedString = self
我有这个属性: @property (nonatomic) NSArray *vertices; 其中顶点的类型为CGPoint。 我知道 swift 有一些方便的语言功能,例如 NS_SWIFT_N
你好,对于基于导航的应用程序,我需要从 MKMapView 的坐标或 MKMapPoint 获取 CGPoint。我想在这些点之间画一条线,而不是折线。 我对 MKPolyLine 和其他自定义折线了
我正在使用 Firebase,并尝试将 [CGPoint] 数据库用于实时游戏。我尝试将结构类型更改为 [NSValue] 因为至少它符合 AnyObject (请参阅下面的代码),但现在我收到运行时
有没有简单的方法来做到这一点。 我有一个 CGPoint pointA (10, 10) 和另一个 CGPoint pointB (15, 8)。我需要得到一个 CGPoint,它与连接 A 和 B
如何获取tableView中选定的sectionIndexTitle的点(CGPoint)?我没有找到任何方法来实现这一点。 - (NSInteger)tableView:(UITableView *
我的类的界面部分有 CGPoint @interface MyClass () { CGPoint point; } 在代码中我尝试为其设置值 point = CGPointMake(1, 3
我有一个 CGPoints 数组,我想找到那些构建形状的点。请看附图: 红色圆圈只是标记我的点数。 如何找到带问号的区域? 谢谢。 最佳答案 您必须从第一条线段开始并检查是否有交点。显然,如果前两条线
我正在用下面的线创建圆弧 func drawSomething(_ context: CGContext, rect: CGRect) { context.saveGState() l
我是一名优秀的程序员,十分优秀!