
    'j                        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d0dZd1dZd.dZd2dZ	 d3d4d"Z	 d5d6d%Z	 d7d8d&Z	 d9d:d'Zd;d(Z	 d9d:d)Zd<d+ZdS )=    )annotations)IterableSequenceN)Vec3   )#tangents_cubic_bezier_interpolationcubic_bezier_interpolation)circle_radius_3p)estimate_tangentsestimate_end_tangent_magnitudecreate_t_vectorchord_length
fit_points
list[Vec3]methodstrreturnlist[float]c                    |dk    rt          t          |                     S |dv rt          |           S |dv rt          |           S |dk    rt	          |           S t          d                    |                    )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)r   r   s     P/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/math/parametrize.pyr   r      s    J000	(	(	( ,,,	0	0	0#J///	5J'''-44V<<===    lengthintc                ^    t          | dz
            fdt          |           D             S )Nr   c                    g | ]}|z  S  r)   ).0tns     r#   
<listcomp>z$uniform_t_vector.<locals>.<listcomp>$   s    )))aAE)))r$   )floatrange)r%   r,   s    @r#   r   r   "   s4    fqjA))))5==))))r$   c                T    t          t          t          |                               S N)_normalize_distanceslistlinear_distances)r   s    r#   r   r   '   s!    %5j%A%A B BCCCr$   c                d    d t          | | dd                    D             }t          |          S )Nc                b    g | ],\  }}t          j        |                    |                    -S r)   )mathsqrtr   )r*   p1p2s      r#   r-   z(centripetal_t_vector.<locals>.<listcomp>,   s=       '-r2	"++b//""  r$   r   )zipr2   r   	distancess     r#   r   r   +   sB     14ZABB1P1P  I  	***r$   r=   Sequence[float]c                    t          |           }t          |          dk    rg S dg}d}| d d         D ]}||z  }|                    ||z              |                    d           |S )Ng-q=              ?)sumabsappend)r=   total_lengthparamssds        r#   r2   r2   2   s    y>>L
<E!!	%FAss^ ( (	Qa,&''''
MM#Mr$   pointsIterable[Vec3]Iterable[float]c              #  T   K   d }| D ] }||}|                     |          V  |}!d S r1   r   )rJ   prevps      r#   r4   r4   ?   sP      D  <DmmA r$   r.   c                :    t          t          |                     S r1   )rC   r4   )rJ   s    r#   r   r   I   s    ''(((r$   c                X    t          t          |                     }t          |          S r1   )r3   arc_distancesr2   r<   s     r#   r    r    M   s%    ]:..//I	***r$   c              #    K   | dfd}t           |                      }t          |          dk    rd S |                    |d                    t          dt                    dz
            D ]_}|dz            |         z
  j        }||         }t          j        |d          r|V  =t          j        |dz  |z            dz  |z  V  `d S )	Nr   rL   c               3     K   t          t                    dz
            D ]C} 	 t          |          | dz            | dz                      }n# t          $ r d}Y nw xY w|V  Dd S )N   r   r@   )r/   r   r
   ZeroDivisionError)iradiusrP   s     r#   _radiizarc_distances.<locals>._radiiU   s      s1vvz"" 	 	A)!A$!a%!AE(CC$   LLLL	 	s   )AAAr   rA   r          @)r   rL   )r3   r   rE   r/   	magnituder7   iscloseasin)r   rZ   rkr   rkrP   s         @r#   rS   rS   R   s      A      &&((^^A
1vv{{HHQrUOOO1c!ffqj!! < <a!eHqtO.qT<A 	<NNNN)HsNR/0036;;;;;< <r$   5-pointsTc                ~   |                                 }|                    d          rt          | |          S |                    d          rt          | |          S |                    d          rt	          | |          S |                    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!   )rJ   r   rf   s      r#   r   r   j   s    , \\^^F 	626YOOOO			5	!	! 6-f	JJJJ			5	!	! 6-f	JJJJ			5	!	! 6.vKKKK4F44555r$   r   tuple[float, float]c           	        |dk    r3t          d t          | | dd                   D                       }||fS |dk    r t          t          |                     }||fS |                    d          rat	          |dd                   }d}t          |           D ]4}|t          t          |                    |                              z  }5||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  F   K   | ]\  }}|                     |          V  d S r1   rN   )r*   p0r9   s      r#   	<genexpr>z1estimate_end_tangent_magnitude.<locals>.<genexpr>   s0      QQvr22;;r??QQQQQQr$   r   Nr   zbezier-   r@   z.Unknown tangent magnitude calculation method: )	rC   r;   rS   ri   r&   r	   r4   approximater!   )rJ   r   rF   countrH   curves         r#   r   r      s   " QQVVABBZ9P9PQQQQQ\))	5=0011\))			9	%	% TF122J/77 	A 	AE%e&7&7&>&>??@@@AA!tR&RRSSSr$   c                x   d t          | | dd                   D             }t          t          | |                    }d t          ||dd                   D             }d t          ||          D             d t          ||dd                   D             t                      g}|                    fdt          t                    dz
            D                        dd	         z  |d         z
  |d	<   |                    dd
         z  |d
         z
             |rd |D             }|S )zTReturns from 3 points interpolated and optional normalized tangent
    vectors.
    c                    g | ]
\  }}||z
  S r)   r)   )r*   Q0Q1s      r#   r-   z2tangents_3_point_interpolation.<locals>.<listcomp>   s     ???VRb???r$   r   Nc                    g | ]
\  }}||z
  S r)   r)   )r*   t0t1s      r#   r-   z2tangents_3_point_interpolation.<locals>.<listcomp>   s     33362rrBw333r$   c                    g | ]
\  }}||z  S r)   r)   )r*   qkdtks      r#   r-   z2tangents_3_point_interpolation.<locals>.<listcomp>   s     111gb#c111r$   c                $    g | ]\  }}|||z   z  S r)   r)   )r*   dt0dt1s      r#   r-   z2tangents_3_point_interpolation.<locals>.<listcomp>   s%    III83SC#IIIIr$   c                b    g | ]+}d |         z
  |         z  |         |dz            z  z   ,S )rB   r   r)   )r*   r`   alpharI   s     r#   r-   z2tangents_3_point_interpolation.<locals>.<listcomp>   s@    RRR1#a.AaD	 58aAh#6	6RRRr$   r[   r   rA   c                6    g | ]}|                                 S r)   re   r*   vs     r#   r-   z2tangents_3_point_interpolation.<locals>.<listcomp>        444aAKKMM444r$   )r;   r3   r   r   extendr/   r   rE   )	r   r   rf   qr+   delta_ttangentsr   rI   s	          @@r#   rj   rj      sR    	@?s:z!""~>>???A_Z0011A33SAabbE]]333G11Q111AIIs7GABBK/H/HIIIE FF8HOORRRRRc!ffqj@Q@QRRR   !*x{*HQKOOC!B%K(2,./// 5448444Or$   c                "   t          |           }t          |           }t                      }t          |          D ]r}||dz
                               ||                   j        }||dz                                ||dz                      j        }|                    |||z   z             sg }t          |          D ]@}d||         z
  ||         z  ||         ||dz            z  z   }	|                    |	           A|rd |D             }|S )zTReturns from 5 points interpolated and optional normalized tangent
    vectors.
    r   rV   rB   c                6    g | ]}|                                 S r)   re   r   s     r#   r-   z2tangents_5_point_interpolation.<locals>.<listcomp>   r   r$   )r   _delta_qr3   r/   crossr\   rE   )
r   rf   r,   r   r   r`   v1v2r   vks
             r#   rk   rk      s    	JAAFFE1XX % %AhnnQqT""-AhnnQq1uX&&1R27^$$$$H1XX  E!Hn!$uQx!AE(':: 5448444Or$   c                    t                     }t                      g}|                     fdt          |dz
            D                        d|d         z  |d         z
  |d<   |                    d||dz
           z  ||dz
           z
             |                    d||         z  ||dz
           z
             |                    d|d         z  |d         z
             |S )Nc                8    g | ]}|d z            |         z
  S )r   r)   )r*   r`   rJ   s     r#   r-   z_delta_q.<locals>.<listcomp>   s*    >>>AfQUmfQi'>>>r$   r   r[   rV   r   )r   r   r   r/   rE   )rJ   r,   r   s   `  r#   r   r      s    FA	AHH>>>>q1u>>>???1:!AaDHHS1QU8^aAh&'''HHS1Q4Z!AE("###HHS1Q4Z!A$Hr$   c                l   d}| }|d         |d         z
  |z  g}t          dt          |           dz
            D ]D}|                    ||         ||dz
           z
  |z  ||dz            ||         z
  |z  z              E|                    |d         |d         z
  |z             |rd |D             }|S )Nr[   r   r   rA   c                6    g | ]}|                                 S r)   re   r   s     r#   r-   z3finite_difference_interpolation.<locals>.<listcomp>   s     &&&qQ[[]]&&&r$   r/   r   rE   )r   rf   frP   r+   r`   s         r#   rl   rl      s     	AA
