Ë
    £èh6  ã                  ób   — d dl mZ d dlmZ d dlmZ d dlmZmZ dgZ	d
d„Z
dd„Z G d„ d«      Zy	)é    )Úannotations)ÚIterable)ÚVec3)Úglobal_bspline_interpolationÚBSplineÚEulerSpiralc                ó|   — |dkD  sJ d«       ‚d| g}| }t        |dz
  «      D ]  }|| z  }|j                  |«       Œ |S )Né   zrequires count > 2ç      ð?)ÚrangeÚappend)ÚbaseÚcountÚvaluesÚ
next_valueÚ_s        ú6lib/python3.12/site-packages/ezdxf/math/eulerspiral.pyÚpowersr      sR   € Ø�1Š9Ð*Ð*Ó*ˆ9Ø�4ˆ[€FØ€JÜ�5˜1‘9ÖˆØ�dÑˆ
Ø�‰�jÕ!ð ð €Mó    c              #  óp   K  — t        | «      t        |«      z  }t        d|dz   «      D ]	  }||z  –— Œ y ­w)Nr   é   )Úfloatr   )ÚlengthÚsegmentsÚdelta_lÚindexs       r   Ú_paramsr      s7   è ø€ Ü�F‹mœe H›oÑ-€GÜ�q˜( Q™,Ö'ˆØ˜‰oÓñ (ùs   ‚46c                  ól   — e Zd Z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d	„Zy
)r   zé
    This class represents an euler spiral (clothoid) for `curvature` (Radius of
    curvature).

    This is a parametric curve, which always starts at the origin = ``(0, 0)``.

    Args:
        curvature: radius of curvature

    c                óX   — t        |«      }|| _        t        |d«      | _        i | _        y )Né   )r   Ú	curvaturer   Úcurvature_powersÚ_cache)Úselfr!   s     r   Ú__init__zEulerSpiral.__init__'   s)   € Ü˜)Ó$ˆ	Ø"ˆŒÜ-3°I¸rÓ-BˆÔØ)+ˆ�r   c                ó2   — |dkD  r| j                   d   |z  S y)z%Get radius of circle at distance `t`.g        r
   ©r"   )r$   Úts     r   ÚradiuszEulerSpiral.radius-   s"   € àˆsŠ7Ø×(Ñ(¨Ñ+¨aÑ/Ð/àr   c                ó\   — |dz  d| j                   d   z  z  }t        j                  |«      S )z4Get tangent at distance `t` as :class:`Vec3` object.r
   g       @)r"   r   Ú
from_angle)r$   r(   Úangles      r   ÚtangentzEulerSpiral.tangent4   s/   € à�Q‘˜# × 5Ñ 5°aÑ 8Ñ8Ñ9ˆÜ�‰˜uÓ%Ð%r   c                ó8   — | j                   d   t        |«      z  S )z(Get distance L from origin for `radius`.r
   )r"   r   )r$   r)   s     r   ÚdistancezEulerSpiral.distance9   s   € à×$Ñ$ QÑ'¬%°«-Ñ7Ð7r   c                óF  ‡ ‡— ˆ ˆfd„}‰‰ j                   vr} |ddd«       |ddd«      z
   |dd	d
