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

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

 

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

:mshtaで2線の交角を計算する
@echo off
if exist jwc_temp.txt (
  copy jwc_temp.txt myfiles > nul
  mshta %~f0 < myfiles > jwc_temp.txt
)
goto:eof

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

<script>
function sgn(x) {
  return x == 0 ? x : ( x > 0 ? 1 : -1 )
}
function lnlength(x) { //線長を返す
  return Math.sqrt(Math.pow(x[3] - x[1], 2) + Math.pow(x[2] - x[0], 2))
}
function lnslope(x) { //線の角度を返す
  return Math.atan2(x[3] - x[1], x[2] - x[0])
}
function ln_hpdist(ln, hp) { //線と点の最短距離を返す
  y = hp.concat(ln.slice(0,2))
  return lnlength(y) * Math.sin( lnslope(ln) - lnslope(y) )
}
function ln_hpsnap(ln, hp){ //線の吸着点を返す
  t = ln_hpdist(ln, hp)
  d = lnslope(ln)
  return [hp[0] + t * Math.sin(d), hp[1] - t * Math.cos(d)]
}
function inters(ln1, ln2){
  dx = ln1[2] - ln1[0]
  dy = ln1[3] - ln1[1]
  if (dx == 0) { m1 = 1e20 } else { m1 = dy / dx }
  dx = ln2[2] - ln2[0]
  dy = ln2[3] - ln2[1]
  if (dx == 0) { m2 = 1e20 } else { m2 = dy / dx }
  aa = m1 - m2
  if (aa != 0) {
    u1 = ln1[1] - m1 * ln1[0]
    u2 = ln2[1] - m2 * ln2[0]
    return [(u2 - u1) / aa, (m1 * u2 - m2 * u1) / aa]
  } else {
    return "he処理できません"
  }
}

hp =
ln =

with (new ActiveXObject("Scripting.FileSystemObject")) {
  f = GetStandardStream(0) //stdin
  g = GetStandardStream(1) //stdout
  while (! f.AtEndOfStream) {
    F = ($_ = f.ReadLine()).split(/\s+/)
    if (/^hp([12])ln/i .test($_)) {
      hp[i = RegExp.$1] = F.slice(1, 3); for (j in hp[i]) { hp[i][j] *= 1.0 }
      continue
    }
    if (/^hhp([12])ln/i .test($_)) { i = RegExp.$1; continue }
    if (/^\s+/i.test($_)) { //ln 指示線
      ln[i] = F; for (j in ln[i]) { ln[i][j] *= 1.0 }
      continue
    }
  }
  f.close()
  pc = inters(ln[1], ln[2])
  if (pc.length == 2) {
    p1 = ln_hpsnap(ln[1], hp[1])
    p2 = ln_hpsnap(ln[2], hp[2])
    d1 = lnslope(pc.concat(p1))
    d2 = lnslope(pc.concat(p2))
    xang = (d2 - d1) * 180 / Math.PI
  } else {
    xang = 0
  }
  if (sgn(xang - 180) == 1) { xang -= 360 }
  if (sgn(xang + 180) == -1) { xang += 360 }
  g.WriteLine("h#2線の交角 = ∠" + xang.toFixed(6) + 
  "゚ : d1=" + (d1 * 180 / Math.PI).toFixed(6) + 
  "゚ : d2=" + (d2 * 180 / Math.PI).toFixed(6) + "゚")
}
close()
</script>

 

 

スクリプト言語は jscript を使用しています。