
    iH                        d Z ddlmZ ddlmZmZ d Zd Z edg d      Z edd	d
g      Z	d Z
d&dZd Zd Zd Zd ZdZdZdZdZd Zd'dZd Zd Zd Zd Zd Zd Zd Zd&dZd(dZ	 	 	 d)d Zd(d!Z d&d"Z!d# Z"d$ Z#y%)*zPygame Drawing algorithms written in Python. (Work in Progress)

Implement Pygame's Drawing Algorithms in a Python version for testing
and debugging.
    )
namedtuple)floorceilc                     | t        |       z
  S )zreturn fractional part of xr   values    X/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/pygame/draw_py.pyfracr      s    5<    c                 $    d| t        |       z
  z
  S )z#return inverse fractional part of x   r   r   s    r
   inv_fracr      s    e$%%r   BoundingBox)lefttoprightbottomPointxyc                 ,    | j                  ||f|       y)z%Set the color of a pixel in a surfaceN)set_at)surfin_xin_ycolors       r
   r   r   "   s    KKte$r   c                     	 |r| j                  |      nd}t        fdt        ||      D              }| j	                  ||       y# t        $ r Y yw xY w)z-draw one blended pixel with given brightness.)r   r   r   r   Nc              3   @   K   | ]  \  }}|z  d z
  |z  z     yw)r   N ).0colpixbrights      r
   	<genexpr>zdraw_pixel.<locals>.<genexpr>-   s,      08S#Vs*	*s   )get_at
