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

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

 

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

:rubyで2線の交角を計算する
@echo off
ruby -x %0 jwc_temp.txt
goto:eof

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

#!ruby -Ks -an -i.bak
def sgn(x)
  x = (x ? x.to_f : 0)
  return x == 0 ? 0 : (x > 0 ? 1 : -1)
end
def ln_hpsnap(ln, hp) #線の吸着点を返す
  t = ln_hpdist(ln, hp)
  d = lnslope(ln)
  return hp[0] + t * sin(d), hp[1] - t * cos(d)
end
def ln_hpdist(ln, hp) #線と点の最短距離を返す
  x = hp + ln[0..1]
  return lnlength(x) * sin(lnslope(ln) - lnslope(x))
end
def lnlength(ln) #線長を返す
  x1, y1, x2, y2 = ln
  return hypot(x2 - x1, y2 - y1)
end
def lnslope(ln) #線の角度を返す
  x1, y1, x2, y2 = ln
  return atan2(y2 - y1, x2 - x1)
end
def line_x_poi(ln1, ln2) # 線と線の交点
  x1, y1, x2, y2 = ln1
  dx1 = x2 - x1
  dy1 = y2 - y1
  m1 = dx1 == 0 ? 1e20 : dy1 / dx1
  x3, y3, x4, y4 = ln2
  dx2 = x4 - x3
  dy2 = y4 - y3
  m2 = dx2 == 0 ? 1e20 : dy2 / dx2
  aa = m1 - m2
  if aa.abs < 1e-10 then aa = 0 end
  if aa != 0
    b1 = y1 - m1 * x1
    b2 = y3 - m2 * x3
    return [(b2 - b1) / aa, (m1 * b2 - m2 * b1) / aa], aa
  else
    return [0, 0], aa
  end
end
BEGIN {
  include Math; hp = ; ln =
}
case $_
  when /^hp[1-9]/
    hp[$F[0].gsub(/(hp|ln|-)/,"").to_i] = $F[1, 2].map{|x| x.to_f}
  when /^hhp[1-9]ln/
    lnn = $F[0].gsub(/(hhp|ln|-)/,"").to_i
  when /^[ ]/
    if $F.size == 4
      ln[lnn]= $F.map{|x| x.to_f}
    end
end
END {
  pc, aa = line_x_poi(ln[1], ln[2])
  if aa != 0
    p1 = ln_hpsnap(ln[1], hp[1])
    p2 = ln_hpsnap(ln[2], hp[2])
    d2 = lnslope(pc + p2)
    d1 = lnslope(pc + p1)
    xang = (d2 - d1) * 180 / PI
  else
    xang = 0
  end
  if sgn(xang - 180) == 1 then xang -= 360 end
  if sgn(xang + 180) ==-1 then xang += 360 end
  puts "h#2線の交角 = ∠%.6f゚ : d1=%.6f゚ : d2=%.6f゚" % [xang, d1 * 180 / PI, d2 * 180 / PI]
}
__END__