从CGPoints数组中获取最大值和最小值

问题描述 投票:0回答:2

我们有一组CGPoints:

let points = [(1234.0, 1053.0), (1241.0, 1111.0), (1152.0, 1043.0)]

我想做的是获取数组中x值最高的CGPoint和y值最高的CGPoint。我将使用这些点来创建CGRect:

extension CGRect {
    init(p1: CGPoint, p2: CGPoint) {
        self.init(x: min(p1.x, p2.x),
                  y: min(p1.y, p2.y),
                  width: abs(p1.x - p2.x),
                  height: abs(p1.y - p2.y))
    }
}

我知道可以通过执行以下操作来获取数组中的最大值和最小值:

points.min()
points.max()

但是这些似乎不起作用,因为它包含一组CGPoints。是否可以从数组中获取这些值?

ios arrays swift cgpoint
2个回答
0
投票

您可以使用max(by:)

let minXPoint = points.min(by: {$0.x < $1.x}) //(1152.0, 1043.0)
let maxYPoint = points.max(by: {$0.y < $1.y}) //(1241.0, 1111.0)

0
投票

[使用min() / max(),您不能这样做。

y和x坐标的最高和最低坐标“

具有最小x值的点可能不同于具有最小x值的点。因此,仅返回一个点(如min() / max()一样)的任何方法都是不够的。

您要么需要两个单独的调用,例如:

let minX = points.min(by: { $0.x < $1.x })!.x
let minY = points.min(by: { $0.y < $1.y })!.y
let maxX = points.min(by: { $0.x > $1.x })!.x
let maxY = points.min(by: { $0.y > $1.y })!.y

或者您可以尝试通过reduce一次完成所有操作:

let initialAccumulator = (
    minX: CGFloat.max, minY: CGFloat.max, maxX: CGFloat.min, maxY: CGFloat.min)
let (minX, minY, maxX, maxY) = points.reduce(initialAccumulator) { accumulator, point in
    return (
        minX: min(accumulator.minX, point.x),
        minY: min(accumulator.minY, point.y),
        maxX: max(accumulator.maxX, point.x),
        maxY: max(accumulator.maxY, point.y)
    )
}
© www.soinside.com 2019 - 2024. All rights reserved.