Ë
    W¨œjW8  ã                   óè   — d Z ddlmZmZmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZmZ ddlmZ d„ Zd	„ Zd
„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z G d„ de «      Z! G d„ de"«      Z#dd„Z$d„ Z%y)zÌThis submodule contains tools that deal with generic, degree n, Bezier
curves.
Note:  Bezier curves here are always represented by the tuple of their control
points given by their standard representation.é    )ÚdivisionÚabsolute_importÚprint_function)Ú	factorialÚceilÚlogÚsqrt)Úpoly1dé   )ÚrealÚimagÚ	polyrootsÚpolyroots01)ÚFLOAT_EPSILONc                 óN   — t        | «      t        |«      z  t        | |z
  «      z  S ©N©Úfac)ÚnÚks     úd/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/svgpathtools/bezier.pyÚ
n_choose_kr      s!   € Üˆq‹6”3�q“6‰>œ3˜q ™s›8Ñ#Ð#ó    c                 ó€   — d|z
  }t        | dz   «      D �cg c]  }t        | |«      || |z
  z  z  ||z  z  ‘Œ c}S c c}w )z[returns a list of the Bernstein basis polynomials b_{i, n} evaluated at
    t, for i =0...nr   )Úranger   )r   ÚtÚt1r   s       r   Ú	bernsteinr      sJ   € ð 
ˆ1‰€BÜ9>¸qÀ¹s¼ÓD¹°AŒJ�q˜!Ó˜r A a¡C™yÑ(¨1¨a©4Ó/¸ÑDÐDùÒDs   –";c                 ó   ‡ ‡— 	 ‰ j                    ‰ j                  |«      S #  Y nxY wt        ‰ «      dz
  }|dk(  rQ‰ d   |d‰ d   ‰ d   z
  z  |d‰ d   ‰ d   z   z  d‰ d   z  z
  |‰ d    d‰ d   ‰ d   z
  z  z   ‰ d   z   z  z   z  z   z  z   S |dk(  r/‰ d   |d‰ d   ‰ d   z
  z  |‰ d   d‰ d   z  z
  ‰ d   z   z  z   z  z   S |dk(  r‰ d   |‰ d   ‰ d   z
  z  z   S |dk(  r‰ d   S t        ||«      Št	        ˆˆ fd„t        |dz   «      D «       «      S )zñEvaluates the Bezier curve given by it's control points, p, at t.
    Note: Uses Horner's rule for cubic and lower order Bezier curves.
    Warning:  Be concerned about numerical stability when using this function
    with high order curves.r   é   r   é   é   c              3   ó4   •K  — | ]  }‰|   ‰|   z  –— Œ y ­wr   © )Ú.0r   ÚbernÚps     €€r   Ú	<genexpr>zbezier_point.<locals>.<genexpr>;   s   øè ø€ Ð6© A�4˜‘7˜1˜Q™4•<©ùs   ƒ)Ú	large_arcÚpointÚlenr   Úsumr   )r'   r   Údegr&   s   `  @r   Úbezier_pointr.      s€  ù€ ðØ	�ŠØ�w‰w�q‹zÐøðÙúô ˆa‹&�1‰*€CØ
