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

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

 

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

:luaで多角形の面積を計算する
@echo off
for /f "delims=:" %%n in ('findstr /n "^#!" %0') do (
  copy jwc_temp.txt myfiles > nul
  more +%%n %0 | lua > jwc_temp.txt
)
goto:eof

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

#!この次の行からプログラムを書いてください
function ptdist(x, y)
  local x1, y1 = x[1], x[2]
  local x2, y2 = y[1], y[2]
  return math.sqrt( (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))
end

function sprintf(...)
  if #{...} == 0 then return end
  if #{...} == 1 then return ... end
  return string.format(...)
end

function printf(...)
  return print(sprintf(...))
end

function area(hp) --多角形の面積
  local n, a, x1, y1, x2, y2
  n = #hp
  if hp[1] ~= hp[n] then
    hp[n+1] = hp[1]; n = n + 1
  end
  local ax, sx, sy, ix, iy, ixy, gx, gy, xmin, ymin, xmax, ymax, lr, alpha
  local x, y, u, v, i
  x = {}
  y = {}
  ax, sx, sy, ix, iy, ixy, lr = 0, 0, 0, 0, 0, 0, 0
  x1, y1 = hp[1][1], hp[1][2]
  for i = 2, n do
    x2, y2 = hp[i][1], hp[i][2]
    a = (x1 * y2 - x2 * y1) / 2.0
    u = x1 + x2
    v = y1 + y2
    ax = ax + a
    sx = sx + a * u / 3.0
    sy = sy + a * v / 3.0
    ix = ix + a * (u ^ 2 - x1 * x2) / 6.0
    iy = iy + a * (v ^ 2 - y1 * y2) / 6.0
    ixy = ixy + a * (u * v + x1 * y1 + x2 * y2) / 12.0
    table.insert(x, x1)
    table.insert(y, y1)
    lr = lr + ptdist({x1, y1}, {x2, y2})
    x1, y1 = x2, y2
  end
  gx = sx / ax
  gy = sy / ax
  ix = ix - ax * gx * gx --図心まわりの2次モーメント(Y軸) Iy-y
  iy = iy - ax * gy * gy --図心まわりの2次モーメント(X軸) Ix-x
  ixy = ixy - ax * gx * gy --図心まわりの相乗モーメント
  xmin = math.abs(gx - math.min(unpack(x)))
  xmax = math.abs(gx - math.max(unpack(x))) --図心からX軸方向の両側の最縁端距離
  ymin = math.abs(gy - math.min(unpack(y)))
  ymax = math.abs(gy - math.max(unpack(y))) --図心からY軸方向の両側の最縁端距離
  alpha = math.deg(math.atan2(2.0 * ixy, ix - iy) / 2.0)
  --オブジェクト指向の表現に対応
  hp.a = ax
  hp.gx, hp.gy = gx, gy
  hp.ix, hp.iy = ix, iy
  hp.xmin, hp.xmax, hp.ymin, hp.ymax = xmin, xmax, ymin, ymax
  hp.lr = lr
  hp.ixy = ixy
  hp.alpha = alpha
  return hp
end

hp = {}
for line in io.lines("myfiles") do
  F = {}
  string.gsub(line, "%S+", function (x) table.insert(F, x) end)
  if string.match(line, "^hp[1-9]") then
    hp[string.gsub(string.gsub(F[1], "hp", ""), "-", "")*1] = {F[2], F[3]}
  end
end
s = area(hp)
printf("h#Area = %.01f Iy =  %.01f Ix = %.01f", s.a, s.ix, s.iy)

 

 

luaruby のように書きたい?

○以下のバッチ(cmd.exe)スクリプトを point.bat で保存して実行してください

@findstr /v "^@" %0 | lua & pause & exit
function point(p)
  local x, y
  x = p[1]
  y = p[2]
  p.x = x
  p.y = y
  p.add = x + y
  p.mul = x * y
  p.div = x / y
  return p
end

a = point({1,2})
print(a.x)
print(a.y)
print(a.add)
print(a.mul)
print(a.div)

 

理由はわかりませんがこれで、動いたので紹介しています。(Lua 5.1.5 で確認)