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

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

 

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

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

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

#!この次の行からプログラムを書いてください
# coding: shift_jis
import sys,re
hp = []

try:
  f = open("jwc_temp.txt", "r")
  for line in f:
    F = line.split()
    if re.compile("^hp").search(line): hp.append(F[1:3])
  f.close()
except:
  sys.exit()

hpn = len(hp)
if hp[0] != hp[hpn-1]:
  hp.append(hp[0])
  hpn += 1
a = 0
sx = 0; sy = 0
ix = 0; iy = 0
gx = 0; gy = 0

sys.stdout = open("jwc_temp.txt", "w")
x1, y1 = map(float, hp[0])
for i in range(1, hpn):
  x2, y2 = map(float, hp[i])
  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 * (2 * x1 + x2) ** 2 + y2 * (2 * x2 + x1) ** 2 + (x1 - x2) ** 2 * (y1 + y2) / 2) / 18.0)
  iy += ( (y2 - y1) * (x1 * (2 * y1 + y2) ** 2 + x2 * (2 * y2 + y1) ** 2 + (y1 - y2) ** 2 * (x1 + x2) / 2) / 18.0)
  x1, y1 = x2, y2

gx = sx / a
gy = sy / a
ix = abs(ix) - abs(a) * gx ** 2
iy = abs(iy) - abs(a) * gy ** 2
print("h#Area = %.01f Iy = %.01f Ix = %.01f" % (a, ix, iy))

 

 

相乗モーメントや主軸の角度についても同様にして計算することは可能です。この計算式が面白いのは2点で台形に相当する断面性能を考えているところです。

  左図 で 線とX軸から成る台形の面積 ax を考えると
    ax = (x1 - x2) * (y1 + y2) / 2
       = (x1 * y1 + x1 * y2 - x2 * y1 - x2 * y2) / 2
      線とY軸から成る台形の面積 ay は
    ay =-(y1 - y2) * (x1 + x2) / 2
       =-(y1 * x1 + y1 * x2 - y2 * x1 - y2 * x2) / 2
  右図 で 線とX軸から成る台形を考えたときの三角形の面積 ax は
    ax = (x1 * y1 + x1 * y2 - x2 * y1 - x2 * y2) / 2
       + (x2 * y2 + x2 * y3 - x3 * y2 - x3 * y3) / 2
       + (x3 * y3 + x3 * y1 - x1 * y3 - x1 * y1) / 2
       = ∑(x[i] * y[i+1] - x[i+1] * y[i]) / 2
      線とY軸から成る台形を考えたときの三角形の面積 ay は
    ay = ax = ∑(x[i] * y[i+1] - x[i+1] * y[i]) / 2
  となります。辺の数だけ繰り返して求めます。
  → 左回りを正としています。