void EdgePosition::advance(Vector2f& adv, Node*& next_node) { // FIXME: This might be optimizable Vector2f p1 = edge->get_node1()->get_pos(); Vector2f p2 = edge->get_node2()->get_pos(); Vector2f edge_v = p2 - p1; Vector2f proj = adv.project(edge_v); float angle = atan2f(edge_v.y, edge_v.x) - atan2f(proj.y, proj.x); // Check if we are going forward or backward float advf; if (angle > M_PI/2 || angle < -M_PI/2) advf = -proj.length(); else advf = proj.length(); // Move forward advance(advf, next_node); // Calculate the rest Vector2f // Calculate the rest Vector2f if (advf == 0.0f) adv = Vector2f(0,0); else adv -= (proj * ((proj.length() - advf)/proj.length())); }