ˆa‚xØ�‰t�aØˆq�‰t�a˜‘d‰{‰O˜aØ�1�Q‘4˜!˜A™$‘;‘ ! A a¡D¡&Ñ(¨1Ø�q‘T�E˜A˜q ™t a¨¡d™{™OÑ+¨a°©dÑ2ñ,4ñ 4ñ5ñ 5ñ6ñ 6ð 	6ð 
�ŠØ�‰t�aØˆq�‰t�a˜‘d‰{‰O˜aØ�!‘�q˜˜1™‘v‘  !¡Ñ$ñ&ñ &ñ'ñ 'ð 	'ð 
�ŠØ�‰t�a˜˜1™  !¡™‘oÑ%Ð%Ø	�ŠØ�‰tˆä˜˜aÓ ˆÜÔ6¬¨s°1©u¬Ó6Ó6Ð6s   „! ¡%c                 ó˜  ‡ ‡— t        ‰ «      dk(  rD‰ d    d‰ d   ‰ d   z
  z  z   ‰ d   z   d‰ d   d‰ d   z  z
  ‰ d   z   z  d‰ d   ‰ d   z
  z  ‰ d   f}nÙt        ‰ «      dk(  r'‰ d   d‰ d   z  z
  ‰ d   z   d‰ d   ‰ d   z
  z  ‰ d   f}n¤t        ‰ «      dk(  r‰ d   ‰ d   z
  ‰ d   f}n…t        ‰ «      dk(  r‰ }ntt        ‰ «      dz
  }t        |dz   «      D �‡cg c]>  Št        |«      t        |‰z
  «      z  t        ˆˆ fd„t        ‰dz   «      D «       «      z  ‘Œ@ }}|j	                  «        |s|ddd…   }|rt        |«      S |S c c}w )	aq  Converts a tuple of Bezier control points to a tuple of coefficients
    of the expanded polynomial.
    return_poly1d : returns a numpy.poly1d object.  This makes computations
    of derivatives/anti-derivatives and many other operations quite quick.
    numpy_ordering : By default (to accommodate numpy) the coefficients will
    be output in reverse standard order.é   r   r    r   r!   c              3   óp   •K  — | ]-  }d |‰z   z  ‰|   z  t        |«      t        ‰|z
  «      z  z  –— Œ/ y­w)éÿÿÿÿNr   )r%   ÚiÚjr'   s     €€r   r(   z$bezier2polynomial.<locals>.<genexpr>X   s=   øè ø€ ð )JÙ>H¸ˆR�1�Q‘3‰K˜!˜A™$Ñ¤# a£&¬3¨q°©s«8Ñ"3Õ4¹jùs   ƒ36Nr2   )r+   r   r   r,   Úreverser
   )r'   Únumpy_orderingÚreturn_poly1dÚcoeffsr   r4   s   `    `r   Úbezier2polynomialr9   @   sŸ  ù€ ô ˆ1ƒv�‚{Ø�Q‘4�%˜!˜Q˜q™T A a¡D™[™/Ñ)¨A¨a©DÑ0Ø�Q�q‘T˜A˜a ™d™F‘] Q q¡TÑ)Ñ*Ø�Q�q‘T˜!˜A™$‘Y‘-Ø�A‘$ð‰ô 
ˆQ‹�1ŠØ�A‘$˜˜1˜Q™4™‘- ! A¡$Ñ&Ø�Q�q‘T˜A˜a™D‘[‘/Ø�A‘$ð‰ô 
ˆQ‹�1ŠØ�A‘$�q˜‘t‘)Ø�A‘$ð‰ä	ˆQ‹�1ŠØ‰ô �‹F�Q‰Jˆô ˜1˜Q™3”Zô!á�ô �a“&œ#˜a ™c›(Ñ"¤Sô )JÜ>CÀAÀaÁC¼jó)Jó &Jó Jàð 	ð !ð 	�‰ÔÙØ™˜"˜‘ˆÙÜ�f‹~ÐØ€Mùò!s   ÃAEc                 ó€  — t        | t        «      r| j                  }n| }t        |«      dz
  }|dk(  rA|d   |d   dz  |d   z   |d   d|d   z  z   dz  |d   z   |d   |d   z   |d   z   |d   z   f}|S |dk(  r%|d   |d   dz  |d   z   |d   |d   z   |d   z   f}|S |dk(  r|d   |d   |d   z   f}|S t	        d«      ‚)z›Converts a cubic or lower order Polynomial object (or a sequence of
    coefficients) to a CubicBezier, QuadraticBezier, or Line object as
    appropriate.r   r    r!   r   zOThis function is only implemented for linear, quadratic, and cubic polynomials.)Ú
