📄 eczx.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 + -