
    Og#                        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y)    )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y)r   zImmutable Basis function class.)_knots_weights_order_countNc                h   t        |      | _        t        |xs g       | _        t        |      | _        t        |      | _        t        | j                        }|dk7  r|| j
                  k7  rt        d      t        | j                        | j                  | j
                  z   k7  rt        d      y )Nr   zinvalid weight countzinvalid knot count)tupler   r   intr   r   len
ValueError)selfknotsordercountweightslen_weightss         X/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/math/_bspline.py__init__zBasis.__init__   s     Elgm,u:u: $--(!t{{ :344t{{t{{T[[88122 9    c                     | 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   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   c                ,    t        | j                        S )z?Returns ``True`` if curve is a rational B-spline. (has weights))boolr   r#   s    r   is_rationalzBasis.is_rational<   s     DMM""r   c                    | j                  |      }| j                  dz
  }||z
  }| j                  |z
  dz
  }| j                  ||      }dg|z  |z   dg|z  z   S )z"Returns the expanded basis vector.r           )	find_spanr   r   basis_funcs)r   tspanpfrontbackbasiss          r   basis_vectorzBasis.basis_vectorA   sg    ~~a KK!Oq{{T!A%  q)&3%$,77r   c                    | 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  r|dz
  S )zDetermine the knot span index.r   r1   r   )r   r   r   bisectbisect_right)r   ur   r   r6   r5   s         r   r2   zBasis.find_spanJ   s     e19KK!O8s?
 &&uaE:Q>>D+"te|	 +"te|!8Or   c                   | j                   }| j                  }dg|z  }t        |      }t        |      }d|d<   t        d|      D ]u  }||t	        d|dz   |z
           z
  ||<   |||z      |z
  ||<   d}	t        |      D ]5  }
||
   ||
dz      |||
z
     z   z  }|	||
