检测 CGPoint 是不是在正方形(菱形)内的问题

Posted

技术标签:

【中文标题】检测 CGPoint 是不是在正方形(菱形)内的问题【英文标题】:Troubles to detect if a CGPoint is inside a square (diamond-shape)检测 CGPoint 是否在正方形(菱形)内的问题 【发布时间】:2016-08-23 20:15:56 【问题描述】:

我有 2 个 SKSpriteNode:

一个简单的正方形 (A) 旋转 (-45°) (B) 的同一个正方形

我需要随时检查另一个 SKSpriteNode(球)的中心是否在这些正方形之一内。 球和方块具有相同的父级(主场景)。

override func update(_ currentTime: TimeInterval) 

    let spriteArray = self.nodes(at: ball.position)

    let arr = spriteArray.filter $0.name == "square"

    for square in arr 
        print(square.letter)

        if(square.contains(self.puck.position)) 
             print("INSIDE")
        

    

使用简单的正方形 (A),我的代码可以正常工作。数据是对的。我随时都知道 CGPoint 中心是在正方形的内部还是外部。

但是对于带有旋转 (B) 的正方形,数据不符合预期。只要 CGPoint 在包含菱形形状的正方形中,就会在内部检测到它。

SKSpriteNode 方块是通过关卡编辑器创建的。

如何才能获得正确的菱形结果?

编辑 1

使用

view.showsPhysics = true

我可以用physicsBody 看到所有SKSpriteNode 的边界。我的菱形正方形的边界是菱形正方形而不是灰色正方形区域。

 square.frame.size -> return the grey area
 square.size -> return the diamond-square

在Apple文档func nodes(at p: CGPoint) -> [SKNode]中,该方法是关于节点而不是框架,所以为什么它不起作用?

【问题讨论】:

可能,您的框架没有使用 alpha 蒙版?您可以使用.physicsBody 和碰撞来获得精确度。我手头没有任何代码,但您可以使用 SKPhysicsContactDelegate. ***.com/questions/27576149/… 我尝试使用 .physicsBody 和碰撞,但是通过这种方法,我知道球何时与正方形接触。这不是我需要的。我对球的中心(CGPoint)和正方形的接触感兴趣。这不完全一样。 好吧,@cmi,我认为您至少仍然可以使用.frame.intersects,但您必须将框架设置为 alpha 蒙版。现在,它将整个正方形(灰色区域)视为一个接触面,而 alpha 蒙版只会显示蓝色菱形区域。如果我错了,那么我能想到的唯一其他方法就是做数学并减去蓝色钻石周围的 4 个三角形(灰色区域)。 @Fluidity 请看我的编辑,确实菱形正方形的框架是灰色正方形。节点掩码是菱形正方形。 node.contains 不是 SKPhysics 方法,它所做的只是检查它是否在节点坐标系统(框架)内。如果您知道角度,只需找出触摸点相对于节点中心的位置,然后对其应用反向角度旋转,然后使用这个新点检查它是否包含节点 【参考方案1】:

有很多方法可以做到这一点,通常我喜欢使用路径,所以如果你有一个完美的钻石,我想提供一种与 cmets 不同的方法,你可以创建一个完美匹配的路径你的钻石有UIBezierPath,因为它有containsPoint的方法:

let f = square.frame
var diamondPath = UIBezierPath.init()
diamondPath.moveToPoint(CGPointMake(f.size.width-f.origin.x,f.origin.y))
diamondPath.addLineToPoint(CGPointMake(f.origin.x,f.size.height-f.origin.y))
diamondPath.addLineToPoint(CGPointMake(f.size.width-f.origin.x,f.size.height))
diamondPath.addLineToPoint(CGPointMake(f.size.width,f.size.height-f.origin.y))
diamondPath.closePath()
if diamondPath.containsPoint(<#T##point: CGPoint##CGPoint#>) 
   // point is inside diamond

【讨论】:

Ormano ,这几乎正是我正在寻找的(如果它符合我的想法)......一个非常优雅的解决方案,无需“欺骗”它或想出一个花哨的公式。我也会为自己剪掉这个:) 使用 SKShapeNode 似乎是我和 CPU 的最佳解决方案。

以上是关于检测 CGPoint 是不是在正方形(菱形)内的问题的主要内容,如果未能解决你的问题,请参考以下文章

检测 CGPoint 是不是在多边形内

在单元测试中点击 UIButton 内的特定 CGPoint

如何根据 CGSize 更改缩放 CGPoint?

如何设置悬停效果(注意:只有方形边框在悬停时应该像钻石形状一样旋转,而不是图像)[关闭]

python正方形+菱形 青少年编程电子学会python编程等级考试一级真题解析2021-9

python正方形+菱形 青少年编程电子学会python编程等级考试一级真题解析2021-9