通过渐变

时间:2017-12-09 21:52:11

标签: arrays swift gradient

我有一个具有两个维度的浮点数组,它必须具有标准化的[0,1]值,并且代表一个"热图"在我的情况下。每个单元格的值取决于它与地图中心的距离,只有一个轴(垂直或y)很重要(几乎看起来像是从中心向上/向下的渐变)。中心单元格必须具有最大值(1),并且边界上的单元格必须具有最小值(0)。所以我需要的是一个可以计算每个单元格的值的函数。 下面是一个示例,说明数组中的值可能如何(红色表示最大值,蓝色表示最小值,颜色可能不符合渐变,因此不要判断它):

enter image description here

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

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
}

1 个答案:

答案 0 :(得分:1)

据我所知,你需要一个能够返回正常值的函数,该函数取决于浮点单元相对于地图中心的位置(最小值得到的值;只有一个轴很重要)

一般的想法是:

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

    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是地图高度。此外,由于同一行的成员将具有相同的值,因此您可以通过仅为每行查找一次值来加快方法速度。如果你需要非liniar功能,你也可以推动结果。