isinstancer
   r8   r+   ÚAssertionError)ÚpolyÚcÚorderÚbpointss       r   Úpolynomial2bezierrA   c   s  € ô �$œÔØ�K‰K‰àˆÜ�‹F�1‰H€EØ�‚zØ�Q‘4˜˜1™˜a™ ! A¡$™¨¨1©°°!°A±$±©¸Ñ(9¸A¸a¹DÑ(@Ø�Q‘4˜!˜A™$‘;  1¡Ñ%¨¨!©Ñ,ð.ˆð €Nð 
�!ŠØ�Q‘4˜˜1™˜a™ ! A¡$™¨¨!©¨q°©t©°a¸±dÑ(:Ð;ˆð €Nð 
�!ŠØ�Q‘4˜˜1™  !¡™Ð%ˆð €Nô ð Aó Bð 	Br   c                 óZ   ‡— ˆfd„Šg }g } ‰||| |«      \  }}|j                  «        ||fS )ziUses deCasteljau's recursion to split the Bezier curve at t into two
    Bezier curves of the same order.c                 ó|  •— t        |«      dk(  r,| j                  |d   «       |j                  |d   «       | |fS d gt        |«      dz
  z  }| j                  |d   «       |j                  |d   «       t        t        |«      dz
  «      D ]  }d|z
  ||   z  |||dz      z  z   ||<   Œ  ‰| |||«      \  } }| |fS )Nr   r   r2   )r+   Úappendr   )Úbpoints_left_Úbpoints_right_Úbpoints_Út_Ú
