14.2 円曲線の中間点計算   [もくじへ] [トップページへ] [前ページへ]

===================================================

プログラム例題28

円曲線を設置後の中間点計算をおこなえ。

=========================================================

考え方

         

 

主要点が決まれば、これを使って中間点の計算になります。この計算に必要

なデータは、主要点の座標値、半径R、線形の向き(右カーブか左カーブ)、計

算開始点の測点番号(追加距離)などです。

中間点の番号は、100mごとの測点番号(ステーションNo.)で表したり、20m ご

との測点番号(No.)を用いて表します。

たとえば、

ステーションNo. 5 + 20.0000  は 5×100 + 20.0000 = 520.0000

20m ごとの No. 25 + 15.224525×20 + 15.2245 = 515.2245

を表します。

ここでは、ステーションNo.を用いることにします。

 

計算順序と計算式を示します。

(1)BPからBCの直線部の中間点の計算

   BPからBCへの方向角をα1、BPの測点番号を 5 + 45.2345 とします。

   No. 5 + 60 までの区間距離 L

     L = (5×100 + 60) - (5×100 + 45.2345)

   No. 5 + 60 の座標

     X = XBP + Lcosα1

     Y = YBP + Lsinα1

(2)曲線部の中間点の計算  

   円の半径をR、BCの測点番号を 8 + 12.5467 とします。

   円の中心MからBCへの方向角αM

     右カーブの場合

     αM = α1 + 90°

     左カーブの場合

     αM = α1 - 90°

   No. 8 + 20 までの区間距離 L

     L = (8×100 + 20) - (8×100 + 12.5467)

   No. 8 + 20 の座標

     右カーブの場合

     X = XM + Rcos(αM + L/R)

     Y = YM + Lsin(αM + L/R)

     左カーブの場合

     X = XM + Rcos(αM - L/R)

     Y = YM + Lsin(αM - L/R)

(3)ECからEPの直線部の中間点の計算    

   ECからEPへの方向角をα2、ECの測点番号を 9 + 23.1121 とします。

   No. 9 + 40 までの区間距離 L

     L = (9×100 + 40) - (9×100 + 23.1121)

   No. 9 + 40 の座標

     X = XEC + Lcosα2

     Y = YEC + Lsinα2

と計算すればいいのですが、区間距離 L を求めるには、もう少し検討する必

要があります。

計算する点が、BPからBCの直線部か、曲線部か、あるいはECからEPの直線

部かを判断しなければなりません。これには、つぎのような順序で計算すれば

いいでしょう。

   BPのステーションNo.より追加距離 LBP を計算する。

   BPとBCの距離に LBP を加え、BCの追加距離 LBC を計算する。

   曲線長 CL に LBC を加え、ECの追加距離 LEC を計算する。

   ECとEPの距離に LEC を加え、EPの追加距離 LEP を計算する。

   計算点の追加距離を LS とすると、

   LS = LBP + DL

   @  LS < LBC のとき

        初めてこの条件をはずれた時、BC点を計算

        BPからBCの直線部の中間点の計算

          LS = LS + DL

        @へもどる

   A LBC ≦ LS < LEC のとき

        初めてこの条件をはずれた時、EC点を計算

        LBC = LS のとき LS = LS + DL を求めた後、Aへもどる

        曲線部の中間点の計算

          LS = LS + DL

        Aへもどる

   B LEC ≦ LS < LEP のとき        

        初めてこの条件をはずれた時、EP点を計算

        LEC = LS のとき LS = LS + DL を求めた後、Bへもどる

        ECからEPの直線部の中間点の計算

          LS = LS + DL

        Bへもどる

   

 


プログラム

 

<HTML>
<HEAD>
   <TITLE>例題28(円曲線の中間点計算)</TITLE>

<SCRIPT LANGUAGE="JavaScript">
<!--
// 入力データ
        var XBP,YBP;          // BPの座標
        var XIP,YIP;          // IPの座標
        var XEP,YEP;          // EPの座標
        var RR;               // R
//
        var SP;              // ステーションピッチ
        var DL;              // 等間隔長
        var FN;              // BP No.FN + SN
        var SN;              //
        var sta1, sta2;      // 追加距離をFNとSNに変換
        var BPT;             // BPの追加距離
        var BCT;             // BCの追加距離
        var ECT;             // ECの追加距離
        var EPT;             // EPの追加距離
        var n;               // 中間点数
