私は現在、QPainterとQImageを使用して「ヒートマップ」の生成に取り組んでいます。私の方法は、QBrushとして黒から透明のQRadialGradientsで複数の円を描くことで構成されています(「強度マップ」を参照)。次に、グラデーションマップを強度マップに適用して、目的の「ヒートマップ」効果を取得します(「グラデーションマップ後」を参照)。
私が抱えている問題は、「グラデーションマップの後」の画像でより明確になりますが、円が正しくブレンドされていないことです。円が重なっている場所は部分的に混ざり合っているように見えますが、端に向かって、円がどこで終わるか(ほとんど外側の輝き)をはっきりと見ることができます。円の間に境界線が見えず、正しくブレンドされる効果が欲しいのですが。
強度マップ
グラデーションマップ後(異なる強度マップ)
コード
// 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に変更しました。また、円を放射状のグラデーションよりもはるかに大きくしてみたので、グラデーションをカットオフしたり、円の外側に境界線を適用したりする方法はありません。
何か案は?ありがとう!