
    ]j#B                         d dl Z d dlT d dlT d Zd Z G d de j                  Z G d de j                  Z G d	 d
e j                  ZdS )    N)*c                     t          t                      dz  t                      dz  ft                      dz  dz   t                      dz  dz   t          t                      dz            t          t                      dz            t          t                      dz            t                      dz  t                      dz  f          S )N2   0         )Arcrandomint     O/home/agentuser/manim-venv/lib/python3.11/site-packages/test/test_arc_length.pyget_random_arcr      s    2vxx"}-xx"}q &((R-!"3688c>""688a<  #fhhl"3"32vxx"}-	/ / /r   c                  |   t                      dz  dz   } t          t                      dz  t                      dz  f| | t          t                      dz            t          t                      dz            t          t                      dz            t                      dz  t                      dz  f          S )Nr   r   r   r   )r
   r	   r   )rs    r   get_random_circle_arcr      s    2A2vxx"}-!688c>""688a<  #fhhl"3"32vxx"}-	/ / /r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d S )!TestElementArcLengthc                    t          d          D ]w}t          ddd          }t                      t          z  dz  t          dz  z
  }|                    |          }|                    |          }|                     ||           xd S N  r   r   r         rangeEllipser
   taupoint_at_angleangle_at_pointassertAlmostEqualselfiellipseanglepas         r   test_arc_angle_pointz)TestElementArcLength.test_arc_angle_point   s    t 	- 	-Afa++GHHsNQ&q0E&&u--A&&q))A""5!,,,,	- 	-r   c                    t          d          D ]x}t          dddd          }t                      t          z  dz  t          dz  z
  }|                    |          }|                    |          }|                     ||           yd S )Nr   r   r   r   rotate(45deg)r   r   r"   s         r   test_arc_angle_point_rotatedz1TestElementArcLength.test_arc_angle_point_rotated#   s    t 	- 	-AfaO<<GHHsNQ&q0E&&u--A&&q))A""5!,,,,	- 	-r   c                    t          d          D ]B}t          ddd          }t                      t          z  dz  t          dz  z
  }t                      t          z  dz  t          dz  z
  }|                    |          }|                    |          }|                     ||           |                    |          }|                    |          }|                     ||           |                    ||          }|                     |                                |           |                     |	                                |           Dd S r   )
r   r   r
   r   r   r    r!   	arc_angleget_start_angleget_end_angler#   r$   r%   startendr'   r(   arcs           r   test_arc_anglesz$TestElementArcLength.test_arc_angles,   s<   t 	= 	=Afa++GHHsNQ&q0E((S.1$sQw.C&&u--A&&q))A""5!,,,&&s++A&&q))A""3***##E3//C""3#6#6#8#8%@@@""3#4#4#6#6<<<<	= 	=r   c                    t          d          D ]B}t          ddd          }t                      t          z  dz  t          dz  z
  }t                      t          z  dz  t          dz  z
  }|                    |          }|                    |          }|                     ||           |                    |          }|                    |          }|                     ||           |                    ||          }|                     |                                |           |                     |	                                |           Dd S r   
r   r   r
   r   
point_at_t
t_at_pointr!   arc_tget_start_t	get_end_tr1   s           r   
test_arc_tzTestElementArcLength.test_arc_t>   s4   t 	9 	9Afa++GHHsNQ&q0E((S.1$sQw.C""5))A""1%%A""5!,,,""3''A""1%%A""3***--s++C""3??#4#4e<<<""3==??C8888	9 	9r   c                 .   t          d          D ]}t          dddd          }t                      t          z  dz  t          dz  z
  }t                      t          z  dz  t          dz  z
  }|                    |          }|                    |          }|                     ||           |                    |          }|                    |          }|                     ||           |                    |          }|                    |          }|                     ||           |	                    ||          }|                     |
                                |           |                     |                                |           d S Nr   r   r   r   rotate(90deg)r   )r   r   r
   r   r   r    r!   r8   r9   r.   r/   r0   r1   s           r   test_arc_angles_rotatedz,TestElementArcLength.test_arc_angles_rotatedP   sz   t 	= 	=AfaO<<GHHsNQ&q0E((S.1$sQw.C&&u--A&&q))A""5!,,,""3''A""1%%A""3***&&s++A&&q))A""3***##E3//C""3#6#6#8#8%@@@""3#4#4#6#6<<<<'	= 	=r   c                 .   t          d          D ]}t          dddd          }t                      t          z  dz  t          dz  z
  }t                      t          z  dz  t          dz  z
  }|                    |          }|                    |          }|                     ||           |                    ||          }|                     |                                |           |                     |	                                |           d S r?   r7   r1   s           r   test_arc_t_rotatedz'TestElementArcLength.test_arc_t_rotatedf   s    t 	9 	9Afa_==GHHsNQ&q0E((S.1$sQw.C""5))A""1%%A""5!,,,--s++C""3??#4#4e<<<""3==??C8888	9 	9r   c           
         d}d}t          |t          t          d                    z  |z            }t          |          |z  }t	          |          |z  }t          ddddd|d|z  z   	          }t          dddd          }|                    dt          	                    d                    }| 
                    ||           d S )
