13.3 開放トラバース [もくじへ] [トップページへ] [前ページへ]
===================================================
プログラム例題24
開放トラバースのプログラムを作成せよ。
=========================================================
考え方
初点方向角αA、初点座標 A(XA,YA)、点Aでの測角 β1、測距S1 とすると、
点Aより点1への方向角α1は、
α1 = αA + β1 ( α1 が360°を超えたら360°を減ずる )
点1の座標は、
X1 = XA + S1(α1)
Y1 = YA + S1(α1)
となります。
また、点1より点2への方向角α2は、
α2 = α1 + β2 + 180°( α2 が360°を超えたら360°を減ずる )
方向角α2が求められれば、点2の座標は点1の座標と同様に、
X2 = X1 + S2(α2)
Y2 = Y1 + S2(α2)
となります。
以下同様にして各点の座標を求めることができます。したがって、一般式は
次のようになります。
αn = αn-1 + βn + 180°( αn が360°を超えたら360°を減ずる )
Xn = Xn-1 + Sn(αn)
Yn = Yn-1 + Sn(αn)
プログラム
<HTML>
<HEAD>
<TITLE>例題24</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
//
//
var an, xa, ya, alpa; // 初点名,X,Y,方向角
var bn, xb, yb, alpb; // 終点名,X,Y,方向角
var ii = 1; // 測点番号
na = new Array(50); // 測点名
bt = new Array(50); // 夾角
ds = new Array(50); // 距離
var n; // 測点数
//
ai = new Array(50); // 方向角
x = new Array(50); // X座標
y = new Array(50); // Y座標
dx = new Array(50); // X座標差
dy = new Array(50); // Y座標差
var doo, fun, byo; // 度分秒
//
//
//
// クリアボタンをクリック
//
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
Dobyo( x ) {
var d, f, b, r;
d
= Math.floor(x);
f
= Math.floor((x - d)*100);
b
= Math.floor(((x - d)*100 - f)*100 + 0.5);
r
= d*3600 + f*60 + b;
return
r;
}
//
//
// 角度の変換(秒を度分秒に)
//
function
Byodfb( x ) {
doo
= Math.floor(x/3600);
fun
= Math.floor((x - doo*3600)/60);
byo
= x - doo*3600 - fun*60;
if (byo<0)
byo = 0;
}
//
//
// 四捨五入
//
function
Rund(x,y) {
var sg, r;
if
(x>=0) {sg = 1;}
else
{sg =-1;}
r =
sg*Math.floor(Math.abs(x)*Math.pow(10,y) + 0.5)/Math.pow(10,y);
return
r;
}
//
//
// 計算ボタンをクリック
//
function onCAL( )
{
var i, r;
//
//
初点データ
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++;
}
//
//
// *** 計算部 ***
// 角度を秒に変換
alpa
= Dobyo(alpa);
for
(i = 1; i<=n; i++) {
bt[i]
= Dobyo(bt[i]);
}
//
ai[1]
= alpa + bt[1];
while (ai[1]>=1296000)
{
ai[1]
= ai[1] - 1296000;
}
for
(i = 2; i<=n; i++) {
ai[i]
= ai[i-1] + bt[i] + 648000;
while (ai[i]>=1296000)
{
ai[i]
= ai[i] - 1296000;
}
}
//
dx[1]
= Rund(ds[1]*Math.cos(ai[1]/648000*Math.PI),3);
dy[1]
= Rund(ds[1]*Math.sin(ai[1]/648000*Math.PI),3);
x[1]
= xa + dx[1];
y[1]
= ya + dy[1];
for
(i = 2; i<=n; i++) {
dx[i]
= Rund(ds[i]*Math.cos(ai[i]/648000*Math.PI),3);
dy[i]
= Rund(ds[i]*Math.sin(ai[i]/648000*Math.PI),3);
x[i]
= x[i-1] + dx[i];
y[i]
= y[i-1] + dy[i];
}
Kaiho( );
//
}
//
//
// 開放トラバース計算結果出力
//
function Kaiho( ) {
var i, r;
//
document.write("<CENTER>","*** 開放トラバース計算 ***","</CENTER><BR>");
//
document.write("<CENTER><TABLE
BORDER='1'>");
document.write("<TR
ALIGN='CENTER'><TD ALIGN='left'>","測点 ","</TD>");
document.write("<TD
ALIGN='right'>"," 夾角 ","</TD>");
document.write("<TD
ALIGN='right'>"," 方向角
","</TD>");
document.write("<TD
ALIGN='right'>"," 距離 ","</TD>");
document.write("<TD
ALIGN='right'>"," X ","</TD>");
document.write("<TD
ALIGN='right'>"," Y ","</TD></TR>");
document.write("<TR
ALIGN='CENTER'><TD ALIGN='center' ></TD>");
document.write("<TD
ALIGN='right'>"," β ","</TD>");
document.write("<TD
ALIGN='right'>"," α ","</TD>");
document.write("<TD
ALIGN='right'>"," S ","</TD>");
document.write("<TD
ALIGN='right'>"," ΔX ","</TD>");
document.write("<TD
ALIGN='right'>"," ΔY ","</TD></TR>");
document.write("<TR
ALIGN='CENTER'><TD ALIGN='center' ></TD>");
document.write("<TD
ALIGN='right'>"," δβ ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," δX ","</TD>");
document.write("<TD
ALIGN='right'>"," δY ","</TD></TR>");
//
// 1行目
document.write("<TR
ALIGN='CENTER'><TD ALIGN='left'
>",an,"</TD>");
r =
Byodfb(bt[1]);
document.write("<TD
ALIGN='right'>",doo + "-" + fun + "-"
+ byo,"</TD>");
r = Byodfb(alpa);
document.write("<TD
ALIGN='right'>",doo + "-" + fun + "-"
+ byo,"</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>",xa,"</TD>");
document.write("<TD
ALIGN='right'>",ya,"</TD></TR>");
// 2行目
document.write("<TR
ALIGN='CENTER'><TD ALIGN='left' ></TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
r =
Byodfb(ai[1]);
document.write("<TD
ALIGN='right'>",doo + "-" + fun + "-"
+ byo,"</TD>");
document.write("<TD
ALIGN='right'>",ds[1],"</TD>");
document.write("<TD
ALIGN='right'>",dx[1],"</TD>");
document.write("<TD
ALIGN='right'>",dy[1],"</TD></TR>");
// 3行目
document.write("<TR
ALIGN='CENTER'><TD ALIGN='left' ></TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD></TR>");
// i
for
(i = 1; i<=n-1; i++) {
// iの1行目
document.write("<TR
ALIGN='CENTER'><TD ALIGN='left' >",na[i],"</TD>");
r
= Byodfb(bt[i+1]);
document.write("<TD
ALIGN='right'>",doo + "-" + fun + "-"
+ byo,"</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>",x[i],"</TD>");
document.write("<TD
ALIGN='right'>",y[i],"</TD></TR>");
// iの2行目
document.write("<TR
ALIGN='CENTER'><TD ALIGN='left' ></TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
r
= Byodfb(ai[i]);
document.write("<TD
ALIGN='right'>",doo + "-" + fun + "-"
+ byo,"</TD>");
document.write("<TD
ALIGN='right'>",ds[i+1],"</TD>");
document.write("<TD
ALIGN='right'>",dx[i+1],"</TD>");
document.write("<TD
ALIGN='right'>",dy[i+1],"</TD></TR>");
// iの3行目
document.write("<TR
ALIGN='CENTER'><TD ALIGN='left' ></TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD></TR>");
}
// n行目
document.write("<TR
ALIGN='CENTER'><TD ALIGN='left'
>",na[n],"</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>"," ","</TD>");
document.write("<TD
ALIGN='right'>",x[n],"</TD>");
document.write("<TD
ALIGN='right'>",y[n],"</TD></TR>");
document.write("</TABLE>");
}
//
// -->
</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>
入力データと実行結果
XA=-6132.14, YA=8462.15
閉合トラバースや、結合トラバースにも使える表にしました。空白になっている
箇所があるのは、そのためです。
プログラムの説明
ai = new
Array(50); // 方向角
x = new
Array(50); // X座標
y = new
Array(50); // Y座標
dx = new
Array(50); // X座標差
dy = new
Array(50); // Y座標差
var doo,
fun, byo; // 度分秒
入力画面のプログラムに、追加したグローバル変数です。
// 角度の変換(度を秒に)
//
function Dobyo( x ) {
var d, f,
b, r;
d
= Math.floor(x);
f
= Math.floor((x - d)*100);
b
= Math.floor(((x - d)*100 - f)*100 + 0.5);
r
= d*3600 + f*60 + b;
return
r;
}
//
//
// 角度の変換(秒を度分秒に)
//
function Byodfb( x ) {
doo
= Math.floor(x/3600);
fun
= Math.floor((x - doo*3600)/60);
byo
= x - doo*3600 - fun*60;
if (byo<0) byo = 0;
}
測量計算では、角度は1秒も無視できません。ラジアンや度のままだと、場合
によっては数秒の誤差が出る場合があります。したがって、秒に変換して計
算誤差が出ないようにしています。これらは、そのための関数プロシージャ
です。
// 四捨五入
//
function Rund(x,y) {
var sg, r;
if (x>=0) {sg = 1;}
else {sg =-1;}
r =
sg*Math.floor(Math.abs(x)*Math.pow(10,y) + 0.5)/Math.pow(10,y);
return r;
}
変数 sg は、四捨五入するデータの符号(±1)を代入します。abs( ) は、絶
対値を求める関数です。したがって、このプロシージャでは、データの絶対値
を小数第y+1位を四捨五入した後、符号を元に戻します。JavaScript には、
四捨五入の関数があります。
r = Math.round(x*Math.pow(10,y))/Math.pow(10,y) でこのプログラムと
同じ結果が得られます。
// *** 計算部 ***
// 角度を秒に変換
alpa = Dobyo(alpa); @
for (i = 1; i<=n; i++) {
bt[i] = Dobyo(bt[i]); A
}
//
ai[1]
= alpa + bt[1]; B
while (ai[1]>=1296000) { C
ai[1]
= ai[1] - 1296000;
}
for (i = 2; i<=n; i++) {
ai[i]
= ai[i-1] + bt[i] + 648000; D
while (ai[i]>=1296000) {
ai[i]
= ai[i] - 1296000;
}
}
//
dx[1] =
Rund(ds[1]*Math.cos(ai[1]/648000*Math.PI),3); E
dy[1] =
Rund(ds[1]*Math.sin(ai[1]/648000*Math.PI),3); F
x[1] = xa + dx[1]; G
y[1] = ya + dy[1]; H
for (i = 2; i<=n; i++) {
dx[i]
= Rund(ds[i]*Math.cos(ai[i]/648000*Math.PI),3); I
dy[i] =
Rund(ds[i]*Math.sin(ai[i]/648000*Math.PI),3); J
x[i]
= x[i-1] + dx[i]; K
y[i] = y[i-1] + dy[i]; L
}
Kaiho(
); M
開放トラバースの計算部です。
@A 入力された角度データをすべて秒に変換します。
B 初点から測点1への方向角の計算です。
C Bの方向角が360°(129600秒)を超えたら、360°を減じます。
C Bの方向角が360°(129600秒)を超えたら、360°を減じます。
while 文
for 文はくり返し回数の決まっている場合に使いますが、 while 文はくり返し
回数の決まっていない場合に用います。
while ( 条件式 ) {
くりかえす文
}
のように記述し、条件式を満たしている間くり返します。
D B以外の方向角の計算です。測点2以降の方向角計算は同じなので、
ループに入れます。
EF 初点からの座標差を求めます。座標差は小数第3位に丸めます。
GH 測点1の座標を求めます。
I〜L 測点2以降の座標差と座標を求めます。
M 開放トラバース計算結果出力のプロシージャを実行します。
// 開放トラバース計算結果出力
//
function Kaiho( ) {
・
・
・
}
開放トラバース計算結果出力のプロシージャです。閉合トラバースと結合トラ
バースにも使えるように設計してあります。
JavaScript には、表示桁をそろえるフォーマット文がないので、HTML の表作
成のタグを使って表を作成します。しかし、表作成はなかなか面倒でなもので
す。このプログラムを作る時も、何回か試行錯誤をくりかえして、なんとか表ら
しいものにすることができました。
したがって、ここでは表作成のタグの説明をしますので、それを理解した上で
プログラムを解析し、すっきりした表を作ってみてください。
表作成のタグについて
表の始まりと終わりのタグは、<TABLE> </TABLE> です。その中に行を作
るには <TR> </TR> 、列を作るには <TD> </TD> のタグを使います。
また、HTML では行の中に列を作るという考え方をしますので、たとえ行の中
に列が1列しかなくても、<TR> <TD> </TD> </TR> のように使います。
表に枠を付ける時は <TABLE BORDER="1"> のようにします。BORDER
の数値は枠の太さを表します。
枠の中に入れるデータの位置を調整するには、<TD ALIGN="right"> のよ
うに、ALIGN を使います。左揃えは left、中央揃えは center、右揃えは
right を指定します。
たとえば、次のように HTML を書くと、
<TABLE BORDER="1">
<TR><TD>(1,1)</TD><TD>(1,2)</TD><TD>(1,3)</TD></TR>
<TR><TD>(2,1)</TD><TD>(2,2)</TD><TD>(2,3)</TD></TR>
</TABLE>
次のような、2行3列の表ができます。
BORDER などに値を指定する場合、"1" のようにダブルクォーテーション
で囲みますが、これを JavaScript で記述する場合、次のように内側はシン
グルクォーテーションにしなければなりません。
document.write("<CENTER><TABLE BORDER='1'>");
次回は、『閉合トラバース』の予定です。(10月10日ごろ)
この講座に対する、ご意見やご要望はメールでお願いします。
『JavaScriptによる測量計算プログラミング入門』
講師 大愚良寛