
    CPcyl                        d Z ddlmZ ddlZddlZddlZdZdZ G d de          Z	 G d d	e          Z
d
 ZefdZ G d de	          Z G d de          Z G d de	          Z G d de          Z G d de          Z G d de          Zd Zd Zedk    rB ej        ej        dd         d          \  ZZdZ e
            Zde_        eD ]IZed         dk    rde_        ed         dk    rde_        ed         dk    rde_        ed         d k    rdZJesg Z ej!        Z" e#e          dk    r e$ed         d!          Z"e"D ]WZ%e%&                                Z' e(e'd                   Z) e(e'd                   Z*e +                     ee)e*                     X e#e          dk    re",                                  ee           Z- ee-e           dS dS )"a\  
voronoi - compute Voronoi diagram or Delaunay triangulation

voronoi [-t -p -d]  [filename]

Voronoi reads from filename (or standard input if no filename given) for a set
of points in the plane and writes either the Voronoi diagram or the Delaunay
triangulation to the standard output.  Each input line should consist of two
real numbers, separated by white space.

If option -t is present, the Delaunay triangulation is produced.
Each output line is a triple i j k, which are the indices of the three points
in a Delaunay triangle. Points are numbered starting at 0.

If option -t is not present, the Voronoi diagram is produced.
There are four output record types.

s a b      indicates that an input point at coordinates a b was seen.
l a b c    indicates a line with equation ax + by = c.
v a b      indicates a vertex at a b.
e l v1 v2  indicates a Voronoi segment which is a subsegment of line number l
           with endpoints numbered v1 and v2.  If v1 or v2 is -1, the line
           extends to infinity.

Other options include:

d    Print debugging info

p    Produce output suitable for input to plot (1), rather than the forms
     described above.

On unsorted data uniformly distributed in the unit square, voronoi uses about
20n+140 bytes of storage.

AUTHOR
Steve J. Fortune (1987) A Sweepline Algorithm for Voronoi Diagrams,
Algorithmica 2, 153-174.
    )print_functionNg&.>g*Gc                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
CmpMixinz"Upgrade python2 cmp to python3 cmpc                      t          d          )Nz$Shouldn't there be a __cmp__ method?)NotImplementedErrorselfothers     )/usr/share/inkscape/extensions/voronoi.py__cmp__zCmpMixin.__cmp__l   s    !"HIII    c                 4    |                      |          dk    S Nr   r   r   s     r   __eq__zCmpMixin.__eq__o       ||E""a''r   c                 4    |                      |          dk    S r   r   r   s     r   __ne__zCmpMixin.__ne__r   r   r   c                 4    |                      |          dk    S )Nr   r   s     r   __lt__zCmpMixin.__lt__u   s    ||E""b((r   c                 0    |                      |          dv S )N)r   r   r   r   s     r   __le__zCmpMixin.__le__x   s    ||E""g--r   c                 4    |                      |          dk    S N   r   r   s     r   __gt__zCmpMixin.__gt__{   r   r   c                 0    |                      |          dv S )N)r   r   r   r   s     r   __ge__zCmpMixin.__ge__~   s    ||E""f,,r   N)__name__
__module____qualname____doc__r   r   r   r   r   r   r    r   r   r   r   i   s        ,,J J J( ( (( ( () ) ). . .( ( (- - - - -r   r   c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )Contextc                 v    d| _         d| _        d| _        d| _        g | _        g | _        g | _        g | _        d S )Nr   F)doPrintdebugplottriangulateverticeslinesedges	trianglesr	   s    r   __init__zContext.__init__   sI    
	  	
  	
 r   c                     d S Nr$   )r	   xyrads       r   circlezContext.circle       r   c                     d S r3   r$   r	   edges     r   	clip_linezContext.clip_line   r8   r   c                     d S r3   r$   )r	   x0y0x1y1s        r   linezContext.line   r8   r   c                    | j         r&t          d|j        |j        |j        fz             d S | j        rd S | j        r(|                     |j        |j        t                     d S | j	        r t          d|j        |j        fz             d S d S )Nzsite (%d) at %f %fzs %f %f)