Nffffff@ףp=
@r   yffffff@        yffffff@ףp=
@r   r   y              ?)r2   radiusrotation
sweep_flagarc_flagr3   )atantanradianscossinr	   r   r.   AngledegreesassertEqual)	r#   r(   br&   xyarc0r%   arc1s	            r   test_arc_solve_producedz,TestElementArcLength.test_arc_solve_producedt   s    QWR[[)))A-..JJNJJN<!PQ\]cdgilmgmcmnnn!Qd++  EMM"$5$566t$$$$$r   c                     t          dddd          }|                    dt                              d                    }|dz  }|                                }|                     |dd	           d S )
N        rE   rF   r   r   z	rotate(1)xX@@绽|=deltar   r.   rP   rQ   _exact_lengthr!   r#   r%   r4   exacts       r   test_arc_solved_exactz*TestElementArcLength.test_arc_solved_exact   ss    #sD$//5==#4#455{!!##u&;5IIIIIr   c                     t          dddd          }|                    dt                              d                    }|                                }|                     |dd           d S )Nr   rE   rF   r   r[   g-C6?r]   )r   r.   rP   rQ   _integral_lengthr!   r#   r%   r4   length_calculateds       r   test_arc_solved_integratedz/TestElementArcLength.test_arc_solved_integrated   sk    !Qd++5==#4#455002202GtTTTTTr   c                     t          dddd          }|                    dt                              d                    }|                                }|                     |dd           d S )Nr   rE   rF   r   r[   g&.>r]   )r   r.   rP   rQ   _line_lengthr!   rf   s       r   test_arc_solved_linesz*TestElementArcLength.test_arc_solved_lines   sk    !Qd++5==#4#455,,..02GtTTTTTr   c                    t          dddd          }|                    t                              d          t                              d                    }|                                }|                     |d           |                    t                              d          t                              d                    }|                                }|                     |d           d S )	Nr   rE   rF   r      r[   i  gCvP,@r_   ra   s       r   test_arc_rotated_solved_exactz2TestElementArcLength.test_arc_rotated_solved_exact   s    !Qd++c 2 2EMM(4K4KLL!!##u&;<<<n = =u}}S?Q?QRR!!##u&899999r   c                     t          dddd                              dt                              d                    }|                     |                    d          d           d S )Nr         Z   )rp   r   )r   r.   rP   rQ   rR   pointr#   r4   s     r   test_arc_position_0_orthoz.TestElementArcLength.test_arc_position_0_ortho   sW    aAq!!++Au}}R/@/@AA1v.....r   c                 8   t          dddd                              dt                              d                    }|dz  }|                    d          }|                     |d           |                    d          }|                     |d           d S )	Nr   rp   rq   rr   r@   )r   rp   r   )r   )r   r.   rP   rQ   rs   rR   )r#   r4   r'   s      r   test_arc_position_0_rotatez/TestElementArcLength.test_arc_position_0_rotate   s    aAq!!++Au}}R/@/@AAIIaLLF###IIaLLG$$$$$r   c                 
   t          ddd                              dt                              d                    }|dz  }|                     |                                t                              d                     d S )Nz0,0rp   rq   r   rr   zrotate(-33deg)i)r   r.   rP   rQ   rR   r/   rt   s     r   test_arc_position_0_anglez.TestElementArcLength.test_arc_position_0_angle   sn    eQ"",,Qb0A0ABB,,..c0B0BCCCCCr   c           
         t          dd          }t          |t          dd          t          dd          t          dd          t          d	d
          d          }|                    d          }|                     ||           d S )N!
