jw_cad 外部変形 - (744) gawkで線の端点に矢印を描く -

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

 

gawkで線の端点に矢印を描く

:gawkで線の端点に矢印を描く
@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 #1ln 線を指示してください
REM #bz
REM #e

#!ここから more +n %0 の n 行目:最初の行は 0 行
function deg(x) { return x / PI * 180 }
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 }
function lnpoint(ln, pm) { #始点 pm=-1,  終点 pm=1 の座標を返す
  $0 = ln
  if (pm == "") pm = 0
  return pm == 0 ? ($1 + $3) / 2 FS ($2 + $4) / 2 : ( pm < 0 ? $1 FS $2 : $3 FS $4 )
}
function ln_hpends(ln, hp,  l1, l2) {
  l1 = lnlength(hp FS lnpoint(ln,-1))
  l2 = lnlength(hp FS lnpoint(ln, 1))
  return l1 < l2 ? -1 : 1
}
function polar(r, d, w) { #方向余弦のセット
  return r * cos(d) FS r * sin(d) * (w ? w : 1)
}
function moveto(x, y, d) { #点x を 相対距離 y [ a, b ] へ移動
  if (d == "") d = 0
  return ($0 = x FS (d == 0 ? y : rot(y, d))) ? ($1 + $3) FS ($2 + $4) : 0 FS 0
}
function polarto(x, r, d, w) { #点x を 極座標 [ r, d ] で相対的に移動する
  return moveto(x, polar(r, d, w))
}
function arrow(pt1, d, size, xang, xan2) {
  l = size
  d *= PI / 180
  a = xang * PI / 180 / 2.0
  pt2 = polarto(pt1, l, d - a)
  pt4 = polarto(pt1, l, d + a)
  if (xan2 == 180) {
    sl = "sl" FS pt1 FS pt2 FS pt4
  } else {
    b = (90.0 - xan2 / 2.0) * PI / 180
    c = cos(a) - sin(a) * sin(b) / cos(b)
    pt3 = polarto(pt1, l * c, d)
    sl = "sl" FS pt1 FS pt2 FS pt3 FS pt4
  }
  return sl
}
BEGIN { CONVFMT = OFMT = "%.15g"; PI = atan2(1, 1) * 4 }
/^hq/ { print "bz" }
/^hp1ln/ { p1 = $2 FS $3 }
/^[ ]/ {
  ln1 = $0
  pt = lnpoint(ln1, ln_hpends(ln1, p1))
  p2 = lnpoint(ln1,-ln_hpends(ln1, p1))
  d = deg(lnslope(pt FS p2))
  print arrow(pt, d, size = 5, xang = 45, xan2 = 120)
}