測点を折れ線状に配置し、各測点における隣接点間の交角(夾角)と距離を
測定して、測点の位置を定める測量をトラバース測量といいます。
一昔前までは距離はテープ、角度はトランシットという器械で測定していました
が、電子機器の発達にともない、距離を測定する器械として光波測距儀が普
及してきました。最近では光波測距儀とトランシットが一体になったトータルス
テーションという器械も使われています。
トラバース測量の種類は網の形や精度により、いろんな種類がありますが、
ここでは次の3つの種類について考えます。
(1)開放トラバース
基準点を出発して、最後の測点がどの基準点とも結合しない測量です。各測
点に誤差があってもその誤差を発見できないので、最も簡易な測量に限られ
ます。
(2)閉合トラバース
基準点を出発して、最後の測点が出発点に結合する測量です。最後の測点
が出発点に一致するという条件で測量の誤差がわかり、その誤差を各点に
補正することができます。しかし、図形的に相似な場合など、距離測定に誤差
があってもその誤差を発見できないという欠点があります。
(3)結合トラバース
基準点を出発して、最後の測点が出発点以外の他の基準点に結合する測量
です。これは、他の2つの測量より確実な測量です。
===================================================
プログラム例題23
トラバース測量の入力画面を作成せよ。
=========================================================
複雑なプログラムを作成する場合、
(1)入力画面のデザイン
(2)計算はどのようにするか
(3)どのように出力するか
などについて、考えなければなりません。ここでは(1)について、あまり欲を出
さず必要最小限の画面を作成します。
入力データは、初点名とその座標、初点方向角、終点名とその座標、終点方
向角、各測点名、各水平角、各距離とします。
また、データ数が多くなると途中で入力ミスをした場合、最初から入力し直す
のはたいへんですので、データの入力の修正ができるようにします。
<HTML>
<HEAD>
<TITLE>例題23</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
//
var an, xa, ya, alpa; // 初点名,X,Y,方向角
var bn, xb, yb, alpb; // 終点名,X,Y,方向角
var ii;
ii = 1; // 測点番号
na = new Array(50); // 測点名,夾角,距離
bt = new Array(50); // 測点名,夾角,距離
ds = new Array(50); // 測点名,夾角,距離
var n; // 測点数
//
//
//
// クリアボタンをクリック
//
function onINI( )
{
var
i;
//
document.Form1.AN.value
= "";
document.Form1.XA.value
= 0;
document.Form1.YA.value
= 0;
document.Form1.AA.value
= 0;
//
//
document.Form1.BN.value
= "";
document.Form1.XB.value
= 0;
document.Form1.YB.value
= 0;
document.Form1.AB.value
= 0;
//
ii = 1;
for (i = 1; i<=50; i++)
{
na[i]
= "";
bt[i]
= 0;
ds[i]
= 0;
}
//
document.Form1.NO.value
= ii;
document.Form1.NA.value
= na[ii];
document.Form1.BT.value
= bt[ii];
document.Form1.DS.value
= ds[ii];
}
//
//
// 後退ボタン(<)をクリック
//
function onBCK( )
{
na[ii]
= document.Form1.NA.value;
bt[ii]
= eval(document.Form1.BT.value);
ds[ii]
= eval(document.Form1.DS.value);
//
ii--;
if (ii <= 0) ii=1;
document.Form1.NO.value
= ii;
document.Form1.NA.value
= na[ii];
document.Form1.BT.value
= bt[ii];
document.Form1.DS.value
= ds[ii];
}
//
//
// 前進ボタン(>)をクリック
//
function
onFRD( ) {
na[ii]
= document.Form1.NA.value;
bt[ii]
= eval(document.Form1.BT.value);
ds[ii]
= eval(document.Form1.DS.value);
//
ii++;
if (ii > 50) ii=50;
document.Form1.NO.value
= ii;
document.Form1.NA.value
= na[ii];
document.Form1.BT.value
= bt[ii];
document.Form1.DS.value
= ds[ii];
}
//
//
// 計算ボタンをクリック
//
function onCAL( )
{
var i;
//
//
初点データ
an
= document.Form1.AN.value;
xa
= eval(document.Form1.XA.value);
ya
= eval(document.Form1.YA.value);
alpa
= eval(document.Form1.AA.value);
//
// 終点データ
bn
= document.Form1.BN.value;
xb
= eval(document.Form1.XB.value);
yb
= eval(document.Form1.YB.value);
alpb
= eval(document.Form1.AB.value);
//
// 測点データ
na[ii]
= document.Form1.NA.value;
bt[ii]
= eval(document.Form1.BT.value);
ds[ii]
= eval(document.Form1.DS.value);
//
// 測点数のカウント
n =
0;
for
(i = 1; i<=50; i++) {
if (na[i]
== "E") break;
n++;
}
//
//
// *** 計算部 ***
// ここに、計算部を記述します
//
}
//
// -->
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="Form1">
*** トラバース計算 ***<BR>
<BR>
初点名= <INPUT TYPE="text" NAME="AN"
size=15>
XA= <INPUT TYPE="text" NAME="XA"
size=15>
YA= <INPUT TYPE="text" NAME="YA"
size=15>
αA= <INPUT TYPE="text" NAME="AA"
size=15>
<BR>
終点名= <INPUT TYPE="text" NAME="BN"
size=15>
XB= <INPUT TYPE="text" NAME="XB"
size=15>
YB= <INPUT TYPE="text" NAME="YB"
size=15>
αB= <INPUT TYPE="text" NAME="AB"
size=15>
<BR>
番号= <INPUT TYPE="text" NAME="NO"
size=15>
点名= <INPUT TYPE="text" NAME="NA"
size=15>
測角= <INPUT TYPE="text" NAME="BT"
size=15>
距離= <INPUT TYPE="text" NAME="DS"
size=15>
<BR>
<BR>
<INPUT TYPE="button"
NAME="BCK" VALUE=" < "
onClick="onBCK( )">
<INPUT TYPE="button" NAME="FRD"
VALUE=" > " onClick="onFRD( )">
<INPUT TYPE="button"
NAME="INI" VALUE="クリア"
onClick="onINI( )">
<INPUT TYPE="button" NAME="CAL"
VALUE="計 算" onClick="onCAL( )">
<HR>
</FORM>
</BODY>
</HTML>
実行画面は、つぎのようになります。
var an,
xa, ya, alpa; // 初点名,X,Y,方向角
var bn,
xb, yb, alpb; // 終点名,X,Y,方向角
var ii;
ii = 1; // 測点番号
na = new
Array(50); // 測点名,夾角,距離
bt = new
Array(50); // 測点名,夾角,距離
ds = new
Array(50); // 測点名,夾角,距離
var n; // 測点数
入力中のデータは、各プロシージャで使われるので、グローバル変数にします。
変数 ii は、入力中の測点番号です。変数 n は、入力測点数で、測点名に"E"
が入力されたときの測点番号 -1 です。
// クリアボタンをクリック
//
function
onINI( ) {
var i;
//
document.Form1.AN.value
= "";
document.Form1.XA.value
= 0;
document.Form1.YA.value
= 0;
document.Form1.AA.value
= 0;
//
//
document.Form1.BN.value
= "";
document.Form1.XB.value
= 0;
document.Form1.YB.value
= 0;
document.Form1.AB.value
= 0;
//
ii = 1;
for (i =
1; i<=50; i++) {
na[i]
= "";
bt[i]
= 0;
ds[i] = 0;
}
//
document.Form1.NO.value
= ii;
document.Form1.NA.value
= na[ii];
document.Form1.BT.value
= bt[ii];
document.Form1.DS.value
= ds[ii];
}
クリアボタンをクリックしたとき、実行されます。テキストエリアに未入力の部分
があると、数学関数にその未入力のテキストのデータを渡すとエラーが発生す
るので、各テキストエリアと変数を初期化します。数値の場合 0 を、文字の場
合ヌル "" を代入します。また、測点数は 50 個まで(終了判定の "E" を除く
と 49 )です。
入力開始のときは、まず、クリアボタンをクリックして初期化します。初期化しな
いで、前進ボタンなどをクリックすると、エラーになります。
// 後退ボタン(<)をクリック
//
function
onBCK( ) {
na[ii]
= document.Form1.NA.value; @
bt[ii]
= eval(document.Form1.BT.value); A
ds[ii] = eval(document.Form1.DS.value); B
//
ii--; C
if (ii
<= 0) ii=1; D
document.Form1.NO.value
= ii; E
document.Form1.NA.value
= na[ii]; F
document.Form1.BT.value
= bt[ii]; G
document.Form1.DS.value
= ds[ii]; H
}
後退ボタンをクリックしたとき、実行されます。
@〜Bで、現在表示されているデータを変数にセットします。 na(ii) は測点
名、 bt(ii) は夾角、 ds(ii) は距離です。
Cは、測点番号を前に戻します。ii-- は i = i - 1 と同じです。
Dは、測点番号に0以下はありえないので、最小の番号を1にします。
E〜Hで、前の観測データを表示します。
次の、前進ボタンをクリックしたときの処理もCとDの部分以外は同じです。
ii++ は i = i + 1 と同じです。
// 計算ボタンをクリック
//
function
onCAL( ) {
var i;
//
//
初点データ @
an = document.Form1.AN.value;
xa = eval(document.Form1.XA.value);
ya = eval(document.Form1.YA.value);
alpa = eval(document.Form1.AA.value);
//
// 終点データ A
bn = document.Form1.BN.value;
xb = eval(document.Form1.XB.value);
yb = eval(document.Form1.YB.value);
alpb = eval(document.Form1.AB.value);
//
// 測点データ B
na[ii]
= document.Form1.NA.value;
bt[ii]
= eval(document.Form1.BT.value);
ds[ii] = eval(document.Form1.DS.value);
//
// 測点数のカウント C
n = 0;
for (i = 1; i<=50; i++) {
if (na[i] == "E") break; D
n++;
}
//
//
// *** 計算部 *** E
// ここに、計算部を記述します
//
}
計算ボタンをクリックしたとき、実行されます。
@からBは、画面上のデータを変数に読み込みます。
Cの部分は、測点名が "E" になる前までの測点数をカウントします。
Dは、na(i) が "E" のとき、for のループを抜け出ます。
E以下に、計算と出力のルーチンを記述します。
<FORM
NAME="Form1">
・
・
・
</FORM>
入力画面(フォーム)を作成するブロックです。 <HR> タグは、水平線を入れ
るタグで、終了タグはいりません。
タグの前後のスペースや、改行タグ <BR> を入れる箇所を調整して、見やす
い画面を作ってみて下さい。