N*@{-xoC@d>,@vRo8@ƫD -$Z8p+9@笍yE祋<@E:m3熊ȕ)pXo@r   )Pointr	   rs   r!   )r#   r2   r4   point_0s       r   test_arc_position_0z(TestElementArcLength.test_arc_position_0   s    o77%99(/::(/::)9::! ! ))A,,ug.....r   c           
         t          t          dd          t          dd          t          dd          t          dd          t          d	d
          d          }|                                }|                     d|d           dS Test error vs. random arcr|   r}   r~   r   r   r   r   r   r   r   r   gM2h@rp   placesN)r	   r   lengthr!   r#   r4   r   s      r   test_arc_len_r0_defaultz,TestElementArcLength.test_arc_len_r0_default   s    %9999(/::(/::)9::! ! 0&CCCCCr   c           
         t          t          dd          t          dd          t          dd          t          dd          t          d	d
          d          }|                                }|                     d|d           dS r   )r	   r   rj   r!   r   s      r   test_arc_len_r0_linesz*TestElementArcLength.test_arc_len_r0_lines   s    %9999(/::(/::)9::! ! !!##0&CCCCCr   c           
         t          t          dd          t          dd          t          dd          t          dd          t          d	d
          d          }|                                }|                     d|d           dS r   )r	   r   r`   r!   r   s      r   test_arc_len_r0_exactz*TestElementArcLength.test_arc_len_r0_exact   s    %9999(/::(/::)9::! ! ""$$0&CCCCCr   c           
         t          t          dd          t          dd          t          dd          t          dd          t          d	d
          d          }|                                }|                     d|d           dS r   )r	   r   re   r!   r   s      r   test_arc_len_r0_integralz-TestElementArcLength.test_arc_len_r0_integral   s    %9999(/::(/::)9::! ! %%''0&CCCCCr   c                 p   |                      t          ddddddd                                          dd           |                      t          ddddddd                                          dd           |                     t          ddddddd                                          d           d	S )
z$Test error at extreme eccentricitiesr   r   r\   r   g|=r      r   rq   N)r!   r	   rj   re   rR   r`   )r#   s    r   test_arc_len_straightz*TestElementArcLength.test_arc_len_straight   s    s1a1aDDQQSSUV_abbbs1a1aDDUUWWYZcdeeeQ5!Q:>>LLNNPQRRRRRr   c                 N   t          ddddd          }|                                }t                      }t          |j        t
          <   ||z  }|                    d          }|                    d          }|                     ||           |                     ||           d S )N20r      r+   r   )	r   unit_matrixCircleSVG_VALUE_NON_SCALING_STROKEvaluesSVG_ATTR_VECTOR_EFFECTr8   r!   rR   )r#   r%   matrixellipse2p1p2s         r   test_unit_matrixz%TestElementArcLength.test_unit_matrix   s    $aO<<$$&&882N./F""  ##r2&&&(+++++r   c                 .   d}t          d          D ]m}t                      }t          |j        |j        z            }|                                }t          ||z
            }||z  }|                     ||           nt          d|dz  z             dS )zKnown chord vs. shortcutr   r   z$Average chord vs shortcut-length: %gN)r   r   abssweeprxr   r!   print)r#   errorr$   r4   chordr   cs          r   test_arc_len_circle_shortcutz1TestElementArcLength.test_arc_len_circle_shortcut   s    t 	2 	2A'))C	CF*++EZZ\\FFUN##AQJE""5&11114EFFFFFr   c                 2   d}d}t          |          D ]m}t                      }t          |j        |j        z            }|                                }t          ||z
            }||z  }|                     ||           nt          d||z  z             dS )zKnown chord vs integral
   r   zAverage chord vs integral: %gN)r   r   r   r   r   re   r!   r   r#   nr   r$   r4   r   r   r   s           r   test_arc_len_circle_intz,TestElementArcLength.test_arc_len_circle_int  s    q 	2 	2A'))C	CF*++E))++FFUN##AQJE""5&1111-;<<<<<r   c                 2   d}d}t          |          D ]m}t                      }t          |j        |j        z            }|                                }t          ||z
            }||z  }|                     ||           nt          d||z  z             dS )zKnown chord vs exactr   r   zAverage chord vs exact: %gN)r   r   r   r   r   r`   r!   r   r   s           r   test_arc_len_circle_exactz.TestElementArcLength.test_arc_len_circle_exact  s    q 	2 	2A'))C	CF*++E&&((FFUN##AQJE""5&1111*eai899999r   c                 6   d}d}t          |          D ]o}t                      }t          |j        |j        z            }|                                }t          ||z
            }||z  }|                     ||d           pt          d||z  z             dS )zKnown chord vs liner   r      r   zAverage chord vs line: %gN)r   r   r   r   r   rj   r!   r   r   s           r   test_arc_len_circle_linez-TestElementArcLength.test_arc_len_circle_line  s    q 	< 	<A'))C	CF*++E%%''FFUN##AQJE""5&";;;;)UQY788888r   c           
      :   d}d}t          |          D ]q}dt                      dz  z   }t          d|ddddd          }d|z  }|                                }t	          ||z
            }||z  }|                     ||           rt          d||z  z             d	S )
zKnown flat vs lined   r   r   r   r\   r   r   Average flat vs line: %gN)r   r
   r	   rj   r   r!   r   r#   r   r   r$   flatr4   r   r   s           r   test_arc_len_flat_linez+TestElementArcLength.test_arc_len_flat_line*  s    q 	1 	1Avxx"}$DauaAz::CT6D%%''FFTM""AQJE""40000(EAI677777r   c           
      :   d}d}t          |          D ]q}dt                      dz  z   }t          d|ddddd          }d|z  }|                                }t	          ||z
            }||z  }|                     ||           rt          d||z  z             d	S )
zKnown flat vs integralr   r   r   r   r\   r   r   zAverage flat vs integral: %gN)r   r
   r	   re   r   r!   r   r   s           r   test_arc_len_flat_integralz/TestElementArcLength.test_arc_len_flat_integral8  s    q 	1 	1Avxx"}$DauaAz::CT6D))++FFTM""AQJE""40000,	:;;;;;r   c           
      :   d}d}t          |          D ]q}dt                      dz  z   }t          d|ddddd          }d|z  }|                                }t	          ||z
            }||z  }|                     ||           rt          d||z  z             d	S )
zKnown flat vs exactr   r   r   r   r\   r   r   r   N)r   r
   r	   r`   r   r!   r   r   s           r   test_arc_len_flat_exactz,TestElementArcLength.test_arc_len_flat_exactF  s    q 	1 	1Avxx"}$DauaAz::CT6D&&((FFTM""AQJE""40000(EAI677777r   c                 &   d}d}t          |          D ]g}t                      }|                                }|                                }t	          ||z
            }||z  }|                     ||d           ht          d||z  z             dS )r   rq   r   r   r   zAverage arc-integral error: %gN)r   r   re   r`   r   r!   r   r#   r   r   r$   r4   r   rb   r   s           r   test_arc_len_random_intz,TestElementArcLength.test_arc_len_random_intT  s    q 	< 	<A ""C))++F%%''EFUN##AQJE""5&";;;;.%!)<=====r   c                 &   d}d}t          |          D ]g}t                      }|                                }|                                }t	          ||z
            }||z  }|                     ||d           ht          d||z  z             dS )r   r   r   r   r   zAverage arc-line error: %gN)r   r   rj   r`   r   r!   r   r   s           r   test_arc_len_random_linesz.TestElementArcLength.test_arc_len_random_linesa  s    q 	< 	<A ""C%%''F%%''EFUN##AQJE""5&";;;;*eai899999r   c                 p    t          ddd          }|                     |j        t          dz             dS )z>
        Numerical Instability within arc bulge code.
        )g+<-AgŹ)gKBgg?)r2   r3   bulger   N)r	   assertLessEqualr   r   rt   s     r   test_arc_issue_126z'TestElementArcLength.test_arc_issue_126n  sE     ;9$
 
 

 	SYA.....r   N)"__name__
__module____qualname__r)   r,   r5   r=   rA   rC   rX   rc   rh   rk   rn   ru   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s       - - -- - -= = =$9 9 9$= = =,9 9 9% % %J J JU U UU U U: : :/ / /% % %D D D
	/ 	/ 	/	D 	D 	D	D 	D 	D	D 	D 	D	D 	D 	DS S S	, 	, 	,
G 
G 
G= = =: : :9 9 98 8 8< < <8 8 8> > >: : :	/ 	/ 	/ 	/ 	/r   r   c                       e Zd Zd Zd ZdS )TestElementArcPointc                    dd l }t          d          D ]}t                      }|                     |j        |                    d                     |                     |j        |                    d                     |                     |                    |	                    t          |j                  t          |j                  g          |                    ddg          k                         d S )Nr   r   r   )numpyr   r   rR   r2   rs   r3   
assertTrueallarraylistnpoint)r#   np_r4   s       r   test_arc_point_start_stopz-TestElementArcPoint.test_arc_point_start_stop|  s    t 	; 	;A ""CSY		!555SWciill333OOBFF288T#)__d37mm,L#M#M&)jj!Q&8&8$9 : : ; ; ; ;		; 	;r   c                 D   dd l }t          d          D ]
}t                      }|                    ddd          }|                    |          }g }t          t          |                    D ]0}|                    |                    ||                              1t          |||          D ]l\  }}	}
| 	                    |                    |          t          |	                     | 	                    t          |	          t          |
                     md S )Nr   r   r   r   )r   r   r   linspacer   lenappendrs   ziprR   r   )r#   r   r   r4   posv1v2r$   r'   r   r   s              r   $test_arc_point_implementations_matchz8TestElementArcPoint.test_arc_point_implementations_match  s   t 	7 	7A ""C++aC((CCBB3s88__ - -		#))CF++,,,, b"-- 7 7	2r  1uRyy999  rE"II66667	7 	7r   N)r   r   r   r   r   r   r   r   r   r   z  s2        ; ; ;7 7 7 7 7r   r   c                   &    e Zd Zd Zd Zd Zd ZdS )TestElementArcApproximationc                    d}t          |          D ]}t                      }t          t                      |g          }t          |          }|                    d           t          |                                |                                z
            }|dk    rt          |           |                     |dd           d S )Nr   皙?r   r   rZ      r]   )	r   r   PathMoveapproximate_arcs_with_quadsr   r   r   r!   r#   r   r$   r4   path1path2ds          r   test_approx_quadz,TestElementArcApproximation.test_approx_quad  s    q 		5 		5A ""C$&&#''EKKE--D-999ELLNNU\\^^344A2vvc


""1c"4444		5 		5r   c                    d}t          |          D ]}t                      }t          t                      |g          }t          |          }|                    d           t          |                                |                                z
            }|dk    rt          |           |                     |dd           d S )Nr   皙?r   r   rZ   r]   )	r   r   r   r   approximate_arcs_with_cubicsr   r   r   r!   r   s          r   test_approx_cubicz-TestElementArcApproximation.test_approx_cubic  s    q 		4 		4A ""C$&&#''EKKE..S.999ELLNNU\\^^344A1uuc


""1c"3333		4 		4r   c                 t   t          ddd          }t          t                      |g          }t          |          }|                    d           t	          |                                |                                z
            }|dk    rt          |           |                     |dd           d S )	Nr   r2   r3   controlr   r   r   rZ   r   r]   )r	   r   r   r   r   r   r   r!   r#   r4   r   r   r   s        r   test_approx_quad_degeneratez7TestElementArcApproximation.test_approx_quad_degenerate  s    %777dffc]##U)))555/00r66#JJJq#R00000r   c                 t   t          ddd          }t          t                      |g          }t          |          }|                    d           t	          |                                |                                z
            }|dk    rt          |           |                     |dd           d S )	Nr   r   r   r   r   rZ   r   r]   )r	   r   r   r   r   r   r   r!   r   s        r   test_approx_cubic_degeneratez8TestElementArcApproximation.test_approx_cubic_degenerate  s    %777dffc]##U***555/00q55#JJJq#Q/////r   N)r   r   r   r   r   r   r   r   r   r   r   r     sP        5 5 54 4 4	1 	1 	1	0 	0 	0 	0 	0r   r   )	unittestr
   svgelementsr   r   TestCaser   r   r   r   r   r   <module>r     s            / / // / /_/ _/ _/ _/ _/8, _/ _/ _/D7 7 7 7 7(+ 7 7 7800 00 00 00 00("3 00 00 00 00 00r   