//
        XBP = -51274.2779;
        YBP = -31305.5806;
        XIP = -51813.3467;
        YIP = -31423.3201;
        XEP = -52144.8230;
        YEP = -31551.5362;
        RR = 2000;
//
        SP = 100;
        DL = 20;
        FN = 0;
        SN = 0;
//
// 出力データ
        var XBC,YBC;         // BCの座標
        var XEC,YEC;         // ECの座標
        var XSP,YSP;         // SPの座標
        var XM,YM;           // Mの座標
        var IA;              // IA
        var CL;              // CL
        var AL1,AL2;         // α1,α2
        var L1,L2;           // L1,L2
        var TL;              // TL
        var SL;              // SL
//
        TK = new Array(500);   // 中間点の追加距離
        CX = new Array(500);   // 中間点のX座標
        CY = new Array(500);   // 中間点のY座標
        SA = new Array(500);   // 中間点の接線方向角
        GA = new Array(500);   // 中間点の弦方向角
        GL = new Array(500);   // 中間点間の直線距離
//
//
//
        var doo, fun, byo;     // 度分秒
        var fs, es;            // ステーションNo.
//
        function Dist(xa, ya, xb, yb) {
                var ss;
//
                ss = Math.sqrt(Math.pow((xb-xa),2) + Math.pow((yb - ya),2));
                return ss;
        }
//
//
        function Alph(xa, ya, xb, yb) {
                var dx, dy;
                var Thi;              // atan(dy/dx)
                var A;
//
                dx = xb - xa;
                dy = yb - ya;
//
                if (dx == 0) {
                     if (dy == 0) { A = 0; }
                     if (dy > 0) { A = Math.PI/2; }
                     if (dy < 0) { A = Math.PI*3/2; }
                }
//
                if (dx != 0) { Thi = Math.atan(dy/dx); }
//
                if (dx > 0) {  A = Thi + 2*Math.PI;  }
//
                if (dx < 0) {  A = Thi + Math.PI;  }
//
                if (A >= 2*Math.PI) { A = A - 2*Math.PI; }
                return A;
//
        }

//
//
//  角度の変換(秒を度分秒に)
//
        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;
        }
//
//
//  追加距離をステーションNo.に変換
//
        function Sta(x) {
                sta1 = Math.floor(x/SP);
                sta2 = Rund(x - sta1*SP,4);
        }
//
//
                // 計算ボタンをクリック
