o
    JfG                      @   sp   d Z ddlmZmZmZmZ ddlZddlZg dZ	dd Z
dd ZdddZdddZdddZdddZdS )zBAffine transforms, both in general and specific, named transforms.    )cospisintanN)affine_transformrotatescaleskew	translatec                    s   t |dkr"d	|\ 
| jr!d	dd    n t |dkr>d	|\ 
| js=d	ntd 	
fdd	}tj| |	dkd
S )a$  Return a transformed geometry using an affine transformation matrix.

    The coefficient matrix is provided as a list or tuple with 6 or 12 items
    for 2D or 3D transformations, respectively.

    For 2D affine transformations, the 6 parameter matrix is::

        [a, b, d, e, xoff, yoff]

    which represents the augmented matrix::

        [x']   / a  b xoff \ [x]
        [y'] = | d  e yoff | [y]
        [1 ]   \ 0  0   1  / [1]

    or the equations for the transformed coordinates::

        x' = a * x + b * y + xoff
        y' = d * x + e * y + yoff

    For 3D affine transformations, the 12 parameter matrix is::

        [a, b, c, d, e, f, g, h, i, xoff, yoff, zoff]

    which represents the augmented matrix::

        [x']   / a  b  c xoff \ [x]
        [y'] = | d  e  f yoff | [y]
        [z']   | g  h  i zoff | [z]
        [1 ]   \ 0  0  0   1  / [1]

    or the equations for the transformed coordinates::

        x' = a * x + b * y + c * z + xoff
        y' = d * x + e * y + f * z + yoff
        z' = g * x + h * y + i * z + zoff
                   ?           z,'matrix' expects either 6 or 12 coefficientsc                    s   	dkr'| j \}} | |  
 }| |   }t||gj }|S 	dkrd| j \}}} | |  |  
 }| |  |   }| |  |   }t|||gj }|S )Nr   r   )Tnpstack)coordsxyxpypresultzzpabcdefghindimxoffyoffzoff \/home/deployuser/azure_apps/autowriter/venv/lib/python3.10/site-packages/shapely/affinity.py_affine_coordsH   s   
z(affine_transform.<locals>._affine_coords)	include_z)lenhas_z
ValueErrorshapely	transform)geommatrixr,   r*   r   r+   r      s"   &$	r   c                 C   s   |dkr| j \}}}}|| d || d f}n%|dkr#| jjd }nt|tr0td|dt|ddd	kr=|jd }t|d
vrGtd|dkrQ|dd S t|dkr[|d S |S )a6  Returns interpreted coordinate tuple for origin parameter.

    This is a helper function for other transform functions.

    The point of origin can be a keyword 'center' for the 2D bounding box
    center, 'centroid' for the geometry's 2D centroid, a Point object or a
    coordinate tuple (x0, y0, z0).
    centerg       @centroidr   z'origin' keyword z is not recognized	geom_typeNPoint)r   r   z8Expected number of items in 'origin' to be either 2 or 3r   )r   )boundsr6   r   
isinstancestrr0   getattrr.   )r3   originr&   minxminymaxxmaxyr*   r*   r+   interpret_origin]   s    


rB   r5   Fc           	      C   s   | j r| S |s|t d }t|}t|}t|dk rd}t|dk r%d}t| |d\}}|| d||dddd|||  ||  |||  ||  df}t| |S )a  Returns a rotated geometry on a 2D plane.

    The angle of rotation can be specified in either degrees (default) or
    radians by setting ``use_radians=True``. Positive angles are
    counter-clockwise and negative are clockwise rotations.

    The point of origin can be a keyword 'center' for the bounding box
    center (default), 'centroid' for the geometry's centroid, a Point object
    or a coordinate tuple (x0, y0).

    The affine transformation matrix for 2D rotation is:

      / cos(r) -sin(r) xoff \
      | sin(r)  cos(r) yoff |
      \   0       0      1  /

    where the offsets are calculated from the origin Point(x0, y0):

        xoff = x0 - x0 * cos(r) + y0 * sin(r)
        yoff = y0 - x0 * sin(r) - y0 * cos(r)
         f@V瞯<r   r   r   )is_emptyr   r   r   absrB   r   )	r3   angler=   use_radianscospsinpx0y0r4   r*   r*   r+   r   ~   s"   &
r   r   c           	      C   sZ   | j r| S t| |d\}}}|ddd|ddd||||  |||  |||  f}t| |S )a  Returns a scaled geometry, scaled by factors along each dimension.

    The point of origin can be a keyword 'center' for the 2D bounding box
    center (default), 'centroid' for the geometry's 2D centroid, a Point
    object or a coordinate tuple (x0, y0, z0).

    Negative scale factors will mirror or reflect coordinates.

    The general 3D affine transformation matrix for scaling is:

        / xfact  0    0   xoff \
        |   0  yfact  0   yoff |
        |   0    0  zfact zoff |
        \   0    0    0     1  /

    where the offsets are calculated from the origin Point(x0, y0, z0):

        xoff = x0 - x0 * xfact
        yoff = y0 - y0 * yfact
        zoff = z0 - z0 * zfact
    r   r   )rE   rB   r   )	r3   xfactyfactzfactr=   rK   rL   z0r4   r*   r*   r+   r      s   
r   r   c           
      C   s   | j r| S |s|t d }|t d }t|}t|}t|dk r#d}t|dk r+d}t| |d\}}d|d|ddddd| | | | df}	t| |	S )a  Returns a skewed geometry, sheared by angles along x and y dimensions.

    The shear angle can be specified in either degrees (default) or radians
    by setting ``use_radians=True``.

    The point of origin can be a keyword 'center' for the bounding box
    center (default), 'centroid' for the geometry's centroid, a Point object
    or a coordinate tuple (x0, y0).

    The general 2D affine transformation matrix for skewing is:

        /   1    tan(xs) xoff \
        | tan(ys)  1     yoff |
        \   0      0       1  /

    where the offsets are calculated from the origin Point(x0, y0):

        xoff = -y0 * tan(xs)
        yoff = -x0 * tan(ys)
    rC   rD   r   r   r   )rE   r   r   rF   rB   r   )
r3   xsysr=   rH   tanxtanyrK   rL   r4   r*   r*   r+   r	      s$   
r	   c                 C   s0   | j r| S ddddddddd|||f}t| |S )zReturns a translated geometry shifted by offsets along each dimension.

    The general 3D affine transformation matrix for translation is:

        / 1  0  0 xoff \
        | 0  1  0 yoff |
        | 0  0  1 zoff |
        \ 0  0  0   1  /
    r   r   )rE   r   )r3   r'   r(   r)   r4   r*   r*   r+   r
      s   

r
   )r5   F)r   r   r   r5   )r   r   r5   F)r   r   r   )__doc__mathr   r   r   r   numpyr   r1   __all__r   rB   r   r   r	   r
   r*   r*   r*   r+   <module>   s    Q
!
+
#+