jw_cad 外部変形 - (562) なでしこで2線の交角を計算する -

外部変形は データのやり取りをテキストファイルで行うので プログラム言語は 自由に選ぶことができます。図形は機能的かつシンプルなため、数多くのユーザーに受け入れられています。

 

なでしこで2線の交角を計算する

/* なでしこで2線の交角を計算する
@cls & echo off
path C:\nadesiko_1_589;%path%
copy jwc_temp.txt myfiles > nul
cnako %0 > jwc_temp.txt
goto:eof

REM #jww
REM #1%dln 線を指示してください。
REM #2%dln 線を指示してください。
REM #bz
REM #e
*/

ATAN2(y, x)
 もし(x = 0)なら(PI / 2 * SIGN(y))を戻す
 aとは実数 = ARCTAN(y / x)
  もし(x < 0)なら
    もし(y < 0)なら
      a = a - PI
    違えば
      a = a + PI
 aを戻す
●ABS(x)
 (x * SIGN(x))を戻す
●DEG(x)
 xを度変換して戻す
●RAD(x)
 xをラジアン変換して戻す
●SPLIT(s)
  sを「 」で区切ったものを戻す
●INTERS(線1, 線2)
  F1とは配列; dx1とは実数; dy1とは実数; m1とは実数; u1とは実数
  F2とは配列; dx2とは実数; dy2とは実数; m2とは実数; u2とは実数
  aaとは実数
  F1 = 線1を「 」で区切ったもの
  dx1 = F1[2] - F1[0]
  dy1 = F1[3] - F1[1]
  もし(dx1 = 0)なら
    m1 = 10 ^ 20
  違えば
    m1 = dy1 / dx1
  F2 = 線2を「 」で区切ったもの
  dx2 = F2[2] - F2[0]
  dy2 = F2[3] - F2[1]
  もし(dx2 = 0)なら
    m2 = 10 ^ 20
  違えば
    m2 = dy2 / dx2
  aa = m1 - m2
  もし(ABS(aa) < 1e-10)なら(aa = 0)
  もし(aa <> 0)なら
    u1 = F1[1] - m1 * F1[0]
    u2 = F2[1] - m2 * F2[0]
    「{(u2 - u1) / aa} {(m1 * u2 - m2 * u1) / aa}」を戻す
  違えば
    "he処理できません"を表示
    終了
●LN_HPSNAP(線, 点)
  Fとは配列 = SPLIT(点)
  tとは実数 = LN_HPDIST(線, 点)
  dとは実数 = LNSLOPE(線)
  「{F[0] + t * SIN(d)} {F[1] - t * COS(d)}」を戻す
●LN_HPDIST(線, 点)
  Fとは配列 = SPLIT(線)
  Xとは文字列 = "{点} {F[0]} {F[1]}"
  (LNLENGTH(X) * SIN(LNSLOPE(線) - LNSLOPE(X)))を戻す
●LNLENGTH(線)
  Fとは配列 = SPLIT(線)
  HYPOT(F[2] - F[0], F[3] - F[1])を戻す
●LNSLOPE(線)
  Fとは配列 = SPLIT(線)
  ATAN2(F[3] - F[1], F[2] - F[0])を戻す

「myfiles」を毎行読んで反復
  もし、(対象を「^hq」で正規表現マッチ)ならば
    「bz」を表示
    続ける
  もし、(対象を「^hp(\d+)ln-?\s+(\S+ \S+)」で正規表現マッチ)ならば
    hp[抽出文字列[0]] = 抽出文字列[1]
    続ける
  もし、(対象を「^hhp(\d+)ln」で正規表現マッチ)ならば
    i = 抽出文字列[0]
    続ける
  もし、(対象を「^\s+(\S+ \S+ \S+ \S+)」で正規表現マッチ)ならば
    ln[i] = 抽出文字列[0]

pc = INTERS(ln[1], ln[2])
p1 = LN_HPSNAP(ln[1], hp[1])
p2 = LN_HPSNAP(ln[2], hp[2])
d1 = DEG(LNSLOPE("{pc} {p1}"))
d2 = DEG(LNSLOPE("{pc} {p2}"))
xang = d2 - d1
もし(SIGN(xang - 180) = 1)なら(xang = xang - 360)
もし(SIGN(xang + 180) =-1)なら(xang = xang + 360)
xang = ROUND(xang*1000)/1000
d1 = ROUND(d1*1000)/1000
d2 = ROUND(d2*1000)/1000
「h#∠{xang}゚ {d1} {d2}」を表示

 

 

 

 

角度は左回りを正としています。