通过梯度计算数组的值

Calculate values for the array by the gradient

我有一个二维浮点数组,它必须具有标准化的 [0,1] 值,并且在我的例子中代表 "heat map"。每个单元格的值取决于它与地图中心的距离,只有一个轴(垂直或 y)很重要(它看起来很像从中心 up/down 开始的渐变)。中央单元格必须具有最大值 (1),边界上的单元格必须具有最小值 (0)。所以我需要的是一个可以计算每个单元格值的函数。 这是数组中值的示例(红色代表最大值,蓝色代表最小值,颜色可能不遵循渐变,所以不要判断):

这里是我用来初始化数组的代码,我知道所需的函数必须放在某处:

func createBandsForTwoDArray() -> [[Float]] {
    let columns = 100
    let rows = 100
    var twoDArray = Array(repeating: Array(repeating: Float(0), count: columns), count: rows)
    for y in 0..<rows {
        for x in 0..<columns {
            // How to calculate cell value?
            let n = magicValueCalculation(x, y)
            twoDArray[y][x] = Float(n)
        }
    }
    return twoDArray
}

据我了解,您需要一个函数来 return 归一化值,该值取决于浮动单元格相对于地图中心的距离(越小的值越远;只有一个轴很重要)

大意是:

  1. 按地图大小划分单元格位置
  2. 从该值中减去一半 (0.5)
  3. 通过减法乘以前一个绝对值的两倍得到值

代码:

func createBandsForTwoDArray(columns: Int, rows: Int) -> [[Float]] {
    var twoDArray = Array(repeating: Array(repeating: Float(0), count: columns), count: rows)
    for y in 0..<rows {
        let h = getHeat(pos: Float(y), len: Float(rows)) // Heat needs calculation only once per row
        for x in 0..<columns {
            twoDArray[y][x] = h
        }
    }
    return twoDArray
}

func getHeat(pos: Float, len: Float) -> Float {
    var heat = pos/len-0.5
    heat = 1-abs(heat)*2
    return heat
}

其中 pos 是单元格的 y 位置,len 是地图高度。此外,由于同一行的成员将具有相同的值,您可以通过只为每行查找一次值来加快您的方法。如果你需要非线性函数,你也可以 pow 结果。