
    'j$                        d dl mZ d dlmZmZmZ d dlZd dlZddlm	Z	m
Z
 ddlmZ ddgZ G d	 d          Z G d
 d          ZdS )    )annotations)IterableSequenceOptionalN   )Vec3NULLVEC)binomial_coefficientBasis	Evaluatorc                      e Zd ZdZdZ	 d"d#dZed$d            Zed%d            Zed%d            Z	ed&d            Z
ed&d            Zed'd            Zd(dZd)dZd*dZd+dZd,d-d!ZdS ).r   zImmutable Basis function class.)_knots_weights_order_countNknotsIterable[float]orderintcountweightsOptional[Sequence[float]]c                z   t          |          | _        t          |pg           | _        t          |          | _        t          |          | _        t          | j                  }|dk    r|| j        k    rt          d          t          | j                  | j        | j        z   k    rt          d          d S )Nr   zinvalid weight countzinvalid knot count)tupler   r   r   r   r   len
ValueError)selfr   r   r   r   len_weightss         M/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/math/_bspline.py__init__zBasis.__init__   s     Ellgm,,u::u:: $-((!t{ : :3444t{t{T[8881222 98    returnfloatc                    | j         d         S )Nr   r   s    r   max_tzBasis.max_t(   s    {2r!   c                    | j         S Nr   r'   s    r   r   zBasis.order,   
    {r!   c                    | j         dz
  S )Nr   r+   r'   s    r   degreezBasis.degree0   s    {Qr!   tuple[float, ...]c                    | j         S r*   r&   r'   s    r   r   zBasis.knots4   r,   r!   c                    | j         S r*   )r   r'   s    r   r   zBasis.weights8   s
    }r!   boolc                *    t          | j                  S )z?Returns ``True`` if curve is a rational B-spline. (has weights))r2   r   r'   s    r   is_rationalzBasis.is_rational<   s     DM"""r!   tlist[float]c                    |                      |          }| j        dz
  }||z
  }| j        |z
  dz
  }|                     ||          }dg|z  |z   dg|z  z   S )z"Returns the expanded basis vector.r           )	find_spanr   r   basis_funcs)r   r5   spanpfrontbackbasiss          r   basis_vectorzBasis.basis_vectorA   si    ~~a  K!Oq{T!A%  q))&3%$,77r!   uc                    | j         }| j        }|||         k    r|dz
  S | j        dz
  }||         dk    rt          j        ||||          dz
  S d}||         |k    r||k     r|dz  }||         |k    r||k     |dz
  S )zDetermine the knot span index.r   r8   r   )r   r   r   bisectbisect_right)r   rA   r   r   r<   r;   s         r   r9   zBasis.find_spanJ   s     e19K!O8s??
 &uaE::Q>>D+""te||	 +""te||!8Or!   r;   c                   | j         }| j        }dg|z  }t          |          }t          |          }d|d<   t          d|          D ]}||t	          d|dz   |z
                     z
  ||<   |||z            |z
  ||<   d}	t          |          D ]D}
||
         ||
dz            |||
z
           z   z  }|	||
