jw_cad 外部変形 - (740) gawkで2線の交角を計算する -

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

 

gawkで2線の交角を計算する

:gawkで2線の交角を計算する
@echo off
for /f %%n in ('gawk "/^#!/ { print NR }" %0') do (
  copy jwc_temp.txt myfiles > nul
  more +%%n %0 | gawk -f - myfiles > jwc_temp.txt
)
goto:eof

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

#!ここから more +n %0 の n 行目:最初の行は 0 行
function sgn(x) { return x == 0 ? x : (x == sqrt(x * x) ? 1 : -1) }
function abs(x) { return x > 0 ? x : -x }
function inters(lni, lnj) {
  $0 = lni
  dx1 = $3 - (x1 = $1)
  dy1 = $4 - (y1 = $2)
  m1 = dx1 == 0 ? 1e20 : dy1 / dx1
  $0 = lnj
  dx2 = $3 - (x3 = $1)
  dy2 = $4 - (y3 = $2)
  m2 = dx2 == 0 ? 1e20 : dy2 / dx2
  aa = m1 - m2
  if (abs(aa) < 1e-10) aa = 0
  if (aa != 0){
    b1 = y1 - m1 * x1
    b2 = y3 - m2 * x3
    return (b2 - b1) / aa FS (m1 * b2 - m2 * b1) / aa
  }
}
function ln_hpsnap(ln, hp,  t, d) {
  t = ln_hpdist(ln, hp)
  d = lnslope(ln)
  return ($0 = hp) ? $1 + t * sin(d) FS $2 - t * cos(d) : hp
}
function ln_hpdist(ln, hp,  x) {
  $0 = ln
  x = hp FS $1 FS $2
  return lnlength(x) * sin(lnslope(ln) - lnslope(x))
}
function lnlength(x) { return ($0 = x) ? sqrt(($3 - $1) ^ 2 + ($4 - $2) ^ 2) : 0 }
function lnslope(x) { return ($0 = x) ? atan2($4 - $2, $3 - $1) : 0 }
BEGIN { CONVFMT = OFMT = "%.15g" }
END {
  pc = inters(ln[1], ln[2])
  if (aa != 0) {
    p1 = ln_hpsnap(ln[1], hp[1])
    p2 = ln_hpsnap(ln[2], hp[2])
    d2 = lnslope(pc FS p2)
    d1 = lnslope(pc FS p1)
    xang = (d2 - d1) * 45 / atan2(1, 1)
  } else {
    xang = 0
  }
  if (sgn(xang - 180) == 1) xang -= 360;
  if (sgn(xang + 180) ==-1) xang += 360;
  printf "h#∠%.03f゚ ", xang
}
/^hp[1-9]/ { hp[substr($1, 3, 1)] = $2 FS $3 }
/^[ ]/ && NF == 4 { lnn++; ln[lnn] = $0 }