如何找出最接近数组的CGRect?
Posted
技术标签:
【中文标题】如何找出最接近数组的CGRect?【英文标题】:How to find out which CGRect is closest from array? 【发布时间】:2020-04-12 20:55:51 【问题描述】:我有一个[CGRect]
数组。
CGRect 有 x, y, width, height
我还有一个CGPoint
。
CGPoint 有 x, y。
我如何知道数组中最接近该点的第一帧是哪一个?
我知道如何使用单个值来做到这一点。 但不是 x、y、宽度和高度
我从哪里开始?我可以只描述要做什么。
【问题讨论】:
任何矩形都可以包含要点吗?如果两个矩形包含该点,您如何确定哪个更接近? 抱歉,回复晚了。这里已经很晚了。它在上面的问题中提到。但是如果两个矩形包含点,我会选择第一个矩形。 【参考方案1】:你需要弄清楚罗布问了什么。一种选择是signed distance 比较。
Video: Deriving the SDF of a Box
如果多个矩形包含该点,则“最近”的一个将是距离该点最近的边缘最远的那个,即该点“包含更多”。
rects.min [point = SIMD2(point)] in point.getSignedDistance(to: $0)
public extension CGRect
var center: CGPoint .init(x: midX, y: midY)
public protocol CGFloat2
var x: CGFloat get
var y: CGFloat get
extension CGPoint: CGFloat2
extension CGSize: CGFloat2
public var x: CGFloat width
public var y: CGFloat height
import simd
public extension SIMD2 where Scalar == CGFloat.NativeType
init<Float2: CGFloat2>(_ float2: Float2)
self.init(x: float2.x, y: float2.y)
init(x: CGFloat, y: CGFloat)
self.init(x: x.native, y: y.native)
/// Distance to the closest point on the rectangle's boundary.
/// - Note: Negative if inside the rectangle.
func getSignedDistance(to rect: CGRect) -> Scalar
let distances =
abs( self - Self(rect.center) )
- Self(rect.size) / 2
return
all(sign(distances) .> 0)
? length(distances)
: distances.max()
public extension Sequence
func min<Comparable: Swift.Comparable>(
by getComparable: (Element) throws -> Comparable
) rethrows -> Element?
try self.min
try getComparable($0) < getComparable($1)
【讨论】:
鉴于我在上面的 cmets 中所做的澄清,您的解决方案会奏效吗?我查看了 wiki 链接,但那里的数学太复杂了,我无法理解。 我添加了第二段。让我知道这是否有效。 你的意思是你的最小扩展使计算更有效率吗?或者你是说我应该一起删除扩展名。我仍然在这里试图消化答案。min
扩展是不必要的,并且会使您的答案复杂化...您可以直接使用min $0.signedDistance < $1.signedDistance
。对不起我以前的 cmets,你的代码让我很困惑。
我认为这根本不是真的,显然我认为这个重载应该在标准库中。以上是关于如何找出最接近数组的CGRect?的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode第十六题-找出数组中三数之和最接近目标值的答案