Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在matplotlib 3D plot中实现平移_Python_Matplotlib_Mplot3d - Fatal编程技术网

Python 在matplotlib 3D plot中实现平移

Python 在matplotlib 3D plot中实现平移,python,matplotlib,mplot3d,Python,Matplotlib,Mplot3d,我有一个嵌入在tkinter中的3D绘图,我试图通过将鼠标事件绑定到旋转、缩放和平移来实现交互。我实现了旋转和缩放功能,通过参考它们并分别修改elev和azim或x、y和z限制 但是,源代码中没有实现平移部分。它只是说 # elif self.button_pressed == 2: # pan view # project xv, yv, zv -> xw, yw, zw # pan #

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

但是,源代码中没有实现平移部分。它只是说

#        elif self.button_pressed == 2:
            # pan view
            # project xv, yv, zv -> xw, yw, zw
            # pan
#            pass
所以我试着自己去实现,但我没能做到。以下是我在源代码中得到的信息:

我遇到的问题是如何将鼠标移动的
2dx和dy
值投影到三维轴的
3dxx、dyy和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()
编辑:最新的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进行投影。

不知怎的,这是可行的

        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进行投影。

如果始终保持z轴与屏幕垂直对齐,则可以滑动z轴的限制以响应鼠标移动的垂直分量,并滑动x轴和y轴的极限,以响应投影在两个轴上的水平分量。只是一个想法。@GBOFI我知道,但我希望有一个投影公式,无论我在哪种视图中都能起作用如果你总是让z轴与屏幕垂直对齐,你可以根据鼠标移动的垂直分量滑动z轴的限制,并滑动x轴和y轴的极限,以响应投影在两个轴上的水平分量。只是一个想法。@gboffi我知道,但我希望有一个投影公式,无论我在什么视角下都能起作用