new_pointsr3   Úsplit_bezier_recursions         €r   rJ   z,split_bezier.<locals>.split_bezier_recursion~   sÞ   ø€ Üˆx‹=˜AÒØ× Ñ  ¨!¡Ô-Ø×!Ñ! (¨1¡+Ô.ð ˜nÐ,Ð,ð ˜¤ X£°Ñ!2Ñ3ˆJØ× Ñ  ¨!¡Ô-Ø×!Ñ! (¨2¡,Ô/Üœ3˜x›=¨1Ñ,Ö-�Ø!" R¡¨°!©Ñ 4°r¸(À1ÀqÁ5¹/Ñ7IÑ I�
˜1’ð .á,BØ˜~¨z¸2ó-?Ñ)ˆM˜>à˜nÐ,Ð,r   )r5   )r@   r   Úbpoints_leftÚbpoints_rightrJ   s       @r   Úsplit_bezierrM   {   sB   ø€ ô-ð €LØ€Má˜|¨]¸GÀQÓGñ  €L�-à×ÑÔØ˜Ð&Ð&r   c                 ó   — 	 | j                    | j                  d«      S #  Y nxY wt        | «      dk(  r�| d   | d   | d   z   dz  | d   d| d   z  z   | d   z   dz  | d   d| d   z  z   d| d   z  z   | d   z   dz  g| d   d| d   z  z   d| d   z  z   | d   z   dz  | d   d| d   z  z   | d   z   dz  | d   | d   z   dz  | d   gfS t        | d«      S )Nç      à?r0   r   r   r!   r    é   )r)   Úsplitr+   rM   )r'   s    r   Úhalve_bezierrR   ”   s'  € ðØ	�ŠØ�w‰w�s‹|ÐøðÙúô ˆ1ƒv�‚{Ø�1‘˜˜!™˜q ™t™ Q‘¨¨1©°°!°A±$±©¸¸1¹Ñ)=¸qÑ(@Ø�A‘$˜˜1˜Q™4™‘- ! A a¡D¡&Ñ(¨1¨Q©4Ñ/°Ñ2ð4à�A‘$˜˜1˜Q™4™‘- ! A a¡D¡&Ñ(¨1¨Q©4Ñ/°Ñ2Ø�A‘$˜˜1˜Q™4™‘- ! A¡$Ñ&¨Ñ)¨A¨a©D°1°Q±4©K¸©?¸A¸a¹DðBðCð 	Cô
 ˜A˜sÓ#Ð#s   ‚ Ÿ#c                 óF  — ddg}t        | «      dk(  �r| D � cg c]  } | j                  ‘Œ }} |d   d|d   z  z
  d|d   z  z   |d   z
  }t        |«      t        kD  rÖ|d   dz  |d   |d   z   |d   z  z
  |d   dz  z   |d   |d   z
  |d   z  z   }|dk\  rmt	        |«      }|d   d|d   z  z
  |d   z   }||z   |z  }||z
  |z  }d|cxk  rdk  rn n|j                  |«       d|cxk  rdk  rn n|j                  |«       |D �	cg c]  }	t        ||	«      ‘Œ }
}	t        |
«      t        |
«      fS t        d¬«      j                  «       j                  }|t        |«      z  }|D �	cg c]  }	t        ||	«      ‘Œ }
}	t        |
«      t        |
«      fS c c} w c c}	w c c}	w )z9returns the minimum and maximum for any real cubic bezierr   r   r0   r    r!   T©r7   )r+   r   Úabsr   r	   rD   r.   ÚminÚmaxr9   Úderivr8   r   )r'   Úlocal_extremizersÚaÚdenomÚdeltaÚsqdeltaÚtauÚr1Úr2r   Úlocal_extremaÚdcoeffss               r   Úbezier_real_minmaxrc   ©   sÔ  € à˜A˜ÐÜ
ˆ1ƒv�ƒ{ÙÓ™Q˜ˆQ�V‹V˜QˆÐØ�!‘�q˜˜1™‘v‘  ! A¡$¡Ñ&¨¨1©Ñ-ˆÜˆu‹:œÒ%Ø�a‘D˜!‘G˜q ™t a¨¡d™{¨A¨a©DÑ0Ñ0°1°Q±4¸±7Ñ:¸aÀ¹dÀQÀqÁT¹kÈ1ÈQÉ4Ñ=OÑOˆEØ˜ŠzÜ˜u›+�Ø˜‘d˜Q˜q ™t™V‘m a¨¡dÑ*�Ø˜G‘m UÑ*�Ø˜G‘m UÑ*�Ø�r”:˜A•:Ø%×,Ñ,¨RÔ0Ø�r”:˜A•:Ø%×,Ñ,¨RÔ0Ù9JÓKÑ9J°Aœ\¨!¨QÕ/Ð9JˆMÐKÜ�}Ó%¤s¨=Ó'9Ð9Ð9ô   °Ô6×<Ñ<Ó>×EÑE€Gð œ WÓ-Ñ-ÐÙ1BÓCÑ1B¨A”\ ! QÕ'Ð1B€MÐCÜˆ}Óœs =Ó1Ð1Ð1ùò-  ùò Lùò Ds   ˜FÄFÅ)Fc                 ó¸  — 	 | j                   }| j                  «       S #  Y nxY wt        | «      dk(  r^t        | D �cg c]  }|j                  ‘Œ nc c}w c}«      \  }}t        | D �cg c]  }|j
                  ‘Œ nc c}w c}«      \  }}||||fS t        | d¬«      }t	        |«      }t        |«      }	|j                  «       }
