visualsenderplayer.cpp
来自「2009 ROBOCUP 仿真2DSERVER 源码」· C++ 代码 · 共 1,081 行 · 第 1/3 页
CPP
1,081 行
// -*-c++-*-/*************************************************************************** visualsenderplayer.cpp Classes for building visual messages for players ------------------- begin : 2008-02-17 copyright : (C) 2002 by The RoboCup Soccer Server Maintenance Group. email : sserver-admin@lists.sourceforge.net***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU LGPL as published by the Free Software * * Foundation; either version 2 of the License, or (at your option) any * * later version. * * * ***************************************************************************/#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "visualsenderplayer.h"#include "field.h"#include "serializer.h"namespace rcss {/*!//===================================================================//// CLASS: VisualSenderPlayer//// DESC: Base class for the visual protocol for players.////===================================================================*/VisualSenderPlayer::FactoryHolder &VisualSenderPlayer::factory(){ static FactoryHolder rval; return rval;}VisualSenderPlayer::VisualSenderPlayer( const Params & params ) : VisualSender( params.M_transport ), M_serializer( params.M_serializer ), M_self( params.M_self ), M_stadium( params.M_stadium ), M_sendcnt( 0 ){ //std::cerr << "create VisualSenderPlayer" << std::endl;}VisualSenderPlayer::~VisualSenderPlayer(){ //std::cerr << "delete VisualSenderPlayer" << std::endl;}/*!//===================================================================//// CLASS: VisualSensorPlayerV1//// DESC: Class for the version 1* visual protocol. This version is// completely unused as far as I am aware of, but it is here// none the less, just in case there is someone somewhere// still using it.//// * It's version 1 to the simualtor in it's current form.// From what I know the original simulator was written in// lisp and the first C++ version was actually version 3. I// don't know if the protocol was compatible with previous// versions, so this may well be the version 3 protocol.////===================================================================*/VisualSenderPlayerV1::VisualSenderPlayerV1( const Params & params ) : VisualSenderPlayer( params ){}VisualSenderPlayerV1::~VisualSenderPlayerV1(){}voidVisualSenderPlayerV1::sendVisual(){ incSendCount(); if ( sendCount() >= self().visSend() ) { resetSendCount(); } else { return; } serializer().serializeVisualBegin( transport(), stadium().time() ); if ( self().highquality() ) { M_send_flag = &VisualSenderPlayerV1::sendHighFlag; M_send_ball = &VisualSenderPlayerV1::sendHighBall; M_send_player = &VisualSenderPlayerV1::sendHighPlayer; M_serialize_line = &VisualSenderPlayerV1::serializeHighLine; } else { M_send_flag = &VisualSenderPlayerV1::sendLowFlag; M_send_ball = &VisualSenderPlayerV1::sendLowBall; M_send_player = &VisualSenderPlayerV1::sendLowPlayer; M_serialize_line = &VisualSenderPlayerV1::serializeLowLine; } sendFlags(); sendBalls(); sendPlayers(); sendLines(); serializer().serializeVisualEnd( transport() ); transport() << std::ends << std::flush;}voidVisualSenderPlayerV1::sendFlags(){ const std::vector< PObject * >::const_iterator end = stadium().field().landmarks().end(); for ( std::vector< PObject * >::const_iterator it = stadium().field().landmarks().begin(); it != end; ++it ) { if ( (*it)->objectVersion() <= self().version() ) { sendFlag( **it ); } }}voidVisualSenderPlayerV1::sendBalls(){ if ( stadium().ball().objectVersion() <= self().version() ) { sendBall( stadium().ball() ); }}voidVisualSenderPlayerV1::sendPlayers(){ const Stadium::PlayerCont::const_iterator end = stadium().players().end(); for ( Stadium::PlayerCont::const_iterator p = stadium().players().begin(); p != end; ++p ) { if ( *p != &self() && (*p)->state() != DISABLE && (*p)->objectVersion() <= self().version() ) { sendPlayer( *(*p) ); } }}voidVisualSenderPlayerV1::sendLines(){ int line_count = 0; int max_line_count; int min_line_count; if ( std::fabs( self().pos().x ) < ServerParam::PITCH_LENGTH*0.5 && std::fabs( self().pos().y ) < ServerParam::PITCH_WIDTH*0.5 ) { min_line_count = max_line_count = 1; } else { max_line_count = 2; min_line_count = 0; } if ( line_count < max_line_count && stadium().field().line_l.objectVersion() <= self().version() ) { if ( sendLine( stadium().field().line_l ) ) ++line_count; } if ( line_count < max_line_count && stadium().field().line_r.objectVersion() <= self().version() ) { if( sendLine( stadium().field().line_r ) ) ++line_count; } if ( line_count < max_line_count && stadium().field().line_t.objectVersion() <= self().version() ) { if ( sendLine( stadium().field().line_t ) ) ++line_count; } if ( line_count < max_line_count && stadium().field().line_b.objectVersion() <= self().version() ) { if ( sendLine( stadium().field().line_b ) ) ++line_count; } if ( line_count < min_line_count ) { std::cerr << __FILE__ << ": " << __LINE__ << ": Error rendering visual: not enough lines\n" << "Player = " << self() << std::endl; }}voidVisualSenderPlayerV1::sendLowFlag( const PObject & flag ){ const double ang = calcRadDir( flag ); if ( std::fabs( ang ) < self().visibleAngle() * 0.5 ) { serializer().serializeVisualObject( transport(), calcName( flag ), calcDegDir( ang ) ); } else if ( calcUnQuantDist( flag ) <= self().vis_distance ) { serializer().serializeVisualObject( transport(), calcCloseName( flag ), calcDegDir( ang ) ); }}voidVisualSenderPlayerV1::sendHighFlag( const PObject & flag ){ const double ang = calcRadDir( flag ); //const double un_quant_dist = calcUnQuantDist( flag ); double un_quant_dist = self().pos().distance2( flag.pos() ); if ( std::fabs( ang ) < self().visibleAngle() * 0.5 ) { un_quant_dist = std::sqrt( un_quant_dist ); const double quant_dist = calcQuantDist( un_quant_dist, self().landDistQStep() ); //const double prob = ( ( quant_dist - UNUM_FAR_LENGTH ) // / ( UNUM_TOOFAR_LENGTH - UNUM_FAR_LENGTH ) ); const double prob = ( ( quant_dist - self().unumFarLength() ) / ( self().unumTooFarLength() - self().unumFarLength() ) ); if ( decide( prob ) ) { serializer().serializeVisualObject( transport(), calcName( flag ), quant_dist, calcDegDir( ang ) ); } else { double dist_chg, dir_chg; calcVel( PVector(), flag.pos(), un_quant_dist, quant_dist, dist_chg, dir_chg ); serializer().serializeVisualObject( transport(), calcName( flag ), quant_dist, calcDegDir( ang ), dist_chg, dir_chg ); } } else if ( un_quant_dist <= self().vis_distance2 ) { //un_quant_dist = std::sqrt( un_quant_dist ); serializer().serializeVisualObject( transport(), calcCloseName( flag ), calcQuantDist( std::sqrt( un_quant_dist ), self().landDistQStep() ), calcDegDir( ang ) ); }}voidVisualSenderPlayerV1::sendLowBall( const MPObject & ball ){ const double ang = calcRadDir( ball ); if( std::fabs( ang ) < self().visibleAngle() * 0.5 ) { serializer().serializeVisualObject( transport(), calcName( ball ), calcDegDir( ang ) ); } else if( calcUnQuantDist( ball ) <= self().vis_distance ) { serializer().serializeVisualObject( transport(), calcCloseName( ball ), calcDegDir( ang ) ); }}voidVisualSenderPlayerV1::sendHighBall( const MPObject & ball ){ const double ang = calcRadDir( ball ); //const double un_quant_dist = calcUnQuantDist( ball ); double un_quant_dist = self().pos().distance2( ball.pos() ); if ( std::fabs( ang ) < self().visibleAngle() * 0.5 ) { un_quant_dist = std::sqrt( un_quant_dist ); const double quant_dist = calcQuantDist( un_quant_dist, self().distQStep() ); //double prob = ( ( quant_dist - UNUM_FAR_LENGTH ) // / ( UNUM_TOOFAR_LENGTH - UNUM_FAR_LENGTH ) ); double prob = ( ( quant_dist - self().unumFarLength() ) / ( self().unumTooFarLength() - self().unumFarLength() ) ); if ( decide( prob ) ) { serializer().serializeVisualObject( transport(), calcName( ball ), quant_dist, calcDegDir( ang ) ); } else { double dist_chg, dir_chg; calcVel( ball.vel(), ball.pos(), un_quant_dist, quant_dist, dist_chg, dir_chg ); serializer().serializeVisualObject( transport(), calcName( ball ), quant_dist, calcDegDir( ang ), dist_chg, dir_chg ); } } else if ( un_quant_dist <= self().vis_distance2 ) { serializer().serializeVisualObject( transport(), calcCloseName( ball ), calcQuantDist( std::sqrt( un_quant_dist ), self().distQStep() ), calcDegDir( ang ) ); }}void
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?