外部変形は データのやり取りをテキストファイルで行うので プログラム言語は 自由に選ぶことができます。図形は機能的かつシンプルなため、数多くのユーザーに受け入れられています。
パワーシェルで線の複線を引く
:パワーシェルで線の複線を引く
@echo off
for /f "delims=:" %%n in ('findstr /n "^#!" %0') do (
more +%%n %0 | powershell -command -
)
goto:eof
REM #jww
REM #1ln 線を指示してください
REM #2 基準点を指示してください
REM #bz
REM #cd
REM #e
#!ここから more +n %0 の n 行目:最初の行は 0 行
. ./draw
(gc jwc_temp.txt) | %{
switch -regex -case ($_)
{
"^hq" { "bz" }
"^hp2"{ $p2 = $([regex]::split($_,' +')[1..2] | %{ [double] $_ }) }
"^ " { $ln = $([regex]::split($_,' +')[1..4] | %{ [double] $_ })
"$(lnmove $ln (ln_hpdist $ln $p2) 1)"
}
}
} | sc jwc_temp.txt
#ここまで powershell は 文末に必ず空白行を置いてください
○draw.ps1
# ユーザ定義関数
function sgn ($x)
{
[math]::sign($x)
}
function remainder ($x,$y)
{
[math]::sign($x)*($x % $y)
}
function hypot ($x,$y)
{
[math]::sqrt($x*$x+$y*$y)
}
function lnlength ($ln) #線長を返す
{
$x1,$y1,$x2,$y2 = $ln
hypot ($x2-$x1) ($y2-$y1)
}
function lnslope ($ln) #線の角度を返す
{
$x1,$y1,$x2,$y2 = $ln
[math]::atan2($y2-$y1,$x2-$x1)
}
function ln_hpdist ($ln,$hp) #線と点の最短距離を返す
{
$x = $hp + $ln[0..1]
return (lnlength $x)*[math]::sin( (lnslope $ln)-(lnslope $x))
}
function ln_hpsnap ($ln,$hp) #線の吸着点を返す, ±を逆にした 060824
{
$t = ln_hpdist $ln $hp
$d = lnslope $ln
return ($hp[0] + $t * [math]::sin($d)),($hp[1] - $t * [math]::cos($d))
}
function lnmove ($ln,$b,$pmy=1) #線 ln を直交距離 b だけ pmy の方向に平行移動する
{
$x1,$y1,$x2,$y2 = $ln
$d = lnslope $ln
$co = [math]::cos($d)
$si = [math]::sin($d)
$x1 -= $b*$si*$pmy
$y1 += $b*$co*$pmy
$x2 -= $b*$si*$pmy
$y2 += $b*$co*$pmy
return $x1,$y1,$x2,$y2
}
function inters ($ln1,$ln2) #2直線の交点の座標リストを返す
{
$1,$2,$3,$4 = $ln1
$dx1 = $3 - ($x1=$1)
$dy1 = $4 - ($y1=$2)
$m1 = $(if ($dx1 -eq 0) {1e20} else {$dy1/$dx1})
$1,$2,$3,$4 = $ln2
$dx2 = $3 - ($x2=$1)
$dy2 = $4 - ($y2=$2)
$m2 = $(if ($dx2 -eq 0) {1e20} else {$dy2/$dx2})
$aa = $m1 - $m2
if ( $aa -ne 0 ) {
$u1 = $y1 - $m1 * $x1
$u2 = $y2 - $m2 * $x2
return ( ($u2-$u1)/$aa),( ($m1*$u2-$m2*$u1)/$aa)
} else {
"he処理できません"
}
}
function ptdist ($pt1,$pt2)
{
hypot ($pt2[0]-$pt1[0]) ($pt2[1]-$pt1[1])
}
function polarto ($pt,$r,$d)
{
return ($pt[0]+$r*[math]::cos($d)),($pt[1]+$r*[math]::sin($d))
}
function arrow ($pt1,$d,$pm,$size=3,$xang=60,$xan2=90)
{
$l = -$size*$pm
$a = $xang*[math]::PI/180/2.0
$pt2 = polarto $pt1 $l ($d-$a)
$pt4 = polarto $pt1 $l ($d+$a)
if ($xan2 -eq 180)
{
$sl = $pt1+$pt2+$pt4
} 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 = $pt1+$pt2+$pt3+$pt4
}
"sl $sl"
}