B
    ]”t\  ã               @   s°   d Z ddlZddlmZ dd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeZdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZdS )'z,
Various transforms used for by the 3D code
é    Nc       	      C   sx   | dd… \}}|dd… \}}||kr6d}d}|}n8||krNd}d}| }n || }|| }|| ||  }|||fS )z<
    Return 2D equation of line in the form ax+by+c = 0
    Né   éÿÿÿÿr   é   © )	Úp0Úp1Úx0Úy0Zx1Zy1ÚaÚbÚcr   r   ú:lib/python3.7/site-packages/mpl_toolkits/mplot3d/proj3d.pyÚline2d   s    r   c             C   s@   | \}}}|\}}t || ||  | t |d |d  ¡ ƒS )zO
    Distance from line to point
    line is a tuple of coefficients a,b,c
    r   )ÚabsÚnpÚsqrt)ÚlÚpr
   r   r   r   r	   r   r   r   Úline2d_dist!   s    
r   c       	      C   s¤   |d | d  }|d | d  }t  |d ¡| d  }t  |d ¡| d  }|| ||  |d |d   }t  |dd¡}t  |||  d |||  d  ¡}|S )zÑ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
    r   r   r   )r   ZasarrayZclipr   )	r   Zp2r   Zx21Zy21Zx01Zy01ÚuÚdr   r   r   Úline2d_seg_dist+   s    
 &r   c             C   s*   t  | d d | d d  | d d  ¡S )z3d vector lengthr   r   r   )r   r   )Úvr   r   r   ÚmodA   s    r   c       	   	   C   sl   ||  || ||   }}}t  d| dd|  | gdd| d| | gddd| | | gddddgg¡S )Ng      ð?r   )r   Úarray)	ZxminZxmaxZyminZymaxZzminZzmaxZdxZdyZdzr   r   r   Úworld_transformationE   s    r   c             C   sÒ   | | }|t |ƒ }t ||¡}|t |ƒ }t ||¡}|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 ||¡S )Nr   r   r   )r   r   ZcrossÚdot)ÚEÚRÚVÚnr   r   ZMrZMtr   r   r   Úview_transformationP   s    r!   c          	   C   sV   | | | |  }d| |  | |  }t  ddddgddddgdd||gddddgg¡S )Néþÿÿÿr   r   r   )r   r   )ÚzfrontÚzbackr
   r   r   r   r   Úpersp_transformationp   s    

r%   c          	   C   sF   | |  }| |  }t  ddddgddddgddddgdd||gg¡S )Nr   r   r"   )r   r   )r#   r$   r
   r   r   r   r   Úortho_transformationy   s    



r&   c             C   sF   t  || ¡}|d }|d | |d | |d |   }}}|||fS )Né   r   r   r   )r   r   )ÚvecÚMÚvecwÚwÚtxsÚtysÚtzsr   r   r   Úproj_transform_vecƒ   s    (r/   c             C   sŽ   t  || ¡}|d }|d | |d | |d |   }}}d|d k|d dk@ d|d k@ |d dk@ }t  |¡r‚|d dk }||||fS )Nr'   r   r   r   )r   r   Úany)r(   r)   r*   r+   r,   r-   r.   Ztisr   r   r   Úproj_transform_vec_clipŠ   s    (0
r1   c             C   s^   t  |¡}t| ||ƒ}t ||¡}y||d  }W n tk
rF   Y nX |d |d |d fS )Nr'   r   r   r   )ÚlinalgÚinvÚvec_pad_onesr   r   ÚOverflowError)ÚxsÚysÚzsr)   ZiMr(   Zvecrr   r   r   Úinv_transform”   s    
r9   c             C   s   t  | ||t  | ¡g¡S )N)r   r   Z	ones_like)r6   r7   r8   r   r   r   r4   ž   s    r4   c             C   s   t | ||ƒ}t||ƒS )z7
    Transform the points by the projection matrix
    )r4   r/   )r6   r7   r8   r)   r(   r   r   r   Úproj_transform¡   s    r:   c             C   s   t | ||ƒ}t||ƒS )zv
    Transform the points by the projection matrix
    and return the clipping result
    returns txs,tys,tzs,tis
    )r4   r1   )r6   r7   r8   r)   r(   r   r   r   Úproj_transform_clip¨   s    r;   c             C   s   t  t| |ƒ¡S )N)r   Zcolumn_stackÚproj_trans_points)Úpointsr)   r   r   r   Úproj_points²   s    r>   c             C   s   t | Ž \}}}t||||ƒS )N)Úzipr:   )r=   r)   r6   r7   r8   r   r   r   r<   µ   s    r<   c             C   s   t | Ž \}}}t||||ƒS )N)r?   r;   )r=   r)   r6   r7   r8   r   r   r   Úproj_trans_clip_points¹   s    r@   c          	   C   sV   t  |¡t  |¡ }}t  ddddgd|| dgd||dgddddgg¡}t  || ¡S )Nr   r   )r   ZcosZsinr   r   )r   ZalphaZcosaZsinaZM1r   r   r   Úrot_x¾   s    
rA   )Ú__doc__Znumpyr   Znumpy.linalgr2   r   r   r   r   r   r!   r%   r&   r/   r1   r9   r4   r:   r;   Z	transformr>   r<   r@   rA   r   r   r   r   Ú<module>   s*   
 	