IndexErrortuplezipr   )r   posr   r$   blend	other_col	new_colors      `   r
   
draw_pixelr.   '   s^    (-DKK$<	  <?y<Q I 	KKY  s   A	 		AAc                     ||k(  r| j                  ||f|       y ||k  r||fn||f\  }}t        ||dz         D ]  }| j                  ||f|        y Nr   r   range)r   r   x_fromr   x_tostartendline_xs           r
   _drawhorzliner8   4   sc    ~VTNE*#)T>&$f~JE3sQw' +VTNE*+r   c                     ||k(  r| j                  ||f|       y ||k  r||fn||f\  }}t        ||dz         D ]  }| j                  ||f|        y r0   r1   )r   r   r   y_fromy_tor5   r6   line_ys           r
   _drawvertliner=   >   sc    ~T6NE*#)T>&$f~JE3sQw' +T6NE*+r   c                 j   | j                         }||j                  k  s||j                  |j                  z   k\  ryt        ||j                        }t        ||j                  |j                  z   dz
        }||j                  k  s||j                  |j                  z   k\  ryt        | ||||       y)zdraw clipped horizontal line.Nr   )get_clipr   hmaxr   minwr8   )r   r   r3   r   r4   clips         r
   _clip_and_draw_horizlinerE   K   s     ==?Ddff}/ FtTVVdff_q()D dff}$&&466/1$vtT2r   c                 j   | j                         }||j                  k  s||j                  |j                  z   k\  ryt        ||j                        }t        ||j                  |j                  z   dz
        }||j                  k  s||j                  |j                  z   k\  ryt        | ||||       y)zdraw clipped vertical line.Nr   )r?   r   rC   rA   r   rB   r@   r=   )r   r   r   r:   r;   rD   s         r
   _clip_and_draw_vertlinerG   \   s     ==?Ddff}/ FtTVVdff_q()D dff}$&&466/1$tVT2r   r            c                     | d   |j                   k  t        z  | d   |j                  kD  t        z  z   | d   |j                  k  t
        z  z   | d   |j                  kD  t        z  z   S )zCreturns a code that defines position with respect to a bounding boxr   r   )r   	LEFT_EDGEr   
RIGHT_EDGEr   TOP_EDGEr   BOTTOM_EDGE)r*   b_boxs     r
   encoderQ   u   sn    
 
Q%**		)q6EKK:
-	.q6EII
)	* q6ELL K
/	0r   c                    d }d }d }t        | t              sJ | \  }}}}	|rt        nt        }
	 t	        ||f|      }t	        ||	f|      } |||      r
||||	f| dd y |||      ry ||      r||}}|	|}	}||}}||k7  r|	|z
  t        ||z
        z  nd}|t
        z  r(| |
|j                  |z
  |z        z  }|j                  }n|t        z  r(| |
|j                  |z
  |z        z  }|j                  }nk|t        z  r-||k7  r| |
|j                  |z
  |z        z  }|j                  }n5|t        z  r,||k7  r| |
|j                  |z
  |z        z  }|j                  }7)a  Algorithm to calculate the clipped line.

    We calculate the coordinates of the part of the line segment within the
    bounding box (defined by left, top, right, bottom). The we write
    the coordinates of the line segment into "line", much like the C-algorithm.
    With `use_float` True, clip_line is usable for float-clipping.

    Returns: true if the line segment cuts the bounding box (false otherwise)
    c                     |  S Nr    )codes    r
   insidezclip_line.<locals>.inside   s	    xr   c                     | xs | S rT   r    code_acode_bs     r
   acceptzclip_line.<locals>.accept   s    $f%%r   c                     | xr |S rT   r    rX   s     r
   rejectzclip_line.<locals>.reject   s     & r   TNFg      ?)
isinstancelistfloatintrQ   rL   r   rM   r   rO   r   rN   r   )linerP   	use_floatrV   r[   r]   x_1y_1x_2y_2dtypecode1code2slopes                 r
   	clip_linerl      s   &! dD!!!Cc3ECE
 Sz5)Sz5)%3S(DG% %=CCCC %5E36#:seC#I..C 95%**s*e344C**CZ5%+++u455C++C[ czuellS0E9::,,CXczueii#o677))CG r   c                     |j                   |j                   k(  rt        t        |j                  |j                  z
  |j                   |j                   z
  z        }d}|dk  r|j                   |j                   k  rF|j                   |j                   c|_         |_         |j                  |j                  c|_        |_        |j                  }|j                  |j                  k  rdnd}t	        |j                   |j                   dz         D ]%  }t        | |||       ||z  }|dk\  s||z  }|dz  }' y|j                  |j                  kD  rF|j                   |j                   c|_         |_         |j                  |j                  c|_        |_        |j                   }d|z  }|j                   |j                   k  rdnd}	t	        |j                  |j                  dz         D ]%  }t        | |||       ||z  }|dk\  s||	z  }|dz  }' y)z3draw a non-horizontal line (without anti-aliasing).g        r   g      ?N)r   
ValueErrorabsr   r2   r   )
r   r   r5   r6   rk   errorr<   dy_signr7   dx_signs
             r
   
_draw_linert      s    ww#%%SUUUWW_56EEqy 55577? UUEGGNEGSU UUEGGNEGSU#%%!b EGGSUUQY/ 	F4/UNE|'!
	 77SUU? UUEGGNEGSU UUEGGNEGSUE	#%%!b EGGSUUQY/ 	F4/UNE|'!
	r   c                     |j                   |j                   z
  }|j                  |j                  z
  }|dk(  r:|dk(  r5t         t        |j                         t        |j                               y|j                   |j                   kD  s|j                  |j                  kD  rL|j                   |j                   c|_         |_         |j                  |j                  c|_        |_        | }| }t	        |      t	        |      k\  r||z  } fd}t        |||||       y||z  } fd}t        |||||       y)a  draw an anti-aliased line.

    The algorithm yields identical results with _draw_line for horizontal,
    vertical or diagonal lines, and results changes smoothly when changing
    any of the endpoint coordinates.

    Note that this yields strange results for very short lines, eg
    a line from (0, 0) to (0, 1) will draw 2 pixels, and a line from
    (0, 0) to (0, 1.1) will blend 10 % on the pixel (0, 2).
    r   Nc           	          t        |      }t        | |f|t        |      z         t        | |dz   f|t        |      z         y r0   r   r.   r   r   )r   float_yfactorflr_yr+   r   r   s       r
   draw_two_pixelz$_draw_aaline.<locals>.draw_two_pixel  sL    'NEtdE]E6HW<M3MuUtdEAI.vW7MuUr   c           	          t        |       }t        ||f|t        |       z         t        |dz   |f|t        |       z         y r0   rw   )float_xr   ry   fl_xr+   r   r   s       r
   r{   z$_draw_aaline.<locals>.draw_two_pixel%  sL    >DtdD\5&8G;L2LeTtdQh-uftG}6LeTr   )r   r   r   ra   rp   _draw_aaline_dx_draw_aaline_dy)	r   r   r5   r6   r+   d_xd_yrk   r{   s	   ``  `    r
   _draw_aaliner      s   . %%%''/C
