General math (日本語)

このページはゲーム・プログラミングにおいて有用な算術関数の一覧です。それは一般的に簡潔、単純、さらに最高です。

-- 角度を任意数にて平均化します (弧度にて)。
function math.averageAngles(...)
	local x,y = 0,0
	for i=1,select('#',...) do local a= select(i,...) x, y = x+math.cos(a), y+math.sin(a) end
	return math.atan2(y, x)
end


-- 二点間の距離を返します。
function math.dist(x1,y1, x2,y2) return ((x2-x1)^2+(y2-y1)^2)^0.5 end
-- 二点間の三次元距離を返します。
function math.dist(x1,y1,z1, x2,y2,z2) return ((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)^0.5 end


-- 二点間の角度を返します。
function math.angle(x1,y1, x2,y2) return math.atan2(y2-y1, x2-x1) end


-- 最も近似している倍数を返します (標準値 10 です)。
function math.multiple(n, size) size = size or 10 return math.round(n/size)*size end


-- 数値を指定範囲内で固定します。
function math.clamp(low, n, high) return math.min(math.max(low, n), high) end


-- 二つの数値間を線形補完します。
function lerp(a,b,t) return (1-t)*a + t*b end
function lerp2(a,b,t) return a+(b-a)*t end

-- 二つの数値間を余弦補完します。
function cerp(a,b,t) local f=(1-math.cos(t*math.pi))*.5 return a*(1-f)+b*f end


-- 二つの数値を平準化します。
function math.normalize(x,y) local l=(x*x+y*y)^.5 if l==0 then return 0,0,0 else return x/l,y/l,l end end


-- 'deci' 番目に最も近い丸め込んだ 'n' を返します (標準値では全体数)。
function math.round(n, deci) deci = 10^(deci or 0) return math.floor(n*deci+.5)/deci end


-- -1 または 1 のいずれかを無作為に返します。
function math.rsign() return math.random(2) == 2 and 1 or -1 end


-- 1 ならば整数、 -1 ならば負数、または 0 ならば 0 を返します。
function math.sign(n) return n>0 and 1 or n<0 and -1 or 0 end


-- 最小および最大を指定して精密で無作為な十進数を返します。
function math.prandom(min, max) return math.random() * (max - min) + min end


-- 二つの線分が交差しているか確認します。線分は ({x,y},{x,y}, {x,y},{x,y}) の数式で指定します。
function checkIntersect(l1p1, l1p2, l2p1, l2p2)
	local function checkDir(pt1, pt2, pt3) return math.sign(((pt2.x-pt1.x)*(pt3.y-pt1.y)) - ((pt3.x-pt1.x)*(pt2.y-pt1.y))) end
	return (checkDir(l1p1,l1p2,l2p1) ~= checkDir(l1p1,l1p2,l2p2)) and (checkDir(l2p1,l2p2,l1p1) ~= checkDir(l2p1,l2p2,l1p2))
end

-- 二つの線が交差しているか確認します (または seg が true ならば線分です)。
-- 線には四つの数値を指定します (二つの座標)。
function findIntersect(l1p1x,l1p1y, l1p2x,l1p2y, l2p1x,l2p1y, l2p2x,l2p2y, seg1, seg2)
	local a1,b1,a2,b2 = l1p2y-l1p1y, l1p1x-l1p2x, l2p2y-l2p1y, l2p1x-l2p2x
	local c1,c2 = a1*l1p1x+b1*l1p1y, a2*l2p1x+b2*l2p1y
	local det,x,y = a1*b2 - a2*b1
	if det==0 then return false, "The lines are parallel." end
	x,y = (b2*c1-b1*c2)/det, (a1*c2-a2*c1)/det
	if seg1 or seg2 then
		local min,max = math.min, math.max
		if seg1 and not (min(l1p1x,l1p2x) <= x and x <= max(l1p1x,l1p2x) and min(l1p1y,l1p2y) <= y and y <= max(l1p1y,l1p2y)) or
		   seg2 and not (min(l2p1x,l2p2x) <= x and x <= max(l2p1x,l2p2x) and min(l2p1y,l2p2y) <= y and y <= max(l2p1y,l2p2y)) then
			return false, "The lines don't intersect."
		end
	end
	return x,y
end

寄贈者


そのほかの言語