Я работаю над тепловой картой (возможно, это неправильный термин для этой ситуации), где у пользователя будут точки, содержащие координаты и значение интенсивности. Каждая реализация, которую я видел, основывается на плотности цвета точек, а это не то, что я ищу. Я изучал эту тему в течение дня или двух и пытался выяснить, как лучше всего создать такую тепловую карту из координат.
В настоящее время я изучаю многовариантные оценки плотности ядра и не уверен, что это правильный путь. У меня была идея использовать 3d-векторы с координатами x и y, а интенсивностью z, но я не уверен, сработает ли это. Все примеры, которые я видел, основаны на плотности точек.
В настоящее время я использую следующий код:
for p in points{ // loop over all measured points
// points are stored in a dict with the key being x+y*NUM_COL
let pX = p.key % NUM_COL
let pY = p.key / NUM_COL
let intensity = points[p.key]!.getAvg()
// loop over all surrounding points within square with size of radius * 2
for i in 0..<Int(pow(Double(2*RADIUS),2)){
let dX = (i % (2*RADIUS)) - RADIUS
let dY = (i / (2*RADIUS)) - RADIUS
let x = pX + dX
let y = pY + dY
let dist = (pow(Double(x-pX),2) + pow(Double(y-pY),2)).squareRoot()
// check if coordinate is in bounds and is not a measured value
if (x < 0 || x >= NUM_COL || y < 0 || y >= NUM_ROW || dist > Double(RADIUS) || points[x+y*NUM_COL] != nil){
continue
}
grid[y][x] += intensity * (1 - (dist/RADIUS))
}
}
, что приводит к чему-то вроде (черные точки - это измеренные точки):
Мой вопрос: что я могу сделать, чтобы улучшить это, как в плане производительности, так и визуально?
Должен ли я продолжать идти по пути mvkde? Есть ли лучший способ найти значения с меньшим количеством циклов?
ПРИМЕЧАНИЯ:
изображение было сгенерировано с 50 измеренными точками, экраном (768, 1024), сеткой (768, 1024), радиусом 40 и потребовалось 6:21 для генерации данных и отображения на экране
переключение на размер сетки (768/4, 1024/4) и радиус 15 заняло 15-20 секунд, и это было сгенерированное изображение:
Я надеюсь использовать это в качестве наложения на динамическую карту (произойдет прокрутка и масштабирование) с набором данных от 100 до 50000 измеренных точек (хотя я думаю, что если бы я сделал это, я нужно было бы объединить несколько точек). Но даже если для наложения на карту потребовалось менее 30 секунд, это было бы неплохо