外部変形は データのやり取りをテキストファイルで行うので プログラム言語は 自由に選ぶことができます。図形は機能的かつシンプルなため、数多くのユーザーに受け入れられています。
mshtaで線の端点に矢印を描く
:mshtaで線の端点に矢印を描く
@echo off
if exist jwc_temp.txt (
copy jwc_temp.txt myfiles > nul
mshta %~f0 < myfiles > jwc_temp.txt
)
goto:eof
REM #jww
REM #1ln 線を指示してください
REM #bz
REM #e
<script>
function lnlength(x) { //線長を返す
return Math.sqrt(Math.pow(x[3] - x[1], 2) + Math.pow(x[2] - x[0], 2))
}
function lnslope(x) { //線の角度を返す
return Math.atan2(x[3] - x[1], x[2] - x[0])
}
function lnpoint(x, pm) { //線データの値を返す
//始点 pm=-1, 終点 pm=1 の座標を返す
return pm == 0 ? [(x[0] + x[2]) / 2, (x[1] + x[3]) / 2] : ( pm < 0 ? [x[0], x[1]] : [x[2], x[3]] )
}
function ln_hpends(ln, hp) {
l1 = lnlength(hp.concat(lnpoint(ln,-1)))
l2 = lnlength(hp.concat(lnpoint(ln, 1)))
pm = l1 < l2 ? -1 : 1
return pm
}
function ln_hpsnap(x, p) { //線の吸着点を返す
t = ln_hpdist(x, p)
d = lnslope(x)
return p ? [p[0] * 1.0 - t * Math.sin(d), p[1] * 1.0 + t * Math.cos(d)] : p
}
function ln_hpdist(x, p) { //線と点の最短距離を返す
d = lnslope(x)
y = lnpoint(x, -1).concat(p)
return lnlength(y) * Math.sin( d - lnslope(y) )
}
function polarto(p, r, d) {
return [p[0] * 1.0 + r * Math.cos(d), p[1] * 1.0 + r * Math.sin(d)]
}
function deg(x) { return x / Math.PI * 180 }
function arrow(pt1, d, size, xang, xan2) {
l = size
d *= Math.PI / 180
a = xang * Math.PI / 180 / 2.0
pt2 = polarto(pt1, l, d - a)
pt4 = polarto(pt1, l, d + a)
if (xan2 == 180) {
sl = ["sl", pt1, pt2, pt4].join(" ").replace(/,/g, " ")
} else {
c = Math.cos(a) - Math.sin(a) * Math.tan( (90.0 - xan2 / 2.0) * Math.PI / 180)
pt3 = polarto(pt1, l * c, d)
sl = ["sl", pt1, pt2, pt3, pt4].join(" ").replace(/,/g, " ")
}
return sl
}
with (new ActiveXObject("Scripting.FileSystemObject")) {
f = GetStandardStream(0) //stdin
g = GetStandardStream(1) //stdout
while (! f.AtEndOfStream) {
F = ($_ = f.ReadLine()).split(/\s+/)
if (/^hp1/i .test($_)) { p1 = F.slice(1, 3) }
if (/^\s+/i .test($_)) { ln1 = F } //ln 指示線
}
f.close()
g.WriteLine("bz")
g.WriteLine(
arrow(
pt = lnpoint(ln1, ln_hpends(ln1, p1)),
deg(lnslope(pt.concat(ln_hpsnap(ln1, p1)))),
size = 5, //矢印の長さ( 図寸 )
xang = 45, //矢印の交角( ゚ )
xan2 = 135 //矢尻の交角( ゚ )
)
)
}
close()
</script>