指定したy値を与えるx値を求めファイルにセーブする
カレントframeに読み込まれている全ての数値データに対し、ユーザが与えたy値を与えるようなx値をデータ点の補間により求め、その結果をファイルに書き出します。ここではファイルへの書き込み方法について学びます。
# CUI関数'edittext'により、ユーザがy値の入力を行います。入力
# がキャンセルされるとスクリプトは終了します。
if (!edittext(0, 'input y-value'))
{
print "canceled\n";
exit(1);
}
# ファイルに書き込む内容を保持する変数$resultsをnull文字に初期化
# します
$results = '';
# ユーザの入力値は$_RETに返されますので、$yvalに格納します。
$yval = $_RET;
# 読み込まれているデータファイル数を$lengthに代入します。
$length = $graph->frame[$_CUR]->length('data');
# 各データファイルに関し処理を行います。
for ($i = 0; $i < $length; $i++)
{
# データ点数を取得し$pointnoに格納します。
$pointno = $graph->frame[$_CUR]->data[$i]->datalength();
# 各データ点に関し処理を行います。
for ($j = 0; $j < $pointno - 1; $j++)
{
$y1 = $graph->frame[$_CUR]->data[$i]->Y[$j];
$dy1 = $y1 - $yval;
$y2 = $graph->frame[$_CUR]->data[$i]->Y[$j + 1];
$dy2 = $y2 - $yval;
# $dy1 * $dy2 <= 0 であればこの2点間でユーザが与えた
# y値をデータが横切ったと判断します。
if ($dy1 * $dy2 <= 0)
{
# この時のx値を直線補間で求めます。
$x1 = $graph->frame[$_CUR]->data[$i]->X[$j];
$x2 = $graph->frame[$_CUR]->data[$i]->X[$j + 1];
$x = ($yval - $y1) / ($y2 - $y1) * ($x2 - $x1) + $x1;
# 結果を、"ファイル名 \t x値 \n"の形式で$resultsに追加します。
# ピリオドは文字列の連結を行うオペレータであることに注意します。
$results .= $graph->frame[$_CUR]->data[$i]->filename . "\t" . $x . "\n";
break;
}
}
}
# CUI関数'editfilename'により、ユーザが結果を保管するファイル名を入力
# します。
if (!editfilename('', 'save filename'))
{
print "canceled\n";
exit(1);
}
$outfile = $_RET;
# 書き込みモードでファイルをオープンし、ファイルハンドルOUTFに対応
# させます。
open(OUTF, ">$outfile");
# ファイルハンドルOUTFに結果を書き込みます。
print OUTF $results;
# ファイルハンドルOUTFをクローズします。
close (OUTF);