Esempio n. 1
0
bool List_Triplets(const GraphT & g, std::vector< Triplet > & vec_triplets)
{
  // Algorithm
  //
  //-- For each node
  //    - list the outgoing not visited edge
  //    -  for each tuple of edge
  //       - if their end are connected
  //          Detected cyle of length 3
  //          Mark first edge as visited

  typedef typename GraphT::OutArcIt OutArcIt;
  typedef typename GraphT::NodeIt NodeIterator;
  typedef typename GraphT::template EdgeMap<bool> BoolEdgeMap;

  BoolEdgeMap map_edge(g, false); // Visited edge map

  // For each nodes
  for (NodeIterator itNode(g); itNode != INVALID; ++itNode)
  {
    // For each edges (list the not visited outgoing edges)
    std::vector<OutArcIt> vec_edges;
    for (OutArcIt e(g, itNode); e!=INVALID; ++e)
    {
      if (!map_edge[e]) // If not visited
        vec_edges.push_back(e);
    }

    // For all tuples look of ends of edges are linked
    while(vec_edges.size()>1)
    {
      OutArcIt itPrev = vec_edges[0]; // For all tuple (0,Inth)
      for(size_t i=1; i < vec_edges.size(); ++i)
      {
        // Check if the extremity is linked
        typename GraphT::Arc cycleEdge = findArc(g, g.target(itPrev), g.target(vec_edges[i]));
        if (cycleEdge!= INVALID && !map_edge[cycleEdge])
        {
          // Elementary cycle found (make value follow a monotonic ascending serie)
          int triplet[3] = {
            g.id(itNode),
            g.id(g.target(itPrev)),
            g.id(g.target(vec_edges[i]))};
          std::sort(&triplet[0], &triplet[3]);
          vec_triplets.push_back(Triplet(triplet[0],triplet[1],triplet[2]));
        }
      }
      // Mark the current ref edge as visited
      map_edge[itPrev] = true;
      // remove head to list remaining tuples
      vec_edges.erase(vec_edges.begin());
    }
  }
  return (!vec_triplets.empty());
}
Esempio n. 2
0
void player_build_move(gint player_num, gint sx, gint sy, gint spos,
		       gint dx, gint dy, gint dpos, gint isundo)
{
	Edge *from = map_edge(callbacks.get_map(), sx, sy, spos),
	    *to = map_edge(callbacks.get_map(), dx, dy, dpos);
	if (isundo) {
		Edge *tmp = from;
		from = to;
		to = tmp;
	}
	from->owner = -1;
	callbacks.draw_edge(from);
	from->type = BUILD_NONE;
	to->owner = player_num;
	to->type = BUILD_SHIP;
	callbacks.draw_edge(to);
	if (isundo)
		log_message(MSG_BUILD,
			    _("%s has cancelled a ship's movement.\n"),
			    player_name(player_num, TRUE));
	else
		log_message(MSG_BUILD, _("%s moved a ship.\n"),
			    player_name(player_num, TRUE));
}
Esempio n. 3
0
/* translate_drawing:
 * Translate and/or rotate nodes, spline points, and bbox info if
 * Offset is non-trivial.
 * Also, if Rankdir, reset ND_lw, ND_rw, and ND_ht to correct value.
 */
static void translate_drawing(graph_t * g)
{
    node_t *v;
    edge_t *e;
    int shift = (Offset.x || Offset.y);

    if (!shift && !Rankdir) return;
    for (v = agfstnode(g); v; v = agnxtnode(g, v)) {
	if (Rankdir) dot_nodesize(v, FALSE);
	if (shift) {
	    ND_coord_i(v) = map_point(ND_coord_i(v));
	    if (State == GVSPLINES)
		for (e = agfstout(g, v); e; e = agnxtout(g, e))
		    map_edge(e);
	}
    }
    if (shift)
	translate_bb(g, GD_rankdir(g));
}
Esempio n. 4
0
void player_build_remove(gint player_num,
			 BuildType type, gint x, gint y, gint pos)
{
	Edge *edge;
	Node *node;

	switch (type) {
	case BUILD_ROAD:
		edge = map_edge(callbacks.get_map(), x, y, pos);
		edge->owner = -1;
		callbacks.draw_edge(edge);
		edge->type = BUILD_NONE;
		log_message(MSG_BUILD, _("%s removed a road.\n"),
			    player_name(player_num, TRUE));
		if (player_num == my_player_num())
			stock_replace_road();
		break;
	case BUILD_SHIP:
		edge = map_edge(callbacks.get_map(), x, y, pos);
		edge->owner = -1;
		callbacks.draw_edge(edge);
		edge->type = BUILD_NONE;
		log_message(MSG_BUILD, _("%s removed a ship.\n"),
			    player_name(player_num, TRUE));
		if (player_num == my_player_num())
			stock_replace_ship();
		break;
	case BUILD_SETTLEMENT:
		node = map_node(callbacks.get_map(), x, y, pos);
		node->type = BUILD_NONE;
		node->owner = -1;
		callbacks.draw_node(node);
		log_message(MSG_BUILD, _("%s removed a settlement.\n"),
			    player_name(player_num, TRUE));
		player_modify_statistic(player_num, STAT_SETTLEMENTS, -1);
		if (player_num == my_player_num())
			stock_replace_settlement();
		break;
	case BUILD_CITY:
		node = map_node(callbacks.get_map(), x, y, pos);
		node->type = BUILD_SETTLEMENT;
		node->owner = player_num;
		callbacks.draw_node(node);
		log_message(MSG_BUILD, _("%s removed a city.\n"),
			    player_name(player_num, TRUE));
		player_modify_statistic(player_num, STAT_SETTLEMENTS, 1);
		player_modify_statistic(player_num, STAT_CITIES, -1);
		if (player_num == my_player_num()) {
			stock_use_settlement();
			stock_replace_city();
		}
		break;
	case BUILD_CITY_WALL:
		node = map_node(callbacks.get_map(), x, y, pos);
		node->city_wall = FALSE;
		node->owner = player_num;
		callbacks.draw_node(node);
		log_message(MSG_BUILD, _("%s removed a city wall.\n"),
			    player_name(player_num, TRUE));
		player_modify_statistic(player_num, STAT_CITY_WALLS, -1);
		if (player_num == my_player_num())
			stock_replace_city_wall();
		break;

	case BUILD_NONE:
		log_message(MSG_ERROR,
			    _(""
			      "player_build_remove called with BUILD_NONE for user %s\n"),
			    player_name(player_num, TRUE));
		break;
	case BUILD_BRIDGE:
		edge = map_edge(callbacks.get_map(), x, y, pos);
		edge->owner = -1;
		callbacks.draw_edge(edge);
		edge->type = BUILD_NONE;
		log_message(MSG_BUILD, _("%s removed a bridge.\n"),
			    player_name(player_num, TRUE));
		if (player_num == my_player_num())
			stock_replace_bridge();
		break;
	case BUILD_MOVE_SHIP:
		/* This clause here to remove a compiler warning.
		   It should not be possible to reach this case. */
		g_error("Bug: unreachable code reached");
		break;
	}
}