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

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

 

perlで多角形の面積を計算する

:perlで多角形の面積を計算する
@echo off
perl -x %~f0 jwc_temp.txt
goto:eof

REM #jww
REM #1-%d 点を指示してください
REM #99#%d
REM #e

#!perl -an -i.bak
if (/^hp/) {
  $F[0] =~ s/(ln|ci|ch|-)$//g;
  $hp[ substr($F[0], 2) ] = [@F[1, 2]];
  $hpn++;
}
if (eof) {
  if ($hp[1] != $hp[$hpn]) { 
    $hp[$hpn + 1] = $hp[1];
    $hpn++;
  }
  $ax = 0;
  $sx = $sy = 0;
  $ix = $iy = 0;
  $xmin = $xmax = $ymin = $ymax = 0;
  for $i (1..$hpn - 1) {
    ($x1, $y1) = @{$hp[$i]};
    ($x2, $y2) = @{$hp[$i+1]};
    $ax += $a = ($x1 * $y2 - $x2 * $y1) / 2;
    $sx += $a * ($x1 + $x2) / 3;
    $sy += $a * ($y1 + $y2) / 3;
    $ix += $a * (($x1 + $x2) ** 2 - $x1 * $x2) / 6;
    $iy += $a * (($y1 + $y2) ** 2 - $y1 * $y2) / 6;
    if ($xmin > $x1) { $xmin = $x1; }
    if ($xmax < $x1) { $xmax = $x1; }
    if ($ymin > $y1) { $ymin = $y1; }
    if ($ymax < $y1) { $ymax = $y1; }
    if ($i == $hpn - 1) {
      if ($xmin > $x2) { $xmin = $x2; }
      if ($xmax < $x2) { $xmax = $x2; }
      if ($ymin > $y2) { $ymin = $y2; }
      if ($ymax < $y2) { $ymax = $y2; }
    }
  }
  $gx = $sx / $ax; #図心
  $gy = $sy / $ax;
  $ix -= $ax * $gx * $gx; #図心まわりの2次モーメント(Y軸) Iy-y
  $iy -= $ax * $gy * $gy; #図心まわりの2次モーメント(X軸) Ix-x
  printf "h#Area = %.01f Iy = %.01f Ix = %.01f\n", $ax, $ix, $iy;
}
__END__