r)   printsitenumr4   r5   r+   r*   r7   cradiusr(   r	   ss     r   outSitezContext.outSite   s    : 	*&!)QS!#)>>????? 	*DY 	*KKQS'*****\ 	*)qsACj()))))	* 	*r   c                    | j                             |j        |j        f           | j        r&t          d|j        |j        |j        fz             d S | j        rd S | j        r'| j	        s"t          d|j        |j        fz             d S d S d S )Nzvertex(%d) at %f %fzv %f %f)
r,   appendr4   r5   r)   rD   rE   r+   r(   r*   rG   s     r   	outVertexzContext.outVertex   s    ac13Z(((: 	*'19ac13*??@@@@@ 	*D\ 	*$) 	*)qsACj()))))	* 	* 	* 	*r   c                 6   | j                             |j        |j        |j        f           | j        r&t	          d|j        |j        |j        fz             d S | j        r4| j        r/| j        s*t	          d|j        |j        |j        fz             d S d S d S d S )Nz)circle through left=%d right=%d bottom=%dz%d %d %d)r/   rK   rE   r)   rD   r+   r(   r*   )r	   s1s2s3s       r   	outTriplezContext.outTriple   s    rz2:rzBCCC: 	E;:rz2:67      	E$, 	Ety 	E*
BJ
CCDDDDD	E 	E 	E 	E 	E 	Er   c           
      H   | j                             |j        |j        |j        f           | j        rNt          d|j        |j        |j        |j        |j        d         j	        |j        d         j	        fz             d S | j
        rc| j        rZ|                     |j        d         j        |j        d         j        |j        d         j        |j        d         j                   d S d S | j        r-| j        s(t          d|j        |j        |j        fz             d S d S d S )Nz$line(%d) %gx+%gy=%g, bisecting %d %dr   r   z
l %f %f %f)r-   rK   abcr)   rD   edgenumregrE   r+   r*   rB   r4   r5   r(   r:   s     r   outBisectorzContext.outBisector   s4   
4646462333: 	;6LFFFHQK'HQK'
 
 
 
 
  	;y V		$(1+-!txPQ{}UUUUUV V\ 	;$) 	;,$&$&$&!99:::::	; 	; 	; 	;r   c                    d}|j         t          j                 |j         t          j                 j        }d}|j         t          j                 |j         t          j                 j        }| j                            |j        ||f           | j        sf| j	        r| 
                    |           d S | j        rCt          d|j        z  d           t          d|z  d           t          d|z             d S d S d S )Nr   ze %d endz %d z%d)epEdgeLErE   REr.   rK   rV   r+   r*   r<   r(   rD   )r	   r;   sitenumLsitenumRs       r   outEdgezContext.outEdge   s    747'wtw'/H747'wtw'/H
