比较两个 CGPoints 是否相等:对于输出相同点的两个对象返回不相等?
Comparing two CGPoints for equality: returning not equal for two objects that output same point?
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
CGPoint提供自己的比较方法:equalTo(_ point2: CGPoint)
试试这个:
shapeTilePos.equalTo(boardTilePos)
不幸的是,您在控制台中看到的并不是您真正的价值。
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
是 Double
.
这意味着你必须将你的 CGPoint
值转换为 Float
如果你想获得将出现在控制台上的相等性,所以你需要做类似的事情:
if Float(boxA.x) == Float(boxB.x) && Float(boxA.y) == Float(boxB.y)
{
//We have equality
}
现在我想更进一步。
在大多数情况下,我们使用 CGPoint 来确定场景中的点。我们很少想处理 1/2 点,它们让我们的生活变得混乱。
所以我喜欢转换为 Int
而不是 Float
。这将保证两个点是否位于场景 space
中的相同 CGPoint
if Int(boxA.x) == Int(boxB.x) && Int(boxA.y) == Int(boxB.y)
{
//We have equality
}
因为我不同意 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
}
"What is the right way to check equality among CGPoint
objects?" 问题的答案实际上取决于您比较浮点数的方式。
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
CGPoint提供自己的比较方法:equalTo(_ point2: CGPoint)
试试这个:
shapeTilePos.equalTo(boardTilePos)
不幸的是,您在控制台中看到的并不是您真正的价值。
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
是 Double
.
这意味着你必须将你的 CGPoint
值转换为 Float
如果你想获得将出现在控制台上的相等性,所以你需要做类似的事情:
if Float(boxA.x) == Float(boxB.x) && Float(boxA.y) == Float(boxB.y)
{
//We have equality
}
现在我想更进一步。
在大多数情况下,我们使用 CGPoint 来确定场景中的点。我们很少想处理 1/2 点,它们让我们的生活变得混乱。
所以我喜欢转换为 Int
而不是 Float
。这将保证两个点是否位于场景 space
CGPoint
if Int(boxA.x) == Int(boxB.x) && Int(boxA.y) == Int(boxB.y)
{
//We have equality
}
因为我不同意 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
}
"What is the right way to check equality among CGPoint
objects?" 问题的答案实际上取决于您比较浮点数的方式。