jw_cad 外部変形 - (746) 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 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 sgn(x) { return x == 0 ? x : (x == sqrt(x * x) ? 1 : -1) }
BEGIN { CONVFMT = OFMT = "%.15g" }
/^hq/ { print "bz" }
/^hp[1-9]/ { hp[substr($1, 3, 1)] = $2 FS $3 }
/^[ ]/ && NF == 4 {
  p1 = $1 FS $2; p2 = $3 FS $4; p3 = ($1 + $3) / 2 FS ($2 + $4) / 2; ln = $0
}
END {
  p0 = hp[1]
  l1 = lnlength(p0 FS p1)
  l2 = lnlength(p0 FS p2)
  l3 = lnlength(p0 FS p3)
  pc = p3
  if (sgn(l2 - l1) + sgn(l3 - l1) == 2) pc = p1;
  if (sgn(l1 - l2) + sgn(l3 - l2) == 2) pc = p2;
  l = lnlength(ln) / 2
  d = lnslope(ln)
  lx = l * cos(d)
  ly = l * sin(d)
  $0 = pc
  print $1 + ly, $2 - lx, $1 - ly, $2 + lx
}