dz      |z  z   ||
<   |||
z
     |z  }	7 |	||<   w | j
                  r| j                  ||      S |S )Nr1         ?r   r   )r   r   listrangemaxr/   span_weighting)r   r5   r>   r   r   Nleftrightjsavedrtemps               r   r3   zBasis.basis_funcs`   s   EEMAwQ!q% 	A%Atax!| 455DGTAX*E!HE1X +tuQU|d1q5k9:uQU|d22!QUd*+ AaD	 &&q$//Hr   c                   t        |      }| j                  || j                  z
  dz   |dz    }t        ||      D cg c]
  \  }}||z   }}}t	        |      }|dk(  rdg|z  S |D 	cg c]  }	|	|z  	 c}	S c c}}w c c}	w )Nr   r1   )r   r   r   zipsum)
r   nbasisr5   sizer   nbwproductssr6   s
             r   rD   zBasis.span_weightingv   s    6{--t{{ 2Q 6B(+FG(<=ur1BF==M Cxut|FX-Fa!e-FF >-Fs   A8)A>c                d   | j                   }|dz
  }t        ||      }| j                  }dg|z  }dg|z  }t        |      D 	cg c]  }	dg|z  
 }
}	t        d|      D ]  }||t	        d|dz   |z
           z
  ||<   |||z      |z
  ||<   d}t        |      D ]L  }||dz      |||z
     z   |
|   |<   |
|   |dz
     |
|   |   z  }|||dz      |z  z   |
|   |<   |||z
     |z  }N ||
|   |<    t        |      D 	cg c]  }	dg|z  
 }}	t        |      D ]  }|
|   |   |d   |<    dg|z  dg|z  g}t        |      D ]  }d}d}d|d   d<   t        d|dz         D ]  }d}||z
  }||z
  }||k\  r+||   d   |
|dz      |   z  ||   d<   ||   d   |
|   |   z  }|dk\  rd}n| }|dz
  |k  r|dz
  }n||z
  }t        ||dz         D ]B  }||   |   ||   |dz
     z
  |
|dz      ||z      z  ||   |<   |||   |   |
||z      |   z  z  }D ||k  r2||   |dz
      |
|dz      |   z  ||   |<   |||   |   |
|   |   z  z  }|||   |<   ||}}  t        |      }t        d|dz         D ]*  }t        |      D ]  }||   |xx   |z  cc<    |||z
  z  }, |d |dz    S c c}	w c c}	w )Nr   r@   r   r1   r!   )r   minr   rB   rC   float)r   r5   r>   nr   r6   r   rF   rG   _ndurH   rI   rJ   rK   derivativesas1s2kdrkpkj1j2s                            r   basis_funcs_derivativeszBasis.basis_funcs_derivatives}   s   AI1Iuu}&+El3uu}33q% 	A%Atax!| 455DGTAX*E!HE1X +!!a%L4A;6Aq	1va!e}s1vay0!U1q5\D%89Aq	QUd*+ CF1I	 /4El;uu};;u 	*A #Aq	KN1	* UU]SEEM*u 	 ABBAaDG 1a!e_  UU6 uQx#b1f+b/9AbE!H"a3r72;.A8BBEb=QBQBr26* 4A !"a1R5Q< 73rAv;rAv;NNAbE!H2qCQKO33A4 7 !"a!e}s26{1~=AbE!H2qCF2J..A$%Aq! RB1 	 D !Hq!a% 	A5\ 'Aq!Q&!'QJA	 7QU##{ 4  <s   J(=J-r&   )r   Iterable[float]r   r   r   r   r   zOptional[Sequence[float]])returnrW   )rg   r   )rg   ztuple[float, ...])rg   r.   )r4   rW   rg   list[float])r>   rW   rg   r   )r5   r   r>   rW   rg   rh   )rO   rh   r5   r   rg   rh   r   )r5   r   r>   rW   rX   r   )__name__
__module____qualname____doc__	__slots__r   propertyr$   r   r*   r   r   r/   r:   r2   r3   rD   re    r   r   r   r      s    ):I .233 3 	3
 +3&           # #8,,GF$r   c                  P    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	y	)r   z4B-spline curve point and curve derivative evaluator._basis_control_pointsc                     || _         || _        y r&   )rr   rs   )r   r9   control_pointss      r   r   zEvaluator.__init__   s    -r   c                J   | j                   }| j                  t        j                  ||j                        r|j                  }|j
                  |j                  |      |j                  |      t        j                  fdt        dz         D              S )Nc              3  @   K   | ]  }|   z
  |z      z    y wr&   rp   ).0irE   ru   r6   r5   s     r   	<genexpr>z"Evaluator.point.<locals>.<genexpr>   s,      
45AaD>$(Q,//
s   r   )rr   rs   mathiscloser$   r*   r2   r3   r   rN   rB   )r   r>   r9   rE   ru   r6   r5   s      @@@@r   pointzEvaluator.point   s    --<<5;;'ALLq!dA&xx 
9>q1u
 
 	
r   c              #  @   K   |D ]  }| j                  |        y wr&   )r}   )r   r4   r>   s      r   pointszEvaluator.points   s#      	 A**Q-	 s   c           
        | j                   }| j                  t        j                  ||j                        r|j                  }|j
                  |j                  |      |j                  ||      |j                  rg }g }|j                  }t        |dz         D ]e  t        }d}t        dz         D ](  }	z
  |	z   }
   |	   ||
   z  }||
   |z  z  }||z  }* |j                  |       |j                  |       g g }t        |dz         D ]P  |   }t        ddz         D ]   }|t        |      ||   z  ||z
     z  z  }" |j                  ||d   z         R |S t        |dz         D cg c]0  t        j                  fdt        dz         D              2 }}|S c c}w )z?Return point and derivatives up to n <= degree for parameter u.r   r1   r   c              3  F   K   | ]  }   |   z
  |z      z    y wr&   rp   )rx   rH   basis_funcs_dersru   r_   r6   r5   s     r   rz   z'Evaluator.derivative.<locals>.<genexpr>  s5       %Q'*^D1HqL-IIs   !)rr   rs   r{   r|   r$   r*   r2   re   r/   r   rB   r	   appendr
   r   rN   )r   r>   rX   r9   CKwwdersr   vwderrH   indexbas_func_weightCKry   r_   r   ru   r6   r5   s                 `@@@@r   
derivativezEvaluator.derivative   s    --<<5;;'ALLq! 88q!D !C!#EmmG1q5\ 
#q1u ,A 1HqLE&6q&9!&<wu~&MO.@@AO+D, 

1T"
#  B1q5\ (Fq!a% KA-a3eAh>AEJJAK		!eAh,'	( 	 q1u
 	  "1q5\ B  	s   5F;c              #  B   K   |D ]  }| j                  ||        y wr&   )r   )r   r4   rX   r>   s       r   r[   zEvaluator.derivatives  s(       	(A//!Q''	(s   N)r9   r   ru   zSequence[Vec3])r>   rW   rg   r   )r4   rf   rg   zIterable[Vec3]ri   )r>   rW   rX   r   rg   z
list[Vec3])r4   rf   rX   r   rg   zIterable[list[Vec3]])
rj   rk   rl   rm   rn   r   r}   r   r   r[   rp   r   r   r   r      sG    >,-I.
 ,^ ,-( (%((	(r   )
__future__r   typingr   r   r   r{   r<   _vectorr   r	   linalgr
   __all__r   r   rp   r   r   <module>r      sA    # / /   # (K
 s$ s$lM( M(r   