U
    d»{jL  ã                   @   sš   d Z ddlZddlmZ dd„ Zd!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   sÄ   t  |d ¡| d  }t  |d ¡| d  }t  | dd… |dd… k¡rVt  ||¡S |d | d  }|d | d  }|| ||  |d |d   }t  |dd¡}t  |||  |||  ¡}|S )a2  
    Return the 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.

    If p1 and p2 are identical, the distance between them and p0 is returned.
    r   é   é   )ÚnpZasarrayÚallÚhypotZclip)	Úp1Zp2Úp0Zx01Zy01Zx21Zy21ÚuÚd© r   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mpl_toolkits/mplot3d/proj3d.pyÚ_line2d_seg_dist	   s     r   c              	   C   s’   ||  }|| }|| }	|dk	rB|\}
}}||
 }|| }|	| }	t  d| dd|  | gdd| d| | gddd|	 | |	 gddddgg¡S )zŸ
    Produce a matrix that scales homogeneous coords in the specified ranges
    to [0, 1], or [0, pb_aspect[i]] if the plotbox aspect ratio is specified.
    Nr   r   ©r   Úarray)ZxminZxmaxZyminZymaxZzminZzmaxZ	pb_aspectZdxZdyZdzZaxZayÚazr   r   r   Úworld_transformation$   s    

ýr   c           	      C   sê   | t j | ¡ \}}}t  |¡}t  |¡}dt  |d ¡d  }t  || | | || | ||  || | ||  g|| | ||  || | | || | ||  g|| | ||  || | ||  || | | gg¡}|S )zK
    Produce a rotation matrix for an angle in radians about a vector.
    r   )r   ÚlinalgÚnormÚsinÚcosr   )	ÚvZangleZvxZvyZvzÚsÚcÚtÚRr   r   r   Úrotation_about_vector:   s    

444ýr   c           
      C   s¸   | | }|t j |¡ }t  ||¡}|t j |¡ }t  ||¡}|dkrlt|| ƒ}t  ||¡}t  ||¡}t  d¡}t  d¡}	|||g|d d…d d…f< |  |	d d…df< t  ||	¡S )Nr   é   é   éÿÿÿÿ)r   r   r   Úcrossr   ÚdotÚeye)
ÚEr   ÚVZrollÚnr	   r   ZRrollZMrZMtr   r   r   Úview_transformationK   s    

r%   c              	   C   sf   |}d}| | | |  }d| |  | |  }t  |dddgd|| ddgdd||gddddgg¡}|S )Nr   éþÿÿÿr   r   r   )ÚzfrontÚzbackZfocal_lengthÚeÚaÚbr   Úproj_matrixr   r   r   Úpersp_transformationa   s    

ýr-   c              	   C   sJ   | |  }| |  }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_transformationm   s    




ýr.   c                 C   sF   t  || ¡}|d }|d | |d | |d |   }}}|||fS ©Nr   r   r   r   )r   r    )ÚvecÚMÚvecwÚwÚtxsÚtysÚtzsr   r   r   Ú_proj_transform_vecx   s    (r7   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 r/   )r   r    Úany)r0   r1   r2   r3   r4   r5   r6   Ztisr   r   r   Ú_proj_transform_vec_clip€   s    (0
r9   c                 C   s^   t  |¡}t| ||ƒ}t ||¡}z||d  }W n tk
rF   Y nX |d |d |d fS r/   )r   ÚinvÚ_vec_pad_onesr   r    ÚOverflowError)ÚxsÚysÚzsr1   ZiMr0   Zvecrr   r   r   Úinv_transform‹   s    
r@   c                 C   s   t  | ||t  | ¡g¡S ©N)r   r   Z	ones_like)r=   r>   r?   r   r   r   r;   –   s    r;   c                 C   s   t | ||ƒ}t||ƒS )z7
    Transform the points by the projection matrix
    )r;   r7   ©r=   r>   r?   r1   r0   r   r   r   Úproj_transformš   s    rC   c                 C   s   t | ||ƒ}t||ƒS )zy
    Transform the points by the projection matrix
    and return the clipping result
    returns txs, tys, tzs, tis
    )r;   r9   rB   r   r   r   Úproj_transform_clip¥   s    rD   c                 C   s   t  t| |ƒ¡S rA   )r   Zcolumn_stackÚproj_trans_points)Úpointsr1   r   r   r   Úproj_points¯   s    rG   c                 C   s   t | Ž \}}}t||||ƒS rA   )ÚziprC   )rF   r1   r=   r>   r?   r   r   r   rE   ³   s    rE   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   r   r   r   r    )r#   ÚalphaZcosaZsinaZM1r   r   r   Úrot_x¸   s    

ýrJ   )N)Ú__doc__Únumpyr   Znumpy.linalgr   r   r   r   r%   r-   r.   r7   r9   r@   r;   rC   Z	transformrD   rG   rE   rJ   r   r   r   r   Ú<module>   s&    þ