A$1+	A1c*oo)** @ @	!A$1q5/Q&!AE(QqT/Q)>>????HHaeaemq !!! '&&A&&&Hr$   tensionc           	     B   fd} || d         | d                   g}t          dt          |           dz
            D ]3}|                     || |dz            | |dz
                                4|                     || d         | d                              |S )Nc                :    | |z
                       dz
            S )NrB   re   )rp   r9   r   s     r#   tangentz'cardinal_interpolation.<locals>.tangent   s    R""3=111r$   r   r   rA   r   r   )r   r   r   r+   r`   s    `   r#   cardinal_interpolationr      s    2 2 2 2 2 
A
1	.	./A1c*oo)** @ @	AE*Jq1u,=>>????HHWWZ^Z^44555Hr$   )r   r   r   r   r   r   )r%   r&   r   r   )r   r   r   r   )r=   r>   r   r   )rJ   rK   r   rL   )rJ   rK   r   r.   )r   r   r   rL   )rb   T)rJ   r   r   r   r   r   )r   )rJ   r   r   r   r   rm   )r   T)r   r   r   r   r   r   )T)r   r   r   r   )rJ   r   r   r   )r   r   r   r.   r   r   )
__future__r   typingr   r   r7   
ezdxf.mathr   bezier_interpolationr   r	   construct2dr
   __all__r   r   r   r   r2   r4   r   r    rS   r   r   rj   rk   r   rl   r   r)   r$   r#   <module>r      s"   # " " " " " % % % % % % % %               * ) ) ) ) )  
> 
> 
> 
>* * * *
D D D D+ + + +
 
 
 
   ) ) ) )+ + + +
< < < <2 =A 6  6  6  6  6H '.T T T T TD >B    . '+    0    '+    	 	 	 	 	 	r$   