4<8<=== 	'y 't$$$$$ 'ft|+5555fx'S1111dXo&&&&&	' 	'' 'r   N)r    r!   r"   r1   r7   r<   rB   rI   rL   rQ   rX   rc   r$   r   r   r&   r&      s                * * ** * *E E E; ; ;(' ' ' ' 'r   r&   c                 4   t          | j        | j        t          |                     }t	          | j        | j        t          |                     }|                                 }|                                }|	                    |           |                                }t          t           t                     }	 |                                s|                                }|r|                                s||k     r|	                    |           |                    |          }|j        }	|                    |          }
t"                              |
|          }|                    |           t)          |t"          j                  }|                    ||           |                    |          }|?|                    |           |                    |||                    |                     |}t)          |t"          j                  }|                    ||           |                    |	          }|*|                    |||                    |                     |                                }n|                                s|                                }|j        }|j        }	|	j        }|                    |          }
|	                    |          }|                    |          }|                    |
||           |j        }|                      |           |!                    |           |j"        #                    |j$        |          r|%                    |j"                   |	j"        #                    |	j$        |          r|%                    |	j"                   |                    |           |                    |	           |                    |	           t"          j        }|
j&        |j&        k    r||
}}
t"          j        }t"                              |
|          }|                    |           t)          ||          }|                    ||           |#                    t"          j        |z
  |          r|%                    |           |                    |          }|?|                    |           |                    |||
                    |                     |                    |          }|*|                    |||
                    |                     nn|j'        j        }||j(        ur,|%                    |j"                   |j        }||j(        u*d S d S r3   ))EdgeListxminxmaxlenPriorityQueueyminymaxiteratornextrI   Site	BIG_FLOATisEmptygetMinPtleftbndrightrightregr^   bisectrX   Halfedger_   insert	intersectdeletedistancer`   popMinHalfedgeleftleftregrQ   vertexsetSiteNumberrL   r;   setEndpointpmrc   r5   leftendrightend)siteListcontextedgeList	priorityQsiteIter
