外部変形は データのやり取りをテキストファイルで行うので プログラム言語は 自由に選ぶことができます。図形は機能的かつシンプルなため、数多くのユーザーに受け入れられています。
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 #1-%d 点を指示してください
REM #99#%d
REM #e
<script>
function area(hp) { //多角形の面積
var hpn, x1, y1, x2, y2
var ax, sx, sy, jx, jy, jxy, gx, gy, ix, iy, xmin, ymin, xmax, ymax, lr, alpha
var x, y, a, u, v, i
ax = sx = sy = ix = iy = ixy = lr = 0
x =
y =
hpn = hp.length
if (hp[1] != hp[hpn-1]) { hp[hpn] = hp[1]; hpn += 1 }
x1 = hp[1][0]; y1 = hp[1][1]
for (i = 2; i < hpn; i++) {
x2 = hp[i][0]; y2 = hp[i][1]
a = (x1 * y2 - x2 * y1) / 2.0 //左回りが正
u = x1 + x2
v = y1 + y2
ax += a //断面積
sx += a * u / 3.0
sy += a * v / 3.0 //1次モーメント
ix += a * (u * u - x1 * x2) / 6.0
iy += a * (v * v - y1 * y2) / 6.0 //2次モーメント
ixy += a * (u * v + x1 * y1 + x2 * y2) / 12.0 //相乗モーメント
x.push(x1)
y.push(y1) //座標値
lr += Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)) //周長
x1 = x2; y1 = y2
}
gx = sx / ax //原点から図心までのX軸方向の距離
gy = sy / ax //原点から図心までのY軸方向の距離
ix -= ax * gx * gx //図心まわりの2次モーメント(Y軸) Iy-y
iy -= ax * gy * gy //図心まわりの2次モーメント(X軸) Ix-x
ixy -= ax * gx * gy //図心まわりの相乗モーメント
xmin = Math.abs(gx - Math.min(x))
xmax = Math.abs(gx - Math.max(x)) //図心からX軸方向の両側の最縁端距離
ymin = Math.abs(gy - Math.min(y))
ymax = Math.abs(gy - Math.max(y)) //図心からY軸方向の両側の最縁端距離
alpha = Math.atan2(2.0 * ixy, ix - iy) / 2.0 * 180.0 / Math.PI //主軸の傾き
//return [ax, [gx, gy], [ix, iy], [xmin, xmax, ymin, ymax], lr, ixy, alpha]
this.a = ax
this.ix = ix
this.iy = iy
}
hp = []
with (new ActiveXObject("Scripting.FileSystemObject")) {
f = GetStandardStream(0) //stdin
g = GetStandardStream(1) //stdout
while (! f.AtEndOfStream) {
F = ($_ = f.ReadLine()).split(/\s+/)
if (/^hp[1-9][0-9]?/i .test($_)) { //hp 指示点
hp[ F[0].match(/[0-9]+/) ] = [ F[1] * 1.0, F[2] * 1.0 ]
}
}
f.close()
s = new area(hp)
ax = s.a
ix = s.ix
iy = s.iy
g.WriteLine("h#Area = " + ax.toFixed(1) + " Iy = " + ix.toFixed(1) + " Ix = " + iy.toFixed(1))
}
close()
</script>
スクリプト言語は jscript を利用しています。座標法で断面積を計算する関数 area で断面積や断面2次モーメントを一緒に返すと取り出し方に迷うので、計算結果を戻さないで this.a、 this.ix、 this.iy で呼び出せるようにしています。