dz            |z  z   ||
<   |||
z
           |z  }	E|	||<   | j        r|                     ||          S |S )Nr8         ?r   r   )r   r   listrangemaxr4   span_weighting)r   r;   rA   r   r   Nleftrightjsavedrtemps               r   r:   zBasis.basis_funcs`   s)   EEMAwwQ!q% 	 	A%Atax!| 4 455DGTAX*E!HE1XX + +tuQU|d1q5k9:uQU|d22!QUd*AaDD 	&&q$///Hr!   nbasisc                   t          |          }| j        || j        z
  dz   |dz            }t          |          |k    r|S d t          ||          D             }t	          |          dk    r|nfd|D             S )Nr   c                    g | ]
\  }}||z  S  rU   ).0nbws      r   
<listcomp>z(Basis.span_weighting.<locals>.<listcomp>|   s     ===ur1BF===r!   r8   c                    g | ]}|z  S rU   rU   )rV   r<   ss     r   rY   z(Basis.span_weighting.<locals>.<listcomp>~   s    '@'@'@!A'@'@'@r!   )r   r   r   zipsum)r   rR   r;   sizer   productsr[   s         @r   rJ   zBasis.span_weightingv   s    6{{-t{ 2Q 6 ABw<<4M==FG(<(<===MMcvv'@'@'@'@x'@'@'@@r!   r   nc                   | j         dz
  }t          ||          }| j        }dgz  }dgz  }fdt                    D             }t          d          D ]}	||t	          d|dz   |	z
                     z
  ||	<   |||	z            |z
  ||	<   d}
t          |	          D ]j}||dz            ||	|z
           z   ||	         |<   ||         |	dz
           ||	         |         z  }|
||dz            |z  z   ||         |	<   ||	|z
           |z  }
k|
||	         |	<   fdt                    D             }t                    D ]}	||	         |         |d         |	<   dgz  dgz  g}t                    D ]{}d}d}d|d         d<   t          d|dz             D ]T}d}||z
  }||z
  }||k    rF||         d         ||dz            |         z  ||         d<   ||         d         ||         |         z  }|dk    rd}n| }|dz
  |k    r|dz
  }n||z
  }t          ||dz             D ]c}	||         |	         ||         |	dz
           z
  ||dz            ||	z            z  ||         |	<   |||         |	         |||	z            |         z  z  }d||k    rM||         |dz
            ||dz            |         z  ||         |<   |||         |         ||         |         z  z  }|||         |<   ||}}V}t          |          }t          d|dz             D ]2}t                    D ]}	||         |	xx         |z  cc<   |||z
  z  }3|d |dz            S )Nr   rF   c                    g | ]}d gz  	S )rF   rU   rV   _r   s     r   rY   z1Basis.basis_funcs_derivatives.<locals>.<listcomp>   s    333uu}333r!   r   r8   c                    g | ]}d gz  	S )r8   rU   rc   s     r   rY   z1Basis.basis_funcs_derivatives.<locals>.<listcomp>   s    ;;;uu};;;r!   r%   )r   minr   rH   rI   r#   )r   r;   rA   r`   r<   r   rL   rM   ndurN   rO   rP   rQ   derivativesas1s2kdrkpkj1j2r   s                          @r   basis_funcs_derivativeszBasis.basis_funcs_derivatives   s   AI1IIuu}3333eEll333q% 	 	A%Atax!| 4 455DGTAX*E!HE1XX + +!!a%L4A;6Aq	1va!e}s1vay0!U1q5\D%89Aq	QUd*CF1II <;;;eEll;;;u 	* 	*A #Aq	KN1 UU]SEEM*u 	  	 ABBAaDG 1a!e__    UU66 uQx#b1f+b/9AbE!H"a3r72;.A88BBBEb==QBBQBr26** 4 4A !"a1R5Q< 73rAv;rAv;NNAbE!H2qCQKO33AA77 !"a!e}s26{1~=AbE!H2qCF2J..A$%Aq! RB1 6 !HHq!a% 	 	A5\\ ' 'Aq!!!Q&!!!!QJAA7QU7##r!   r*   )r   r   r   r   r   r   r   r   )r"   r#   )r"   r   )r"   r/   )r"   r2   )r5   r#   r"   r6   )rA   r#   r"   r   )r;   r   rA   r#   r"   r6   )rR   r6   r;   r   r"   r6   r   )r;   r   rA   r#   r`   r   )__name__
