# getarea Version. 1.03 (Sep. 24, 2000) # Written by Hisao Kawaura # ### description: データオブジェクトの指定された範囲の面積を求める # 数値変換結果も考慮する。面積の計算は台形公式による。 # # Usage: このスクリプトを${TOPAZMACRODIR}にコピーし、Macro | File から実行して # ください。 # # Caution: このマクロの実行により受けるいかなる損害も保証しませんので注 # 意してください。マクロを実行する前に、記述された内容を良く確 # 認の上利用してください。 # 作者は、このマクロの著作権を放棄しています。マクロ内容の修正 # は自由です。 # データの面積を求めるデータオブジェクトのidを取得する。 if (edittext(0, '面積を求めるデータオブジェクトのidを入力')) { # リターンが入力されたら、edittextの返り値を$idに保管 $id = $_RET; } else { # キャンセルの場合スクリプトを終了 print ("canceled.\n"); exit(1); } # 入力されたidが有効かチェック if($id < 0 || $id >= $graph->frame[$_CUR]->length('data')) { # $idが0より小さいか、dataオブジェクト数より大きい場合は不正 # dataオブジェクトのindexは0から始まることに注意 print ("データオブジェクトのidが不正です。\n"); exit(1); } # データ点数が1以上か $datalength = $graph->frame[$_CUR]->data[$id]->datalength(); if($datalength < 1) { print ("データがありません。\n"); exit(1); } # 面積を求める開始点 if (edittext(0, '面積を求める開始点を入力')) { # リターンが入力されたら、edittextの返り値を$idに保管 $start = $_RET; } else { # キャンセルの場合スクリプトを終了 print ("canceled.\n"); exit(1); } # 面積を求める終了点 if (edittext(-1, '面積を求める終了点を入力。-1でデータの終りまで。')) { # リターンが入力されたら、edittextの返り値を$idに保管 if ($_RET == -1) { $end = $datalength - 1; } else { $end = $_RET; } } else { # キャンセルの場合スクリプトを終了 print ("canceled.\n"); exit(1); } # 入力された開始点、終了点が有効かチェック if($start < 0 || $start >= $datalength - 1) { print ("開始点が有効範囲外です。\n"); exit(1); } if($end <= 0 || $end >= $datalength) { print ("終了点が有効範囲外です。\n"); exit(1); } if($start >= $end) { print ("開始点<終了点を満たしていません。\n"); exit(1); } # 最大値の初期値を0番目のy値として、最大値をサーチする # y値は、Y[$i]で参照されるため、数式変換の結果も考慮されることに注意。 # y[$i]で参照されれば、数式変換前の生データの値が考慮される。 $segment = 0; $area = 0; for ($i = $start + 1; $i < $end; $i++) { $dx = $graph->frame[$_CUR]->data[$id]->X[$i]; $dx -= $graph->frame[$_CUR]->data[$id]->X[$i - 1]; $segment = $graph->frame[$_CUR]->data[$id]->Y[$i - 1]; $segment += $graph->frame[$_CUR]->data[$id]->Y[$i]; $segment /= 2; $segment *= $dx; $area += $segment; } # 結果の表示 print "area = $area ($start -> $end)\n"; exit(0);