⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 randomwalk.cpp

📁 OMNET++仿真三色算法的源码,三色算法是无线传感器中一个典型的分簇算法
💻 CPP
字号:
#include "h/randomWalk.h"Define_Module_Like(RandomWalk,Mobility);bool RandomWalk::rebound(int& x, int &y){	bool update=false;	d("rebound");	if( x < minX)	{		dX *= (-1); // change the sign		x = minX;		alfa = 3.14 - alfa;		update=true;	}	if( x > maxX)	{		x = maxX;		dX *= (-1);		update=true;		alfa = 3.14 - alfa;	}	if( y < minY)	{		dY *= -1;		y = minY;		alfa = 6.28 - alfa ;		update=true;	}	if( y > maxY)	{		dY *= -1;		y = maxY;		alfa = 6.28 - alfa;		update=true;	}	return update;}bool RandomWalk::torus(int &x, int &y){	bool update=false;	d("toru");	if( x < minX)	{		x = maxX;		update=true;	}	if( x > maxX)	{		x = minX;		update=true;	}	if( y < minY)	{		y = maxY;		update=true;	}	if( y > maxY)	{		y = minY;		update=true;	}	return update;}double RandomWalk::randomWalk(int& x, int& y){ 	double step;	//if the node has covered the defined distance chose a new direction	//and speed	if(steps == 0)	{		//choose the direction angle; 6.27 is because alfa is in [0,2PI[		alfa =  genk_uniform(2,0,6.27);		//choose a random speed		speed = genk_uniform(1,minSpeed->doubleValue(),maxSpeed->doubleValue());		//compute a single step length		step = moveInterval->doubleValue() * speed;		steps = step > 0  ? (int )( distance->doubleValue() / step) : 1;		stepsNum += steps;		partial += steps * speed;	}	//copmpute a single step	step = moveInterval->doubleValue() * speed;	dX = (int) (step * cos(alfa));	dY = (int) (step * sin(alfa));	//do not go outside the map	if(0 == moveKind->boolValue())	{		//define new <x,y>		x = (x + dX);		y = (y + dY);		torus(x,y);	}	else	{		//define new <x,y>		x = (x + dX);		y = (y + dY);		rebound(x,y);	}	steps--;	return (double)moveInterval->doubleValue();}void RandomWalk::initialize(){	d("Random Walk Module");	cGate *g = gate("out");	//pointer to the physic module that	//store tje actual position	physic =(Physic*) g->toGate()->ownerModule();	minX = 5;	maxX =(int) par("XRange") - 5;	minY = 0;	maxY = (int)par("YRange") - 5;	steps = 0;	moveInterval = &par("moveInterval");	moveKind = &par("movKind");	minSpeed = &par("minSpeed");	maxSpeed = &par("maxSpeed");	distance = &par("distance");	cMessage *moveMsg = new cMessage("Move");	//start miving	scheduleAt(simTime()+0.01, moveMsg);	//statistical variables	stepsNum =0;	partial = 0;	WATCH(speed);	WATCH(alfa);}void RandomWalk::handleMessage(cMessage *msg){	int x,y;	d("random Walk");	//get the current position from the physic module	physic->getPos(x, y);	//calcolate the new position	double time =  randomWalk(x,y);	cMessage *moveMsg = new cMessage("Move",MOVE);	moveMsg->addPar("x") = x;	moveMsg->addPar("y") = y;	//inform to the physic module about	//the new position so it can be displayed	send(moveMsg,"out");	//tell to the physic module to move	scheduleAt(simTime()+time, msg);	d("new x,y: <"<<x<<","<<y<<">");}void RandomWalk::finish(){	//recordScalar("Speed avarage..........:",partial / stepsNum);	d("Walk random says bye");	FILE* fout = fopen("collectedData.dat","a");	fprintf(fout,"\nSpeed average............... %.2f\n",partial/stepsNum);	fclose(fout);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -