我正在尝试在SpriteKit中利用SKRegion的byIntersection(with :)方法,因为它是标准iOS发行版的一部分,如果我可以避免的话,我宁愿不包含另一个库,或者,上帝禁止,写我的自己的,因为在所有边缘情况下,任意路径的交点都非常棘手。请注意,我的应用程序本身并不使用SpriteKit。我只想免费使用该功能。
该方法应该返回相交区域,尽管我什至不需要它,因为我真正需要的只是知道这些区域是否相交。我的目标是简单地测试相交区域是否基于空路径。
我有两个NSBezierPath对象,我将它们转换为CGPath对象,同时将从源NSView到目标NSView的路径上的点转换,然后使用SKRegion(path :)使用每个CGPath初始化新的SKRegion对象。我知道在涉及SpriteKit之前一切都可以工作,因为我已经对一切进行了全面测试。
一旦有了两个SKRegion对象,第一个奇怪的事情就是,仅通过将这些路径传递给SKRegion初始值设定项,就将路径中所有点的坐标缩小了150。这不是问题,因为两个区域的缩放比例相似,因此至少从数学的角度来看,确定它们是否相交仍应是准确的。
第二个奇怪的事情,实际上是问题的症结在于,regionA.byIntersection(with:regionB)似乎总是返回regionA,而不管它们是完全,部分相交还是根本不相交。我当然已经验证了两个区域都是有效且不同的,并且我合理地假设应该返回第三个不同的区域。
我的问题如下:该API是否确实有效,如果可以,我在做什么错?如果它不起作用或生产质量不佳,它是否曾经起作用过,为什么仍在官方在线文档中列出了它?根据描述,似乎无需设置SKView或任何其他SpriteKit设置就可以使用,因为据说它严格基于数学算法。
以下是一些简单的示例代码,用于在操场上演示该问题:
import SpriteKit
let pathA = CGPath(rect: CGRect(x: 100, y: 100, width: 200, height: 200), transform: nil)
let pathB = CGPath(rect: CGRect(x: 150, y: 150, width: 200, height: 200), transform: nil)
let regionA = SKRegion(path: pathA)
let regionB = SKRegion(path: pathB)
let regionC = regionA.byIntersection(with: regionB)
print(regionC.path ?? "There is no path.")
输出为:
Path 0x7fb46b67d500:
moveto (0.666667, 0.666667)
lineto (2, 0.666667)
lineto (2, 2)
lineto (0.666667, 2)
closepath
如前所述,所有坐标都神秘地按比例缩小了150,因此取消缩放会给出(x:100,y:100,width:200,height:200),实际上是pathA而不是(x:150 ,y:150,宽度:150,高度:150),这将是正确的答案。