bottomsitenewsiteminptlbndrbndbotr;   bisectorpllbndrrbndtopmidvr   hes                        r   voronoir      s   x}c(mmDDHhmX]CMMJJI  ""HJOOJmmooG)iZ((Ew  "" 	)&&((E s		))++ s	wOOG$$$ ##G,,D:D --
++C;;sG,,D%%%
  dg..HOOD(+++ x((A}  &&&  q'*:*:1*=*=>>> Ddg..HOOD(+++ ""4((A}  1g.>.>q.A.ABBBmmooGG""$$ J	 ++--DIE:DJE ,,z**C--
++C --
++Cc3,,, A""1%%%a    y$$TWa00 +	***y$$TWa00 +	*** OOD!!!T"""OOD!!! Busu}}SW ;;sC((D%%%  b))H OOE8,,,"a00 &%%% ))A}  '''  3<<??;;; ""5))A}  1cll1oo>>>owr 
		B
H%
%
%   X H%
%
%
%
%
%
%r   c                     t          t          |           t          |                    }||k     pt          | |z
            ||z  k     S r3   )maxabs)rS   rT   relativeErrornorms       r   isEqualr   g  sA    s1vvs1vvD= Jc!a%jjMD4H&IJr   c                   (    e Zd ZddZd Zd Zd ZdS )	rn           r   c                 0    || _         || _        || _        d S r3   )r4   r5   rE   )r	   r4   r5   rE   s       r   r1   zSite.__init__o  s    r   c                 N    t          d| j        | j        | j        fz             d S )NzSite #%d (%g, %g))rD   rE   r4   r5   r0   s    r   dumpz	Site.dumpt  s)    !T\4646$BBCCCCCr   c                     | j         |j         k     rdS | j         |j         k    rdS | j        |j        k     rdS | j        |j        k    rdS dS )Nr   r   r   )r5   r4   r   s     r   r   zSite.__cmp__w  sW    6EG2Veg1Veg2Veg1qr   c                 x    | j         |j         z
  }| j        |j        z
  }t          j        ||z  ||z  z             S r3   )r4   r5   mathsqrt)r	   r
   dxdys       r   rz   zSite.distance  s;    VegVegyb27*+++r   N)r   r   r   )r    r!   r"   r1   r   r   rz   r$   r   r   rn   rn   n  sX           
D D D	 	 	, , , , ,r   rn   c                   F    e Zd ZdZdZdZi Zd Zd Zd Z	e
d             ZdS )r^   r   r   c                 b    d| _         d| _        d| _        d d g| _        d d g| _        d| _        d S )Nr   r   )rS   rT   rU   r]   rW   rV   r0   s    r   r1   zEdge.__init__  s8    ,$<r   c                     t          d| j        | j        | j        | j        fz             t          d| j                   t          d| j                   d S )Nz(#%d a=%g, b=%g, c=%g)r]   rW   )rD   rV   rS   rT   rU   r]   rW   r0   s    r   r   z	Edge.dump  sQ    &$,)OOPPPdDGeTXr   c                 R    || j         |<   | j         t          j        |z
           dS dS )NFT)r]   r^   r`   )r	   lrFlagsites      r   r   zEdge.setEndpoint  s+    747V#$,5tr   c                 P   t                      }| |j        d<   ||j        d<   t          |j        | j        z
            }t          |j        | j        z
            }t          |          }t          |          }t          | j        |z  | j        |z  z   ||z  ||z  z   dz  z             |_        ||k    r"d|_        ||z  |_        |xj        |z  c_        n)d|_        |dk    rd}||z  |_        |xj        |z  c_        t           j	        |_
        t           xj	        dz  c_	        |S )Nr   r   g      ?      ?g{Gz?)r^   rW   floatr4   r5   r   rU   rS   rT   EDGE_NUMrV   )rN   rO   newedger   r   adxadys          r   ru   zEdge.bisect  s   &&AA 24"$;24"$;"gg"gg "$)bdRi/27R"W3D2KKLL	99GIRGIIIOIII GIQwwRGIIIOII-r   N)r    r!   r"   r_   r`   r   DELETEDr1   r   r   staticmethodru   r$   r   r   r^   r^     sp        	
B	
BHG    
     \  r   r^   c                   H    e Zd Zdej        fdZd Zd Zd Zd Z	d Z
d ZdS )	rv   Nc                 r    d | _         d | _        d | _        || _        || _        d | _        t          | _        d S r3   )r|   rs   qnextr;   r   r~   ro   ystar)r	   r;   r   s      r   r1   zHalfedge.__init__  s7    	

	


r   c                 x   t          d           t          d| j                   t          d| j                   t          d| j                   t          d| j                   t          dd           | j        r| j                                         nt          d	           t          d
| j                   d S )Nz"Halfedge--------------------------zleft: zright: zedge: zpm: zvertex: rZ   r[   Nonezystar: )rD   r|   rs   r;   r   r~   r   r   r0   s    r   r   zHalfedge.dump  s    2333h	"""i$$$h	"""fdgjc""""; 	K&MMMi$$$$$r   c                     | j         |j         k    rdS | j         |j         k     rdS | j        j        |j        j        k    rdS | j        j        |j        j        k     rdS dS )Nr   r   r   )r   r~   r4   r   s     r   r   zHalfedge.__cmp__  s_    :##1Z%+%%2[]U\^++1[]U\^++21r   c                     | j         s|S | j        t          j        k    r| j         j        t          j                 S | j         j        t          j                 S r3   r;   r   r^   r_   rW   r`   r	   defaults     r   r}   zHalfedge.leftreg  B    y 	*NW9=))9=))r   c                     | j         s|S | j        t          j        k    r| j         j        t          j                 S | j         j        t          j                 S r3   r   r   s     r   rt   zHalfedge.rightreg  r   r   c                 L   | j         }|j        d         }|j        |j        k    }|r| j        t          j        k    rdS |s| j        t          j        k    rdS |j        dk    r|j        |j        z
  }|j        |j        z
  }d}|s|j	        dk     s|r|j	        dk    r||j	        |z  k    }|}n2|j        |j        |j	        z  z   |j
        k    }|j	        dk     r| }|sd}|s^|j        |j        d         j        z
  }	|j	        ||z  ||z  z
  z  |	|z  dd|z  |	z  z   |j	        |j	        z  z   z  k     }|j	        dk     r| }nL|j
        |j        |j        z  z
  }
|j        |
z
  }|j        |j        z
  }|
