マルチホップのプログラム
1000×1000のフィールドにランダムに100個の点を発生させて、9個のAPという点を設置し、APに点を繋いでいきます。直でAPに繋げない場合は他の点を介して1段ホップで繋ぎます。APと点の通信可能距離を150とする、点も同じ。ただし繋がりが他のAPと重ならないようにする。
直繋ぎまでは簡単なのですが、1段繋ぎのとき点が重なってしまいどうもうまくできません。どうしたらうまく繋げるかの条件のアドバイスをお願いします。
直繋ぎのまでのプログラムは以下です。
//点の設定
for(i=0;i<=109;i++){
x=random(1000);
y=random(1000);
zahyo[i][0]=x;
zahyo[i][1]=y;
if(i>0){for(j=0;j<=i-1;j++){if(x==zahyo[j][0]&&y==zahyo[j][1]){i--;}}}
}
//APのの位置設定
zahyo[0][0]=100,zahyo[0][1]=100;
zahyo[1][0]=100,zahyo[1][1]=900;
zahyo[2][0]=500,zahyo[2][1]=500;
zahyo[3][0]=900,zahyo[3][1]=100;
zahyo[4][0]=900,zahyo[4][1]=900;
zahyo[5][0]=100,zahyo[5][1]=500;
zahyo[6][0]=500,zahyo[6][1]=100;
zahyo[7][0]=500,zahyo[7][1]=900;
zahyo[8][0]=900,zahyo[8][1]=500;
g=0;
//座標を求め2次元配列にして格納
for(i=0;i<109;i++){
for(j=i+1;j<109;j++){
//2点間の座標の距離計算
x1=fabs(zahyo[i][0]-zahyo[j][0]);
y1=fabs(zahyo[i][1]-zahyo[j][1]);
d=sqrt(pow(x1,2)+pow(y1,2));
m[g][0]=i; //端点1
m[g][1]=zahyo[i][0]; //端点1の座標x
m[g][2]=zahyo[i][1]; //端点1の座標y
m[g][3]=j; //端点2
m[g][4]=zahyo[j][0]; //端点2の座標x
m[g][5]=zahyo[j][1]; //端点2の座標y
m[g][6]=d; //端点1と端点2の距離
m[g][7]=999; //APの点
m[g][8]=999; //直接繋がっている点
m[g][9]=999; //一段で繋がっている点
m[g][10]=999; //APの点
m[g][11]=999; //直接繋がっている点
m[g][12]=999; //APの種類
g=g+1;
}
}
//距離150以下の端末を切る
t=0;
for(j=0;j<g;j++){
if(150>m[j][6]){
m[t][0]=m[j][0]; //端点1
m[t][1]=m[j][1]; //端点1の座標x
m[t][2]=m[j][2]; //端点1の座標y
m[t][3]=m[j][3]; //端点2
m[t][4]=m[j][4]; //端点2の座標x
m[t][5]=m[j][5]; //端点2の座標y
m[t][6]=m[j][6]; //端点1と端点2の距離
t=t+1;
}
}
for(i=0;i<9;i++){retu1[i]=0;} //初期化
//直繋ぎ
for(i=0;i<9;i++){ //APの点
count=0;
for(j=0;j<t;j++){
//if(count==6){break;} //Axの制限数
if(m[j][0]==i){ //APの点がiならば
m[j][7]=i; //APの点
m[j][8]=m[j][3];//端点2をm[j][8]に格納
m[j][12]=0;
retu1[i]=retu1[i]+1;
//端点1 %3.0f(%3.0f,%3.0f),端点2 %3.0f(%3.0f,%3.0f),距離 %f,AP%1.0f⇒Ax%3.0f⇒Bx%3.0f,種類%1.0f\n
fprintf(fp,"%3.0f,%3.0f,%3.0f,%3.0f,%3.0f,%3.0f,%f,%1.0f,%3.0f,%3.0f,%1.0f\n",m[j][0],m[j][1],m[j][2],m[j][3],m[j][4],m[j][5],m[j][6],m[j][7],m[j][8],m[j][9],m[j][12]);
//if(2==i){count=count+1;}//AP(500,500)を制限
//count=count+1; //全てのAPを制限
}
}
ave1[i]=ave1[i]+retu1[i];//後で合計を出す
}
お礼
ありがとうございました。 調べたところ経度のみ補正計算が必要なことが分かりました。 勘違いして両方に同じ処理していたためおかしな作図を していたことが分かりました。