@@ -1068,7 +1068,6 @@ def _on_move(self, event):
1068
1068
dazim = - (dy / h )* 180 * np .sin (roll ) - (dx / w )* 180 * np .cos (roll )
1069
1069
self .elev = self .elev + delev
1070
1070
self .azim = self .azim + dazim
1071
- self .get_proj ()
1072
1071
self .stale = True
1073
1072
1074
1073
elif self .button_pressed in self ._pan_btn :
@@ -1083,7 +1082,7 @@ def _on_move(self, event):
1083
1082
elif self .button_pressed in self ._zoom_btn :
1084
1083
# zoom view (dragging down zooms in)
1085
1084
scale = h / (h - dy )
1086
- self ._zoom_data_limits (scale , scale )
1085
+ self ._zoom_data_limits (scale , scale , scale )
1087
1086
1088
1087
# Store the event coordinates for the next time through.
1089
1088
self .sx , self .sy = x , y
@@ -1106,7 +1105,7 @@ def drag_pan(self, button, key, x, y):
1106
1105
return
1107
1106
dz = 0
1108
1107
1109
- # Transform the pan into view-projected coordinates
1108
+ # Transform the pan from the view axes to the data axees
1110
1109
u , v , n = self ._get_view_axes (self .eye )
1111
1110
U , V , N = - np .array ([u , v , n ]) / self ._box_aspect * self ._dist
1112
1111
dxyz_projected = dx * U + dy * V + dz * N
@@ -1121,7 +1120,6 @@ def drag_pan(self, button, key, x, y):
1121
1120
self .set_xlim3d (minx + dxx , maxx + dxx )
1122
1121
self .set_ylim3d (miny + dyy , maxy + dyy )
1123
1122
self .set_zlim3d (minz + dzz , maxz + dzz )
1124
- self .get_proj ()
1125
1123
1126
1124
def _get_view_axes (self , eye ):
1127
1125
elev_rad = np .deg2rad (art3d ._norm_angle (self .elev ))
@@ -1154,8 +1152,8 @@ def _set_view_from_bbox(self, bbox, direction='in',
1154
1152
self .end_pan ()
1155
1153
1156
1154
# Calculate zoom level
1157
- scale_x = abs (( start_x - stop_x )/ (self .bbox .max [0 ] - self .bbox .min [0 ]) )
1158
- scale_y = abs (( start_y - stop_y )/ (self .bbox .max [1 ] - self .bbox .min [1 ]) )
1155
+ scale_x = abs (start_x - stop_x ) / (self .bbox .max [0 ] - self .bbox .min [0 ])
1156
+ scale_y = abs (start_y - stop_y ) / (self .bbox .max [1 ] - self .bbox .min [1 ])
1159
1157
if direction == 'out' :
1160
1158
scale_x = 1 / scale_x
1161
1159
scale_y = 1 / scale_y
@@ -1201,21 +1199,24 @@ def _prepare_view_from_bbox(self, bbox, direction='in',
1201
1199
return bbox
1202
1200
1203
1201
def _zoom_data_limits (self , scale_x , scale_y , scale_z = 1 ):
1204
- # hmmm..this needs some help from clipping....
1202
+ # Convert from the scale factors in the view frame to the data frame
1205
1203
u , v , n = self ._get_view_axes (self .eye )
1206
- scale = np .abs (scale_x * u + scale_y * v + scale_z * n )
1204
+ R = np .array ([u , v , n ])
1205
+ S = np .array ([scale_x , scale_y , scale_z ])
1206
+ scale = np .linalg .norm (R .T @(np .eye (3 )* S ), axis = 1 )
1207
1207
1208
+ # Scale the data range
1208
1209
minx , maxx , miny , maxy , minz , maxz = self .get_w_lims ()
1210
+ dxyz = np .array ([maxx - minx , maxy - miny , maxz - minz ])
1211
+ dxyz_scaled = dxyz * scale
1212
+
1213
+ # Set the axis limits
1209
1214
cx = (maxx + minx )/ 2
1210
1215
cy = (maxy + miny )/ 2
1211
1216
cz = (maxz + minz )/ 2
1212
- dx = (maxx - minx )* scale [0 ]/ 2
1213
- dy = (maxy - miny )* scale [1 ]/ 2
1214
- dz = (maxz - minz )* scale [2 ]/ 2
1215
- self .set_xlim3d (cx - dx , cx + dx )
1216
- self .set_ylim3d (cy - dy , cy + dy )
1217
- self .set_zlim3d (cz - dz , cz + dz )
1218
- self .get_proj ()
1217
+ self .set_xlim3d (cx - dxyz_scaled [0 ]/ 2 , cx + dxyz_scaled [0 ]/ 2 )
1218
+ self .set_ylim3d (cy - dxyz_scaled [1 ]/ 2 , cy + dxyz_scaled [1 ]/ 2 )
1219
+ self .set_zlim3d (cz - dxyz_scaled [2 ]/ 2 , cz + dxyz_scaled [2 ]/ 2 )
1219
1220
1220
1221
def set_zlabel (self , zlabel , fontdict = None , labelpad = None , ** kwargs ):
1221
1222
"""
0 commit comments