| Top Page | プログラミング | Perl 目次 | 索引 |


#       gen_forest.pl  仮想の毎木調査データを作る

$x_max = 20;   #  X座標の最大値
$y_max = 20;   #  Y座標の最大値

$tall_prob = 0.3;  #  高木層メンバーである確率
$mean_tall = 12;   #  その場合の平均樹高
$var_tall = 4;     #  変異幅 ($mean_tall +/- $var_tall)
$mean_short = 3;   #  高木層に届いてないものの平均樹高
$var_short = 2;    #  変異幅 ($mean_short +/- $var_short)

#  種名リスト(同じものが複数あると,その分,その種の相対頻度が高くなる)
@sp_list = ("クヌギ", "クヌギ", "クヌギ", "コナラ", "コナラ", "コナラ", "コナラ", 
           "エゴノキ", "エゴノキ",  "シラカシ", "シラカシ", 
           "アラカシ", "アカシデ", "クリ",);

print "species   X       Y       height  dbh\n";    # ヘッダ行

for ($ix = 0; $ix < $x_max; ++$ix) {   # 1 メートル区画ごとに1本の木
    for ($iy = 0; $iy < $y_max; ++$iy) {

        $x = rand() + $ix;    # 位置は1メートル区画内でランダムに.
        $y = rand() + $iy;

        # 種を選ぶ.
        $species = $sp_list[int(@sp_list * rand())];  # @sp_listは要素数として評価

        if (rand() < $tall_prob) {   # 高木
            $height = $mean_tall + $var_tall * (rand() - 0.5);
        }
        else {                       # 高木じゃない
            $height = $mean_short + $var_short * (rand() - 0.5);
        }

        $dbh =  0.8 * ($height ** 1.25);  # 樹高に応じて太さ決める(適当)

        printf "%-16s%.2f\t%.2f\t%.1f\t%.1f\n", $species, $x, $y, $height, $dbh;
    }
}