«      z    |ddd«      z
   |ddd«      z   }‰ |ddd«      z
   |ddd«      z    |ddd«      z
   |ddd«      z   }t        ||«      ‰ j                   ‰<   ‰ j                   ‰   S )z+Get point at distance `t` as :class:`Vec3`.c                ó4   •— ‰| z  |‰j                   |   z  z  S )Nr'   )Úlength_powerÚcurvature_powerÚconstr$   r(   s      €€r   ÚtermzEulerSpiral.point.<locals>.term@   s(   ø€ Ø˜Ñ$Ø˜×-Ñ-¨oÑ>Ñ>ñð r   é   r
   g      @é   é   g      u@é   é
   g      ä@é   é   g     ubAr    é   g     MêAé   é   g      D@é	   é   g      «@é   é   g     H"Aé   é   g     ë¤A)r#   r   )r$   r(   r5   ÚyÚxs   ``   r   ÚpointzEulerSpiral.point=   sã   ù€ õ	ð
 �D—K‘KÑá�Q˜˜3“Ù�q˜!˜UÓ#ñ$á�r˜2˜wÓ'ñ(ñ �r˜2˜yÓ)ñ*ñ �r˜2˜|Ó,ñ	-ð ð Ù�q˜!˜TÓ"ñ#á�q˜!˜VÓ$ñ%ñ �r˜2˜xÓ(ñ)ñ �r˜2˜{Ó+ñ	,ð ô " ! Q›ZˆD�K‰K˜‰NØ�{‰{˜1‰~Ðr   c              #  óT   K  — t        ||«      D ]  }| j                  |«      –— Œ y­w)zyApproximate curve of length with line segments.
        Generates segments+1 vertices as :class:`Vec3` objects.

        N)r   rH   )r$   r   r   r(   s       r   ÚapproximatezEulerSpiral.approximateW   s'   è ø€ ô
 ˜ Ö*ˆAØ—*‘*˜Q“-Óñ +ùs   ‚&(c                ó¨   — | j                  |«      }| j                  |«      }|| j                  |«      j                  |«      j	                  «       z   S )z"Get circle center at distance `t`.)rH   r)   r-   Ú	normalizeÚ
orthogonal)r$   r(   ÚpÚrs       r   Úcircle_centerzEulerSpiral.circle_center_   sC   € à�J‰J�q‹MˆØ�K‰K˜‹NˆØ�4—<‘< “?×,Ñ,¨QÓ/×:Ñ:Ó<Ñ<Ð<r   c           	     óp  — t        |«      }t        | j                  ||¬«      «      }t        ||«      D �cg c]"  }| j	                  |«      j                  |«      ‘Œ$ }}t        ||||¬«      }t        |j                  |j                  |j                  «       D �	cg c]  }	|	|z  ‘Œ	 c}	«      S c c}w c c}	w )a?  Approximate euler spiral as B-spline.

        Args:
            length: length of euler spiral
            segments: count of fit points for B-spline calculation
            degree: degree of BSpline
            method: calculation method for parameter vector t

        Returns:
            :class:`BSpline`

        )r   )ÚmethodÚtangents)r   ÚlistrJ   r   r-   rL   r   r   Úcontrol_pointsÚorderÚknots)
r$   r   r   ÚdegreerR   Ú
fit_pointsr(   ÚderivativesÚsplineÚvs
             r   ÚbsplinezEulerSpiral.bsplinee   s¿   € ô& �v“ˆÜ˜$×*Ñ*¨6¸HÐ*ÓEÓFˆ
ô
 ˜V XÔ.ó	
ñ /�ð �L‰L˜‹O×%Ñ% fÕ-Ø.ð	 	ð 
ô .Ø˜ v¸ô
ˆô Ø×!Ñ!Ø�L‰Là!'§¡¤Ó0¡˜AˆQ�‹Z Ñ0ó	
ð 	
ùò
ùò 1s   ¶'B.ÂB3N)r   )r!   r   )r(   r   Úreturnr   )r(   r   r^   r   )r)   r   r^   r   )r   r   r   Úintr^   zIterable[Vec3])r:   r6   Úuniform)
r   r   r   r_   rX   r_   rR   Ústrr^   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   r)   r-   r/   rH   rJ   rP   r]   © r   r   r   r      sj   „ ñ	ô,óó&ó
8óó4 ó=ð ØØð#
àð#
ð ð#
ð ð	#
ð
 ð#
ð 
ô#
r   N)r   r   r   r_   r^   zlist[float])r   r   r   r_   r^   zIterable[float])Ú
__future__r   Útypingr   Ú
ezdxf.mathr   Úezdxf.math.bspliner   r   Ú__all__r   r   r   rf   r   r   Ú<module>rl      s0   ðõ #Ý Ý ß Dàˆ/€óó÷m
ò m
r   