|	j                  «       }ddgt        |
dd„ ¬«      z   }ddgt        |dd„ ¬«      z   }|D �cg c]
  } ||«      ‘Œ nc c}w }}|D �cg c]
  } |	|«      ‘Œ nc c}w }}t        |«      t        |«      t        |«      t        |«      fS )	zšreturns the bounding box for the segment in the form
    (xmin, xmax, ymin, ymax).
    Warning: For the non-cubic case this is not particularly efficient.r0   TrT   r   r   c                 ó"   — d| cxk  xr dk  S c S ©Nr   r   r$   ©Úrs    r   Ú<lambda>z%bezier_bounding_box.<locals>.<lambda>Ý   ó   € ¸¸A¾	À½	r   )Ú	realrootsÚ	conditionc                 ó"   — d| cxk  xr dk  S c S rf   r$   rg   s    r   ri   z%bezier_bounding_box.<locals>.<lambda>ß   rj   r   )r)   Úbboxr+   rc   r   r   r9   rX   r   rV   rW   )ÚbezÚblar'   ÚxminÚxmaxÚyminÚymaxr=   ÚxÚyÚdxÚdyÚx_extremizersÚy_extremizersr   Ú	x_extremaÚ	y_extremas                    r   Úbezier_bounding_boxr}   Æ   sI  € ðØ�m‰mˆØ�x‰x‹zÐøðÙúô ˆ3ƒx�1‚}Ü'¹Ó(=¹°A¨¯«¹ùÔ(=Ó>‰
ˆˆdÜ'¹Ó(=¹°A¨¯«¹ùÔ(=Ó>‰
ˆˆdØ�T˜4 Ð%Ð%Ü˜S°Ô5€DÜˆT‹
€AÜˆT‹
€AØ	
�‰‹€BØ	
�‰‹€BØ˜�FœY r°TÙ.AôCñ C€Mà˜�FœY r°TÙ.AôCñ C€Má,Ó-™}˜!‘�1•™}ùÒ-€IÐ-Ù,Ó-™}˜!‘�1•™}ùÒ-€IÐ-Üˆy‹>œ3˜y›>¬3¨y«>¼3¸y»>ÐIÐIs   ‚ ž"¼AÁ(A<Ä DÄD+c                 ó   — || z
  ||z
  z  S )zP
    INPUT: 2-tuple of cubics (given by control points)
    OUTPUT: boolean
    r$   )rq   rr   rs   rt   s       r   Úbox_arear   å   s   € ð
 �4‰K˜$ ™+Ñ&Ð&r   c                 óH   — t        dt        ||«      t        | |«      z
  «      S )zreturns the width of the intersection of intervals [a,b] and [c,d]
    (thinking of these as intervals on the real number line)r   )rW   rV   )rZ   Úbr>   Úds       r   Úinterval_intersection_widthrƒ   í   s"   € ô ˆq”#�a˜“)œc ! Q›iÑ'Ó(Ð(r   c                 óZ   — | \  }}}}|\  }}}}	t        ||||«      rt        ||||	«      ryy)z`Determines if two rectangles, each input as a tuple
        (xmin, xmax, ymin, ymax), intersect.TF)rƒ   )
Úbox1Úbox2Úxmin1Úxmax1Úymin1Úymax1Úxmin2Úxmax2Úymin2Úymax2s
             r   Úboxes_intersectr�   ó   sB   € ð "&Ñ€Eˆ5�%˜Ø!%Ñ€Eˆ5�%˜Ü" 5¨%°¸Ô>Ü'¨¨u°e¸UÔCØàr   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚApproxSolutionSetzkA class that behaves like a set but treats two elements , x and y, as
    equivalent if abs(x-y) < self.tolc                 ó   — || _         y r   )Útol)Úselfr“   s     r   Ú__init__zApproxSolutionSet.__init__  s	   € Øˆ�r   c                 óL   — | D ]  }t        ||z
  «      | j                  k  sŒ y y)NTF)rU   r“   )r”   ru   rv   s      r   Ú__contains__zApproxSolutionSet.__contains__  s(   € ÛˆAÜ�1�q‘5‹z˜DŸH™HÓ$Ùð ð r   c                 ó0   — || vr| j                  |«       y y r   )rD   )r”   Úpts     r   ÚappaddzApproxSolutionSet.appadd  s   € Ø�T‰>Ø�K‰K˜�Oð r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r•   r—   rš   r$   r   r   r‘   r‘     s   „ ñ)òòór   r‘   c                   ó   — e Zd Zd„ Zy)ÚBPairc                 ó<   — || _         || _        || _        || _        y r   )Úbez1Úbez2r   Út2)r”   r¢   r£   r   r¤   s        r   r•   zBPair.__init__  s   € ØˆŒ	ØˆŒ	ØˆŒØˆ�r   N)r›   rœ   r�   r•   r$   r   r   r    r      s   „ ór   r    c                 óž  — t        t        dt        ||z  «      t        d«      z  z
  «      «      }t        | |dd«      g}g }d}t	        |«      }	|�rì||k  �ræg }
