def paint(self, painter, option, parent):
r = self.vb.viewRect()
h = r.height()
w = r.width()
nvectors = config.nvectors
nx = int(num.sqrt(nvectors) * float(w)/h)
ny = int(num.sqrt(nvectors) * float(h)/w)
dx = float(w) / nx
dy = float(h) / ny
d = dx if dx < dy else dy
mat_N = self.sandbox.model.north.T
mat_E = self.sandbox.model.east.T
img_shape = self.image.image.shape
ivec = 0
length_scale = self.sandbox.model.max_horizontal_displacement
self.length_scale = length_scale if length_scale > 0. else 1.
self.scale_view = (w+h)/2 / painter.window().height()*2.5
for ix in xrange(nx):
for iy in xrange(ny):
if ivec > nvectors:
break
vec = self.vectors[ivec]
pos = QtCore.QPointF(r.x() + ix * dx + dx/2,
r.y() + iy * dy + dy/2)
# Slowest operation
img_pos = self.plot.image.mapFromScene(
self.vb.mapViewToScene(pos))
pE = int(img_pos.x())
pN = int(img_pos.y())
if (pE >= img_shape[0] or pN >= img_shape[1]) or\
(pE < 0 or pN < 0):
dE = 0.
dN = 0.
else:
dE = mat_E[pE, pN]
dN = mat_N[pE, pN]
dE = dE / self.length_scale * (d/self.scale_view)
dN = dN / self.length_scale * (d/self.scale_view)
vec.setPos(pos)
vec.setOrientation(dE, dN)
if vec.scale() != self.scale_view:
vec.setScale(self.scale_view)
vec.setVisible(True)
ivec += 1
while ivec < nvectors:
self.vectors[ivec].hide()
ivec += 1
QtGui.QGraphicsItemGroup.paint(self, painter, option, parent)
评论列表
文章目录