//
        function onCAL( ) {
                var i, r;
                var x1,y1,x2,y2;
//
                // α1, α2, L1, L2
                x1 = XBP;
                y1 = YBP;
                x2 = XIP;
                y2 = YIP;
                AL1 = Alph(x1,y1,x2,y2);
                L1 = Dist(x1,y1,x2,y2);
                x1 = XIP;
                y1 = YIP;
                x2 = XEP;
                y2 = YEP;
                AL2 = Alph(x1,y1,x2,y2);
                L2 = Dist(x1,y1,x2,y2);
//
                // IA
                IA = AL2 - AL1;
                if (IA<0) { IA = IA + 2*Math.PI; }
//
                // TL
                TL = Math.abs(RR)*Math.tan(IA/2);
//
                // BC
                XBC = XBP + (L1-TL)*Math.cos(AL1);
                YBC = YBP + (L1-TL)*Math.sin(AL1);
//
                // EC
                XEC = XIP + TL*Math.cos(AL2);
                YEC = YIP + TL*Math.sin(AL2);
//
                // M
                if (RR>0) {
                   XM = XBC + RR*Math.cos(AL1+Math.PI/2);
                   YM = YBC + RR*Math.sin(AL1+Math.PI/2);
                }
                else {
                   XM = XBC + Math.abs(RR)*Math.cos(AL1-Math.PI/2);
                   YM = YBC + Math.abs(RR)*Math.sin(AL1-Math.PI/2);
                }
//
                // SL
                SL = Math.abs(RR)/Math.cos(IA/2) - Math.abs(RR);
//
                // SP
                if (RR>0) {
                   XSP = XIP + SL*Math.cos(AL1+Math.PI/2+IA/2);
                   YSP = YIP + SL*Math.sin(AL1+Math.PI/2+IA/2);
                }
                else {
                   XSP = XIP + SL*Math.cos(AL1-Math.PI/2-IA/2);
                   YSP = YIP + SL*Math.sin(AL1-Math.PI/2-IA/2);
                }
//
                // CL
                CL = Math.abs(RR)*IA;
//
//
//
//
//
//========================= 中間点計算 =====================================
//
//        TK[]          // 中間点の追加距離
//        CX[]          // 中間点のX座標
//        CY[]          // 中間点のY座標
//        SA[]          // 中間点の接線方向角
//        GA[]          // 中間点の弦方向角(後ろの点からの)
//        GL[]          // 中間点間の直線距離(後ろの点からの)
//
//      追加距離
                BPT = FN*SP + SN;
                BCT = BPT + L1 - TL;
                ECT = BCT + CL;
                EPT = ECT + L2 - TL;
//
//      BP
                Ls = BPT;
                i = 1;
                TK[i] = Ls;
                CX[i] = XBP;
                CY[i] = YBP;
                SA[i] = AL1;
                GA[i] = 0;
                GL[i] = 0;
//
//      BP<BC
                Ls = Math.floor(Ls/DL)*DL + DL;
//
                while (Ls<BCT) {
                   i++;
                   TK[i] = Ls;
                   CX[i] = XBP + (Ls - BPT)*Math.cos(AL1);
                   CY[i] = YBP + (Ls - BPT)*Math.sin(AL1);
                   SA[i] = AL1;
                   GA[i] = AL1;
                   GL[i] = TK[i]-TK[i-1];
                   Ls = Ls + DL;
                }
//
//      BC
                if (Ls != BCT) {
                   i++;
                   TK[i] = BCT;
                   CX[i] = XBC;
                   CY[i] = YBC;
                   SA[i] = AL1;
                   GA[i] = AL1;
                   GL[i] = TK[i]-TK[i-1];
                }
//
//      BC<EC (円区間)
                while (Ls<ECT) {
                   i++;
                   TK[i] = Ls;
                   if (RR>0) {
                      CX[i] = XM + RR*Math.cos(AL1 - Math.PI/2 + (Ls - BCT)/RR);
                      CY[i] = YM + RR*Math.sin(AL1 - Math.PI/2 + (Ls - BCT)/RR);
                   }
                   else {
                      CX[i] = XM + Math.abs(RR)*Math.cos(AL1 + Math.PI/2 + (Ls - BCT)/RR);
                      CY[i] = YM + Math.abs(RR)*Math.sin(AL1 + Math.PI/2 + (Ls - BCT)/RR);
                   }
                   SA[i] = AL1 + (Ls - BCT)/RR;
                   x1 = CX[i-1];
                   y1 = CY[i-1];
                   x2 = CX[i];
                   y2 = CY[i];
                   GA[i] = Alph(x1,y1,x2,y2);
                   GL[i] = Dist(x1,y1,x2,y2);
                   Ls = Ls + DL;
                }
//
//      EC
                if (Ls != ECT) {
                   i++;
                   TK[i] = ECT;
                   CX[i] = XEC;
                   CY[i] = YEC;
                   SA[i] = AL2;
                   x1 = CX[i-1];
                   y1 = CY[i-1]
                   x2 = CX[i];
                   y2 = CY[i];
                   GA[i] = Alph(x1,y1,x2,y2);
                   GL[i] = Dist(x1,y1,x2,y2);
                }
//
//      EC<EP
                while (Ls<EPT) {
                   i++;
                   TK[i] = Ls;
                   CX[i] = XEC + (Ls - ECT)*Math.cos(AL2);
                   CY[i] = YEC + (Ls - ECT)*Math.sin(AL2);
                   SA[i] = AL2;
                   GA[i] = AL2;
                   GL[i] = TK[i]-TK[i-1];
                   Ls = Ls + DL;
                }
//
//      EP
                if (Ls != EPT) {
                   Ls = EPT;
                   n = i + 1;
                   TK[n] = Ls;
                   CX[n] = XEP;
                   CY[n] = YEP;
                   SA[n] = AL2;
                   GA[n] = AL2;
                   GL[n] = TK[i]-TK[i-1];
                }
//
                En();
//
        }
//
//
//
function En() {
      var i, r;
//
//
//=================== 円曲線設置計算結果出力 ================================
//
      document.write ("<CENTER>","*** 円曲線設置計算 ***","</CENTER><BR>");
//
      document.write ("<CENTER><TABLE BORDER='0'>");
      document.write ("<TR ALIGN='CENTER'>");
      document.write ("<TD ALIGN='right'>","   IA","</TD>");
      r = Byodfb(IA*648000/Math.PI);
      byo = Rund(byo,2);
      document.write ("<TD ALIGN='right'>",doo + "-" + fun + "-" + byo,"</TD>");
      document.write ("<TD ALIGN='right'>","    R","</TD>");
      document.write ("<TD ALIGN='right'>",RR,"</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'>");
      document.write ("<TD ALIGN='left'>","曲線の要素","</TD></TR>");
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","   TL","</TD>");
      TL = Rund(TL,4);
      document.write ("<TD ALIGN='right'>",TL,"</TD>");
      document.write ("<TD ALIGN='right'>","  (M) X","</TD>");
      XM = Rund(XM,4);
      document.write ("<TD ALIGN='right'>",XM,"</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","   CL","</TD>");
      CL = Rund(CL,4);
      document.write ("<TD ALIGN='right'>",CL,"</TD>");
      document.write ("<TD ALIGN='right'>","    Y","</TD>");
      YM = Rund(YM,4);
      document.write ("<TD ALIGN='right'>",YM,"</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","  CL/2","</TD>");
      r = Rund(CL/2,4);
      document.write ("<TD ALIGN='right'>",r,"</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","   SL","</TD>");
      SL = Rund(SL,4);
      document.write ("<TD ALIGN='right'>",SL,"</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'>");
      document.write ("<TD ALIGN='left'>","曲線の主要点座標","</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","  NAME","</TD>");
      document.write ("<TD ALIGN='right'>","    X    ","</TD>");
      document.write ("<TD ALIGN='right'>","    Y    ","</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","   BC","</TD>");
      XBC = Rund(XBC,4);
      document.write ("<TD ALIGN='right'>",XBC,"</TD>");
      YBC = Rund(YBC,4);
      document.write ("<TD ALIGN='right'>",YBC,"</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","   SP","</TD>");
      XSP = Rund(XSP,4);
      document.write ("<TD ALIGN='right'>",XSP,"</TD>");
      YSP = Rund(YSP,4);
      document.write ("<TD ALIGN='right'>",YSP,"</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","   EC","</TD>");
      XEC = Rund(XEC,4);
      document.write ("<TD ALIGN='right'>",XEC,"</TD>");
      YEC = Rund(YEC,4);
      document.write ("<TD ALIGN='right'>",YEC,"</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","   IP","</TD>");
      XIP = Rund(XIP,4);
      document.write ("<TD ALIGN='right'>",XIP,"</TD>");
      YIP = Rund(YIP,4);
      document.write ("<TD ALIGN='right'>",YIP,"</TD></TR>");
//
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","   α1","</TD>");
      r = Byodfb(AL1*648000/Math.PI);
      byo = Rund(byo,2);
      document.write ("<TD ALIGN='right'>",doo + "-" + fun + "-" + byo,"</TD></TR>");
      document.write ("<TR ALIGN='CENTER'><TD ALIGN='right'>","   α2","</TD>");
      r = Byodfb(AL2*648000/Math.PI);
      byo = Rund(byo,2);
      document.write ("<TD ALIGN='right'>",doo + "-" + fun + "-" + byo,"</TD></TR>");
      document.write ("</TABLE>");
      document.write ("<BR>");
      document.write ("<BR>");
//
//
//========================= 中間点計算出力 ==================================
//
      document.write ("<CENTER>","*** 中間点計算 ***","</CENTER><BR>");
//
      document.write ("<CENTER><TABLE BORDER='0'>");
      document.write ("<TR ALIGN='CENTER'>");
      document.write ("<TD ALIGN='left'>","STA.No.","</TD>");
      document.write ("<TD ALIGN='center'>","X","</TD>");
      document.write ("<TD ALIGN='center'>","Y","</TD>");
      document.write ("<TD ALIGN='right'>","S","</TD>");
      document.write ("<TD ALIGN='right'>","弦方向角","</TD>");
      document.write ("<TD ALIGN='right'>","接線方向角","</TD>");
      document.write ("</TR>");
//
      for (i=1;i<=n;i++) {
      document.write ("<TR ALIGN='CENTER'>");
      r = Sta(TK[i]);
      document.write ("<TD ALIGN='left'>",sta1 + "+" + sta2,"</TD>");
      CX[i] = Rund(CX[i],4);
      CY[i] = Rund(CY[i],4);
      document.write ("<TD ALIGN='right'>",CX[i],"</TD>");
      document.write ("<TD ALIGN='right'>",CY[i],"</TD>");
      GL[i] = Rund(GL[i],4);
      document.write ("<TD ALIGN='right'>",GL[i],"</TD>");
      r = Byodfb(GA[i]*648000/Math.PI,doo,fun,byo);
      byo = Rund(byo,1);
      document.write ("<TD ALIGN='right'>",doo + "-" + fun + "-" + byo,"</TD>");
      r = Byodfb(SA[i]*648000/Math.PI,doo,fun,byo);
      byo = Rund(byo,1);
      document.write ("<TD ALIGN='right'>",doo + "-" + fun + "-" + byo,"</TD></TR>");
      }
      document.write ("</TABLE>");
}
//
// -->
</SCRIPT>

</HEAD>


<BODY>


<FORM NAME="Form1">
 *** 円曲線設置計算 ***<BR>
<BR>
<INPUT TYPE="button" NAME="CAL" VALUE="計 算"
onClick="onCAL( )">
<HR>

</FORM>



</BODY>
</HTML>


入力データと実行結果

     入力データ

      BPの座標
            XBP = -51274.2779
            YBP = -31305.5806
      IPの座標
            XIP = -51813.3467
            YIP = -31423.3201
      EPの座標
            XEP = -52144.8230
            YEP = -31551.5362
      半径
            RR = 2000.0000
          ステーションピッチ
         SP = 100
      等間隔長
            DL = 20
      計算開始点の追加距離
            No. 0 + 0

     ※データ入力は、代入文で直接代入しています。

     ※ボタンをクリックして実行します。

 

     計算結果の一部

  

 


プログラムの説明

曲線設置のプログラムに、中間点計算のプログラムを追加する形で作成して

あります。

VBScript では、データファイルが作れないので(クッキーという特別なファイル

は使えます)、設置計算から連続して計算した方が、データ入力の手間がはぶ

けます。

そのため、プログラムがかなり長くなりデバッグ(虫取り)も難しくなるので、な

るべく注釈を多く入れた方がいいでしょう。

 

var SP;              // ステーションピッチ
var DL;
              // 等間隔長
var FN;
              // BP No.FN + SN
var SN;
              //
var sta1, sta2;
      // 追加距離をFNとSNに変換
var BPT;
             // BPの追加距離
var BCT;
             // BCの追加距離
var ECT;
             // ECの追加距離
var EPT;
             // EPの追加距離
var n;
               // 中間点数

中間点計算で追加した、グローバル変数です。グローバルにするのは、どの

プロシージャからも使えるようにするためです。変数名はなるべく分かりやす

い名前にした方がいいですが、あまり長すぎるとスペルミスにつながりますの

で注意して下さい。

//  追加距離をステーションNo.に変換
//
function Sta(x) {
        sta1 = Math.floor(x/SP);
        sta2 = Rund(x - sta1*SP,4);
}

追加距離をステーションNo.に変換するプロシージャです。端数は、小数第4位

に丸めるように、四捨五入のプロシージャを呼び出しています。

このように、プロシージャの中から他のプロシージャも呼び出すこともできるの

です。

//========================= 中間点計算 =====================================
//
//        TK[]          // 中間点の追加距離
//        CX[]          // 中間点のX座標
//        CY[]          // 中間点のY座標
//        SA[]          // 中間点の接線方向角
//        GA[]          // 中間点の弦方向角(後ろの点からの)
//        GL[]          // 中間点間の直線距離(後ろの点からの)
//
//      追加距離
                
BPT = FN*SP + SN;
                BCT = BPT + L1 - TL;
                ECT = BCT + CL;
                EPT = ECT + L2 - TL;

中間点計算の始めの部分です。プログラムが長くなると、個々の変数名を覚

えておくのは大変なので、注釈を入れます。

追加距離は、主要点の追加距離です。計算中の追加距離と主要点の追加

距離を比較して、直線部か曲線部かを判定するときに、この値が必要になり

ます。

 

//      BP
        
Ls = BPT;
        i = 1;
        TK[i] = Ls;
        CX[i] = XBP;
        CY[i] = YBP;
        SA[i] = AL1;
        GA[i] = 0;
        GL[i] = 0;
//
//      BP<BC
        
Ls = Math.floor(Ls/DL)*DL + DL;
//
        
while (Ls<BCT) {
           i++;
           TK[i] = Ls;
           CX[i] = XBP + (Ls - BPT)*Math.cos(AL1);
           CY[i] = YBP + (Ls - BPT)*Math.sin(AL1);
           SA[i] = AL1;
           GA[i] = AL1;
           GL[i] = TK[i]-TK[i-1];
           Ls = Ls + DL;
        }

BPからBC部の計算です。弦長と弦方向角は、前点からの値です。そのため、

開始点では、どちらもにしてあります。

変数 Ls は、計算中の点の追加距離です。結果表示のときにステーションNo.

に変換します。

//      BC
        
if (Ls != BCT) {
           
i++;
           
TK[i] = BCT;
           
CX[i] = XBC;
           
CY[i] = YBC;
           
SA[i] = AL1;
           
GA[i] = AL1;
           
GL[i] = TK[i]-TK[i-1];
        
}
//
//      BC<EC (円区間)
        
while (Ls<ECT) {
           
i++;
           
TK[i] = Ls;
           
if (RR>0) {
              
CX[i] = XM + RR*Math.cos(AL1 - Math.PI/2 + (Ls - BCT)/RR);
              
CY[i] = YM + RR*Math.sin(AL1 - Math.PI/2 + (Ls - BCT)/RR);
           
}
           
else {
              
CX[i] = XM + Math.abs(RR)*Math.cos(AL1 + Math.PI/2 + (Ls - BCT)/RR);
              
CY[i] = YM + Math.abs(RR)*Math.sin(AL1 + Math.PI/2 + (Ls - BCT)/RR);
           
}
           
SA[i] = AL1 + (Ls - BCT)/RR;
           
x1 = CX[i-1];
           
y1 = CY[i-1];
           
x2 = CX[i];
           
y2 = CY[i];
           
GA[i] = Alph(x1,y1,x2,y2);
           
GL[i] = Dist(x1,y1,x2,y2);
           
Ls = Ls + DL;
        
}

BCからEC部の計算です。右カーブか左カーブかで、計算式が異なる部分で

す。

接線方向角 SA[i] は、半径 RR の符号を使って1つの式で表せます。

弦方向角 GA[i] と弦長 GL[i] は2点の座標から求めています。

//      EC
if (Ls != ECT) {
   i++;
   TK[i] = ECT;
   CX[i] = XEC;
   CY[i] = YEC;
   SA[i] = AL2;
   x1 = CX[i-1];
   y1 = CY[i-1]
   x2 = CX[i];
   y2 = CY[i];
   GA[i] = Alph(x1,y1,x2,y2);
   GL[i] = Dist(x1,y1,x2,y2);
}
//
//      EC<EP
while (Ls<EPT) {
   i++;
   TK[i] = Ls;
   CX[i] = XEC + (Ls - ECT)*Math.cos(AL2);
   CY[i] = YEC + (Ls - ECT)*Math.sin(AL2);
   SA[i] = AL2;
   GA[i] = AL2;
   GL[i] = TK[i]-TK[i-1];
   Ls = Ls + DL;
}
//
//      EP
if (Ls != EPT) {
   Ls = EPT;
   n = i + 1;
   TK[n] = Ls;
   CX[n] = XEP;
   CY[n] = YEP;
   SA[n] = AL2;
   GA[n] = AL2;
   GL[n] = TK[i]-TK[i-1];
}

ECからEP部までの計算です。変数 n は、計算された中間点の総数です。

計算結果の出力は、設置計算の後に追加しました。


[もくじへ] [トップページへ]

 りょうかんのアドバイス

ちょっと難しいでしたね。特に、計算する点が始めの直線部、曲線部、後の直

線部のどの部分に属するのかを判別するのが難しかったと思います。

こういう時、役に立つのがフローチャートです。りょうかんも複雑な計算のとき

には、フローチャートを書きます。今回は、フローチャートを書けば便利なんだ

がと思いながら、結局最後まで書きませんでした。面倒くさいのはやっぱりだ

めです。

しかし、皆さんはいま勉強中です。プログラミングの専門書で、しっかり勉強し

てください。フローチャートはプログラミングの基礎です。

また、このようにプログラムが長くなってくると、プログラムミスを探すのがたい

へんです。プログラムを入力したら、まず保存してから実行します。このとき、

プログラムに文法的なエラーがあると、エラーのある行を知らせてくれますが、

注釈で行番号をところどころに入れておくと便利です。

 

次回は、『巾杭計算』の予定です。(11月30日ごろ)

この講座に対する、ご意見やご要望はメールでお願いします。

      『JavaScriptによる測量計算プログラミング入門』 

                                講師 りょうかん


[もくじへ] [トップページへ] [次ページへ]