18/12/12 11:17:02.00 rSdIoMBA.net
>>808 Ruby 与えられるのは凸多角形のみとし、頂点は反時計・時計回りのいずれかで与えられるものとする
def diff(a, b); a.zip(b).map{|i, j| i - j}; end
def in_triangle?(p, a, b, c)
ap, ab, ac = [p, b, c].map{|v| diff(v, a)}
det = ab[0] * ac[1] - ab[1] * ac[0]
s = (ac[1] * ap[0] - ac[0] * ap[1]) / det
t = -(ab[1] * ap[0] - ab[0] * ap[1]) / det
[s, t].all?{|e| (0..1).include?(e)} && s + t <= 1
end
def in_con_polygon?(p, *vers)
vers[1..-1].each_cons(2).any?{|v1, v2| in_triangle?(p, vers[0], v1, v2)}
end
# 原点を左下の頂点とする長さ1の正方形の内部に(0.5, 0.5)は含まれるか
p in_con_polygon?([0.5, 0.5], [0, 0], [1, 0], [1, 1], [0, 1])
# => true
p in_con_polygon?([1.76, 1.75], [0, 0], [3, 0], [2, 1.5], [1, 2.5], [0, 3])
# => false