比较两个CGPoints是否相等:对于输出相同点的两个对象,返回不相等?

时间:2017-08-02 00:24:55

标签: ios swift core-graphics

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

3 个答案:

答案 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)