
    W^h

                    r    d Z ddlmZ ddlZddlmZmZ d-d
Zd.dZd/dZ	d/dZ
d0dZd1dZ	 d2d3d%Zd4d,ZdS )5z/
Utility helpers shared across server modules.
    )annotationsN)TupleOptionalvfloatlohireturnc                >    t          |t          ||                     S N)maxmin)r   r   r	   s      -/root/workspace/PixelWarzone/backend/utils.pyclampr   
   s    r3r1::    abtc                    | || z
  |z  z   S r    )r   r   r   s      r   lerpr      s    A{?r   x1y1x2y2c                8    t          j        || z
  ||z
            S r   mathhypot)r   r   r   r   s       r   distancer       s    :b2grBw'''r   c                ,    || z
  }||z
  }||z  ||z  z   S r   r   )r   r   r   r   dxdys         r   distance_sqr$      s'    	bB	bB7R"Wr   xyTuple[float, float]c                P    t          j        | |          }|dk    rdS | |z  ||z  fS )Nr   )        r)   r   )r%   r&   ns      r   	normalizer+      s3    
1aAAvvxq5!a%<r   pxpyc                0   ||z
  }||z
  }|dk    r!|dk    rt          j        | |z
  ||z
            S | |z
  |z  ||z
  |z  z   ||z  ||z  z   z  }t          dt          d|                    }|||z  z   }	|||z  z   }
t          j        | |	z
  ||
z
            S )zCompute the minimum distance from point (px, py) to the line segment [(x1, y1), (x2, y2)].

    Used by Iaido path checks and wall/block interactions.
    r   r)         ?)r   r   r   r   )r,   r-   r   r   r   r   r"   r#   r   proj_xproj_ys              r   _dist_point_to_segmentr2   $   s    
 
bB	bB	Qww277z"r'27+++
r'R27b.	(R"WrBw->?ACS!A!b&[F!b&[F:b6k2;///r   cxcyrrcxrcyhalf_whalf_hOptional[float]boolc                    ||}t          | ||z
  ||z             }t          |||z
  ||z             }t          | |||          |k     S )u   圆( cx,cy,r ) 与 轴对齐矩形(中心 rcx,rcy, 半宽/半高) 是否相交。
    当 half_h 为空时，使用正方形半边长 half_w。
    )r   r    )	r3   r4   r5   r6   r7   r8   r9   	closest_x	closest_ys	            r   circle_aabb_overlapr?   4   sY     ~b#,f55Ib#,f55IBIy11A55r   oxoydirxdiryradiushalf_angle_radc                    | |z
  }||z
  }	t          j        ||	          }
|
|k    rdS t          ||          \  }}|dk    r|dk    rdS ||z  |	|z  z   |
pdz  }|t          j        |          k    S )u   判断点 (px,py) 是否位于以 (ox,oy) 为圆心，朝向(dirx,diry)，半角为 half_angle_rad，半径为 radius 的扇形内。Fr   r/   )r   r   r+   cos)r,   r-   r@   rA   rB   rC   rD   rE   vxvydistndxndy	cos_thetas                 r   	in_sectorrN   B   s    
 
bB	bB:b"Df}}ut$$HC
axxC1HHucBH$5I0000r   )r   r   r   r   r	   r   r
   r   )r   r   r   r   r   r   r
   r   )
r   r   r   r   r   r   r   r   r
   r   )r%   r   r&   r   r
   r'   )r,   r   r-   r   r   r   r   r   r   r   r   r   r
   r   r   )r3   r   r4   r   r5   r   r6   r   r7   r   r8   r   r9   r:   r
   r;   )r,   r   r-   r   r@   r   rA   r   rB   r   rC   r   rD   r   rE   r   r
   r;   )__doc__
__future__r   r   typingr   r   r   r   r    r$   r+   r2   r?   rN   r   r   r   <module>rR      s     # " " " " "  " " " " " " " "      ( ( ( (      0 0 0 0$ BF6 6 6 6 61 1 1 1 1 1r   