ó
ąéRc           @   s6  d  Z  d d l m Z d d l m Z d d l Z d d l j Z d   Z	 d   Z
 d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z e Z d   Z d   Z d   Z d d  Z d d  Z d   Z d   Z  d   Z! e" d k r2e   n  d S(   s,   
Various transforms used for by the 3D code
i˙˙˙˙(   t   LineCollection(   t   CircleNc   	      C   s   |  d  \ } } | d  \ } } | | k rA d } d } | } nH | | k rc d } d } | } n& | | } | | } | | | | } | | | f S(   s<   
    Return 2D equation of line in the form ax+by+c = 0
    i   i˙˙˙˙i    i   (    (	   t   p0t   p1t   x0t   y0t   x1t   y1t   at   bt   c(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   line2d   s    	


c         C   sN   |  \ } } } | \ } } t  | | | | | t j | d | d   S(   sO   
    Distance from line to point
    line is a tuple of coefficients a,b,c
    i   (   t   abst   npt   sqrt(   t   lt   pR   R	   R
   R   R   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   line2d_dist%   s    c   	      C   sĚ   | d |  d } | d |  d } t  j | d  |  d } t  j | d  |  d } | | | | t t | d | d   } t  j | d d  } t  j | | | d | | | d  } | S(   sŃ   distance(s) from line defined by p1 - p2 to point(s) p0

    p0[0] = x(s)
    p0[1] = y(s)

    intersection point p = p1 + u*(p2-p1)
    and intersection point lies within segment if u is between 0 and 1
    i    i   i   (   R   t   asarrayt   floatR   t   clipR   (	   R   t   p2R   t   x21t   y21t   x01t   y01t   ut   d(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   line2d_seg_dist/   s    
.+c          C   s*  d d  l  }  |  j   } d
 d } } |  j | |  t | |  } | \ } } d d } } |  j | |  t | | | d | d f  } t | | t j | | f   } xK t | | |  D]7 \ } }	 }
 t | |	 f |
 d d } | j	 |  qÁ W|  j
 d	 d  |  j d	 d  |  j   d  S(   Ni˙˙˙˙i    i   i   i   id   iČ   t   filli8˙˙˙(   i    i   (   i   i   (   i    i    i   i   (   id   i   i   iČ   (   t   pylabt   gcat   plott   zipt   scatterR   R   t   arrayR   t	   add_patcht   xlimt   ylimt   show(   R   t   axt   xst   yst   pointsR   R   t   distt   xt   yR   R
   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   test_lines_distsD   s      !"c         C   s-   t  j |  d d |  d d |  d d  S(   s   3d vector lengthi    i   i   (   R   R   (   t   v(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   modZ   s    c   	      C   s   | |  | | | | } } } t  j d | d d |  | g d d | d | | g d d d | | | g d d d d g g  S(   Ng      đ?i    (   R   R#   (	   t   xmint   xmaxt   ymint   ymaxt   zmint   zmaxt   dxt   dyt   dz(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   world_transformation^   s     c          C   sH   d \ }  } d \ } } d \ } } t  |  | | | | |  } | GHd  S(	   Nid   ix   i˙˙˙gš?gÉ?(   id   ix   (   i˙˙˙id   (   gš?gÉ?(   R;   (   R2   R3   R4   R5   R6   R7   t   M(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt
   test_worldh   s
    c         C   s  |  | } | t  |  } t j | |  } | t  |  } t j | |  } | d | d | d d g | d | d | d d g | d | d | d d g d d d d g g } d d d |  d g d d d |  d g d d d |  d g d d d d g g } t j | |  S(   Ni    i   i   (   R1   R   t   crosst   dot(   t   Et   Rt   Vt   nR   R0   t   Mrt   Mt(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   view_transformationo   s    
c         C   sq   |  | |  | } d |  | |  | } t  j d d d d g d d d d g d d | | g d d d d g g  S(   Niţ˙˙˙i   i    i˙˙˙˙(   R   R#   (   t   zfrontt   zbackR   R	   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   persp_transformation   s    c         C   sU   t  j | |   } | d } | d | | d | | d | } } } | | | f S(   Ni   i    i   i   (   R   R?   (   t   vecR<   t   vecwt   wt   txst   tyst   tzs(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   proj_transform_vec   s    
,c         C   s´   t  j | |   } | d } | d | | d | | d | } } } | d d k | d d k | d d k | d d k } t  j |  r¤ | d d k  } n  | | | | f S(   Ni   i    i   i   (   R   R?   t   sometrue(   RJ   R<   RK   RL   RM   RN   RO   t   tis(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   proj_transform_vec_clip   s    
,:c         C   sr   t  j |  } t |  | |  } t j | |  } y | | d } Wn t k
 rX n X| d | d | d f S(   Ni   i    i   i   (   t   linalgt   invt   vec_pad_onesR   R?   t   OverflowError(   R)   R*   t   zsR<   t   iMRJ   t   vecr(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   inv_transformŠ   s    c         C   sŚ   ys y+ t  j |  | | t  j |  j  g  } WnA t t f k
 rq t  j |  | | t  j t |    g  } n XWn, t k
 rĄ t  j |  | | d g  } n X| S(   Ni   (   R   R#   t   onest   shapet   AttributeErrort	   TypeErrort   len(   R)   R*   RX   RJ   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyRV   ł   s    +2c         C   s   t  |  | |  } t | |  S(   s7   
    Transform the points by the projection matrix
    (   RV   RP   (   R)   R*   RX   R<   RJ   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   proj_transform˝   s    c         C   s   t  |  | |  } t | |  S(   sv   
    Transform the points by the projection matrix
    and return the clipping result
    returns txs,tys,tzs,tis
    (   RV   RS   (   R)   R*   RX   R<   RJ   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   proj_transform_clipÄ   s    c         C   s   t  t |  |    S(   N(   R!   t   proj_trans_points(   R+   R<   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   proj_pointsÎ   s    c         C   s(   t  |    \ } } } t | | | |  S(   N(   R!   Ra   (   R+   R<   R)   R*   RX   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyRc   Ń   s    c         C   s(   t  |    \ } } } t | | | |  S(   N(   R!   Rb   (   R+   R<   R)   R*   RX   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   proj_trans_clip_pointsŐ   s    i   c         C   sG  d d  l  } d | d d g d d | d g d d d | g } } } t | | | |   \ } } } | d | d f | d | d f | d | d f | d | d f f \ }	 }
 } } |	 |
 f |	 | f |	 | f g } | j   }
 t |  } |
 j |  xB t | | d d d d	 g  D]" \ } } } | j | | |  qWd  S(
   Ni˙˙˙˙i    i   i   i   t   oR-   R.   t   z(   R   Ra   R   R    t   add_collectionR!   t   text(   R<   t   sR   R)   R*   RX   RM   RN   RO   Rf   R(   t   ayt   azt   linest   linecR-   R.   t   t(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   test_proj_draw_axesŮ   s    8"4!.c         C   s   |  p t  j d d d g  d }  t  j d d d g  d } t  j d d d g  } t |  | |  } t d d  } t  j | |  } | S(   Ni   i˙˙˙˙i   ič  id   i    i˙˙˙(   R   R#   RF   RI   R?   (   R@   RA   RB   t   viewMt   perspMR<   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   test_proj_make_Mç   s    "c          C   sŐ  d d  l  }  t   } g  d d d d d d d d d	 d g
 D] } d
 | ^ q: } d d d d d d d d d d g
 d d d d d d d d d d g
 d d d d d d d d d d g
 } } } g  | | | f D] } t j |  d ^ qÎ \ } } } t | d d t | | | |  \ } }	 }
 t | |	 |
 |  \ } } } |  j | |	 d |
 |  j | |	 d d x6 t	 | |	 |  D]" \ } } } |  j
 | | |  qW|  j d d  |  j d d  |  j   d  S(   Ni˙˙˙˙i    i   i   i   i   i   i   i   s   %di,  Rj   i  R
   t   rgÉżgÉ?(   R   Rs   R   R#   Rp   Ra   R[   R"   R    R!   Ri   R%   R&   R'   (   R   R<   t   it   tsR)   R*   RX   R0   RM   RN   RO   t   ixst   iyst   izsR-   R.   Ro   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt	   test_projň   s     	;B,8"c         C   s{   t  j |  t  j |  } } t  j d d d d g d | | d g d | | d g d d d d g g  } t  j | |   S(   Ni   i    (   R   t   cost   sinR#   R?   (   RB   t   alphat   cosat   sinat   M1(    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   rot_x	  s    c          C   sR   d d d d g }  t  |  t j d  GHd d d d g }  t  |  t j d  GHd  S(   Ni   i    i   (   R   R   t   pi(   RB   (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   test_rot  s    t   __main__(#   t   __doc__t   matplotlib.collectionsR    t   matplotlib.patchesR   t   numpyR   t   numpy.linalgRT   R   R   R   R/   R1   R;   R=   RF   RI   RP   RS   R[   RV   Ra   Rb   t	   transformRd   Rc   Re   Rp   t   NoneRs   Rz   R   R   t   __name__(    (    (    sU   /opt/xtal/ccp4-6.5-linux32/lib/python2.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyt   <module>   s<   		
				
		 				
	
	
									