在matplotlib三维绘图中实现平移



我在tkinter中嵌入了一个3D绘图,我正试图通过将鼠标事件绑定到旋转、缩放和平移来实现交互式。我通过参考他们的axes3d源代码并分别修改elev和azim或x、y和z限制来实现旋转和缩放功能。

然而,还有一个平移部分没有在源代码中实现。它只是简单地说

#        elif self.button_pressed == 2:
# pan view
# project xv, yv, zv -> xw, yw, zw
# pan
#            pass

所以我试着自己实现它,但我做不好。以下是我所拥有的,如果放入他们的源代码中:

我遇到的问题是如何将鼠标移动的2 dx and dy值投影到三维轴的3 dxx, dyy and dzz值中。我现在所拥有的是错误的,尽管我真的不明白为什么。它并不总是按照我想要的方式平移,除了elev和azim的一些值,比如当elev=0和azim=0时,或者当只有一个是90的倍数时。当elev和azim都是90的非零倍数时,对于某些轴,它不会平移或以相反的方式平移。当它处于任何其他值时,它不会正确投影到所有轴,因此看起来我正在向左/向右/向上/向下平移整个图形。

elif self.button_pressed == 2:
# get the x and y pixel coords
if dx == 0 and dy == 0:
return
# how to convert dx dy -> dxx dyy dzz? this is wrong
minx, maxx, miny, maxy, minz, maxz = self.get_w_lims()
elev, azim = np.deg2rad(self.elev), np.deg2rad(self.azim)
dxx = (maxx-minx) * ( (dx/w) * np.sin(azim) + (dy/h) * np.sin(elev) )
dyy = (maxy-miny) * ( - (dx/w) * np.cos(azim) )
dzz = (maxz-minz) * ( - (dy/h) * np.cos(elev) )
# pan
self.set_xlim3d(minx + dxx, maxx + dxx)
self.set_ylim3d(miny + dyy, maxy + dyy)
self.set_zlim3d(minz + dzz, maxz + dzz)
self.get_proj()
self.figure.canvas.draw_idle()

edit:最新的matplotlib源代码已经实现了平移。

不知何故,可以工作

elif self.button_pressed == 2:
# get the x and y pixel coords
if dx == 0 and dy == 0:
return
# convert dx dy -> dxx dyy dzz
minx, maxx, miny, maxy, minz, maxz = self.get_w_lims()
elev, azim = np.deg2rad(self.elev), np.deg2rad(self.azim)
dxe = (dy/h) * np.sin(elev)
dye = - (dx/w)
dze = - (dy/h) * np.cos(elev)
dxx = (maxx-minx) * ( dxe * np.cos(azim) - dye * np.sin(azim) )
dyy = (maxy-miny) * ( dye * np.cos(azim) + dxe * np.sin(azim) )
dzz = (maxz-minz) * ( dze )
# pan
self.set_xlim3d(minx + dxx, maxx + dxx)
self.set_ylim3d(miny + dyy, maxy + dyy)
self.set_zlim3d(minz + dzz, maxz + dzz)
self.get_proj()
self.figure.canvas.draw_idle()

我注意到以前只有当elev或azim中的一个为0时它才起作用,所以我想也许我需要先通过elev,然后再通过azim进行投影。

最新更新