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