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

📄 eczx.cpp

📁 传感器网络质心定位算法扩展
💻 CPP
字号:
#include "math.h"
#include  <iostream.h>
#include  <iomanip.h>   
#include  <stdlib.h>
#include  <cstdlib> 
#include  <time.h>
#include   <stdio.h>  

#define Number_of_Initial_Beacon 200   /////设置信标节点个数
#define Number_of_Second_Beacon 20	//设置第二次信标节点个数



struct Position{//节点坐标
	double x;
	double y;
};

struct Node{//包含RSSI值的完整节点信息
	Position position;
	double RSSI;
};



Node	Beacon_Initial[Number_of_Initial_Beacon]; ///保存第一次信标节点信息
Node	Beacon_Second[Number_of_Second_Beacon];//保存第二次质心计算时用到的信标坐标
Node	Node_X; //未知节点X坐标
Position	First_Cent;//第一次质心坐标
Position	Second_Cent;//第二次质心坐标


void	Node_Initial();  //节点启动
void	GetBeaconPosition(  ); //根据未知节点,获取信标节点信息
void	Calcu_First_Cent(  );// 计算第一次质心
void	SortBeacon(  ); //根据RSSI值对第一次的质心排序,选取离未知节点较近的节点
void	Calcu_Second_Cent( ); // 计算第二次质心

  
	  
void main()
{

//	int time;
//	cout << "请输入您想进行的实验次数:"<<endl;
//	cin>>time;
	
//	for (int i=0; i<time; i++)
//	{
	

	double distance1, distance2;

	cout<< "本次实验采用的信标节点个数为:" << Number_of_Initial_Beacon << endl
		<< "第二次质心计算时选取的信标节点个数为:" << Number_of_Second_Beacon << endl<<endl;


	Node_Initial();	
	GetBeaconPosition(  );
	Calcu_First_Cent( );
	SortBeacon( );
	Calcu_Second_Cent( );

	distance1 = sqrt(  ( First_Cent.x - Node_X.position.x ) * ( First_Cent.x - Node_X.position.x )
				+ ( First_Cent.y - Node_X.position.y ) * ( First_Cent.y - Node_X.position.y )  ); 

	distance2 = sqrt(  ( Second_Cent.x - Node_X.position.x ) * ( Second_Cent.x - Node_X.position.x )
				+ ( Second_Cent.y - Node_X.position.y ) * ( Second_Cent.y - Node_X.position.y )  ); 

	cout<<"第一次质心距节点真实位置的距离为:" << distance1 <<endl;
	cout<<"第二次质心距节点真实位置的距离为:" << distance2 <<endl<<endl;

	printf	( "请ENTER键退出 " );
 	if	(  getchar() != NULL )  exit(0);

//	}//for

 
}


void	Node_Initial()
{

	srand( (unsigned)time( NULL )  );   
    Node_X.position.x = rand()%400 + 300;
	Node_X.position.y = rand()%400 + 300;
	cout<< "未知节点的坐标为:" << "(" << Node_X.position.x << " , " 
		<< Node_X.position.y << ")" << endl<<endl;

}


void	GetBeaconPosition ()
{
	
	cout << "周围信标节点的坐标及RSSI值为:"<<endl;
	srand( (unsigned)time( NULL )  );  	
	for (int i = 0; i < Number_of_Initial_Beacon;  )
	{
 
		Beacon_Initial[i].position.x = rand()%1000;
		Beacon_Initial[i].position.y = rand()%1000;
		if( (Beacon_Initial[i].position.y < 300) || (Beacon_Initial[i].position.y > 700)
			|| (Beacon_Initial[i].position.x <300) || (Beacon_Initial[i].position.x>700) )
		
		{

			cout << "(" << Beacon_Initial[i].position.x << " , " 
				<< Beacon_Initial[i].position.y << ")" << "  ";
			
			
			/////////////////计算RSSI的值
			double x2 = Beacon_Initial[i].position.x;
			double x1 = Node_X.position.x;
			double y2 = Beacon_Initial[i].position.y;
			double y1 = Node_X.position.y;
			Beacon_Initial[i].RSSI = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); 
			cout << 1000-Beacon_Initial[i].RSSI <<endl;

			i++;
		}//if

	}//for
	cout << endl;
}


void	Calcu_First_Cent( )//计算第一次质心
{	
	double sum_of_x = 0;
	double sum_of_y = 0;
	
	for( int i=0; i<Number_of_Initial_Beacon; i++)
	{
		sum_of_x = sum_of_x + Beacon_Initial[i].position.x;
		sum_of_y = sum_of_y + Beacon_Initial[i].position.y;
	}
	First_Cent.x = sum_of_x / Number_of_Initial_Beacon;
	First_Cent.y = sum_of_y / Number_of_Initial_Beacon;

	cout << "第一次质心计算的结果为:" << "(" << First_Cent.x <<" , " 
		<< First_Cent.y << ")"<<endl<<endl;

}


void	SortBeacon( )// 按照RSSI从大到小把信标节点排序
{
	int i,j,k;
	Node temp;
	for( i=0; i<Number_of_Initial_Beacon; i++ )
    {  
		int k = i;
		for( j=i+1; j<Number_of_Initial_Beacon; j++ )
            if(Beacon_Initial[j].RSSI < Beacon_Initial[k].RSSI )  k=j;
		if(i!=k)
		{ temp =Beacon_Initial[i]; Beacon_Initial[i] = Beacon_Initial[k]; Beacon_Initial[k] = temp;}
   }
	cout <<"根据RSSI值从大到小,第二次选取较近的信标节点为:"<<endl;
    for(i=0; i< Number_of_Second_Beacon; i++)
    {
		Beacon_Second[i] = Beacon_Initial[i];
		cout<<"(" <<Beacon_Second[i].position.x<<" , "
			<< Beacon_Second[i].position.y << ")  " << 1000-Beacon_Second[i].RSSI <<endl;
	}
	cout <<endl<<endl;

}



void Calcu_Second_Cent( )
{
	
	double sum_of_x2 = 0;
	double sum_of_y2 = 0;
	
	for( int i=0; i<Number_of_Second_Beacon; i++)
	{
		sum_of_x2 = sum_of_x2 + Beacon_Second[i].position.x;
		sum_of_y2 = sum_of_y2 + Beacon_Second[i].position.y;
	}
	sum_of_x2 += Node_X.position.x;
	sum_of_y2 += Node_X.position.y;
	Second_Cent.x = sum_of_x2 / (Number_of_Second_Beacon+1);
	Second_Cent.y = sum_of_y2 / (Number_of_Second_Beacon+1);

	cout << "第二次质心计算的结果为:" << "(" << Second_Cent.x <<" , " 
		<< Second_Cent.y << ")"<<endl<<endl;

}

⌨️ 快捷键说明

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