
    Og                       d dl mZ d dlmZmZ d dlZd dlmZ ddlm	Z	m
Z
 ddlmZ g 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	 d 	 	 	 	 	 d!dZ	 d"	 	 	 	 	 d#dZ	 d$	 	 	 	 	 d%dZ	 d&	 	 	 d'dZd(dZ	 d&	 	 	 d'dZd)dZy)*    )annotations)IterableSequenceN)Vec3   )#tangents_cubic_bezier_interpolationcubic_bezier_interpolation)circle_radius_3p)estimate_tangentsestimate_end_tangent_magnitudecreate_t_vectorchord_lengthc                    |dk(  rt        t        |             S |dv rt        |       S |dv rt        |       S |dk(  rt	        |       S t        dj                  |            )Nuniform)distancechord)centripetal
sqrt_chordarczUnknown method: {})uniform_t_vectorlendistance_t_vectorcentripetal_t_vectorarc_t_vector
ValueErrorformat)
fit_pointsmethods     [/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/math/parametrize.pyr   r      sj    J00	(	( ,,	0	0#J//	5J''-44V<==    c                `    t        | dz
        }t        |       D cg c]  }||z  	 c}S c c}w Nr   )floatrange)lengthnts      r   r   r   "   s,    fqjA =)aAE)))s   +c                <    t        t        t        |                   S N)_normalize_distanceslistlinear_distances)r   s    r   r   r   '   s    %5j%A BCCr    c           	         t        | | dd        D cg c])  \  }}t        j                  |j                  |            + }}}t	        |      S c c}}w r"   )zipmathsqrtr   r*   )r   p1p2	distancess       r   r   r   +   sP    14ZAB1P'-r2		"++b/"I   	**s   .Ac                    t        |       }t        |      dk  rg S dg}d}| d d D ]  }||z  }|j                  ||z          |j                  d       |S )Ng-q=              ?)sumabsappend)r3   total_lengthparamssds        r   r*   r*   2   sk    y>L
<E!	%FAs^ (	Qa,&'( MM#Mr    c              #  R   K   d }| D ]  }||}|j                  |       |} y wr)   r   )pointsprevps      r   r,   r,   ?   s;     D <DmmAs   %'c                *    t        t        |             S r)   )r8   r,   )rA   s    r   r   r   I   s    '((r    c                @    t        t        |             }t        |      S r)   )r+   arc_distancesr*   )r   r3   s     r   r   r   M   s    ]:./I	**r    c              #  t  K   | dfd}t         |             }t        |      dk(  ry |j                  |d          t        dt              dz
        D ]]  }|dz      |   z
  j                  }||   }t        j                  |d      r| ;t        j                  |dz  |z        dz  |z   _ y w)Nc               3     K   t        t              dz
        D ]#  } 	 t        |    | dz      | dz            }| % y # t        $ r d}Y w xY ww)N   r   r5   )r$   r   r
   ZeroDivisionError)iradiusrC   s     r   _radiizarc_distances.<locals>._radiiU   sf     s1vz" 	A)!A$!a%!AE(C L	 % s'   AAAAAAAr   r6   r          @)returnIterable[float])r+   r   r:   r$   	magnituder/   iscloseasin)r   rM   rkr   rkrC   s         @r   rF   rF   R   s     A &(^A
1v{HHQrUO1c!fqj! <a!eHqtO..qT<<AN))HsNR/036;;<s   B5B8c                .   |j                         }|j                  d      rt        | |      S |j                  d      rt        | |      S |j                  d      rt	        | |      S |j                  d      rt        | |      S t        d|       )aB  Estimate tangents for curve defined by given fit points.
    Calculated tangents are normalized (unit-vectors).

    Available tangent estimation methods:

        - "3-points": 3 point interpolation
        - "5-points": 5 point interpolation
        - "bezier": tangents from an interpolated cubic bezier curve
        - "diff": finite difference

    Args:
        points: start-, end- and passing points of curve
        method: tangent estimation method
        normalize: normalize tangents if ``True``

    Returns:
        tangents as list of :class:`Vec3` objects

    bez	normalizez3-pz5-pdifzUnknown method: )lower
startswithr   tangents_3_point_interpolationtangents_5_point_interpolationfinite_difference_interpolationr   )rA   r   rZ   s      r   r   r   j   s    , \\^F26YOO			5	!-f	JJ			5	!-f	JJ			5	!.vKK+F8455r    c           	     ^   |dk(  r#t        d t        | | dd       D              }||fS |dk(  rt        t        |             }||fS |j                  d      rJt	        |dd       }d}t        |       D ](  }|t        t        |j                  |                  z  }* ||fS t        d	|       )
a  Estimate tangent magnitude of start- and end tangents.

    Available estimation methods:

        - "chord": total chord length, curve approximation by straight segments
        - "arc": total arc length, curve approximation by arcs
        - "bezier-n": total length from cubic bezier curve approximation, n
          segments per section

    Args:
        points: start-, end- and passing points of curve
        method: tangent magnitude estimation method

    r   c              3  D   K   | ]  \  }}|j                  |        y wr)   r@   ).0p0r1   s      r   	<genexpr>z1estimate_end_tangent_magnitude.<locals>.<genexpr>   s     Qvr22;;r?Qs    r   Nr   zbezier-   r5   z.Unknown tangent magnitude calculation method: )	r8   r.   rF   r]   intr	   r,   approximater   )rA   r   r;   countr=   curves         r   r   r      s    " QVVABZ9PQQ\))	5=01\))			9	%F12J/7 	AE%e&7&7&>?@@A	A!tI&RSSr    c           
        t        | | dd       D cg c]
  \  }}||z
   }}}t        t        | |            }t        ||dd       D cg c]
  \  }}||z
   }	}}t        ||	      D 
