o
    3ήcG"                     @   s   d dl Z d dlZd dlZd dlmZ dd Zdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd+d!d"Zd#d$ Zd%d& ZG d'd( d(Zd)d* ZdS ),    N)triangulate_embeddingc                  C   s*   g dddgg dddgd} t |  d S )N         r   r   )r   r   r   )r   r   r   r   check_embedding_dataembedding_data r   T/tmp/pip-target-vg8gfxp4/lib/python/networkx/algorithms/tests/test_planar_drawing.pytest_graph1	   s   r   c                  C   sJ   ddgg dg ddgdgddgg dddgg dg d	d

} t |  d S )N      )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   test_graph2   s   r   c                  C   sN   ddgddgddgddgddgddgdd	gdd
gd	dgd
dgd
} t |  d S )Nr   r   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   test_circle_graph   s   r   c               
   C   sH   g dg dddgg dg dddgddgg d	ddgd
	} t |  d S )N)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   test_grid_graph.   s   r    c                  C   s   dg i} t |  d S )Nr   r   r	   r   r   r   test_one_node_graph=   s   r!   c                  C   s   dgdgd} t |  d S )Nr   r   r   r   r	   r   r   r   test_two_node_graphB   s   r"   c                  C   s$   ddgddgddgd} t |  d S )Nr   r   r   )r   r   r   r   r	   r   r   r   test_three_node_graphG   s   r#   c                  C   s   g g d} t |  d S )Nr   r   r	   r   r   r   test_multiple_component_graph1L   s   
r$   c                  C   s6   ddgddgddgddgddgddgd} t |  d S )Nr   r   r   r   r   r   )r   r   r   r   r   r   r   r	   r   r   r   test_multiple_component_graph2Q   s   *r%   c                  C   sl   t tj& g dg dg dg dd} t }||  t| W d    d S 1 s/w   Y  d S )N)r   r   r   )r   r   r   )r   r   r   r   )r   r   r   r   )pytestraisesnxNetworkXExceptionPlanarEmbeddingset_datacombinatorial_embedding_to_pos)r
   	embeddingr   r   r   test_invalid_half_edgeV   s   
"r.   c                  C   s(   t  } | d dg i}t| | d S )Nr   )r(   r*   add_nodecheck_triangulationr-   expected_embeddingr   r   r   test_triangulate_embedding1^   s   
r3   c                  C   s0   t  } | dd dgdgd}t| | d S )Nr   r   r   )r(   r*   connect_componentsr0   r1   r   r   r   test_triangulate_embedding2e   s   r5   c                 C   sH   t | d\}}| |ksJ dt | d\}}| |ks"J dd S )NTzExpected embedding incorrectF)r   get_data)r-   r2   res_embedding_r   r   r   r0   l   s   

r0   c                 C   sn   t  }||  t |d}d}t||sJ |t|| t |d}d}t||s0J |t|| dS )z8Checks that the planar embedding of the input is correctFzFPlanar drawing does not conform to the embedding (fully triangulation)TzIPlanar drawing does not conform to the embedding (internal triangulation)N)r(   r*   r+   r,   $planar_drawing_conforms_to_embeddingcheck_edge_intersections)r
   r-   	pos_fullymsgpos_internallyr   r   r   r   w   s   

r   &.>        c                 C   s(   t | | t|tt | t | |kS N)absmax)abrel_tolabs_tolr   r   r   is_close   s   (rG   c                 C   s   | \}}|\}}|\}}t || d || d  }	t || d || d  }
t || d || d  }t|
| |	S )Nr   )mathsqrtrG   )rC   rD   px1y1x2y2pxpydist_1_2dist_1_pdist_2_pr   r   r   point_in_between   s   rT   c                 C   s  |   D ]\}}|   D ]\}}||kr||kr||kr||kr|| \}}|| \}}	|| \}
}|| \}}|| ||  ||	 |
|   }|dkr||	 ||  |
|  || |
| ||   |  }||	 ||  ||  ||	 |
| ||   |  }t|| || ||frt|| || ||frd| d| }t|d}t|| || || st|| || || st|| || || st|| || || rt|qqdS )zCheck all edges in G for intersections.

    Raises an exception if an intersection is found.

    Parameters
    ----------
    G : NetworkX graph
    pos : dict
        Maps every node to a tuple (x, y) representing its position

    r   zThere is an intersection at ,z0A node lies on a edge connecting two other nodesN)edgesrT   r(   r)   )GposrC   rD   cdrK   rL   rM   rN   x3y3x4y4determinantrO   rP   r<   r   r   r   r:      sJ     

r:   c                   @   sP   e Zd ZdZg dZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd ZdS )VectorzCompare vectors by their angle without loss of precision

    All vectors in direction [0, 1] are the smallest.
    The vectors grow in clockwise direction.
    xynodequadrantc                 C   sv   || _ || _|| _| j dkr| jdkrd| _d S | j dkr'| jdkr'd| _d S | j dkr6| jdk r6d| _d S d| _d S )Nr   r   r   r   r   ra   )selfrb   rc   rd   r   r   r   __init__   s   



zVector.__init__c                 C   s$   | j |j ko| j|j | j|j kS r@   re   rb   rc   rf   otherr   r   r   __eq__   s   $zVector.__eq__c                 C   s8   | j |j k rdS | j |j krdS | j|j | j|j k S )NTFrh   ri   r   r   r   __lt__   s
   zVector.__lt__c                 C   s
   | |k S r@   r   ri   r   r   r   __ne__      
zVector.__ne__c                 C   s
   || k  S r@   r   ri   r   r   r   __le__   rn   zVector.__le__c                 C   s   || k S r@   r   ri   r   r   r   __gt__   s   zVector.__gt__c                 C   s
   | |k  S r@   r   ri   r   r   r   __ge__   rn   zVector.__ge__N)__name__
__module____qualname____doc__	__slots__rg   rk   rl   rm   ro   rp   rq   r   r   r   r   r`      s    r`   c                 C   s  | D ]}g }|| }| | D ]}t || d |d  || d |d  |}|| q|  t|D ]L\}}||d t|  }	||d  }
| | |j d |	jks`| | |j d |
jkrd  dS |	j|jkrr|	|krr  dS |
j|jkr|
|kr  dS q4qdS )zChecks if pos conforms to the planar embedding

    Returns true iff the neighbors are actually oriented in the orientation
    specified of the embedding
    r   r   cwccwFT)r`   appendsort	enumeratelenrd   )r-   rX   vnbr_vectorsv_posnbr
new_vectoridx
nbr_vector	cw_vector
ccw_vectorr   r   r   r9      s,   ,r9   )r>   r?   )rH   r&   networkxr(   "networkx.algorithms.planar_drawingr   r   r   r   r    r!   r"   r#   r$   r%   r.   r3   r5   r0   r   rG   rT   r:   r`   r9   r   r   r   r   <module>   s.    
2.