使用Qt绘制一个高斯灰度扩散的点。唯一的变量是点的半径。
QRadialGradient类与QBrush类结合使用来指定径向梯度刷。QRadialGradient类构造参数如下:
// 三个参数分别为中心点,半径,焦点
QRadialGradient(const QPointF ¢er, qreal radius, const QPointF &focalPoint)
根据高斯分布曲线性质:
1σ 时 能量为极大值的 e^(-1/2) = 0.607,(μ-σ, μ+σ) 包含68.3%能量
2σ 时 能量为极大值的 e^(-2) = 0.135,(μ-2σ, μ+2σ) 包含95.4%能量
3σ 时 能量为极大值的 e^(-9/2),近似为0,(μ-3σ, μ+3σ) 包含99.7%能量
绘制点的函数如下:
self._data_img = QImage(self._img_width,
self._img_hight, QImage.Format_Alpha8)
...
def drawDataPoint(self, pt):
""" Update heat image with point data
"""
painter = QPainter(self._data_img) # paint on QImage
painter.setPen(Qt.transparent)
radial = QRadialGradient(pt, self._radius, pt) # 中心点=焦点
radial.setColorAt(0, QColor(0, 0, 0, 255)) # 0 -> 极大值,纯黑色
radial.setColorAt(0.333, QColor(0, 0, 0, 155)) # σ -> 0.607 * 255 = 155
radial.setColorAt(0.666, QColor(0, 0, 0, 35)) # 2σ -> 0.135 * 255 = 35
radial.setColorAt(1, QColor(0, 0, 0, 0)) # 3σ -> 0 完全透明的黑色,即无色
painter.setBrush(radial)
painter.drawEllipse(pt, self._radius, self._radius)