d|dz   z  }|D �]Æ  }t        |j                  «      }t        |j                  «      }t        ||«      sŒ;t        |Ž |k  rÜt        |Ž |k  rÑt        | |j                  «      }||	vr8|	j                  |«       |j                  |j                  |j                  f«       |D ]x  }|j                  |j                  k(  sL|j                  |j                  k(  s3|j                  |j                  k(  s|j                  |j                  k(  sŒh|j                  |«       Œz �Œ"t        |j                  «      \  }}|j                  |z
  |j                  |z   }}t        |j                  «      \  }}|j                  |z
  |j                  |z   }}|
t        ||||«      t        ||||«      t        ||||«      t        ||||«      gz  }
�ŒÉ |
}|dz  }|r||k  r�Œæ||k\  rt!        d«      ‚|S )a‡  INPUT:
    bez1, bez2 = [P0,P1,P2,...PN], [Q0,Q1,Q2,...,PN] defining the two
    Bezier curves to check for intersections between.
    longer_length - the length (or an upper bound) on the longer of the two
    Bezier curves.  Determines the maximum iterations needed together with tol.
    tol - is the smallest distance that two solutions can differ by and still
    be considered distinct solutions.
    OUTPUT: a list of tuples (t,s) in [0,1]x[0,1] such that
        abs(bezier_point(bez1[0],t) - bezier_point(bez2[1],s)) < tol_deC
    Note: This will return exactly one such tuple for each intersection
    (assuming tol_deC is small enough).r   r!   rO   r   z¨bezier_intersections has reached maximum iterations without terminating... either there's a problem/bug or you can fix by raising the max iterations or lowering tol_deC)Úintr   r   r    r‘   r}   r¢   r£   r�   r   r.   r   rD   r¤   ÚremoverR   Ú	Exception)r¢   r£   Úlonger_lengthr“   Útol_deCÚmaxitsÚ	pair_listÚintersection_listr   Úapprox_point_setÚ	new_pairsr\   ÚpairÚbbox1Úbbox2r*   Ú	otherPairÚc11Úc12Út11Út12Úc21Úc22Út21Út22s                            r   Úbezier_intersectionsr¼     s4  € ô ”�aœ˜G MÑ1Ó2´3°q³6Ñ9Ñ9Ó:Ó;€FÜ�t˜T 3¨Ó,Ð-€IØÐØ	€AÜ(¨Ó-ÐÚ
˜˜F›
Øˆ	Ø�a˜!‘e‘ˆÜˆDÜ'¨¯	©	Ó2ˆEÜ'¨¯	©	Ó2ˆEÜ˜u eÕ,Ü˜UÐ# gÒ-´(¸EÐ2BÀWÒ2LÜ(¨¨t¯w©wÓ7�EØÐ$4Ñ4Ø(×/Ñ/°Ô6à)×0Ñ0°$·'±'¸4¿7¹7Ð1CÔDó &/˜	ØŸ9™9¨	¯©Ò6Ø $§	¡	¨Y¯^©^Ò ;Ø $§	¡	¨Y¯^©^Ò ;Ø $§	¡	¨Y¯^©^Ó ;Ø%×,Ñ,¨YÕ7ò &/ô ".¨d¯i©iÓ!8‘J�S˜#Ø"&§'¡'¨E¡/°4·7±7¸U±?˜#�SÜ!-¨d¯i©iÓ!8‘J�S˜#Ø"&§'¡'¨E¡/°4·7±7¸U±?˜#�SØ¤%¨¨S°#°sÓ";Ü"'¨¨S°#°sÓ";Ü"'¨¨S°#°sÓ";Ü"'¨¨S°#°sÓ";ð"=ñ =’Ið/ ð6 ˆ	Ø	ˆQ‰ˆñ? ˜˜Fœ
ð@ 	ˆF‚{Üð Ió Jð 	Jð Ðr   c                 ó^  ‡ — t        |dd «      dk(  sJ ‚|d   |d   k7  sJ ‚t        ˆ fd„‰ D «       «      st        d«      ‚‰ D �cg c]
  }||d   z
  ‘Œ }}|d   |d   z
  }t        |«      }||z  }|D �cg c]  }||z  ‘Œ	 }}|D �cg c]  }|j                  ‘Œ }	}t        |	«      }
