Алгоритм для тепловой карты с интенсивностью - PullRequest
0 голосов
/ 07 мая 2019

Я работаю над тепловой картой (возможно, это неправильный термин для этой ситуации), где у пользователя будут точки, содержащие координаты и значение интенсивности. Каждая реализация, которую я видел, основывается на плотности цвета точек, а это не то, что я ищу. Я изучал эту тему в течение дня или двух и пытался выяснить, как лучше всего создать такую ​​тепловую карту из координат.

В настоящее время я изучаю многовариантные оценки плотности ядра и не уверен, что это правильный путь. У меня была идея использовать 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))
    }
}

, что приводит к чему-то вроде (черные точки - это измеренные точки):

Heatmap

Мой вопрос: что я могу сделать, чтобы улучшить это, как в плане производительности, так и визуально? Должен ли я продолжать идти по пути mvkde? Есть ли лучший способ найти значения с меньшим количеством циклов?

ПРИМЕЧАНИЯ:

  • изображение было сгенерировано с 50 измеренными точками, экраном (768, 1024), сеткой (768, 1024), радиусом 40 и потребовалось 6:21 для генерации данных и отображения на экране

  • переключение на размер сетки (768/4, 1024/4) и радиус 15 заняло 15-20 секунд, и это было сгенерированное изображение: lower res

  • Я надеюсь использовать это в качестве наложения на динамическую карту (произойдет прокрутка и масштабирование) с набором данных от 100 до 50000 измеренных точек (хотя я думаю, что если бы я сделал это, я нужно было бы объединить несколько точек). Но даже если для наложения на карту потребовалось менее 30 секунд, это было бы неплохо

1 Ответ

0 голосов
/ 08 мая 2019

То, что я искал, было "интерполяцией разбросанных данных" благодаря @ NicoSchertler

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...