/** Check that given edge is in current sector */ bool NodeNav::isEdgeInSector( GEdge * edge) const { GNode *n = otherEnd( edge); /* item corresponding to other (than node_priv) node */ if ( isNullP( n) || sector() == UNDEF_SECTOR) return false; NodeItem *item = n->item(); // Both points in current node's coordinates QPointF p_center = node_priv->item()->boundingRect().center(); QPointF s_center = node_priv->item()->mapFromItem( item, item->boundingRect().center()); qreal angle = QLineF( p_center, s_center).angle(); qreal max_angle = sectorMaxAngle(); qreal min_angle = sectorMinAngle(); if ( angle > 270 && sector() == RIGHT_SECTOR) { max_angle +=360; } if ( angle < 90 && sector() == RIGHT_SECTOR) { min_angle -=360; } if ( angle <= max_angle && angle >= min_angle) return true; return false; }
/** Get edge to the left of given edge */ GEdge * NodeNav::edgeInDir( GEdge * edge, NavDirection dir) const { /* Applicable only for top and bottom sectors */ if ( !isDirApplicable( dir, sector())) { return NULL; } GNode *n = otherEnd( edge); /* item corresponding to other (than node_priv) node */ if ( isNullP( n)) return NULL; NodeItem *item = n->item(); // in current node's coordinates QPointF edge_point = node()->item()->mapFromItem( item, item->boundingRect().center()); GEdge *res = NULL; qreal min_delta = 0; /** For each edge */ for ( Node::EdgeIter e_iter = node()->edgesBegin(), e_end = node()->edgesEnd(); e_iter != e_end; e_iter++ ) { GEdge *e = static_cast<GEdge *>( e_iter.edge()); if ( isEdgeInSector( e) && areNotEqP( e, edge)) { NodeItem *p_item = static_cast<GNode *>( e_iter.node())->item(); QPointF point = node()->item()->mapFromItem( p_item, p_item->boundingRect().center()); if ( isPointInDir( point, edge_point, dir)) { qreal delta = deltaInDir( point, edge_point, dir); if ( isNullP( res) || delta < min_delta) // for selection of closest edge { res = e; min_delta = delta; } } } } return res; }