//program file name #include #include #include #include #include using namespace std; //大きな配列はグローバルとして宣言する。 float v1[1202][1202]; //ラスターデータ1 float v2[1202][1202]; //ラスターデータ2 int main(int argc, char *argv[]) { int i, j; char rn[128]; //地域名 char vn[128]; //変数名 char un[128]; //単位名 int dt; //データのタイプ(未使用) int xas, yas; //要素数 float xs, ys; //モデルの大きさ char str[128]; //ヘッダーとデータを区切る文字列 int ii, jj; float ux, uy, uxy; float gr, grmin; int d; //2つのラスターデータは、すべてゼロで初期化しておく。 for (j=0; j<=1201; j++) { for (i=0; i<=1201; i++) { v1[i][j] = 0; v2[i][j] = 0; } } //コマンドライン引数が1つでない場合は、使用法を表示して終了する。 if (argc != 2) { cerr << "Usage: stream \n"; return 1; } //ファイルが開けなかった場合は、その旨表示して終了する。 ifstream fin(argv[1]); if (!fin) { cerr << "Cannot open file.\n"; return 1; } //データの読み込み。 fin.getline(rn, 80); fin.getline(vn, 80); fin.getline(un, 80); fin >> dt >> xas >> yas; fin >> xs >> ys >> str; for (j=1; j<=yas; j++) { for (i=1; i<=xas; i++) { fin >> v1[i][j]; } } fin.close(); //データの外挿 for (j=1; j<=yas; j++) { v1[0][j] = v1[1][j] * 2 - v1[2][j]; v1[xas + 1][j] = v1[xas][j] * 2 - v1[xas - 1][j]; } for (i=1; i<=xas; i++) { v1[i][0] = v1[i][1] * 2 - v1[i][2]; v1[i][yas + 1] = v1[i][yas] * 2 - v1[i][yas - 1]; } v1[0][0] = v1[1][1] * 2 - v1[2][2]; v1[xas + 1][0] = v1[xas][1] * 2 - v1[xas - 1][2]; v1[0][yas + 1] = v1[1][yas] * 2 - v1[2][yas - 1]; v1[xas + 1][yas + 1] = v1[xas][yas] * 2 - v1[xas - 1][yas - 1]; //データの処理 ux = xs / xas; uy = ys / yas; uxy = sqrt(ux * ux + uy * uy); for (j=1; j<=yas; j++) { for (i=1; i<=xas; i++) { ii = i; jj = j; d = 0; //探索流路が4辺の縁に接したら終わる。 while (((ii >= 1) && (ii <= xas)) && ((jj >= 1) && (jj <= yas))) { //最大下降傾斜方向を8方向から決定する。決定できなければd(方向)はゼロのまま。 d = 0; gr = 0; grmin = 0; gr = (v1[ii][jj-1] - v1[ii][jj]) / uy; if (gr < 0) { d = 1; //北向き grmin = gr; } gr = (v1[ii+1][jj-1] - v1[ii][jj]) / uxy; if (gr < grmin) { grmin = gr; d = 2; //北東向き } gr = (v1[ii+1][jj] - v1[ii][jj]) / ux; if (gr < grmin) { grmin = gr; d = 3; //東向き } gr = (v1[ii+1][jj+1] - v1[ii][jj]) / uxy; if (gr < grmin) { grmin = gr; d = 4; //南東向き } gr = (v1[ii][jj+1] - v1[ii][jj]) / uy; if (gr < grmin) { grmin = gr; d = 5; //南向き } gr = (v1[ii-1][jj+1] - v1[ii][jj]) / uxy; if (gr < grmin) { grmin = gr; d = 6; //南西向き } gr = (v1[ii-1][jj] - v1[ii][jj]) / ux; if (gr < grmin) { grmin = gr; d = 7; //西向き } gr = (v1[ii-1][jj-1] - v1[ii][jj]) / uxy; if (gr < grmin) { grmin = gr; d = 8; //北西向き } //流路上を移動する。 if (d == 1) { //北に移動 ii = ii; jj = jj - 1; } else if (d == 2) { //北東に移動 ii = ii + 1; jj = jj - 1; } else if (d == 3) { //東に移動 ii = ii + 1; jj = jj; } else if (d == 4) { //南東に移動 ii = ii + 1; jj = jj + 1; } else if (d == 5) { //南に移動 ii = ii; jj = jj + 1; } else if (d == 6) { //南西に移動 ii = ii - 1; jj = jj + 1; } else if (d == 7) { //西に移動 ii = ii - 1; jj = jj; } else if (d == 8) { //北西に移動 ii = ii - 1; jj = jj - 1; } else break; //流路先を決定できなければ終わる。 v2[ii][jj]++; } } } //変数名に処理内容を適宜追加する。 strcpy(vn, "集水域"); strcpy(un, "cells"); //結果の出力。 //標準出力(画面)に出力するので、ファイルに保存する場合は、リダイレクトする。 cout << rn << "\n" << vn << "\n" << un << "\n" ; cout << dt << "\n" << xas << "\n" << yas << "\n"; cout << xs << "\n" << ys << "\n" << str << "\n"; for (j=1; j<=yas; j++) { for (i=1; i<=xas; i++) { cout << v2[i][j] << "\n"; } } return 0; } //プログラムの終わり。