@@ -224,16 +224,10 @@ def do_3d_projection(self, renderer):
224
224
'''
225
225
Project the points according to renderer matrix.
226
226
'''
227
- xyslist = [
228
- proj3d .proj_trans_points (points , renderer .M ) for points in
229
- self ._segments3d ]
230
- segments_2d = [list (zip (xs , ys )) for (xs , ys , zs ) in xyslist ]
227
+ xys = proj3d .proj_trans_points (self ._segments3d , renderer .M )
228
+ segments_2d = xys [0 :1 , :]
231
229
LineCollection .set_segments (self , segments_2d )
232
-
233
- # FIXME
234
- minz = 1e9
235
- for (xs , ys , zs ) in xyslist :
236
- minz = min (minz , min (zs ))
230
+ minz = np .min (xys [2 , :])
237
231
return minz
238
232
239
233
def draw (self , renderer , project = False ):
@@ -551,30 +545,15 @@ def set_zsort(self, zsort):
551
545
552
546
def get_vector (self , segments3d ):
553
547
"""Optimize points for projection"""
554
- si = 0
555
- ei = 0
556
- segis = []
557
- points = []
558
- for p in segments3d :
559
- points .extend (p )
560
- ei = si + len (p )
561
- segis .append ((si , ei ))
562
- si = ei
563
-
564
- if len (segments3d ) > 0 :
565
- xs , ys , zs = list (zip (* points ))
566
- else :
567
- # We need this so that we can skip the bad unpacking from zip()
568
- xs , ys , zs = [], [], []
569
-
570
- ones = np .ones (len (xs ))
571
- self ._vec = np .array ([xs , ys , zs , ones ])
572
- self ._segis = segis
548
+ xys = segments3d .reshape ((- 1 , 3 )).T
549
+ ones = np .ones (xys .shape [1 ])
550
+ self ._vec = np .vstack ([xys , ones ])
573
551
574
552
def set_verts (self , verts , closed = True ):
575
553
'''Set 3D vertices.'''
576
554
self .get_vector (verts )
577
555
# 2D verts will be updated at draw time
556
+ # XXX Is this line useful?
578
557
PolyCollection .set_verts (self , [], closed )
579
558
580
559
def set_verts_and_codes (self , verts , codes ):
@@ -601,6 +580,9 @@ def set_sort_zpos(self,val):
601
580
self ._sort_zpos = val
602
581
self .stale = True
603
582
583
+ from profilehooks import profile
584
+
585
+ #@profile
604
586
def do_3d_projection (self , renderer ):
605
587
'''
606
588
Perform the 3D projection for this object.
@@ -610,9 +592,9 @@ def do_3d_projection(self, renderer):
610
592
self .update_scalarmappable ()
611
593
self ._facecolors3d = self ._facecolors
612
594
613
- txs , tys , tzs = proj3d . proj_transform_vec ( self . _vec , renderer . M )
614
- xyzlist = [( txs [ si : ei ], tys [ si : ei ], tzs [ si : ei ] )
615
- for si , ei in self . _segis ]
595
+ # XXX proj_transform_vec can work with arrays only
596
+ xys = np . array ( proj3d . proj_transform_vec ( self . _vec , renderer . M ) )
597
+ xyzlist = np . transpose ( xys . T . reshape (( - 1 , 3 , 3 )), axes = [ 0 , 2 , 1 ])
616
598
617
599
# This extra fuss is to re-order face / edge colors
618
600
cface = self ._facecolors3d
@@ -626,24 +608,21 @@ def do_3d_projection(self, renderer):
626
608
627
609
# if required sort by depth (furthest drawn first)
628
610
if self ._zsort :
629
- indices = range (len (xyzlist ))
630
- z_segments_2d = [(self ._zsortfunc (zs ), list (zip (xs , ys )), fc , ec ,
631
- idx ) for (xs , ys , zs ), fc , ec , idx in
632
- zip (xyzlist , cface , cedge , indices )]
633
- z_segments_2d .sort (key = lambda x : x [0 ], reverse = True )
611
+ z_argsort = np .argsort (
612
+ self ._zsortfunc (xyzlist [:, 2 , :], axis = 1 ))[::- 1 ]
634
613
else :
635
614
raise ValueError ("whoops" )
636
615
637
- segments_2d = [ s for z , s , fc , ec , idx in z_segments_2d ]
616
+ segments_2d = np . transpose ( xyzlist [ z_argsort , 0 : 2 , :], axes = [ 0 , 2 , 1 ])
638
617
if self ._codes3d is not None :
639
- codes = [ self ._codes3d [idx ] for z , s , fc , ec , idx in z_segments_2d ]
618
+ codes = self ._codes3d [z_argsort ]
640
619
PolyCollection .set_verts_and_codes (self , segments_2d , codes )
641
620
else :
642
621
PolyCollection .set_verts (self , segments_2d )
643
622
644
- self ._facecolors2d = [ fc for z , s , fc , ec , idx in z_segments_2d ]
623
+ self ._facecolors2d = cface [ z_argsort ]
645
624
if len (self ._edgecolors3d ) == len (cface ):
646
- self ._edgecolors2d = [ ec for z , s , fc , ec , idx in z_segments_2d ]
625
+ self ._edgecolors2d = cedge [ z_argsort ]
647
626
else :
648
627
self ._edgecolors2d = self ._edgecolors3d
649
628
@@ -652,11 +631,11 @@ def do_3d_projection(self, renderer):
652
631
zvec = np .array ([[0 ], [0 ], [self ._sort_zpos ], [1 ]])
653
632
ztrans = proj3d .proj_transform_vec (zvec , renderer .M )
654
633
return ztrans [2 ][0 ]
655
- elif tzs .size > 0 :
634
+ elif xys [ 2 ] .size > 0 :
656
635
# FIXME: Some results still don't look quite right.
657
636
# In particular, examine contourf3d_demo2.py
658
637
# with az = -54 and elev = -45.
659
- return np .min (tzs )
638
+ return np .min (xys [ 2 ] )
660
639
else :
661
640
return np .nan
662
641
0 commit comments