TI-Nspire & Lua / スクリプティングのヒント / クロージャを使う 6 / 図形の包含判定

-- 円の包含判定。クロージャを使わない。
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))

f:id:ti-nspire:20170205094616p:plain
 
参考: