According to this question,使用==和!=可以检查两个CGPoint
对象之间是否相等。
但是,下面的代码无法将两个CGPoint
对象视为相等,即使它们输出相同的值。
检查CGPoint
个对象之间的平等的正确方法是什么?
代码:
let boardTilePos = boardLayer.convert(boardTile.position, from: boardTile.parent!)
let shapeTilePos = boardLayer.convert(tile.position, from: tile.parent!)
print("board tile pos: \(boardTilePos). active tile pos: \(shapeTilePos). true/false: \(shapeTilePos == boardTilePos)")
输出:
board tile pos: (175.0, 70.0). active tile pos: (175.0, 70.0). true/false: false
答案 0 :(得分:4)
不幸的是,您在控制台中看到的并不是您真正的价值所在。
import UIKit
var x = CGPoint(x:175.0,y:70.0)
var y = CGPoint(x:175.0,y:70.00000000000001)
print("\(x.equalTo(y)), \(x == y),\(x),\(y)")
问题是,控制台只允许10 -16 ,但实际上你的CGFloat
甚至可能比这更低,因为在64位架构上,CGFloat
是{{ 1}}。
这意味着如果您希望获得将出现在控制台上的相等性,则必须将Double
值转换为CGPoint
,因此您需要执行以下操作:
Float
现在我想更进一步。
在大多数情况下,我们使用CGPoint来确定场景中的点。我们很少想要处理1/2分,它们让我们的生活变得混乱。
所以我不想if Float(boxA.x) == Float(boxB.x) && Float(boxA.y) == Float(boxB.y)
{
//We have equality
}
而是Float
。这将保证两个点是否位于场景空间中的同一Int
CGPoint
答案 1 :(得分:4)
我提供了另一个答案,因为我不同意Knight0fDragon的实现。这只有在你想要处理一个点的派系时。如果您只关心整数中的点数,请参阅Knight0fDragon的答案。
你并不总是有很多记录点到控制台,或者看你是否想要比较浮点数学的受害者,比如(175.0,70.0)和(175.0,70.00001) (它们都在控制台中记录为(175.0,70.0))。是的,截断到Int是理解为什么两个看起来与控制台相同的点不相同的好方法。但这并不是一个应该用于比较每一点的解决方案。根据您需要的精度级别,您需要获取每个点的x和y差值的绝对值,并查看它是否在您指定的delta的可接受范围内。
var boxA = CGPoint(x:175.0, y:70.0)
var boxB = CGPoint(x:175.0, y:70.00000000000001)
let delta: CGFloat = 0.01
if (fabs(boxA.x - boxB.x) < delta) &&
(fabs(boxA.y - boxB.y) < delta) {
// equal enough for our needs
}
问题的答案“检查CGPoint
个对象之间平等的正确方法是什么?”实际上取决于你比较浮点数的方式。
答案 2 :(得分:-1)
CGPoint提供了自己的比较方法:equalTo(_ point2: CGPoint)
试试这个:
shapeTilePos.equalTo(boardTilePos)