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

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

 

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

:gccで多角形の面積を計算する
@echo off
if not exist %~dpn0.exe (
  for /f "delims=:" %%n in ('findstr /n "^#!" %0') do (
    more +%%n %0 > %~dpn0.c
    gcc -Os %~dpn0.c -o %~dpn0.exe -s
  )
)
%~dpn0
goto:eof

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

#!この次の行からプログラムを書いてください
#include "jw.h"

double area(double (*hp)[2], int n, double *p) //多角形の面積
{
  int i;
  double a, sx, sy, ix, iy, gx, gy;
  double x1, y1, x2, y2;
  if (hp[1][0] != hp[n][0] || hp[1][1] != hp[n][1])
  {
    hp[n+1][0] = hp[1][0];
    hp[n+1][1] = hp[1][1];
    n += 1;
  }
  a = 0;
  sx = 0;
  sy = 0;
  ix = 0;
  iy = 0;
  x1 = hp[1][0];
  y1 = hp[1][1];
  for (i = 1; i < n; i++) {
    x2 = hp[i%n+1][0];
    y2 = hp[i%n+1][1];
    a += 0.5 * (x1 - x2) * (y1 + y2); //左回りが正
    sx += ( (x1 - x2) * (y1 * (2 * x1 + x2) + y2 * (2 * x2 + x1)) / 6.0);
    sy += ( (y2 - y1) * (x1 * (2 * y1 + y2) + x2 * (2 * y2 + y1)) / 6.0);
    ix += ( (x1 - x2) * (y1 * pow(2 * x1 + x2, 2) + y2 * pow(2 * x2 + x1, 2) + pow(x1 - x2, 2) * (y1 + y2) / 2) / 18.0);
    iy += ( (y2 - y1) * (x1 * pow(2 * y1 + y2, 2) + x2 * pow(2 * y2 + y1, 2) + pow(y1 - y2, 2) * (x1 + x2) / 2) / 18.0);
    x1 = x2;
    y1 = y2;
  }
  gx = sx / a;
  gy = sy / a;
  ix = __abs(ix) - __abs(a) * gx * gx;
  iy = __abs(iy) - __abs(a) * gy * gy;
  p[0] = __abs(a);
  p[1] = ix;
  p[2] = iy;
}

int main(void)
{
  FILE *f;
  int i, n, hpn=0;
  char S_[256], *F[20];
  double hp[101][2];
  char nn[4];
  if ( (f = fopen("jwc_temp.txt", "r")) != NULL) {
    while (fgets(S_, 256, f) != NULL) {
      split(chomp(S_), F);
      if (strncmp(S_, "hp", 2) == 0) {
        n = strlen(F[0]);
        substr(F[0], 2, n-1, nn);
        chomp(nn);
        if (n > 0 && nn[n-1] == '-')
        {
          substr(F[0], 2, n-2, nn);
        }
        i = atoi(nn);
        hp[i][0] = atof(F[1]);
        hp[i][1] = atof(F[2]);
        hpn++;
      }
    }
  } else {
    exit(MISSING_JWC_TEMP_TXT);
  }
  fclose(f);
  double p[3];
  area(hp, hpn, p);
  f = fopen("jwc_temp.txt", "w");
  fprintf(f, "h#Area = %.01f Iy = %.01f Ix = %.01f\n", p[0], p[1], p[2]);
  fclose(f);
  return 0;
}