%%%''/C
axC1H 	tS\3uww<7ww%''CEE/dd
3x3s8c		V
 	UC?c		U
 	UC?r   c                    t        |j                        }|j                  ||j                  z
  |z  z   }|j                  |k  r3 |||z
  t        |j                        t	        |j                               t        |j                        }t        |j                        }|dkD  r#|j                  || dz   |z
  z  z   }	 ||	||       n|dz  }t        ||      D ]  }
|||
|z
  z  z   } |||
d        y Nr   r   )r   r   r   r   r   r   r2   )r   rk   r6   r5   r{   g_yg_xrests_ys_xr<   r7   s               r
   r   r   -  s    
uww-C
''S577]e+
+Cww}sU{E%''NHUWW4EF;D
suu+Caxggq400sC&qS/ *u--vvq)*r   c                    t        |j                        }|j                  ||j                  z
  |z  z   }|j                  |k  r3 |t        |j                        ||z
  t	        |j                               t        |j                        }t        |j                        }|dkD  r#|j                  || dz   |z
  z  z   }	 |||	|       n|dz  }t        ||      D ]  }
|||
|z
  z  z   } ||
|d        y r   )r   r   r   r   r   r   r2   )r   rk   r6   r5   r{   r   r   r   r   r   r7   r<   s               r
   r   r   A  s     uww-C
''S577]e+
+Cww}uUWW~sU{HUWW4EF;D
suu+Caxggq400sC&qS/ *u--vvq)*r   c           
         t        |t        |j                  |j                  |j                  |j                  z   dz
  |j                  |j
                  z   dz
              sy|d   |d   k(  rt        | ||d   |d   |d          y|d   |d   k(  rt        | ||d   |d   |d          yt        | |t        |d   |d         t        |d   |d                y)znclip the line into the rectangle and draw if needed.

    Returns true if anything has been drawn, else false.r   r      rH   )
rl   r   r   r   rC   r@   r8   r=   rt   r   )r   rectr   ptss       r
   _clip_and_draw_liner   _  s     [$&&1)<dfftvvoPQ>QR 
1vQdE3q63q63q6:
 	 
Q3q6	dE3q63q63q6:  	4c!fc!f 5uSVSV7LMr   c                 b   dx}}t        |d   |d   z
        t        |d   |d   z
        kD  rd}nd}|d d  }t        | |||      rd}|d d  }	nd}g d}	t        d|dz  dz         D ]E  }
|d   ||
z  z   |d<   |d   ||
z  z   |d<   |d   ||
z  z   |d<   |d   ||
z  z   |d<   t        | |||      rVd}t        |d   |	d         |	d<   t        |d   |	d         |	d<   t	        |d   |	d         |	d<   t	        |d   |	d         |	d<   |
dz  |k  s|d   ||
z  z
  |d<   |d   ||
z  z
  |d<   |d   ||
z  z
  |d<   |d   ||
z  z
  |d<   t        | |||      sd}t        |d   |	d         |	d<   t        |d   |	d         |	d<   t	        |d   |	d         |	d<   t	        |d   |	d         |	d<   H |S )Nr   rH   r   r   )'  r   r   )rp   r   r2   rB   rA   )r   r   r   rb   widthyincxincnewptsanydrawnframeloops              r
   _clip_and_draw_line_widthr   t  s7   OD4
47T!WDGd1g$5 66!WF4uf5q	.a!a( 4GdTk)q	GdTk)q	GdTk)q	GdTk)q	tT5&9H6!9eAh/E!H6!9eAh/E!H6!9eAh/E!H6!9eAh/E!H!8eQ$+-F1IQ$+-F1IQ$+-F1IQ$+-F1I"4uf=vay%(3avay%(3avay%(3avay%(3a-40 Or   c           
      (   t        |t        |j                  dz
  |j                  dz
  |j                  |j                  z   |j                  |j
                  z         d      syt        | |t        |d   |d         t        |d   |d         |       y)-draw anti-aliased line between two endpoints.r   T)rc   Nr   rH   r   )rl   r   r   r   rC   r@   r   r   )r   r   r   rb   r+   s        r
   _clip_and_draw_aaliner     s}    DFFQJ
DFFTVVOTVVdff_M
 	ueDGT!W5uT!Wd1g7NPUV