t        t        |
«      «      }|D �cg c]  }|j                  ‘Œ }}g }t        |«      D ]5  }t        ||«      }d|cxk  r|k  sŒn Œ||z  }|j                  ||f«       Œ7 |S c c}w c c}w c c}w c c}w )zDReturns tuples (t1,t2) such that bezier.point(t1) ~= line.point(t2).Nr!   r   r   c              3   ó.   •K  — | ]  }|‰d    k7  –— Œ y­w)r   Nr$   )r%   r'   Úbeziers     €r   r(   z/bezier_by_line_intersections.<locals>.<genexpr>\  s   øè ø€ Ð.¡v !ˆq�F˜1‘I�~¡vùs   ƒzdbezier is nodal, use bezier_by_line_intersection(bezier[0], line) instead for a bool to be returned.)r+   ÚanyÚ
ValueErrorrU   r   r9   Úlistr   r   Úsetr.   rD   )r¿   ÚlineÚzÚshifted_bezierÚshifted_line_endÚline_lengthÚrotation_matrixÚtransformed_bezierr'   Útransformed_bezier_imagÚcoeffs_yÚroots_yÚtransformed_bezier_realr­   Úbez_tÚxvalÚline_ts   `                r   Úbezier_by_line_intersectionsrÒ   S  sp  ø€ ô ˆt‘Aˆw‹<˜1ÒÐÐØ�‰7�d˜1‘gÒÐÐÜÓ.¡vÓ.Ô.Üð >ó ?ð 	?ñ
 ,2Ó2©6 a�a˜$˜q™'“k¨6€NÐ2Ø˜A‘w  a¡Ñ(ÐÜÐ&Ó'€Kð "Ð"2Ñ2€OÙ5CÓD±^°˜/¨!Ó+°^ÐÐDñ 0BÓBÑ/A¨!˜qŸv›vÐ/AÐÐBÜ Ð!8Ó9€HÜ”;˜xÓ(Ó)€Gá/AÓBÑ/A¨!˜qŸv›vÐ/AÐÐBØÐÜ�W–ˆÜÐ3°UÓ;ˆØ�Ô#˜Ö#Ø˜+Ñ%ˆFØ×$Ñ$ e¨V _Õ5ð	 ð
 Ðùò+ 3ùò Eùò Cùò Cs   ÁDÁ5D ÂD%Â?D*N)TF)ç:Œ0âŽyE>rÓ   )&rž   Ú
__future__r   r   r   Úmathr   r   r   r   r	   Únumpyr
   Ú	polytoolsr   r   r   r   Ú	constantsr   r   r   r.   r9   rA   rM   rR   rc   r}   r   rƒ   r�   rÂ   r‘   Úobjectr    r¼   rÒ   r$   r   r   Ú<module>rÚ      sŠ   ðñ2÷ AÑ @ß 2Ó 2Ý ÷ :Ó 9Ý $ò
$òEò7óF òFò0'ò2$ò*2ò:Jò>'ò)ò	ô˜ô ô"ˆFô ó6ór$r   