|j        z
  }||z  ||z  ||z  z   k    }| j        t          j        k    r|S | S )Nr   TFr   r   r   g       @)r;   rW   r4   r   r^   r_   r`   rS   r5   rT   rU   )r	   ptetopsiteright_of_sitedypdxpfastabovedxsylt1t2t3s                 r   isPointRightOfzHalfedge.isPointRightOf  s   I%(wy( 	TW//4 	DG!3!353#::$"C$"CD! acCii]iqsczzqsSy(rtacz)AC/399 %IE D &i158,.sSy3945c	#)c/)AC!#I59  399 %IEqsRTz!BB	!BgiBGb2gR//E7dgL9r   c                 B   | j         }|j         }||d S |j        d         |j        d         u rd S |j        |j        z  |j        |j        z  z
  }t	          |d          rd S |j        |j        z  |j        |j        z  z
  |z  }|j        |j        z  |j        |j        z  z
  |z  }|j        d         |j        d         k     r| }|}n|}|}||j        d         j        k    }	|	r|j        t          j	        k    s|	s|j        t          j
        k    rd S t          ||          S )Nr   r   )r;   rW   rS   rT   r   rU   r4   r   r^   r_   r`   rn   )
r	   r
   e1e2dxintyintr   r   rightOfSites
             r   rx   zHalfedge.intersect'  s(   YZJBJ4 6!9q	!!4D24K"$+%1c?? 	4rtbdRTk)Q.rtbdRTk)Q.6!9rvay  BAABAaeAhj( 	BETW,,k,betwFVFV4 D$r   )r    r!   r"   r^   r_   r1   r   r   r}   rt   r   rx   r$   r   r   rv   rv     s         TW    % % %
 
 
* * ** * *) ) )Z         r   rv   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )re   c                    ||k    r||}}t          dt          j        |dz             z            | _        || _        t          ||z
            | _        d g| j        z  | _        t                      | _	        t                      | _
        | j
        | j	        _        | j	        | j
        _        | j	        | j        d<   | j
        | j        d<   d S )N      r   r   )intr   r   hashsizerf   r   deltaxhashrv   r   r   rs   r|   )r	   rf   rg   nsitess       r   r1   zEdgeList.__init__I  s    $;;t$DA	&1* 5 5566	D4K((FT]*	zz 

!]!\|	!	"r   c                 R    ||_         |j        |_        ||j        _         ||_        d S r3   )r|   rs   )r	   r|   r   s      r   rw   zEdgeList.insertY  s&    :



r   c                 l    |j         |j        _         |j        |j         _        t          j        |_        d S r3   )rs   r|   r^   r   r;   )r	   r   s     r   ry   zEdgeList.delete_  s%    ,r   c                     |dk     s|| j         k    rd S | j        |         }||j        t          j        ur|S d | j        |<   d S r   )r   r   r;   r^   r   )r	   rT   r   s      r   gethashzEdgeList.gethashe  sQ    q55A&&4Yq\:44I 	!tr   c                    t          |j        | j        z
  | j        z  | j        z            }|dk     rd}|| j        k    r
| j        dz
  }|                     |          }|?d}	 |                     ||z
            }|n!|                     ||z             }|n|dz  }<|| j        u s|| j        urg|                    |          rR|j	        }|| j        ur:|                    |          r%|j	        }|| j        ur|                    |          %|j
        }nJ|j
        }|| j        ur:|                    |          s%|j
        }|| j        ur|                    |          %d|cxk     r| j        dz
  k     rn n
