Пример #1
0
 int prim_mst(int src) {
     IIS q;
     IV dis(n, INF);
     BV flg(n);
     dis[src] = 0;
     q.insert(II(0, src));
     int mst = 0;
     while (! q.empty()) {
         int d = q.begin()->first;
         int v = q.begin()->second;
         q.erase(q.begin());
         if (flg[v]) continue;
         flg[v] = true;
         mst += d;
         For (EL, e, adj[v])
             if (!flg[e->v] && e->w < dis[e->v]) {
                 dis[e->v] = e->w;
                 q.insert(II(dis[e->v], e->v));
             }
     }
     return mst;
 }
void CMultipleParticleFilter::update(CLaser *Laser)
{
	m_pLaser = Laser;
	double obs[2], p[2];

	for (int n = 0; n < 1; n++){
		if (m_pLaser->m_bNodeActive[n]){
			std::vector<int> label(m_pLaser->m_LRFClsPoints[n].size(), -1);		// クラスタに対応するパーティクルフィルタの番号
			int pn = m_ParticleFilter.size();	// 現在のパーティクルフィルタの個数

			for (int j = 0; j < m_pLaser->m_LRFClsPoints[n].size(); j++){
				// クラスタ代表点
				obs[0] = m_pLaser->m_LRFClsPoints[n][j].x;
				obs[1] = m_pLaser->m_LRFClsPoints[n][j].y;

				// クラスタ毎に,一番近いパーティクルフィルタを探す
				double min_r = 1e10;
				int np = 0;
				for (vector<CPF>::iterator it = m_ParticleFilter.begin(); it != m_ParticleFilter.end(); ++it, ++np) {
					p[0] = it->state[0];
					p[1] = it->state[1];

					double r = sqrt(pow(p[0] - obs[0], 2) + pow(p[1] - obs[1], 2));

					if (min_r > r && r < m_min_distance){
						min_r = r;
						label[j] = np;
					}
				}

				// もし,クラスタに対応するパーティクルフィルタがなかったとき
				if (min_r >= m_min_distance){
					label[j] = pn++;
				}
			}

			std::vector<int> flg(pn, -1);		// クラスタに対応するパーティクルフィルタの番号
			for (int j = 0; j < m_pLaser->m_LRFClsPoints[n].size(); j++){
				if (label[j] < 0){
					std::cout << "Error" << std::endl;
				}
				else if (label[j] < m_ParticleFilter.size()){
					obs[0] = m_pLaser->m_LRFClsPoints[n][j].x;
					obs[1] = m_pLaser->m_LRFClsPoints[n][j].y;
					m_ParticleFilter[label[j]].SetTarget(obs);
					m_ParticleFilter[label[j]].update();
				}
				else{
					CPF pf;
					int d = Config::is()->particle_area * 1000;
					obs[0] = m_pLaser->m_LRFClsPoints[n][j].x;
					obs[1] = m_pLaser->m_LRFClsPoints[n][j].y;

					int area[4] = {obs[0]-m_initial_dist/2, obs[1]-m_initial_dist/2, obs[0]+m_initial_dist/2, obs[1]+m_initial_dist/2};
					pf.initialize(area);

					pf.SetTarget(obs);
					pf.SetID(m_ID++);
					pf.update();
					m_ParticleFilter.push_back(pf);
				}
				flg[label[j]] = 1;
			}

			int np = 0;
			for (vector<CPF>::iterator it = m_ParticleFilter.begin(); it != m_ParticleFilter.end(); ++it, ++np) {
				if (flg[np] < 0)  {
					it->clear();
					it = m_ParticleFilter.erase(it);
					if (it == m_ParticleFilter.end()) break;
				}
			}

			for (int i = 0; i < MAX_TRACKING_OBJECT; i++){
				delete m_pLaser->m_pTarget[i];
				m_pLaser->m_pTarget[i] = NULL;
			}

			np = 0;
			for (vector<CPF>::iterator it = m_ParticleFilter.begin(); it != m_ParticleFilter.end(); ++it, ++np) {
				m_pLaser->m_pTarget[np] = new CTarget();
				m_pLaser->m_pTarget[np]->id = it->GetID();
				m_pLaser->m_pTarget[np]->cnt = it->GetCnt();
				m_pLaser->m_pTarget[np]->SetPosi(it->state[0], it->state[1]);
			}
		}
	}
}
void SessionServer::addUsr()
{
	class EmptyAuth
	{
	public:
		int operator () (SafeInfo* info, fdtype_t type) { return 0; }
	};

	char username[_MAXUNAMESIZE];
	char password[_MAXPSDSIZE];
	if(!readSBuf(username, _MAXUNAMESIZE))
		return;
	if(!readSBuf(password, _MAXPSDSIZE))
		return;
	if(userId != 1)
	{
		int rs = ERR_OPERATOR_DENY;
		writeSBuf((char*) &rs, sizeof(rs));
		return;
	}
	std::lock_guard<XHYFileManager> flg(*manager);
	if(!addableUser(username))
	{
		int merr = err;
		writeSBuf((char*) &merr, sizeof(merr));
		return;
	}
	int fd = manager->open("/sys/user.d", OPTYPE_READ | OPTYPE_WRITE, EmptyAuth());
	if(fd == 0)
	{
		int merr = manager->getErrno();
		writeSBuf((char*) &merr, sizeof(merr));
		return;
	}
	FileGuard<XHYFileManager, int> fgrd(*manager, fd);
	int tx = manager->seek(fd, 0, XHYFileManager::end);
	if(tx < 0)
	{
		int merr = manager->getErrno();
		writeSBuf((char*) &merr, sizeof(merr));
		return;
	}
	tx = manager->tell(fd);
	if(tx < 0)
	{
		int merr = manager->getErrno();
		writeSBuf((char*) &merr, sizeof(merr));
		return;
	}
	uidsize_t id = tx / (sizeof(uidsize_t) + _MAXUNAMESIZE + _MAXPSDSIZE) + 1;
	if(!writeFBuf(fd, (char*) &id, sizeof(id)))
	{
		int merr = manager->getErrno();
		writeSBuf((char*) &merr, sizeof(merr));
		return;
	}
	if(!writeFBuf(fd, username, _MAXUNAMESIZE))
	{
		int merr = manager->getErrno();
		writeSBuf((char*) &merr, sizeof(merr));
		return;
	}
	if(!writeFBuf(fd, password, _MAXPSDSIZE))
	{
		int merr = manager->getErrno();
		writeSBuf((char*) &merr, sizeof(merr));
		return;
	}
	int rs = 0;
	writeSBuf((char*) &rs, sizeof(rs));
}
Пример #4
0
void wait::join_game(bool observe)
{
	const bool download_res = download_level_data();
	if (!download_res) {
		DBG_MP << "mp wait: could not download level data, quitting...";
		set_result(QUIT);
		return;
	} else if (!get_scenario()["allow_new_game"].to_bool(true) && !level_.child_or_empty("multiplayer")["savegame"].to_bool(false)) {
		set_result(PLAY);
		return;
	}

	if (first_scenario_) {
		state_ = saved_game();
		state_.classification().campaign_type = game_classification::CAMPAIGN_TYPE::MULTIPLAYER;

		const config* campaign = &game_config_manager::get()->
			game_config().find_child("campaign", "id",
				level_.child("multiplayer")["mp_campaign"]);

		const config* scenario = &game_config_manager::get()->
			game_config().find_child("multiplayer", "id",
				level_.child(lexical_cast<std::string>(game_classification::CAMPAIGN_TYPE::MULTIPLAYER))["id"]);

		const config* era = &game_config_manager::get()->
			game_config().find_child("era", "id", level_.child("era")["id"]);

		if (*campaign) {
			state_.classification().difficulty =
				level_.child("multiplayer")["difficulty_define"].str();
			state_.classification().campaign_define =
				(*campaign)["define"].str();
			state_.classification().campaign_xtra_defines =
				utils::split((*campaign)["extra_defines"]);
		}

		if (*scenario)
			state_.classification().scenario_define =
				(*scenario)["define"].str();

		if (*era)
			state_.classification().era_define =
				(*era)["define"].str();

		BOOST_FOREACH(const config& mod, level_.child_range("modification")) {
			const config* modification = &game_config_manager::get()->
				game_config().find_child("modification", "id", mod["id"]);
			if (*modification) {
				state_.classification().mod_defines.push_back(
					(*modification)["define"].str());
			}
		}


		// Make sure that we have the same config as host, if possible.
		game_config_manager::get()->
			load_game_config_for_game(state_.classification());
	}

	// Add the map name to the title.
	append_to_title(": " + get_scenario()["name"].t_str());

	if (!observe) {
		//search for an appropriate vacant slot. If a description is set
		//(i.e. we're loading from a saved game), then prefer to get the side
		//with the same description as our login. Otherwise just choose the first
		//available side.
		const config *side_choice = NULL;
		int side_num = -1, nb_sides = 0;
		BOOST_FOREACH(const config &sd, get_scenario().child_range("side"))
		{
			DBG_MP << "*** side " << nb_sides << "***\n" << sd.debug() << "***\n";

			if (sd["controller"] == "reserved" && sd["current_player"] == preferences::login())
			{
				side_choice = &sd;
				side_num = nb_sides;
				break;
			}
			if (sd["controller"] == "network" && sd["player_id"].empty())
			{
				if (!side_choice) { // found the first empty side
					side_choice = &sd;
					side_num = nb_sides;
				}
				if (sd["current_player"] == preferences::login()) {
					side_choice = &sd;
					side_num = nb_sides;
					break;  // found the preferred one
				}
			}
			++nb_sides;
		}
		if (!side_choice) {
			size_t count = 0;
			for(config::child_itors its = get_scenario().child_range("side"); its.second != its.first; ++its.first) {
				++count;
			}
			DBG_MP << "could not find a side, all " << count << " sides were unsuitable\n";
			set_result(QUIT);
			return;
		}

		bool allow_changes = (*side_choice)["allow_changes"].to_bool(true);

		//if the client is allowed to choose their team, instead of having
		//it set by the server, do that here.
		if(allow_changes) {
			events::event_context context;

			const config &era = level_.child("era");
			/** @todo Check whether we have the era. If we don't inform the user. */
			if (!era)
				throw config::error(_("No era information found."));
			config::const_child_itors possible_sides = era.child_range("multiplayer_side");
			if (possible_sides.first == possible_sides.second) {
				set_result(QUIT);
				throw config::error(_("No multiplayer sides found"));
			}

			int color = side_num;
			const std::string color_str = (*side_choice)["color"];
			if (!color_str.empty())
				color = game_config::color_info(color_str).index() - 1;

			std::vector<const config*> era_factions;
			BOOST_FOREACH(const config &side, possible_sides) {
				era_factions.push_back(&side);
			}

			const bool lock_settings =
				get_scenario()["force_lock_settings"].to_bool();
			const bool use_map_settings =
				level_.child("multiplayer")["mp_use_map_settings"].to_bool();
			const bool saved_game =
				level_.child("multiplayer")["savegame"].to_bool();

			ng::flg_manager flg(era_factions, *side_choice, lock_settings, use_map_settings,
				saved_game, color);

			std::vector<std::string> choices;
			BOOST_FOREACH(const config *s, flg.choosable_factions())
			{
				const config &side = *s;
				const std::string &name = side["name"];
				const std::string &icon = side["image"];

				if (!icon.empty()) {
					std::string rgb = side["flag_rgb"];
					if (rgb.empty())
						rgb = "magenta";

					choices.push_back(IMAGE_PREFIX + icon + "~RC(" + rgb + ">" +
						lexical_cast<std::string>(color+1) + ")" + COLUMN_SEPARATOR + name);
				} else {
					choices.push_back(name);
				}
			}

			std::vector<gui::preview_pane* > preview_panes;
			leader_preview_pane leader_selector(disp(), flg, color);
			preview_panes.push_back(&leader_selector);

			const int faction_choice = gui::show_dialog(disp(), NULL,
				_("Choose your faction:"), _("Starting position: ") +
				lexical_cast<std::string>(side_num + 1), gui::OK_CANCEL,
				&choices, &preview_panes);
			if(faction_choice < 0) {
				set_result(QUIT);
				return;
			}

			config faction;
			config& change = faction.add_child("change_faction");
			change["change_faction"] = true;
			change["name"] = preferences::login();
			change["faction"] = flg.current_faction()["id"];
			change["leader"] = flg.current_leader();
			change["gender"] = flg.current_gender();
			network::send_data(faction, 0);
		}

	}