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