jw_cad 外部変形 - (1326) mshtaで多角形の面積を計算する -

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

 

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 で呼び出せるようにしています。