|| j        |<   |S Nr   r   )r   r4   rf   r   r   r   r   r   r   rs   r|   r   )r	   r   bucketr   is        r   rr   zEdgeList.leftbndp  s   rtdi'4;6FHHA::FT]""]Q&F\\&!!:A\\&1*-->\\&1*-->Q $,Bdm$;$;@Q@QRT@U@U$;BDM))b.?.?.C.C)X DM))b.?.?.C.C)BBBDL((1B1B21F1F(W DL((1B1B21F1F( v)))))))))) "DIf	r   N)r    r!   r"   r1   rw   ry   r   rr   r$   r   r   re   re   H  s_        & & &     	 	 	$ $ $ $ $r   re   c                   >    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	S )
ri   c                    || _         ||z
  | _        t          dt          j        |          z            | _        d| _        d| _        g | _        t          | j                  D ](}| j        
                    t                                 )d S )Nr   r   )rj   deltayr   r   r   r   countminidxr   rangerK   rv   )r	   rj   rk   r   r   s        r   r1   zPriorityQueue.__init__  s    	TkA	& 1 1122
	t}%% 	) 	)AIXZZ((((	) 	)r   c                     | j         S r3   r   r0   s    r   __len__zPriorityQueue.__len__  s
    zr   c                     | j         dk    S r   r   r0   s    r   rp   zPriorityQueue.isEmpty  s    zQr   c                     ||_         |j        |z   |_        | j        |                     |                   }|j        }|||k    r|}|j        }|||k    |j        |_        ||_        | xj        dz  c_        d S r   )r~   r5   r   r   	getBucketr   r   )r	   r   r   offsetlastnxts         r   rw   zPriorityQueue.insert  s    	6F?y++,jBHHD*C BHH :


a



r   c                     |j         ^| j        |                     |                   }|j        |ur|j        }|j        |u|j        |_        | xj        dz  c_        d |_         d S d S r   )r~   r   r   r   r   )r	   r   r   s      r   ry   zPriorityQueue.delete  sp    9 9T^^B//0D*B&&z *B&&DJJJ!OJJBIII ! r   c                     t          |j        | j        z
  | j        z  | j        z            }|dk     rd}|| j        k    r
| j        dz
  }|| j        k     r|| _        |S r   )r   r   rj   r   r   r   )r	   r   r   s      r   r   zPriorityQueue.getBucket  sf    rx$)+t{:dmKLLA::FT]""]Q&FDK DKr   c                     | j         | j                 j        '| xj        dz  c_        | j         | j                 j        '| j         | j                 j        }|j        j        }|j        }t          ||          S r   )r   r   r   r~   r4   r   rn   )r	   r   r4   r5   s       r   rq   zPriorityQueue.getMinPt  sg    i$*2KK1KK i$*2Yt{#)IKHAqzzr   c                     | j         | j                 j        }|j        | j         | j                 _        | xj        dz  c_        |S r   )r   r   r   r   )r	   currs     r   r{   zPriorityQueue.popMinHalfedge  s:    y%+'+z	$+$

a

r   N)r    r!   r"   r1   r   rp   rw   ry   r   rq   r{   r$   r   r   ri   ri     s        ) ) )    
 
 
          r   ri   c                       e Zd Zd Zd Z G d de          Zd Zd Zd Z	d Z
d	 Zd
 Zd Z ee
          Z ee          Z ee          Z ee          ZdS )SiteListc                 T   g | _         d| _        |d         j        | _        |d         j        | _        |d         j        | _        |d         j        | _        t          |          D ]\  }}| j         	                    t          |j        |j        |                     |j        | j        k     r|j        | _        |j        | j        k     r|j        | _        |j        | j        k    r|j        | _        |j        | j        k    r|j        | _        | j                                          d S r   )_SiteList__sites_SiteList__sitenumr4   _SiteList__xminr5   _SiteList__ymin_SiteList__xmax_SiteList__ymax	enumeraterK   rn   sort)r	   	pointListr   r   s       r   r1   zSiteList.__init__  s    lnlnlnlny)) 		# 		#EArLRT24 3 3444tdk!! dtdk!! dtdk!! dtdk!! dr   c                 >    | j         |_        | xj         dz  c_         d S r   )r  rE   )r	   r   s     r   r   zSiteList.setSiteNumber  s    ~!r   c                        e Zd Zd Zd Zd ZdS )SiteList.Iteratorc                 (    d |D             | _         d S )Nc              3      K   | ]}|V  d S r3   r$   ).0rH   s     r   	<genexpr>z-SiteList.Iterator.__init__.<locals>.<genexpr>  s"      --Aa------r   )	generator)thislsts     r   r1   zSiteList.Iterator.__init__  s    -----DNNNr   c                     | S r3   r$   r  s    r   __iter__zSiteList.Iterator.__iter__  s    Kr   c                 N    	 t          | j                  S # t          $ r Y d S w xY wr3   )rm   r  StopIterationr  s    r   rm   zSiteList.Iterator.next  s9    DN+++    tts    
