我有一个具有两个维度的浮点数组,它必须具有标准化的[0,1]值,并且代表一个"热图"在我的情况下。每个单元格的值取决于它与地图中心的距离,只有一个轴(垂直或y)很重要(几乎看起来像是从中心向上/向下的渐变)。中心单元格必须具有最大值(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
}
答案 0 :(得分:1)
据我所知,你需要一个能够返回正常值的函数,该函数取决于浮点单元相对于地图中心的位置(最小值得到的值;只有一个轴很重要)
一般的想法是:
代码:
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功能,你也可以推动结果。