-- 円の包含判定。クロージャを使わない。 function disk1(x, y) return (x - 1)^2 + (y - 3)^2 <= 4.5^2 end print(disk1(0,0), disk1(1, 5)) -- 円の包含判定。クロージャを使う。 function disk2(cx, cy, r) -- 円を定義する函数。 return function(x, y) -- 包含判定をする函数を返す。 return (x - cx)^2 + (y - cy)^2 <= r^2 end end print(disk2(1, 3, 4.5)(0,0), disk2(1, 3, 4.5)(1, 5)) -- disk2(1, 3, 4.5) とコールすると、「中心座標(1,3)、半径 4.5 の円」に対する包含判定函数が生成される。 -- 矩形の包含判定。クロージャを使う function rect(x1, y1, x2, y2) return function(x, y) return x1 <= x and x <= x2 and y1 <= y and y <= y2 end end print(rect(1, 3, 10, 20)(5, 5), rect(1, 3, 10, 20)(0, 0)) - -- rect(1, 3, 10, 20) とコールすると、「対角座標(1, 3)(10, 20) の矩形」に対する包含判定函数が生成される。 -- 矩形の非包含判定。クロージャを使う function rect(x1, y1, x2, y2) return function(x, y) return not (x1 <= x and x <= x2 and y1 <= y and y <= y2) end end print(rect(1, 3, 10, 20)(5, 5), rect(1, 3, 10, 20)(0, 0))
参考: