Files
Apollo3D_SE/utils/__pycache__/math_ops.cpython-311.pyc

158 lines
26 KiB
Plaintext
Raw Normal View History

2026-03-10 09:35:27 -04:00
<EFBFBD>
<00>ʮi<CAAE>?<00><00><><00>ddlmZmZmZmZmZmZmZmZddl m
Z
ddl Z ddl Z e jan #daYnxYwGd<05>d<06><00>ZdS)<07>)<08>acos<6F>asin<69>atan2<6E>cos<6F>pi<70>sin<69>sqrt<72>isnan)<01>RotationN<6E>.c <00>z<00>eZdZdZed<02><00><00>Zed<03><00><00>Zed<04><00><00>Zed>dej fd<07><05><00>Z
edej fd<08><04><00>Z edej fd <09><04><00>Z d
ej d ej d ej dej fd <0A>Z ededefd<0F><04><00>Zed<10><00><00>Zed<11><00><00>Zed<12><00><00>Zed<13><00><00>Zed<14><00><00>Zed<15><00><00>Zed?d<17><01><00>Zed?d<18><01><00>Zed?d<19><01><00>Zed?d<1A><01><00>Zed?d<1B><01><00>Zed?d<1C><01><00>Zedej dej dej fd <20><04><00>Zed!ej d"ej defd#<23><04><00>Zedej dej dej defd$<24><04><00>Z ed%ej d&ej d'ej defd(<28><04><00>Z!dej dej dej fd)<29>Z"edej d*ej d+ej fd,<2C><04><00>Z#edej d*ej d+ej fd-<2D><04><00>Z$edej dej dej fd.<2E><04><00>Z%edej dej fd/<2F><04><00>Z&ed0<64><00><00>Z'edej dej fd1<64><04><00>Z(edej fd2<64><04><00>Z)edej fd3<64><04><00>Z*ed@d6<64><01><00>Z+ed7<64><00><00>Z,e dAdefd:<3A><05><00>Z-ed;ej fd<<3C><04><00>Z.d=S)B<>MathOpszk
This class provides general mathematical operations that are not directly available through numpy
c<00>,<00>|d}|dtzdz }|dtzdz }tj|t|<03><00>zt|<02><00>z|t|<03><00>zt |<02><00>z|t |<03><00>zg<03><00>S)zD Converts spherical coordinates in degrees to cartesian coordinates r<00><00><><00>)r<00>np<6E>arrayrr)<04> spherical_vec<65>r<>h<>vs <20>./home/miku/Downloads/Code/SE/utils/math_ops.py<70> deg_sph2cartzMathOps.deg_sph2carts<><00><00> <1A>!<21> <1C><01> <19>!<21> <1C>r<EFBFBD> !<21>C<EFBFBD> '<27><01> <19>!<21> <1C>r<EFBFBD> !<21>C<EFBFBD> '<27><01><11>x<EFBFBD><11>S<EFBFBD><11>V<EFBFBD>V<EFBFBD><1A>c<EFBFBD>!<21>f<EFBFBD>f<EFBFBD>,<2C>a<EFBFBD>#<23>a<EFBFBD>&<26>&<26>j<EFBFBD>3<EFBFBD>q<EFBFBD>6<EFBFBD>6<EFBFBD>.A<>1<EFBFBD>s<EFBFBD>1<EFBFBD>v<EFBFBD>v<EFBFBD>:<3A>N<>O<>O<>O<>c<00>6<00>t|tzdz <00><00>S)z Returns sin of degrees r)rr<00><01> deg_angles r<00>deg_sinzMathOps.deg_sin<00><00><00><13>9<EFBFBD>r<EFBFBD>><3E>C<EFBFBD>'<27>(<28>(<28>(rc<00>6<00>t|tzdz <00><00>S)z Returns cos of degrees r)rrrs r<00>deg_coszMathOps.deg_cosr rr<00>returnc<00>,<00>tj||<01><00>S)z& Returns new 3d vector from 2d vector )r<00>append)<02>vec_2d<32>values r<00>to_3dz MathOps.to_3d#s<00><00><12>y<EFBFBD><16><15>'<27>'<27>'rc<00>8<00>tj|<00><00>}d|d<|S)z7 Returns new 3d vector where the 3rd dimension is zero rr)r<00>copy)<02>vec_3d<33> vec_2d_as_3ds r<00> to_2d_as_3dzMathOps.to_2d_as_3d(s <00><00><1A>w<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD> <0C><1B> <0C>Q<EFBFBD><0F><1B>rc<00>Z<00>tj<00>|<00><00>}|dkr|S||z S)z Divides vector by its length r)r<00>linalg<6C>norm)<02>vec<65>sizes r<00> normalize_veczMathOps.normalize_vec/s.<00><00><12>y<EFBFBD>~<7E>~<7E>c<EFBFBD>"<22>"<22><04> <0F>1<EFBFBD>9<EFBFBD>9<EFBFBD>S<EFBFBD>j<EFBFBD><12>T<EFBFBD>z<EFBFBD>r<00> local_pos_3d<33> global_pos_3d<33>global_orientation_quatc<00>b<00>tj|<02><00>}|<03>|<00><00>}||z}|S)zm Converts a local 3d position to a global 3d position given the global position and orientation (quaternion) )r <00> from_quat<61>apply)r4r5r6<00>rotation<6F> rotated_vec<65>
global_poss r<00>rel_to_global_3dzMathOps.rel_to_global_3d6s6<00><00><1C>%<25>&=<3D>><3E>><3E><08><1E>n<EFBFBD>n<EFBFBD>\<5C>2<>2<> <0B>"<22>[<5B>0<>
<EFBFBD><19>r<00>dirc<00><00>t|zS)N)<01>
GLOBAL_DIR)r>s r<00>get_active_directoryzMathOps.get_active_directory@s<00><00><1A>C<EFBFBD><1F>rc<00>H<00>ttj|dd<02><00><00><00>S)z& arccosine function that limits input <20><><EFBFBD><EFBFBD><EFBFBD>r)rr<00>clip<69><01>vals rrz MathOps.acosE<00> <00><00><14>B<EFBFBD>G<EFBFBD>C<EFBFBD><12>Q<EFBFBD>'<27>'<27>(<28>(<28>(rc<00>H<00>ttj|dd<02><00><00><00>S)z$ arcsine function that limits input rCr)rrrDrEs rrz MathOps.asinJrGrc<00><00>|dzdzdz
S)z# normalize val in range [-180,180[ g<00>f@ihr<00>rEs r<00> normalize_degzMathOps.normalize_degOs<00><00><14>e<EFBFBD> <0B>s<EFBFBD>"<22>S<EFBFBD>(<28>(rc<00><<00>|tzdtzztz
S)z! normalize val in range [-pi,pi[ r)rrEs r<00> normalize_radzMathOps.normalize_radTs<00><00><14>b<EFBFBD><08>Q<EFBFBD><12>V<EFBFBD>$<24>r<EFBFBD>)<29>)rc<00> <00>|dzS)z convert degrees to radians g:<3A>R<EFBFBD>Fߑ?rJrEs r<00>
deg_to_radzMathOps.deg_to_radYs<00><00><13>(<28>(<28>(rc<00> <00>|dzS)z convert radians to degrees g<><67>cܥL@rJrEs r<00>
rad_to_degzMathOps.rad_to_deg^s<00><00><13>&<26>&<26>&rFc<00><><00>|rt|d|d<00><00>St|d|d<00><00>dztz S)z) angle (degrees or radians) of 2D vector rrr<00>rr)<02>vector<6F>is_rads r<00> vector_anglezMathOps.vector_anglecsF<00><00> <12> :<3A><18><16><01><19>F<EFBFBD>1<EFBFBD>I<EFBFBD>.<2E>.<2E> .<2E><18><16><01><19>F<EFBFBD>1<EFBFBD>I<EFBFBD>.<2E>.<2E><13>4<>r<EFBFBD>9<> 9rc<00><><00>ttjt<00>|<00><00>t<00>|<01><00><00><00><00><00>}|r|n |dzt
z S)z0 get angle between vectors (degrees or radians) r)rr<00>dotrr3r)<04>vec1<63>vec2rU<00>ang_rads r<00> vectors_anglezMathOps.vectors_angleksR<00><00><17>r<EFBFBD>v<EFBFBD>g<EFBFBD>3<>3<>D<EFBFBD>9<>9<>7<EFBFBD>;P<>;P<>QU<51>;V<>;V<>W<>W<>X<>X<><07> <20>8<>w<EFBFBD>w<EFBFBD>g<EFBFBD><03>m<EFBFBD>b<EFBFBD>&8<>8rc<00>
<00>|r6tjt|<00><00>t|<00><00>gt<00><00>Stjt
<00>|<00><00>t
<00>|<00><00>gt<00><00>S)z- unit vector with direction given by `angle` )rrrr<00>floatrr"r)<02>anglerUs r<00>vector_from_anglezMathOps.vector_from_angleqs_<00><00> <12> U<01><15>8<EFBFBD>S<EFBFBD><15>Z<EFBFBD>Z<EFBFBD><13>U<EFBFBD><1A><1A>4<>e<EFBFBD><<3C><<3C> <<3C><15>8<EFBFBD>W<EFBFBD>_<EFBFBD>_<EFBFBD>U<EFBFBD>3<>3<>W<EFBFBD>_<EFBFBD>_<EFBFBD>U<EFBFBD>5K<35>5K<35>L<>e<EFBFBD>T<>T<> Trc<00><><00>|r.t|d|dz
|d|dz
<00><00>St|d|dz
|d|dz
<00><00>dztz S)z5 angle (degrees or radians) of vector (target-pos2d) rrrrS)<03>pos2d<32>targetrUs r<00>target_abs_anglezMathOps.target_abs_angleysk<00><00> <12> P<01><18><16><01><19>U<EFBFBD>1<EFBFBD>X<EFBFBD>-<2D>v<EFBFBD>a<EFBFBD>y<EFBFBD>5<EFBFBD><11>8<EFBFBD>/C<>D<>D<> D<><18><16><01><19>U<EFBFBD>1<EFBFBD>X<EFBFBD>-<2D>v<EFBFBD>a<EFBFBD>y<EFBFBD>5<EFBFBD><11>8<EFBFBD>/C<>D<>D<>s<EFBFBD>J<>R<EFBFBD>O<> Orc<00>@<00>|rIt<00>t|d|dz
|d|dz
<00><00>|z
<00><00>St<00>t|d|dz
|d|dz
<00><00>dztz |z
<00><00>S)zw relative angle (degrees or radians) of target if we're located at 'pos2d' with orientation 'ori' (degrees or radians) rrr)rrMrrKr)rb<00>orircrUs r<00>target_rel_anglezMathOps.target_rel_angle<6C>s<><00><00> <12> m<01><1A>(<28>(<28><15>v<EFBFBD>a<EFBFBD>y<EFBFBD>5<EFBFBD><11>8<EFBFBD>/C<>V<EFBFBD>A<EFBFBD>Y<EFBFBD>QV<51>WX<57>QY<51>EY<45>)Z<>)Z<>]`<60>)`<60>a<>a<> a<><1A>(<28>(<28><15>v<EFBFBD>a<EFBFBD>y<EFBFBD>5<EFBFBD><11>8<EFBFBD>/C<>V<EFBFBD>A<EFBFBD>Y<EFBFBD>QV<51>WX<57>QY<51>EY<45>)Z<>)Z<>]`<60>)`<60>ce<63>)e<>hk<68>)k<>l<>l<> lrc<00>.<00>|rt|<01><00>nt|tzdz <00><00>}|rt|<01><00>nt|tzdz <00><00>}tj||dz||dzz
||dz||dzzg<02><00>S)z= rotate 2D vector anticlockwise around the origin by `angle` rrr)rrrrr)r1r_rU<00>cos_ang<6E>sin_angs r<00> rotate_2d_veczMathOps.rotate_2d_vec<65>s<><00><00>!'<27>A<>#<23>e<EFBFBD>*<2A>*<2A>*<2A>C<EFBFBD><05><02>
<EFBFBD>S<EFBFBD>0@<40>,A<>,A<><07> &<26>A<>#<23>e<EFBFBD>*<2A>*<2A>*<2A>C<EFBFBD><05><02>
<EFBFBD>S<EFBFBD>0@<40>,A<>,A<><07><11>x<EFBFBD><17>3<EFBFBD>q<EFBFBD>6<EFBFBD>)<29>G<EFBFBD>c<EFBFBD>!<21>f<EFBFBD>,<<3C><<3C>g<EFBFBD><03>A<EFBFBD><06>>N<>QX<51>[^<5E>_`<60>[a<>Qa<51>>a<>b<>c<>c<>cr<00>p<>a<>bc<00><00>tj<00>||z
<00><00>}|dkr%tj<00>||z
<00><00>x}}n-tj||z
||z
<00><00>|z }t |<05><00>}||dkrdndfS)a<>
Distance between point p and 2d line 'ab' (and side where p is)
Parameters
----------
a : ndarray
2D point that defines line
b : ndarray
2D point that defines line
p : ndarray
2D point
Returns
-------
distance : float
distance between line and point
side : str
if we are at a, looking at b, p may be at our "left" or "right"
r<00>left<66>right)rr/r0<00>cross<73>abs)rlrmrn<00>line_len<65>dist<73>sdists r<00>distance_point_to_linezMathOps.distance_point_to_line<6E>s<><00><00>*<16>9<EFBFBD>><3E>><3E>!<21>a<EFBFBD>%<25>(<28>(<28><08> <13>q<EFBFBD>=<3D>=<3D><1D>9<EFBFBD>><3E>><3E>!<21>a<EFBFBD>%<25>0<>0<> 0<>D<EFBFBD>5<EFBFBD>5<EFBFBD><16>H<EFBFBD>Q<EFBFBD><11>U<EFBFBD>A<EFBFBD><01>E<EFBFBD>*<2A>*<2A>X<EFBFBD>5<>E<EFBFBD><16>u<EFBFBD>:<3A>:<3A>D<EFBFBD><13>u<EFBFBD>q<EFBFBD>y<EFBFBD>y<EFBFBD>V<EFBFBD>V<EFBFBD>g<EFBFBD>5<>5r<00>p1<70>p2c<00>x<00>tj|d|dz
dz|d|dz
dzz<00><00>S)z) Distance in 2d from point p1 to point p2rrr)rr )rxrys r<00>distance_point_to_point_2dz"MathOps.distance_point_to_point_2d<32>s;<00><00><12>w<EFBFBD><02>1<EFBFBD><05><02>1<EFBFBD><05> <0A>!<21>+<2B>r<EFBFBD>!<21>u<EFBFBD>r<EFBFBD>!<21>u<EFBFBD>}<7D><11>.B<>B<>C<>C<>Crc<00><><00>|dd<02>}|dd<02>}|dd<02>}tjtj||<05><00>|k<00><00>o*tj|tj||<05><00>k<00><00>S)z, Verify if point 'p' is between 'a' and 'b' Nr)r<00>all<6C>minimum<75>maximum)rlrmrn<00>p_2d<32>a_2d<32>b_2ds r<00>is_point_betweenzMathOps.is_point_between<65>sn<00><00><11><12>!<21><12>u<EFBFBD><04><10><12>!<21><12>u<EFBFBD><04><10><12>!<21><12>u<EFBFBD><04><11>v<EFBFBD>b<EFBFBD>j<EFBFBD><14>t<EFBFBD>,<2C>,<2C><04>4<>5<>5<>`<60>"<22>&<26><14><12><1A>TX<54>Z^<5E>I_<49>I_<49>A_<41>:`<60>:`<60>`r<00>x1<78>x2<78>x3c<00>R<00>|t||<02><00>ko|t||<02><00>kS)z9 Verify if x-axis of point 'x1' is between 'x2' and 'x3' )<02>min<69>max)r<>r<>r<>s r<00> is_x_betweenzMathOps.is_x_between<65>s)<00><00><12>S<EFBFBD><12>R<EFBFBD>[<5B>[<5B> <20>6<>R<EFBFBD>3<EFBFBD>r<EFBFBD>2<EFBFBD>;<3B>;<3B>%6<>6rc<00><><00>||z
}||z
}t<00>||<04><00>}t|d<00><00>t|d<00><00>kr|d|dz n|d|dz }|dkrtj<00>|<03><00>S|dkr"tj<00>||z
<00><00>Stj<00>|||zz
<00><00>S)z/ Distance from point p to 2d line segment 'ab' rr<00>r<00>vector_projectionrsrr/r0)rlrmrn<00>ap<61>ab<61>ad<61>ks r<00>distance_point_to_segmentz!MathOps.distance_point_to_segment<6E>s<><00><00><0F><11>U<EFBFBD><02> <0E><11>U<EFBFBD><02> <14> &<26> &<26>r<EFBFBD>2<EFBFBD> .<2E> .<2E><02>!<21><12>A<EFBFBD><15>Z<EFBFBD>Z<EFBFBD>#<23>b<EFBFBD><11>e<EFBFBD>*<2A>*<2A>4<>4<>B<EFBFBD>q<EFBFBD>E<EFBFBD>B<EFBFBD>q<EFBFBD>E<EFBFBD>M<EFBFBD>M<EFBFBD>"<22>Q<EFBFBD>%<25>"<22>Q<EFBFBD>%<25>-<2D><01> <0C><01>6<EFBFBD>6<EFBFBD><15>9<EFBFBD>><3E>><3E>"<22>%<25>%<25> %<25> <0E>!<21>V<EFBFBD>V<EFBFBD><15>9<EFBFBD>><3E>><3E>!<21>a<EFBFBD>%<25>(<28>(<28> (<28><15>9<EFBFBD>><3E>><3E>!<21>r<EFBFBD>A<EFBFBD>v<EFBFBD>,<2C>/<2F>/<2F> /r<00> ray_start<72> ray_directionc<00>r<00>||z
}t<00>||<02><00>}t|d<00><00>t|d<00><00>kr|d|dz n|d|dz }|dkrtj<00>|<03><00>Stj<00>|||zz
<00><00>S)z! Distance from point p to 2d ray rrr<><00>rlr<>r<><00>rp<72>rdr<64>s r<00>distance_point_to_rayzMathOps.distance_point_to_ray<61>s<><00><00><0F><19>]<5D><02> <14> &<26> &<26>r<EFBFBD>=<3D> 9<> 9<><02>),<2C>M<EFBFBD>!<21>,<<3C>(=<3D>(=<3D><03>M<EFBFBD>RS<52>DT<44>@U<>@U<>(U<>(U<>B<EFBFBD>q<EFBFBD>E<EFBFBD>M<EFBFBD>!<21>$<24> $<24> $<24>[]<5D>^_<>[`<60>cp<63>qr<71>cs<63>[s<><01> <0C><01>6<EFBFBD>6<EFBFBD><15>9<EFBFBD>><3E>><3E>"<22>%<25>%<25> %<25><15>9<EFBFBD>><3E>><3E>!<21>r<EFBFBD>I<EFBFBD>~<7E>"6<>7<>7<> 7rc<00><><00>||z
}t<00>||<02><00>}t|d<00><00>t|d<00><00>kr|d|dz n|d|dz }|dkr|S||zS)z! Point on ray closest to point p rr)rr<>rsr<>s r<00>closest_point_on_ray_to_pointz%MathOps.closest_point_on_ray_to_point<6E>s<><00><00><0F><19>]<5D><02> <14> &<26> &<26>r<EFBFBD>=<3D> 9<> 9<><02>),<2C>M<EFBFBD>!<21>,<<3C>(=<3D>(=<3D><03>M<EFBFBD>RS<52>DT<44>@U<>@U<>(U<>(U<>B<EFBFBD>q<EFBFBD>E<EFBFBD>M<EFBFBD>!<21>$<24> $<24> $<24>[]<5D>^_<>[`<60>cp<63>qr<71>cs<63>[s<><01> <0C><01>6<EFBFBD>6<EFBFBD><1C> <1C><15> <09>><3E> !rc<00><><00>||z
}||z
}t<00>||<05><00>}t|d<00><00>t|d<00><00>kr|d|dz n|d|dz }|dkrtj||<04><00>||zkS|dkr"tj||z
||z
<00><00>||zkS|||zz
}tj||<08><00>||zkS)zG Returns true if circle (center p, radius r) intersect 2d line segment rr)rr<>rsrrX) rlrrmrnr<>r<>r<>r<><00>dps r<00>does_circle_intersect_segmentz%MathOps.does_circle_intersect_segment<6E>s<><00><00><0F><11>U<EFBFBD><02> <0E><11>U<EFBFBD><02> <14> &<26> &<26>r<EFBFBD>2<EFBFBD> .<2E> .<2E><02>!<21><12>A<EFBFBD><15>Z<EFBFBD>Z<EFBFBD>#<23>b<EFBFBD><11>e<EFBFBD>*<2A>*<2A>4<>4<>B<EFBFBD>q<EFBFBD>E<EFBFBD>B<EFBFBD>q<EFBFBD>E<EFBFBD>M<EFBFBD>M<EFBFBD>"<22>Q<EFBFBD>%<25>"<22>Q<EFBFBD>%<25>-<2D><01> <0C><01>6<EFBFBD>6<EFBFBD><15>6<EFBFBD>"<22>b<EFBFBD>><3E>><3E>Q<EFBFBD><11>U<EFBFBD>*<2A> *<2A> <0E>!<21>V<EFBFBD>V<EFBFBD><15>6<EFBFBD>!<21>a<EFBFBD>%<25><11>Q<EFBFBD><15>'<27>'<27>1<EFBFBD>q<EFBFBD>5<EFBFBD>0<> 0<> <0E>"<22>q<EFBFBD>&<26>\<5C><02><11>v<EFBFBD>b<EFBFBD>"<22>~<7E>~<7E><11>Q<EFBFBD><15>&<26>&rc<00>r<00>tj||<01><00>}|dkr|tj||<01><00>z|z n|S)z Vector projection of a onto b r)rrX)rmrn<00>b_dots rr<>zMathOps.vector_projection s:<00><00><13><06>q<EFBFBD>!<21> <0C> <0C><05>+0<>A<EFBFBD>:<3A>:<3A>q<EFBFBD>2<EFBFBD>6<EFBFBD>!<21>Q<EFBFBD><<3C><<3C><1F>%<25>'<27>'<27>1<EFBFBD><rc<00>x<00>d<01>}||||<03><00>||||<03><00>ko||||<02><00>||||<03><00>kS)z<>
Check if 2d line segment 'ab' intersects with noncollinear 2d line segment 'cd'
Explanation: https://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/
c<00><><00>|d|dz
|d|dz
z|d|dz
|d|dz
zkS)NrrrJ)rmrn<00>cs r<00><lambda>z<MathOps.do_noncollinear_segments_intersect.<locals>.<lambda>sI<00><00>q<EFBFBD><11>t<EFBFBD>a<EFBFBD><01>d<EFBFBD>{<7B>q<EFBFBD><11>t<EFBFBD>a<EFBFBD><01>d<EFBFBD>{<7B>;<3B>q<EFBFBD><11>t<EFBFBD>a<EFBFBD><01>d<EFBFBD>{<7B>q<EFBFBD>QR<51>t<EFBFBD>VW<56>XY<58>VZ<56>{<7B>>[<5B>[<5B>rrJ)rmrnr<><00>d<>ccws r<00>"do_noncollinear_segments_intersectz*MathOps.do_noncollinear_segments_intersectsR<00><00>\<01>[<5B><03><12>s<EFBFBD>1<EFBFBD>a<EFBFBD><11>|<7C>|<7C>s<EFBFBD>s<EFBFBD>1<EFBFBD>a<EFBFBD><11>|<7C>|<7C>+<2B>L<><03><03>A<EFBFBD>q<EFBFBD>!<21> <0C> <0C><03><03>A<EFBFBD>q<EFBFBD>!<21> <0C> <0C>0L<30>Lrc<00><><00>|d|dz
}|dkrdSd|dz
|z }|dks|dkrdS|||z
|zz}d|dcxkrdkrnn|SdS)zY Computes the intersection point of 2d segment 'ab' and the opponents' goal (front line) rNg<4E><67>Q<EFBFBD>.@r<00>)\<5C><><EFBFBD>(<28><><EFBFBD>)\<5C><><EFBFBD>(<28>?rJ)rmrn<00>vec_xr<78><00>intersection_pts r<00>intersection_segment_opp_goalz%MathOps.intersection_segment_opp_goals<><00><00><12>!<21><04>q<EFBFBD><11>t<EFBFBD> <0B><05> <11>A<EFBFBD>:<3A>:<3A>d<EFBFBD>d<EFBFBD> <12>Q<EFBFBD>q<EFBFBD>T<EFBFBD>\<5C>U<EFBFBD> "<22><01> <0A>q<EFBFBD>5<EFBFBD>5<EFBFBD>A<EFBFBD><01>E<EFBFBD>E<EFBFBD>$<24>$<24><1B>q<EFBFBD>1<EFBFBD>u<EFBFBD><01>k<EFBFBD>/<2F><0F> <10>O<EFBFBD>A<EFBFBD>&<26> .<2E> .<2E> .<2E> .<2E>$<24> .<2E> .<2E> .<2E> .<2E> .<2E>"<22> "<22><17>4rc<00><><00>td|dz
<00><00>}||krdSt||z||zz
<00><00>}t|d|z
d<05><00>}t|d|zd<06><00>}||kr|S||krdS||fS)z<>
Computes the intersection segment of circle (center p, radius r) and the opponents' goal (front line)
Only the y coordinates are returned since the x coordinates are always equal to 15
<20>rNrr<>r<>)rsr r<>r<>)rlr<00>x_dev<65>y_devrxrys r<00>intersection_circle_opp_goalz$MathOps.intersection_circle_opp_goal1s<><00><00><14>B<EFBFBD><11>1<EFBFBD><14>I<EFBFBD><0E><0E><05> <10>1<EFBFBD>9<EFBFBD>9<EFBFBD><17>4<EFBFBD><14>Q<EFBFBD><11>U<EFBFBD>U<EFBFBD>U<EFBFBD>]<5D>*<2A>+<2B>+<2B><05> <10><11>1<EFBFBD><14><05><1C>u<EFBFBD> %<25> %<25><02> <10><11>1<EFBFBD><14><05><1C>t<EFBFBD> $<24> $<24><02> <0A><12>8<EFBFBD>8<EFBFBD><15>I<EFBFBD> <0F>"<22>W<EFBFBD>W<EFBFBD><17>4<EFBFBD><15>r<EFBFBD>6<EFBFBD>Mrc<00><><00>|ddkr"tj<00>|dz
<00><00>S|ddkr"tj<00>|dz
<00><00>Std|dz
<00><00>S)zA Distance between point 'p' and the opponents' goal (front line) rr<>)r<>r<>r<>)r<>r<>r<>r)rr/r0rs)rls r<00>distance_point_to_opp_goalz"MathOps.distance_point_to_opp_goalIsb<00><00> <0A>Q<EFBFBD>4<EFBFBD>%<25><<3C><<3C><15>9<EFBFBD>><3E>><3E>!<21>k<EFBFBD>/<2F>2<>2<> 2<> <0E>q<EFBFBD>T<EFBFBD>D<EFBFBD>[<5B>[<5B><15>9<EFBFBD>><3E>><3E>!<21>j<EFBFBD>.<2E>1<>1<> 1<><16>r<EFBFBD>A<EFBFBD>a<EFBFBD>D<EFBFBD>y<EFBFBD>><3E>><3E> !rT<><54><EFBFBD>&<26> .>c<00><><00><0E><0F><10><11><12><13><14><15><16>|||c\<00><15>\}}\<00><0F><10><15>z
<00><16>z
f|<06>z
|<07>z
fc\}} \}
} |
|z
| | z
c<02><13><14>dz<00>dzzdz<00>|| z|
| zz
<00>|dz<00>dzz<00>dzz
<00><11>dkrgS<00><0E><0F><10><11><12><13>fd<04><08>dkrdndD<00><00>} |s+<2B><13><14><15>fd<07>| D<00><00>} d<08>t| | <0A><00>D<00><00>} t| <0C><00>dkrt<00><11><00>|kr | dgS| S) a<> Find the points at which a circle intersects a line-segment. This can happen at 0, 1, or 2 points.
:param circle_center: The (x, y) location of the circle center
:param circle_radius: The radius of the circle
:param pt1: The (x, y) location of the first point of the segment
:param pt2: The (x, y) location of the second point of the segment
:param full_line: True to find intersections along full line - not just in the segment. False will just return intersections within the segment.
:param tangent_tol: Numerical tolerance at which we decide the intersections are close enough to consider it a tangent
:return Sequence[Tuple[float, float]]: A list of length 0, 1, or 2, where each element is a point at which the circle intercepts a line segment.
Note: We follow: http://mathworld.wolfram.com/Circle-LineIntersection.html
r<00><00>?rc <00><><00><07>g|]O}<01><03><02>z|<01>dkrdndz<00>z<00>dzzz<00>dzz z<00><04> <00>z|t<00><08><00>z<00>dzzz<00>dzz zf<02><02>PS)rrCrr<>r<00>rs) <09>.0<EFBFBD>sign<67>big_d<5F>cx<63>cy<63> discriminant<6E>dr<64>dx<64>dys <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>r<00>
<listcomp>z<MathOps.circle_line_segment_intersection.<locals>.<listcomp>ms<><00><><00>><3E>><3E>><3E><19><14>u<EFBFBD>r<EFBFBD>z<EFBFBD>D<EFBFBD>"<22>q<EFBFBD>&<26>&<26>B<EFBFBD>B<EFBFBD>a<EFBFBD>$@<40>2<EFBFBD>$E<> <0C>XZ<58>HZ<48>$Z<>Z<>^`<60>de<64>^e<>e<>e<><13><05>v<EFBFBD><02>{<7B>T<EFBFBD>C<EFBFBD><02>G<EFBFBD>G<EFBFBD>^<5E>l<EFBFBD>b<EFBFBD>6H<36>%H<>H<>B<EFBFBD>RS<52>G<EFBFBD>S<>S<>U<01>><3E>><3E>>r)rrC)rCrc<00>v<00><04>g|]5\}}t<00><03><00>t<00><04><00>kr|<01>z
<00>z n|<02>z
<00>z <00><02>6SrJr<>)r<><00>xi<78>yir<69>r<><00>p1x<31>p1ys <20><><EFBFBD><EFBFBD>rr<>z<MathOps.circle_line_segment_intersection.<locals>.<listcomp>rs\<00><><00>*k<01>*k<01>*k<01>RX<52>RT<52>VX<56>s<EFBFBD>2<EFBFBD>w<EFBFBD>w<EFBFBD><13>R<EFBFBD><17><17>'8<>'8<>R<EFBFBD>#<23>X<EFBFBD><12>O<EFBFBD>O<EFBFBD>r<EFBFBD>C<EFBFBD>x<EFBFBD>2<EFBFBD>o<EFBFBD>*k<01>*k<01>*krc<00>8<00>g|]\}}d|cxkrdk<00>nn|<01><02>S)rrrJ)r<><00>pt<70>fracs rr<>z<MathOps.circle_line_segment_intersection.<locals>.<listcomp>ts?<00><00>!N<01>!N<01>!N<01><08><02>D<EFBFBD>>?<3F>4<EFBFBD>n<EFBFBD>n<EFBFBD>n<EFBFBD>n<EFBFBD>1<EFBFBD>n<EFBFBD>n<EFBFBD>n<EFBFBD>n<EFBFBD>n<EFBFBD>"$<24>>L<>n<EFBFBD>nr)<03>zip<69>lenrs)<17> circle_center<65> circle_radius<75>pt1<74>pt2<74> full_line<6E> tangent_tol<6F>p2x<32>p2yr<79><00>y1r<31><00>y2<79> intersections<6E>fraction_along_segmentr<74>r<>r<>r<>r<>r<>r<>r<>r<>s @@@@@@@@@r<00> circle_line_segment_intersectionz(MathOps.circle_line_segment_intersectionTs<><00><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><00>,/<2F><03>]<5D>(<28>
<EFBFBD><13>c<EFBFBD>J<EFBFBD>S<EFBFBD>#<23><08><12>R<EFBFBD>!<21>B<EFBFBD>h<EFBFBD><03>b<EFBFBD><08>1<>C<EFBFBD>"<22>H<EFBFBD>c<EFBFBD>B<EFBFBD>h<EFBFBD>3G<33><1A><08><12>R<EFBFBD>(<28>2<EFBFBD>r<EFBFBD><14>r<EFBFBD>'<27>R<EFBFBD>"<22>W<EFBFBD><06><02>B<EFBFBD><10>A<EFBFBD>g<EFBFBD><02>a<EFBFBD><07><1F>B<EFBFBD> &<26><02><12>R<EFBFBD><07>"<22>r<EFBFBD>'<27>!<21><05>$<24><01>)<29>B<EFBFBD>!<21>G<EFBFBD>3<>e<EFBFBD>q<EFBFBD>j<EFBFBD>@<40> <0C> <17>!<21> <1B> <1B><15>I<EFBFBD>><3E>><3E>><3E>><3E>><3E>><3E>><3E>><3E>><3E>><3E>)+<2B>Q<EFBFBD><06><06>W<EFBFBD>W<EFBFBD>G<EFBFBD>><3E>><3E>><3E>M<EFBFBD><1D> N<01>*k<01>*k<01>*k<01>*k<01>*k<01>*k<01>*k<01>\i<>*k<01>*k<01>*k<01>&<26>!N<01>!N<01>C<EFBFBD>!<21>#9<>5;<3B>5;<3B>!N<01>!N<01>!N<01> <0A><13>=<3D>!<21>!<21>Q<EFBFBD>&<26>&<26>3<EFBFBD>|<7C>+<<3C>+<<3C> <0B>+K<>+K<>%<25>a<EFBFBD>(<28>)<29>)<29>$<24>$rc<00><><00>tj||||g<04><00>}tj|tjd<01><00>f<02><00>}tj|d|d<00><00>}tj|d|d<00><00>}tj||<07><00>\}} }
|
dkr0tjt d<06><00>t d<06><00>g<02><00>Stj||
z | |
z gt <00><00>S)a#
Returns the point of intersection of the lines passing through a2,a1 and b2,b1.
a1: [x, y] a point on the first line
a2: [x, y] another point on the first line
b1: [x, y] a point on the second line
b2: [x, y] another point on the second line
)<02>rrrr<00><00>inf)r<00>vstack<63>hstack<63>onesrrrr^) <0B>a1<61>a2<61>b1<62>b2<62>sr<00>l1<6C>l2<6C>x<>y<>zs r<00>get_line_intersectionzMathOps.get_line_intersection}s<><00><00> <0F>I<EFBFBD>r<EFBFBD>2<EFBFBD>r<EFBFBD>2<EFBFBD>&<26> '<27> '<27><01> <0E>I<EFBFBD>q<EFBFBD>"<22>'<27>&<26>/<2F>/<2F>*<2A> +<2B> +<2B><01> <0F>X<EFBFBD>a<EFBFBD><01>d<EFBFBD>A<EFBFBD>a<EFBFBD>D<EFBFBD> !<21> !<21><02> <0F>X<EFBFBD>a<EFBFBD><01>d<EFBFBD>A<EFBFBD>a<EFBFBD>D<EFBFBD> !<21> !<21><02><14>(<28>2<EFBFBD>r<EFBFBD>"<22>"<22><07><01>1<EFBFBD>a<EFBFBD> <0C><01>6<EFBFBD>6<EFBFBD><15>8<EFBFBD>U<EFBFBD>5<EFBFBD>\<5C>\<5C>5<EFBFBD><15><<3C><<3C>8<>9<>9<> 9<><11>x<EFBFBD><11>Q<EFBFBD><15><01>A<EFBFBD><05><0E><05>.<2E>.<2E>.rr<>rc<00>B<00>|tj||z|z<00><00>z|zS)aI
Based on hiperbolic tangent function, it's calculated a score between 0 and 1 (or others, depending on the parameters)
Function: a * tanh(x * c + d) + b
:param input: x value of the function
:param vertical_scaling: strech (a > 1) or compress (0 < a < 1) the function
:param horizontal_scaling: strech (c > 1) or compress (0 < c < 1) the function
:param vertical_shift: shift up (b > 0) or down (b < 0) the function
:param horizontal_shift: shift right (d < 0) or left (d > 0) the function
)r<00>tanh)<05>input<75>vertical_scaling<6E>horizontal_scaling<6E>vertical_shift<66>horizontal_shifts r<00>get_score_based_on_tanhzMathOps.get_score_based_on_tanh<6E>s+<00><00> <20>"<22>'<27>%<25>2D<32>*D<>GW<47>*W<>"X<>"X<>X<>[i<>i<>ir<00>pointc<00><><00>|\}}|dkr|dkr
tdz n
t dz St||<01><00>}t|<03><00>s|n tdz }t<00>|<03><00>S)Nrr)rrr
rrM)r<>r<>r<><00>results r<00>get_angle_to_origin_radiansz#MathOps.get_angle_to_origin_radians<6E>si<00><00><14><04><01>1<EFBFBD> <0C><01>6<EFBFBD>6<EFBFBD><1E><11>U<EFBFBD>U<EFBFBD>2<EFBFBD><01>6<EFBFBD>6<EFBFBD><12><03>a<EFBFBD><07> /<2F><16>q<EFBFBD>!<21><1B><1B><06>$<24>V<EFBFBD>}<7D>}<7D>8<><16><16>"<22>q<EFBFBD>&<26><06><16>$<24>$<24>V<EFBFBD>,<2C>,<2C>,rN)r)F)Tr<54>)r<>rr<>r)/<2F>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__<5F> staticmethodrrr"r<00>ndarrayr(r-r3r=<00>strrArrrKrMrOrQrVr\r`rdrgrkrwr^r{<00>boolr<6C>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rJrrrr s)<00><00><00><00><00><00><08><08><12>P<01>P<01><12>\<5C>P<01><12>)<29>)<29><12>\<5C>)<29><12>)<29>)<29><12>\<5C>)<29><12>(<28>(<28>"<22>*<2A>(<28>(<28>(<28><12>\<5C>(<28><12><1C>r<EFBFBD>z<EFBFBD><1C><1C><1C><12>\<5C><1C> <12><1A>b<EFBFBD>j<EFBFBD><1A><1A><1A><12>\<5C><1A> <1A>r<EFBFBD>z<EFBFBD><1A>"<22>*<2A><1A>24<32>*<2A><1A>AC<41><1A><1A><1A><1A><1A><12> <20>#<23> <20>#<23> <20> <20> <20><12>\<5C> <20><12>)<29>)<29><12>\<5C>)<29><12>)<29>)<29><12>\<5C>)<29><12>)<29>)<29><12>\<5C>)<29><12>*<2A>*<2A><12>\<5C>*<2A><12>)<29>)<29><12>\<5C>)<29><12>'<27>'<27><12>\<5C>'<27><12>:<3A>:<3A>:<3A><12>\<5C>:<3A><12>9<>9<>9<><12>\<5C>9<>
<12>U<01>U<01>U<01><12>\<5C>U<01><12>P<01>P<01>P<01><12>\<5C>P<01><12>m<01>m<01>m<01><12>\<5C>m<01><12>d<01>d<01>d<01><12>\<5C>d<01> <12>6<>"<22>*<2A>6<><12><1A>6<><02>
<EFBFBD>6<>6<>6<><12>\<5C>6<><<12>D<01>r<EFBFBD>z<EFBFBD>D<01>r<EFBFBD>z<EFBFBD>D<01>e<EFBFBD>D<01>D<01>D<01><12>\<5C>D<01>
<12>a<01>B<EFBFBD>J<EFBFBD>a<01>2<EFBFBD>:<3A>a<01>"<22>*<2A>a<01><14>a<01>a<01>a<01><12>\<5C>a<01><12>7<><12><1A>7<><12><1A>7<><12><1A>7<><04>7<>7<>7<><12>\<5C>7<>
0<>R<EFBFBD>Z<EFBFBD>0<>B<EFBFBD>J<EFBFBD>0<>2<EFBFBD>:<3A>0<>0<>0<>0<>&<12> 8<><12><1A> 8<><02>
<EFBFBD> 8<>SU<53>S]<5D> 8<> 8<> 8<><12>\<5C> 8<><12> "<22><12><1A> "<22><02>
<EFBFBD> "<22>[]<5D>[e<> "<22> "<22> "<22><12>\<5C> "<22><12>'<27><12><1A>'<27>2<EFBFBD>:<3A>'<27>"<22>*<2A>'<27>'<27>'<27><12>\<5C>'<27>(<12>=<3D>R<EFBFBD>Z<EFBFBD>=<3D>B<EFBFBD>J<EFBFBD>=<3D>=<3D>=<3D><12>\<5C>=<3D>
<12>M<01>M<01><12>\<5C>M<01><12><18><12><1A><18><02>
<EFBFBD><18><18><18><12>\<5C><18>&<12><1A><02>
<EFBFBD><1A><1A><1A><12>\<5C><1A>.<12>"<22>b<EFBFBD>j<EFBFBD>"<22>"<22>"<22><12>\<5C>"<22><12>%%<25>%%<25>%%<25><12>\<5C>%%<25>P<12>/<2F>/<2F><12>\<5C>/<2F>"<12>be<62>12<31>j<01>j<01>7<<3C>j<01>j<01>j<01><12>\<5C>j<01> <12>
-<2D>2<EFBFBD>:<3A>
-<2D>
-<2D>
-<2D><12>\<5C>
-<2D>
-<2D>
-rr)<11>mathrrrrrrr r
<00>scipy.spatial.transformr <00>numpyr<00>sys<79>_MEIPASSr@rrJrr<00><module>rs<><00><01>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>=<3D>,<2C>,<2C>,<2C>,<2C>,<2C>,<2C><12><12><12><12>
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD><15><14><1C>J<EFBFBD>J<EFBFBD><4A><15><14>J<EFBFBD>J<EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD>_-<2D>_-<2D>_-<2D>_-<2D>_-<2D>_-<2D>_-<2D>_-<2D>_-<2D>_-s<00>,<00>2