__module____qualname____doc__	__slots__r    propertyr(   r   r.   r   r   r4   r@   r9   r:   rJ   rr   rU   r!   r   r   r      sq       )):I .23 3 3 3 3&    X    X    X    X    X # # # X#8 8 8 8   ,   ,A A A AF$ F$ F$ F$ F$ F$ F$r!   c                  H    e Zd ZdZddgZddZddZddZdddZ	 dddZ	dS ) r   z4B-spline curve point and curve derivative evaluator._basis_control_pointsr?   r   control_pointsSequence[Vec3]c                "    || _         || _        d S r*   )r{   r|   )r   r?   r}   s      r   r    zEvaluator.__init__   s    -r!   rA   r#   r"   r   c                2   | j         }| j        t          j        ||j                  r|j        }|j        |                    |          |                    |          t          j	        fdt          dz             D                       S )Nc              3  F   K   | ]}|         z
  |z            z  V  d S r*   rU   )rV   irK   r}   r<   r;   s     r   	<genexpr>z"Evaluator.point.<locals>.<genexpr>   sJ       
 
45AaD>$(Q,//
 
 
 
 
 
r!   r   )r{   r|   mathiscloser(   r.   r9   r:   r   r]   rH   )r   rA   r?   rK   r}   r<   r;   s      @@@@r   pointzEvaluator.point   s    -<5;'' 	ALq!!dA&&x 
 
 
 
 
 
 
9>q1u
 
 
 
 
 	
r!   r5   r   Iterable[Vec3]c              #  B   K   |D ]}|                      |          V  d S r*   )r   )r   r5   rA   s      r   pointszEvaluator.points   s8       	  	 A**Q--	  	 r!   r   r`   r   
list[Vec3]c                P   | j         }| j        t          j        ||j                  r|j        }|j        |                    |          |                    ||          |j        rg }g }|j	        }t          |dz             D ]|}t          }d}	t          dz             D ]4}
z
  |
z   }|         |
         ||         z  }||         |z  z  }|	|z  }	5|                    |           |                    |	           }g }t          |dz             D ]f}||         }t          d|dz             D ]*}|t          ||          ||         z  |||z
           z  z  }+|                    ||d         z             gn!fdt          |dz             D             }|S )z?Return point and derivatives up to n <= degree for parameter u.r   r8   r   c           	     z    g | ]6t          j        fd t          dz             D                       7S )c              3  R   K   | ]!}         |         z
  |z            z  V  "d S r*   rU   )rV   rN   basis_funcs_dersr}   rl   r<   r;   s     r   r   z2Evaluator.derivative.<locals>.<listcomp>.<genexpr>
  sS         %Q'*^D1HqL-II     r!   r   )r   r]   rH   )rV   rl   r   r}   r<   r;   s    @r   rY   z(Evaluator.derivative.<locals>.<listcomp>	  s|       
 	         "1q5\\      r!   )r{   r|   r   r   r(   r.   r9   rr   r4   r   rH   r	   appendr
   )r   rA   r`   r?   CKwwdersr   rl   vwderrN   indexbas_func_weightCKr   r   r}   r<   r;   s                  @@@@r   
derivativezEvaluator.derivative   s    -<5;'' 	ALq!! 88q!DD  	 !C!#EmG1q5\\ 
# 
#q1u , ,A 1HqLE&6q&9!&<wu~&MO.@@AO+DD

1T""""  B1q5\\ ( (Fq!a% K KA-a33eAh>AEJJAA		!eAh,''''	(      
 q1u  B 	r!   Iterable[list[Vec3]]c              #  D   K   |D ]}|                      ||          V  d S r*   )r   )r   r5   r`   rA   s       r   rh   zEvaluator.derivatives  s>        	( 	(A//!Q''''''	( 	(r!   N)r?   r   r}   r~   )rA   r#   r"   r   )r5   r   r"   r   rs   )rA   r#   r`   r   r"   r   )r5   r   r`   r   r"   r   )
rt   ru   rv   rw   rx   r    r   r   r   rh   rU   r!   r   r   r      s        >>,-I. . . .
 
 
 
       , , , , ,^ ,-( ( ( ( ( ( (r!   )
__future__r   typingr   r   r   r   rC   _vectorr   r	   linalgr
   __all__r   r   rU   r!   r   <module>r      s    # " " " " " / / / / / / / / / /   # " " " " " " " ( ( ( ( ( (K
 v$ v$ v$ v$ v$ v$ v$ v$rM( M( M( M( M( M( M( M( M( M(r!   