
    h                    f    S SK Jr  S SKJr  S SKJr  S SKJrJr  S/r	S
S jr
SS jr " S S5      rg	)    )annotations)Iterable)Vec3)global_bspline_interpolationBSplineEulerSpiralc                    US:  d   S5       eSU /nU n[        US-
  5       H  nX0-  nUR                  U5        M     U$ )N   zrequires count > 2      ?)rangeappend)basecountvalues
next_value_s        H/var/www/html/env/lib/python3.13/site-packages/ezdxf/math/eulerspiral.pypowersr      sP    19***94[FJ519
j!  M    c              #  r   #    [        U 5      [        U5      -  n[        SUS-   5       H	  nX#-  v   M     g 7f)Nr      )floatr   )lengthsegmentsdelta_lindexs       r   _paramsr      s4     FmeHo-Gq(Q,'o (s   57c                      \ rS rSrSrSSS jjrSS jrSS jrSS jrSS jr	SS jr
SS	 jr   S         SS
 jjrSrg)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                V    [        U5      nXl        [        US5      U l        0 U l        g )N   )r   	curvaturer   curvature_powers_cache)selfr"   s     r   __init__EulerSpiral.__init__'   s'    )$	"-3Ir-B)+r   c                4    US:  a  U R                   S   U-  $ g)z%Get radius of circle at distance `t`.g        r
   r#   )r%   ts     r   radiusEulerSpiral.radius-   s"    s7((+a//r   c                ^    US-  SU R                   S   -  -  n[        R                  " U5      $ )z4Get tangent at distance `t` as :class:`Vec3` object.r
   g       @)r#   r   
from_angle)r%   r*   angles      r   tangentEulerSpiral.tangent4   s/    Q# 5 5a 889u%%r   c                8    U R                   S   [        U5      -  $ )z(Get distance L from origin for `radius`.r
   )r#   r   )r%   r+   s     r   distanceEulerSpiral.distance9   s    $$Q'%-77r   c                J  ^ ^ U U4S jnTT R                   ;  a|  U" SSS5      U" SSS5      -
  U" SS	S
5      -   U" SSS5      -
  U" SSS5      -   nTU" SSS5      -
  U" SSS5      -   U" SSS5      -
  U" SSS5      -   n[        XC5      T R                   T'   T R                   T   $ )z+Get point at distance `t` as :class:`Vec3`.c                4   > TU -  UTR                   U   -  -  $ )Nr)   )length_powercurvature_powerconstr%   r*   s      r   termEulerSpiral.point.<locals>.term@   s(    $--o>> r      r
   g      @      g      u@   
   g     @      g     ubAr!      g     MA      g      D@	      g      @      g     H"A      g     A)r$   r   )r%   r*   r:   yxs   ``   r   pointEulerSpiral.point=   s    	
 DKKQ3q!U#$r2w'( r2y)* r2|,	-  q!T"#q!V$% r2x() r2{+	,  "!ZDKKN{{1~r   c              #  V   #    [        X5       H  nU R                  U5      v   M     g7f)ziApproximate curve of length with line segments.
Generates segments+1 vertices as :class:`Vec3` objects.

N)r   rN   )r%   r   r   r*   s       r   approximateEulerSpiral.approximateW   s$     
 *A**Q- +s   ')c                    U R                  U5      nU R                  U5      nX R                  U5      R                  U5      R	                  5       -   $ )z"Get circle center at distance `t`.)rN   r+   r0   	normalize
orthogonal)r%   r*   prs       r   circle_centerEulerSpiral.circle_center_   sA    JJqMKKN<<?,,Q/::<<<r   c           	     f   [        U5      n[        U R                  XS95      n[        X5       Vs/ s H#  nU R	                  U5      R                  U5      PM%     nn[        XSXGS9n[        UR                  UR                  UR                  5        V	s/ s H  oU-  PM	     sn	5      $ s  snf s  sn	f )zApproximate 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   listrQ   r   r0   rT   r   r   control_pointsorderknots)
r%   r   r   degreer[   
fit_pointsr*   derivativessplinevs
             r   bsplineEulerSpiral.bsplinee   s    & v$**6*EF

 V.	
 / LLO%%f-.	 	 
 .v
 !!LL!'0AZ0	
 	

 1s   *B)B.)r$   r"   r#   N)r   )r"   r   )r*   r   returnr   )r*   r   rh   r   )r+   r   rh   r   )r   r   r   intrh   zIterable[Vec3])r@   r<   uniform)
r   r   r   ri   ra   ri   r[   strrh   r   )__name__
__module____qualname____firstlineno____doc__r&   r+   r0   r3   rN   rQ   rX   rf   __static_attributes__ r   r   r   r      so    	,&
84 = #
#
 #
 	#

 #
 
#
 #
r   N)r   r   r   ri   rh   zlist[float])r   r   r   ri   rh   zIterable[float])
__future__r   typingr   
ezdxf.mathr   ezdxf.math.bspliner   r   __all__r   r   r   rr   r   r   <module>rx      s0    #   D/m
 m
r   