cg c]
  \  }
}|
|z   }}
}t        |	|	dd       D cg c]  \  }}|||z   z   }}}t               g}|j	                  t        t        |      dz
        D cg c]  }d||   z
  ||   z  ||   ||dz      z  z   ! c}       d|d   z  |d   z
  |d<   |j                  d|d   z  |d   z
         |r|D cg c]  }|j                          }}|S c c}}w c c}}w c c}}
w c c}}w c c}w c c}w )zTReturns from 3 points interpolated and optional normalized tangent
    vectors.
    r   Nr7   rN   r   r6   )	r.   r+   r   r   extendr$   r   r:   rZ   )r   r   rZ   Q0Q1qr'   t0t1delta_tqkdtkr>   dt0dt1alphatangentsrU   vs                      r   r^   r^      s}     #:z!"~>?VRb?A?_Z01A%(AabE]362rrBw3G3!$Q1gb#c1A1/27GABK/HI83SC#IIEI F8HOO@Ec!fqj@QR1#a.AaD	 58aAh#6	6R !*x{*HQKOOC!B%K(2,./+34aAKKM44O 	@31I 	S
 5s#   EE-EE!$E'4E,c                   t        |       }t        |       }t               }t        |      D ]d  }||dz
     j	                  ||         j
                  }||dz      j	                  ||dz            j
                  }|j                  |||z   z         f g }t        |      D ]0  }d||   z
  ||   z  ||   ||dz      z  z   }	|j                  |	       2 |r|D 
cg c]  }
|
j                          }}
|S c c}
w )zTReturns from 5 points interpolated and optional normalized tangent
    vectors.
    r   rI   r7   )r   _delta_qr+   r$   crossrQ   r:   rZ   )r   rZ   r&   ro   rw   rU   v1v2rx   vkry   s              r   r_   r_      s    	JAAFE1X %AhnnQqT"--AhnnQq1uX&11R27^$%
 H1X E!Hn!$uQx!AE(':: +34aAKKM44O 5s   C4c                   t        |       }t               g}|j                  t        |dz
        D cg c]  }| |dz      | |   z
   c}       d|d   z  |d   z
  |d<   |j	                  d||dz
     z  ||dz
     z
         |j	                  d||   z  ||dz
     z
         |j	                  d|d   z  |d   z
         |S c c}w )Nr   rN   rI   r   )r   r   rl   r$   r:   )rA   r&   ro   rU   s       r   r{   r{      s    FA	AHHq1u>AfQUmfQi'>?1:!AaDHHS1QU8^aAh&'HHS1Q4Z!AE("#HHS1Q4Z!A$H ?s   Cc                L   d}| }|d   |d   z
  |z  g}t        dt        |       dz
        D ]4  }|j                  ||   ||dz
     z
  |z  ||dz      ||   z
  |z  z          6 |j                  |d   |d   z
  |z         |r|D cg c]  }|j                          }}|S c c}w )NrN   r   r   r6   )r$   r   r:   rZ   )r   rZ   frC   r'   rU   ry   s          r   r`   r`      s     	AA
A$1+	A1c*o)* @	!A$1q5/Q&!AE(QqT/Q)>>?@HHaeaemq !$%&qQ[[]&&H 's   B!c           	         fd} || d   | d         g}t        dt        |       dz
        D ]&  }|j                   || |dz      | |dz
                  ( |j                   || d   | d                |S )Nc                2    | |z
  j                  dz
        S )Nr7   rY   )rd   r1   tensions     r   tangentz'cardinal_interpolation.<locals>.tangent   s    R""3=11r    r   r   r6   r   )r$   r   r:   )r   r   r   r'   rU   s    `   r   cardinal_interpolationr      s    2 
A
1	./A1c*o)* @	AE*Jq1u,=>?@HHWZ^Z^45Hr    )r   
list[Vec3]r   strrO   list[float])r%   rg   rO   r   )r   r   rO   r   )r3   zSequence[float]rO   r   )rA   Iterable[Vec3]rO   rP   )rA   r   rO   r#   )r   r   rO   rP   )z5-pointsT)rA   r   r   r   rO   r   )r   )rA   r   r   r   rO   ztuple[float, float])r   T)r   r   r   r   rO   r   )T)r   r   rO   r   )rA   r   rO   r   )r   r   r   r#   rO   r   )
__future__r   typingr   r   r/   
ezdxf.mathr   bezier_interpolationr   r	   construct2dr
   __all__r   r   r   r   r*   r,   r   r   rF   r   r   r^   r_   r{   r`   r    r    r   <module>r      s    # %   *
>*
D+
)+
<2 =A 6 6 # 6 6H '.TT #TTD >B$'. '+0 '+	r    