@@ -448,22 +448,27 @@ def do_3d_projection(self):
448
448
"""
449
449
Project the points according to renderer matrix.
450
450
"""
451
- segments = self ._segments3d
451
+ segments = np .asanyarray (self ._segments3d )
452
+
453
+ mask = False
454
+ if np .ma .isMA (segments ):
455
+ mask = segments .mask
456
+
452
457
if self ._axlim_clip :
453
- all_points = np .ma .vstack (segments )
454
- masked_points = np .ma .column_stack ([* _viewlim_mask (* all_points .T ,
455
- self .axes )])
456
- segment_lengths = [np .shape (segment )[0 ] for segment in segments ]
457
- segments = np .split (masked_points , np .cumsum (segment_lengths [:- 1 ]))
458
- xyslist = [proj3d ._proj_trans_points (points , self .axes .M )
459
- for points in segments ]
460
- segments_2d = [np .ma .column_stack ([xs , ys ]) for xs , ys , zs in xyslist ]
458
+ viewlim_mask = _viewlim_mask (segments [..., 0 ],
459
+ segments [..., 1 ],
460
+ segments [..., 2 ],
461
+ self .axes )
462
+ if np .any (viewlim_mask ):
463
+ # broadcast mask to 3D
464
+ viewlim_mask = viewlim_mask [..., np .newaxis ].repeat (3 , axis = - 1 )
465
+ mask = mask | viewlim_mask
466
+ xyzs = np .ma .array (proj3d ._proj_transform_vectors (segments , self .axes .M ), mask = mask )
467
+ segments_2d = xyzs [..., 0 :2 ]
461
468
LineCollection .set_segments (self , segments_2d )
462
469
463
470
# FIXME
464
- minz = 1e9
465
- for xs , ys , zs in xyslist :
466
- minz = min (minz , min (zs ))
471
+ minz = min (xyzs [..., 2 ].min (), 1e9 )
467
472
return minz
468
473
469
474
@@ -853,11 +858,17 @@ def set_depthshade(self, depthshade):
853
858
self .stale = True
854
859
855
860
def do_3d_projection (self ):
861
+ mask = False
862
+ for xyz in self ._offsets3d :
863
+ if np .ma .isMA (xyz ):
864
+ mask = mask | xyz .mask
856
865
if self ._axlim_clip :
857
- xs , ys , zs = _viewlim_mask (* self ._offsets3d , self .axes )
866
+ mask = mask | _viewlim_mask (* self ._offsets3d , self .axes )
867
+ mask = np .broadcast_to (mask , (len (self ._offsets3d ), * self ._offsets3d [0 ].shape ))
868
+ xyzs = np .ma .array (self ._offsets3d , mask = mask )
858
869
else :
859
- xs , ys , zs = self ._offsets3d
860
- vxs , vys , vzs , vis = proj3d ._proj_transform_clip (xs , ys , zs ,
870
+ xyzs = self ._offsets3d
871
+ vxs , vys , vzs , vis = proj3d ._proj_transform_clip (* xyzs ,
861
872
self .axes .M ,
862
873
self .axes ._focal_length )
863
874
# Sort the points based on z coordinates
0 commit comments