void testEdgeID() { const int width = 4, height = 6; std::set<int> seen; for(int y = 0; y < height; ++y) { for(int x = 0; x < width; ++x) { if(x < width - 1) { auto horiz = Edge::horizontal({x, y}); int horizID = edgeID(width, height, horiz); auto reconHorizEdge = edge(width, height, horizID); assert(!seen.count(horizID)); seen.insert(horizID); assert(reconHorizEdge == horiz); std::cout << horiz << " -> " << horizID << " -> " << reconHorizEdge << "\n"; } if(y < height - 1) { auto vert = Edge::vertical({x, y}); int vertID = edgeID(width, height, vert); auto reconVertEdge = edge(width, height, vertID); assert(!seen.count(vertID)); seen.insert(vertID); assert(reconVertEdge == vert); std::cout << vert << " -> " << vertID << " -> " << reconVertEdge << "\n"; } } } }
// ------------------------------------------------------------------------- double Pgr_trspHandler::construct_path(int64_t ed_id, Position pos) { pgassert(pos != ILLEGAL); if (m_parent[ed_id].isIllegal(pos)) { Path_t pelement; auto cur_edge = &m_edges[ed_id]; if (pos == RC_EDGE) { pelement.node = cur_edge->startNode(); pelement.cost = cur_edge->cost(); } else { pelement.node = cur_edge->endNode(); pelement.cost = cur_edge->r_cost(); } pelement.edge = cur_edge->edgeID(); m_path.push_back(pelement); pgassert(m_path.start_id() == m_start_vertex); return pelement.cost; } double ret = construct_path(m_parent[ed_id].e_idx[pos], m_parent[ed_id].v_pos[pos]); Path_t pelement; auto cur_edge = &m_edges[ed_id]; if (pos == RC_EDGE) { pelement.node = cur_edge->startNode(); pelement.cost = m_dCost[ed_id].endCost - ret; ret = m_dCost[ed_id].endCost; } else { pelement.node = cur_edge->endNode(); pelement.cost = m_dCost[ed_id].startCost - ret; ret = m_dCost[ed_id].startCost; } pelement.edge = cur_edge->edgeID(); m_path.push_back(pelement); return ret; }
int edgeID(int width, int height, const Edge &e) { return edgeID(width, height, e.p1.x, e.p1.y, e.p2.x, e.p2.y); }