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