r   c                 `    |d   |d   |d   |d   g}t        | | j                         |||      S r   r   r   )r   r?   )r   r   
from_pointto_pointr+   rb   s         r
   draw_aaliner     s9    qM:a=(1+x{CD t}}tUKKr   c                 `    |d   |d   |d   |d   g}t        | | j                         |||      S r   )r   r?   )r   r   r   r   r   rb   s         r
   	draw_liner     s9    qM:a=(1+x{CD$T4==?E4OOr   c                 v   t        |      dk  rt        dgdz  }|D cg c]  }|d   	 }	}|D cg c]  }|d   	 }
}|	d   |d<   |
d   |d<   t        |	d   |	d   |
d   |
d         }|dd D ]q  \  }}t        |j                  |      |_        t        |j                  |      |_        t        |j                  |      |_        t        |j                  |      |_        s | j                         }t        dt        |            D ]I  }|	|dz
     |d<   |
|dz
     |d<   |	|   |d<   |
|   |d<   |rt        | ||||       ;t        | ||||       K |rZ|	t        |      dz
     |d<   |
t        |      dz
     |d<   |	d   |d<   |
d   |d<   |rt        | ||||       yt        | ||||       yyc c}w c c}w )z/draw several lines, either anti-aliased or not.rH   r   rI   r   )r   r   r   r   Nr   )len	TypeErrorr   rB   r   rA   r   r   r   r?   r2   r   r   )r   r   closedpointsr   r+   aalinerb   ptxlistylistrP   r7   r<   r   r   s                   r
   _multi_linesr     s    6{a37D#$rRU$E$#$rRU$E$AhDGAhDGU1XU1X58ERSHUE * 1V,
%++v.		6*	5<<0	1 ==?DaV% Fq/Qq/Q+Q+Q!$eT5A%dD%uEF Fa(QFa(Q(Q(Q!$eT5A%dD%uE / %$s
   F1F6c                 $    t        | ||||d      S )z0draw several lines connected through the points.F)r   r   )r   r   r   r   r   s        r
   
draw_linesr     s    eVVU5IIr   c                 $    t        | ||||d      S )z=draw several anti-aliased lines connected through the points.T)r+   r   r   )r   r   r   r   r+   s        r
   draw_aalinesr     s    eVV5NNr   c                    |rt        | |d||       yt        |      }|D cg c]  \  }}|	 }}}|D cg c]  \  }}|	 }}}t        |      }	t        |      }
|	|
k(  r&t        |      }t        |      }t	        | |||	|       yt        |	|
dz         D ]f  }g }t        |      D ]  }t        |||||        |j                          t        dt        |      d      D ]  }t	        | |||   |||dz              h t        |      D ]A  }|r|dz
  n|dz
  }|	||   cxk  r||   cxk(  r|
k  s'n *t	        | |||   ||   ||          C yc c}}w c c}}w )zDraw a polygonr   Nr   rH   )r   r   rB   rA   rE   r2   _draw_polygon_inner_loopsort)surfacer   r   r   
num_pointsr   r   point_xpoint_yminymaxyminxmaxxy_coordx_intersectii_prevs                    r
   draw_polygonr     s   7E1fe4VJ#$TQq$G$#$TQq$G$w<Dw<Dt|7|7| %tTBtax( 	z" 	PA$Q';O	P 	q#k*A. 	A$AQU9K		 : Qa'!*66$6$
GAJ ? %$s
   EEc                 "   | r| dz
  nt        |      dz
  }||   }||    }||k  r||   }||    }	n||kD  r||   }||    }||   }	||    }ny ||cxkD  r|k\  sn |t        |      k(  r*||k  r$|j                  ||z
  |	|z
  z  ||z
  z  |z          y y y r0   )r   rA   append)
indexr   r   r   r   r   re   rg   rd   rf   s
             r
   r   r      s    UQYS\A%5F
&/C
%.C
Syfoen	sfoenfoeng7c'l#:CGcMcCi8S3YG#MN BP#:r   N)T)F)r   )r   FF)$__doc__collectionsr   mathr   r   r   r   r   r   r   r.   r8   r=   rE   rG   rL   rM   rO   rN   rQ   rl   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r
   <module>r      s    #  
&
 (JK7S#J'%

 ++3"3& 	
	;|1h7@t*(*<*&R	LP 
.FfJ
O
%POr   