$$N)r    r!   r"   r1   r  rm   r$   r   r   Iteratorr    sA        	. 	. 	.	 	 		 	 	 	 	r   r  c                 @    t                               | j                  S r3   r  r  r  r0   s    r   rl   zSiteList.iterator        ...r   c                 @    t                               | j                  S r3   r  r0   s    r   r  zSiteList.__iter__  r  r   c                 *    t          | j                  S r3   )rh   r  r0   s    r   r   zSiteList.__len__  s    4<   r   c                     | j         S r3   )r  r0   s    r   _getxminzSiteList._getxmin  
    {r   c                     | j         S r3   )r  r0   s    r   _getyminzSiteList._getymin
  r#  r   c                     | j         S r3   )r  r0   s    r   _getxmaxzSiteList._getxmax  r#  r   c                     | j         S r3   )r  r0   s    r   _getymaxzSiteList._getymax  r#  r   N)r    r!   r"   r1   r   objectr  rl   r  r   r"  r%  r'  r)  propertyrf   rj   rg   rk   r$   r   r   r  r    s          (      6   / / // / /! ! !         8HD8HD8HD8HDDDr   r  c                     dt           _        t          |           }t                      }t	          ||           |j        |j        |j        fS )aJ  Takes a list of point objects (which must have x and y fields).
    Returns a 3-tuple of:

       (1) a list of 2-tuples, which are the x,y coordinates of the
           Voronoi diagram vertices
       (2) a list of 3-tuples (a,b,c) which are the equations of the
           lines in the Voronoi diagram: a*x + b*y = c
       (3) a list of 3-tuples, (l, v1, v2) representing edges of the
           Voronoi diagram.  l is the index of the line, v1 and v2 are
           the indices of the vetices at the end of the edge.  If
           v1 or v2 is -1, the line extends to infinity.
    r   )r^   r   r  r&   r   r,   r-   r.   pointsr   r   s      r   computeVoronoiDiagramr/    sE     DMHiiGHgW]GM99r   c                     dt           _        t          |           }t                      }d|_        t          ||           |j        S )zTakes a list of point objects (which must have x and y fields).
    Returns a list of 3-tuples: the indices of the points that form a
    Delaunay triangle.
    r   T)r^   r   r  r&   r+   r   r/   r-  s      r   computeDelaunayTriangulationr1  /  sB    
 DMHiiGGHgr   __main__r   thdpz-dz-pz-tz-hr).r#   
__future__r   getoptr   sys	TOLERANCEro   r*  r   r&   r   r   rn   r^   rv   re   ri   r  r/  r1  r    argvoptlistargsdoHelprU   r(   optr)   r*   r+   ptsstdinfprh   openrB   splitfldr   r4   r5   rK   closeslr$   r   r   <module>rF     s  <% %B & % % % % %   



		- - - - -v - - -4W' W' W' W' W'f W' W' W'vE E ER !* K K K K, , , , ,8 , , ,69 9 9 9 96 9 9 9z~  ~  ~  ~  ~ x ~  ~  ~ DL L L L Lv L L L`< < < < <F < < <@> > > > >v > > >D: : :*
 
 
 z!FM#(122,77MGTF		AAI  q6T>>AGq6T>>AFq6T>>AMq6T>>F Y3t99q==d1gs##B 	# 	#D**,,Cc!fAc!fAJJttAqzz""""3t99q==HHJJJ	#BGBNNNNN= r   