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