如何找出最接近数组的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 &lt; $1.signedDistance 。对不起我以前的 cmets,你的代码让我很困惑。 我认为这根本不是真的,显然我认为这个重载应该在标准库中。

以上是关于如何找出最接近数组的CGRect?的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第十六题-找出数组中三数之和最接近目标值的答案

Java从一组数组中找出最接近目标值的值

找出数组s中三个数使其之和最接近一个给定的数,用python

零和数组

最接近的三数之和(threeSumClosest)*

如何找到最接近某个数字的数组元素? [复制]