В настоящее время я работаю над созданием «тепловых карт» с помощью QPainter и QImage. Мой метод состоит в рисовании нескольких кругов черными и прозрачными QRadialGradients в качестве QBrush (см. «Карта интенсивности»). Затем я применяю карту градиента к карте интенсивности, чтобы получить желаемый эффект «тепловой карты» (см. «После карты градиента»).
Проблема, с которой я сталкиваюсь, которая более очевидна на изображении «После карты градиента», заключается в том, что круги не смешиваются правильно. Там, где круги перекрываются, кажется, что они частично сливаются, но ближе к краям вы можете ясно видеть, где круги заканчиваются (почти внешнее свечение). Я хотел бы, чтобы эффект не имел видимых границ между кругами и правильно смешивался.
Карта интенсивности
После карты градиента (карта другой интенсивности)
Код
// Setup QImage and QPainter
QImage *map = new QImage(500, 500, QImage::Format_ARGB32);
map->fill(QColor(255, 255, 255, 255));
QPainter paint(map);
paint.setRenderHint(QPainter::HighQualityAntialiasing);
// Create Intensity map
std::vector<int> record = disp_data[idx]; // Data
for(int j = 1, c = record.size(); j < c; ++j) {
int dm = 150 + record[j] * 100 / 255; // Vary the diameter
QPen g_pen(QColor(0, 0, 0, 0));
g_pen.setWidth(0);
QRadialGradient grad(sensors[j-1].x, sensors[j-1].y, dm/2); // Create Gradient
grad.setColorAt(0, QColor(0, 0, 0, record[j])); // Black, varying alpha
grad.setColorAt(1, QColor(0, 0, 0, 0)); // Black, completely transparent
QBrush g_brush(grad); // Gradient QBrush
paint.setPen(g_pen);
paint.setBrush(g_brush);
paint.drawEllipse(sensors[j-1].x-dm/2, sensors[j-1].y-dm/2, dm, dm); // Draw circle
}
// Convert to heat map
for(int i = 0; i < 500; ++i) {
for(int j = 0; j < 500; ++j) {
int b = qGray(map->pixel(i, j));
map->setPixel(i, j, grad_map->pixel(b, 0)); //grad_map is a QImage gradient map
}
}
Как видите, для кругов нет QPen. Я пробовал различные режимы наложения, но безуспешно. Я также изменил подсказку рендеринга на HighQualityAntialiasing. Я также попытался сделать круги намного больше, чем радиальный градиент, поэтому градиент не может быть обрезан или граница применяется к внешней стороне круга.
Любые идеи? Спасибо!